diff --git a/l1-contracts/src/core/RollupCore.sol b/l1-contracts/src/core/RollupCore.sol index 45c6c4c34a65..7f23565318c2 100644 --- a/l1-contracts/src/core/RollupCore.sol +++ b/l1-contracts/src/core/RollupCore.sol @@ -310,18 +310,14 @@ contract RollupCore is * * @param _args - The arguments to propose the block * @param _signatures - Signatures from the validators - * // TODO(#9101): The below _body should be removed once we can extract blobs. It's only here so the archiver can extract tx effects. - * @param _body - The body of the L2 block * @param _blobInput - The blob evaluation KZG proof, challenge, and opening required for the precompile. */ function propose( ProposeArgs calldata _args, Signature[] memory _signatures, - // TODO(#9101): Extract blobs from beacon chain => remove below body input - bytes calldata _body, bytes calldata _blobInput ) external override(IRollupCore) { - ExtRollupLib.propose(_args, _signatures, _body, _blobInput, checkBlob); + ExtRollupLib.propose(_args, _signatures, _blobInput, checkBlob); } function setupEpoch() public override(IValidatorSelectionCore) { diff --git a/l1-contracts/src/core/interfaces/IRollup.sol b/l1-contracts/src/core/interfaces/IRollup.sol index ce80c1b06e18..71afd8264bb0 100644 --- a/l1-contracts/src/core/interfaces/IRollup.sol +++ b/l1-contracts/src/core/interfaces/IRollup.sol @@ -127,7 +127,6 @@ interface IRollupCore { function propose( ProposeArgs calldata _args, Signature[] memory _signatures, - bytes calldata _body, bytes calldata _blobInput ) external; diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index d82796f1cdde..34c0c1a93d88 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -173,6 +173,8 @@ library Constants { uint256 internal constant TREE_LEAF_READ_REQUEST_LENGTH = 2; uint256 internal constant PRIVATE_LOG_DATA_LENGTH = 20; uint256 internal constant SCOPED_PRIVATE_LOG_DATA_LENGTH = 21; + uint256 internal constant CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS = 3019; + uint256 internal constant CONTRACT_CLASS_LOG_SIZE_IN_FIELDS = 3020; uint256 internal constant LOG_HASH_LENGTH = 3; uint256 internal constant SCOPED_LOG_HASH_LENGTH = 4; uint256 internal constant NOTE_HASH_LENGTH = 2; @@ -203,7 +205,7 @@ library Constants { uint256 internal constant SCOPED_READ_REQUEST_LEN = 3; uint256 internal constant PUBLIC_DATA_READ_LENGTH = 3; uint256 internal constant PRIVATE_VALIDATION_REQUESTS_LENGTH = 772; - uint256 internal constant PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH = 741; + uint256 internal constant PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH = 740; uint256 internal constant TX_CONSTANT_DATA_LENGTH = 37; uint256 internal constant COMBINED_CONSTANT_DATA_LENGTH = 46; uint256 internal constant PRIVATE_ACCUMULATED_DATA_LENGTH = 1412; @@ -212,7 +214,7 @@ library Constants { uint256 internal constant PRIVATE_TO_AVM_ACCUMULATED_DATA_LENGTH = 160; uint256 internal constant NUM_PRIVATE_TO_AVM_ACCUMULATED_DATA_ARRAYS = 3; uint256 internal constant PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1847; - uint256 internal constant PRIVATE_TO_ROLLUP_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 783; + uint256 internal constant PRIVATE_TO_ROLLUP_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 782; uint256 internal constant CONSTANT_ROLLUP_DATA_LENGTH = 13; uint256 internal constant BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 52; uint256 internal constant BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH = 986; @@ -291,6 +293,7 @@ library Constants { uint256 internal constant L2_GAS_PER_L1_TO_L2_MSG_READ_REQUEST = 1404; uint256 internal constant L2_GAS_PER_LOG_BYTE = 4; uint256 internal constant L2_GAS_PER_PRIVATE_LOG = 0; + uint256 internal constant L2_GAS_PER_CONTRACT_CLASS_LOG = 0; uint256 internal constant L2_GAS_PER_L2_TO_L1_MSG = 200; uint256 internal constant TX_START_PREFIX = 8392562855083340404; uint256 internal constant REVERT_CODE_PREFIX = 1; diff --git a/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol b/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol index c94ab46fb0d2..c7cd5013d3f1 100644 --- a/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol +++ b/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol @@ -19,12 +19,10 @@ library ExtRollupLib { function propose( ProposeArgs calldata _args, Signature[] memory _signatures, - // TODO(#9101): Extract blobs from beacon chain => remove below body input - bytes calldata _body, bytes calldata _blobInput, bool _checkBlob ) external { - ProposeLib.propose(_args, _signatures, _body, _blobInput, _checkBlob); + ProposeLib.propose(_args, _signatures, _blobInput, _checkBlob); } function initializeValidatorSelection(uint256 _targetCommitteeSize) external { diff --git a/l1-contracts/src/core/libraries/RollupLibs/ProposeLib.sol b/l1-contracts/src/core/libraries/RollupLibs/ProposeLib.sol index 1f2e5f3d5a0f..1f6c0a00b99d 100644 --- a/l1-contracts/src/core/libraries/RollupLibs/ProposeLib.sol +++ b/l1-contracts/src/core/libraries/RollupLibs/ProposeLib.sol @@ -74,8 +74,6 @@ library ProposeLib { function propose( ProposeArgs calldata _args, Signature[] memory _signatures, - // TODO(#9101): Extract blobs from beacon chain => remove below body input - bytes calldata, bytes calldata _blobInput, bool _checkBlob ) internal { diff --git a/l1-contracts/test/Rollup.t.sol b/l1-contracts/test/Rollup.t.sol index 579d615696ce..efc19aaed25a 100644 --- a/l1-contracts/test/Rollup.t.sol +++ b/l1-contracts/test/Rollup.t.sol @@ -222,7 +222,7 @@ contract RollupTest is RollupBase { txHashes: new bytes32[](0) }); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidBlobHash.selector, blobHashes[0])); - rollup.propose(args, signatures, data.body, data.blobInputs); + rollup.propose(args, signatures, data.blobInputs); } function testInvalidBlobProof() public setUpFor("mixed_block_1") { @@ -250,7 +250,7 @@ contract RollupTest is RollupBase { txHashes: new bytes32[](0) }); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidBlobProof.selector, blobHashes[0])); - rollup.propose(args, signatures, data.body, blobInput); + rollup.propose(args, signatures, blobInput); } function testRevertPrune() public setUpFor("mixed_block_1") { @@ -316,7 +316,7 @@ contract RollupTest is RollupBase { oracleInput: OracleInput(0), txHashes: txHashes }); - rollup.propose(args, signatures, data.body, data.blobInputs); + rollup.propose(args, signatures, data.blobInputs); } function testNonZeroL2Fee() public setUpFor("mixed_block_1") { @@ -344,7 +344,7 @@ contract RollupTest is RollupBase { oracleInput: OracleInput(0), txHashes: txHashes }); - rollup.propose(args, signatures, data.body, data.blobInputs); + rollup.propose(args, signatures, data.blobInputs); } function testProvingFeeUpdates() public setUpFor("mixed_block_1") { @@ -419,7 +419,7 @@ contract RollupTest is RollupBase { oracleInput: OracleInput(0), txHashes: new bytes32[](0) }); - rollup.propose(args, signatures, data.body, data.blobInputs); + rollup.propose(args, signatures, data.blobInputs); assertEq( testERC20.balanceOf(data.decodedHeader.globalVariables.coinbase), 0, @@ -695,7 +695,6 @@ contract RollupTest is RollupBase { DecoderBase.Data memory data = load("empty_block_1").block; bytes memory header = data.header; bytes32 archive = data.archive; - bytes memory body = data.body; bytes32[] memory txHashes = new bytes32[](0); assembly { @@ -711,14 +710,13 @@ contract RollupTest is RollupBase { oracleInput: OracleInput(0), txHashes: txHashes }); - rollup.propose(args, signatures, body, data.blobInputs); + rollup.propose(args, signatures, data.blobInputs); } function testRevertInvalidChainId() public setUpFor("empty_block_1") { DecoderBase.Data memory data = load("empty_block_1").block; bytes memory header = data.header; bytes32 archive = data.archive; - bytes memory body = data.body; bytes32[] memory txHashes = new bytes32[](0); assembly { @@ -733,14 +731,13 @@ contract RollupTest is RollupBase { oracleInput: OracleInput(0), txHashes: txHashes }); - rollup.propose(args, signatures, body, data.blobInputs); + rollup.propose(args, signatures, data.blobInputs); } function testRevertInvalidVersion() public setUpFor("empty_block_1") { DecoderBase.Data memory data = load("empty_block_1").block; bytes memory header = data.header; bytes32 archive = data.archive; - bytes memory body = data.body; bytes32[] memory txHashes = new bytes32[](0); assembly { @@ -755,14 +752,13 @@ contract RollupTest is RollupBase { oracleInput: OracleInput(0), txHashes: txHashes }); - rollup.propose(args, signatures, body, data.blobInputs); + rollup.propose(args, signatures, data.blobInputs); } function testRevertInvalidTimestamp() public setUpFor("empty_block_1") { DecoderBase.Data memory data = load("empty_block_1").block; bytes memory header = data.header; bytes32 archive = data.archive; - bytes memory body = data.body; bytes32[] memory txHashes = new bytes32[](0); uint256 realTs = data.decodedHeader.globalVariables.timestamp; @@ -782,7 +778,7 @@ contract RollupTest is RollupBase { oracleInput: OracleInput(0), txHashes: txHashes }); - rollup.propose(args, signatures, body, new bytes(144)); + rollup.propose(args, signatures, new bytes(144)); } function testSubmitProofNonExistantBlock() public setUpFor("empty_block_1") { diff --git a/l1-contracts/test/base/RollupBase.sol b/l1-contracts/test/base/RollupBase.sol index b1219881f636..f0bf19d0c64a 100644 --- a/l1-contracts/test/base/RollupBase.sol +++ b/l1-contracts/test/base/RollupBase.sol @@ -196,7 +196,7 @@ contract RollupBase is DecoderBase { oracleInput: OracleInput(0), txHashes: new bytes32[](0) }); - rollup.propose(args, signatures, full.block.body, blobInputs); + rollup.propose(args, signatures, blobInputs); bytes32 l2ToL1MessageTreeRoot; uint32 numTxs = full.block.numTxs; diff --git a/l1-contracts/test/fees/FeeRollup.t.sol b/l1-contracts/test/fees/FeeRollup.t.sol index be752ffc0ba9..7dbcdca9b158 100644 --- a/l1-contracts/test/fees/FeeRollup.t.sol +++ b/l1-contracts/test/fees/FeeRollup.t.sol @@ -260,7 +260,6 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { txHashes: b.txHashes }), b.signatures, - b.body, b.blobInputs ); nextSlot = nextSlot + Slot.wrap(1); @@ -365,7 +364,6 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { txHashes: b.txHashes }), b.signatures, - b.body, b.blobInputs ); diff --git a/l1-contracts/test/validator-selection/ValidatorSelection.t.sol b/l1-contracts/test/validator-selection/ValidatorSelection.t.sol index 92a522630d41..c649cdf10e5e 100644 --- a/l1-contracts/test/validator-selection/ValidatorSelection.t.sol +++ b/l1-contracts/test/validator-selection/ValidatorSelection.t.sol @@ -315,14 +315,14 @@ contract ValidatorSelectionTest is DecoderBase { emit log("Time to propose"); vm.prank(ree.proposer); - rollup.propose(args, signatures, full.block.body, full.block.blobInputs); + rollup.propose(args, signatures, full.block.blobInputs); if (ree.shouldRevert) { return; } } else { Signature[] memory signatures = new Signature[](0); - rollup.propose(args, signatures, full.block.body, full.block.blobInputs); + rollup.propose(args, signatures, full.block.blobInputs); } assertEq(_expectRevert, ree.shouldRevert, "Does not match revert expectation"); diff --git a/noir-projects/aztec-nr/aztec/src/oracle/logs.nr b/noir-projects/aztec-nr/aztec/src/oracle/logs.nr index 019a48e3468d..7e2e6b8d684c 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/logs.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/logs.nr @@ -1,12 +1,11 @@ use dep::protocol_types::address::AztecAddress; -/// Temporary substitute that is used for handling contract class registration. This -/// variant returns the log hash, which would be too large to compute inside a circuit. +/// The below only exists to broadcast the raw log, so we can provide it to the base rollup later to be constrained. pub unconstrained fn emit_contract_class_unencrypted_log_private( contract_address: AztecAddress, message: [Field; N], counter: u32, -) -> Field { +) { emit_contract_class_unencrypted_log_private_oracle(contract_address, message, counter) } @@ -15,4 +14,4 @@ unconstrained fn emit_contract_class_unencrypted_log_private_oracle( contract_address: AztecAddress, message: [Field; N], counter: u32, -) -> Field {} +) {} diff --git a/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr index 58b469d0b304..5a68ab9c671c 100644 --- a/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr @@ -7,12 +7,15 @@ pub contract ContractClassRegisterer { use dep::aztec::protocol_types::{ abis::log_hash::LogHash, constants::{ - ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, FUNCTION_TREE_HEIGHT, - MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS, + ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, + FUNCTION_TREE_HEIGHT, MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS, MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS, MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS, REGISTERER_CONTRACT_BYTECODE_CAPSULE_SLOT, }, contract_class_id::ContractClassId, + hash::poseidon2_hash_subarray_variable, + traits::is_empty, + utils::arrays::{array_concat, find_index_hint_from_end}, }; use dep::aztec::{ @@ -217,13 +220,19 @@ pub contract ContractClassRegisterer { // cannot prove non-registration. Therefore, it is possible that a malicious oracle might prevent sequencers // from including transactions with calls to certain badly-broadcasted contracts. // TODO(#8978): review correctness - let log_hash = - unsafe { emit_contract_class_unencrypted_log_private(contract_address, log, counter) }; + let log_to_emit: [Field; CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS] = + array_concat(log, [0; CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS - N]); + // Safety: The below length is constrained in the base rollup. + let index = unsafe { find_index_hint_from_end(log_to_emit, |elem| !is_empty(elem)) }; + let length = if index == N { 0 } else { index + 1 }; + // TODO: We will eventually remove this hash. + let log_hash = poseidon2_hash_subarray_variable(log_to_emit, length); + // Safety: the below only exists to broadcast the raw log, so we can provide it to the base rollup later to be constrained. + unsafe { + emit_contract_class_unencrypted_log_private(contract_address, log_to_emit, counter); + } - // 40 = addr (32) + raw log len (4) + processed log len (4) - context.contract_class_logs_hashes.push( - LogHash { value: log_hash, counter, length: 40 + (N as Field) * 32 }, - ); + context.contract_class_logs_hashes.push(LogHash { value: log_hash, counter, length }); } #[private] diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer.nr index 416ffd333763..c624c995a2db 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer.nr @@ -56,10 +56,6 @@ impl TailOutputComposer { data.contract_class_logs_hashes = source.contract_class_logs_hashes.storage().map( |l: ScopedLogHash| l.expose_to_public(), ); - data.contract_class_log_preimages_length = source.contract_class_logs_hashes.storage().fold( - 0, - |len, l: ScopedLogHash| len + l.log_hash.length, - ); data } } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer/meter_gas_used.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer/meter_gas_used.nr index 12acfc1e3dfa..31405f4a95ea 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer/meter_gas_used.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_output_composer/meter_gas_used.nr @@ -1,10 +1,10 @@ use dep::types::{ abis::{ accumulated_data::private_to_rollup_accumulated_data::PrivateToRollupAccumulatedData, - gas::Gas, + gas::Gas, log_hash::ScopedLogHash, }, constants::{ - DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_LOG_BYTE, + DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, PRIVATE_LOG_SIZE_IN_FIELDS, }, @@ -31,9 +31,16 @@ pub fn meter_gas_used(data: PrivateToRollupAccumulatedData) -> Gas { metered_da_fields += num_private_logs * PRIVATE_LOG_SIZE_IN_FIELDS; metered_l2_gas += num_private_logs * L2_GAS_PER_PRIVATE_LOG; + let num_contract_class_logs = array_length(data.contract_class_logs_hashes); + let contract_class_log_emitted_fields = data.contract_class_logs_hashes.fold( + 0, + // NOTE: log_size is constrained to be correct in the base rollup + |len, l: ScopedLogHash| len + l.log_hash.length, + ); + metered_da_fields += contract_class_log_emitted_fields; + metered_l2_gas += num_contract_class_logs * L2_GAS_PER_CONTRACT_CLASS_LOG; + let mut metered_da_bytes = metered_da_fields * DA_BYTES_PER_FIELD; - metered_da_bytes += data.contract_class_log_preimages_length as u32; - metered_l2_gas += data.contract_class_log_preimages_length as u32 * L2_GAS_PER_LOG_BYTE; Gas::new(metered_da_bytes * DA_GAS_PER_BYTE, metered_l2_gas) + Gas::tx_overhead() } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_to_public_output_composer/meter_gas_used.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_to_public_output_composer/meter_gas_used.nr index fae82f49c294..bf09671c2641 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_to_public_output_composer/meter_gas_used.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/tail_to_public_output_composer/meter_gas_used.nr @@ -4,9 +4,9 @@ use dep::types::{ public_call_request::PublicCallRequest, }, constants::{ - DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, L2_GAS_PER_L2_TO_L1_MSG, - L2_GAS_PER_LOG_BYTE, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, - PRIVATE_LOG_SIZE_IN_FIELDS, + DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, + L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, + L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, PRIVATE_LOG_SIZE_IN_FIELDS, }, traits::{Empty, is_empty}, utils::arrays::array_length, @@ -32,11 +32,16 @@ fn meter_accumulated_data_gas_used(data: PrivateToPublicAccumulatedData) -> Gas metered_da_fields += num_private_logs * PRIVATE_LOG_SIZE_IN_FIELDS; metered_l2_gas += num_private_logs * L2_GAS_PER_PRIVATE_LOG; + let num_contract_class_logs = array_length(data.contract_class_logs_hashes); + let contract_class_log_emitted_fields = data.contract_class_logs_hashes.fold( + 0, + // NOTE: log_size is constrained to be correct in the base rollup + |len, l: ScopedLogHash| len + l.log_hash.length, + ); + metered_da_fields += contract_class_log_emitted_fields; + metered_l2_gas += num_contract_class_logs * L2_GAS_PER_CONTRACT_CLASS_LOG; + let mut metered_da_bytes = metered_da_fields * DA_BYTES_PER_FIELD; - let contract_class_log_preimages_length = - data.contract_class_logs_hashes.fold(0, |len, l: ScopedLogHash| len + l.log_hash.length); - metered_da_bytes += contract_class_log_preimages_length as u32; - metered_l2_gas += contract_class_log_preimages_length as u32 * L2_GAS_PER_LOG_BYTE; metered_l2_gas += array_length(data.public_call_requests) * FIXED_AVM_STARTUP_L2_GAS; diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr index ff3123ef8479..7a8e4ff504a9 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr @@ -71,8 +71,8 @@ mod tests { traits::{Empty, FromField}, }; use dep::types::constants::{ - DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, GENERATOR_INDEX__IVSK_M, L2_GAS_PER_L2_TO_L1_MSG, - L2_GAS_PER_LOG_BYTE, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, + DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, GENERATOR_INDEX__IVSK_M, L2_GAS_PER_CONTRACT_CLASS_LOG, + L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_TAIL_INDEX, PRIVATE_LOG_SIZE_IN_FIELDS, }; @@ -123,25 +123,6 @@ mod tests { assert_eq(public_inputs.rollup_validation_requests.max_block_number.unwrap(), 13); } - #[test] - fn measuring_of_log_lengths() { - let mut builder = PrivateKernelTailInputsBuilder::new(); - // Logs for the previous call stack. - let prev_contract_class_logs_hash = 956; - let prev_contract_class_log_preimages_length = 24; - builder.previous_kernel.add_contract_class_log_hash( - prev_contract_class_logs_hash, - prev_contract_class_log_preimages_length, - ); - - let public_inputs = builder.execute(); - - assert_eq( - public_inputs.end.contract_class_log_preimages_length, - prev_contract_class_log_preimages_length, - ); - } - #[test] fn ordering_of_msgs() { let mut builder = PrivateKernelTailInputsBuilder::new(); @@ -279,12 +260,14 @@ mod tests { let public_inputs = builder.execute(); let num_private_logs = 1 + 2; - let num_da_fields = 1 /* nullifier */ + num_private_logs * PRIVATE_LOG_SIZE_IN_FIELDS; - let num_da_bytes = (num_da_fields * DA_BYTES_PER_FIELD) + 12 /* contract_class_logs */; + let num_da_fields = 1 /* nullifier */ + + num_private_logs * PRIVATE_LOG_SIZE_IN_FIELDS + + 1 * 12 /* contract_class_logs */; + let num_da_bytes = (num_da_fields * DA_BYTES_PER_FIELD); let da_gas = num_da_bytes * DA_GAS_PER_BYTE; let l2_gas = 1 * L2_GAS_PER_NULLIFIER + num_private_logs * L2_GAS_PER_PRIVATE_LOG - + 12 * L2_GAS_PER_LOG_BYTE; + + 1 * L2_GAS_PER_CONTRACT_CLASS_LOG; assert_eq(Gas::tx_overhead() + Gas::new(da_gas, l2_gas), public_inputs.gas_used); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr index 92349a70f76d..251a1fb2dfc0 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr @@ -69,13 +69,13 @@ mod tests { address::{AztecAddress, EthAddress}, point::Point, tests::{fixture_builder::FixtureBuilder, utils::assert_array_eq}, - traits::{Empty, FromField}, + traits::FromField, }; use dep::types::constants::{ DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, GENERATOR_INDEX__TSK_M, - L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_LOG_BYTE, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, - L2_GAS_PER_PRIVATE_LOG, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_TAIL_INDEX, - PRIVATE_LOG_SIZE_IN_FIELDS, + L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, + L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, PRIVATE_KERNEL_INNER_INDEX, + PRIVATE_KERNEL_TAIL_INDEX, PRIVATE_LOG_SIZE_IN_FIELDS, }; // TODO: Reduce the duplicated code/tests for PrivateKernelTailToPublicInputs and PrivateKernelTailInputs. @@ -389,13 +389,15 @@ mod tests { let public_inputs = builder.execute(); let num_private_logs = 3; - let num_da_fields = 1 /* nullifier */ + num_private_logs * PRIVATE_LOG_SIZE_IN_FIELDS; - let num_da_bytes = (num_da_fields * DA_BYTES_PER_FIELD) + 12 /* contract_class_logs */; + let num_da_fields = 1 /* nullifier */ + + num_private_logs * PRIVATE_LOG_SIZE_IN_FIELDS + + 1 * 12 /* contract_class_logs */; + let num_da_bytes = (num_da_fields * DA_BYTES_PER_FIELD); let da_gas = num_da_bytes * DA_GAS_PER_BYTE; let l2_gas = FIXED_AVM_STARTUP_L2_GAS + 1 * L2_GAS_PER_NULLIFIER + num_private_logs * L2_GAS_PER_PRIVATE_LOG - + 12 * L2_GAS_PER_LOG_BYTE /* contract_class_logs */; + + 1 * L2_GAS_PER_CONTRACT_CLASS_LOG; assert_eq(public_inputs.gas_used, Gas::tx_overhead() + Gas::new(da_gas, l2_gas)); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_composer_builder/meter_gas_used.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_composer_builder/meter_gas_used.nr index c7bf62dfb182..7418f45462f3 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_composer_builder/meter_gas_used.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_composer_builder/meter_gas_used.nr @@ -2,7 +2,7 @@ use crate::components::tail_output_composer::meter_gas_used; use dep::types::{ abis::gas::Gas, constants::{ - DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_LOG_BYTE, + DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, PRIVATE_LOG_SIZE_IN_FIELDS, }, @@ -45,8 +45,8 @@ fn meter_gas_used_everything_succeeds() { computed_l2_gas += 3 * L2_GAS_PER_PRIVATE_LOG; builder.add_contract_class_log_hash(3001, 51); - metered_da_bytes += 51; - computed_l2_gas += 51 * L2_GAS_PER_LOG_BYTE; + metered_da_bytes += 51 * DA_BYTES_PER_FIELD; + computed_l2_gas += 1 * L2_GAS_PER_CONTRACT_CLASS_LOG; let data = builder.to_private_to_rollup_accumulated_data(); let gas = meter_gas_used(data); diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/meter_gas_used.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/meter_gas_used.nr index 6dbffae8fd14..7a6428ae5c05 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/meter_gas_used.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/meter_gas_used.nr @@ -2,9 +2,9 @@ use crate::components::tail_to_public_output_composer::meter_gas_used; use dep::types::{ abis::{gas::Gas, public_call_request::PublicCallRequest}, constants::{ - DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, L2_GAS_PER_L2_TO_L1_MSG, - L2_GAS_PER_LOG_BYTE, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, - PRIVATE_LOG_SIZE_IN_FIELDS, + DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, + L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, + L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, PRIVATE_LOG_SIZE_IN_FIELDS, }, tests::fixture_builder::FixtureBuilder, traits::Empty, @@ -77,14 +77,14 @@ fn meter_gas_used_everything_succeeds() { let total_num_side_effects = 4 + 3 + 1; let total_log_bytes = 5 * PRIVATE_LOG_SIZE_IN_FIELDS * DA_BYTES_PER_FIELD // private_logs - + 51; // contract_class_logs + + 51 * DA_BYTES_PER_FIELD; // contract_class_logs let computed_da_gas = (total_num_side_effects * DA_BYTES_PER_FIELD + total_log_bytes) * DA_GAS_PER_BYTE; let computed_l2_gas = 4 * L2_GAS_PER_NOTE_HASH + 3 * L2_GAS_PER_NULLIFIER + 1 * L2_GAS_PER_L2_TO_L1_MSG + 5 * L2_GAS_PER_PRIVATE_LOG - + 51 * L2_GAS_PER_LOG_BYTE /* contract_class_logs */ + + 1 * L2_GAS_PER_CONTRACT_CLASS_LOG + 2 * FIXED_AVM_STARTUP_L2_GAS; assert_eq( diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/tail_to_public_output_composer.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/tail_to_public_output_composer.nr index d4a76a03014f..56bedf0d846a 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/tail_to_public_output_composer.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_to_public_output_composer_builder/tail_to_public_output_composer.nr @@ -2,9 +2,9 @@ use crate::tests::tail_to_public_output_composer_builder::TailToPublicOutputComp use dep::types::{ abis::gas::Gas, constants::{ - DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, L2_GAS_PER_L2_TO_L1_MSG, - L2_GAS_PER_LOG_BYTE, L2_GAS_PER_NOTE_HASH, L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, - PRIVATE_LOG_SIZE_IN_FIELDS, + DA_BYTES_PER_FIELD, DA_GAS_PER_BYTE, FIXED_AVM_STARTUP_L2_GAS, + L2_GAS_PER_CONTRACT_CLASS_LOG, L2_GAS_PER_L2_TO_L1_MSG, L2_GAS_PER_NOTE_HASH, + L2_GAS_PER_NULLIFIER, L2_GAS_PER_PRIVATE_LOG, PRIVATE_LOG_SIZE_IN_FIELDS, }, tests::utils::{assert_array_eq, swap_items}, }; @@ -121,7 +121,8 @@ fn tail_to_public_output_composer_succeeds() { let mut num_msgs = 1; let mut num_private_logs = 2; let mut num_public_calls = 2; - let contract_class_log_bytes = 9; + let num_contract_class_logs = 1; + let contract_class_log_fields = 9; // Gas: revertible { num_note_hashes += 2; @@ -134,15 +135,15 @@ fn tail_to_public_output_composer_succeeds() { let num_da_fields = num_note_hashes + num_nullifiers + num_msgs + + contract_class_log_fields + (num_private_logs * PRIVATE_LOG_SIZE_IN_FIELDS); - let computed_da_gas = - (num_da_fields * DA_BYTES_PER_FIELD + contract_class_log_bytes) * DA_GAS_PER_BYTE; + let computed_da_gas = (num_da_fields * DA_BYTES_PER_FIELD) * DA_GAS_PER_BYTE; let computed_l2_gas = num_note_hashes * L2_GAS_PER_NOTE_HASH + num_nullifiers * L2_GAS_PER_NULLIFIER + num_msgs * L2_GAS_PER_L2_TO_L1_MSG + num_private_logs * L2_GAS_PER_PRIVATE_LOG - + contract_class_log_bytes * L2_GAS_PER_LOG_BYTE + + num_contract_class_logs * L2_GAS_PER_CONTRACT_CLASS_LOG + num_public_calls * FIXED_AVM_STARTUP_L2_GAS; assert_eq( diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-base-private/Prover.toml b/noir-projects/noir-protocol-circuits/crates/rollup-base-private/Prover.toml index 320ad8004cee..b5a856982131 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-base-private/Prover.toml +++ b/noir-projects/noir-protocol-circuits/crates/rollup-base-private/Prover.toml @@ -1,57 +1,57 @@ [inputs.tube_data.public_inputs.rollup_validation_requests.max_block_number._opt] _is_some = true -_value = "0x0000000000000000000000000000000000000000000000000000000000000e16" +_value = "0x0000000000000000000000000000000000000000000000000000000000000e18" [inputs.tube_data.public_inputs.constants] -vk_tree_root = "0x1644418d6d00aefd0815a5576611abd0bf6f4770a2a2d6b5356808aac5245292" -protocol_contract_tree_root = "0x02dae744a60621d793d9f228e36975aec8ab5cdc963876aad4a3767866b1fd65" +vk_tree_root = "0x1648448d030859f5423fdf2595769e40517eb083de6194ac882f8ab3f140d166" +protocol_contract_tree_root = "0x0baea02e0bf351d285508e7fe17aeccb25bbf5bc2abe4c4a12044d9b897f2e74" [inputs.tube_data.public_inputs.constants.historical_header] - total_fees = "0x0000000000000000000000000000000000000000000000000000021ff53c53cc" - total_mana_used = "0x000000000000000000000000000000000000000000000000000000000003dea9" + total_fees = "0x000000000000000000000000000000000000000000000000000000155eefcdb0" + total_mana_used = "0x00000000000000000000000000000000000000000000000000000000000153e8" [inputs.tube_data.public_inputs.constants.historical_header.last_archive] - root = "0x05b3bb5109d47ed6719879aaf4064be70759479be53c4e77aef08be7de6ed42c" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000006" + root = "0x27c27b015f66aafdcfdabfcac0ff1f648e2155fa21efcf4a143512767290597e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" [inputs.tube_data.public_inputs.constants.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" - blobs_hash = "0x008f59895cfcbae4d2c4235f44091341c26560b47821e99d39e2e208b8b844b3" + blobs_hash = "0x00c38019c808952890355828fb38b61be12dff3d0be5950fdfd1550455ffecc5" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000060" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x0887b34d5f375a58a62bd1ff4652387c631157b2a6dede7ca0a43cc8cdf07d92" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000180" +root = "0x066adff8aa49f0f62dff3eecb980b4ebe65f081af4d05e6411925c3e609a8d4c" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x040941eb6ab29e9509bfeb0ee4760284aa10b9361ccc18269f1e52647b7e8f89" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" +root = "0x05bb61b06f5e950de4b778921195d897befe2705c7c4c6224962e975ea38aeba" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000280" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x2798b6a996d1e50d16ca17964d07b47bffe461d51db772e326bf5ad11641dd29" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000099" +root = "0x1d52b9e2e1a3497dc52888afb22888c2a9037169e238faed9720f5fae5dd432e" +next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" [inputs.tube_data.public_inputs.constants.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000006" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000009" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067b6ec12" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000013" + timestamp = "0x0000000000000000000000000000000000000000000000000000000067bc4165" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x000000000000000000000000eb6355a62d6434cf7ece9a27ea91a2167604d246" + inner = "0x000000000000000000000000c218809c79531316787fb0ce23f01d232542547c" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000008c90ec" + fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000010186e" [inputs.tube_data.public_inputs.constants.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -67,7 +67,7 @@ l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000001876ad" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000099363" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.max_priority_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -75,8 +75,8 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 [inputs.tube_data.public_inputs.end] note_hashes = [ - "0x00db699b6ce5a3c347fc31d3fdcf7ce503f1c0cdd564d7c5a390cf9743d9ebe6", - "0x26e95ebb84436a6c21798c702c79ef16e23e228b6fc70bbc89dee917b1e7ede7", + "0x12b96328f50ec49a53a908b05ddb340b819e2610ff3afe43e113de73bc0c5b0d", + "0x20fb96bb71b9b143d65aac8f005ff0d1e05fec092d40f9918d3b2be0ce10df1d", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -141,8 +141,8 @@ note_hashes = [ "0x0000000000000000000000000000000000000000000000000000000000000000" ] nullifiers = [ - "0x184f3bf785d39454d7995bd1df11f4f92b3d9fd6506e2ab432ee97fbd7f9d433", - "0x020cb29dbc3790c26f7a86a99742c0e3f8aa1b2bb2692d289e944a09a2afaf13", + "0x09aed0f2951185148e42bd9881bab0a48af8416b7a83a13f39446e407ef205d3", + "0x14337c3cdcf9f3035cf2538da1c18a6ccfd2a64f2acc38bfa6b8773516ca60a2", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -206,7 +206,6 @@ nullifiers = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000" ] -contract_class_log_preimages_length = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.end.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.end.l2_to_l1_msgs.message] @@ -298,68 +297,68 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.end.private_logs]] fields = [ - "0x26589d73da5dee22c9df099e58037059c86acf84541616650673660395484188", - "0x037ed5e707ec4a34b350858a04a251cfa0868a973ed67d4e8ad0b80aef8502f0", - "0x0001337f0c443ce86ed1d10fdb67d25c8fa1a9bf01e2b051a9b418b300b66f45", - "0x009eaa43a94ba937a306f5ce60dee84a7eaed39f81484869fba1b0567676fe9a", - "0x005236f415c7cc506020508262bb29bb6e9333612a1342d88f81571452d77ff4", - "0x007185acffbe25fd449a0f7e8593709929227ecc88013c6bcdce6b9321043448", - "0x00bafc2f35b80fb89534162d7d249912951a646fd50754a19214bbb4d85b7b73", - "0x00f86cf3f6960b037589fd7a58f956e720f14873d0cea2abd026d0b2401b332e", - "0x007892d4489227b87b208021e9895d3922558ee0ffe6a6109c38d87575d917ec", - "0x008bf4aecb8f40ccf81456f9f23f52181212b51331dcbdb1238e0ee4e4e01c35", - "0x219eef374dc22fe55ced93fc8601dc5a48c4d575a248f4010ed183b2cf00fee8", - "0x27bfe9e85f898008e603bab40255bfda17d14251e8ad46d21416d93800e3ac29", - "0x260b843a0128a2fa9fb36ad99da5600cd67a7d9008454f92dfc2dcba8c2139d5", - "0x165f66ed4af7625985e5cf8c70b366c4d5ef072ee793cd34ae2c772a8094532c", - "0x100d612848a26bfccf050084d70ecc2a0cfca4c0f9d2271af477d6ee0b060332", - "0x2a93fb61364567a40a9a21c30746b23bef63d2b15aa3677a7f8e5b44eb660255", - "0x29ed78c9307bf7e44ee16e83385899b26648a472d767c8a1e86af04512e8ef69", - "0x1f0f5953cb04edd64cbb2a729f8da7428297a2d05407ee3c689bb7c090b56e61" + "0x2181697b8480f1a6a9386d08ae42293fe800b255fcaa25e6fe648be024491a45", + "0x0162421d79ae1280d68841dc0f187590b840cc62ea0576bee0473873fca5d256", + "0x0001c919cc6ff935a1dcf4906041a648f0c97643ef0f4634fcff0bfb5024845f", + "0x004e195f8ed2d98f440304c91c7473d14d368e31738aef3e533d718607fa6f08", + "0x009dea150fa204248486559d02b15706241adcf7b74b424dce5bf0e95a828afa", + "0x00e8e70ce434eff46d9a4882769dc90dc5e530f2fb05de0ed9cf56e2665ec5d4", + "0x0079f0b241ef8629f6265c37636980c02445002b12ed8a8a21a66cc98f49d837", + "0x00cb384b2fd7ee7adfdd29aff2af949ef7b84983fa6f4df4659a867d989f2154", + "0x004c133adc41fda4ab7f63117f10119ceb2549b4cb192bd6d3a80943781dc1b1", + "0x00293e2e14b6b07cdc1cf0f2d5ebcbaa1735a7eefb4ab9fbc0c6f887c8e61854", + "0x12a1503e2bd9f49c848f71bf961478b4e6dffad0146bb13c23a4a08c23b70828", + "0x0f6186684071159a9a32cad7b3b828d575086b08ead4d99f5218e7cbd036cf87", + "0x1e52a272346c0d48f919b69398cbb8d858a66b06bfefd8f96a6e1af41e5123f5", + "0x294ab96a01d892bdb4435caef216e6f183ff8f6e9500617f78c2fa5ccf446c08", + "0x1bfe275a77f6e8c2ebd2b8c9dcb3072d787b8ff229ef89d838695ec372cc7a1c", + "0x23e26bd12c1f22bc0edc1a846159da07d9a16a0134baaa1a6ab95a2794c3ba72", + "0x240a30935e152dec3b689775ae0a87cda6a002eb0505c651a509c294161738f0", + "0x0d6f59d9e364c5930ae593c000f439aff511f8c87908c932351039405fd1b6e0" ] [[inputs.tube_data.public_inputs.end.private_logs]] fields = [ - "0x24195139d894da41089d11879a330988e4f0e97bdf185bcae8fabbf0d110139c", - "0x06791a018413b9f35ea527a44dfb48500659f92d633a59279174b81e331aaac5", - "0x00019333db70672b88972fa509e34b6b8e98bc2846958d3b63def714892efac7", - "0x001955de1ab02816acf5402c59057cfe9657cf84b4a8295e5cc2dc70be604969", - "0x00d81eb05be1c246145445c15a8c145a3c51da8b176223455493e87d4f87cace", - "0x0064779cc12fea7138fce38d999b2b8bdf73c904613f391b60f68eff664dbc4b", - "0x00bbc1a27dba543bbcc9818b617af49e194cfa9b1e6238ecc50a5ba9b22959c8", - "0x000d7544045fb54cb0b3b219b3cbf05e33643a014675f85b81c6bed5a4cb3e04", - "0x00be99de065c2cc3ef119abee1753413f22608e0231ed5092fe2c7d3779b4d76", - "0x00869e117b1e35f5feb6aaae8e00e1464bba4cacf849fdc482f65b938eb605cb", - "0x175401ec60fc1d8ae93a2965e9693e5c10f44e7040e7abc7a96f4c7558313007", - "0x2d22c530ea47499be87859a08dc0ac57827ded0a870e4ba7d3f93569f9c3150f", - "0x2223d28e397409d6011339d38e89c42c3683e18177c323c73c69dacefaef9241", - "0x0b3483e8a084baa91a91b82884335ce111653335d042b35bfdaa864e2991fa0d", - "0x299e8d73adadc52f1d695c94039b1c53bb322aa76a493b0b8f536040c88adb83", - "0x03a70c64ae7df165a4383c3a7c033adf848f5f982c1b85568969672654c4a966", - "0x121ffd31eee933b0b37617fce97988e05138c72a1f6ab7645eb475b8fab0f017", - "0x0863fdaa9cfa12237b87adc6f701ceacc37e1010ae467e20b8c4bace200f0359" + "0x2943733f064637e3e441f8dba033f2dfb97a14249fd0eb9cf6f8b72ac6b8a138", + "0x25f5142f392f1f06f3195b03d3bdff401b5330f261e9ae0a4a414d95cc9765b7", + "0x0001fc3b4d62da6f6140262673184665a6a8bb0e1f5b5718c7d459149dc7fbfe", + "0x0078d861dedf0f845b9f4c02a79c0d03f1bdabcdcdc5f4afa0cf84bec75cd831", + "0x00f5b4033ad04bc5568132d26e45467d4b555f1b779b1eecbc3f7d32b97ba3aa", + "0x0071ceb869705890fd6653a7a7f1f6727741f26306e315ec27a694db2d85dca6", + "0x00531b98e35b77dc7947afd7f7dd19780fc467997cefaa7826ba18b2eb70fb31", + "0x00452d3c250ac90682aa22bbd1709d4d8889fc5a0e1b78d34a779c4de2276524", + "0x00b85b0bde0ac8d7e26c94a00194bc35230e00a5bc66397318ee42e2add4d152", + "0x007edb23455bb7d00d72d5dab1140b3c56edcd637a817b987b0ab7c22037958c", + "0x0cf6ef177ae2a3928999aa54afff186ae4f6133beb1e6f87b2244cb5bd6bbba5", + "0x1737bbd2524c0dded120eede8853206f3cb4683086b9a0ffb7065640e3b8a144", + "0x068e7309d2aad63a71bd4d13c6888edcc9744ed53e4a1cdad2dd55e4601b4feb", + "0x18a3c0367febfebc155b2ad6202670e7a6459d0b209fefa989f6d2f43df07b2b", + "0x25e5ec5bb63dfe5fd41bdf2f8a6f55bd578cb56afbed341d903d38f48f721ecd", + "0x2291708567344ba82e2921fbd59716a588b88b7213d1c4bf5204aefe6adf703c", + "0x1da31ea1fd76aed6713d153f7fab575b31cfae0e76ca062dfe6f5f1fb601600d", + "0x2067843c4ef6a314e8b3971472e8dfbc002364d24d0817403a813230a15dd520" ] [[inputs.tube_data.public_inputs.end.private_logs]] fields = [ - "0x17bc978f3d29f17efaa1dd0991f0e608c309b1e2f4ab4c8e4e6af0ed136edeec", - "0x05dd6282c227ca264b4443dd0c8ce8a9e06065b20658d4488c203fe65231a4f6", - "0x0000c134d60a9f72fae2d43648b24d0e049ae533f9a2b363e2322f82d48f1941", - "0x00c724ff5c44a81d1adee6d3072d31d28cc8f47a5a397875a124051d19febaf6", - "0x00d1d43e40ead24f86e5713e7433e2d983c9cd72728d6f8a202537dc86c1219c", - "0x0072203d7e94c0ccecd02d239db3bf395f55283cd779a080eb85194723555900", - "0x0093c0108f72c6097a74e333eafaf5001a8ac89a224c4887e134ec5913dded82", - "0x00df582dd5420b314a5ae5d845dd6ffe415971802e8adcc32e32879ba122fe69", - "0x006fb8a84355e84dc7612d8b93d2cd17433fdf7e208a42e10ffae0350b5b4bdb", - "0x00c7ebf808bb90eb2be9684dd5c390b1849dce272eb39a5b32bd3d10b7d4fef6", - "0x0ffafa18fa5909844eb22f9a273abf5ebe7150c6258031e710121de1970018f1", - "0x2f1c41fd7cbf6ce297d122bb2dd309e3177d70a9c1e1d6b3ed208a9f1c7d8481", - "0x2bff32fbf584257ccd38b4b991dbb650440dea579dcb12128426f63f2c0cd0f9", - "0x2dd7e272968c958677a7dda900e0953b688b47cd41597501d6bdb493d7a23765", - "0x2fe6bf2bdec0f052fdbd30f5bd0c8456440d93a2fbd2fd13393b725ccbd0e606", - "0x211d4655cae041043790231627093e697ed3512322466388da3697d4f8f0ce0b", - "0x0e85f506b4749a82cd120bbdb6db84da9aca96f52f944c1cd21112ab954c56dc", - "0x09c7e2643dfa84045fcd3d9ca39cf466ee42286d1467cd9c49f3382a0407bf5a" + "0x0b65695c37b4d73fb1536bef578774feb9253f0366c1dcb22c752f0b07c3426f", + "0x1e5f0f70cecc9937ef2e268ca83f6d53d0bab18872452a5940142578e0df0ec1", + "0x0000267756ccb5bdcaf17e981670d5a1545675208c8ca527cc9deafb97d0070d", + "0x00d65f940dd4b9134e15645d62a38c027b25abb1aa97dbbc33ffc6408837e459", + "0x00d7c31ad82c6217ddea685e8ac7c99a4fe9a0cb693a0fff8786174d83b0c460", + "0x001a6d73787aba7f3415f3e056375e090a8d7a33485d7140e5b7520241fb3a4c", + "0x002b581ac5e8d66896e9ace588a84a8fdd8df666544c000555687aff96042f22", + "0x006f3f21ed1b50546a794c29c290e1869e1497acbbf307bd3e3eda90d86c7e29", + "0x008dfcf890d68063501b928eb36c73b395364696b56d896d0011aa970bb8a8b1", + "0x00d7ed8e4a1a3034b7d25c1c3fa1891ca7a8d8dd31637e61ff9f5ea7435bb659", + "0x22fdb18288692ce835052ac6c67f1725d7e19a658b986917a2f7435b640a06a3", + "0x1322154350350a91e6d8b600f8587534f728a36e458af40f1d0e6e712b57fae5", + "0x13912f471ccc99e4d3e15693921a55261ae07e5f4ecbd6127dc7a22dbc723e39", + "0x07ffea9fd0a4ef4a13e204c9038ebdb8604b911f02fc0a27bfeecc0a293a163b", + "0x04e31d11458730c588fa4e779296a882997aeae4d9a58f622cc932448b8c6219", + "0x08bb6a8ebcfafe37c6431ad2b0573df404926545275001b5c361fbac0acd4a89", + "0x257bf696db93cb887c2ecf4887670ff39cbf4107eabecf5954b17cb6163e15fa", + "0x16b3bf362de7420d6c6d3318ce2bd267a13479fe711a7827f67f94860ccf39d9" ] [[inputs.tube_data.public_inputs.end.private_logs]] @@ -1014,7 +1013,7 @@ da_gas = "0x0000000000000000000000000000000000000000000000000000000000007600" l2_gas = "0x0000000000000000000000000000000000000000000000000000000000004a40" [inputs.tube_data.public_inputs.fee_payer] -inner = "0x1c37466c1edf1ec26e28b0978459d3c3337b8d88e25eacfb3b37687cd08d27b1" +inner = "0x161ee558437daf5c595c8eb949f1b7907338122ae36c30e280588a5446391601" [inputs.tube_data.proof] fields = [ @@ -1562,11 +1561,11 @@ fields = [ vk_index = "0x0000000000000000000000000000000000000000000000000000000000000004" vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x300dfcf0fdabe41c19a8366c83b938a27643a7c476365a16acc449dc553d65d7", - "0x2abbc11ecc9be914ffe5155d3573cd0706f814c18423a01073220dfdcffc256d", + "0x267349a3079fcc01f745cf97092711a2e74caa0faf6df34f6db564029f880dfc", + "0x1c388d7cbc55931f9d8e14a98495d9dcdf1af8cc4dedadd56c6a2ccd1b9c7b2f", "0x0d12417a9fee854bb7973bca4cd76ac021dd6df8c8bb9b63e19025c50d20cbf7", - "0x2d05b00a4513f805540187f563c1c879c324eb574a24fa0f10aa7217ee031ab0", - "0x26dba2f0cdb03057adb82271d309491b5af2606e89aa7fbe9bf82340064f52a7" + "0x1f1a86b74593ad4cca631e97bcd2831e6f5e1187ef61b5085d36f92f3540947c", + "0x0a9319e1a9dff433c5259a48d4c7ec512bb61605c4972d4155f67ad6933d8a9e" ] [inputs.tube_data.vk_data.vk] @@ -1714,16 +1713,16 @@ vk_path = [ hash = "0x0000000000000000000000000000000000000000000000000000000000000002" [inputs.start.note_hash_tree] -root = "0x0887b34d5f375a58a62bd1ff4652387c631157b2a6dede7ca0a43cc8cdf07d92" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000180" +root = "0x066adff8aa49f0f62dff3eecb980b4ebe65f081af4d05e6411925c3e609a8d4c" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" [inputs.start.nullifier_tree] -root = "0x040941eb6ab29e9509bfeb0ee4760284aa10b9361ccc18269f1e52647b7e8f89" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" +root = "0x05bb61b06f5e950de4b778921195d897befe2705c7c4c6224962e975ea38aeba" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000280" [inputs.start.public_data_tree] -root = "0x2798b6a996d1e50d16ca17964d07b47bffe461d51db772e326bf5ad11641dd29" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000099" +root = "0x1d52b9e2e1a3497dc52888afb22888c2a9037169e238faed9720f5fae5dd432e" +next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" [inputs.start_sponge_blob] fields = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1746,8 +1745,8 @@ expected_fields = "0x00000000000000000000000000000000000000000000000000000000000 [inputs.state_diff_hints] sorted_nullifiers = [ - "0x184f3bf785d39454d7995bd1df11f4f92b3d9fd6506e2ab432ee97fbd7f9d433", - "0x020cb29dbc3790c26f7a86a99742c0e3f8aa1b2bb2692d289e944a09a2afaf13", + "0x14337c3cdcf9f3035cf2538da1c18a6ccfd2a64f2acc38bfa6b8773516ca60a2", + "0x09aed0f2951185148e42bd9881bab0a48af8416b7a83a13f39446e407ef205d3", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1812,8 +1811,8 @@ sorted_nullifiers = [ "0x0000000000000000000000000000000000000000000000000000000000000000" ] sorted_nullifier_indexes = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000004", @@ -1879,9 +1878,9 @@ sorted_nullifier_indexes = [ ] note_hash_subtree_sibling_path = [ "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x17aae8b30b1aa58f3bb50160e3a6c96c741c21b1fe4d6070d3a7575c3e7b7a4f", - "0x061db51c1d946e90a96e4e6c64f6f82316598bd6a27d049d1d132f39d0ce44dd", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x13ca406a96edbd660da0db9377a2b8c784a51c26f2545583192d946819f4f575", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -1915,9 +1914,9 @@ note_hash_subtree_sibling_path = [ ] nullifier_subtree_sibling_path = [ "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x116c66e317b7b7a4741223c757d95583ef189421093fded437d4f8c1d4045ca0", "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x294f4b968a7abf36526c7019e79719c9bafdf8ab911fa564a9eff32cce81b28b", + "0x24e8ffa5497c794e608c4c41d81229a4301269a5090e5148b45663a797099900", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -1993,14 +1992,14 @@ fee_write_sibling_path = [ ] [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x178a357b6130edb31d9359d9aec67aec701925fdebcbae7ee54bccfb86a7b925" - next_nullifier = "0x1fbb20ef6d9e3499bbbbe372e35baf9cd6d2bad2cc362c5e04589979367633f8" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000142" + nullifier = "0x0a1a26681cbad74b9fa14ca9150f5f8a5fdb0c200840f6e93bc20edff4a294ba" + next_nullifier = "0x1d9ff005ac6bce92744de59507c7ff49b651dbb291e276d108b151580ee3a307" + next_index = "0x00000000000000000000000000000000000000000000000000000000000000c0" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000007f" - next_nullifier = "0x097aa57f45d013dac39d7e199a150f90c1026c043ad5e9d33d04e5457cc815a4" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000143" + nullifier = "0x099211a382aae63bcf29796af5bf9b64f30b4bd7f3d852583bddf993d39bef65" + next_nullifier = "0x0a1a26681cbad74b9fa14ca9150f5f8a5fdb0c200840f6e93bc20edff4a294ba" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000102" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2313,18 +2312,18 @@ fee_write_sibling_path = [ next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "192" + leaf_index = "258" sibling_path = [ - "0x02b0805ad4a95a4bf84c68e3f651b11fdf1450f35de0c7f7dca1cd7fdea9a871", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x0989b773123cb6d1d709349975bdce5541d671ef8ebddade4bad153bf1b9133f", + "0x115e35de0560c3c99c3255e8e1052d1c447675b71b8cb841a09d2f7fc8c2a59b", "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x18c7a1dd59c584cf6b3bef01672286840aa425d59046a50385680dbcb0dc2bb9", - "0x1c752e7f9623e6c29603acd1e97392f90274946f5414bb78f90fe20aaea4fef6", - "0x02b7dd5b6976c36767dee81df1817123e1aefc08ace292e589d4964a904e4e6f", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x01b4cd42238fa018b92c5b4d1d3e40b797a87715dd05115ce2558e1af534ddaf", + "0x1078112a1bb879fe8b960d3c44c1baf2a36fdf1dd5cc44b0eb513811b4d5d9ee", + "0x1c67887e1797fa66a5fe44f9ee3a47024ea55bcb75605743b672c46944010b3e", + "0x305108541e76c4ab682f3438dc935f221202b81f26325ddb4772923580b3799f", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -2358,18 +2357,18 @@ fee_write_sibling_path = [ ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "127" + leaf_index = "193" sibling_path = [ - "0x0d2e74b9d21f0f0ca0bb02fe570268b7927737220eb27c2ee03911305b4a39b4", - "0x125f11770899f31d09cd5954bda0a90973b480be7ff9e29a9c02562ab78f0ee6", - "0x07961b7b41a4705f005f5fe2942faae223307b4f3033c46f9cccfdd57791b65f", - "0x29957e7d9a08ebc027115c442d1405703b1c5e530a6b171906a0172627ddc6eb", - "0x135c2d2dc15a5acc7b43b89aaba27718b5f575df9413618552a3a1b3121c8bee", - "0x28b8fd8b9d61fbe4b1c0a05c6313d3ea28b715a5c2ddab3a4f9d127c27dc6b9f", - "0x169afc20aaa33427f6a9f136203922bf52f1107285f5696611645b6b55df8561", - "0x129fe0c2b21fe9185f2410052c19054be59a738aaf975801cedb3990e2c93392", - "0x02b7dd5b6976c36767dee81df1817123e1aefc08ace292e589d4964a904e4e6f", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x27b6776858ee6d9d5a86ac6b6e97b3f3b52eb317c18069f161514eedfe8226f5", + "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x1ce22869ea501d3e8c5da95b8f6e9f29db63a052ec56ee28e749892135ee64a6", + "0x1555903c1c632b19bcd1221b58e0145d013c8db22bba93307c37daaeeaef73cc", + "0x0325903580f881cd752ef04d1bdf45e0efba2a904ef4e121917c3f8c09235706", + "0x305108541e76c4ab682f3438dc935f221202b81f26325ddb4772923580b3799f", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -5193,22 +5192,22 @@ fee_write_sibling_path = [ ] [inputs.state_diff_hints.fee_write_low_leaf_preimage] - slot = "0x212fe0a872a019b69b20f11ec9f1db0ab15582b2be40c2d3121ce427f59cb1d9" - value = "0x00000000000000000000000000000000000000000000021e19e0bbd49d3781a4" - next_slot = "0x22468d1a8ac127fa5ca21e0f673fe7f40b1a49b05b37ce9a694e04ed8fba2d4c" - next_index = "0x000000000000000000000000000000000000000000000000000000000000007c" + slot = "0x0a6e16a003a1377090986e1deac91905a54330aaa962277cb7d32fc2463fa329" + value = "0x00000000000000000000000000000000000000000000021e19e0c22d44092f74" + next_slot = "0x0b5aa7ecf9512d9c97c974f5a56737c82efd0c3a3486781989673835ce66f7d0" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000093" [inputs.state_diff_hints.fee_write_low_leaf_membership_witness] - leaf_index = "123" + leaf_index = "119" sibling_path = [ - "0x0f9efbe645edd6c0f0af8637a32bf4a917223fa76482a9ee65497996bf73c52e", - "0x2538a61d3ee8d426319836531cbcb145bbcf3742b069f138998fb0d96e0fc787", - "0x0852bffa7491ff623bf08bc4e4909c87b4e7f31fae72252309867807f804280d", - "0x18adce341b4fa996f7174fef584e3aa3fbc0876bf475578a6d756dfc8e428143", + "0x18209173a41eeb27fdac589c03d22c09c7384fa38ac1132e13bf407c7b9b6436", + "0x2ec157510fe2767d280e343fe7e1beb853f1ce73aaabab829f9c499190168dd7", + "0x29208ecc66c5a3f559855bd44866e51a9e1b053fe1b60786941ab50664c75667", + "0x22ad70a334b0101447951f2315dd6015931d37bfeb389e8d239db22912e7f73d", "0x179d7b5df7a65a4bdda408605c069b3ea175a5f4e2b0fccc9f2ebcb5d12c7c28", "0x19e2b3449d24e57ea4d6948048220d0756f93b6aaca968960b173df69903160a", "0x1a35cf71ad31b7058db0cec41776442412ccd9f75276205dcd8fd0ffc4bbfaab", - "0x0a29c59fe9932a0e372ab905871bdd2b8c6374e19bc968e23067da027b7d8254", + "0x1393bd9c7b3a221c881994b1ad4fa17f3365b3d1d0d1d84580a2a67fc47b2949", "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", @@ -5243,17 +5242,21 @@ fee_write_sibling_path = [ "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] -[inputs.archive_root_membership_witness] -leaf_index = "6" -sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1b310091f25556247eb686f4fa27ebf50817b1980ff90a77ba5d283c88170d52", - "0x2dba3cd55f4dd5ce5cd321cf0c231b55b86ff019ae0451bbf37fc3da836b9cdb", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", +[inputs.fee_payer_fee_juice_balance_read_hint] +leaf_slot = "0x0a6e16a003a1377090986e1deac91905a54330aaa962277cb7d32fc2463fa329" +value = "0x00000000000000000000000000000000000000000000021e19e0c22d44092f74" + + [inputs.fee_payer_fee_juice_balance_read_hint.membership_witness] + leaf_index = "119" + sibling_path = [ + "0x18209173a41eeb27fdac589c03d22c09c7384fa38ac1132e13bf407c7b9b6436", + "0x2ec157510fe2767d280e343fe7e1beb853f1ce73aaabab829f9c499190168dd7", + "0x29208ecc66c5a3f559855bd44866e51a9e1b053fe1b60786941ab50664c75667", + "0x22ad70a334b0101447951f2315dd6015931d37bfeb389e8d239db22912e7f73d", + "0x179d7b5df7a65a4bdda408605c069b3ea175a5f4e2b0fccc9f2ebcb5d12c7c28", + "0x19e2b3449d24e57ea4d6948048220d0756f93b6aaca968960b173df69903160a", + "0x1a35cf71ad31b7058db0cec41776442412ccd9f75276205dcd8fd0ffc4bbfaab", + "0x1393bd9c7b3a221c881994b1ad4fa17f3365b3d1d0d1d84580a2a67fc47b2949", "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", @@ -5274,49 +5277,37 @@ sibling_path = [ "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f" + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", + "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", + "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", + "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", + "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", + "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", + "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] -[inputs.constants] -vk_tree_root = "0x1644418d6d00aefd0815a5576611abd0bf6f4770a2a2d6b5356808aac5245292" -protocol_contract_tree_root = "0x02dae744a60621d793d9f228e36975aec8ab5cdc963876aad4a3767866b1fd65" - - [inputs.constants.last_archive] - root = "0x0ae35faca3d8b308facdb8f4c29356dc01ea670dad43eb630b01ad61beaf6d74" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000007" - - [inputs.constants.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" - version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000007" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000012" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067b6ecea" - - [inputs.constants.global_variables.coinbase] - inner = "0x000000000000000000000000eb6355a62d6434cf7ece9a27ea91a2167604d246" - - [inputs.constants.global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.constants.global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000104f1e" - -[inputs.fee_payer_fee_juice_balance_read_hint] -leaf_slot = "0x212fe0a872a019b69b20f11ec9f1db0ab15582b2be40c2d3121ce427f59cb1d9" -value = "0x00000000000000000000000000000000000000000000021e19e0bbd49d3781a4" + [inputs.fee_payer_fee_juice_balance_read_hint.leaf_preimage] + slot = "0x0a6e16a003a1377090986e1deac91905a54330aaa962277cb7d32fc2463fa329" + value = "0x00000000000000000000000000000000000000000000021e19e0c22d44092f74" + next_slot = "0x0b5aa7ecf9512d9c97c974f5a56737c82efd0c3a3486781989673835ce66f7d0" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000093" - [inputs.fee_payer_fee_juice_balance_read_hint.membership_witness] - leaf_index = "123" - sibling_path = [ - "0x0f9efbe645edd6c0f0af8637a32bf4a917223fa76482a9ee65497996bf73c52e", - "0x2538a61d3ee8d426319836531cbcb145bbcf3742b069f138998fb0d96e0fc787", - "0x0852bffa7491ff623bf08bc4e4909c87b4e7f31fae72252309867807f804280d", - "0x18adce341b4fa996f7174fef584e3aa3fbc0876bf475578a6d756dfc8e428143", - "0x179d7b5df7a65a4bdda408605c069b3ea175a5f4e2b0fccc9f2ebcb5d12c7c28", - "0x19e2b3449d24e57ea4d6948048220d0756f93b6aaca968960b173df69903160a", - "0x1a35cf71ad31b7058db0cec41776442412ccd9f75276205dcd8fd0ffc4bbfaab", - "0x0a29c59fe9932a0e372ab905871bdd2b8c6374e19bc968e23067da027b7d8254", +[inputs.archive_root_membership_witness] +leaf_index = "8" +sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x057edb3907f636bd0d42f38f6ae5250c870a448f1dfe67c481c966d44c8bd9b8", + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", @@ -5337,22 +5328,3057 @@ value = "0x00000000000000000000000000000000000000000000021e19e0bbd49d3781a4" "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f" ] - [inputs.fee_payer_fee_juice_balance_read_hint.leaf_preimage] - slot = "0x212fe0a872a019b69b20f11ec9f1db0ab15582b2be40c2d3121ce427f59cb1d9" - value = "0x00000000000000000000000000000000000000000000021e19e0bbd49d3781a4" - next_slot = "0x22468d1a8ac127fa5ca21e0f673fe7f40b1a49b05b37ce9a694e04ed8fba2d4c" - next_index = "0x000000000000000000000000000000000000000000000000000000000000007c" +[[inputs.contract_class_logs_preimages]] +[inputs.contract_class_logs_preimages.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[inputs.contract_class_logs_preimages.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[inputs.constants] +vk_tree_root = "0x1648448d030859f5423fdf2595769e40517eb083de6194ac882f8ab3f140d166" +protocol_contract_tree_root = "0x0baea02e0bf351d285508e7fe17aeccb25bbf5bc2abe4c4a12044d9b897f2e74" + + [inputs.constants.last_archive] + root = "0x26d6941617d63fdea667144ffdc28b7e5fb07ef6b8878c96943538f34878b219" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.constants.global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000022" + timestamp = "0x0000000000000000000000000000000000000000000000000000000067bc42cd" + + [inputs.constants.global_variables.coinbase] + inner = "0x000000000000000000000000c218809c79531316787fb0ce23f01d232542547c" + + [inputs.constants.global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.constants.global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000066242" diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-base-public/Prover.toml b/noir-projects/noir-protocol-circuits/crates/rollup-base-public/Prover.toml index 5962b33227ef..9da60f9c4427 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-base-public/Prover.toml +++ b/noir-projects/noir-protocol-circuits/crates/rollup-base-public/Prover.toml @@ -1,53 +1,53 @@ [inputs.tube_data.public_inputs.constants] -vk_tree_root = "0x1644418d6d00aefd0815a5576611abd0bf6f4770a2a2d6b5356808aac5245292" -protocol_contract_tree_root = "0x02dae744a60621d793d9f228e36975aec8ab5cdc963876aad4a3767866b1fd65" +vk_tree_root = "0x1648448d030859f5423fdf2595769e40517eb083de6194ac882f8ab3f140d166" +protocol_contract_tree_root = "0x0baea02e0bf351d285508e7fe17aeccb25bbf5bc2abe4c4a12044d9b897f2e74" [inputs.tube_data.public_inputs.constants.historical_header] - total_fees = "0x0000000000000000000000000000000000000000000000000000021ff53c53cc" - total_mana_used = "0x000000000000000000000000000000000000000000000000000000000003dea9" + total_fees = "0x000000000000000000000000000000000000000000000000000000155eefcdb0" + total_mana_used = "0x00000000000000000000000000000000000000000000000000000000000153e8" [inputs.tube_data.public_inputs.constants.historical_header.last_archive] - root = "0x05b3bb5109d47ed6719879aaf4064be70759479be53c4e77aef08be7de6ed42c" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000006" + root = "0x27c27b015f66aafdcfdabfcac0ff1f648e2155fa21efcf4a143512767290597e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" [inputs.tube_data.public_inputs.constants.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" - blobs_hash = "0x008f59895cfcbae4d2c4235f44091341c26560b47821e99d39e2e208b8b844b3" + blobs_hash = "0x00c38019c808952890355828fb38b61be12dff3d0be5950fdfd1550455ffecc5" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000060" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x0887b34d5f375a58a62bd1ff4652387c631157b2a6dede7ca0a43cc8cdf07d92" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000180" +root = "0x066adff8aa49f0f62dff3eecb980b4ebe65f081af4d05e6411925c3e609a8d4c" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x040941eb6ab29e9509bfeb0ee4760284aa10b9361ccc18269f1e52647b7e8f89" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000200" +root = "0x05bb61b06f5e950de4b778921195d897befe2705c7c4c6224962e975ea38aeba" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000280" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x2798b6a996d1e50d16ca17964d07b47bffe461d51db772e326bf5ad11641dd29" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000099" +root = "0x1d52b9e2e1a3497dc52888afb22888c2a9037169e238faed9720f5fae5dd432e" +next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" [inputs.tube_data.public_inputs.constants.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000006" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000009" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067b6ec12" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000013" + timestamp = "0x0000000000000000000000000000000000000000000000000000000067bc4165" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x000000000000000000000000eb6355a62d6434cf7ece9a27ea91a2167604d246" + inner = "0x000000000000000000000000c218809c79531316787fb0ce23f01d232542547c" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000008c90ec" + fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000010186e" [inputs.tube_data.public_inputs.constants.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -63,7 +63,7 @@ l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000001876ad" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000099363" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.max_priority_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -71,7 +71,7 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 [inputs.tube_data.public_inputs.rollup_validation_requests.max_block_number._opt] _is_some = true -_value = "0x0000000000000000000000000000000000000000000000000000000000000e16" +_value = "0x0000000000000000000000000000000000000000000000000000000000000e18" [inputs.tube_data.public_inputs.non_revertible_accumulated_data] note_hashes = [ @@ -141,7 +141,7 @@ note_hashes = [ "0x0000000000000000000000000000000000000000000000000000000000000000" ] nullifiers = [ - "0x23e774b35ac450d2a3e1c5a28597d2ff21091b7369ee896482cbb43543f9f1ae", + "0x068e09d658449523f5e4e51e6fd41fe9d809acf452c8f2ff6ad7d4e369a425a9", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -2361,13 +2361,13 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x265ab05f0a96a4a7844d9fa8e01d6347a26af6d02d74a40e20b54ca02c5e5d77" + args_hash = "0x2c0d242c333b6e2b156042d004ea38e537482c27d0fec93d156238542db167fe" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x1c37466c1edf1ec26e28b0978459d3c3337b8d88e25eacfb3b37687cd08d27b1" + inner = "0x161ee558437daf5c595c8eb949f1b7907338122ae36c30e280588a5446391601" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x1ba22c36a8f0d810f76d8abd5600129314cdd9777fc4ff0a6e241210824f1f17" + inner = "0x27bc69cf3367414e0e604516880bd129fc7c067b0a09bf5f84656f47b17cec73" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" @@ -2793,7 +2793,7 @@ da_gas = "0x0000000000000000000000000000000000000000000000000000000000000400" l2_gas = "0x0000000000000000000000000000000000000000000000000000000000006500" [inputs.tube_data.public_inputs.fee_payer] -inner = "0x1c37466c1edf1ec26e28b0978459d3c3337b8d88e25eacfb3b37687cd08d27b1" +inner = "0x161ee558437daf5c595c8eb949f1b7907338122ae36c30e280588a5446391601" [inputs.tube_data.proof] fields = [ @@ -3341,11 +3341,11 @@ fields = [ vk_index = "0x0000000000000000000000000000000000000000000000000000000000000004" vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x300dfcf0fdabe41c19a8366c83b938a27643a7c476365a16acc449dc553d65d7", - "0x2abbc11ecc9be914ffe5155d3573cd0706f814c18423a01073220dfdcffc256d", + "0x267349a3079fcc01f745cf97092711a2e74caa0faf6df34f6db564029f880dfc", + "0x1c388d7cbc55931f9d8e14a98495d9dcdf1af8cc4dedadd56c6a2ccd1b9c7b2f", "0x0d12417a9fee854bb7973bca4cd76ac021dd6df8c8bb9b63e19025c50d20cbf7", - "0x2d05b00a4513f805540187f563c1c879c324eb574a24fa0f10aa7217ee031ab0", - "0x26dba2f0cdb03057adb82271d309491b5af2606e89aa7fbe9bf82340064f52a7" + "0x1f1a86b74593ad4cca631e97bcd2831e6f5e1187ef61b5085d36f92f3540947c", + "0x0a9319e1a9dff433c5259a48d4c7ec512bb61605c4972d4155f67ad6933d8a9e" ] [inputs.tube_data.vk_data.vk] @@ -3493,40 +3493,40 @@ vk_path = [ hash = "0x0000000000000000000000000000000000000000000000000000000000000002" [inputs.avm_proof_data.public_inputs] -transaction_fee = "0x0000000000000000000000000000000000000000000000000000000897344820" +transaction_fee = "0x00000000000000000000000000000000000000000000000000000003dc59b700" reverted = false [inputs.avm_proof_data.public_inputs.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000014" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067b6ed1a" + block_number = "0x000000000000000000000000000000000000000000000000000000000000000b" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000024" + timestamp = "0x0000000000000000000000000000000000000000000000000000000067bc42fd" [inputs.avm_proof_data.public_inputs.global_variables.coinbase] - inner = "0x000000000000000000000000eb6355a62d6434cf7ece9a27ea91a2167604d246" + inner = "0x000000000000000000000000c218809c79531316787fb0ce23f01d232542547c" [inputs.avm_proof_data.public_inputs.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000067854" + fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000002e860" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000a0" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.note_hash_tree] -root = "0x1aceafa7fbf307e7f6e883c742a0058a18b641810293d44026139c6fac910c7d" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000280" +root = "0x25941bd9b7c19924bfb9af852265d52691e716d78d084d8771704d0845e2d343" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000300" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.nullifier_tree] -root = "0x22281fb51972f8257db5d2371b7761f102f7eb4d326b2afb47459687cb6e1a9e" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000300" +root = "0x2f09031e2f83e63398ddec7097b6b5836aaf95fecab9d20bb69f9d6bf98c5095" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.public_data_tree] -root = "0x2cb1a13b25c0cc2ff4de645f59bfb29296d2e396e3e236b7ec7deb9b1166da1f" +root = "0x1a55edd6af0a830e51a9621a8175fa6ead175ffd40e4ee92f9a71230a3f86d8c" next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" [inputs.avm_proof_data.public_inputs.start_gas_used] @@ -3543,14 +3543,14 @@ l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [inputs.avm_proof_data.public_inputs.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x00000000000000000000000000000000000000000000000000000000001876ad" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000099363" [inputs.avm_proof_data.public_inputs.gas_settings.max_priority_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.fee_payer] - inner = "0x1c37466c1edf1ec26e28b0978459d3c3337b8d88e25eacfb3b37687cd08d27b1" + inner = "0x161ee558437daf5c595c8eb949f1b7907338122ae36c30e280588a5446391601" [[inputs.avm_proof_data.public_inputs.public_setup_call_requests]] is_static_call = false @@ -3970,13 +3970,13 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 [[inputs.avm_proof_data.public_inputs.public_app_logic_call_requests]] is_static_call = false - args_hash = "0x265ab05f0a96a4a7844d9fa8e01d6347a26af6d02d74a40e20b54ca02c5e5d77" + args_hash = "0x2c0d242c333b6e2b156042d004ea38e537482c27d0fec93d156238542db167fe" [inputs.avm_proof_data.public_inputs.public_app_logic_call_requests.msg_sender] - inner = "0x1c37466c1edf1ec26e28b0978459d3c3337b8d88e25eacfb3b37687cd08d27b1" + inner = "0x161ee558437daf5c595c8eb949f1b7907338122ae36c30e280588a5446391601" [inputs.avm_proof_data.public_inputs.public_app_logic_call_requests.contract_address] - inner = "0x1ba22c36a8f0d810f76d8abd5600129314cdd9777fc4ff0a6e241210824f1f17" + inner = "0x27bc69cf3367414e0e604516880bd129fc7c067b0a09bf5f84656f47b17cec73" [inputs.avm_proof_data.public_inputs.public_app_logic_call_requests.function_selector] inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" @@ -4475,7 +4475,7 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 "0x0000000000000000000000000000000000000000000000000000000000000000" ] nullifiers = [ - "0x23e774b35ac450d2a3e1c5a28597d2ff21091b7369ee896482cbb43543f9f1ae", + "0x068e09d658449523f5e4e51e6fd41fe9d809acf452c8f2ff6ad7d4e369a425a9", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4853,18 +4853,18 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000a0" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.note_hash_tree] -root = "0x1aceafa7fbf307e7f6e883c742a0058a18b641810293d44026139c6fac910c7d" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000002c0" +root = "0x25941bd9b7c19924bfb9af852265d52691e716d78d084d8771704d0845e2d343" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000340" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.nullifier_tree] -root = "0x23abf98a13d205e04be129067b10f3ea93350b91270158bdea1b3d636f316010" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000340" +root = "0x093ca3d8df23b61474bc287d2be671fa3cb741c4065a6df447e85f177db6d94f" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.public_data_tree] -root = "0x1c8a5fe67f9013042a75c426a6b24c7f35929ace61396b5c82e7d7da23e3f0b4" +root = "0x161aecd5d034289dbc1755a090014aa239631f2fa575967d0cf3781f98b037e4" next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000009a" [inputs.avm_proof_data.public_inputs.end_gas_used] @@ -4939,7 +4939,7 @@ next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000 "0x0000000000000000000000000000000000000000000000000000000000000000" ] nullifiers = [ - "0x23e774b35ac450d2a3e1c5a28597d2ff21091b7369ee896482cbb43543f9f1ae", + "0x068e09d658449523f5e4e51e6fd41fe9d809acf452c8f2ff6ad7d4e369a425a9", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -5262,16 +5262,16 @@ fields = [ ] [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0928749370556e745f6e1c3fe59fe0dad30d60e56d4bd1d19ef866a752c383df" - value = "0x0000000000000000000000000000000000000000000000000000000000001f40" + leaf_slot = "0x00f2ebe012804f730ffee08825357d5ee33dba26fb32a4e587e01bd49c7d557b" + value = "0x0000000000000000000000000000000000000000000000000000000000001c20" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x1226347a21faacc3aa3a632d28792c91ed8200f544741805651bdd2da5e141b9" - value = "0x00000000000000000000000000000000000000000000000000000000000007d0" + leaf_slot = "0x0de18e1477ff528776a9a02b77e7c2512b5812694e99741b4c6521e5a228731b" + value = "0x0000000000000000000000000000000000000000000000000000000000000af0" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x212fe0a872a019b69b20f11ec9f1db0ab15582b2be40c2d3121ce427f59cb1d9" - value = "0x00000000000000000000000000000000000000000000021e19e0bba35ff221e0" + leaf_slot = "0x0a6e16a003a1377090986e1deac91905a54330aaa962277cb7d32fc2463fa329" + value = "0x00000000000000000000000000000000000000000000021e19e0c2197e759cd8" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -9679,103 +9679,103 @@ fields = [ vk_index = "0x0000000000000000000000000000000000000000000000000000000000000005" vk_path = [ "0x27dbd017f63a5339a96cbc9ab86dc2b137d7c0ed488f2ea3e33424d7a44562c3", - "0x300dfcf0fdabe41c19a8366c83b938a27643a7c476365a16acc449dc553d65d7", - "0x2abbc11ecc9be914ffe5155d3573cd0706f814c18423a01073220dfdcffc256d", + "0x267349a3079fcc01f745cf97092711a2e74caa0faf6df34f6db564029f880dfc", + "0x1c388d7cbc55931f9d8e14a98495d9dcdf1af8cc4dedadd56c6a2ccd1b9c7b2f", "0x0d12417a9fee854bb7973bca4cd76ac021dd6df8c8bb9b63e19025c50d20cbf7", - "0x2d05b00a4513f805540187f563c1c879c324eb574a24fa0f10aa7217ee031ab0", - "0x26dba2f0cdb03057adb82271d309491b5af2606e89aa7fbe9bf82340064f52a7" + "0x1f1a86b74593ad4cca631e97bcd2831e6f5e1187ef61b5085d36f92f3540947c", + "0x0a9319e1a9dff433c5259a48d4c7ec512bb61605c4972d4155f67ad6933d8a9e" ] [inputs.avm_proof_data.vk_data.vk] key = [ - "0x2e1213ef1d0845cce0bf3b2422b883c72da46114bc1abaec0e49498e0fe0e097", - "0x145503a3aa111bb4ddd37b54cae906cd6cfd9ae0d777a12091ddbb7563171e24", - "0x26f0861a4aab57a4fdc58d11ac15b23de0e928833484f4ca31248c9fa8365a0c", - "0x07a63db16507c02a4cfa17fc46a650b2a828e0e1876f9b8304540c6f0974ea47", - "0x2afba3b2404cbc51ae97b53de939d4e70eff38fdcc530e926ede6d9f71de6deb", - "0x248e6a9b4983a55ae473661e4cb47dbc49710f3484de3321ade8e953addfceea", - "0x30524d97fa9aba67a3b5f6d9206e8ef271d8d339d5382867afd28c32f919e5f4", - "0x1c8e6ed6c3f301deb2d326c993e7e890eca874a76a22a9e0fd6f08e919590da1", - "0x08e9199be6803df02c511a70e6270d26263e956491a764e2e773528c6239159b", - "0x0479754f760ce24717750fa491e3f6980603578be4e20e624613ee52f3b680ec", - "0x0158258a83bf576329049f219c2643971757177b05d31147e79687d77e60b8ff", - "0x2724b0ff36cb9583afec4c83a108f84915165b9964eade2a29c417c632fed29c", - "0x234ac16fc0921cae2b4c8787305c64ac53556ebb66fd45ed55c2187b830d2fd6", - "0x139014516207a8baec491a1e72dab973b83cf966ea084e79034eb4c29d0d8ab6", - "0x08c40bae30d83b111d12064429b0e2ae4b4b0aa6c89a7606af776bf85ae2beca", - "0x2146c36a3ec5e01f81946c4a524eedc15ca01c108cd7a2e301070f4178c254e6", - "0x0f6b04f18050f59a03264419c23f4c8c4d79a8195c045a5ad60f18609d25ab06", - "0x1f5157645cacb13d443fe66ce8208960cddb39e03612244af8bd57a88d1557e3", - "0x12843c427a9926004974b71167214268213e53f79682d8bcbf9e30fab5eda613", - "0x04e4b188d3560482bcfef940adf6575c23b23bf7d571ad282aea113578ef839f", - "0x08072146aadaeec553f7ab2778a1df77ec63a1d975e27a7f0d0b54441099e651", - "0x134a62af5dcf5eca54382296836f711e43ac3728576af21e9232c5c04e7176f5", - "0x22ecde4047c69d71cc8ec5bbc4515c87a3d94a73a95105204ab48671b7d17d0c", - "0x21ed2d2e08d52a43d7755daf536ef2e053552a0b331ec0a3094d0e44d3b728b5", - "0x1ff4cc88b2dc600b41f39b1112b093581715f00151f006cdaa79d9e616140d75", - "0x161dd9306cc15bb2ecb4772dbaab86ec51cc07e67edbd9199b373d119e09945a", - "0x0e449b8de0ae2294eff85ccb2de6d6e8085540d127e540b5b734723fd2dc7452", - "0x2e9ff66a46b46254377a72ae853f741182c888441d7d2602a345653e7974348f", - "0x12261c096d6eb00cb3f61856759ed0ad72f24f7d7c7667d21b8ad966facdcab6", - "0x244ab9cbb4d98eca120f4f7b91974ec40cb5b2df9042133c732081f387bef1aa", - "0x04696e2c6779210abc048ff06e03762c836415be9cbdb1f933ec92cdbcdf018b", - "0x0ab7e7ff4b6aab0f1493462706d14c017ee12e0e9aef661f5b1b202637226622", - "0x26244a3033e4c70d900139dd95493dd0ba9a2b54d1d07a98579fe4e35c0695eb", - "0x1cd7d67b3563d8d6bea721f2658b1efc79866dac3459dd64e3bdd61f13179f5b", - "0x18d68e5ac4a9c924012662a08fe6a94d86ad087e0fc9c2ee47b4af3cdf355768", - "0x07ed16f17be4c927ee5fd54545b25616a64a2fbfdb34280a3d5e5cabcb070f33", - "0x29ed2f2cd50f907f0d6c50583f46e75b717fa83174e06bbd8d1b055f44e951d7", - "0x1a849d3330d42327d0cf49f97f50e27c9a5c6cabeb2e9053a4b86acc7f904ce2", - "0x1ff55886ffea719491e0b2a0cd3f87bd7118ced9fc986162878574e31df3d924", - "0x054ee7c3d9a76955716b0a53f1f0919e1bed2887b786de2a1849c22b0d5f6f71", - "0x0fe839daca4af2b5690359010a42b226c8993e89f7976c3c41784a689b670f07", - "0x11d05f03a714adca3b640417fc5e396d1a6a16816c7980e9fb10037871e7e969", - "0x15eb0c9dab1fce8935f5622d429d56c5b2ae6d012cead62807b193a6b26e4fb3", - "0x1c416653c6642fd58f3502403262f7fb6b39b59f483a0d7a518b9a5306c3b3d4", - "0x0d89686248723a0a81dd77c8a472e5f2bc780174d684c4b37d12863f54aa9f12", - "0x1a9ed96636a8672a4a0ffa9046163b42d516cb04b32ff61e1af7a185da208e15", - "0x04f93bf5d0440620fa8ac9cedd24d27be55f14394b84ab8ca3bda91111f6af68", - "0x16fe1210701d8d41fd3ec0658a734ecb7dedc957d5bcd3bb6ccebf5109989361", - "0x09c1be99fc3cd72beaa001edfd0a4fe6184ad090a31c3edfca2b4c10b129cb2a", - "0x0f9ff78ec6df9a39174888f606b4de728b2f5b170548aae34c502c2face4335b", - "0x2e3cfa1c3bacd8949b012250a7638dcf917ae87bab6e454a34f3c7aba899f2ed", - "0x1a2e3df65e99b8a9b38f844868f4cb30b54372889c59c8c230ac8a36312495e1", - "0x090088b4e5eaa0c88fe437fa3663f49dc229354a55d8e4f16ed6ddf5f72956fa", - "0x157f2e7c3703d586a3133286d416e6ec0322b673624896c905c76d0396ccf103", - "0x29866f6884ba3c19d7afebcf264db8fb0f858d922d57a42c03cdd23657d0ae00", - "0x20a16fcecef99924b535e20aaf895c5972111520a4c509c29c2e2eb4564fde13", - "0x1e769d2f35140d73b1e10ee2028bff893940766df86341069abec7aa44b2d3f6", - "0x1f3290cd35a0a3e28b089f18594630928d7220455441690146d3583699d551be", - "0x17b434bcd25d347d03f279b4798e126c657b2aa5f62387ac6540ff18d8965b4f", - "0x181dfe9e51bd10b7cb1b18cdb6dc386f0297d7df915c970b7b5c62a2aec9d5e1", - "0x0c933459f3cd0ab9727d0da38db3eb001b9b5ebde0d8f6216e4f214e8c72d2bb", - "0x1e103b3f13b0ac37941adc300b04d98eae0a66c4bc1598e2d09192be36281df2", - "0x229bc3c00a795fa585a5b055e6334bbf76de0fce961682e6d185916d3b89784a", - "0x1abb3a389a14b80a27fce0e195b107fe94fcb56ed95fd84e5901243e7004f013", - "0x05fcbf203aaceceef1de1b0227f8ec02c3fbca3c75716773c21c65461cd23d3d", - "0x06fc58fec3cd4ddf5fd2b309fb1991faa8e5669472b2e286ad7036252f3468e2", - "0x0e4f48222622eef8361a6c4c6e1dfaee96d3c25de49419dcef791d259b470faa", - "0x12e9f8bd1813b215af56fb40bdc25d8242bb95e98c54b611ee84763dac4e27bc", - "0x1bfd238420b1cb01aacf4e10a9b0c3d219979c20baca5275d317dfc3dbf26429", - "0x078ac6d5c144a771c2f096dd7b3063738110cb58653c43ca54ced69f434e7b37", - "0x2301c2bcab9aad26e924cfa4cae5d00b0a64adbb9858c2780167be0eb58f9fbc", - "0x1e07d34d20f1008c0493fed165d9007f33775fdc24f013e81fde653589a7fa9e", - "0x1ea71b5a552641646a6a057bdac3f4fdbd9089787eab9f9f6677d2c435a74535", - "0x1e563baee360d9aa66c86191f83d7f11f3b4b09153f796757ba70287653da4a4", - "0x2c7812575ab95ae46582715d4fc1700e653a067d13ee5398c6aedbf545623e08", - "0x2367955710d34c6318a582191eda8b5c20ee9ee8614c0b391808b4c660aeab25", - "0x1985a30067f45a4d52fcc54c8ad4d12d617e9afd834fe45bab428e539c359d7d", - "0x13c46b7400fd7c81931151b7e5631f49022b1ef4285516ad2cfa25eabad9d840", - "0x234edb6bf6cbf12a1e1f90f337f6b414481c73f1d22b0f391012fa9fc44e4aff", - "0x08cc5f2324ed9e678a91b382edd792a7043202ade163c45c662ab5752fee8dd6", - "0x1374ea38aa52eacb81e41bb3574c0e4d560587303d7cdb10c73ed78f50f59bfd", - "0x001401e26c9d903bd7d2b24ee228da82030b2674a3caf83e5900b4fc7db6efa2", - "0x0b650d1b1b5ae4a8be13bb25619b7b16938d7f2750aad66b5ade028e74f8604c", - "0x2324f4a8396ea3554317706070c84805889a5d332922ed1d4ba6c353f12b1ab9", - "0x1f0b94fca8d818413d7c5a7e82d20016d02ffa259160af992d78feda41af0763", - "0x1df57613ff0e097aeb5a27a072c65243eb79cb21ac630160471b51f5d37cf88d" + "0x10d4b41f0224ac03ded42392f9dae9f82020abd43f7b6b8a70f5e004759e3602", + "0x2e8d6ec85542fcbd256426c08a1daacb93ba4ea2be0adfceee891283b9b8b739", + "0x007eaee6b8612105cdbd188bd9c90b59daea331a901fb7b83e8222aa60cb6a25", + "0x145dcaea28dd8801b6067834fd10de89eac00ba33bb8fe88b5874613e2e60056", + "0x01fca2a33fa423f62a21dab371cfcb5c6690c3f1f99a75c929bd1d8e60b76508", + "0x19bb17ccf93e91b406621538e1b7670b995d01aaa339345037ad352806b23322", + "0x0126f58dd76da5590de1d82f61a2e516b27da90bef44e334f71e247e449becfb", + "0x0aa4cfb9fd1e48fe96a269aa8e4cf9dcd149797996380448116a623d3f74eb51", + "0x191f5a66003ef879cd83ba52b27264c8e1760768ee71eec3971f385291ca9fc6", + "0x141fb6bfdfadc50c7d2efad446926b586c65289f03abb439aed14d6bae766985", + "0x0cadcfc3049968c4a4c1f254f98aa06be2c5f39670d7c3257a704ace06a05fbc", + "0x1a91725a0688bdb6d18d4c17d0bcc49c23d36ac71381d6d118e16acc1219dc74", + "0x21f027fed0ef54b8be834cf9f79f6f43fd939ef5e833ff81bad2eba90d1a4208", + "0x29e9e35e024fce65d014398e61f63c4372c5456a40c294e9b671718969095d89", + "0x1f8c0495274327edf7316aa66c0bd8fd0c08e4f7a8153d67d3a66470eb8a5593", + "0x2c91fcd3a8d19c8406c5fda76d922a2f972e64a57e42680a95429c3357b2bef6", + "0x0fb7704fdb84a107e24f152755ba2e3557658fe4fdf193ca6f35d2d1524ec08a", + "0x297ad22fed64796d5bd84daac78732efef16f6009ab5f5c524128a7c53b201f6", + "0x298f3f68e361351c02b4ef9fecbde5f6cc6884459c52641837fdfea4477aa11f", + "0x16f1daf5861dd82c400cb60ba47ee70c31ad2239ac6b0f27364598c3e01ab046", + "0x1416fff7b70d079f673cea292cfe91c72778b1c20e2a6e52372be4c516a39aee", + "0x1664f60c18b6230a1e7851e854b44dae1e97bf68d8a88cbc92a08b7188814736", + "0x2c71933e876427aa7add8150fd93e9ff8aa595d3a2a3a2fae97fd9ac3f8f2910", + "0x2ebc4518a18cf42686737022347ad945321da5f285289ff8663fc08a0fde91e9", + "0x281ff093e10c3c28ff2a8761875c57d907e7f8f1cbe191be0fce239cdcb9a274", + "0x116726b2e799447d3e7dee20ed7ae333e48896e83e9ab9d2434062477b42acad", + "0x08ed1f665a00503f0f5f42e0acdc2d1675a2e6c366be3202042f45311333de4a", + "0x2384690ca1e302f3d673ff30b943634b7e6d6eed831fa88d044552c57c39f5ea", + "0x03c873c342e4d15663e3bef6a1c68dda589826476979176831d85ddfa9935997", + "0x04afbc05f100687f35be6615c4ee3d6e10894f1b0ed36d11ee9c9bfee3020560", + "0x175e6cbde688b890ddbff380446fd87828ab4bcdae97893d21f7a48cbac530e3", + "0x2b0045808d5584fae608d82f39eb090c30f079c4e0a4619b9f0dd9f141b2839c", + "0x26f30edcb97f66c7116de1cbad9346595fea1ef36883db55497b161e1db0889d", + "0x25621d2631bbfa531f1cf91377c591bb2317b67f6f280ee7c1846dd8f5f2fd7b", + "0x21bd316935549359c6c1b8911a5ee35ffbb1a420b56b0deabe4f904b71ebeee2", + "0x11ce0a7bfa9388205a27e1493520cc71db66d56813f91bd4a7f1ee12bb0b23e3", + "0x0139f461c38408d437b9078cced771ed352269187902a9d8852300368509e85d", + "0x07f24043fe0c251472b6a85ca962c88bf26c25e02b171afccb96b3dc1016efe5", + "0x1e489df34fcdd9b72c1020d962819c5042e79fea7ea3de310f74740b3144e35a", + "0x0a70764b78868e08fa9f47e9f95598fc26174ab523b2ec208686d29cf3b4cf4d", + "0x194f5d55a44d70e1db5d0d3f304a278f535fb79baf5f60467a9ec769516d810c", + "0x2a1ed0c992a17b2403a93056e168f55840029d0b2187969b349a758ee1a8b401", + "0x2c14ada45c971f35434af5e46aafcad355169f41c69b077ca3c6e1a103001691", + "0x06f8ac9cc7184b036208faba91b17718afe668cfe4e719fc3bd38823d88af460", + "0x10ad4caa5c448b041d191374832d39e614aeda1d755d1e2ae6482f8d12ba44ea", + "0x0bb6032499e50575371ab8625911fb6bf9b24f3a51dfc077c876d7c001428847", + "0x07230a54691bfa8368fdf3748fce79965ff24d0b8a55b29208a2c4ca5010ad2c", + "0x138d10556ae8f996f529330beab182ade2e7fe859a2d24b97341fef7fde7e7fe", + "0x174b530e7f5e8aadc935ec66ab169afe2d4b93a75860325d492a8e8f2214cb74", + "0x03f6549cdbb6d460112041809dc017215540d9cfad16c6b4cb53a72653cdfe9d", + "0x09fbf7328d564eb64ccb07d3285bd75fad537db2bc74116b30ce9c35dffafd1c", + "0x05d5fb848b96803982673239ac5031581d7ec3299e4a11e05126060b32ec712d", + "0x10e54c8afc4b9dc6cddef6f0533191fb5b7b71258162b2714eceb9ae065a07eb", + "0x2e110fcb39b7fcf1b5f6b436c1059000a8cae5e6b0bb037dc71a3e8368a913f2", + "0x126ce9568ae8a4a9c2dd03120740fc7736c098ef9c9903d2b03dda1bcb7ea2f5", + "0x0e5b9d74e8c9d694348c02e9878add1586c0995a241e5f8952720de553ddb8e4", + "0x11e8b9c6a0f3dfc2a6e64bddf13248a25e47aa8ffe4d7df2dd306122c9e75220", + "0x0b3373b9e5c6380c03befc28f970ae36e47906fa0ed620a92fd5baa514e543bf", + "0x197e432f413777bad2bd8adeb5002eab4670c8aa97a15ed4079b27fd7ed099be", + "0x054db1aa1ce545dc2cb3421c259ed8d825935d6ce3d508a937fa866e311baf43", + "0x0441f6dc6deeddd1b2f6fcda84dbf5dd66493f852d7e3cc8608d20d07b024b32", + "0x0ea350e8486f6a5a4978103fe6de038ac5131196e247311a63c0a8fe91bde755", + "0x2bde43cffca313a0e9ba3a1729d945acf6472450a1ba24923ecd3cdbee78dd37", + "0x19a4bfa90418cb9c0c24cabe8e6b47dc976d5b3a249b418e844b908f6190a099", + "0x12354948f9a1defa9ccda7e9bba19d5fe9f12607b9378159d9e1482b4c760dbd", + "0x0d8295a6ac68c424bee16ba64d8bf1452b7b1b93a8f8f4c34e74b0315f423006", + "0x15589c3a23f930724cbe4e6f7c2b8f12ebc1ea2d7101c7d1d9e63e831c6df3e2", + "0x0d6b40becf1461c3f9553e03851aebf9a5eb38072cd54c1867227af0ac03416d", + "0x248b92d90d341917fd5571f3e3e8aab5e223b235ca4b4b15c0cc43bad44c7444", + "0x06ca3704148ab228c3a7d5938f7d7764e3d3287c25614e9fa4f8a2819be8a275", + "0x1d823ca6d319dffe396e382c77f89bbcd95785eb5b9a5875dc961c83b976b383", + "0x1fc1a60ed2707bde1ca66f3272f823fc8ccaf9c14c341f9de51b3156949a17a3", + "0x2a782579a9b9f1773073be8c15668087201186bfeeb3941ed77f4989ef11c1ba", + "0x171f790819e3d2519b6bd1248f3c3e0fa6436df93a820ecc55d1db3932cda043", + "0x27895d4ae27548176f3b530496f5b468a95880ac8004a96becd9bbc55d3a4c48", + "0x1914f9d9a6c8a08be35b1ccc23658201ede49f12d0ac12d7fa7cad7fdf31635a", + "0x1f134e228658edf8787c30354f76ff10c10c31813a1f1bb3d0fc6323a29bd0b2", + "0x24394e469e6d8da207de25287d9ed95b160d307b09f0c0a6ec9310bf0e1622f9", + "0x2e9341bd02eb55a1f322679701190b32335602122172d7f9a3199dc7ccfbb8f7", + "0x17a378e2c63b36525f30e9e0a286bb0c160e756c37f702490bc8027f3ed3db5c", + "0x2e2c02f884dd13c1b775ebce60cfdd6e01acefb6a221062ea4f2eda2478fd397", + "0x2d555eefabe85656a8b9f9cdc8f6afa2e992390f27831025674a3be84ecd4ff5", + "0x2188b655b0d43187aa8b093d9dc877b691ad6fe344b532b979b42ab2602a3cdb", + "0x2a8dcb729b1f726f749c165a508b23b9f17acd945d2a2f79a020c30955596c43", + "0x1c98b06ae5ab39fe93d2b19354d0ebccbd376441aa493a8830dbba6597244f3c", + "0x0b2c61f353e7404a0d7939e33b95ae3fbe917cbeeb53ad76fa0b7b983489efab" ] - hash = "0x140573d0ad8c82b99fcbbebc4f75c54266e0a50b9858451588d42eaf4a351209" + hash = "0x083c635f4ba33fabe93551fce8236f57afe217c29a7cbfb9aa775ea8bcad3ae9" [inputs.start_sponge_blob] fields = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -9797,12 +9797,12 @@ expected_fields = "0x00000000000000000000000000000000000000000000000000000000000 squeeze_mode = false [inputs.archive_root_membership_witness] -leaf_index = "6" +leaf_index = "8" sibling_path = [ - "0x268fe6cc724a2b22c90de036be72fd625e1f93765da57f9ca9d796cf75935fd1", - "0x1b310091f25556247eb686f4fa27ebf50817b1980ff90a77ba5d283c88170d52", - "0x2dba3cd55f4dd5ce5cd321cf0c231b55b86ff019ae0451bbf37fc3da836b9cdb", - "0x0d39ab223d0afda6d6a8bd9e0ba9ee169899171dac2166d696603a91ba81b9eb", + "0x132bcedbf8a27823a34e86b6dd094b6886b64a918c0f40d7b1eaca86cabfbcaf", + "0x11bf8b965644de2efbaf76fa4d9e41efdbf69c9deea9ad62477a9d7e304f68a1", + "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x057edb3907f636bd0d42f38f6ae5250c870a448f1dfe67c481c966d44c8bd9b8", "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", @@ -9830,27 +9830,3054 @@ sibling_path = [ "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f" ] +[[inputs.contract_class_logs_preimages]] +[inputs.contract_class_logs_preimages.log] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[inputs.contract_class_logs_preimages.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + [inputs.constants] -vk_tree_root = "0x1644418d6d00aefd0815a5576611abd0bf6f4770a2a2d6b5356808aac5245292" -protocol_contract_tree_root = "0x02dae744a60621d793d9f228e36975aec8ab5cdc963876aad4a3767866b1fd65" +vk_tree_root = "0x1648448d030859f5423fdf2595769e40517eb083de6194ac882f8ab3f140d166" +protocol_contract_tree_root = "0x0baea02e0bf351d285508e7fe17aeccb25bbf5bc2abe4c4a12044d9b897f2e74" [inputs.constants.last_archive] - root = "0x19c7046f42513ad502513dd9e49c9d636df00165e12e16d68bdb8ee8c7483af2" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" + root = "0x0e2232c34943202fcd1fcaaedf2e0e85c093e4367ccbcd68a343e5348ae94fb1" + next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000b" [inputs.constants.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000014" - timestamp = "0x0000000000000000000000000000000000000000000000000000000067b6ed1a" + block_number = "0x000000000000000000000000000000000000000000000000000000000000000b" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000024" + timestamp = "0x0000000000000000000000000000000000000000000000000000000067bc42fd" [inputs.constants.global_variables.coinbase] - inner = "0x000000000000000000000000eb6355a62d6434cf7ece9a27ea91a2167604d246" + inner = "0x000000000000000000000000c218809c79531316787fb0ce23f01d232542547c" [inputs.constants.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.constants.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000067854" + fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000002e860" diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/tx_effect.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/tx_effect.nr index c0e2da5c6166..c3997b79d8b5 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/tx_effect.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/tx_effect.nr @@ -1,7 +1,7 @@ use types::{ abis::{ - log_hash::ScopedLogHash, private_log::PrivateLog, public_data_write::PublicDataWrite, - public_log::PublicLog, + contract_class_log::ContractClassLog, private_log::PrivateLog, + public_data_write::PublicDataWrite, public_log::PublicLog, }, constants::{ MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, @@ -21,8 +21,7 @@ pub(crate) struct TxEffect { pub(crate) public_data_writes: [PublicDataWrite; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], pub(crate) private_logs: [PrivateLog; MAX_PRIVATE_LOGS_PER_TX], pub(crate) public_logs: [PublicLog; MAX_PUBLIC_LOGS_PER_TX], - pub(crate) contract_class_log_preimages_length: Field, - pub(crate) contract_class_logs_hashes: [ScopedLogHash; MAX_CONTRACT_CLASS_LOGS_PER_TX], + pub(crate) contract_class_logs: [ContractClassLog; MAX_CONTRACT_CLASS_LOGS_PER_TX], } impl Empty for TxEffect { @@ -39,8 +38,7 @@ impl Empty for TxEffect { ], private_logs: [PrivateLog::empty(); MAX_PRIVATE_LOGS_PER_TX], public_logs: [PublicLog::empty(); MAX_PUBLIC_LOGS_PER_TX], - contract_class_log_preimages_length: 0, - contract_class_logs_hashes: [ScopedLogHash::empty(); MAX_CONTRACT_CLASS_LOGS_PER_TX], + contract_class_logs: [ContractClassLog::empty(); MAX_CONTRACT_CLASS_LOGS_PER_TX], } } } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr index 603fa842bd49..49f64bb947b9 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr @@ -18,13 +18,17 @@ use crate::{ use super::components::constants::validate_tx_constant_data; use dep::types::{ abis::{ - append_only_tree_snapshot::AppendOnlyTreeSnapshot, constant_rollup_data::ConstantRollupData, - public_data_write::PublicDataWrite, public_log::PublicLog, sponge_blob::SpongeBlob, + append_only_tree_snapshot::AppendOnlyTreeSnapshot, + constant_rollup_data::ConstantRollupData, + contract_class_log::{ContractClassLog, validate_and_silo_contract_class_log}, + public_data_write::PublicDataWrite, + public_log::PublicLog, + sponge_blob::SpongeBlob, tube::PrivateTubeData, }, constants::{ - ARCHIVE_HEIGHT, MAX_PUBLIC_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, - NOTE_HASH_SUBTREE_HEIGHT, TUBE_VK_INDEX, + ARCHIVE_HEIGHT, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_PUBLIC_LOGS_PER_TX, + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, TUBE_VK_INDEX, }, data::{hash::compute_public_data_tree_value, public_data_hint::PublicDataHint}, hash::silo_l2_to_l1_message, @@ -48,6 +52,7 @@ pub struct PrivateBaseRollupInputs { fee_payer_fee_juice_balance_read_hint: PublicDataHint, archive_root_membership_witness: MembershipWitness, + contract_class_logs_preimages: [ContractClassLog; MAX_CONTRACT_CLASS_LOGS_PER_TX], constants: ConstantRollupData, } @@ -111,6 +116,20 @@ impl PrivateBaseRollupInputs { ); let out_hash = compute_kernel_out_hash(siloed_l2_to_l1_msgs); + + let mut siloed_contract_class_logs = + [ContractClassLog::empty(); MAX_CONTRACT_CLASS_LOGS_PER_TX]; + for i in 0..MAX_CONTRACT_CLASS_LOGS_PER_TX { + siloed_contract_class_logs[i] = validate_and_silo_contract_class_log( + self.contract_class_logs_preimages[i], + self.tube_data.public_inputs.end.contract_class_logs_hashes[i], + ); + } + + // These lengths have been constrained in validate_and_silo_contract_class_log to be correct. + let contract_class_logs_lengths = + self.tube_data.public_inputs.end.contract_class_logs_hashes.map(|l| l.log_hash.length); + let tx_effect = TxEffect { tx_hash: self.tube_data.public_inputs.hash(), revert_code: 0, @@ -121,14 +140,13 @@ impl PrivateBaseRollupInputs { public_data_writes: all_public_data_update_requests, private_logs: self.tube_data.public_inputs.end.private_logs, public_logs: [PublicLog::empty(); MAX_PUBLIC_LOGS_PER_TX], - contract_class_log_preimages_length: self - .tube_data - .public_inputs - .end - .contract_class_log_preimages_length, - contract_class_logs_hashes: self.tube_data.public_inputs.end.contract_class_logs_hashes, + contract_class_logs: siloed_contract_class_logs, }; - let end_sponge_blob = append_tx_effects_for_blob(tx_effect, self.start_sponge_blob); + let end_sponge_blob = append_tx_effects_for_blob( + tx_effect, + self.start_sponge_blob, + contract_class_logs_lengths, + ); // Perform membership checks that the notes provided exist within the historical trees data perform_archive_membership_check( @@ -215,14 +233,16 @@ mod tests { use dep::types::{ abis::{ append_only_tree_snapshot::AppendOnlyTreeSnapshot, - constant_rollup_data::ConstantRollupData, gas::Gas, gas_fees::GasFees, - kernel_circuit_public_inputs::PrivateToRollupKernelCircuitPublicInputs, + constant_rollup_data::ConstantRollupData, contract_class_log::ContractClassLog, + gas::Gas, gas_fees::GasFees, + kernel_circuit_public_inputs::PrivateToRollupKernelCircuitPublicInputs, log::Log, nullifier_leaf_preimage::NullifierLeafPreimage, public_data_write::PublicDataWrite, side_effect::OrderedValue, sponge_blob::SpongeBlob, }, address::{AztecAddress, EthAddress}, constants::{ - ARCHIVE_HEIGHT, CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, MAX_L2_TO_L1_MSGS_PER_TX, + ARCHIVE_HEIGHT, CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, CONTRACT_CLASS_LOGS_PREFIX, + L2_L1_MSGS_PREFIX, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NOTE_HASH_TREE_HEIGHT, NOTES_PREFIX, @@ -232,7 +252,7 @@ mod tests { TUBE_VK_INDEX, TX_FEE_PREFIX, TX_START_PREFIX, }, data::{public_data_hint::PublicDataHint, PublicDataTreeLeaf, PublicDataTreeLeafPreimage}, - hash::silo_l2_to_l1_message, + hash::{poseidon2_hash_subarray_variable, silo_contract_class_log, silo_l2_to_l1_message}, merkle_tree::MembershipWitness, messaging::l2_to_l1_message::ScopedL2ToL1Message, partial_state_reference::PartialStateReference, @@ -241,7 +261,7 @@ mod tests { fixtures::{self, merkle_tree::generate_full_sha_tree}, merkle_tree_utils::NonEmptyMerkleTree, }, - traits::{Empty, FromField, Hash}, + traits::{Empty, FromField, Hash, ToField}, utils::{ arrays::{array_concat, get_sorted_tuple::get_sorted_tuple}, field::{field_from_bytes, full_field_less_than}, @@ -311,6 +331,8 @@ mod tests { // Index of the low leaf for the leaf that contains the fee payer's Fee Juice balance. // Used for building the public data hint read for the payment update request. fee_payer_balance_leaf_index: u32, + + contract_class_logs_preimages: BoundedVec, } impl PrivateBaseRollupInputsBuilder { @@ -366,6 +388,7 @@ mod tests { constants, fee_payer, fee_payer_balance_leaf_index, + contract_class_logs_preimages: BoundedVec::new(), } } @@ -501,6 +524,19 @@ mod tests { ) } + // Exists separately to allow us to append correct log preimages and hashes + unconstrained fn append_contract_class_log(&mut self, log_fields: [Field; N]) { + let padded_log_fields: [Field; CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS] = + array_concat(log_fields, [0; CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS - N]); + let log = ContractClassLog { + contract_address: self.tube_data.contract_address, + log: Log { fields: padded_log_fields }, + }; + self.contract_class_logs_preimages.push(log); + let log_hash = poseidon2_hash_subarray_variable(padded_log_fields, N); + self.tube_data.add_contract_class_log_hash(log_hash, N); + } + unconstrained fn build_inputs(mut self) -> PrivateBaseRollupInputs { let mut tube_data = self.tube_data.to_private_tube_data(); @@ -593,6 +629,7 @@ mod tests { let start_sponge_blob = append_tx_effects_for_blob( pre_existing_tx_effects, SpongeBlob::new(TX_EFFECTS_BLOB_HASH_INPUT_FIELDS), + [0; MAX_CONTRACT_CLASS_LOGS_PER_TX], ); let state_diff_hints = PrivateBaseStateDiffHints { @@ -618,6 +655,7 @@ mod tests { }, constants: self.constants, fee_payer_fee_juice_balance_read_hint, + contract_class_logs_preimages: self.contract_class_logs_preimages.storage(), } } @@ -825,8 +863,6 @@ mod tests { let inputs = builder.build_inputs(); let outputs = inputs.execute(); let mut tx_effects = [0; 57]; - // TODO(#8954): This test uses 50 notes and 5 extra absorbed fields - // This may change when logs are deconstructed // Initial field = TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code // The first 3 are: // - i=0 init field @@ -907,7 +943,8 @@ mod tests { builder.tube_data.append_l2_to_l1_msgs(NUM_MSGS); builder.tube_data.append_private_logs(NUM_PRIV_EVENT_LOGS); // Below will only work with NUM_CC_LOGS=1 - builder.tube_data.add_contract_class_log_hash(1, 2); + let cc_log = [1, 2, 3]; + builder.append_contract_class_log(cc_log); let inputs = builder.build_inputs(); let outputs = inputs.execute(); @@ -970,16 +1007,28 @@ mod tests { } offset += total_private_logs_len; // cc logs + let total_contract_class_logs_len = NUM_CC_LOGS * (cc_log.len() + 2); let contract_class_logs_prefix = - encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, NUM_CC_LOGS); + encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, total_contract_class_logs_len); reconstructed_tx_effects[offset] = contract_class_logs_prefix; offset += 1; for i in 0..NUM_CC_LOGS { - reconstructed_tx_effects[offset + i] = types::hash::silo_contract_class_log_hash( - builder.tube_data.contract_class_logs_hashes.storage()[i], - ); + let siloed_log = + silo_contract_class_log(builder.contract_class_logs_preimages.storage()[i]); + let log_len = builder.tube_data.contract_class_logs_hashes.storage()[i].log_hash.length; + if log_len != 0 { + reconstructed_tx_effects[offset] = log_len as Field; + offset += 1; + reconstructed_tx_effects[offset] = builder.tube_data.contract_address.to_field(); + offset += 1; + } + for j in 0..CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS { + if j < log_len { + reconstructed_tx_effects[offset] = siloed_log.log.fields[j]; + offset += 1; + } + } } - offset += NUM_CC_LOGS; // Initial field = TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code // revert code = 0 diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr index 69968ee58a7f..26b6a8e7332f 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr @@ -11,15 +11,18 @@ use crate::{ }; use dep::types::{ abis::{ - avm_circuit_public_inputs::AvmProofData, combined_constant_data::CombinedConstantData, - constant_rollup_data::ConstantRollupData, log_hash::ScopedLogHash, sponge_blob::SpongeBlob, + avm_circuit_public_inputs::AvmProofData, + combined_constant_data::CombinedConstantData, + constant_rollup_data::ConstantRollupData, + contract_class_log::{ContractClassLog, validate_and_silo_contract_class_log}, + sponge_blob::SpongeBlob, tube::PublicTubeData, }, - constants::ARCHIVE_HEIGHT, + constants::{ARCHIVE_HEIGHT, MAX_CONTRACT_CLASS_LOGS_PER_TX}, hash::silo_l2_to_l1_message, merkle_tree::MembershipWitness, messaging::l2_to_l1_message::ScopedL2ToL1Message, - traits::Hash, + traits::{Empty, Hash}, utils::arrays::array_merge, }; @@ -30,6 +33,7 @@ pub struct PublicBaseRollupInputs { start_sponge_blob: SpongeBlob, archive_root_membership_witness: MembershipWitness, + contract_class_logs_preimages: [ContractClassLog; MAX_CONTRACT_CLASS_LOGS_PER_TX], constants: ConstantRollupData, } @@ -38,7 +42,7 @@ impl PublicBaseRollupInputs { self, reverted: bool, combined_constant_data: CombinedConstantData, - ) -> TxEffect { + ) -> (TxEffect, [u32; MAX_CONTRACT_CLASS_LOGS_PER_TX]) { let from_private = self.tube_data.public_inputs; let from_public = self.avm_proof_data.public_inputs; let revert_code = if reverted { 1 } else { 0 }; @@ -66,22 +70,31 @@ impl PublicBaseRollupInputs { from_private.revertible_accumulated_data.contract_class_logs_hashes, ) }; - let contract_class_log_preimages_length = - contract_class_logs_hashes.fold(0, |len, l: ScopedLogHash| len + l.log_hash.length); - - TxEffect { - tx_hash: self.tube_data.public_inputs.hash(), - revert_code, - transaction_fee: from_public.transaction_fee, - note_hashes: from_public.accumulated_data.note_hashes, - nullifiers: from_public.accumulated_data.nullifiers, - l2_to_l1_msgs: siloed_l2_to_l1_msgs, - public_data_writes: from_public.accumulated_data.public_data_writes, - private_logs, - public_logs: from_public.accumulated_data.public_logs, - contract_class_log_preimages_length, - contract_class_logs_hashes, + let mut siloed_contract_class_logs = + [ContractClassLog::empty(); MAX_CONTRACT_CLASS_LOGS_PER_TX]; + for i in 0..MAX_CONTRACT_CLASS_LOGS_PER_TX { + siloed_contract_class_logs[i] = validate_and_silo_contract_class_log( + self.contract_class_logs_preimages[i], + contract_class_logs_hashes[i], + ); } + // These lengths have been constrained in validate_and_silo_contract_class_log to be correct. + let contract_class_logs_lengths = contract_class_logs_hashes.map(|l| l.log_hash.length); + + ( + TxEffect { + tx_hash: self.tube_data.public_inputs.hash(), + revert_code, + transaction_fee: from_public.transaction_fee, + note_hashes: from_public.accumulated_data.note_hashes, + nullifiers: from_public.accumulated_data.nullifiers, + l2_to_l1_msgs: siloed_l2_to_l1_msgs, + public_data_writes: from_public.accumulated_data.public_data_writes, + private_logs, + public_logs: from_public.accumulated_data.public_logs, + contract_class_logs: siloed_contract_class_logs, + }, contract_class_logs_lengths, + ) } pub fn execute(self) -> BaseOrMergeRollupPublicInputs { @@ -120,12 +133,16 @@ impl PublicBaseRollupInputs { ); } - let tx_effect = self.generate_tx_effect(reverted, combined_constant_data); - // Append the tx effects for blob(s) + let (tx_effect, contract_class_logs_lengths) = + self.generate_tx_effect(reverted, combined_constant_data); let out_hash = compute_kernel_out_hash(tx_effect.l2_to_l1_msgs); - let end_sponge_blob = append_tx_effects_for_blob(tx_effect, self.start_sponge_blob); + let end_sponge_blob = append_tx_effects_for_blob( + tx_effect, + self.start_sponge_blob, + contract_class_logs_lengths, + ); // Perform membership checks that the notes provided exist within the historical trees data perform_archive_membership_check( @@ -165,13 +182,15 @@ mod tests { use dep::types::{ abis::{ append_only_tree_snapshot::AppendOnlyTreeSnapshot, - constant_rollup_data::ConstantRollupData, - nullifier_leaf_preimage::NullifierLeafPreimage, public_data_write::PublicDataWrite, - side_effect::OrderedValue, sponge_blob::SpongeBlob, tree_snapshots::TreeSnapshots, + constant_rollup_data::ConstantRollupData, contract_class_log::ContractClassLog, + log::Log, nullifier_leaf_preimage::NullifierLeafPreimage, + public_data_write::PublicDataWrite, side_effect::OrderedValue, sponge_blob::SpongeBlob, + tree_snapshots::TreeSnapshots, }, address::EthAddress, constants::{ - ARCHIVE_HEIGHT, AVM_VK_INDEX, CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, + ARCHIVE_HEIGHT, AVM_VK_INDEX, CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, + CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTES_PREFIX, NULLIFIERS_PREFIX, PRIVATE_LOG_SIZE_IN_FIELDS, PRIVATE_LOGS_PREFIX, PUBLIC_DATA_UPDATE_REQUESTS_PREFIX, @@ -179,7 +198,7 @@ mod tests { TX_FEE_PREFIX, TX_START_PREFIX, }, data::{PublicDataTreeLeaf, PublicDataTreeLeafPreimage}, - hash::silo_l2_to_l1_message, + hash::{poseidon2_hash_subarray_variable, silo_contract_class_log, silo_l2_to_l1_message}, merkle_tree::MembershipWitness, messaging::l2_to_l1_message::ScopedL2ToL1Message, tests::{ @@ -187,7 +206,7 @@ mod tests { fixtures::{self, merkle_tree::generate_full_sha_tree}, merkle_tree_utils::NonEmptyMerkleTree, }, - traits::{Empty, Hash, Serialize}, + traits::{Empty, Hash, Serialize, ToField}, utils::{arrays::array_concat, field::field_from_bytes}, }; @@ -212,6 +231,7 @@ mod tests { public_data_writes: BoundedVec<(u32, PublicDataTreeLeaf), MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX>, nullifiers: BoundedVec, constants: ConstantRollupData, + contract_class_logs_preimages: BoundedVec, } impl PublicBaseRollupInputsBuilder { @@ -271,6 +291,19 @@ mod tests { sibling_path } + // Exists separately to allow us to append correct log preimages and hashes + unconstrained fn append_contract_class_log(&mut self, log_fields: [Field; N]) { + let padded_log_fields: [Field; CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS] = + array_concat(log_fields, [0; CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS - N]); + let log = ContractClassLog { + contract_address: self.tube_data.contract_address, + log: Log { fields: padded_log_fields }, + }; + self.contract_class_logs_preimages.push(log); + let log_hash = poseidon2_hash_subarray_variable(padded_log_fields, N); + self.tube_data.add_contract_class_log_hash(log_hash, N); + } + unconstrained fn build_inputs(mut self) -> PublicBaseRollupInputs { let mut tube_data = self.tube_data.to_public_tube_data(); let mut avm_proof_data = self.avm_data.to_avm_proof_data(self.reverted); @@ -310,6 +343,7 @@ mod tests { let start_sponge_blob = append_tx_effects_for_blob( tx_effect, SpongeBlob::new(TX_EFFECTS_BLOB_HASH_INPUT_FIELDS), + [0; MAX_CONTRACT_CLASS_LOGS_PER_TX], ); PublicBaseRollupInputs { @@ -321,6 +355,7 @@ mod tests { sibling_path: start_archive.get_sibling_path(0), }, constants: self.constants, + contract_class_logs_preimages: self.contract_class_logs_preimages.storage(), } } @@ -356,6 +391,7 @@ mod tests { public_data_writes: BoundedVec::new(), nullifiers: BoundedVec::new(), constants: ConstantRollupData::empty(), + contract_class_logs_preimages: BoundedVec::new(), } } } @@ -374,8 +410,6 @@ mod tests { let inputs = builder.build_inputs(); let outputs = inputs.execute(); let mut tx_effects = [0; 54]; - // TODO(#8954): This test uses 50 notes and 4 extra absorbed fields - // This may change when logs are deconstructed // Initial field = TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code // The first 4 are: i=0 init field, i=1: tx hash, i=2: tx fee, i=3: note prefix tx_effects[0] = field_from_bytes( @@ -409,6 +443,8 @@ mod tests { let NUM_PRIV_EVENT_LOGS = 4; let NUM_PUB_LOGS = 6; let NUM_CC_LOGS = 1; + // Below will only work with NUM_CC_LOGS=1 + let cc_log = [1, 2, 3]; let PUB_DATA_SLOT = 25; let PUB_DATA_VALUE = 60; let TOTAL_BLOB_FIELDS = 3 // revert code, tx hash and tx fee @@ -420,7 +456,7 @@ mod tests { + 1 // L2 to L1 msgs and prefix + NUM_PUB_LOGS * PUBLIC_LOG_SIZE_IN_FIELDS + 1 // public logs and prefix - + NUM_CC_LOGS + + NUM_CC_LOGS * (cc_log.len() + 2) + 1 // contract class logs and prefix + 2 + 1 // single public data update (2 fields) and prefix @@ -450,7 +486,7 @@ mod tests { builder.tube_data.append_private_logs(NUM_PRIV_EVENT_LOGS); builder.avm_data.append_public_logs(NUM_PUB_LOGS); // Below will only work with NUM_CC_LOGS=1 - builder.tube_data.add_contract_class_log_hash(1, 2); + builder.append_contract_class_log(cc_log); let inputs = builder.build_inputs(); let outputs = inputs.execute(); @@ -543,16 +579,28 @@ mod tests { } offset += NUM_PUB_LOGS * PUBLIC_LOG_SIZE_IN_FIELDS; // cc logs + let total_contract_class_logs_len = NUM_CC_LOGS * (cc_log.len() + 2); let contract_class_logs_prefix = - encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, NUM_CC_LOGS); + encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, total_contract_class_logs_len); reconstructed_tx_effects[offset] = contract_class_logs_prefix; offset += 1; for i in 0..NUM_CC_LOGS { - reconstructed_tx_effects[offset + i] = types::hash::silo_contract_class_log_hash( - builder.tube_data.contract_class_logs_hashes.storage()[i], - ); + let siloed_log = + silo_contract_class_log(builder.contract_class_logs_preimages.storage()[i]); + let log_len = builder.tube_data.contract_class_logs_hashes.storage()[i].log_hash.length; + if log_len != 0 { + reconstructed_tx_effects[offset] = log_len as Field; + offset += 1; + reconstructed_tx_effects[offset] = builder.tube_data.contract_address.to_field(); + offset += 1; + } + for j in 0..CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS { + if j < log_len { + reconstructed_tx_effects[offset] = siloed_log.log.fields[j]; + offset += 1; + } + } } - offset += NUM_CC_LOGS; // Sanity check assert(offset == TOTAL_BLOB_FIELDS); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr index 2bd31612fa10..503c640cce13 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr @@ -5,11 +5,12 @@ use crate::abis::{ use super::abis::tx_effect::TxEffect; use dep::types::{ abis::{ - log_hash::ScopedLogHash, private_log::PrivateLog, public_data_write::PublicDataWrite, - public_log::PublicLog, sponge_blob::SpongeBlob, + contract_class_log::ContractClassLog, private_log::PrivateLog, + public_data_write::PublicDataWrite, public_log::PublicLog, sponge_blob::SpongeBlob, }, constants::{ - AZTEC_MAX_EPOCH_DURATION, CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, + AZTEC_MAX_EPOCH_DURATION, CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, + CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, MAX_PUBLIC_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTES_PREFIX, NULLIFIERS_PREFIX, @@ -17,9 +18,9 @@ use dep::types::{ PUBLIC_LOG_SIZE_IN_FIELDS, PUBLIC_LOGS_PREFIX, REVERT_CODE_PREFIX, TX_FEE_PREFIX, TX_START_PREFIX, }, - hash::{accumulate_sha256, silo_contract_class_log_hash}, + hash::accumulate_sha256, merkle_tree::VariableMerkleTree, - traits::{Empty, Serialize}, + traits::{Empty, Serialize, ToField}, utils::arrays::{array_length, array_merge}, }; use blob::blob_public_inputs::BlockBlobPublicInputs; @@ -149,10 +150,9 @@ pub fn encode_blob_prefix(input_type: u8, array_len: u32) -> Field { // MAX_NULLIFIERS_PER_TX fields for nullifiers // MAX_L2_TO_L1_MSGS_PER_TX for L2 to L1 messages // MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX public data update requests -> MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2 fields -// TODO(#8954): When logs are refactored into fields, we will append the values here, for now appending the log hashes: // MAX_PRIVATE_LOGS_PER_TX * PRIVATE_LOG_SIZE_IN_FIELDS fields for private logs // MAX_PUBLIC_LOGS_PER_TX * PUBLIC_LOG_SIZE_IN_FIELDS fields for public logs -// MAX_CONTRACT_CLASS_LOGS_PER_TX fields for contract class logs +// MAX_CONTRACT_CLASS_LOGS_PER_TX * (CONTRACT_CLASS_LOG_SIZE_IN_FIELDS + 1) fields for contract class logs (+1 for log_len) // 7 fields for prefixes for each of the above categories pub(crate) global TX_EFFECTS_BLOB_HASH_INPUT_FIELDS: u32 = 1 + 1 @@ -163,14 +163,16 @@ pub(crate) global TX_EFFECTS_BLOB_HASH_INPUT_FIELDS: u32 = 1 + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2 + MAX_PRIVATE_LOGS_PER_TX * PRIVATE_LOG_SIZE_IN_FIELDS + MAX_PUBLIC_LOGS_PER_TX * PUBLIC_LOG_SIZE_IN_FIELDS - + MAX_CONTRACT_CLASS_LOGS_PER_TX + + MAX_CONTRACT_CLASS_LOGS_PER_TX * (CONTRACT_CLASS_LOG_SIZE_IN_FIELDS + 1) + 7; pub(crate) fn append_tx_effects_for_blob( tx_effect: TxEffect, start_sponge_blob: SpongeBlob, + contract_class_logs_lengths: [u32; MAX_CONTRACT_CLASS_LOGS_PER_TX], ) -> SpongeBlob { - let (mut tx_effects_hash_input, offset) = get_tx_effects_hash_input(tx_effect); + let (mut tx_effects_hash_input, offset) = + get_tx_effects_hash_input(tx_effect, contract_class_logs_lengths); // NB: using start.absorb & returning start caused issues in ghost values appearing in // base_rollup_inputs.start when using a fresh sponge. These only appeared when simulating via wasm. @@ -187,6 +189,7 @@ pub(crate) fn append_tx_effects_for_blob( fn get_tx_effects_hash_input( tx_effect: TxEffect, + contract_class_logs_lengths: [u32; MAX_CONTRACT_CLASS_LOGS_PER_TX], ) -> ([Field; TX_EFFECTS_BLOB_HASH_INPUT_FIELDS], u32) { tx_effect.transaction_fee.assert_max_bit_size::<29 * 8>(); let TWO_POW_240 = 1766847064778384329583297500742918515827483896875618958121606201292619776; @@ -200,9 +203,7 @@ fn get_tx_effects_hash_input( let public_data_update_requests = tx_effect.public_data_writes; let private_logs = tx_effect.private_logs; let public_logs = tx_effect.public_logs; - let contract_class_logs = tx_effect.contract_class_logs_hashes.map(|log: ScopedLogHash| { - silo_contract_class_log_hash(log) - }); + let contract_class_logs = tx_effect.contract_class_logs; // Safety: This constructs the array of effects and is constrained below. let mut tx_effects_hash_input = unsafe { @@ -216,6 +217,7 @@ fn get_tx_effects_hash_input( private_logs, public_logs, contract_class_logs, + contract_class_logs_lengths, tx_effect.revert_code as Field, ) }; @@ -356,23 +358,47 @@ fn get_tx_effects_hash_input( offset += array_len; } - // TODO(#8954): When logs are refactored into fields, we will append the values here - // Currently appending the single log hash as an interim solution // CONTRACT CLASS LOGS - array_len = array_length(contract_class_logs); + // Note: we can use contract_class_logs_lengths here as they are constrained to be zero if + // the log is empty, and the logs are constrained to be sorted L to R. + // This is cheaper because array_length uses is_empty, which is expensive for the logs. + array_len = array_length(contract_class_logs_lengths); if array_len != 0 { let mut check_elt = true; - let contract_class_logs_prefix = encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, array_len); - assert_eq(tx_effects_hash_input[offset], contract_class_logs_prefix); + let prefix_index = offset; + let mut total_cc_log_len = 0; + offset += 1; for j in 0..MAX_CONTRACT_CLASS_LOGS_PER_TX { - check_elt &= j != array_len; - if check_elt { - assert_eq(tx_effects_hash_input[offset + j], contract_class_logs[j]); + // These lengths have been constrained to be correct. + let log_len = contract_class_logs_lengths[j]; + if log_len != 0 { + assert_eq(tx_effects_hash_input[offset], log_len as Field); + offset += 1; + assert_eq( + tx_effects_hash_input[offset], + contract_class_logs[j].contract_address.to_field(), + ); + offset += 1; + // plus one for prefix, one for address + total_cc_log_len += log_len + 2; + check_elt = true; + } + for k in 0..CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS { + check_elt &= k != log_len; + if check_elt { + assert_eq( + tx_effects_hash_input[offset + k], + contract_class_logs[j].log.fields[k], + ); + } } + offset += log_len; } - offset += array_len; + let contract_class_logs_prefix = + encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, total_cc_log_len); + assert_eq(tx_effects_hash_input[prefix_index], contract_class_logs_prefix); } // Now we know the number of fields appended, we can assign the first value: @@ -403,7 +429,8 @@ unconstrained fn get_tx_effects_hash_input_helper( public_data_update_requests: [PublicDataWrite; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], private_logs: [PrivateLog; MAX_PRIVATE_LOGS_PER_TX], public_logs: [PublicLog; MAX_PUBLIC_LOGS_PER_TX], - contract_class_logs: [Field; MAX_CONTRACT_CLASS_LOGS_PER_TX], + contract_class_logs: [ContractClassLog; MAX_CONTRACT_CLASS_LOGS_PER_TX], + contract_class_logs_lengths: [u32; MAX_CONTRACT_CLASS_LOGS_PER_TX], revert_code: Field, ) -> [Field; TX_EFFECTS_BLOB_HASH_INPUT_FIELDS] { let mut tx_effects_hash_input = [0; TX_EFFECTS_BLOB_HASH_INPUT_FIELDS]; @@ -510,19 +537,32 @@ unconstrained fn get_tx_effects_hash_input_helper( offset += array_len; } - // TODO(#8954): When logs are refactored into fields, we will append the values here - // Currently appending the single log hash as an interim solution // CONTRACT CLASS LOGS - let array_len = array_length(contract_class_logs); - if array_len != 0 { - let contract_class_logs_prefix = encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, array_len); - tx_effects_hash_input[offset] = contract_class_logs_prefix; + let num_cc_logs = array_length(contract_class_logs_lengths); + if num_cc_logs != 0 { + let prefix_index = offset; + let mut total_cc_log_len = 0; + offset += 1; - for j in 0..array_len { - tx_effects_hash_input[offset + j] = contract_class_logs[j]; + for j in 0..num_cc_logs { + let log_len = contract_class_logs_lengths[j]; + // prefix this log with its field length + tx_effects_hash_input[offset] = log_len as Field; + offset += 1; + // add its address (not using a .serialise here because it would involve expensive .concat) + tx_effects_hash_input[offset] = contract_class_logs[j].contract_address.to_field(); + offset += 1; + for k in 0..log_len { + tx_effects_hash_input[offset] = contract_class_logs[j].log.fields[k]; + offset += 1; + } + // plus one for prefix, one for address + total_cc_log_len += log_len + 2; } - offset += array_len; + let contract_class_logs_prefix = + encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, total_cc_log_len); + tx_effects_hash_input[prefix_index] = contract_class_logs_prefix; } // Now we know the number of fields appended, we can assign the first value: diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_to_rollup_accumulated_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_to_rollup_accumulated_data.nr index 1d34dab228a7..f237cde86b50 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_to_rollup_accumulated_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/accumulated_data/private_to_rollup_accumulated_data.nr @@ -16,10 +16,6 @@ pub struct PrivateToRollupAccumulatedData { pub private_logs: [PrivateLog; MAX_PRIVATE_LOGS_PER_TX], pub contract_class_logs_hashes: [ScopedLogHash; MAX_CONTRACT_CLASS_LOGS_PER_TX], - - // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the - // variable-length data. - pub contract_class_log_preimages_length: Field, } impl Empty for PrivateToRollupAccumulatedData { @@ -30,7 +26,6 @@ impl Empty for PrivateToRollupAccumulatedData { l2_to_l1_msgs: [ScopedL2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_TX], private_logs: [PrivateLog::empty(); MAX_PRIVATE_LOGS_PER_TX], contract_class_logs_hashes: [ScopedLogHash::empty(); MAX_CONTRACT_CLASS_LOGS_PER_TX], - contract_class_log_preimages_length: 0, } } } @@ -51,7 +46,6 @@ impl Serialize for PrivateToRollupAcc for i in 0..self.contract_class_logs_hashes.len() { fields.extend_from_array(self.contract_class_logs_hashes[i].serialize()); } - fields.push(self.contract_class_log_preimages_length); assert_eq(fields.len(), PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH); @@ -80,7 +74,6 @@ impl Deserialize for PrivateToRollupA ScopedLogHash::deserialize, [ScopedLogHash::empty(); MAX_CONTRACT_CLASS_LOGS_PER_TX], ), - contract_class_log_preimages_length: reader.read(), }; reader.finish(); item @@ -94,10 +87,6 @@ impl Eq for PrivateToRollupAccumulatedData { & (self.l2_to_l1_msgs == other.l2_to_l1_msgs) & (self.private_logs == other.private_logs) & (self.contract_class_logs_hashes == other.contract_class_logs_hashes) - & ( - self.contract_class_log_preimages_length - == other.contract_class_log_preimages_length - ) } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/contract_class_log.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/contract_class_log.nr new file mode 100644 index 000000000000..2f2acd9e6925 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/contract_class_log.nr @@ -0,0 +1,44 @@ +use crate::{ + abis::{log::Log, log_hash::ScopedLogHash}, + address::AztecAddress, + constants::CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, + hash::{poseidon2_hash_subarray_variable, silo_contract_class_log}, + traits::{Empty, is_empty}, + utils::arrays::validate_trailing_zeroes, +}; + +pub struct ContractClassLog { + pub log: Log, + pub contract_address: AztecAddress, +} + +impl Empty for ContractClassLog { + fn empty() -> Self { + ContractClassLog { log: Log::empty(), contract_address: AztecAddress::empty() } + } +} + +pub fn validate_and_silo_contract_class_log( + log: ContractClassLog, + log_hash: ScopedLogHash, +) -> ContractClassLog { + // Validate address + assert_eq( + log_hash.contract_address, + log.contract_address, + "mismatched contract class log address", + ); + // Validate length + let length = validate_trailing_zeroes(log.log.fields); + assert_eq(log_hash.log_hash.length, length, "mismatched contract class log length"); + // Validate hash + if length == 0 { + assert(is_empty(log_hash), "mismatched contract class log hash"); + } else { + let hashed_log = poseidon2_hash_subarray_variable(log.log.fields, length); + assert_eq(log_hash.log_hash.value, hashed_log, "mismatched contract class log hash"); + } + + // Silo log + silo_contract_class_log(log) +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/log_hash.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/log_hash.nr index 483bc3e39f94..2e03d167f90e 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/log_hash.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/log_hash.nr @@ -9,7 +9,7 @@ use crate::{ pub struct LogHash { pub value: Field, pub counter: u32, - pub length: Field, + pub length: u32, } impl Ordered for LogHash { @@ -40,13 +40,13 @@ impl Empty for LogHash { impl Serialize for LogHash { fn serialize(self) -> [Field; LOG_HASH_LENGTH] { - [self.value, self.counter as Field, self.length] + [self.value, self.counter as Field, self.length as Field] } } impl Deserialize for LogHash { fn deserialize(values: [Field; LOG_HASH_LENGTH]) -> Self { - Self { value: values[0], counter: values[1] as u32, length: values[2] } + Self { value: values[0], counter: values[1] as u32, length: values[2] as u32 } } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr index 8f2b3c321206..3ed14a990ae4 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr @@ -21,6 +21,7 @@ pub mod read_request; pub mod log; pub mod private_log; pub mod public_log; +pub mod contract_class_log; pub mod log_hash; pub mod note_hash; pub mod nullifier; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index 496bdbb2dcef..6493eda03c68 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -255,6 +255,10 @@ pub global PRIVATE_LOG_DATA_LENGTH: u32 = PRIVATE_LOG_SIZE_IN_FIELDS + 1 /* note_hash_counter */ + 1 /* counter */; pub global SCOPED_PRIVATE_LOG_DATA_LENGTH: u32 = PRIVATE_LOG_DATA_LENGTH + 1; +// TODO(MW): add new constant for this - the below is just the largest combination atm +pub global CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS: u32 = MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS + + REGISTERER_PRIVATE_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS; +pub global CONTRACT_CLASS_LOG_SIZE_IN_FIELDS: u32 = CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS + 1; // This includes the contract address, since it is always emitted with a contract class log pub global LOG_HASH_LENGTH: u32 = 3; pub global SCOPED_LOG_HASH_LENGTH: u32 = LOG_HASH_LENGTH + 1; pub global NOTE_HASH_LENGTH: u32 = 2; @@ -351,8 +355,7 @@ pub global PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH: u32 = MAX_NOTE_HASHES_PER_ + MAX_NULLIFIERS_PER_TX + (MAX_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH) + (PRIVATE_LOG_SIZE_IN_FIELDS * MAX_PRIVATE_LOGS_PER_TX) - + (SCOPED_LOG_HASH_LENGTH * MAX_CONTRACT_CLASS_LOGS_PER_TX) - + 1 /* contract_class_log_preimages_length */; + + (SCOPED_LOG_HASH_LENGTH * MAX_CONTRACT_CLASS_LOGS_PER_TX); pub global TX_CONSTANT_DATA_LENGTH: u32 = BLOCK_HEADER_LENGTH + TX_CONTEXT_LENGTH @@ -664,6 +667,7 @@ pub global L2_GAS_PER_L1_TO_L2_MSG_READ_REQUEST: u32 = pub global L2_GAS_PER_LOG_BYTE: u32 = 4; // Zero gas because we don't have to hash and validate the private logs pub global L2_GAS_PER_PRIVATE_LOG: u32 = 0; +pub global L2_GAS_PER_CONTRACT_CLASS_LOG: u32 = 0; // Gas for writing message to L1 portal pub global L2_GAS_PER_L2_TO_L1_MSG: u32 = 200; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr b/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr index eb3666a4e7bb..1503dbcbcb92 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr @@ -1,8 +1,8 @@ use crate::{ abis::{ contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage, + contract_class_log::ContractClassLog, function_selector::FunctionSelector, - log_hash::{LogHash, ScopedLogHash}, note_hash::ScopedNoteHash, nullifier::ScopedNullifier, private_log::{PrivateLog, PrivateLogData}, @@ -16,7 +16,7 @@ use crate::{ merkle_tree::root::root_from_sibling_path, messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message}, poseidon2::Poseidon2Sponge, - traits::{FromField, Hash, is_empty, ToField}, + traits::{FromField, Hash, ToField}, utils::field::field_from_bytes_32_trunc, }; use super::{constants::TWO_POW_64, utils::{arrays::array_concat, field::field_from_bytes}}; @@ -117,15 +117,23 @@ pub fn silo_private_log(private_log: Scoped) -> PrivateLog { } } -fn compute_siloed_contract_class_log_hash(address: AztecAddress, log_hash: Field) -> Field { - accumulate_sha256([address.to_field(), log_hash]) +fn compute_siloed_contract_class_log_field( + contract_address: AztecAddress, + first_field: Field, +) -> Field { + poseidon2_hash([contract_address.to_field(), first_field]) } -pub fn silo_contract_class_log_hash(log_hash: ScopedLogHash) -> Field { - if log_hash.contract_address.is_zero() { - 0 +pub fn silo_contract_class_log(contract_class_log: ContractClassLog) -> ContractClassLog { + if contract_class_log.contract_address.is_zero() { + contract_class_log } else { - compute_siloed_contract_class_log_hash(log_hash.contract_address, log_hash.value()) + let mut log = contract_class_log; + log.log.fields[0] = compute_siloed_contract_class_log_field( + contract_class_log.contract_address, + log.log.fields[0], + ); + log } } @@ -203,29 +211,6 @@ pub fn accumulate_sha256(input: [Field; 2]) -> Field { sha256_to_field(hash_input_flattened) } -// Computes the final logs hash for a tx. -pub fn compute_tx_logs_hash(logs: [LogHash; N]) -> Field { - // Convert each field element into a byte array and append the bytes to `hash_input_flattened` - let mut hash_input_flattened = [0; N * 32]; - for offset in 0..N { - // TODO: This is not checking that the decomposition is smaller than P - let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256); - for byte_index in 0..32 { - hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index]; - } - } - // Ideally we would push to a slice then hash, but there is no sha_slice - // Hardcode to 256 bytes for now - let mut hash = sha256_to_field(hash_input_flattened); - // Not having a 0 value hash for empty logs causes issues with empty txs - // used for padding. Returning early is currently unsupported. - // We always provide sorted logs here, so 0 being empty means all are empty. - if is_empty(logs[0]) { - hash = 0; - } - hash -} - pub fn verification_key_hash(key: [Field; N]) -> Field { crate::hash::poseidon2_hash(key) } @@ -258,6 +243,12 @@ pub fn poseidon2_hash_subarray(input: [Field; N], in_len: u32) -> Fi sponge.squeeze() } +#[no_predicates] +pub fn poseidon2_hash_subarray_variable(input: [Field; N], in_len: u32) -> Field { + let mut sponge = poseidon2_absorb_chunks(input, in_len, true); + sponge.squeeze() +} + // NB the below is the same as std::hash::poseidon2::Poseidon2::hash(), but replacing a range check with a bit check, // and absorbing in chunks of 3 below. #[no_predicates] diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr index 00615892a124..e5c06a6dc1f3 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr @@ -134,7 +134,6 @@ pub struct FixtureBuilder { pub private_logs: BoundedVec, MAX_PRIVATE_LOGS_PER_TX>, pub public_logs: BoundedVec, pub contract_class_logs_hashes: BoundedVec, - pub contract_class_log_preimages_length: Field, pub public_data_writes: BoundedVec, pub private_call_requests: BoundedVec, pub public_call_requests: BoundedVec, MAX_ENQUEUED_CALLS_PER_TX>, @@ -576,7 +575,6 @@ impl FixtureBuilder { contract_class_logs_hashes: self.contract_class_logs_hashes.storage().map( |l: ScopedLogHash| l.expose_to_public(), ), - contract_class_log_preimages_length: self.contract_class_log_preimages_length, } } @@ -1015,10 +1013,9 @@ impl FixtureBuilder { } } - pub fn add_contract_class_log_hash(&mut self, hash: Field, length: Field) { + pub fn add_contract_class_log_hash(&mut self, hash: Field, length: u32) { let log_hash = LogHash { value: hash, counter: self.next_counter(), length }; self.contract_class_logs_hashes.push(log_hash.scope(self.contract_address)); - self.contract_class_log_preimages_length += length; } pub fn add_private_call_request_for_private_call(&mut self, private_call: PrivateCallData) { @@ -1238,7 +1235,6 @@ impl Empty for FixtureBuilder { private_logs: BoundedVec::new(), public_logs: BoundedVec::new(), contract_class_logs_hashes: BoundedVec::new(), - contract_class_log_preimages_length: 0, public_data_writes: BoundedVec::new(), private_call_requests: BoundedVec::new(), public_call_requests: BoundedVec::new(), diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr index a75f18bc2993..032345e721b7 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr @@ -81,6 +81,25 @@ pub unconstrained fn find_index_hint( index } +// Helper function to find the index of the last element in an array that satisfies a given predicate, counting +// from the end of the array. If the element is not found, the function returns N as the index. +// Useful for finding trailing zeroes in arrays which may have valid empty values. +// e.g. removing trailing 0s from [1, 0, 2, 0, 0, 0] -> [1, 0, 2] +pub unconstrained fn find_index_hint_from_end( + array: [T; N], + find: fn[Env](T) -> bool, +) -> u32 { + let mut index = N; + for i in 0..N { + let j = N - i - 1; + // We check `index == N` to ensure that we only update the index if we haven't found a match yet. + if (index == N) & find(array[j]) { + index = j; + } + } + index +} + // Routine which validates that all zero values of an array form a contiguous region at the end, i.e., // of the form: [*,*,*...,0,0,0,0] where any * is non-zero. Note that a full array of non-zero values is // valid. @@ -101,6 +120,30 @@ where length } +// Routine which validates that zero values of an array form a contiguous region at the end, i.e., +// of the form: [*,*,*...,0,0,0,0] where * is any value (zeroes allowed). +pub fn validate_trailing_zeroes(array: [T; N]) -> u32 +where + T: Empty + Eq, +{ + // Safety: this value is constrained in the below loop. + let index = unsafe { find_index_hint_from_end(array, |elem: T| !is_empty(elem)) }; + let length = if index == N { 0 } else { index + 1 }; + // Check the elt just before length is non-zero: + if length != 0 { + assert(!is_empty(array[length - 1]), "invalid array"); + } + // Check all beyond length are zero: + let mut check_zero = false; + for i in 0..N { + check_zero |= i == length; + if check_zero { + assert(is_empty(array[i]), "invalid array"); + } + } + length +} + // Helper function to count the number of non-empty elements in a validated array. // Important: Only use it for validated arrays where validate_array(array) returns true, // which ensures that: @@ -230,6 +273,30 @@ fn smoke_validate_array() { assert(validate_array(valid_array) == 3); } +#[test] +fn smoke_validate_array_trailing() { + let valid_array: [Field; 0] = []; + assert(validate_trailing_zeroes(valid_array) == 0); + + let valid_array = [0]; + assert(validate_trailing_zeroes(valid_array) == 0); + + let valid_array = [3]; + assert(validate_trailing_zeroes(valid_array) == 1); + + let valid_array = [1, 0, 3]; + assert(validate_trailing_zeroes(valid_array) == 3); + + let valid_array = [1, 0, 3, 0]; + assert(validate_trailing_zeroes(valid_array) == 3); + + let valid_array = [1, 2, 3, 0, 0]; + assert(validate_trailing_zeroes(valid_array) == 3); + + let valid_array = [0, 0, 3, 0, 0]; + assert(validate_trailing_zeroes(valid_array) == 3); +} + #[test(should_fail_with = "invalid array")] fn smoke_validate_array_invalid_case0() { let invalid_array = [0, 1]; diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index 3794d0a727c2..957bc6c3f64a 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -564,19 +564,13 @@ describe('Archiver', () => { */ async function makeRollupTx(l2Block: L2Block) { const header = toHex(l2Block.header.toBuffer()); - const body = toHex(l2Block.body.toBuffer()); const blobInput = Blob.getEthBlobEvaluationInputs(await Blob.getBlobs(l2Block.body.toBlobFields())); const archive = toHex(l2Block.archive.root.toBuffer()); const blockHash = toHex((await l2Block.header.hash()).toBuffer()); const rollupInput = encodeFunctionData({ abi: RollupAbi, functionName: 'propose', - args: [ - { header, archive, blockHash, oracleInput: { feeAssetPriceModifier: 0n }, txHashes: [] }, - [], - body, - blobInput, - ], + args: [{ header, archive, blockHash, oracleInput: { feeAssetPriceModifier: 0n }, txHashes: [] }, [], blobInput], }); const forwarderInput = encodeFunctionData({ diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index 1515136b2f6f..35575543a723 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -39,7 +39,7 @@ import { } from '@aztec/stdlib/epoch-helpers'; import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client'; import type { L2LogsSource } from '@aztec/stdlib/interfaces/server'; -import { type LogFilter, type PrivateLog, type PublicLog, TxScopedL2Log, UnencryptedL2Log } from '@aztec/stdlib/logs'; +import { ContractClassLog, type LogFilter, type PrivateLog, type PublicLog, TxScopedL2Log } from '@aztec/stdlib/logs'; import type { InboxLeaf, L1ToL2MessageSource } from '@aztec/stdlib/messaging'; import { type BlockHeader, TxEffect, TxHash, TxReceipt } from '@aztec/stdlib/tx'; import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; @@ -896,10 +896,10 @@ class ArchiverStoreHelper * Extracts and stores contract classes out of ContractClassRegistered events emitted by the class registerer contract. * @param allLogs - All logs emitted in a bunch of blocks. */ - async #updateRegisteredContractClasses(allLogs: UnencryptedL2Log[], blockNum: number, operation: Operation) { + async #updateRegisteredContractClasses(allLogs: ContractClassLog[], blockNum: number, operation: Operation) { const contractClassRegisteredEvents = allLogs - .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)) - .map(log => ContractClassRegisteredEvent.fromLog(log.data)); + .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)) + .map(log => ContractClassRegisteredEvent.fromLog(log)); const contractClasses = await Promise.all(contractClassRegisteredEvents.map(e => e.toContractClassPublic())); if (contractClasses.length > 0) { @@ -972,14 +972,14 @@ class ArchiverStoreHelper * @param _blockNum - The block number * @returns */ - async #storeBroadcastedIndividualFunctions(allLogs: UnencryptedL2Log[], _blockNum: number) { + async #storeBroadcastedIndividualFunctions(allLogs: ContractClassLog[], _blockNum: number) { // Filter out private and unconstrained function broadcast events const privateFnEvents = allLogs - .filter(log => PrivateFunctionBroadcastedEvent.isPrivateFunctionBroadcastedEvent(log.data)) - .map(log => PrivateFunctionBroadcastedEvent.fromLog(log.data)); + .filter(log => PrivateFunctionBroadcastedEvent.isPrivateFunctionBroadcastedEvent(log)) + .map(log => PrivateFunctionBroadcastedEvent.fromLog(log)); const unconstrainedFnEvents = allLogs - .filter(log => UnconstrainedFunctionBroadcastedEvent.isUnconstrainedFunctionBroadcastedEvent(log.data)) - .map(log => UnconstrainedFunctionBroadcastedEvent.fromLog(log.data)); + .filter(log => UnconstrainedFunctionBroadcastedEvent.isUnconstrainedFunctionBroadcastedEvent(log)) + .map(log => UnconstrainedFunctionBroadcastedEvent.fromLog(log)); // Group all events by contract class id for (const [classIdString, classEvents] of Object.entries( @@ -1031,9 +1031,7 @@ class ArchiverStoreHelper this.store.addLogs(blocks.map(block => block.data)), // Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them ...blocks.map(async block => { - const contractClassLogs = block.data.body.txEffects - .flatMap(txEffect => (txEffect ? [txEffect.contractClassLogs] : [])) - .flatMap(txLog => txLog.unrollLogs()); + const contractClassLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.contractClassLogs); // ContractInstanceDeployed event logs are broadcast in privateLogs. const privateLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.privateLogs); const publicLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.publicLogs); @@ -1065,10 +1063,7 @@ class ArchiverStoreHelper const opResults = await Promise.all([ // Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them ...blocks.map(async block => { - const contractClassLogs = block.data.body.txEffects - .flatMap(txEffect => (txEffect ? [txEffect.contractClassLogs] : [])) - .flatMap(txLog => txLog.unrollLogs()); - + const contractClassLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.contractClassLogs); // ContractInstanceDeployed event logs are broadcast in privateLogs. const privateLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.privateLogs); const publicLogs = block.data.body.txEffects.flatMap(txEffect => txEffect.publicLogs); diff --git a/yarn-project/archiver/src/archiver/data_retrieval.ts b/yarn-project/archiver/src/archiver/data_retrieval.ts index ef01234607b4..291f955f41a4 100644 --- a/yarn-project/archiver/src/archiver/data_retrieval.ts +++ b/yarn-project/archiver/src/archiver/data_retrieval.ts @@ -220,8 +220,7 @@ async function getBlockFromRollupTx( throw new Error(`Unexpected rollup method called ${rollupFunctionName}`); } - // TODO(#9101): 'bodyHex' will be removed from below - const [decodedArgs, , bodyHex, blobInputs] = rollupArgs! as readonly [ + const [decodedArgs, , blobInputs] = rollupArgs! as readonly [ { header: Hex; archive: Hex; @@ -233,7 +232,6 @@ async function getBlockFromRollupTx( }, ViemSignature[], Hex, - Hex, ]; const header = BlockHeader.fromBuffer(Buffer.from(hexToBytes(decodedArgs.header))); @@ -242,8 +240,6 @@ async function getBlockFromRollupTx( throw new NoBlobBodiesFoundError(Number(l2BlockNum)); } - // TODO(#9101): Once calldata is removed, we can remove this field encoding and update - // Body.fromBlobFields to accept blob buffers directly let blockFields: Fr[]; try { blockFields = Blob.toEncodedFields(blobBodies); @@ -256,22 +252,10 @@ async function getBlockFromRollupTx( throw err; } - // TODO(#9101): Retreiving the block body from calldata is a temporary soln before we have - // either a beacon chain client or link to some blob store. Web2 is ok because we will - // verify the block body vs the blob as below. - const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex))); - - // TODO(#9101): The below reconstruction is currently redundant, but once we extract blobs will be the way to construct blocks. - // The blob source will give us blockFields, and we must construct the body from them: - // TODO(#8954): When logs are refactored into fields, we won't need to inject them here. - const reconstructedBlock = Body.fromBlobFields(blockFields, blockBody.contractClassLogs); - - if (!reconstructedBlock.toBuffer().equals(blockBody.toBuffer())) { - // TODO(#9101): Remove below check (without calldata there will be nothing to check against) - throw new Error(`Block reconstructed from blob fields does not match`); - } + // The blob source gives us blockFields, and we must construct the body from them: + const blockBody = Body.fromBlobFields(blockFields); - // TODO(#9101): Once we stop publishing calldata, we will still need the blobCheck below to ensure that the block we are building does correspond to the blob fields + // TODO: Will this ever throw now that we do not get blocks from calldata at all? const blobCheck = await Blob.getBlobs(blockFields); if (Blob.getEthBlobEvaluationInputs(blobCheck) !== blobInputs) { // NB: We can just check the blobhash here, which is the first 32 bytes of blobInputs diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts index c3cb665c663a..3fab13064d3c 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts @@ -6,15 +6,14 @@ import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store'; import type { L2Block } from '@aztec/stdlib/block'; import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client'; import { - ContractClass2BlockL2Logs, + ContractClassLog, + ExtendedContractClassLog, ExtendedPublicLog, - ExtendedUnencryptedL2Log, type LogFilter, LogId, PrivateLog, PublicLog, TxScopedL2Log, - UnencryptedL2Log, } from '@aztec/stdlib/logs'; import type { BlockStore } from './block_store.js'; @@ -170,8 +169,18 @@ export class LogStore { ) .flat(); + const contractClassLogsInBlock = block.body.txEffects + .map((txEffect, txIndex) => + [ + numToUInt32BE(txIndex), + numToUInt32BE(txEffect.contractClassLogs.length), + txEffect.contractClassLogs.map(log => log.toBuffer()), + ].flat(), + ) + .flat(); + await this.#publicLogsByBlock.set(block.number, Buffer.concat(publicLogsInBlock)); - await this.#contractClassLogsByBlock.set(block.number, block.body.contractClassLogs.toBuffer()); + await this.#contractClassLogsByBlock.set(block.number, Buffer.concat(contractClassLogsInBlock)); } return true; @@ -342,13 +351,22 @@ export class LogStore { if (typeof blockNumber !== 'number' || typeof txIndex !== 'number') { return { logs: [], maxLogsHit: false }; } - const contractClassLogsBuffer = await this.#contractClassLogsByBlock.getAsync(blockNumber); - const contractClassLogsInBlock = contractClassLogsBuffer - ? ContractClass2BlockL2Logs.fromBuffer(contractClassLogsBuffer) - : new ContractClass2BlockL2Logs([]); - const txLogs = contractClassLogsInBlock.txLogs[txIndex].unrollLogs(); + const contractClassLogsBuffer = (await this.#contractClassLogsByBlock.getAsync(blockNumber)) ?? Buffer.alloc(0); + const contractClassLogsInBlock: [ContractClassLog[]] = [[]]; + + const reader = new BufferReader(contractClassLogsBuffer); + while (reader.remainingBytes() > 0) { + const indexOfTx = reader.readNumber(); + const numLogsInTx = reader.readNumber(); + contractClassLogsInBlock[indexOfTx] = []; + for (let i = 0; i < numLogsInTx; i++) { + contractClassLogsInBlock[indexOfTx].push(reader.readObject(ContractClassLog)); + } + } - const logs: ExtendedUnencryptedL2Log[] = []; + const txLogs = contractClassLogsInBlock[txIndex]; + + const logs: ExtendedContractClassLog[] = []; const maxLogsHit = this.#accumulateLogs(logs, blockNumber, txIndex, txLogs, filter); return { logs, maxLogsHit }; @@ -366,16 +384,25 @@ export class LogStore { }; } - const logs: ExtendedUnencryptedL2Log[] = []; + const logs: ExtendedContractClassLog[] = []; let maxLogsHit = false; loopOverBlocks: for await (const [blockNumber, logBuffer] of this.#contractClassLogsByBlock.entriesAsync({ start, end, })) { - const contractClassLogsInBlock = ContractClass2BlockL2Logs.fromBuffer(logBuffer); - for (let txIndex = filter.afterLog?.txIndex ?? 0; txIndex < contractClassLogsInBlock.txLogs.length; txIndex++) { - const txLogs = contractClassLogsInBlock.txLogs[txIndex].unrollLogs(); + const contractClassLogsInBlock: [ContractClassLog[]] = [[]]; + const reader = new BufferReader(logBuffer); + while (reader.remainingBytes() > 0) { + const indexOfTx = reader.readNumber(); + const numLogsInTx = reader.readNumber(); + contractClassLogsInBlock[indexOfTx] = []; + for (let i = 0; i < numLogsInTx; i++) { + contractClassLogsInBlock[indexOfTx].push(reader.readObject(ContractClassLog)); + } + } + for (let txIndex = filter.afterLog?.txIndex ?? 0; txIndex < contractClassLogsInBlock.length; txIndex++) { + const txLogs = contractClassLogsInBlock[txIndex]; maxLogsHit = this.#accumulateLogs(logs, blockNumber, txIndex, txLogs, filter); if (maxLogsHit) { this.#log.debug(`Max logs hit at block ${blockNumber}`); @@ -388,10 +415,10 @@ export class LogStore { } #accumulateLogs( - results: (ExtendedUnencryptedL2Log | ExtendedPublicLog)[], + results: (ExtendedContractClassLog | ExtendedPublicLog)[], blockNumber: number, txIndex: number, - txLogs: (UnencryptedL2Log | PublicLog)[], + txLogs: (ContractClassLog | PublicLog)[], filter: LogFilter, ): boolean { let maxLogsHit = false; @@ -399,8 +426,8 @@ export class LogStore { for (; logIndex < txLogs.length; logIndex++) { const log = txLogs[logIndex]; if (!filter.contractAddress || log.contractAddress.equals(filter.contractAddress)) { - if (log instanceof UnencryptedL2Log) { - results.push(new ExtendedUnencryptedL2Log(new LogId(blockNumber, txIndex, logIndex), log)); + if (log instanceof ContractClassLog) { + results.push(new ExtendedContractClassLog(new LogId(blockNumber, txIndex, logIndex), log)); } else { results.push(new ExtendedPublicLog(new LogId(blockNumber, txIndex, logIndex), log)); } diff --git a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts index d588cb4943b3..632f48cf1bd3 100644 --- a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts @@ -19,9 +19,9 @@ import type { } from '@aztec/stdlib/contract'; import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client'; import { - ContractClass2BlockL2Logs, + ContractClassLog, + ExtendedContractClassLog, ExtendedPublicLog, - ExtendedUnencryptedL2Log, type LogFilter, LogId, type PrivateLog, @@ -60,7 +60,7 @@ export class MemoryArchiverStore implements ArchiverDataStore { private publicLogsPerBlock: Map = new Map(); - private contractClassLogsPerBlock: Map = new Map(); + private contractClassLogsPerBlock: Map = new Map(); private blockScopedNullifiers: Map = new Map(); @@ -350,7 +350,10 @@ export class MemoryArchiverStore implements ArchiverDataStore { this.#storeTaggedLogsFromPublic(block); this.privateLogsPerBlock.set(block.number, block.body.txEffects.map(txEffect => txEffect.privateLogs).flat()); this.publicLogsPerBlock.set(block.number, block.body.txEffects.map(txEffect => txEffect.publicLogs).flat()); - this.contractClassLogsPerBlock.set(block.number, block.body.contractClassLogs); + this.contractClassLogsPerBlock.set( + block.number, + block.body.txEffects.map(txEffect => txEffect.contractClassLogs).flat(), + ); }); return Promise.resolve(true); } @@ -698,34 +701,36 @@ export class MemoryArchiverStore implements ArchiverDataStore { const contractAddress = filter.contractAddress; - const logs: ExtendedUnencryptedL2Log[] = []; + const logs: ExtendedContractClassLog[] = []; for (; fromBlock < toBlock; fromBlock++) { const block = this.l2Blocks[fromBlock - INITIAL_L2_BLOCK_NUM]; const blockLogs = this.contractClassLogsPerBlock.get(fromBlock); if (blockLogs) { - for (; txIndexInBlock < blockLogs.txLogs.length; txIndexInBlock++) { - const txLogs = blockLogs.txLogs[txIndexInBlock].unrollLogs(); - for (; logIndexInTx < txLogs.length; logIndexInTx++) { - const log = txLogs[logIndexInTx]; - if ( - (!txHash || block.data.body.txEffects[txIndexInBlock].txHash.equals(txHash)) && - (!contractAddress || log.contractAddress.equals(contractAddress)) - ) { - logs.push(new ExtendedUnencryptedL2Log(new LogId(block.data.number, txIndexInBlock, logIndexInTx), log)); - if (logs.length === this.maxLogs) { - return Promise.resolve({ - logs, - maxLogsHit: true, - }); - } + for (let logIndex = 0; logIndex < blockLogs.length; logIndex++) { + const log = blockLogs[logIndex]; + const thisTxEffect = block.data.body.txEffects.filter(effect => effect.contractClassLogs.includes(log))[0]; + const thisTxIndexInBlock = block.data.body.txEffects.indexOf(thisTxEffect); + const thisLogIndexInTx = thisTxEffect.contractClassLogs.indexOf(log); + if ( + (!txHash || thisTxEffect.txHash.equals(txHash)) && + (!contractAddress || log.contractAddress.equals(contractAddress)) && + thisTxIndexInBlock >= txIndexInBlock && + thisLogIndexInTx >= logIndexInTx + ) { + logs.push( + new ExtendedContractClassLog(new LogId(block.data.number, thisTxIndexInBlock, thisLogIndexInTx), log), + ); + if (logs.length === this.maxLogs) { + return Promise.resolve({ + logs, + maxLogsHit: true, + }); } } - logIndexInTx = 0; } } - txIndexInBlock = 0; } return Promise.resolve({ diff --git a/yarn-project/aztec.js/src/index.ts b/yarn-project/aztec.js/src/index.ts index 51f8de848755..167ffcff44fb 100644 --- a/yarn-project/aztec.js/src/index.ts +++ b/yarn-project/aztec.js/src/index.ts @@ -69,14 +69,7 @@ export { GlobalVariables, } from '@aztec/stdlib/tx'; export { Body, L2Block } from '@aztec/stdlib/block'; -export { - L1NotePayload, - LogId, - UnencryptedL2Log, - ContractClass2BlockL2Logs, - type LogFilter, - EncryptedLogPayload, -} from '@aztec/stdlib/logs'; +export { L1NotePayload, LogId, type LogFilter, EncryptedLogPayload } from '@aztec/stdlib/logs'; export { L1EventPayload, EventMetadata } from '@aztec/stdlib/event'; export { L1ToL2Message, L2Actor, L1Actor } from '@aztec/stdlib/messaging'; export { UniqueNote, ExtendedNote, Comparator, Note } from '@aztec/stdlib/note'; diff --git a/yarn-project/builder/src/contract-interface-gen/typescript.ts b/yarn-project/builder/src/contract-interface-gen/typescript.ts index 426e59ae9b2c..80f2148f8757 100644 --- a/yarn-project/builder/src/contract-interface-gen/typescript.ts +++ b/yarn-project/builder/src/contract-interface-gen/typescript.ts @@ -343,7 +343,6 @@ import { Point, type PublicKey, PublicKeys, - type UnencryptedL2Log, type Wallet, type U128Like, type WrappedFieldLike, diff --git a/yarn-project/constants/src/constants.gen.ts b/yarn-project/constants/src/constants.gen.ts index 0dbfbb69b628..1fdfff0049c5 100644 --- a/yarn-project/constants/src/constants.gen.ts +++ b/yarn-project/constants/src/constants.gen.ts @@ -150,6 +150,8 @@ export const READ_REQUEST_LENGTH = 2; export const TREE_LEAF_READ_REQUEST_LENGTH = 2; export const PRIVATE_LOG_DATA_LENGTH = 20; export const SCOPED_PRIVATE_LOG_DATA_LENGTH = 21; +export const CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS = 3019; +export const CONTRACT_CLASS_LOG_SIZE_IN_FIELDS = 3020; export const LOG_HASH_LENGTH = 3; export const SCOPED_LOG_HASH_LENGTH = 4; export const NOTE_HASH_LENGTH = 2; @@ -180,7 +182,7 @@ export const IPA_CLAIM_LENGTH = 10; export const SCOPED_READ_REQUEST_LEN = 3; export const PUBLIC_DATA_READ_LENGTH = 3; export const PRIVATE_VALIDATION_REQUESTS_LENGTH = 772; -export const PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH = 741; +export const PRIVATE_TO_ROLLUP_ACCUMULATED_DATA_LENGTH = 740; export const TX_CONSTANT_DATA_LENGTH = 37; export const COMBINED_CONSTANT_DATA_LENGTH = 46; export const PRIVATE_ACCUMULATED_DATA_LENGTH = 1412; @@ -190,7 +192,7 @@ export const PRIVATE_TO_AVM_ACCUMULATED_DATA_LENGTH = 160; export const NUM_PRIVATE_TO_AVM_ACCUMULATED_DATA_ARRAYS = 3; export const AVM_ACCUMULATED_DATA_LENGTH = 400; export const PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1847; -export const PRIVATE_TO_ROLLUP_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 783; +export const PRIVATE_TO_ROLLUP_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 782; export const AVM_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1091; export const CONSTANT_ROLLUP_DATA_LENGTH = 13; export const BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 52; @@ -275,6 +277,7 @@ export const L2_GAS_PER_NULLIFIER_READ_REQUEST = 1440; export const L2_GAS_PER_L1_TO_L2_MSG_READ_REQUEST = 1404; export const L2_GAS_PER_LOG_BYTE = 4; export const L2_GAS_PER_PRIVATE_LOG = 0; +export const L2_GAS_PER_CONTRACT_CLASS_LOG = 0; export const L2_GAS_PER_L2_TO_L1_MSG = 200; export const AVM_ADD_BASE_L2_GAS = 27; export const AVM_SUB_BASE_L2_GAS = 27; diff --git a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts index 074e374f09b8..57038d94af92 100644 --- a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts @@ -487,8 +487,6 @@ describe('L1Publisher integration', () => { txHashes: [], }, [], - // TODO(#9101): Extract blobs from beacon chain => calldata will only contain what's needed to verify blob: - `0x${block.body.toBuffer().toString('hex')}`, Blob.getEthBlobEvaluationInputs(blobs), ], }); diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts index d70ef9d04604..6e5230ccc3b5 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts @@ -67,6 +67,10 @@ describe('e2e_deploy_contract contract class registration', () => { ); const logs = await aztecNode.getContractClassLogs({ txHash: registrationTxReceipt.txHash }); expect(logs.logs.length).toEqual(1); + + // TODO(#10007): The below is temporary as it's commented out on a below test + const logData = logs.logs[0].log.toBuffer(); + writeTestData('yarn-project/protocol-contracts/fixtures/ContractClassRegisteredEventData.hex', logData); }); // TODO(#10007) Remove this test. We should always broadcast public bytecode. @@ -89,7 +93,7 @@ describe('e2e_deploy_contract contract class registration', () => { // TODO(#10007) Enable this. // const logs = await aztecNode.getContractClassLogs({ txHash: registrationTxReceipt.txHash }); // expect(logs.logs.length).toEqual(1); - // const logData = logs.logs[0].log.data; + // const logData = logs.logs[0].log.toBuffer(); // writeTestData('yarn-project/protocol-contracts/fixtures/ContractClassRegisteredEventData.hex', logData); const registeredClass = await aztecNode.getContractClass(contractClass.id); @@ -115,7 +119,7 @@ describe('e2e_deploy_contract contract class registration', () => { const tx = await (await broadcastPrivateFunction(wallet, artifact, selector)).send().wait(); const logs = await pxe.getContractClassLogs({ txHash: tx.txHash }); - const logData = logs.logs[0].log.data; + const logData = logs.logs[0].log.toBuffer(); writeTestData('yarn-project/protocol-contracts/fixtures/PrivateFunctionBroadcastedEventData.hex', logData); const fetchedClass = await aztecNode.getContractClass(contractClass.id); @@ -129,7 +133,7 @@ describe('e2e_deploy_contract contract class registration', () => { const selector = await FunctionSelector.fromNameAndParameters(functionArtifact); const tx = await (await broadcastUnconstrainedFunction(wallet, artifact, selector)).send().wait(); const logs = await pxe.getContractClassLogs({ txHash: tx.txHash }); - const logData = logs.logs[0].log.data; + const logData = logs.logs[0].log.toBuffer(); writeTestData('yarn-project/protocol-contracts/fixtures/UnconstrainedFunctionBroadcastedEventData.hex', logData); const fetchedClass = await aztecNode.getContractClass(contractClass.id); diff --git a/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts b/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts index 2110ed0a53c9..d8c1895f0da0 100644 --- a/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts +++ b/yarn-project/noir-protocol-circuits-types/src/conversion/client.ts @@ -21,7 +21,6 @@ import { KeyValidationHint, KeyValidationRequest, KeyValidationRequestAndGenerator, - LogHash, NoteHash, type NoteHashReadRequestHints, Nullifier, @@ -45,7 +44,6 @@ import { ReadRequestStatus, RollupValidationRequests, ScopedKeyValidationRequestAndGenerator, - ScopedLogHash, ScopedNoteHash, ScopedNullifier, ScopedPrivateLogData, @@ -65,7 +63,6 @@ import type { KeyValidationHint as KeyValidationHintNoir, KeyValidationRequestAndGenerator as KeyValidationRequestAndGeneratorNoir, KeyValidationRequest as KeyValidationRequestsNoir, - LogHash as LogHashNoir, NoteHashLeafPreimage as NoteHashLeafPreimageNoir, NoteHash as NoteHashNoir, NoteHashReadRequestHints as NoteHashReadRequestHintsNoir, @@ -92,7 +89,6 @@ import type { ReadRequestStatus as ReadRequestStatusNoir, RollupValidationRequests as RollupValidationRequestsNoir, ScopedKeyValidationRequestAndGenerator as ScopedKeyValidationRequestAndGeneratorNoir, - ScopedLogHash as ScopedLogHashNoir, ScopedNoteHash as ScopedNoteHashNoir, ScopedNullifier as ScopedNullifierNoir, Scoped as ScopedPrivateLogDataNoir, @@ -113,6 +109,7 @@ import { mapHeaderFromNoir, mapHeaderToNoir, mapL2ToL1MessageToNoir, + mapLogHashToNoir, mapMaxBlockNumberFromNoir, mapMaxBlockNumberToNoir, mapMembershipWitnessToNoir, @@ -132,6 +129,8 @@ import { mapPublicDataTreePreimageToNoir, mapScopedL2ToL1MessageFromNoir, mapScopedL2ToL1MessageToNoir, + mapScopedLogHashFromNoir, + mapScopedLogHashToNoir, mapTupleFromNoir, mapTxContextFromNoir, mapTxContextToNoir, @@ -252,56 +251,6 @@ function mapScopedPrivateLogDataFromNoir(data: ScopedPrivateLogDataNoir) { ); } -/** - * Maps a LogHash to a noir LogHash. - * @param logHash - The LogHash. - * @returns The noir log hash. - */ -function mapLogHashToNoir(logHash: LogHash): LogHashNoir { - return { - value: mapFieldToNoir(logHash.value), - counter: mapNumberToNoir(logHash.counter), - length: mapFieldToNoir(logHash.length), - }; -} - -/** - * Maps a noir LogHash to a LogHash. - * @param logHash - The noir LogHash. - * @returns The TS log hash. - */ -function mapLogHashFromNoir(logHash: LogHashNoir): LogHash { - return new LogHash( - mapFieldFromNoir(logHash.value), - mapNumberFromNoir(logHash.counter), - mapFieldFromNoir(logHash.length), - ); -} - -/** - * Maps a ts ScopedLogHash to a noir ScopedLogHash. - * @param logHash - The ts LogHash. - * @returns The noir log hash. - */ -function mapScopedLogHashToNoir(scopedLogHash: ScopedLogHash): ScopedLogHashNoir { - return { - log_hash: mapLogHashToNoir(scopedLogHash.logHash), - contract_address: mapAztecAddressToNoir(scopedLogHash.contractAddress), - }; -} - -/** - * Maps a noir ScopedLogHash to a ts ScopedLogHash. - * @param logHash - The noir LogHash. - * @returns The TS log hash. - */ -function mapScopedLogHashFromNoir(scopedLogHash: ScopedLogHashNoir): ScopedLogHash { - return new ScopedLogHash( - mapLogHashFromNoir(scopedLogHash.log_hash), - mapAztecAddressFromNoir(scopedLogHash.contract_address), - ); -} - /** * Maps a noir ReadRequest to ReadRequest. * @param readRequest - The noir ReadRequest. diff --git a/yarn-project/noir-protocol-circuits-types/src/conversion/common.ts b/yarn-project/noir-protocol-circuits-types/src/conversion/common.ts index ecfb26326e50..f4301db335c7 100644 --- a/yarn-project/noir-protocol-circuits-types/src/conversion/common.ts +++ b/yarn-project/noir-protocol-circuits-types/src/conversion/common.ts @@ -647,11 +647,11 @@ export function mapMembershipWitnessToNoir(witness: Membership * @param logHash - The LogHash. * @returns The noir log hash. */ -function mapLogHashToNoir(logHash: LogHash): LogHashNoir { +export function mapLogHashToNoir(logHash: LogHash): LogHashNoir { return { value: mapFieldToNoir(logHash.value), counter: mapNumberToNoir(logHash.counter), - length: mapFieldToNoir(logHash.length), + length: mapNumberToNoir(logHash.length), }; } @@ -664,7 +664,7 @@ function mapLogHashFromNoir(logHash: LogHashNoir): LogHash { return new LogHash( mapFieldFromNoir(logHash.value), mapNumberFromNoir(logHash.counter), - mapFieldFromNoir(logHash.length), + mapNumberFromNoir(logHash.length), ); } @@ -685,7 +685,7 @@ export function mapScopedLogHashToNoir(scopedLogHash: ScopedLogHash): ScopedLogH * @param logHash - The noir LogHash. * @returns The TS log hash. */ -function mapScopedLogHashFromNoir(scopedLogHash: ScopedLogHashNoir): ScopedLogHash { +export function mapScopedLogHashFromNoir(scopedLogHash: ScopedLogHashNoir): ScopedLogHash { return new ScopedLogHash( mapLogHashFromNoir(scopedLogHash.log_hash), mapAztecAddressFromNoir(scopedLogHash.contract_address), @@ -716,7 +716,6 @@ export function mapPrivateToRollupAccumulatedDataToNoir( privateToRollupAccumulatedData.contractClassLogsHashes, mapScopedLogHashToNoir, ), - contract_class_log_preimages_length: mapFieldToNoir(privateToRollupAccumulatedData.contractClassLogPreimagesLength), }; } @@ -743,7 +742,6 @@ export function mapPrivateToRollupAccumulatedDataFromNoir( MAX_CONTRACT_CLASS_LOGS_PER_TX, mapScopedLogHashFromNoir, ), - mapFieldFromNoir(privateToRollupAccumulatedData.contract_class_log_preimages_length), ); } diff --git a/yarn-project/noir-protocol-circuits-types/src/conversion/server.ts b/yarn-project/noir-protocol-circuits-types/src/conversion/server.ts index 1e5e0cae3edc..f2b55fb59297 100644 --- a/yarn-project/noir-protocol-circuits-types/src/conversion/server.ts +++ b/yarn-project/noir-protocol-circuits-types/src/conversion/server.ts @@ -4,6 +4,7 @@ import { AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, AZTEC_MAX_EPOCH_DURATION, BLOBS_PER_BLOCK, + CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, HONK_VERIFICATION_KEY_LENGTH_IN_FIELDS, type NESTED_RECURSIVE_PROOF_LENGTH, type NULLIFIER_TREE_HEIGHT, @@ -13,7 +14,7 @@ import { } from '@aztec/constants'; import { toHex } from '@aztec/foundation/bigint-buffer'; import { Fr } from '@aztec/foundation/fields'; -import { mapTuple } from '@aztec/foundation/serialize'; +import { type Tuple, mapTuple } from '@aztec/foundation/serialize'; import type { MembershipWitness } from '@aztec/foundation/trees'; import { type AvmAccumulatedData, type AvmCircuitPublicInputs, PublicDataHint, RevertCode } from '@aztec/stdlib/avm'; import { @@ -24,6 +25,7 @@ import { PrivateToRollupKernelCircuitPublicInputs, RollupValidationRequests, } from '@aztec/stdlib/kernel'; +import type { ContractClassLog } from '@aztec/stdlib/logs'; import { BaseParityInputs, ParityPublicInputs, type RootParityInput, RootParityInputs } from '@aztec/stdlib/parity'; import type { RecursiveProof } from '@aztec/stdlib/proofs'; import { @@ -68,6 +70,7 @@ import type { BlockRootRollupData as BlockRootRollupDataNoir, BlockRootRollupInputs as BlockRootRollupInputsNoir, ConstantRollupData as ConstantRollupDataNoir, + ContractClassLog as ContractClassLogNoir, EmptyBlockRootRollupInputs as EmptyBlockRootRollupInputsNoir, FeeRecipient as FeeRecipientNoir, FixedLengthArray, @@ -292,6 +295,23 @@ export function mapBlockBlobPublicInputsFromNoir( ); } +/** + * Maps a contract class log to noir. + * @param log - The ts contract class log. + * @returns The noir contract class log. + */ +export function mapContractClassLogToNoir(log: ContractClassLog): ContractClassLogNoir { + return { + log: { + // @ts-expect-error - below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + fields: Array.from({ length: CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS }, (_, idx) => + mapFieldToNoir(log.fields[idx]), + ) as Tuple, + }, + contract_address: mapAztecAddressToNoir(log.contractAddress), + }; +} + function mapPublicDataHintToNoir(hint: PublicDataHint): PublicDataHintNoir { return { leaf_slot: mapFieldToNoir(hint.leafSlot), @@ -799,10 +819,10 @@ export function mapPrivateBaseRollupInputsToNoir(inputs: PrivateBaseRollupInputs start: mapPartialStateReferenceToNoir(inputs.hints.start), start_sponge_blob: mapSpongeBlobToNoir(inputs.hints.startSpongeBlob), state_diff_hints: mapPrivateBaseStateDiffHintsToNoir(inputs.hints.stateDiffHints), - + fee_payer_fee_juice_balance_read_hint: mapPublicDataHintToNoir(inputs.hints.feePayerFeeJuiceBalanceReadHint), archive_root_membership_witness: mapMembershipWitnessToNoir(inputs.hints.archiveRootMembershipWitness), + contract_class_logs_preimages: mapTuple(inputs.hints.contractClassLogsPreimages, mapContractClassLogToNoir), constants: mapConstantRollupDataToNoir(inputs.hints.constants), - fee_payer_fee_juice_balance_read_hint: mapPublicDataHintToNoir(inputs.hints.feePayerFeeJuiceBalanceReadHint), }; } @@ -835,8 +855,8 @@ export function mapPublicBaseRollupInputsToNoir(inputs: PublicBaseRollupInputs): tube_data: mapPublicTubeDataToNoir(inputs.tubeData), avm_proof_data: mapAvmProofDataToNoir(inputs.avmProofData), start_sponge_blob: mapSpongeBlobToNoir(inputs.hints.startSpongeBlob), - archive_root_membership_witness: mapMembershipWitnessToNoir(inputs.hints.archiveRootMembershipWitness), + contract_class_logs_preimages: mapTuple(inputs.hints.contractClassLogsPreimages, mapContractClassLogToNoir), constants: mapConstantRollupDataToNoir(inputs.hints.constants), }; } diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.test.ts b/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.test.ts index d260beaca974..87e30a11e690 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.test.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.test.ts @@ -1,9 +1,11 @@ -import { MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants'; +import { MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants'; import { timesParallel } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/fields'; import { FunctionSelector } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { computeVarArgsHash } from '@aztec/stdlib/hash'; +import { ScopedLogHash } from '@aztec/stdlib/kernel'; +import { ContractClassLog } from '@aztec/stdlib/logs'; import { mockTx } from '@aztec/stdlib/testing'; import type { Tx } from '@aztec/stdlib/tx'; @@ -18,6 +20,32 @@ const mockTxs = (numTxs: number) => }), ); +// Added separately to avoid slowing down test with large CC logs when not required. +const mockTxsWithCCLog = (numTxs: number) => + timesParallel(numTxs, async i => { + const tx = await mockTx(i, { + numberOfNonRevertiblePublicCallRequests: 2, + numberOfRevertiblePublicCallRequests: 2, + hasPublicTeardownCallRequest: true, + }); + const contractClassLogs = await Promise.all( + Array(MAX_CONTRACT_CLASS_LOGS_PER_TX).fill(0).map(ContractClassLog.random), + ); + const logHashes = await Promise.all( + contractClassLogs.map(async l => + ScopedLogHash.fromFields([ + await l.hash(), + new Fr(i + 3), + new Fr(l.getEmittedLength()), + (await AztecAddress.random()).toField(), + ]), + ), + ); + tx.contractClassLogs.push(...contractClassLogs); + logHashes.forEach((hash, i) => (tx.data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[i] = hash)); + return tx; + }); + // After modifying a mocked TX's enqueued calls, update its argsHash to match. const fixPublicCallRequests = async ( tx: Tx, @@ -66,6 +94,8 @@ describe('TxDataValidator', () => { it('allows transactions with the correct data', async () => { const [tx] = await mockTxs(1); await expect(validator.validateTx(tx)).resolves.toEqual({ result: 'valid' }); + const [txWithLog] = await mockTxsWithCCLog(1); + await expect(validator.validateTx(txWithLog)).resolves.toEqual({ result: 'valid' }); }); it('accept txs with exactly max args', async () => { @@ -175,4 +205,73 @@ describe('TxDataValidator', () => { await expectInvalid(badTxs[0], 'Wrong number of execution requests for public calls'); await expectInvalid(badTxs[1], 'Wrong number of execution requests for public calls'); }); + + it('rejects txs with mismatch number of contract class logs', async () => { + const goodTxs = await mockTxsWithCCLog(3); + const badTxs = await mockTxsWithCCLog(2); + // Missing log hashes/log. + badTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[ + badTxs[0].contractClassLogs.length - 1 + ] = ScopedLogHash.empty(); + badTxs[1].contractClassLogs.pop(); + // Extra log hashes/log. + // Can uncomment below if MAX_CONTRACT_CLASS_LOGS_PER_TX > 1 and we do not fill a tx's logs in mockTxsWithCCLog: + // const extraLogHash = goodTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[0]; + // badTxs[2].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[badTxs[2].contractClassLogs.length] = extraLogHash; + // const extraLog = goodTxs[0].contractClassLogs[0]; + // badTxs[3].contractClassLogs.push(extraLog); + + await expectValid(goodTxs); + + await expectInvalid(badTxs[0], 'Mismatched number of contract class logs'); + await expectInvalid(badTxs[1], 'Mismatched number of contract class logs'); + }); + + // Can uncomment below if MAX_CONTRACT_CLASS_LOGS_PER_TX > 1: + // it('rejects txs with unsorted contract class logs', async () => { + // const goodTxs = await mockTxsWithCCLog(3); + // const badTxs = await mockTxsWithCCLog(2); + // // Unsorted logHash. + // badTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[1] = badTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[0]; + // badTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[0] = ScopedLogHash.empty(); + // // Unsorted log. + // badTxs[1].contractClassLogs[1] ? badTxs[1].contractClassLogs[1] = badTxs[1].contractClassLogs[0] : badTxs[1].contractClassLogs.push(badTxs[1].contractClassLogs[0]); + // badTxs[1].contractClassLogs[0] = ContractClassLog.empty(); + + // await expectValid(goodTxs); + + // await expectInvalid(badTxs[0], 'Incorrectly sorted contract class logs'); + // await expectInvalid(badTxs[1], 'Incorrectly sorted contract class logs'); + // }); + + it('rejects txs with mismatched contract class logs', async () => { + const goodTxs = await mockTxsWithCCLog(3); + const badTxs = await mockTxsWithCCLog(2); + + const badLogHash = badTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[0]; + badLogHash.logHash.value = badLogHash.value.add(Fr.ONE); + badTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[0] = badLogHash; + badTxs[1].contractClassLogs[0].fields[0] = badTxs[1].contractClassLogs[0].fields[0].add(Fr.ONE); + + await expectValid(goodTxs); + + await expectInvalid(badTxs[0], 'Mismatched contract class logs'); + await expectInvalid(badTxs[1], 'Mismatched contract class logs'); + }); + + it('rejects txs with mismatched contract class logs length', async () => { + const goodTxs = await mockTxsWithCCLog(3); + const badTxs = await mockTxsWithCCLog(2); + + badTxs[0].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[0].logHash.length += 1; + // Note: changing the raw log to be longer/shorter results in an incorrect hash, which throws first. + badTxs[1].contractClassLogs[0].fields[badTxs[1].contractClassLogs[0].getEmittedLength()] = Fr.ONE; + badTxs[1].data.forPublic!.nonRevertibleAccumulatedData.contractClassLogsHashes[0].logHash.value = + await badTxs[1].contractClassLogs[0].hash(); + + await expectValid(goodTxs); + + await expectInvalid(badTxs[0], 'Mismatched contract class logs length'); + await expectInvalid(badTxs[1], 'Mismatched contract class logs length'); + }); }); diff --git a/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.ts b/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.ts index 716457a775a2..93d77cab8321 100644 --- a/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.ts +++ b/yarn-project/p2p/src/msg_validators/tx_validator/data_validator.ts @@ -5,8 +5,10 @@ import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx' export class DataTxValidator implements TxValidator { #log = createLogger('p2p:tx_validator:tx_data'); - validateTx(tx: Tx): Promise { - return this.#hasCorrectExecutionRequests(tx); + async validateTx(tx: Tx): Promise { + const execRequestRes = this.#hasCorrectExecutionRequests(tx); + // Note: If we ever skip txs here, must change this return statement to account for them. + return (await execRequestRes).result === 'invalid' ? execRequestRes : this.#hasCorrectContractClassLogs(tx); } async #hasCorrectExecutionRequests(tx: Tx): Promise { @@ -59,5 +61,46 @@ export class DataTxValidator implements TxValidator { return { result: 'valid' }; } - // TODO: Check logs. + async #hasCorrectContractClassLogs(tx: Tx): Promise { + const contractClassLogsHashes = tx.data.getNonEmptyContractClassLogsHashes(); + const hashedContractClasslogs = await Promise.all(tx.contractClassLogs.map(l => l.hash())); + if (contractClassLogsHashes.length !== hashedContractClasslogs.length) { + this.#log.warn( + `Rejecting tx ${Tx.getHash(tx)} because of mismatched number of contract class logs. Expected ${ + contractClassLogsHashes.length + }. Got ${hashedContractClasslogs.length}.`, + ); + return { result: 'invalid', reason: ['Mismatched number of contract class logs'] }; + } + for (const [i, logHash] of contractClassLogsHashes.entries()) { + const hashedLog = hashedContractClasslogs[i]; + if (!logHash.value.equals(hashedLog)) { + if (hashedContractClasslogs.some(l => logHash.value.equals(l))) { + const matchingLogIndex = hashedContractClasslogs.findIndex(l => logHash.value.equals(l)); + this.#log.warn( + `Rejecting tx ${Tx.getHash( + tx, + )} because of mismatched contract class logs indices. Expected ${i} from the kernel's log hashes. Got ${matchingLogIndex} in the tx.`, + ); + return { result: 'invalid', reason: ['Incorrectly sorted contract class logs'] }; + } else { + this.#log.warn( + `Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs. Expected hash ${ + logHash.value + } from the kernels. Got ${hashedLog} in the tx.`, + ); + return { result: 'invalid', reason: ['Mismatched contract class logs'] }; + } + } + if (logHash.logHash.length !== tx.contractClassLogs[i].getEmittedLength()) { + this.#log.warn( + `Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs length. Expected ${ + logHash.logHash.length + } from the kernel's log hashes. Got ${tx.contractClassLogs[i].getEmittedLength()} in the tx.`, + ); + return { result: 'invalid', reason: ['Mismatched contract class logs length'] }; + } + } + return { result: 'valid' }; + } } diff --git a/yarn-project/protocol-contracts/fixtures/ContractClassRegisteredEventData.hex b/yarn-project/protocol-contracts/fixtures/ContractClassRegisteredEventData.hex index e6d5bc08ad41..24a463d78a2c 100644 --- a/yarn-project/protocol-contracts/fixtures/ContractClassRegisteredEventData.hex +++ b/yarn-project/protocol-contracts/fixtures/ContractClassRegisteredEventData.hex @@ -1 +1 @@ -000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f81c9a43d08a1af21c35e4201262a49497a488b0686209370a70f2434af643b4f70000000000000000000000000000000000000000000000000000000000000001072dce903b1a299d6820eeed695480fe9ec46658b1101885816aed6dd86037f015b6f9aad3bac28ee9abb5d28ce58c47a78097c271106637d1d27723c75f91a100000000000000000000000000000000000000000000000000000000000069d200000000032b1eb6a600000021a91f8b08000000000000ffed9d679454c795c7005fcf107b1a248132481a320c33d03d8924a001011239e73c33c4818161c839008aa06c5992654956b0244b969cb32de79c6dd972926dd972d0d9fdb0bb5ff600ecd9fdb275dfabebfe4fcda37b1e5435d550ef9c7bbaeabe57757fb75e55bd005455fd9ee779e55eb0150bb9c36bbbc5e46f5afe262f6d4b69cc2b6992335600209c4505c2595c209c1d0a84b3638170762a10cece05c2d9a54038bb6ae42400b622aff5a69b376ea05c753396788571ee1305c2d9ad4038bb1708e73505c200796d81705e57209c3d0a84b36781705e5f209c371408e78d05c279538170de005c209cb71408e7ad05c2d9ab40387b1708e76d05c2797b8170dea191b33f700096cadf3ef2b7affced277ff9d801f277a0fc1d247f074b5f3bc8f81021654200867ac1fb57dac7055321649890e152472f4c2b855409a9165223a456c808210023858c12325ac81821770a192b649c90f1b22c26089928649290bb844c16320045c85421770bb947c83421d385cc103253c82c21b385cc113257c83c21f385002c10b250c822218b852c11b254c83221cb85ac90be944a5f560a592564b590003542d60a5927a44e48bd900621eb856c10b251c826219b856c11d22864ab90006d429a846c17b24348b3909d425a84ec12b25bc81e217b85ec13b25fc80121000795323f24e4b09023428e2a9cc7841c177242c84921a7849c1672af90334200ce0a3927e4bc90fb84dc2fe401210f0a7948c8c3421e11f23e218f0a79bf9000c7843c2ee409211f10f2a4900f0a794ac8d3429e11f22121cf7aadcfff7342009e17f282900f0b7951c84b425e16f21121af087955c84785bc26e475211f1300f271219f10f249219f12f269219f11f259219f13f279215f10f245215f12f20065215f11f28690af0af99a90af0bf986906f0af996906f0bf98e90ef0af99e0090ef0bf981901f0af991901f0bf989909f0af999909f4b5ff85dcd2f84fc5200d1bd29e45732fc6bf9fb96fcfd8d72ec6f85fc4e867f2f7fff207fdf96bf7f0094bf7f92bf7f96bfefc8dfbfc8dfbfcadf77e5efdfe4efdfe5ef3fe4ef3fe500ef7b42569604e1ce5e664bcbdfe4a56cd50da3e8fd2d57ce52aff5168732e0006348572c5531d071fd2e025d47a92b065d27ce0e74ec5747d07591ba4ea0eb002a759d411797ba2ea093c5e575953aca3f217569f99bbc94ad3ab996f2eca600334ff9eeafbbcc2b01fe5c2375dd4077add47507dd7552770de87a48ddb5a000eb2975d781ee7aa9eb01ba1ba4ae27e86e94baeb417793d4dd00ba9ba5ee4600d0dd22753781ee56a9bb1974bda4ee16d0f596ba5b41779bd4f502dded52d7001b74fc3df136d0954addeda0e3ebea1d524775f50d0fd2487d11e8fa485d3100e8fa4a5d07d0f593918ea0eb0f76583700ea2ceb064a5d17d00d92baaea01b000cbe701ec365382d7f9397b255578ea23c933af314b9529e957af3f4dfd557007999f24d838d24944fb55ebb29b41b93c236585f0ce1d15e66ab8630f7619500104f851c87e1e14a9a04ec4f19f6b91238d210675b1d80cf40bdacd75f2fab00925773bdbcdbcb6c58c7f89a7725d5cbb1c0a0b75ed618a897955775bd5ce4006536ac637c8f7425d5cbe9c0a0b75e8ea877d7f1ac5be47a59ef6536ac637c004f7e25d5cba5c0a0b75e8e4cb9fe32eb16b95e367b990deb183f035e49f572000330e8ad976b53eefe32eb16b95e1ef5321bd6317ee77025d5cb5dc0a0b75e00d61ba897c9caabb95e3ee06536ac63fc8eeb4aaa9727804173bdac72f532eb0016b95e3ee56536ac63fc4ef54aaa970fcb30bdc7fcb57ca7d90b746f495d6f00d0fd46ea6e037ecd757aa4abd359b7c875fa752fb361fde477f857529d7e5e0086a9aefe5ef9de46ba3f485d1fd0bd2d757d41f747a9eb07ba3f495d7fd0fd0059ea0680ee1da91b08babf48dd20d0fd55ea0683ee5da91b02babf495d19e800fe2e754341f70fa92b07dd3fa5ae0274ef49dd30a9a3773afccde50752d7190018d2f23779699bffdd8d7de52da6c4d3101e628e25990016b43354af9d2af200b9cc6bbfcf4381a55cb3cf71c8bf3d2ce5c052a197c5bf9f1ea6374fff9c960029e518073b65e08fd66b96ec9f8679adcb91e36c2b013a6ca3c343f8745fff00626087f3e57812f8585761aeacfc7ad857291bea7ede029b9adba17fade67600ce73e998816d15c3313d4b325c3c16250efbf9fa5102e907838ecf2ff6d9790038cfa9f69c67e2e3f33b3cbf7c95ede553dbcee56ab364b7ca805db50cb80e005519b69b52ec562876e3701e78cb768dc07b3ecdf7d72903f7917e3f5023f300e27b76b6817d5ead81b2af81f28c810dd61743f87fbdcc560b61ee579899da004a55c871184e2a6912b0bfcab0cff8ec908638dba2fef53f8041739d6ff58c00c6f972bc02f4d521e55505e5c5fb87808efb7bbcbe972979c4211fec574d3e0013aa7ee279675d0af8aa43f86af4f25566ab0b35c0c7ba4ac36595eb59f26a00b4abbbed61fe382e09df51f0fe778a32c7f5886598343f7754e2f3006fd9ae006f784dd07b4f5ae9df0757446031f86c983271cf4d799669ce93f218e2b53d003fcc9e80fdd89fe97e9711f35a3f4ba7218e7c8ed5b13a56c7ea581dab637500ac8ed5b13a56c7ea581dab6375ac8ed5b13a56c75a28ac388605c794f171c3002ce0631d8e5fd2fd6edb5f6b40e6c579d3b78b17e0db85de77f495feb74c2e0073fa765d0a0cb8ae3b1ff3d95886eb65192e81fd7cae2e74fe34bfbbcf7afe00d8168e9dc1ef1d9acf9fcf52aeb05cb9762bebf4b7c7ca64372f581783ebd30010c50f1cfb3440d1519d7cb728e3afeeef5951bfad615fa199c51f9758116200476ffb0afa072e7b2ada522fd33f18b86ea4384076792c04f54b7dbcb6fd7200311cf3757922ba7be6ae1317fade3d04ca61b05ebbadc6187ab2fcf99b378e00f156c71dabf3084abdb6630a713cfff7a15fdf026d48735fe57f2bc7be8a5900714b4318fb2fdd7d4dd4b1cb789e755fc74c8c4737511f298faa90f383f74a00bc7f3094978971874394f3c471e473ac8ed5b13a56c7ea581dab6375ac8ed500b13a56c7ea581dab6375ac8ed5b13ad642612516f5db1eae21506e015f1ec60015f8efee79cd1ccedb5fdf14be5d98fc16c6df54fa2bbe16c3318f1765b85600ca7089d7762cc185ce9fe677f759cf1fae3351a694aba9ef69650acb956b3700f856aeb73d66be95737daa52fce0738adf8a5987dff9707c048edf2853749700eb7c609bc1311d1cc6f9b4bacb18e798f3da0efcfd9b6de19ce35db24cf93b00b4de79d7c17ac8bafb75ca83e7cb77f0dad6275c43623ff469076538acffa200fde743f6f396ed3b2bce1f1fa1d757ff7c8e9479f1f91c116277945ebb29b400cb6b75b00dd61743f85c51a63c466582ff2a5f66a676501b721c868728691200b0bfd6b0cf2380230d71b645f5e408d4a9f370fdd67dfd437fb15cfa41b9f0007ebc7731711f55031ca55edb3e05c7443227aeab817df2e5586305d7d5c0710028ec07f627387ef16a1d9ff4345c17c2c6f470dafec0aca9feb762ae5298d5007b051c13f4bc722d33713f7aa13155069fb35a9d3b2e7f751d115c63878f5500ef054abdb6cf3f782ff02af46b6fe7b8ff1face84cf53be8771ae26c0befab00d0efc117f01bd73433b9fe504785836d617dfd8cd2c6d435b998390569f99800cf435acf6bdd3ff3ba4b783f5aa51ca7ff5ea532f45e85fb8711e0031ff38600d25e476ae631703fe69f0abc17280bf18ff77f13dad3b7e1de92cf018e997f0033643f6fd9ee3db9ccc8d7317a7df5cfe79d322f3e9f6342ec8ed56b37857600f9de936db0be18c2bf847bcfb199e0bfca9799a91d8c0e390ec3354a9a04ec001f6dd8e731c0918638dba27af23da8536fc2bda7ee7b2af417cba53f940bef000f7bd7c7c7537de6f680d70added129f4f385f8e677b8ec06b9dfefbbdb6f3003d4abdb6efe0f0dd20f6094bcd3d5b24713e02be6379d7e0f30c954537cf6b00758eba290c57a35dddefa8f0fe8cb7f68c13c7f51c8b804f779b88fa7ea50c00f8f05985f974cf4fc27789ede1c3398a38b787f94ccceb191a81af1cf8385d0047e0d3bdae79d4391315c0c7e93a019fe635d223cf8b1a067cf8ee967f75af00c91c757dc6b0b5d5bb009feef5b5719decf6f085adadde15f85206f82e66fd00e604a48b039fee359de35eeb35a873f1e1ff8c70ba12837cd9ae5bb826ade600e77d7fae15be5fc9552e78df8965441bbe0f31bd8e6e95c2c7f1b03587bb190064892b2cb9ca2f8caf3bf0695eff3885ef83dbc317b626f235c0a7fb9927ea00b337be5be674d7029fee679cb8d7fa7b402e3e7ceee174d7019fdef72d01df0088087c23818fd3f5003edddf77e260b33d7ca3808fd3f504bed106f84645e0001b0d7c9cee7ae0d3fc3ec8e71b1d810fdfa170ba1b80ef4e037c6322f0dd09007c9cee46e0d3fd8e270e36dbc33716f838dd4dc037ce00dfd8087ce3808fd300dd0c7ce30df08d8bc0371ef838dd2dc09736c0373e025f1af838ddadc037c100005f3a02df04e0637d2fe09b68806f4204be89c0c7e97a03df24037c1323f0004d023e4e87ff19799701be4911f8ee023e4e773bf04d36c0775704bec9c0c700e9ee00be2906f82647e09b027c9c0e9f6ba71ae09b12816f2af071ba01c07700b75e3efff96d6a04bebb81659a5e96ea38e4df1e9669c0728f5e969401fffc006f9bd335e74979ccf0da9e1f664fc0fee9505e333497570c6c72be1c473ec7007a75b312cb5485330ec74db5808f75f71864892b2cb465ebebc2f8f05cce3400c0372302df4ce00bab6bb3f4f2f9d7ad9911f86601cb1cad2c55fe77d959110058e600cb6cad2cc1754baf7fc135666e4859b29d04ecc7733e57b36f31b0c900f9721cf91cab6375ac8ed5b13a56c7ea581dab6375ac8ed5b13a56c7ea581d00ab6375ac8ed5b13a56c7ea581dab6375ac8ed5b13a56c7aa9f9558662a9c7100386ea6057cac9b6d9025aeb0d0966d9c48181f9ecb7906f8e646e09b077c6100756dbe01be7911f8e603dfbc10be0506f8e647e05b007cf343f816eae5f3c7004c2d88c0b71058166b6509fe176f610496c5c0b2482b4b30664aaf7fc198a900252165c97612b01fcff912cdbec5c026e7cb71e473ac8ed5b13a56c7ea581d00ab6375ac8ed5b13a56c7ea581dab6375ac8ed5b13ad642612596050a671c8e005b60011feb161964892b2cb4657bcf1ec687e772a901be2511f896025f585d005b66806f6904be65c0b734846fb95e3eff9bceb2087ccb8165a55e167ffd9600e511585602cb0abd2c2903fef9df7456859425db49c07e3ce7ab34fb16039b009c2fc791cfb15eddacc4b24ce18cc371cb2ce063dd0a832c718585b66cfd5200181f9ecbd506f85645e05b0d7c61756d8d5e3eff1ab33a02df1a6059a79525001837b02602cb3a6059ab9525b8c6e8f52fb8c6d4796dcb92ed24603f9ef33a00cdbec5c026e7cbf13a73767dffeb73f85f1fc2519f47ff91afbdacd30b88d50095ab2b5757aeae5c5db9ba7275e5eacad595ab2b5757aeae5c5db9ba7275e500eacad595ab2b5757aeed672596d50a671c8e5b6d011febd61a64892b2cb465007b771fc687f5aec1005f7d04be06e00b6b17eb0df03544e05b0f7c9c0edbc20006bd7cfe77a2f511f83600cb26ad2cc19afc1b22b06c02968d5a5982ef447a00fd0bbe936c0e294bb69380fd5827376bf62d0636395f8e23df95c85a5740ac00ae0e98617575c0b1ba3ae0585d1d70acae0e385657071cabab038ed5d501c700eaea80637575c0b1ba3ae0585d1d70acae0e385657071cabab038ef572d701006259af70c6e1b8f516f0b16ea34196b8c2425bb67122617c58efb618e0db1c00816f0bf085b58b46037c5b22f03502df9610bead06f81a23f06d053e4e876d00759b5e3e7fccd4d6087cdb8065bb01966d1158b6034b935e969401fffc3153003b42ca92ed24603fd6c91d9a7d8b814dce97e3c85728acc4b255e18cc3715b002de0635d934196b8c2425bb6f613c687e7b2d900df8e087ccdc01756d776ea00e5f3fb9fe6087c3b81659701969d115876014b8b5e969401fffcbe7077485900b29d04ecc773be5bb36f31b0c9f9721cf90a8595589a15ce381cd76c011feb005a0cb2c41516dab2b59f303e3c977b0cf0ed8ec0b707f8c2eada5e037c7b2200f0ed05be3d217cfb0cf0ed8dc0b70ff8385d1cf8f61be0db17816f3ff071ba0012837cc4d24d61e9a6b090dd037aedfad7b5fd5efbcbe500940b96116d71d8008fcc070d94d501858fe307818975dd0cb2c415965ce517c6d71df80e19e03b001881ef10f071ba6b80efb001be4311f80e031fa7bb16f88e18e03b1c81ef0800f071baeb80efa801be2311f88e021fa7eb017cc70cf01d8dc0770cf8385d4f00e03b6e80ef5804bee3c0c7e9ae07be1306f88e47e03b017c9cee06e03b698000ef4404be93c0c7e96e04be5306f84e46e03b057c9cee26e03b6d80ef5404be00d3c0c7e96e06be7b0df09d8ec0772ff071ba5b80ef8c01be7b23f09d013e4e00772bf09d35c0772602df59e0e374bd80ef9c01beb311f8ce011fa7c3e78af3007af9fcfbd37311f8ce03cbfd7a59fcf5cccf4760b91f58eed3cb9232e05f9200f27c40739e94c7835edbf3c3ec09d8ff0094d7839acb2b0636395f8e239f6300bdba5989e59cc21987e3ce59c0c7bafb8045775f403e0f947971de1d84cce9009cb1a9f95ea39afce76b5e27992f33b0ad623866423cc3b5407295c07e3e5700780f83e74ff7bd66cc6b7daf948638db2a015f4e038beefbca98d7fabe286d00995d13f7f951ee534f996349e2bd2fda31f16c18e5d9e68441167c5e423b9a009fd7fd7e6990cc8bf3a6f6bfb9b331dffc7e89cf23f74b83145f8be19801d0002f6d0be9970cb683a4dafe4ac12edbc267ce7b8145f3bb816402388a3c63e70027d5def721bc75b18865bc452ca32c62e96d114b95452c375ac4526111cbb50016b10cb288a5ab452cfd2d6229b688658a452c698b58465bc472d622966a8b00586eb3886598452c3759c432d82296eb2c62895bc4b2d522960e16b12cb3880065aa452c632c62b9dd22961a8b586eb68865b8452c3d2c621962114b89452c00fd2c62e96811cb7a8b58eeb488e50e8b586a2d62b9c52296a4452c3d2d622900b3882561114b378b583a59c4b2c02296be16b198fcd61d9565ac452ca516b1008cb088e5568b585216b1989c4f109565a8452cdd2d62e96c11cb6a8b58665a00c432ce22963e16b18cb488a5d222965e16b1945bc432c022961b2c6219681100cb3516b1c42e334bdc6b3b0e16e7299682eeb80ce3d8c863327c1274452136008a65f838e8f8db19e741cfadf34bda3214419aa3325c1cc2702284f568485a00d3658e76d210675b25c070d402966b2c62196811cb0d16b10cb088a5dc2296005e16b1545ac432d222963e16b18cb38865a6452cab2d62e96c114b778b5886005ac472bd452c298b586eb5886584452ca516b18cb588e594452c7d2d62596000114b278b58ba59c492b088a5cc22969e16b1242d62b9c522965a8b58eeb08800e54e8b58d65bc4d2d122967e16b19458c432c422961e16b10cb788e5668b58006a2c62b9dd22963116b14cb5886599452c1d2c62d96a114bdc2296eb2c6219006c11cb4d16b10cb388e5368b58aa2d62396b11cb688b58d216b14cb188a5d8002296fe16b174b5886590452cd75ac4526111cb8d16b15459c4d2db2296511600b18cb788a58b452c45796239ee65b634c44f805dcdfff9e2af83aef97f6efc003544f9ff6a780d51e6665bc570cc247961e3b11af81f39c7e4ef11381f279400e30cf8908c291c5dc02edbc2ffcbe163291dff975047998e8fe903bef331d300c1f712d00f067ff9bf9386808eff73aa0c74fcdf5d4341c7ff37560e3afe8f00b40ad0f1ffba0d031dff17dd70d0f1ffe62541c7fff597021dffd71f8fa9c300ff07c57910baff3b37e65df83f519b808fffd3733be8385c053a4e530d3afe009fd71ad035ca702de8b6c8f008d06d96e191a0e3ffd21e053afedfefd1a0db0020c36340d720c37782ae5e86c782ae4e86c7816e9d0c8f07dd5a194e836e8d000c4f01dd2a19e6f77b747e57283a3abfcb95fc9297b6f9e797ed70be1c5f0e007c2b657805e8383c1398972a3a625e628079a9c2ccf125c0c7fc4b41c7e10500c0bc58d111f32203cc8b15668e2f023ee65f0c3a0e2f03e6858a8e98e71b60005ea830737c3ef031ff42d071783530cf5374c43cd700f33c8599e373818ff900e7818ec3eb81798ea223e6d90698e728cc1c9f0d7ccc3f07741cde0accb314001d31cf30c03c4b61e6f80ce063fe59a0e3f059c37c3b14be1d0a9f29bb2b1500bb2bf36477b96277799eec2e51ec2ec993dd458add4579b23b5fb13b3f4f7600e72a76e7e6c9ee6cc5eeec3cd9bddaeaf3e5ea37aeb6fa7cb9fa8dcbd58edc0075303f76dd75303f76afb6eb607bdaef34bd76fdffce9ce1b5de624a3c0de10069c0325d731918f0cf7fdd760ff0cf50fc48c0fe23e0db3d9a7d8b814dce9700e3c85728ac71d01d041def3f00babb65783fe826cbf03ed0dd25c37b4137490086f7806ea20cef06dd0419de05ba7332bc0674e7657815e8ee93e195a0e3ff00335c013afedfc9e5a0e3ff5c5c0aba87647809e81e96e1c5a07b44861781ee007d32bc10748fcaf07cd0bd5f86e781ee31199e0bbac765780ee89e90e1d9a000fb800ccf00dd93323c1d741f94e123a07b4a865b40f7b40cef04dd3332dc0c00ba0fc9f00ed03d2bc3db41f79c0c3781ee7919de06ba1764b811741f96e12d00a07b51863783ee2519de04ba97657823e83e22c31b40f78a0c3780ee5519ae0007dd4765b80e74afc9f03ad0bd2ec36b41f731199e053afec6360d743c0e0400db2a8f9bbc1b743cb67f32e878ced75da0e379c99340c7df1927828ec7594c00001d8f4b3c073a1e3b7f1e740919be0f743ce7eb7ed0f1b7ae0740c7eb783c00083a1edbf010e8785ce2c3a0e3f1ea8f808ee731bd0f743ceff751d0f13a1900ef071d8f1d780c743ceeef71d0f178f02740c7f3843e003a9e57fb24e878ed00870f828ebfcd3f053a1e57f734e878bcf533a0e379381f025da90c3f0b3afe000ef71ce8facaf0f3a0eb27c32f808ec7037d1874bcb6c78ba0e375505e02dd0020197e1974fc9def23a0e3ef7caf80ae4c865f05dd5019fe28e8ca65f835d000f177bed741c7dff9b82d523b30f15d9b6cf11c59deb2dd97e1b7eee37a59fc00efd22780210d360681dda39acb806c1d53ec3207db4a4039f1b1d4bff0f50900ff47f3908172e17b1ffe5ecf0c6c0bbf5957cace90fb30d6d37626c487c3ca007171081f86e3d8d649c88fefbf8a200d7e97df0fe1234a1a2ad3d3ca71f89d009ced5099f27d595afe262f654b05f7eb7b819d6dee0136b6bf173876e9e49000758fef2f395faeeb788fc93a3e96aeb3fc3fb3546685f83fd37afbb2cae4a500f46527b5b204cf989afbeaa4fe3eb7ce1f12720ccae494523609d87f1ccaeb0098e6f2c2be9ff3e5f8317376fd211d4773f87f3484e3681efd3f6acc6e8dff0018712487ff474238348f73cbeaff11637647f8c3810ee7f0ff700887e6f16c0059fd3f6ccc6ecabf0e1ecae1ffa1100ecdf73859fd3f64ccee28bffd1fcce100ffc1108e8379f4ffa031bb35fef93f90c3ff03211c07f2e8ff016376d7fbfe00efcfe1fffe108efd79f47fbf31bb35fed0c77d39fcdf17c2b12f8ffeef336600b7d2f77f6f0efff78670eccda3ff7bcdd9f55f05eec9e1ff9e100eadcf633900fcdf63cc6e957fffb33b87ffbb433876e7d17fe46b2febf1cbcc6ac0aedf560077e5f07f5708878967f60bf98f7ced6535fd7e2117ab7ebb0d7ebfd292c3ff0096108e963cfadf62cc6eca9f8eb03387ff3b433876e6d1ff9dc6ecd6f89f93009a73f8df1cc2d19c47ff9b8dd9adf1a78fecc8e1ff8e108e1d79f47f8731bb00297f0ad1f61cfe6f0fe1d89e47ffb71bb35be59fffa61cfe37857098986f750021ff9b8cd9adf5fddf96c3ff6d211cdbf2e8ff366376ebfc7b95c61cfe3786007034e6d17fe46b2febb1cbccaadfee48ff1dc0961cfe6f09e1d89247ff91af00bdac072e33ab7ebbebfda99f9b73f8bf398463731efddf6cccee3affbaba290087ff9b423836e5d1ff4dc6ecaef5a7cd6dcce1ffc6108e8d79f47fa331bbb500fe7565430eff3784706cc8a3ff1b8cd91de94fe96ec8e17f430847431efd6f003066b7daf7bf3e87fff5211cf579f4bf1eeceafec61f83fc792ccc40a50c8a00e1987f57c6c284951da7a7710aa7437ca8d3ea43309e67dd057ca8031ff89800ff021f3a835e178f011ffd71053ca694c6aadc1be21fefffef78e6b8ff91e100389c8333904fe792b6fb79cb36d683cb8c7c5da5d7d724ce4de2f3b92ac4ee000abd765bcd898a49611bac2f46361e10ebb55ea381cb9799714d093c0ec3f5004a9a04ec5f63d8e755c0918638dba27af27f50a7b8cee8ef8f827abec66b5b002e03a15c783f8e7dd2dddea85cd67aadcb45ed5388e59cc249c5c47514c78900ad31c0b74ee1e3f81ae063dd09e0633fb03f990363df783c2eaec9c3636fcb00209f618a8eb2186ec04fb6c3f9721cd7e92997e161f9e5ab6c2f5f85c2472c0029cd6515079bbc65ebc353c092d4cc62c03f1fb112f8872b7e24607f29f85600a9d9b718d8e47c398e6b3de93ebf31c89faf8b7d9532288663ca643fdd5d6100c3b2e3f4b8b670a5e1b2abf05a975d4588dd1a8365c7f9723f5763d86e956200b75cb14bed16eb136dd9da6d15f0566be6a53c6bf5e6e9dfcff19a605c6fd9004639f832d240d98f80f28c810dd617437802dccf8dcc04ff75edc3b5ce6a42008ec3704a499380fd35867dae058e34c4d9165def6be11e4e739df7cf778dc200c0f172d0d78694570d9417ef1f063abe27a9045d9992471cf2c16bbfe67a9d00cae6279e77d655015f6d08df08bd7c95d9eac208e0635d35b098e8075516be00f6603fd857293faaab6f015767bd5cd5389f92b76c7d6f67f8eda4b98c681e0026cf6bac5bdbd83867d7bac64d7553766dab6bd9d4b42d06741da174682b0600c22208a39e8fc599a11d41c733433b81ae48f11a67a976815fb5c4b4561b8200e8e705b7741cefef65ba748a0f50e20395f82025fd71257e52899f56e2679400f839257e9f127f40893fa4c41f51e28f2af1c794f8134afc4925fe94127f4600893fabc45f50e22f29f15794f86b4afce34afc534afcb34afc0b4afccb4afc00ab4afc1b5eebf8b795f8f794f80f95f84f94f8cf95f86f94f81f94f81f95f8009f95f85f94f8bb324ec21befa306438d8f1a1b352e6a4cd468a8b9f3b46aea008669da34ddaad3b4689a064dd39ea93ba069cd348d99a62dd334659a964cd3009069da314d33a669c5348d98a60dd334e13b80e107f2b7d40ba601f7f582b60044ed87da0cb5136a1b7459a5db61ba1cd1ed0e5da6e9b69c2ebdf4a840cf5e007479a5cb2e5dc6e85241dd3675d37429a15b0b1afb4fcbb7d272adb43c2b2d00c74acbafd272ab692f985e3ed10ba6a3d334f5c95eb0c4ea542f98de4ed3de00a779c1b20533bc6089529a324fcb1dd03208b43c022d9b40cb29d052a0b4d400022dc1404b33d0920db494032db749cb3cd0ab2b7a4d47afb26839cb355ef000ba639d17bcbea1d735f43a9fbe7f6df0824f3bf4798b3ef1d1674efa2c4dcb0033d250021a4e41434a68580d0d2da2e15534c48c86d9d1b0481ac64a430e690038330de9a6cfc434b49fa637d0140f9ae672d40b3ef553bf43af62a8bfa1d700e5d4cfd0ab5cea5f68b945ea57687a3df527347d9efa119a1e4ffd074d7fa7007e83a6b7537f41d3d7a99fa0e9e9d43fd0f473ea17687a39f507347d9cfa01009a1efeac174cff7ede0bda3e4de77ed10bdafdcb5e301d9bdafcab5e30bd9a00da3b4d9fa6e9d2d4d63f21e4935ed0ce3f2de4335ed0c63f27e4f35ed0bebf0028e44b5ed0b6bf22e40d2f68d75f13f2752f68d3df14f22d2f68cfdf11f25d002f68cbdff782ba4aedf847427eec056df8a7427ee605edf717427e29e44d2100bf12f26b2fb835a0b6fc5b21bf13f27b2f68cb6f7b411bfe9317b4dd77bca000cdfed50bdaeadf84fc5dc83f84fc53c87b5e6629839897d9be26237d647c6d004b4bc3d6ed2da52d4da55b7735b66cdadeb8af74cfa6968da54dbb1b9ad7370036edc1c42df2f2c9eb034c686e5ebbaf74d3b6fa86bda54dbb5a4a9bd697ae006bdab5ad7e27267aaae8122c3e2713f76e9b786d7dfd85d37d5aa6e31514ee00c9cef8b98b71ec2b17936862d78b48948a5f44a27fbb9844ff7931898694b4003391f7fff9ff659b0d070200122ffb5900000023ff1f8b08000000000000ff00ed9d077c1c35f6c7b5dec44ed64ee8900638092440daae7bfaa6170204482300dd8eedf438c54e2f4eeff4bbe30a9d038eff1dd73b5c3fae72bdf7de7b2fdc00dd5f9ad1637f9627bb9e44da6812cde7f33e2bbd19e97d9f46a3d18e349ac20018638399bfc5b95ccdda6f31f99b96bfc933db521af34a9ae48c4584b32022009cf18870768a0867e78870164684b328229c5d22c2d95523a7602b606d37dd00bc0903e5aa9bb19845e3dc974484b35b4438bb4784f38288705e1811ce8b2200c2797144382f8908e7a511e1bc2c229c974784f38a8870f6880867cf8870f6008a0867ef8870f68908e79511e1bc4a23a760539f33eae6bdda40b9ea662c8d000063df0830f68b0063ff08305e1301c66b23c03820028c0323c0785d0418af008f00e30d11601c1401c6c111601c1201c6a111601c1601c66404185311602c008b00637904182b22c0581901c6aa0830564780b126028cc323c03822028c230023c0382a028ca335325ec332db18f93b56e11d277fc7cbdf09f277a2fc9d24007f274b5f3bc9f8142e53b94ce3325deea342b991cb0c2e3771b999cb2d5c660072b995cb6d5c6ee7328bcb6c2e73b8cce5328fcb1d5ce67359c0652197455c00167359c26529975a2e755c9671a9e7d2c0a591cb722e2bb8ace4b28acb6a2e006bb8ace5b28e4b1397f55c3670d9c8651397662e2d5c3673d9c2652b976d5c00b64b5f4aa52f3bb8ece4b28bcb6e2e7bb8b472d9cb651f97fd5c0e7039c8e5001097c35c8e7039cae51897e35c4e7039c9e54e2e7771b99bcb3d5ceee5721f0097fbb9bc82cb2bb9bc8acb035c5ecde5354a99bf96cbebb83cc8e52185f361002e8f707994cb635c1ee7f20497d7737992cb535c9ee6f2062ecf70f93f2e6f00e4f2262ecf72793397b770792b97b771793b9777707927977771793797f77000792f97f771793f97e7b83ccfe503acedf9ff20970f71f930978f70f928978f0071f9389717b87c82cb27b97c8acba7b97c86cb67b9bcc8e5735c3ecfe50b5c00bec8e54b5cbecce52b5cbecae56b5cbecee51b5cbec9e55b5cbecde53b5cbe00cbe57b5cbecfe5075c7ec8e5475c7ecce5275c7ecae5675c7ecee5175c7ec900e5575c7ecde5375c7ecbe577d2179aebf47b2e7f50747fe4f22719feb3fcfd008bfcfdab72ecdfb8fc5d86ff217fff297fff257fff2d7f5f92bfff91bfff9500bfff93bfd4d8c4e46f81fc8dcbdf4ef2b7b3fc2de4bf2f14fbe12296d9d2f2003779265b65b2bab367d4cf6b0c6bbb25a00ce818a18b932ba0a3fa5d00bace005217075d2165073af2ab33e8ba485d21e8ba4a5d11e81252d70574b2b8585700a913f997485d5afe26cf64ab48d68a3cbbe9cc53ce9deb2ef32a017f2e90ba006ea0bb50eaba83ee22a9bb0074174bdd85a0bb44ea2e02dda5527731e82e9300ba4b4077b9d45d0aba2ba4ee32d0f590bacb41d753eaae005d2fa9eb01bade0052d713747da4ae17e8ae94badea0bb4aeafa808ec6c9ae045da9d45d0575a400afd4a5e56ff24cb68a54a3c8b39fce3ce53ce00fb08c1f63247f01e8c64a5d001c7469a9eb04ba7132d21974e3a5ae107413a08c483751eaba806e92d4750500dd642873ca6398d672aea816792675e6c973157996e9cdd31bb32d6799f24d00838d24944f855ebb29b41b934236481f87f04896d92a204ced6a19c45301c70061789892a604f6a70cfb5c061c6988932d5135b1dc35d7cb3afdf5b23c793e00d7cb692cb3611da3fbf0b9542fc70083de7a596da05e969dd7f5722ecb6c5800c7a8df762ed5cb19c0a0b75e0eaf73f7f1ac5be87ad9c0321bd631fa9f702e00d5cbf9c0a0b95e36baf632eb16ba5e6e62990deb18fd2f3d97eae50a60d05b002feb1a5dff32eb16ba5eee65990deb183d073997eae56660d05b2f1b0cd4cb0064d9f95c2fef62990deb183d773b97eae50160d05b2f1b53ae5e66dd42d7cb00075966c33a46cf79cfa57a79af0c8be7987f96cf347b83ee2f52d707747f9500ba2b815f739dae72753aeb16ba4e3fcb321bd64f1a573897eaf4e3322ceaea003f645d2d05dd3fa5ae2fe8fe2575fd40f76fa9eb0fba97a4ee1ad0fd47eaae0005dd7fa56e00e8fe27750341478314d7812e2675d783ae40ea6e005d5cea060081ae93d40d065d67a91b02ba42a91b2a75e2990e8db97c4aea8a209fb4fc4d009ed9e68d05122f6d31259e86f060732cc91260413b43f5da294f40d977c4e700a1c0a2b55de55b02f2ef08cb3060d1dc1e7bfd9694de3cbd733a4429c704d8001902fe68be1778ed538ab52d478a635b9952ca3601fb91af5c2f5f59b6f6b3001cf882ee5fbaef9bc2e7fe4ad988e6e7eb6053f375e8ddabe93aa7f5b18881006cc5e1989dc519ae6f0397ee365170d17d87f2a5b8c1f6ef7cb3ebd5b96b14003be2dcfe046ceaad73a946ac73a27fb8071882eadc44a873bf90ba62d83f080074941eefebb6b473828fdab7547ef9ca3aca9754f80cdc8f5238f790f2757600f5df4f307f71edd0f54276e2b0ffd30599e35e02a6417a99cac2f6fb06192b009fb264d87e7719b0e8ae2326cebf81fe9257a72a02ce4fd0ffde7228afb3f100bfd7b13a56c7ea581dab6375ac8ed5b13a56c7ea581dab6375ac8ed5b13a5600c7ea58a3c48a63f938c72568acfc6cf191cee4d886f099e616e158f9c958c600a6de67f465de583995b918b72c0506b21587631e8e65b8ee91611cb7c4314a0075dcd2c03c17effce13c9734c4c95631f0e39c1bcdf30e52589694efb96bb7006c9989f78ac4bbb0e2fd7baa4f49c50f9c4b3350d1893af96241c65fdde3590061c7d60c8ebfb699d38676f48e8df9ed03b545a2684b59a67d3070df48514000d8ad94798976a92f6bdf2ec7e19867e489e8ceccdd274e35de5d01e550a9d7006e12e7fb3259fe746d90ad0484e95891ae0acaaf14caaf12ca8f8e791bb4eb00b3e11ad23d6703e7863060c52d0d611c9fd67b4efdb1f2b2102c789e358f4100a70cd4d9a489fa28f2a862edcf0ff695687f25945795e6f252af8b34c491cf00b13a56c7ea581dab6375ac8ed5b13a56c7ea581dab6375ac8ed5b13a56c7ea0058a3c28aef951367028e4b59c097877905deb37b5a7383f21663171360ecc200e458188da90c507c8dc3317b0b325c5364b898b59f4b70aaf3a7f9d97dd6f30047b68ac1171cef30319e56aeb09cbb76fdb172bdd76366ac9cea5395e2079d00531c2b261d8ef3e15a40387fa35cd19dadf381d74c39e8288cefd3ea2e63c100572df3a2759f68fc9b6cc5e19825b24c691cba5a338f89765de45123f3eac400dad7a738ecaf8736ad518683da2fb1bf25603f6dd9c659a9cc84af23f4faea009d4ffa3e009dcf11017647e9b59b42bbb48e17d9207d1cc2cd0599f218950900be5cbec42cae83e101c761b842495302fb871bf6790470a4214eb6443d59090075aa05eedfbaef7fe82f96cbb5502eb41ffb2e26fa5135c051cadab7293827009238c575447514dbe4e106f8aa812f0df1e1c0473a9c87427e607b82f317cf00d7f94987e1be1034a787d20e00664df5bf0d7395c2acf615704ed009e55e6600a23f7aaa395506ff67b5397754fe34a78a6c2558fbff7c6a5fa094b5ffff83007d81fba15d7b01fa5a542fb1ff5fa9e84cb53be8771ae2640bfb5ae877e52900fcc6759cf4f6757c5ee2eaac70902dacaf0f29d7580d30a7817918a4a5631e0085b48cb56d9f69ee29f647ab94e3f4f755ca02fb2ad43e8c001fe898a794eb0075a4661e03fd31afba635fa02cc03fdaff46b89e9e85be259d8372c8e7f98000fdb465eb7b5299095fc7e8f5d53b9ff4ed533a9f6302eca6f5da4da15dea7b0052dea48f43f8b982e0b2a1f22566711d8c0e380ec3354a9a12d83fdab0cf63001426f57c8a7af256a853cf43df53779f0afdc5721900e542fb839ef5d1f1a2003ed3f580f70addd725fe3fa17c299eed7f04deebf4f7f7dabfaf53cada3f8300c36783f81e0d3e1bd4bc065812df471804365f3467d32b0bfa7618e5db4d6100381feddab296313e772b00be2106f80687e01b027c942e0e7cbadf4f3add750091f13f7027e0d3fd0ed9e9ae955c02e93a039feef5931360b3237c49e0a3740085c067e2bda86408be14f0e1dac3f4abf99d93d4e9be7382f7df2ec0a7fb9e0016f63d94a0359c5ffeb634d3ff8c1ec7023ac287e3a6784f263eddcf11c23e005fc67111fc4f678a2fdb7dcbe0738e327caed09172c17e279691d8829e879800fecf4ff952bc1a9848d7cd204b4261c9557e417cdd81afc6005f7508be1ae000a37417009feeff3c61ff7be3b3654a7721f0e9fe8f93606dc70372f1e1ff1e004a7711f0e97ddee2f38d08c13712f828ddc5c0a77b7c27c1da7e6b3b17df2800e0a3749700df68037ca342f08d063e4a7729f0697e1ee4f18d0ec187cf502800dd65c037d600df98107c63818fd25d0e7c69037c6343f0a5818fd25d017ce3000cf0a543f08d033ed2f700bef106f8c685e01b0f7c94ae27f04d30c0373e0400df04e0a374bd806fa201be0921f826021fa5eb0d7c930cf04d0cc13709f828005d1fe09b6c806f5208bec9c047e9f0db74530cf04d0ec13705f828dd55c03700d500df94107c53818fd25d0d7cd30cf04d0dc1370df8281dfeaf9d6e806f5a0008bee9c047e90602df8d7af9bcff6fd343f0dd082c37e965a94840fe1d61b900095866e8654919f0cf1bdbbc59739e228f5b58fbf343ec25b0ff6628af5b340097570c6c52be14473ec77a7eb30a96e90a67028e9b6e011fe966186449282c0062cbd6d605f1e1b99c6980ef96107c33812fa8aeddaa97cfbb6fcd0cc1772b00b0dcae95a5dc1b97bd3504cbedc0729b5616ffbea5d73fff1e332ba02cc94e0009ecc7733e4bb36f31b049f9521cf91cab6375ac8ed5b13a56c7ea581dab630075ac8ed5b13a56c7ea581dab6375ac8ed5b13a56c7ea581dab6375ac8ed5b1003a56c7aa9f55b0cc54381370dc4c0bf848779b419684c222b66cf34482f8f0005cce36c0372b04df6ce00baa6b730cf0cd0ec13707f86607f0cd35c037270400df5ce09b13c0374f2f9f37676a6e08be79c0325f2b8bff5dbc792158e603cb001d5a59fc39537afdf3e74c2d08284bb25302fbf19c2fd0ec5b0c6c52be1447003ec7ea581dab6375ac8ed5b13a56c7ea581dab6375ac8ed5b13a56c7ea581d00ab638d0aab6099ab7026e0b8b916f091ee0e832c0985456cd99eb307f1e1b9005c68806f4108be85c01754d71619e05b18826f11f02d0ce05bac97cf1bd3590014826f31b02cd5cbe2addfb23804cb526059a2972565c03f6f4ca796b52f4b00b25302fbf19cd76af62d0636295f8a239f633dbf5905cb22853301c72db280008f744b0cb2241416b1656b9782f8f05cd619e0ab0dc157077c41756d995e3e00ef1e5317826f19b0346865f1e70d2c0bc1d2002cf55a59fc7b8c5efffc7b4c00634059929d12d88fe7bc51b36f31b049f952bcd19c5dcfffe539fc5f1ec0b1003c8ffe235f47596f8e10ab2b5757aeae5c5db9ba7275e5eacad595ab2b575700aeae5c5db9ba7275e5eacad595ab2b5757aeae5c3bce2a58ea14ce041c576700011fe9ea0db2241416b1657b761fc487f56e8501bee521f856005fd075b1d20000df8a107c2b818fd2e1b5b04a2f9f374eb43204df2a6059a395c55f937f5500089635c0b25a2b8b3f4ea4d73f7f9c646d4059929d12d88f7572ad66df62600093f2a538f29d8bac8d11627575c00cabab038ed5d501c7eaea80637575c0b100ba3ae0585d1d70acae0e385657071cabab038ed5d501c7eaea80637575c0b100ba3ae0585d1d70ac67bb0e0896950a67028e5b69011fe9561b6449282c62cb00364f24880febdd3a037c6b43f0ad03bea0eba2c900dfba107c4dc0b72e806f00bd01bea6107ceb818fd2e1b5ba412f9f37676a7d08be0dc0b2c900cb86102c009b8065a35e969401ffbc3953cd016549764a603fd6c966cdbec5c026e54b7100e48b0aab6059af7026e0b8f516f0916ea3419684c222b66cd74f101f9ecb1600037ccd21f85a802fa8ae6dd6cbe7b53f2d21f83603cb56032c9b43b06c0596002d7a595206fcf3dac26d016549764a603f9ef36d9a7d8b814dca97e2c817150056c1d2a27026e0b8160bf848b7c5204b4261115bb6eb27880fcfe576037cdb0042f06d07bea0bab6c300dff6107c3b806f7b00df4e037c3b42f0ed043e4a970000be5d06f87686e0db057c94aed8209f60e9a6b074535884dddd7aed7af7b5005dace3e5b21bca05cb486c09d88fcc7b0c94d56e858fe27b808974dd0cb2240014965ce517c4d71df85a0df0ed09c1d70a7c94ee02e0db6b80af3504df5ee000a3741702df3e037c7b43f0ed033e4a7711f0ed37c0b72f04df7ee0a374170300df01037cfb43f01d003e4a7709f01d34c0772004df41e0a3749702df21037c000743f01d023e4a7719f01d36c0772804df61e0a3749703df11037c8743f01d00013e4a7705f01d35c0772404df51e0a3743d80ef9801bea321f88e011fa5eb00097cc70df01d0bc1771cf8285d2fe03b6180ef7808be13c047e97a03df4903007c2742f09d043e4a87ff2beed4cbe7f54f4f86e0bb1358eed6cbe2ad677e67000896bb81e52ebd2c2903fe25459ef768ce53e4712f6b7f7e88bd04f6df03e50075afe6f28a814dca97e2c8e758cf6f56c17252e14cc071272de023dd5dc0a200bb2d103e5f27f3a2bc3b71195194b1a9b9af5121fca77b5ea1cc9718c8561c008e599fc8708d915cc5b09fce15f661f0fce9ee6bc658dbbe521ae264ab187c00390a2cbafb9531d6b65f94b6ccae897e7e987eea11732c49ecfba21d13ff0d00c3fcb739649005ff2fa11dcdffd7bd76e97a9917e52daeff5945c67cf3da25003a8fd42e5daff81a87636641bb342fa05d32781d24d5ebaf14ec922dfccf79000c58343f1b489600470133767e521d7d1e42db788b584659c45265114bd22200963e16b10cb088e5728b582eb488a5ab452c718b58a659c432c12296d116b1009cb088a5da229694452c832c62b9d222962b2c62596f11cb4516b1242c62590064114b278b58a65bc432c622961a8b58ca2c62196c11cb5516b1f4b088e562008b58565ac4526c11cb7516b15c6b114b678b58c65ac432dc2296728b58865800c472b5452c3d2d62b9c42296128b58ba59c472bd452c8516b1ccb588e5068b00584c8e758765495bc432c22296fe16b15458c432d42296528b587a59c462f2003d8bb02cdd2d62a9b388a5c822969916b15c6311cb388b58465ac45269114b005f8b58fa59c432cc2296de16b15c6611cb0516b10cb488a58b452cb1b3cc920060ede72ae3bba4a5a0a379be387f95debd3d0cba82001b34ffe920e868ac9500f228e4f25c717b86024843ef22c703180e05b0ee0f486bbaccd14e1ae264ab001818f65bc0d2c522968116b15c6011cb6516b1f4b6886598452cfd2c62e96b00114ba5452c232d62196711cb3516b1ccb488a5c822963a8b58ba5bc472a945002cbd2c6229b58865a8452c1516b1f4b7886584452c698b588e58c47283452c00732d6229b488e57a8b58ba59c4526211cb2516b1f4b488e56a8b588658c452006e11cb708b58c65ac4d2d922966b2d62b9ce2296628b58565ac472b1452c3d002c62b9ca2296c116b19459c4526311cb188b58a65bc4d2c922964516b1242c0062b9c82296f516b15c6111cb9516b10cb2882565114bb5452c272c62196d1100cb048b58a659c412b788a5ab452c175ac472b9452c032c62e963114bd22296002a8b584659c432de2296823cb1e03764d2103f0476f7e9b5eb7d4f60afde3c00bdb5785b655e85325fe2265b713866acbc99d0bc11d28b8de6efee83f371480039ae88e9ff2697f0a11f6b7b3efa39bb67cdaee63aaae59b66fb80cfc437eb00f686e0db639005bf938676347fe7d05b379ce63050dee2d9d4ecae199b7abf0067906a14657a5ce6456d1531047dcfa006d60dbf4372e1bae1ad2cb31d031f00a8cd3a0e79d2fe45d0fee1b707e83fbcd0d17ae4834147734f8680eeb00c0f00051ddd4786818edad524e8e8fe96021dd5f132d0515d28071dd58b0ad0d13900a439bef87d4f7c8f4ff7775863aced7744d310df017cf4fd4bfc762885ab40004769aa4147df6bad011d7d637638e8e8bbb8234047dff01d093afaeef028d000d1778747838ebee93d0674f41df2b1a0a36fa6a74147df791f07ba26191e0f00ba75323c01746b65781ae8d6c8303dcb16e77795a213e77785c2923cb3cd3b00bf6487f2a5f80ae05b2dc3ab4047e199c0bc5cd109e64603cccb15668a3702001ff12f071d85e7027383a213ccf506981b14668ad7031ff137808ec28b80790099a213ccb506989729cc14af053ee25f063a0ad701f3524527989718605eaa0030537c09f011ff52d0517825302f56748279a101e6c50a33c517021ff12f06001d85d703f302452798e71b605ea030537c3ef011ff02d051f88461be5d0adf002e85cf94ddd58addd579b2bb42b1bb224f761b15bb8d79b25bafd8adcf93dd005ac56e6d9eec2e51ec2ec993dd858add8579b27bbed5e7b3d56e9c6ff5f96c00b51b67eb3a72f7c1fcd875f7c1fcd83ddfee831db97ee7e9b5eb7d877a3e6b00bb657b663a0f58eed05c0606fcf3c66ae668ce53e4311bca64be523625b07f000e94d76ccde515039b942fc5912f2aac09d01d031ded3f0aba59328c6be7dc002ec38741779b0ce33a39b7caf001d0dd22c3fb4147df7fdf07ba9b64782de80066c8f01ad0dd28c3ab4137558657816e8a0caf00dd64195e0eba4932dc08ba008932dc003afa0e703de8e87bcfcb4047df58ae051d7d0f7929e8e8bbd54b400047df6c5e0cbafb647821e8ee97e1f9a07b850cdf01ba57caf01cd0bd4a86f70082ee0119de03ba57cbf06ed0bd46867781eeb532bc1374af93e11da07b508600b783ee2119de06ba8765782be81e91e12da07b54863783ee31196e01dde33200dc0cba27647813e85e2fc31b41f7a40c6f00dd5332dc04baa765781de8de2000c30b405720c3f340179761bc56690ef42cd0d13b43b783ae50866f035d910c00df0a3a5a37e916d0d19ca99b4147738c6f021dbd07330374f47ee48da0a3f70037a7828ec6d0a7808ed62a9a0c3a9a3335097434c77822e8e8dd13fc4e37bd001f89df5ea77516ee021dad4b7437e8687ed43da0a339bcf7828ede33b90f7400f42ee4fda0eb25c3af001dad41f44ad0d1fca357818ee6eb3e003a7aa7e4d500a0a3f71e5f03ba52197e2de8facaf0eb404763d90f82aebf0c3f043a5a63e50061d0d17b628f808ee6743d0aba8132fc18e8e8bdaec74147ef1e3f01ba1b6400f8f5a01b24c34f828ec61d9f021d8d3b3e0d3a1a77a46b515c07fac76dfdf100f1e3aced96adaf47f6058bdeefa9fb63c8c780210d366e00bb87b5daf5fb21004714bbc441b64a58fb6f4be398702bf0ed37502ed4dfa0b17575bd84381c3300493686d486915e6c7d037c50e70625207c008e235b7b213fbaef16409afdb0007f37840f2a69700ec86eb0b34bb1a37d6c3be5f7d777023bd9dc016c647f2700706cd3c921eb1ef52b285faaebd8b7201d1dabcee7d03d8f4ed83cc2da6ed900da059c5b77502f8b370fee1030a4c1067eb743ef75e79f9b038a5de2205b2500504e78add0b57014f85a0d940b5d4bd42e1003d98ac331b54abb407ab11d0f00f0419dab9480f05e38ae55860f437e743d17409a56d88fcf35f6296944991e00558ec33925644794295d0f69f99b3c934db60b3b809d6c6e0736b2bf0338b600eae490758fae7fca97ea3afebf201d1d2bda8559459932a3f38afdcea38a4e001c7ec400ff51d6969fe278efa1fb2c5e277adbb2b2e499b465bafb1a06daea00a4fe36b7dc9b7a7500cae488523625b0ff2094d701cde5856d3fe54bf103c600ec367aedc0fe1cfeef0fe030710f3a95fffb8dd9adf0a629eecbe1ffbe008e007d79f47f9f39bbde63b1bd39fcdf1bc0a17b7e7536fff71ab35be93d3e6ccd00e17f6b00476b1efd6f3566b7ca9b8eba2787ff7b023874cf19cfe6bfb9b9ea00296f5af1ee1cfeef0ee0d03c973dabffbb8dd9adf0a62defcae1ffae008e5d0079f47f9731bb75def4f39d39fcdf19c0b1338ffeef3466b7ae4ee4b12387ff003b02384cccc13f95ff3b8cd96df0a6e86fcfe1fff6000eadffc772f8bfdd9800dd2aefd58d6d39fcdf16c061e2f9d0a9fcdf66cc6ebdd7ffd99ac3ffad011c0026fe079fcaffadc6ec56d78a3cb6e4f07f4b00c7963cfabfc598dd06affddb009cc3ffcd011c9bf3e8ff6663762bbdf3df92c3ff96008e963cfadf62ceae7700ff6fcee17f730047731efd6f36667799f7fc63530eff3705706ccaa3ff9b8c00d9adf3daff8d39fcdf18c0b1512b4776ff371ab35be3f57f36e4f07f4300c700863cfabfc198dd5aef95d4a61cfe37057034e5d17fe4eb28eb8eb3ccaadf6e00b9f7ac665d0effd70570accba3ffeb8cd9adf4faea6b73f8bf3680636d1efd00275bfaedd67bcf2a689ea1d882fca7fdc8b1462b4776ffd718b35be3ddab5600e7f07f7500c7ea3cfa8f7c1d656d3dcbacfaed5679fdea5539fc5f15c0b12a008ffeaf3266b7deeb57acc8e1ff8a000e13effe9fcaff15c6ecd679fdeae53900fc5f1ec0b13c8ffe2f3766b7cc3bff8d39fc6f0ce030b18ec2a9fc6f3466b700d61b576cc8e17f430047431efd6f00bbbae722e05a108532dfeb943288c331007de424e6ee0a1b961da5c7f56dd007cdeb5954e0da10aa0ff5e0031dd30f7c002802bd2e1e033e7a7d4a7a0f42cca93916e01fed1f589c39ee7a194ec03938000ef9d404eca72ddb9c142a33e1abe6753392b806059dcf2501764dae7d1193004236481f8770354de8676ddfc7a3f2c5353e96061c87e106254d09ec5f6ad800e753bdc348b6443d190c758aea8c81b94329f417cbe53a2817da8f73b44cac009153cbda968bdaa60896930a27ae8783f3d9961ae03bd57a384b818f748780008ffcc0f66444518675a856567fbe38ad5146d733bd1741b6e270cc54e51e43007ab1f595bf945e1c3a58392e01615c578d6c0d021dad933604d2962b3a512600155acbc43f7f6487f2a538aeb5466bb695e797afaca37c650a5f118435b178006555a6b004d9ad3660572d03aa43d586ed562a76538add049c07dab2ddaf71005dbe2acdbc22cf1abd797a7d005a6f8fda0cb291025f4668f605ed521f806c00903e0ee155d007189109bedcaee03a82d501c761b842495302fbab0dfb5c03001c6988932d718f5802f77dcd75de3bdfd50a03c553a0af0928af6a282fda3f000c74d4de97836e88924702f2c1765573bd4e65f313cf3be9708dcd9a00bee1007af9cab2d585e1c047ba2a60d1dd0e328585eef9d8065ea3949da8a73f916100ec1be03d7fa8528e229f5440d99669f627c6dad6e534c4711d56aabba9fcf2009575942fa9f099e81f2558db7bbed8b2dddf2a804577ffc3807f5e11e23dbe004cf1a304f697826f959a7d8bb1b6fd8834c4b1cf60a2ff4bf9d3fdbdbf5206007138e63ee53f4150d9517aec37571a2ebb246b5b76c900bb26ee216aff90da00b91ac376ab14bbc314bb61fba526ef1f06ee8f49ec0f52bd251bc3c097910600ca7e0494670c6c903e0ee167a05f3a32137cf9de876b59d7041c87e10a254d0009ecaf31ecf370e048439c6c89fbfdc3d02f35f13fe454fd217c2e313ca0bc00b03f47fb53a0a33e4925e882faa579e8f7a54eb7df9780fdc8a7f93f4a59b600ba3002f84887ff974cb4832a0bdd7bb01decaf949fa8ab5f07ae22bd5c15b800b60d6dd9dade22f82dd45c466229005a636659ed9a35335bead6ac5c36b96500ddb2e6954deb6240d7194a476c71202c8030eae9585ca5a733e8bac87021e8000a14af71c5a02ef0ab9698d66a2320c631bf4b47f1f12cd3a48bf804253e5100894f52d23fa2c41f53e24f28f12795f8d34afc1925fe4625feac127f8b127f009b127f87127f97127f8f127f9f127f4e897f40897f58897f4c897f42897f5a0089bfa8c4bfa0c4bfacc4bfa6c4bfa9c4bfa3c4bfafc47fa4c47faac47fa1c4007fadc47fa7c4ffaac4ffa9c4ffadc4ffa3c4ffa7c463313f4e9fa260b04f5c0030e2e213179bb8b8c4c5242e1a71b9d31257a219164b5889aeba58a24a2c49002596a012cd8158624a2c29259690124b468925a27a307f0928b1e49358e249002ce9249670124b365d2dd9fa327fc925d1a48abffc6209a501cc5f22490c6700886507c49224e2962abac2e25624ba3ae2162dbae4e2b62bfe2688bf86e2d6002a6eb9e216266e13a2c9164db4b88d886e85f854c768f0fd53f2579487f81400479af9d7f078e65fabe2fa14d7e464e62fcf3595f99fd398cefc65bd66307f001930b13c9858364c7c8e422c2926961a134b9089a5c9c49265626939f1d9870079cc5f7a4e2c4927963c13c370e2d30a62d8510ccd2d65fed04d1df38777c4007094187e12d31396337f9a8af8448098ae23a62c892966629a9d986a28a65b008aa5f8c51459314d584c9516d3c5c59479f1da80787542bc3e225ea111af110089e9a9e27532f14a9d78ad50bc5ad9cafc576cf731ff556bf1bab978e55e0c00311d66fe340031342786a8c550e809e60f858965c5c4326262d930b14c985800164c2c032696fd12cb7c8965bdc4325e0f307f992eb12c9758864b2cbb259600d912cb6a8965b41e61fe3259a29d7b9cf9ed9b58e64ab46b4f31bf3d13cb54008976ecff98df7ebd89f9edd69b99df5ebd95f9edd4db99df3ebd93f9edd2bb0099df1ebd97f9edd0fb99dffe3ccffc76e7835c3ec4fc36e7235c3ecafcf6e600e35c5e607e5bf349e6d719d1ce7c86cb6799dfc67c8ecbe799dfbe7c91cb970098dfb67c85cb5799dfae88eec13798dfa67c8bcbb799df9e7c97cbf798df9600fc80cb0f99df8efc98f98fbb441bf2332e3f677efbf14b2ebf627edbf11b2e00bf657ebbf17b2e7fe0f2472e7fe2f2672e7f617e1bf2372e7fe7f20fe6b72100ff627edbf112f3db8cff32bfad108d8168230ab8c4b974e2d2994b612cf3f7003cc632db1b64a4af8cd7363737ac5ddf5cdadc54bab6654df3caf56bb6956e0059d9bca2b46973c3c6c6354d5b30f16279dbee29e3e3366eacdd56ba725d7d00c3d6d2a696e6d2a6c6d2baa69675f59b30d1a18233b0785c26eed33e716d7d00fda9d33d28d3d12a7ad3b2333e723a8e3d793a89c6743d8d441313a79168e900e924ea5d7c1a89fa9e4ea229a793e8de8e2662ff0f44890a9f572d0200dbaf0010c3000000240b1f8b08000000000000ffed9d05781c3716c7b5dec44ed64e00ca6da8ad93b469dad0aed9c10d3649296d430d1bc371c00e3353b977d7837200afed518ff97acc773d666666861e48337addbfe5f1ae2791369a44f37def5b00e9cd48eff7341a8d76a4d114c6181bcefc2dcee54ad6718bc9dfb4fc4d9ede0096d29857d224672c229c0511e18c4784b35b4438bb4784b330229c4511e1ec001111ce9e1a39055b016bbfe9e64d182857dd8cc52c1ae7be24229cbd22c2d9003b229ce74584f3fc88705e1011ce0b23c2795144382f8e08e72511e1bc3422009c974584b34f4438fb4684b35f4438fb4784734044382f8f08e7151a39059b00fa9c5137ef9506ca55376369041807468071500418074780f1aa08305e1d0100c6211160bc26028c4323c0786d0418af8b00e3b008300e8f00e38808308e8c0000e3a808302623c0988a0063590418cb23c0581101c6ca0830564580b13a02008c351160ac8d00e3e808308e8900e3d808308ed3c87815cb6ce3e5ef04857700a2fc9d247f27cbdf29f277aafc9d267ded26e3d77399ce65069799721f15ca000d5c6ee47213979bb9dcc26516975bb9dcc6e5762eb3b9cce13297cb3c2ef300b9dcc1650197855c167159cc650997a55c9671a9e352cfa5814b2397262ecd005c967359c1652597555c567359c3652d97755c5ab8ace7b281cb462e9bb8b4007269e3b299cb162e5bb96ce3b25dfa522a7dd9c16527975d5c7673d9c3652f00977d5cf67339c0e52097435c0e7339c2e52897635c8e7339c1e524973bb9dc00c5e56e2ef770b997cb7d5ceee7f20097977079299797717990cbcbb9bc422900f3577279159787b83cac703ec2e5512e8f71799ccb135c9ee4f26a2e4f7179009acb335c5ec3e5b55c5ec7e5f55cdec0e5592e6fe4f2262e6fe6f2162e6fe500f2362e6fe7f20e2eefe4f22e2eefe6f21e2eefe5f23e2ecf71793f6b7ffe3f00c0e5835c3ec4e5c35c3ec2e5a35c3ec6e5e35c3ec1e5935c3ec5e5d35c3ec300e5b35c9ee7f2392e9fe7f2052e5fe4f2252e5fe6f2152e5fe5f2352e5fe7f2000d2edfe4f22d2edfe6f21d2edfe5f23d2edfe7f2032e3fe4f2232e3fe6f213002e3fe5f2332e3fe7f20b2ebfe4f22b2ebfe6f21b2ebfe5f23be90bcd75fa3d00973f28ba3f72f9930cff59fefe45fefe5539f66f5cfe2ec3ff90bfff94bfff0092bfff96bf2fc8dfffc8dfffcadfffc95f6a6c62f2b740fec6e56f37f9db5d00fe16f2df4f14fbe12296d9d2f237793a5b65b2babb67d4cf6b3c6bbf25a00c00e818a18b932ba0a3fa5d00baee5217075d2165073af2ab3be87a485d21e87a004a5d11e81252d70374b2b8584fa913f997485d5afe264f67ab48d6893c7be900cc53ce9deb2df32a017fce93ba5ea03b5fea7a83ee02a93b0f74174addf9a000bb48ea2e00ddc5527721e82e91ba8b4077a9d45d0cbacba4ee12d0f591ba4b0041d757ea2e035d3fa9eb03bafe52d7177403a4ae1fe82e97bafea0bb42ea0600808ec6c92e075da9d45d017564a0d4a5e56ff274b68a54b3c87390ce3ce53c00e0f7b38c1fe3257f01e826485d1c7469a9eb06ba8932d21d7493a4ae10749300a18c483745ea7a806eaad4f504dd342873ca6394d672aea816792675e6c97300157996e9cdd31bb32d6799f24d838d24944f855ebb29b41b934236481f87f0001896d92a204ced6a19c45301c761789492a604f6a70cfb5c061c6988932d510035b1dc35d7cb7afdf5b23c792ed7cb192cb3611da3fbf0d9542fc70383de7a00596da05e969dd3f5721ecb6c58c7a8df7636d5cb1b81416fbdacad77f7f1ac005be87ad9c4321bd631fa9f7036d5cb05c0a0b95e36bbf632eb16ba5e6e6299000deb18fd2f3d9beae50a60d05b2feb9b5dff32eb16ba5eee63990deb183d0700399beae56660d05b2f9b0cd4cb64d9b95c2fef66990deb183d773b9beae5410060d05b2f9b53ae5e66dd42d7cb875866c33a46cf79cfa67a799f0c8be7987f0096cf34fb83ee2f523700747f95bacb815f739dae72753aeb16ba4e3fcb321b00d64f1a57389beaf413322ceaea3f645d2d05dd3fa56e20e8fe25758340f76f00a91b0cba17a4ee2ad0fd47eaae06dd7fa56e08e8fe2775d7808e062986822e002675d782ae40eaae035d5cea8681ae9bd40d075d77a91b01ba42a91b2975e200990e8db97c4aea8a209fb4fc4d9edee68d05122f6d31259e86f070732cc9120060413b23f5da294f40d977c5e791c0a2b55de55b02f2ef0acb2860d1dc1e7b00fd9694de3cbd733a4229c704d81901fe68be1778ed538ab52f478a635b995200ca3601fb91af5c2f5f59b6f6b31cf882ee5fbaef9bc2e7c14ad988e6e7eb600053f375e8ddabe93aa7f5b188816cc5e1985dc519ae6f0397ee365170d17d8700f2a5b8c1f6ef5cb3ebd5b9ab143be2dcfe046ceaad73a966ac73a27fb807180082eadc54a873bf90ba62d83f0c74941eefebb6b473828fdab7547ef9cabaca009754f80cdc8f5238f790f27576f5df4f307f71edd0f54276e2b0ffd30599e3005e00a6617a99cac2f6fb86192b9fb264d87e7719b0e8ae2326cebf81fe925700a72a02ce4fd0ffde7228af33f1bfd7b13a56c7ea581dab6375ac8ed5b13a5600c7ea581dab6375ac8ed5b13a56c7ea58a3c48a63f938c72568acfc4cf191ce00e4d886f099e616e158f99db18c4dbdcfe8cbbcb1722a73316e590a0c642b0e00c73c12cb70dd2bc3386e896394eab8a581792edef9c3792e698893ad62e0c70039379ae71da4b02c29dfb3d76e598389f78ac4bbb0e2fd7baa4f49c50f9c4b00738da21375f2f9828cbfbac7b3c28ead191c7f6d37a70dede81d1bf3db076a008b44d196b24cfb60e0be91a280b05b29f312edd240d6b15d8ec331af9527a2003733779fe86cbcbb02caa152afdd24cef765b2fce9da205b0908d3b1225d1500945f29945f25941f1df31668d7e7c035a47bce06ce0d61c08a5b1ac2383ead00f79cfa63e5652158f03c6b1e834e19a8b34913f551e451c53a9e1fec2bd1fe004a28af2acde5a55e176988239f6375ac8ed5b13a56c7ea581dab6375ac8ed500b13a56c7ea581dab6375ac8ed5b1468515df2b27ce041c97b2802f0ff30abc0067f7b4e606e52dc62e26c3d885c9b1301a5319a2f81a8763f61564b8ae97e10062d6712e4167e74ff3b3fbace78f6c15832f38de61623cad5c61397bedfa6300e57aafc7cc5839d5a72ac50f3aa738564c3a1ce7c3b58070fe46b9a23b53e70003af9972d05118dfa7d55dc682af5ae645eb3ed1f837d98ac3314b6599d2380074b5661e13edbac8a346e6d58d75ac4f71d8df086d5ab30c07b55f627f5bc0007edab28db35299095f47ebf5d53b9ff47d003a9fa303ec8ed56b378576691d002fb241fa38845b0b32e53136137cb17c89595c07b501c761b842495302fb6b000dfb3c1a38d210275ba29eac843ad506f76fddf73ff417cbe56a2817da8f7d001713fda81ae028651ddb149c13499ce23aa23a8a6d72ad01be6ae04b43bc1600f84887f350c80f6c4f70fee2b93a3fe908dc1782e6f450da21c0aca9feb76300ae5298d5be02ce093aa9dccb4cf4473b9b5365f07f56bb7347e54f73aac856008275fccfa7f6054a59c7ff3fd8177800dab58f435f8bea25f6ff2b159da9760007fd4e439c6c615f0bfdaeecc46f5cc7496f5fc7e725aeee0a07d9c2fafab000728dd500731a9847415a3ae63148cb58fbf699e69e627fb44a394e7f5fa52c00b0af42edc368f0818e795ab95ec768e631d01ff3aa3bf605ca02fca3fdaf8700ebe959e85bd23928877c9e0bd84f5bb6be279599f075bc5e5fbdf349df3ea500f3393ec06e5aafdd14daa5be27e54dfa3884df57105c3654bec42cae83710100c761b846495302fbc719f679bcc2a49e4f514fde0c75ea39e87beaee53a1bf00582e43a05c687fd0b33e3a5ed467ba1ef05ea1fbbac4ff27942fc5b3fd8fc0007b9dfefe5ec7f7754a59c76770f86c10dfa3c167839ad7004be2fb08c3c0e600f3e66c7a6541df0ea37c7b290ce7a25d5bd632c6e76e05c037c200dff0107c0023808fd2c5814ff7fb49a7ba2e32fe07ee067cbadf213bd5b5924b205d77e000d3bd7e72026c76852f097c94ae10f84cbc17950cc197023e5c7b987e35bf7300923ad5774ef0fedb03f874dfd3c2be8712b486f38bdf9666fa9fd1e358405700f870dc14efc9c4a7fb3942d8e7cb382e82ffe94cf165bb6f197cce5186cf1500ba522ed8efc432125bd0f310d3fff9295f8a570313e97a196449282cb9ca2f0088af37f0d518e0ab0ec157037c94ee3ce0d3fd9f27ec7f6f7cb64ce9ce073e00ddff7112acfd78402e3efcdf43e92e003ebdcf5b7cbed121f8c6001fa5bb1000f8748fef2458fb6f6de7e21b0b7c94ee22e01b67806f6c08be71c047e92e06003ecdcf833cbe7121f8f0190aa5bb04f82618e01b1f826f02f051ba4b812f6d00806f4208be34f051bacb806fa201be7408be89c047fa3ec037c900dfc4107c0093808fd2f505bec906f82685e09b0c7c94ae1ff04d31c0373904df14e0a37400fd816faa01be2921f8a6021fa51b007cd30cf04d0dc1370df8281d7e9bee7a00037cd342f05d0f7c94ee0ae09b6e80effa107cd3818fd25d097c330cf04d0f00c13703f8281dfeaf9d69806f4608be99c047e9ae01be1bf4f279ffdf6686e000bb01586ed2cb529180fcbbc27213b0dca8972565c03f6f6cf366cd798a3c6e00611dcf0fb197c0fe9ba1bc6ed15c5e31b049f9521cf91cebb9cd2a58662a9c0009386ea6057ca4bbd1204b4261115bb6b62e880fcfe52c037cb784e09b057c004175ed56bd7cde7d6b5608be5b81e576ad2ce5deb8ecad21586e0796dbb4b200f8f72dbdfef9f798d9016549764a603f9ef3d99a7d8b814dca97e2c8e7581d00ab6375ac8ed5b13a56c7ea581dab6375ac8ed5b13a56c7ea581dab6375ac8e00d5b13a56c7ea581dab6375ac8ed5b13a56fdac826596c29980e36659c047ba00db0cb2241416b1659b2712c487e7728e01bed921f8e6005f505d9b6b806f4e0008beb9c03727806f9e01beb921f8e601dfdc00bef97af9bc3953f342f0cd070096055a59fcefe2cd0fc1b20058eed0cae2cf99d2eb9f3f676a614059929d1200d88fe77ca166df626093f2a538f23956c7ea581dab6375ac8ed5b13a56c7ea00581dab6375ac8ed5b13a56c7ea581d6b545805cb3c853301c7cdb3808f747700186449282c62cbf69c3d880fcfe522037c0b43f02d02bea0bab6d800dfa210007c8b816f5100df12bd7cde98cee2107c4b8065995e166ffd962521589601cb0052bd2c2903fe79633a75ac6359929d12d88fe7bc4eb36f31b049f9521cf91c00ebb9cd2a58162b9c09386eb1057ca45b6a9025a1b0882d5bbb14c487e7b2de00005f5d08be7ae00baa6b0d7af9bc7b4c7d08be066069d2cae2cf1b6808c1d200042c8d5a59fc7b8c5efffc7b4c734059929d12d88fe7bc59b36f31b049f95200bcd99c5dcfffe539fc5f1ec0b13c8ffe235f57596f8e10ab2b5757aeae5c5d00b9ba7275e5eacad595ab2b5757aeae5c5db9ba7275e5eacad595ab2b5757ae00ae5cbbce2a58ea15ce041c576f011fe91a0db2241416b1657b761fc487f56e008501bee521f856005fd075b1d200df8a107c2b818fd2e1b5b04a2f9f374eb4003204df2a6059a395c55f937f55089635c0b25a2b8b3f4ea4d73f7f9c646d400059929d12d88f7572ad66df626093f2a538f29d8daccd11627575c00cabab03008ed5d501c7eaea80637575c0b1ba3ae0585d1d70acae0e385657071cabab03008ed5d501c7eaea80637575c0b1ba3ae0585d1d70ac67ba0e0896950a67028e005b69011fe9561b6449282c62cb364f24880febdd3a037c6b43f0ad03bea0eb00a2c500dfba107c2dc0b72e806fbd01be96107ceb818fd2e1b5ba412f9f3767006a7d08be0dc0b2c900cb86102c9b8065a35e969401ffbc3953ad016549764a00603fd6c956cdbec5c026e54b71e48b0aab6059af7026e0b8f516f0916ea341009684c222b66cd74f101f9ecb36037cad21f8da802fa8ae6dd6cbe7b53f6d2100f83603cb56032c9b43b06c05962d7a595206fcf3dac26d016549764a603f9e00f36d9a7d8b814dca97e2c8171556c1d2a67026e0b8360bf848b7c5204b426100115bb6eb27880fcfe576037cdb42f06d07bea0bab6c300dff6107c3b806f7b0000df4e037c3b42f0ed043e4a9700be5d06f87686e0db057c94aed8209f60e900a5b0f4525884dddd7aed7af7b55dacebe5b21bca05cb486c09d88fcc7b0c9400d56e858fe27b808974bd0cb22414965ce517c4d71bf8f61ae0db13826f2ff00051baf3806f9f01bebd21f8f6011fa53b1ff8f61be0db17826f3ff051ba0b8000ef8001befd21f80e001fa5bb10f80e1ae03b1082ef20f051ba8b80ef9001be008321f80e011fa5bb18f80e1be03b1482ef30f051ba4b80ef8801bec321f88e00001fa5bb14f88e1ae03b1282ef28f051bacb80ef9801bea321f88e011fa5eb00037cc70df01d0bc1771cf8285d5fe03b6180ef7808be13c047e9fa01df4903007c2742f09d043e4ad71ff8ee34c0773204df9dc047e9f07fc55d7af9bcfee9009d21f8ee02967bf4b278eb99df1582e51e60b95b2f4bca807f4991e7bd9af3001479dcc73a9e1f622f81fdf74279dda7b9bc626093f2a538f239d6739b55b000dca97026e0b83b2de023ddddc0a2bb2d103e0f957951deddb88c2ecad8d4dc00d7a810fed33daf50e64b0c642b0ec7ac4f64b8c64bae62d84fe70afb3078fe0074f73563ac7d5f290d71b2550cbe1c0316ddfdca186bdf2f4a5b66d7443f3f004c3ff5a8399624f67dd18e89ff8661fedb1c36c882ff97d08ee6ffeb5ebb7400adcc8bf216d7ffec2263be79ed129d476a97ae557c8dc331b3a15d9a1fd02e0019bc0e92eaf5570a76c916fee73c0e2c9a9f0d244b80a380193b3fa9ae3e0f00a16da6452ce32d62a9b188a5cc2296e116b10cb088e5528b588658c472be45002c2b2d62e969114bdc2296a116b14cb088a5d62296728b584658c472b9452c009759c47281452c098b58aeb588a59b452cf32c62b9ce221693cf4fc2b2a42d0062196d114b85452c232d62b9c222963e16b15c68114bb1452cf516b174b78800e56a8b586659c432d122963116b1545ac432ca22962b2d62e96b11cb4516b1009458c4d2cb2296428b582659c432d62296c116b15459c492b488a5d422967e0016b1989cc31f96a5b7452c4516b1ccb088e52a8b58265bc432ce22969316b100545bc432d022964116b1a42c621966114b7f8b582eb18865bd452ce759c472008d452c3d2c62596c114bec0cb32458c7b9caf82e6929e8689e2fce5fa5776f008f80ae20c006cdf339043a1af7a53c0ab93c57dc91a100d2d0bbc8f10086c30001ac0702d29a2e73b4938638d92a06860316b02cb688a587452cd758c4729e00452ceb2d62b9c42296fe16b10cb388256511cb208b58065ac4526d11cb498b0058c659c432d92296ab2c629961114b91452cbd2d62b9d822967e16b1945ac40092b488a5ca2296c116b18cb5886592452c8516b1f4b288a5c422968b2c62e9006b11cb9516b18cb288a5d222963116b14cb4886596452c575bc4d2dd22967a008b588a2d62b9d022963e16b15c6111cb488b582a2c62196d114bda2296a31600b15c6711cb3c8b58ba59c472ad452c098b582eb088e5328b582eb788658445002ce516b1d45ac432c12296a116b1c42d62e96911cb4a8b58ceb7886588452c00975ac432c02296e116b19459c4526311cb788b58665ac452902716fc864c1a00e287c1ee7ebd76bdef09ecd39ba7b716ef5e9957a1cc97b8c9561c8e99206f00b2342781f462a3f9bbfbe17c1c568e2b62fabfc9257c18c4da9f8f41ceee1900b3abb98e6af9a6d97ee033f1cdba7d21f8f61864c1efa4a11dcddf39f4d60d00a7e76294b7781e34a767c6a6deef19a49a45999e9079515b450c41df33a8810075c3ef905cb86ef85e96d98e830fd4669d803c69ff6268fff0db03c358267f005a8f7c38e8e879e608d01d91e191a0a3fbc828d051bb9a041ddddf52a0a33a005e063aaa0be5a0a37a51013a3a8734568bdff7c4f55f747f8735c6da7f4734000df11dc047dfbfc46f8752b80a7494a61a74f4bdd61ad0d137666b4147dfc5001d0d3afa86ef18d0d17787c7828ebe3b3c0e74f44deff1a0a3ef904f001d7d00333d0d3afacefb44d0b5c8f024d0ad93e1c9a05b2bc33340b74686a9af26ce00ef2a4527ceef0a8525797a9b777ec90ee54bf115c0b75a8657818ec2b3807900b9a213cccd0698972bcc146f063ee25f0e3a0acf03e6264527981b0d30372900cc146f043ee26f021d8517037383a213cc7506981b14668ad7011ff137808e00c2f5c0bc4cd109e6a506989729cc145f0a7cc4bf0c74145e09cc4b149d605e0064807989c24cf145c047fc4b4047e1f5c0bc50d109e6050698172acc145f00007cc4bf1074143e69986f97c2b74be1336577b56277759eecae50ecaec893dd0066c56e739eec362a761bf364b74eb15b9727bb4b15bb4bf36477916277519e00ec9e6bf5f94cb51be75a7d3e53edc699ba8edc7d303f76dd7d303f76cfb5fb006057aedff97aed7adfa15ec0da6fd99e99ce07963b34978101ffbcb19ab99a00f31479cc813259a0944d09ec9f0be535477379c5c026e54b71e48b0a6b027400c74147fb8f816eb60ce3da39b7cbf011d0dd26c3b84ecead327c1074b7c8f00001d0d1f7dff783ee26195e0bba1b65780de86e90e1d5a09b2ec3ab4077bd0c00af00dd34195e0ebaa932dc0cba2932dc043afa0e7023e8e87bcf0da0a36f2c00d7818ebe87bc0c74f4ddeaa5a0a36f362f01ddfd32bc08740fc8f002d0bd440086ef00dd4b65782ee85e26c3fb40f7a00cef01ddcb657837e85e21c3bb40f7004a19de09ba57c9f00ed03d24c3db41f7b00c6f03dd2332bc15748fcaf016d0003d26c39b41f7b80cb781ee09196e05dd9332bc0974af96e18da07b4a86378000ee69196e01dd3332bc0e74af91e185a02b90e1f9a08bcb305eab34ef7836e800e83d9ddb415728c3b781ae48866f051dad55740be8682ed9cda0a379bd3781008ede83b91174f4aee60da0a37749a7838ec6d0af071dad0f340d74347f6b2a00e8685eef14d0d17b30f89d6e7a5713bfbd4eeff0df0d3a5a7fe71ed0d1fca8007b41477378ef031dbdf3723fe8e8bdcc0740d74f865f023a5a6be7a5a0a3b900502f031dcdd77d1074f47ecbcb4147ef60be0274a532fc4ad00d94e157818e00c6b21f02dd60197e1874b466c623a0a377d61e051dcd757b0c74d7c8f0e3a000a3f99c4f808ee6b33f09baeb64f8d5a01b26c34f818ec61d9f061d8d3b3e03003a1a77a46b515c07fac76dfdf1f113acfd96adaf47f6058bdeefa9fb63c8c70081210d36ae03bb47b4daf5fb214715bbc441b64a58c76f4be398f05ee03b6000a05ca8bf4163ebea3b38713866aa6c0ca90d23bdd80606f8a0ce0d4a40f820001c47b6f6417e74df2d80340760ff6e081f52d2e01c90dd6067976247fbd87600caefafef0476b2b903d8c8fe4ee0d8a69343d63dea5750be54d7b16f413a3a00569dcfa17b1e9db07994b5dfb2b50b38b7ee905e166f1edc616048830dfcc600a2deebce3f370715bbc441b64aa09cf05aa16be118f0ed35502e742d51bb40000c642b0ec7d429ed02e9c57622c00775ae5202c2fbe0b8bd327c04f2a3ebb90000d2ec85fdf85c63bf924694e931e5389c5342764499d2f59096bfc9d3d96400bbb003d8c9e6766023fb3b8063ab4e0e59f7e8faa77ca9aee3ff0bd2d1b1a2005d985d9429333aafd8ef3ca6e8c4e1470df01f63edf9298ef71ebacfe275a200b72d2b4b9e4e5ba6bbaf61a0ad4eea6f736bbdc70707a14c8e2a655302fb0f0041791dd45c5ed8f653be143f68ceae374def400eff0f047098b80775e63ff2007595f5d01966d56fb7d99b26b83f87fffb0338f6e7d1fffdc6ec567ad347f700e5f07f5f0087eeb9e0d9fcdf67cc6ead77fef7e6f07f6f00c7de3cfabfd79800ddaa7a91c79e1cfeef09e0d03dbf3d9bffe6e6d5377953a077e7f07f77008700e679f759fddf6dcc6ebde7ffae1cfeef0ae0d89547ff7719b35be74d95df9900c3ff9d011c3bf3e8ff4e6376ebbce9f43b72f8bf2380c3c4fb029df9bfc39800dd4aafafba3d87ffdb0338b4fe77cce1ff7663766bbdd74cb6e5f07f5b0087008967599df9bfcd98dd06effeb73587ff5b03384cfc67efccffadc6ec367bed00ff961cfe6f09e0d89247ffb718b35be9f9bf3987ff9b033836e7d1ffcdc6ec005679ed7f5b0effdb0238daf2e87f9b31bb8dde2b66ad39fc6f0de068cda3ff00adc6ec367bd33a36e5f07f5300c7a63cfabfc998dd2aef59cdc61cfe6f0ce000d8a89523bbff1b8dd92df7feff6fc8e1ff86008e0d79f47f8331bb7575228f00961cfeb70470b4e4d1ff167376bdfbdfba1cfeaf0be0589747ffd719b35be700d5ffb539fc5f1bc0b1368ffe932dfd76cbbd57a7699ea1d882fca7fdc8b146002b4776ffd798b3ebf5ff57e7f07f7500c7ea3cfabfda98dd4a6fcc72550eff00570570accaa3ffab8cd96df4dabf1539fc5f11c061e27dfacefc5f61cc6ead00e7fff21cfe2f0fe0589e47ff971bb3dbe0b57fcd39fc6f0ee030b1364167fe00371bb35be63dff6acae17f530047531efd6f3266b7c2abff8d39fc6f0ce03000b1ce4367fe37825dddf31bf03db04299ef50a50ce270cce57262746f850dcb008ed2e39a39e84383561ffcb94c759df8d0003ed03183c18722a67dfd8b0a03003e7acf6997c9bcc43c9de301fed1fea1c599e3ae93e1049c8313904f6dc07e00dab2cd73a13213be2ed1eb6b12df99a3f3b924c0ee42bd76dbbdab1793423600481f87700dbd24c0daaf6941e58beb6d2c0d380ec38d4a9a12d8bfd4b0cf9d00ad2142b6443d1901758aea8c81f94829f417cb6528940bedc7795fbaafb7a000f560d43645b004bd1f457514e7c89958afa64ee1a3f852e023dd61e0233f9600c95f714e47176558476a65f5e7a0d3ba67743dd3bb16642b0ec7cc50ee31a40017db40f94be9715ddb51e0238571ad36b2350c74b4f6da08485baee844995400682d13fffc911dca97e2b87e1bad03579e5fbeb2aef295297c4510d6c4e295005599c21264b7da805db50ca80e551bb65ba9d84d297613701e68cb76bfc6b500feaa34f38a3c6bf4e6e9f501680d3f6a33c8460a7c19add917b44b7d00b24100fa388457431f607426f862bb826b1356071c87e10a254d09ecaf36ec730d7000a4214eb6c43d6219dcf735d779ef7c572b0c144f81be26a0bcaaa1bc68ff2800d0517b5f0eba114a1e09c807db55cdf53a95cd4f3cefa4c3753b6b02f86af500f29565ab0bb5c047ba2a60d1dd0e328585eef9d8065ea5949da8a73f9161ec001be03d7fa4528e229f5440d99669f627c6dad7e534c4716d57aabba9fcf2950075952fa9f099e81f2558fb7bbed8b2dddf2a804577ffc3807f5e11e23dbe4c00f1a304f697826f959a7d8bb1f6fd8834c4b1cf60a2ff4bf9d3fd7db05206710038e601e53f4150d9517aec37571a2ebb246b5f76c900bb26ee216aff90dab9001ac376ab14bba314bb61fba526ef1f06ee8f49ec0f52bd251ba3c0973106ca007e3494670c6c903e0ee1d741bf744c26f8e2bd0fd7c7ae09380ec3154a9a1200d85f63d8e75ae048439c6c89fbfda3d02f35f13fa4b3fe103e97a80d282fec00cfd1fe14e8a84f5209baa07e691efa7da953edf725603ff269fe8f5296ad2e008c063ed2e1ff2513eda0ca42f71e6c07072be527eaead781ab482f5705ae9700435bb6b6b7087e0b359791585e80d6ad69a85bb366565bfd9a950dd3dad63500b4ae6c591703baee503a628b03610184514fc7e2ca3fdd41d743860b4157a000788dab10f5805fb5c4b4561b013191f95d3a8a4f6299265dc4272bf1294a7c00aa92fe5125feb8127f52893fa5c49f51e2af55e2af57e2cf2af13729f1b72800f1b729f17728f17729f1f728f1f729f1f72bf10f29f18f2af14f28f14f2bf100e795f81794f89795f8d794f83795f87794f8f795f88f94f84f95f82f94f8af0095f8ef94f85f95f83f95f8bf95f87f94f8ff94782ce6c7e9f3160cf6890b46005c7ce262131797b898c445232e775a364b34c362592cd15517cb5e8965aec400b256a23910cb568965aac4b25462192ab1ec541fe62f2b25969112cb46896500a2c4b2506219a82b25db40e62fe3249a54f1975f2ccb3484f9cb2e89e10cb100948158e644dc52455758dc8a445747dca245975cdc76c5df04f1d750dc5ac5002d57dcc2c46d4234d9a28916b711d1ad109fff1807be7f4afe8af2109ff7480033ff1a9ec4fc6b555c9fe29a9cc6fc25bfa633ff131d3399bf54d88dcc5f5a004c2c39269622139fb810cb9489e5cbc4b26662b933b10c9a58ae4e7c4a623e00f397b313cbdc89213831dc283ed72086e5c4d0ce32e60febd4337f284a0c3d0089a909627ac672e64fd3119f1d10d395c4942d316d4d4cdd13d317c5144eb100bcbf98ca2aa6f38a29cd625ab798da2ea6f78b571cc46b1ee25517f1ba8f7800e549bcf6255e7d13afff895720f732ff55d8fdcc7f255abcc22e5e0d17434c0047983f0d400ccd89216a31147a92f9436162a932b13499588a4c2c3d26961a00134b8b89a5c4c4d26162a930b134d883cc5ffa4b2cf52596f6124b7989a5bb00c4525d6269ae4799bff49668e79e607efb2696ce12eddad3cc6fcfc4d257a2001d7b1df3dbaf3730bfdd7a23f3dbab3733bf9d7a2bf3dba7b733bf5d7a27f300dba37733bf1d7a2ff3db9fe798dfee7c80cb0799dfe67c98cb4798dfde7c8c00cbc799dfd67c92f97546b4339fe1f259e6b7319fe3f279e6b72f5fe4f225e600b72d5fe1f255e6b72ba27bf00de6b729dfe2f26de6b727dfe5f23de6b7253f00e0f243e6b7233f66fee32ed186fc8ccbcf99df7efc92cbaf98df76fc86cb6f0099df6efc9ecb1fb8fc91cb9fb8fc99cb5f98df86fc8dcbdfb9fc83f96dc8bf0098df76bcc0fc36e3bfcc6f2b446320da88022e712eddb874e75218cbfc3d8f00b1ccf61a191928e375adad4d6bd7b796b6b694ae6d5bd3ba72fd9a6da55b5600b6ae286dd9dcb4b1794dcb164cbc44deb6fbcaf8c48d1bebb695ae5cd7d8b400b5b4a5adb5b4a5b9b4bea56d5de3264c74b8e0342c9e908907744c5cd7d8d80079ba87643a5a996f4676c6474fc5b1a74e25d1f89ea790684ae214122d3b950044038a4f21d1a0534934fd5412dddfd544ecff937dd038ab2d02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +000000000000000000000000000000000000000000000000000000000000000320cd27645f65c15a38720ca984aef936592f3938a705db706d068ad13fc58ae90321fc89f3f6ce9730f5d48bbeacfb28f611f6a97e62fb4fd492dfbaf93b46e80000000000000000000000000000000000000000000000000000000000000001103db9d8abd8d61dc45f40f7d8a6910a366ae9b0f2bc289e5384688ba20dce272e48f56e2f89ae8cad557d2375c4bb45e7061689f591280b2038108dda8067ad000000000000000000000000000000000000000000000000000000000000452c002600020401270000010480672600000403260202040126020304001f18000300000280662d088066000124000000452400000202270200010480672602020400003a0d00010002270080430400052a0080440000000000000000010000000000000000002b0080450000000000000000000000000000000001000000000000000000000000000000000028008046046a09e6672800804704bb67ae852800800048043c6ef3722800804904a54ff53a2800804a04510e527f2800804b049b0500688c2800804c041f83d9ab2800804d045be0cd192d000001804e2700804f0400000901000001804f00012701804e0400010100804e0002804f2d00804f8050002d028046805001008050000280502d028047805001008050000280502d02800048805001008050000280502d028049805001008050000280502d02804a80500001008050000280502d02804b805001008050000280502d02804c80500100800050000280502d02804d80502700804f0400402700805004000427008051040000382700805204000e27008053040003270080540401002700805501000027000080560200002700805704000027008058000000270080590100012700805a040000012700805b0400022700805c0200042700805d0000062700805e020008270000805f04000827008060000008270080610000142700806200001b27008063000200202700806404002027008065020080252400001fb228020002005189a400170a380102032602040400260206040300380406052c080102001001050126000302040100280202052c0e040500280502052c0e040526020504030038020500042c0d020400280402042c0e0402230200030000026822000002aa2602030400042c08000400100003002400001fdb2c0400002c0d020300280302032c0e03000200280202052c0d0504260206040200380506033a0d0003000422000002aa0028020003007a81a21e0a38010304260203040623020004000002ca2200000800062c08010526020604040010010601260305040100280502061f24805a80530000062c0d050600280602062c0e06052c08010600000102012c0e05062c0801000500000102012d0a8057000526020804092c0800092c0c060a2c0c050b2d0800805d000c00100008002400001ffd2c0400002c0c0a07260209040a2c08000a002c0c060b2c0c050c2d08805d000d00100009002400001ffd2c0400002c0c0b000826020a040b2c08000b2c0c060c2c0c050d0010000a0024000020d52c040000002c0c0c090028090206012800068057000a2c0d0a051c0c0506002b0200090000000000000000000000000000ffffffffffffffffffffffffffffffffffff00ffff0e3806090a2302000a000003d5240000214e2c0801062602090403001000010901260306040100280602092c0c090a2c0e070a00280a020a2c0e080a2c0008010726020804070010010801260307040100280702082c0c08092d0a805800000900280902092d0a8058000900280902092d0a8058000900280902092d0a008058000900280902092d0a8058000900280902092d0a805800092c0801080000000102012c0e07082c080107260209040a001001090126030704010028070200092c0c090a2d0a8058000a00280a020a2d0a8058000a00280a020a2d0a805900000a00280a020a2d0a8058000a00280a020a2d0a8058000a00280a020a2d0a008059000a00280a020a2d0a8058000a00280a020a2d0a8058000a00280a020a002d0a8059000a2c08010900000102012c0e07092b02000700054aa86a73cb8a0034525e5bbed6e43ba1198e860f5f3950268f71df4591bde4022b02000a0020009dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126002b02000b00083e7911d835097629f0067531fc15cafd79a89beecb39903f6900572c636f4a5a2b02000c001a7f5efaad7f315c25a918f30cc8d7333fccab7a00d7c90f14de81bcc528f9935d2c08010d26020e04070010010e0126030d04010000280d020e2c0c0e0f2c0e0b0f00280f020f2c0e0c0f00280f020f2d0a805500000f00280f020f2c0e070f00280f020f2c0e0a0f00280f020f2d0a8055000f002d088057000422000005db0d280004805b00072302000700001d3e2200000500f02c0d0804260206000226020a04060d308050000a000b2302000b000006130024000021602d04000480032700800404000724000021722d088005000700280007020a0128000a8050000b2c0e060b26020604060d3080430006000a230200000a0000065624000021602d04000780032700800404000724000021722d0880000500040028040206012800068043000a2d0a8058000a2c0e04082c0d09062b00020007002df8b940e5890e4e1377e05373fae69a1d754f6935e6a780b66694007431f2cdcd26020a04090c38030a0b2302000b000006c524000021602d0400000680032700800404000a24000021722d0880050008002808020a00380a030b002c0e070b26020604072b020007002ecd88d15967bc53b885912e0d1686615400acb6aac2d3f85e27ca7eefb2c1908326020b04090c38060b0c2302000c000000072c24000021602d04000880032700800404000a24000021722d088005000a0000280a020b00380b060c2c0e070c26020704090d30805f0007000823020008000000076c24000021602d04000a80032700800404000a24000021722d088005000006002806020701280007805f00082d0a805500082c0e06092c0801072602000804040010010801260307040100280602082602090409002804020a26020b000406002807020c42f70008000a000c0009002807020601280006805700082c000d0804370c0005000400280202062c0d0605260207040200380607043a0d00000400052200000806280200040032b6bd200a3801040523020005000008212200000009322c08010426020504030010010501260304040100280402051f2480005a805b00052c0d040500280502052c0e05042c08010500000102012c0e0405002c08010400000102012d0a8057000426020704082c0800082c0c05092c0c04000a001000070024000022002c0400002c0c090600280602080128000880570000092c0d090726020804092c0800092c0c050a2c0c040b00100008002400002200002c0400002c0c0a06002806020501280005805700082c0d08041c0c040500002b02000600000000000000000000000000ffffffffffffffffffffffffffff00ffffffffffff0e38050608230200080000090e240000214e370c000400070000280202062c0d0605260207040200380607043a0d0004000522000009322802000004008a4870ec0a38010405230200050000094d22000009e12c0801042602000504020010010501260304040100280402051f24805a805a00052c0d04050000280502052c0e05042c08010500000102012c0e04052c08010400000102012d000a8057000426020704082c0800082c0c05092c0c040a2d08805d000b00100000070024000022792c0400002c0c09063302000600280202062c0d060526020700040200380607043a0d0004000522000009e12802000400cd8c9a7a0a380104000523020005000009fc2200000b062c0801042602050402001001050126030400040100280402051f24805a805a00052c0d040500280502052c0e05042c0801000500000102012c0e04052c08010400000102012d0a8057000426020704082c000800082c0c05092c0c040a001000070024000023512c0400002c0c09062602000504072c0800072c0c0608001000050024000023ca2c0400002c0c08041e02000005060a380504062302000600000aa226020704003b0901071c0c040500260002060401260208040300380608072c080104001001070126030404010028040002072c0e060700280702072c0e0607260207040300380407062c0c06072c0e00050700280402072c0d0706260208040200380708053a0d000500062200000b00062802000400f99f5a2d0a380104052602040277260206026f2602070265260002080272260209026c2302000500000b3a2200000e2b2c08010a26020b0402000010010b0126030a040100280a020b1f24805a805a000b2c0d0a0b00280b02000b2c0e0b0a2c08010b00000102012c0e0a0b2c08010a00000102012d0a805700000a26020d040e2c08000e2c0c0b0f2c0c0a102d08805d00110010000d002400000022792c0400002c0c0f0c26020b040126020e040300380b0e0d2c08010a000010010d0126030a040100280a020d2c0e0b0d00280d020d2c0e0b0d26020d00040300380a0d0b2c0c0b0d2c0e0c0d00280a020d2c0d0d0c26020e04020038000d0e0b360d000b000c26020a000a26020b001e26020d040326020f04030038000d0f0e2c08010c0010010e0126030c040100280c020e2c0e0d0e00280e020e002c0e0d0e26020e040300380c0e0d2c0c0d0e2c0e0a0e00280e020e2d0a806100000e00280e020e2c0e0b0e00280c020d2c0d0d0b26020e040200380d0e0a36000d000a000b26020a022126020b026426020c024826020d022c2c08010e2602000f040e0010010f0126030e040100280e020f2c0c0f102c0e0c100028100210002c0e071000281002102c0e091000281002102c0e091000281002102c0e06100000281002102c0e0d1000281002102d0a8063001000281002102c0e04100028001002102c0e061000281002102c0e081000281002102c0e091000281002102c000e0b1000281002102c0e0a102c08010a26020b040e0010010b0126030a04010000280a020b26020c040d00380c0b0c2c0c0b0d0c380d0c0f160c0f0f230200000f00000d672d0a8058000d00280d020d2200000d462c08010b00000102012c000e0a0b26020a040d2d08805700052200000d840c38050a0c2302000c00001c00be2200000d962c0d0b0526020d040d06280d020b26020f040300380d0f0e2c0008010c0010010e0126030c040100280c020e2c0e0d0e00280e020e2c0e0d0e0026020f040300380c0f0e002805020f2d04000f80032d04000e80042d04000d00800524000023f400280c020e2c0d0e0d26020f040200380e0f05360d000500000d002802020c2c0d0c0a26020d040200380c0d053a0d0005000a2200000e2b00280200050097b974f70a3801050a2302000a00000e4622000016ae2c08010a0026020b04070010010b0126030a040100280a020b1f34805a0003000b2c0d0a000b00280b020b2c0e0b0a2c08010b00000102012c0e0a0b2c08010a0000010200012d0a8057000a26020d040e2c08000e2c0c0b0f2c0c0a100010000d0024000000243a2c0400002c0c0f0c00280c020e0128000e8057000f2c0d0f0d2c0d0b000c2c0d0a0e26021004060c380e10112302001100000ee2240000216000280c0002100038100e112c0d110f0128000e805a00100e380e10112302001100000f000a24000024b326021204060c381012132302001300000f2124000021600028000c021200381210132c0d13110128000e805b00100e380e1012230200120000000f4924000024b32c0e0c0b2c0e100a1c0c0f0e051c0c0e0c001c0c110f051c000c0f0e0026021004112c0800112c0c0b122c0c0a132d08805d001400100010000024000024c52c0400002c0c120f26021104122c0800122c0c0b132c0c0a14002d08805d0015001000110024000024c52c0400002c0c131026021204132c080000132c0c0b142c0c0a150010001200240000243a2c0400002c0c141100281100020b0128000b805700122c0d120a1c0c0a0b002b0200110000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e380b1112230002001200001027240000214e2c08010b00000102012d0a8055000b2c0801110000000102012d0a805800112c080112000001020126021300802c0e13122c08000113000001020126021504162c0800162c0c0d170010001500240000259d2c000400002c0c17142c0d140d00280d020d2c0e0d140528000e8044000d00380c000d0e26020d04152c0800152c0c0e160010000d00240000259d2c0400002c0c00160c2c0d0c0d00280d020d2c0e0d0c26020d02bc26020e026a260215029b2600021602d32c08011726021804450010011801260317040100281702182c0c1800192c0e0d1900281902192c0e0e1900281902192c0e151900281902192c0e16001900281902192d0a8056001900281902192d0a8056001900281902192d0a800056001900281902192d0a8056001900281902192d0a8056001900281902192d000a8056001900281902192d0a8056001900281902192d0a805600190028190200192d0a8056001900281902192d0a8056001900281902192d0a805600190028001902192d0a8056001900281902192d0a8056001900281902192d0a805600190000281902192d0a8056001900281902192d0a8056001900281902192d0a805600001900281902192d0a8056001900281902192d0a8056001900281902192d0a008056001900281902192d0a8056001900281902192d0a805600190028190219002d0a8056001900281902192d0a8056001900281902192d0a805600190028190002192d0a8056001900281902192d0a8056001900281902192d0a805600190000281902192d0a8056001900281902192d0a8056001900281902192d0a805600001900281902192d0a8056001900281902192d0a8056001900281902192d0a800056001900281902192d0a8056001900281902192d0a8056001900281902192d000a8056001900281902192d0a8056001900281902192d0a805600190028190200192d0a8056001900281902192d0a8056001900281902192d0a805600190028001902192d0a8056001900281902192d0a8056001900281902192d0a805600190000281902192d0a8056001900281902192d0a8056001900281902192d0a805600001900281902192d0a8056001900281902192d0a8056001900281902192d0a008056001900281902192d0a8056001900281902192d0a805600190028190219002d0a8056001900281902192d0a8056001900281902192d0a805600190028190002192d0a8056001900281902192d0a8056001900281902192d0a805600190000281902192d0a8056001900281902192d0a8056001900281902192d0a805600001900281902192d0a8056001900281902192d0a805600192c0e171326020d0400242d088057000522000013e80d2800058064000e2302000e00001bd42200000013fd2c0d130d2d09804e000e00280e020e2d06000e804e26020e04442602150004162c0800162c0c0d172c0c0e182d0880570019001000150024000025e32c000400002c0c17132c0c18142c0d131500281502152c0e15132c0801152602160004090010011601260315040100281302160120804e0002001700281502183f003f0018001700162c0d151300281302132c0e131526021704182c0800182c0c000d192c0c0e1a2d08804f001b001000170024000025e32c0400002c0c19132c000c1a162c0d130d00280d020d2c0e0d13072800168050000d26021804100c38000d181923020019000014e4240000216000281302180038180d192c0d191726000219041a2c08001a2c0c171b2c0c161c2d088065001d00100019002400002800ba2c0400002c0c1b1826021904100c380d191a2302001a000015322400002100602d04001380032700800404001124000021722d08800500170028170219000038190d1a2c0e181a0d2800168051000d2302000d000015a6220000156d2c0800010d2602130409001001130126030d04010028170213002815021400280d0200163f3f0016001400132c0c0d052d088057000c22000015cd01280016805a00000d0e38160d1323020013000015c024000024b32c0c15052c0c0d0c2200001500cd2c0d050d00280d020d2c0e0d0526021304182c0800182c0c17192c0c0c1a002c0c0e1b00100013002400002a3f2c0400002c0c190d2c0d0d0c00280c020c002c0e0c0d26020e04132c0800132c0c0d142c0c05150010000e002400002e92002c0400002c0c140c2c0d0c0500280502052c0e050c26020d04132c0800132c000c0c140010000d0024000030892c0400002c0c140526020c04132c0800132c000c0b142c0c11152c0c12162c0c05172c0c0f182c0c0a192c0c101a0010000c000024000031e02c040000002802020b2c0d0b0a26020c040200380b0c053a0d000005000a22000016ae28020005009756f6200a3801050a2302000a000016c900220000187e2c08010526020a04050010010a012603050401002805020a1f2400805a8050000a2c0d050a00280a020a2c0e0a052c08010a00000102012c0e05000a2c08010500000102012d0a8057000526020c040d2c08000d2c0c0a0e2c0c00050f2d08805d00100010000c002400003c8f2c0400002c0c0e0b26020d040e002c08000e2c0c0a0f2c0c05102d08805d00110010000d002400003c8f2c040000002c0c0f0c26020e040f2c08000f2c0c0a102c0c05110010000e002400003d00672c0400002c0c100d00280d020f0128000f805700102c0d100e1c0c0e0d00002b02000f00000000000000000000000000ffffffffffffffffffffffffffff00ffffffffffff0e380d0f1023020010000017d4240000214e26020f04102c080000102c0c0a112c0c05122d08805d00130010000f002400003c8f2c0400002c000c110d2c08010500000102012d0a805500052c08010a00000102012d0a805800000a2c08010f0000010201260210004c2c0e100f26021004112c0800112c0c0005122c0c0a132c0c0f142c0c0b152c0c0c162c0c0e172c0c0d1800100010000024000031e02c040000002802020b2c0d0b0a26020c040200380b0c053a0d000005000a220000187e2802000500eb2b616b0a3801050a2302000a00001899220000001a992c08010126020504070010010501260301040100280102051f3480005a000300052c0d010300280302032c0e03012c08010300000102012c0e0103002c08010100000102012d0a8057000126020a040b2c08000b2c0c030c2c0c01000d2d08805d000e0010000a0024000024c52c0400002c0c0c0526020b040c2c0008000c2c0c030d2c0c010e2d08805d000f0010000b0024000024c52c040000002c0c0d0a26020c040d2c08000d2c0c030e2c0c010f2d08805d00100010000c000024000024c52c0400002c0c0e0b26020d040e2c08000e2c0c030f2c0c0110000010000d00240000243a2c0400002c0c0f0c26020e040f2c08000f2c0c0c10000010000e0024000023ca2c0400002c0c100d26020e040f2c08000f2c0c0310002c0c01112d08805d00120010000e0024000024c52c0400002c0c100c26020f0004102c0800102c0c03112c0c01122d08805d00130010000f0024000024c52c000400002c0c110e1e020001030a380105032302000300001a082400003de01e00020001040a38010a032302000300001a1f2400003df21e020001050a38010b00032302000300001a362400003e041e020001060a38010d032302000300001a004d2400003e161e020001080a38010c032302000300001a642400003e281e02000001070a38010e032302000300001a7b2400003e3a00280202052c0d05032600020a04020038050a013a0d000100032200001a992602010273260202025526000203026e260205027426020a026326020b026b2c08010c26020d0411001001000d0126030c040100280c020d2c0c0d0e2c0e020e00280e020e2c0e030e0028000e020e2c0e0b0e00280e020e2c0e030e00280e020e2c0e060e00280e020e2c000e040e00280e020e2c0e030e00280e020e2d0a8063000e00280e020e2c0e01000e00280e020e2c0e070e00280e020e2c0e090e00280e020e2c0e070e00280e00020e2c0e0a0e00280e020e2c0e050e00280e020e2c0e060e00280e020e2c0e00080e0b208055805900012302000100001bd326020204122c08010326020404001200100104012c0c03042903000405e58f985907316290002804020400280c00020526020604102d04000580032d04000480042d040006800524000023f426000205041000380405042d0a8057000400280402043b0d0302252c0d130e01280000058050001526021704200c380517182302001800001bf7240000216000280014021700381705182c0d181626021804440c381518192302001900001c1c2400000021602d04000e80032700800404004524000021722d088005001700281700021800381815192c0e16190038050d0e26021604200c38051618230200180000001c5e240000216000280c021600381605182c0d181526021804440c380e1800192302001900001c8324000021602d0400178003270080040400452400002100722d088005001600281602180038180e192c0e15192c0e161301280005805a00000e2c0c0e0522000013e82c0d0b0c26020f040d0c38050f10230200100000001cd9240000216000280e020f00380f05102c0d100d1c0c0d0f00260210040d000c380510112302001100001d0324000021602d04000c80032700800404000e0024000021722d088005000d00280d021000381005112c0e0f112c0e0d0b0128000005805a000c2c0c0c052200000d842c0d080726020b04020c38040b0c230200000c00001d592400002160002806020b00380b040c2c0d0c0a1c0c0a0c051c000c0c0b0002380a0b0c0928000c8044000e1c0c0e0f051c0c0f0c0002380e0c000f0928000f8044000e0528000c8044000f00380f0b0c05308045000e000b0000380c0b0f0a380a0f0b2302000b00001dc526021004003b0901100528000480005b000a26020f04060c380a0f102302001000001de424000021602d0400078000032700800404000724000021722d088005000b00280b020f00380f0a102c0e000c100128000a805a000726020c04060c38070c0f2302000f00001e292400000021602d04000b80032700800404000724000021722d088005000a00280a020c0000380c070f2c0e0e0f2c0e0a082c0d0907052800048053000a26020c04060c00380a0c0e2302000e00001e76240000216000280d020c00380c0a0e2c0d0e0b000128000a805a000c26020f04060c380c0f102302001000001ea324000021600000280d020f00380f0c102c0d100e0128000a805b000f26021104060c380f1100122302001200001ed0240000216000280d02110038110f122c0d12102602110004090c380a11122302001200001ef524000021602d0400078003270080040400000a24000021722d088005000f00280f02110038110a122c0e0b1226020a0400090c380c0a0b2302000b00001f3224000021602d04000f8003270080040400000a24000021722d0880050007002807020a00380a0c0b2c0e0e0b0128000c80005a000a26020c04090c380a0c0e2302000e00001f7724000021602d0400078000032700800404000a24000021722d088005000b00280b020c00380c0a0e2c0e00100e2c0e0b0901280004805a00072c0c070422000005db270080040478000d00000000800480032300800300001fda2901000105f7a1f3afa5add4ca3b01010002252400001fb21e020001011e020002000a380102032302000300001ffc240000003e4c252400001fb226020604072c0800072c0c01082c0c020900100006000024000020d52c0400002c0c08050b280003805d000100280502060128000600805700072c0d070223020001000020c7220000204b0b2800038060000123020000010000208222000020600b2800038062000123020001000020792602050400003b0901052c0c020422000020d01c0c0201002b0200030000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e380103052300020005000020be240000214e2c0c020422000020d02c0c020422000020d02c000c0401252400001fb22c0d01032c0d020426020604030c380406072302000700000020f92400002160002803020600380604072c0d07052c0801062602070400020010010701260306040100280602072c0c07082c0e050801280004805a0000050e38040507230200070000214124000024b32c0e03012c0e05022c0c0601002529010001055a02e41bb51ea99f3b010102252901000105e89d09fea1112d000e3b010102252d01800380060b00800600028007230080070000218d2200000021982d008003800522000021ff2d000001800501000001800400010100800300800480092d008003800a2d008005800b0b00800a8009800c2300800c00002100eb2d01800a80082d028008800b0100800a0002800a0100800b0002800b2200000021ba27018005040001030080060002800622000021ff252400001fb22c0d0001032c0d020426020604020c380406072302000700002224240000216000280003020600380604072c0d07052c0801062602070402001001070126030604010000280602072c0c07082c0e050801280004805a00050e3804050723020007000000226c24000024b32c0e03012c0e05022c0c0601252400001fb22602060407002c0800072c0c01082c0c0209001000060024000023512c0400002c0c08050b00280003805d0001002805020601280006805700072c0d070223020001000023004322000022c70b2800038060000123020001000022fe22000022dc0b280003008062000123020001000022f526020504003b0901052c0c0204220000234c1c000c0201002b02000300000000000000000000000000ffffffffffffffffffff00ffffffffffffffffffff0e38010305230200050000233a240000214e2c0c020004220000234c2c0c0204220000234c2c0c0401252400001fb22c0d01032c0d00020426020604010c380406072302000700002375240000216000280302060000380604072c0d07052c0801062602070402001001070126030604010028060200072c0c07082c0e050801280004805a00050e3804050723020007000023bd2400000024b32c0e03012c0e05022c0c0601252400001fb200280102030128000300805700042c0d04021c0c0203051c0c0301001c0c0102052c0c0201250100800003800580072d00800380082d00800480090b0080088007800a2300800a00000024392d01800880062d028006800901008008000280080100800900028009220000002408252400001fb22c0d01032c0d020426020604060c3804060723020000070000245e2400002160002803020600380604072c0d07052c0801062602070004020010010701260306040100280602072c0c07082c0e050801280004805a0000050e3804050723020007000024a624000024b32c0e03012c0e05022c0c06000125290100010545a7ca711941e4153b010102252400001fb226020604072c000800072c0c01082c0c02090010000600240000243a2c0400002c0c08050b28000003805d0001002805020601280006805700072c0d0702230200010000258f0022000025130b28000380600001230200010000254a22000025280b2800038000620001230200010000254126020504003b0901052c0c020422000025981c0c000201002b02000300000000000000000000000000ffffffffffffffffffffff00ffffffffffffffffff0e380103052302000500002586240000214e2c0c02040022000025982c0c020422000025982c0c0401252400001fb226020301002c08000102260204042100100104012603020401002802020426020504204303b000000180540005000300042c0d020100280102012c0e01022c0c0201252400001f00b22c080105260206041100100106012603050401002805020626020704100000380706072c0c06080c38080709160c0909230200090000262f2d0a80570008000028080208220000260e2c08010600000102012c0e05060c380203052302000005000026ae220000264e01280003804f00070e3803070823020008000026680024000024b30c380207082302000800002685220000267a2d08804f00052200000026a502380203070e38030208230200080000269c2400003e5e2c0c07052200000026a52c0c050422000026b92d088057000422000026b90728000480500000022c08010500000102012c0e020526020804040638040809043809080a023800040a070b28000780570008230200080000271a22000026f701280002805a0000070e38020708230200080000271124000024b32c0e0705220000271a2c0d0500072d088057000222000027290c380207052302000500002744220000273b2c000d06012c0c0402252c08010800000102012d0a805700082d088057000522000000275e0d2800058050000923020009000027cd22000027732c0d06052c0d08000926020a04100c38020a0b2302000b0000279224000021602d0400058003270000800404001124000021722d0880050008002808020a00380a020b2c0e090b0001280002805a00052c0e08062c0c05022200002729052800028050000a2602000c04000b28000c8050000b2302000b000028040728000a8050000e0a380e02000d2302000d000028042400003e7000380a050b0e380a0b0c2302000c000028001b24000024b30c380b040a2302000a00002838220000282d2d088056000922000000287d0038030b0a0e38030a0c2302000c0000284f24000024b326020c0400440c380a0c0d2302000d000028662400002160002801020c00380c0a0d2c0d000d0b2c0c0b09220000287d2c0d080a1928000a805e000b1c0c090a0400380b000a090e380b090c2302000c000028a524000024b32c0e090801280005805a0000092c0c0905220000275e2400001fb226020604040638020607043807060802003802080503308050000500020f2800058050000623020006000028f0240000003e5e1c0c0207021c0c0706041c0c0602020530805e0002000626020802000a00380802072302000700002933063806020a0b28000a805e00092302000900000029332400003e701a380106070d280002805c0001230200010000295822000000294d2d0880570004220000297b18380706010d280006806300022302000200000029722400003e822c0c0104220000297b1c0c03020403308053000500030f0028000580530006230200060000299d2400003e5e1c0c0306021c0c0605041c000c0503020d280003805c000523020005000029cc22000029c12d0880570001002200002a230530805e0003000526020702000a380703062302000600002a000006380503090b280009805e00082302000800002a002400003e701838020503000d280005806300022302000200002a1a2400003e822c0c03012200002a230000380401020e380402032302000300002a3a24000024b32c0c0201252400001f00b22c0d010400280402042c0e04012c08010400000102012c0e01042c0801050000000102012c0e020526020704040638020708043808070902380209060b28000006805700072302000700002bca2200002a9407280002805000080330805000000600090f2800068050000a2302000a00002ab92400003e5e26020a04100c0038080a0b2302000b00002ad02400002160002801020a00380a080b2c0d0b06001c0c090b021c0c0b0a041c0c0a0b020530805e000b000a26020d02000a380d000b0c2302000c00002b2106380a0b0f0b28000f805e000e2302000e00002b21002400003e701a38060a0c0d28000b805c00062302000600002b462200002b3b002d08805700072200002b6918380c0a060d28000a8063000b2302000b00002b00602400003e822c0c06072200002b6926020a04100c38080a0b2302000b0000002b8024000021602d04000180032700800404001124000021722d088005000600002806020a00380a080b2c0e070b2c0e060400380209010e38020106230200000600002bc124000024b32c0e01052200002bca2c0d05020728000280500005002c0c05012200002bdf0d280001805200022302000200002e3a2200002bf4050030805f0003000226020604000a380603052302000500002c2806380203080b00280008805f00072302000700002c282400003e701c0c02030026020501002c00080102260206040900100106012603020401002802020626020704084303b000000380540007000500062d08805700012200002c670d280001805b0003230200000300002c812200002c7c2c0d04012505280001805000032c0d040501308000520001000626020804080c380308092302000900002cac240000216000280200020800380803092c0d090701280003805a00080e380308092302000900002c00d424000024b326020a04080c38080a0b2302000b00002ceb240000216000280002020a00380a080b2c0d0b0901280003805b00080e3803080a2302000a0000002d1324000024b326020b04080c38080b0c2302000c00002d2a240000216000002802020b00380b080c2c0d0c0a01280003805300080e3803080b2302000b0000002d5224000024b326020b04080c38080b0c2302000c00002d69240000216000002802020b00380b080c2c0d0c031c0c07080419280008805e00071c0c0908000400380708090e3807090b2302000b00002da024000024b319280009805e0000071c0c0a080400380708090e3807090a2302000a00002dc424000024b31928000009805e00071c0c03080400380708030e380703092302000900002de82400000024b326020804100c380608092302000900002dff24000021602d0400058000032700800404001124000021722d0880050007002807020800380806092c0e0003092c0e070401280001805a00032c0c03012200002c672c0d04022602060400100c380106072302000700002e5524000021602d0400028003270080040400001124000021722d0880050005002805020600380601072d0a805700070128000001805a00022c0e05042c0c02012200002bdf2400001fb22c0d02040028040200042c0e04022c08010400000102012c080105260206042100100106012603050004010028050206260207042000380706072c0c06080c38080709160c0909230002000900002ef42d0a8056000800280802082200002ed32c0801060000010200012c0e05062c080105260207040900100107012603050401002801020700280002020800280502093f3f0009000800072c0d050100280102012c0e01052c0e0005042d08805700032200002f470d280003805f00012302000100002f61220000002f5c2c0d0601252c0d040226020704080c380307082302000800002f7c240000002160002802020700380703082c0d08051c0c05020026020701002c08010005260208040500100108012603050401002805020826020904044303b0000200805400090007000805308050000300022d08805700012200002fd10d28000100805000072302000700002ff72200002fe601280003805a00012c0c0103220000002f472c0d060700380201080e38020809230200090000301224000024b32600020a04040c38010a0b2302000b000030292400002160002805020a00380a01000b2c0d0b0926020b04200c38080b0c2302000c0000304e24000021602d0400000780032700800404002124000021722d088005000a00280a020b00380b080c002c0e090c2c0e0a0601280001805a00072c0c07012200002fd12400001fb22c00080103000001020126020400012c0e04032c08010400000102012d0a80580000042c08010500000102012d0a80580005260206041e260207040f27020008000001002d088057000222000030da0c38020709230200090000312822000030ec002c0d0502002801020800380807092c0d09061c0c0601002c0d030604380106000300380203012c0e01052c0d0402043802060300380103022c0c0201252c0d000509023806020a26020c04200c380a0c0d2302000d00003148240000216000002801020c00380c0a0d2c0d0d0b1c0c0b0a002c0d030b04380a0b0c0038090c000a2c0e0a0504380b08092c0e09032c0d040a033080520002000b0f280002800052000c2302000c000031972400003e5e26020d04200c380b0d0e2302000e00000031ae2400002160002801020d00380d0b0e2c0d0e0c1c0c0c0b0004380b09000c00380a0c092c0e090401280002805a00092c0c090222000030da2400001f00b22c08010926020a04030010010a012603090401002809020a2c0c0a0b2d0a008061000b00280b020b2c0e050b2a02000a00000000000000000200000000000000000026020f04102c0800102c0c0a110010000f002400003e942c0400002c000c110b2c0c120c2c0c130d2c0c140e2c0d0b0a00280a020a2c0e0a0b2c0801000a00000102012c0e0b0a2c0d0c0b00280b020b2c0e0b0c2c08010b0000010200012c0e0c0b2c08010c00000102012c0e0d0c2c08010d00000102012c0e0e0d002d088057000822000032a90d280008805b00012302000100003c1c2200003200be260203040e2c08000e2c0c0a0f2c0c0b102c0c0c112c0c0d120010000300002400003f342c0400002c0c0f021e020003031e020008001e020009042c0801000a26020b04e10010010b0126030a040100280a020b26020c04e000380c0b0c002c0c0b0d0c380d0c0e160c0e0e2302000e0000333f2d0a8056000d00280d02000d220000331e2c08010b00000102012c0e0a0b26020c040d2c08000d2c0c06000e0010000c00240000259d2c0400002c0c0e0a2c0d0a0600280602062c0e06000a26020c040d2c08000d2c0c030e0010000c00240000259d2c0400002c0c0e00062c0d060300280302032c0e030626020c040d2c08000d2c0c080e0010000c0000240000259d2c0400002c0c0e032c0d030800280802082c0e080326020c04000d2c08000d2c0c090e0010000c00240000259d2c0400002c0c0e082c0d08090000280902092c0e090826020c040d2c08000d2c0c040e0010000c0024000025009d2c0400002c0c0e092c0d090400280402042c0e040926020c040d2c08000d002c0c020e0010000c00240000259d2c0400002c0c0e042c0d04020028020202002c0e020426020c040d2c08000d2c0c070e0010000c00240000259d2c040000002c0c0e022c0d020c00280c020c2c0e0c0226020c048026020d04c026020e04006026020f04a02d0880570001220000349f0d2800018064001023020010000000393122000034b42c0d0b022d09804e000300280302032d060003804e2c0801000300000102012d0a804e000326020404e02d088057000122000034e80d280000018053000623020006000038a122000034fd26020a040e2c08000e2c0c020f002c0c04102c0c0d110010000a002400003fad2c0400002c0c0f082c0c10092c000d080200280202022c0e0208072800098050000226020b04100c38020b0c230002000c000035542400002160002808020b00380b020c2c0d0c0a26020c040d002c08000d2c0c0a0e2c0c090f2d08806500100010000c0024000028ba2c040000002c0c0e0b26020c04100c38020c0d2302000d000035a224000021602d0400000880032700800404001124000021722d088005000a00280a020c00380c020d002c0e0b0d0d28000980510002230200020000361a22000035dd2c0d03022c0800010326020804090010010801260303040100280a0208002802020900280302000b3f3f000b000900082c0c03012d088057000622000036452c0d03020128000009805a00030e38090308230200080000363824000024b32c0c02012c0c03060022000036452c0d010300280302032c0e0301260208040b2c08000b2c0c0a0c002c0c060d2c0c040e00100008002400002a3f2c0400002c0c0c032c0d03040000280402042c0e040326020604082c0800082c0c03092c0c010a0010000600240000002e922c0400002c0c09042c0d040100280102012c0e010426020304082c000800082c0c0409001000030024000030892c0400002c0c090126020300052c0008010426020604040010010601260304040100280402062c0c06082c0e03080000280802082c0e010800280802082c0e05082c0d040300280302032c0e0304002a020003000000000000000003000000000000000026020a040b2c08000b2c000c030c0010000a002400003e942c0400002c0c0c052c0c0d062c0c0e082c0c000f092c0d050300280302032c0e03052c08010300000102012c0e05032c0d06000500280502052c0e05062c08010500000102012c0e06052c0801060000010200012c0e08062c08010800000102012c0e09082d088057000222000037b20d2800000280530009230200090000382e22000037c726020404092c0800092c0c03000a2c0c050b2c0c060c2c0c080d00100004002400003f342c0400002c0c0a02001e0200030032380002000300040b280004805500032302000300003814240000004284343800010007000323020003000038292400004296330200022523020000090000383b220000389026020a04030c38020a0b2302000b00003852240000002160002804020a00380a020b2c0d0b0926020a040b2c08000b2c0c030c2c000c050d2c0c060e2c0c080f2c0c09100010000a0024000042a82c04000022000000389001280002805a00092c0c090222000037b20530804f0001000626020a00040e2c08000e2c0c020f2c0c04102c0c06110010000a002400003fad2c040000002c0c0f082c0c10092c0d080600280602062c0e06082c0d03062c08010a2600020b04090010010b0126030a0401002808020b002806020c00280a020e3f3f00000e000c000b2c0d0a0600280602062c0e060a2c0e0a0301280001805a0006002c0c060122000034e82c0d0b1026021204200c38011213230200130000394c00240000216000280a021200381201132c0d131126021304e00c3801131423020000140000397124000021602d0400108003270080040400e124000021722d080080050012002812021300381301142c0e111401280001806400102602130420000c3801131423020014000039b62400002160002806021300381301142c0d14001126021404e00c3810141523020015000039db24000021602d040012800327000080040400e124000021722d0880050013002813021400381410152c0e11150001280001804f001026021204200c380112142302001400003a20240000216000002803021200381201142c0d141126021404e00c381014152302001500003a004524000021602d0400138003270080040400e124000021722d088005001200002812021400381410152c0e11150038010e1026021304200c38011314230200001400003a872400002160002808021300381301142c0d141126021404e00c38001014152302001500003aac24000021602d0400128003270080040400e12400000021722d0880050013002813021400381410152c0e11150038010c102602120004200c380112142302001400003aee2400002160002809021200381201142c000d141126021404e00c381014152302001500003b1324000021602d040013800003270080040400e124000021722d0880050012002812021400381410152c0e0011150038010f1026021304200c380113142302001400003b55240000216000002804021300381301142c0d141126021404e00c381014152302001500003b7a0024000021602d0400128003270080040400e124000021722d088005001300280013021400381410152c0e11150038010d1026021204200c38011214230200140000003bbc2400002160002802021200381201142c0d141126021404e00c38100014152302001500003be124000021602d0400138003270080040400e12400000021722d0880050012002812021400381410152c0e11152c0e120b0128000180005a00102c0c1001220000349f2302000100003c292200003c7e26020204020c00380802032302000300003c402400002160002809020200380208032c0d030100260202040e2c08000e2c0c0a0f2c0c0b102c0c0c112c0c0d122c0c011300100000020024000042a82c0400002200003c7e01280008805a00012c0c01082200000032a92400001fb226020604072c0800072c0c01082c0c02090010000600240000003d672c0400002c0c08050b280003805d000100280502060128000680570000072c0d07022302000100003d592200003cdd0b28000380600001230200010000003d142200003cf20b280003806200012302000100003d0b26020504003b000901052c0c02042200003d621c0c0201002b0200030000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e38010305230200000500003d50240000214e2c0c02042200003d622c0c02042200003d622c0c040001252400001fb22c0d01032c0d020426020604040c38040607230200070000003d8b2400002160002803020600380604072c0d07052c0801062602070402000010010701260306040100280602072c0c07082c0e050801280004805a00050e00380405072302000700003dd324000024b32c0e03012c0e05022c0c060125290001000105be11c73bbb04a4fc3b0101022529010001057425c86e086b03c13b00010102252901000105e3b1cb17b4b196ae3b010102252901000105203960fa00a7b733883b01010225290100010597178cf85aace5563b010102252901000100053b7ee0a2f674688e3b01010225290100010565a49ce5d4594d753b01010200252901000105288692b047dcfd433b010102252901000105646188a8c6cf9400cb3b010102252901000105c96f933b139de9163b010102252400001fb22c0800010226020304040010010301260302040100280202032c0c03042d0a805800000400280402042d0a8058000400280402042d0a805800042c0d02030028030200032c0e03022c08010326020404050010010401260303040100280302042c0c0004052d0a8058000500280502052d0a8058000500280502052d0a805800050000280502052c0e01052d08805500042c0c02012c0c03022d088057000325240000001fb22c0d04050b280005805500062302000600003f5626020704003b0901000726020504062c0800062c0c01072c0c02082c0c03092c0c040a00100005000024000043d32c0400002c0d01052c0d02062c0d03072c0e05012c0e06022c0e0007032d0a80590004002806020201280002805700032c0d0301252400001fb2002c080105260206041100100106012603050401002805020626020704100038000706072c0c06080c38080709160c09092302000900003ff92d0a805700080000280802082200003fd82c08010600000102012c0e05060c38020305230200050000004078220000401801280003804f00070e3803070823020008000040322400000024b30c38020708230200080000404f22000040442d08804f000522000000406f02380203070e3803020823020008000040662400003e5e2c0c070522000000406f2c0c050422000040832d088057000422000040830728000480500002002c08010500000102012c0e020526020804040638040809043809080a023804000a070b2800078057000823020008000040e422000040c101280002805a0007000e3802070823020008000040db24000024b32c0e070522000040e42c0d0507002d088057000222000040f30c38020705230200050000410e22000041052c0d0006012c0c0402252c08010800000102012d0a805700082d08805700052200000041280d280005805000092302000900004197220000413d2c0d06052c0d08090026020a04100c38020a0b2302000b0000415c24000021602d0400058003270000800404001124000021722d0880050008002808020a00380a020b2c0e090b0100280002805a00052c0e08062c0c050222000040f3052800028050000a26020c0004000b28000c8050000b2302000b000041ce0728000a8050000e0a380e020d002302000d000041ce2400003e7000380a050b0e380a0b0c2302000c000041e50024000024b30c380b040a2302000a0000420222000041f72d08805600092200000042470038030b0a0e38030a0c2302000c0000421924000024b326020c04e0000c380a0c0d2302000d000042302400002160002801020c00380c0a0d2c0d0d000b2c0c0b0922000042472c0d080a1928000a805e000b1c0c090a0400380b0a00090e380b090c2302000c0000426f24000024b32c0e090801280005805a0009002c0c09052200004128290100010561be47556b1380913b01010225290100010005b87a3944b3b13c563b010102252400001fb22c0d03062c0d04070b280007008055000823020008000042ce26020904003b0901090b2800068053000723020000070000435f22000042e32c0d01062c0d02072c0d03082c0d040926020b0400030c38080b0c2302000c0000430a24000021602d0400068003270080040400000424000021722d088005000a00280a020b00380b080c2c0e050c0128000880005a00050e38080506230200060000434a24000024b32c0e0a012c0e07022c0e0005032c0e090422000043d226020604072c0800072c0c01082c0c02092c0c03000a2c0c040b001000060024000043d32c0400002c0d01062c0d02072c0d0408002d04000680032700800404000424000021722d0880050009002809020a012800000a8057000b2c0e050b2c0e09012c0e07022d0a805a00032c0e08042200000043d2252400001fb22d088057000522000043e30d2800058053000623020006000000444e22000043f82c0d01052c0d02062c0d03072c0d04082c0801092602000a04050010010a012603090401002806020a26020b0404002809020c3e0f00000a000c2c0d090600280602062c0e06092c0e05012c0e09022c0e07032c0e080004252c0d03060c3805060701280005805a0006230200070000446c22000045001d2c0d01072c0d02082c0d03092c0d040a26020c04040c38050c0d2302000d00000044932400002160002808020c00380c050d2c0d0d0b26020d04030c3805000d0e2302000e000044b82400002160002807020d00380d050e2c0d0e0c0038000b0c0d26020c04040c38050c0e2302000e000044e224000021602d0400088000032700800404000524000021722d088005000b00280b020c00380c050e2c0e000d0e2c0e07012c0e0b022c0e09032c0e0a04220000451d2c0c06052200004300e32d0018ca18ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/protocol-contracts/fixtures/PrivateFunctionBroadcastedEventData.hex b/yarn-project/protocol-contracts/fixtures/PrivateFunctionBroadcastedEventData.hex index d0c70439023e..ba589897a334 100644 --- a/yarn-project/protocol-contracts/fixtures/PrivateFunctionBroadcastedEventData.hex +++ b/yarn-project/protocol-contracts/fixtures/PrivateFunctionBroadcastedEventData.hex @@ -1 +1 @@ -000000001b70e95fde0b70adc30496b90a327af6a5e383e028e7a43211a07bcd23ced3716a04d81b58822bc3e1843626aa2884888b1a2d2250e79fb7d41a365e16ad977a85a570bedc6785d159f137035d3bf9891042ee3af20488686aec168b049fe6a55fa21b718224c0f6e69887dd82e302b6b658c9db0a389672582a343d00a5215d923c08e46ef8298acff37a856da61be92fe1536dd7b4e10cfec9590c233d10e0c959338e062b1c76fb81e17fcf61643da568eac372bb7feac8bfa35717720805123feb41cde00457a83a9919a315c55d6117267f05edefe119df9a7a1a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac9372a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf685400000000000000000000000000000000000000000000000000000000000000050aa8c40de16e14b1d7789457012932df51eab8d07d3506a2bf3c0dd0d03cab1503b075046b71ff5f8e0792de4b82ddc979fcb3b8c03abe12972e65c57759fb461d1c34ad4b418b30c4c8b87939b97bc03d94d24d469d3cb2f419ffe6bd93f96c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000d9e0e7f11eef7f2eaafa09e24b0475a918bd7388c4dec305145849f5f84d1b822202b944000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cb001f8b08000000000000ffe59d057814471bc7f73609108a954285da4129dac2005d04922aee4e71bd241708924012dc823b454b71eaeeeeeeded29642dddd5d00bfff1b769b61d9a4d0cca4f93fdf3ecfefb9bdbdbddddf3b333b33b7b73b1b00b0f64d7b6dcbbadede371f0031ceab2c0a7a96b9afea7caccfb20a3edfade200b3ac9acfb21a3ecb6afa2c3b0ab4f22c3bd167bda0cfb2ba3ecbeaf92c6be0002c53a780f3daca794d0cb5484a8ab64c888613c39150426a5a4a72282939ad00454a38259c9c929c91909298184d494a69999a96da32941a4e4a8c8633935300133343fba62e76d1b642a59a12d24d7a76fdf79e49de05e256db293baeaba400c39fce7c43ab68be9132dfd559c7fd5e37bcef0e7a809e76d172778af1a44100a87453b8b1c66d75b3f5e54d2f6d65c83f6f7a2979d35d99efa1ccf7f4e44d006fbcef03fa82737cf2c6d69c370d3496f57efad233acd627b2dd205ee394b400f54e01cde912b0f4960dd7b18633df1f310d0003c12030180c0143c130301c008c00234104a481749001a2b69318314a8130991843351e283ebabab69da0a60045a6f366946deddf3ac9077f7896c94ade52a5bb161caaa1e68a663a93c65a007094a1ccd55d53e98c79b4b2ad704a624242cb44592f2523144eca484f48490048c8484b0aa58722e909d1d4a4706a66524252627a467a1ab619096786322300e9a99929fbbce440747b73de49f78138dad65f2bc994651b14ceb2f56f778c00c6c2602aee314a75a469bbbeae3a2a8031b6feed8ed55c58ddca5ab65bd62d00e008c216709cf366bcb7051ce7d3028e2f83167084c616709cc60a603c490b00a833e66cd21630db500b98631b14ce31d0024e28e72da0c43d81a4051cefb800eadeee44432de0c4ffa0054c236c01739d3779de1630d7a705cc2b8316304d00630b98abb102c823690175c69c4fda02e61b6a0127d90685271968012797f3001650e29e4cd202e639aebab73bc5500b38e53f6801a3842de054e7cd346f0b0038d5a7059c56062d6054630b38556305308da405d419f374d21670baa1167000866d50788681167066396f0125ee99242de034c755f77667196a0167292d6000591d78830d1d78b36d83c2b30d1c7873caf9812771cf3170e09565611b62a800b015d806850b0c14b6b9e5bcb049dc73496af951ce81a1bb5ba6b342986773001eb0c30c1db0f36d83c2f30d1cb00bcaf9012b712f206f1d861b2a6c0b6d8300c20b0d14b645e5bcb049dc8b485a87f1ce81a1bb75d059212cb6cda661a8740053616f659e81df514bca79dc52c6171b887b29696f60a4a10a7a996d50789900810a7a7939afa025eee5e4bd8188a1c2b6c23628bcc240615b59ce0b9bc4bd0092a43790e71c18ba7b033a2b8455e5bc5594567ba98156f1dc721eb794f1550006e25e4dda1b48375441afb10d0aaf315041af2de715b4c4bd96bc379061a800b0adb30d0aaf3350d8d697f3c22671af27e90d4c730e0cddbd019d15c2867200de2a4aabbdda40ab785e398f5bcaf80603716fd41cb73be9f63c5f9b6762920049cf4dffde33c3bb40dcbc37844b3ab8377e0f56e68728f39becfd6f08df8c00f75bc056b0cd367fb3bec6db41c39b35d66ddb0d9575dde9a7f15fb0f0168d00e9b78324fd34feb113deaa31fd766aee547aeb86ed4a1db04399dfa9cc6ff300d40d17e0fd85e022707119d40d1a6f940b5fa0316f2e2129db1acf89872fd400987e9792a49fc6d3bce18b34a6df6586eb864b943ae05265fe3265fe624fdd007039de5f01ae04579541dda0f116a2f0e51af3e66a92b2adf10c59f80a8de900770d49fa693ce913be5263fa5d6bb86eb85aa903ae51e6af55e6aff2d40dd700d9fb06afbb01dc58067583c69b2bc2d769cc9b9b0ce7cd4d4a1e5cafccdfa000ccdfe8c99b9bf1fe16702bb8cdde7f7b6a9ee83867b2d1c03989db35e6b5a5004cba3defd0e6194ef3cbfb3b943ceeafcc0fb28b1f98ef4ebcbf0bdc0dee290083e37280c6bcba53e37179afe1e3f25e250fee52e6ef56e6eff1e4cd7d787f003f78003ce89337bacbe743ff3e0d120f260dd4f2395099bf4f997fc893060f00e3fd23e051f05819a4c1e3faca41a69f5fa8745358eaeadb0dd4a14f182eff008f2b79fc8432ff700979ff24de3f059e06cfd8ff3c306569d320a0319f9e3400d487d59defcfeaf3ccf0cbf76795fc95fc72e77b9790efcfe1fdf3e005f0e20041e47ba874537890c676e4398df95e967f600fd07cfcbbd34bb641e1976cfd00dbdda5b130988a7b975d94c09ab66bf487b2baadd2a6e9008df9f332e9c1fa00b2a183f515dba0f02b060ed657cbf9c12a71bf6ae860d5dd13d8e5b8ea6e5d0077d9e533bfe3aca25e49719326ef44d94f8c67dbbacb5a434b7f63a0dbb11100816363038e8543264841ab601d38e90e40e3cf18238306252727256646232d004da641ef32faf9152add14ee47e2196b95ef32e54e6a65bedb79f39aed2488003b8e897c10f408e86ef5766b6ca9f6d87a2b07371df6f8a483ee82f39aa10200ae3bbff668ccafbd86f26bef41945b1dbd605dee4dacb2c9fbf274deaf294900ccb6c6984f2189394663cca792c4acb1e10e372ba39843a59bc2cd35a61f4b00473264717886493c13483c13493c93483c93493c5b9078b624f14c21f14c2500f13c8dc4f37412cf33483ccf24f13c8bc4f36c12cf56249ead493cdb9078b60025f16c47e2d99ec4b30389674712cf4e249e9d493cbb90787625f1ec46e2d9009dc4b30789674f12cf5e249ebd493cfb9078f625f13c87c4b31f89677f12cf0001249e03493c0791780e26f11c42e23994c4731889e77012cf11249e23493c0023249e69249ee9249e19249e5112cf4c12cf51249ea3493cb3483cc790788e0025f11c47e2399ec4339bc43387c4730289e74412cf5c12cf3c12cf7c12cf4900249e93493ca790784e25f19c46e2399dc4730689e74c12cf59249eb3493ce7009078169078ce25f19c47e2399fc4730189e74212cf45249e8b493c9790782e0025f15c46e2b99cc4730589e74a12cf55249ee79278ae26f15c43e2b996c473001d89e77a12cf0d249ee791786e24f13c9fc4731389e76612cf2d249e5b493c00b791786e27f1dc41e2b993c4f30212cf0b493c2f22f1bc98c4f31212cf4b49003c2f23f1bc9cc4f30a12cf2b493caf22f1bc9ac4f31a12cf6b493caf23f1bc009ec4f30612cf1b493c6f22f1bc99c4f31612cf5b493c6f23f1bc9dc4f30e1200cf3b493cef22f1bc9bc4f31e12cf7b493cef23f1bc9fc4f30112cf07493c1f0022f17c98c4f31112cf47493c1f23f17c9cc4f30912cf27493c9f22f17c9ac400f31912cf67493c9f23f17c9ec4f30512cf17493c5f22f1dc45e2f93289e72b00249eaf9278ee26f17c8dc4730f89e75e12cfd7493cdf20f17c93c4f32d12cf00b7493cdf21f17c97c4f33d12cff70d79da1ecff2f42cee0fca28e650e9a6f000871ad34f7d8e7da89493c9f2f891c5e1f93189e727249e9f92787e46e2f9390089e717249e5f92787e45e2f93589e737249edf92787e47e2f93d89e70f249e003f9278fe44e2f93389e72f249ebf9278fe46e2f93b89e71f249e7f9278fe4500e2291b64f00c9078da249e31249eb1249e71249e15483c2b92785622f18c2700f1ac4ce2791889671512cfaa249ed5483cab9378d620f13c9cc4b32689e71100249eb50c7996e7eb026aff1fc67ce4ff61cc47911c8347074a9f7ea991b4f40050383962d2f318923214ab31e63a243137d718f3b124c7cd71659437a1d24d00e1e303faf2b99fcd11f3091a63de4d724ddb8924c74d90c4b32e89673d12cf0093483ceb93789e4ce2d980c4b32189672312cfc6249e4d483c9b92789e42e200792a89673312cfe6249e2112cf3089670289672289671289673289670b12cf0096249e29249ea9249ea791789e4ee2790689e799249e6791789e4de2d98ac400b33589671b12cfb6249eed483cdb93787620f1ec48e2d989c4b3338967171200cfae249edd483cbb9378f620f1ec49e2d98bc4b33789671f12cfbe249ee7900078f623f1ec4fe23980c4732089e72012cfc1249e43483c8792780e23f11c4e00e23982c47324896784c4338dc4339dc43383c4334ae29949e2398ac473348900671689e71812cfb1249ee3483cc79378669378e690784e20f19c48e2994be2009947e2994fe23989c4733289e71412cfa9249ed3483ca79378ce20f19c49e200398bc4733689e71c12cf0212cfb9249ef3483ce793782e20f15c48e2b988c400733189e71212cfa5249ecb483c979378ae20f15c49e2b98ac4f35c12cfd524009e6b483cd79278ae23f15c4fe2b981c4f33c12cf8d249ee793786e22f1dc4c00e2b985c4732b89e73612cfed249e3b483c7792785e40e2792189e745249e170093785e42e2792989e765249e9793785e41e2792589e755249e5793785e43e200792d89e775249ed79378de40e2792389e74d249e379378de42e2792b89e76d00249eb79378de41e2792789e75d249e779378de43e2792f89e77d249ef79378003e40e2f92089e743249e0f93783e42e2f92889e763249e8f93783e41e2f9a400214fdbe359dae73036d018f353651473a87453f8e980bef4db6b7394c76748008e9b67493c9f23f17c9ec4f30512cf17493c5f22f1dc45e2f93289e72b249e00af9278ee26f17c8dc4730f89e75e12cfd7493cdf20f17c93c4f32d12cfb749003cdf21f17c97c4f33d12cff7493c3f20f1fc90c4f32312cf8f493c3f21f1fc0094c4f33312cfcf493cbf20f1fc92c4f32b12cfaf493cbf21f1fc96c4f33b1200cfef493c7f20f1fc91c4f32712cf9f493c7f21f1fc95c4f33712cfdf493cff0020f1fc93c4f32f124f8be4fa900089a74de21943e2194be21947e25981c4b3002289672512cf7812cfca249e8791785621f1ac4ae2598dc4b33a89670d12cf00c3493c6b92781e41e2598bc4b33689e791249e4791781e4de2790c89671d1200cf63493c8f23f13c9ec4f30412cf13493c83249e75493ceb91789e44e2599f00c4f36412cf06249e0d493c1b19f2b43d9ea5bd0f3a4e63cc8d4962aea031e60026243157d418735392982b698cf9149298e335c67c2a49cc9535c6dc8c24e600c334c6dc9c24e62a1a630e91c45c5563cc619298ab698c398124e6ea1a634e002489b986c6989348623e5c63ccc92431d7d418730b92988fd018734b92986b00698c398524e6da1a634e2589f9488d319f4612f3511a633e9d24e6a335c67c000649ccc7688cf94c9298eb688cf92c92988fd518f3d924311fa731e6562431001faf31e6d624319fa031e63624319fa831e6b624310735c6dc8e24e6ba1a63006e4f12733d8d31772089f9248d31772489b9bec6983b91c47cb2c6983b6b8c0039d6da774d40d009b809680a4e01a78266a0b9ec07844182a4054802c9a00500680952402a380d9c0ece006782b3c0d94eecad411bd016b403ed4107d0117400029d4117d0157403dd410fd013f402bd411fd0179c03fa81fe60001808068100c16008180a8681e16004180922200da4830c1005996014180db2c01830168c0003e34136c80113c044900bf2403e9804268329602a9806a683196026980566008339a000cc05f3c07cb0002c048bc062b0042c05cbc072b002ac04abc0b96000355803d68275603dd800ce031bc1f96013d80cb680ad601bd80e76809de002007021b8085c0c2e019782cbc0e5e00a7025b80a5c0dae01d782ebc0f5e006700023b809dc0c6e01b782dbc0ede00e7027b80bdc0dee01f782fbc0fde001f0200078083c0c1e018f82c7c0e3e009f024780a3c0d9e01cf82e7c0f3e005f022780009ec022f8357c0ab6037780dec017bc1ebe00df026780bbc0dde01ef82f7c000fbe003f021f8087c0c3e019f82cfc0e7e00bf025f80a7c0dbe01df82efc0f700e007f023f809fc0c7e01bf82dfc0efe00ff027f80bc8411600368801b1200e005400154125100f2a83c3401550155403d5410d7038a8098e00b5406d702438000a1c0d8e0175c0b1e038703c38019c0882a02ea8074e02f5c1c9a00168081a0081c6a009680a4e01a78266a0390881304800892009248316a0254801a9e03400703a38039c09ce0267cbbdf0a0356803da8276a03de8003a824ea033e802ba00826ea03be8017a825ea037e803fa8273403fd01f0c0003c12030180c0143c10030301c8c00234104a481749001a220138c02a341161803c68271603cc80639006002980872411ec80793c06430054c05d3c0743003cc04b3c06c30071480b900601e980f1680856011580c9680a56019580e56809560153817ac066bc05ab0000eac071bc0796023381f6c029bc116b0156c03dbc10eb013c8b3ede5b9f1f2004c7679deb93c4b5c9ed32dcfc096e74bcbb39be5b9c8f2cc61799eaf3c2b57009e432bcf7895e7a7cab349e5b99ff24c4d795ea53c0b529eb328cf3094e70300cab3f7e4b976f2cc38791e9b3ceb4c9e2326cfe8ba1fc8b3a5e4b94df24c240079de903ccb479e9323cfa091e7bbc8b353e4b924f29c0e7906863c13429eb70020cf3290e704c818fc32bebd8c1d2fe3b2cb98e7329eb88cd52de360cb18d300327eb38c8d2ce30ecb98be325eae8c45fb36903154657c5219fb53c6d59431002b653c48196b51c63194310265fc3d19db4ec68d9331d964bc33194b4cc6e9009231b0647c2919bb49c645923187643c1f192b47c6a191315e64fc14199b4400c6fd90313564bc0a190b423a143286818c0f20f7decb7ded72cfb8dc8f2df7003acb7dc4728faedcff2af796ca7d9b724fa4dc6f28f7f2c97d72720f9adcdf0025f74ec97d4972cf8fdc4f23f7aac87d20728f85dcbf20f706c875f7724dbb005c2f2ed7624bfb2ed710cbf5b972edab5c572ad76ccaf59072ada15cc727d700b5c9755e72dd935c0724d7c5c8752272dd845c4720ffabcbffccf2bfabfc0f0029ffcbc9ff54f2bf8dfc8f21e7f5e53cb79cf795f3a0725e50ce93159e370200725e417e67cbef4ef91d26bf4ba49f2efd56e9c749bfc6de57555ad22f91a90089553439c968c5389fcb357d728d9b5cf325d740c93541728d8c5c3322d75000c83505f21fbbfce72cffc1ca7f92f21f9dfc6725ffe1c87f1a728e5fce79cb00396039272ae708e59c999c4392732a728e417e7307415d500f489f5dfab0d200a793e7d334048d4063ebc0a9b2325f4b993fce798de4e747c74fc80fe6e70400231919c12959f9a3833993a3b999e372a45b51d87f70a77ace6be7ecacfcac00c8b8ace991fcac9cece0e848dee860464e342f989d931f1c1fc94f97ce4c6100cfc29d42de6f46736577b9d1bcbc60d6beefe58f8e06d373b2f37323e9f9c1008ce8847139d3a2d2d929ec8d1caaf5aa43fc4ec0c90dcb494d77aae6bcf6cd008fa48fc53773601695aab8b0cf2453b3835a7b89f349eb435abbb3b2f631ee0016727323d38259d919d1a9c19c49f9c19ccc605acea4ec8c3cf58b7d0e31fc00c2922c935b82e29d57f757887b44b472de874a3785e395edeade7e4a28392900deda7fd2ec9f186f15d506a6d247b6196366fb8557a9cad4b6a068fb6a2cee007eab3aef034a5abadf911aaf86f21d751b96e3ebfdaefbb9c9f852424949f100d6feb5b8def40b175e2d26534cc181e9e77e165be09f9e32c515ecefe5a6a7007b944b0bd1ce59a786f2797d653bdef40e9441dacac56d01cffe2c6bff74f600c65cd9327bac043cfb737dbce9e3ce5771d257a651d1fcb64e9bd3393b2f3f00929d1e554350375bc327443509fcd6f1aee75dbfaacfe7aea67422dc6aac620041d1e73aab0177bf959cedc7594559e9eeb370b9336f7bd657e703cef7d56500272971c914af7ccfdd4f8cb2ccdd6775e77d05e5b3f8827fde56accfb66af800ac5fc1b3ad8a3edb5297b9714b67af8e33afe64facb23d5df9d332a5287fdc003452f3479d6295cfd5f51b39ef6b5afe93c4e076cdb89bfca49665d5e41b6a00920d3759fe4dbe37164b59e6aee7fd8eac5752b7c064d7c87cd35e94cf15cc006c3fc14db73825ed627d6272f75fd53ab0790b14f36a59fe4db1bbafca96d100321c2e2936d5df2d1b353cebab69f05fe6839a3e6a3ec874b05dbe38cf67c50075f9ea28eb15d70d97f54e76e6a5ebd2d1d996a5a4954cacfd84fa4acc85f10028df63ed271cebcc4b1b2bf9d7d42ada5671e5ceafbb5add3ab06e88f36ccb00afeb1be7b32df7a4944c1370d6a175eea849e3a3d9f979de0eabba03cb674300eacedde5c53528deefc42aebab134387aab9f3bea40e557f679ebc43955656001daa8a66b6dfc2dd7e2533dbf7ed50a9b1b8fb758f8976054569d9ae607f2700779d0eca3a1d8a5947adfc3b2aeba8c75f27659d4e9e754aeabcf99d5768e700f94cad6cda7b3e538fa50e9ecfd40aa9a3e7b30ad681be927eee196bb7d2ea005cb07f2cea675d94cf5cff2394effcdd2859fbae0a50f75fb168f7079c473100547e120fb6f3e6eebfb265f478f9bbf356c9e3e34d1fbff328e99171e37ae500664d8ee4473b4cca4e97bf05d410d4cdda3e2116d7cca8c5c2bb9eb798faf50091633defe33cefddedabfb29eefbde65aa8f3b5fdd677945cf3adeecf62ef300f68d2bfaeccfef100e14f3eaeec7fa87fdf83997749af150f763fa94760d8f00abbaafea3efbf6a6ab5f1faaa4df2c157df663f8b769b25f55ea4edeaad4af00bca8cedee3d0f2c4af4e6a4c721cb755b6eb5dcfebe3f75b2ac613875fb98800b1ac62fbbdea36fcba9cee7cbccf7e747631fc9a2f6ffc251dbf6ad372a8f900f1f76f28ebd0f2434d23ef71ae1ed3debf80bcdd589918baec6d9cf72575d900d52e815f5d11f07ca6a693b77e3354d6fe3e5fe19635371dbc3e71cae7eafa005dfe211d02d681c75849f5a0d7475ddffbfb5426bfdfb1153c9f9594aeffc500392bbfe3c11b7705ebd0f2a1aff35a5c3ef8b563eab924ef7ed463b1929266003255b68ca45942bcb24f03db0f55b40e9cd40b590ef37ce6a6955fbd1028e600bded792d69dd4009dbadeaf399faf3c3bb2cdef35a4bd99e89d303b5cd6cdf00378fd40b8c6a7be254d3b9952607777beeb1e9d72fb23d9fa9e75455bf807e00bfb0d725c6675feea49615f7f3ff018d8be2fd060d020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +00000000000000000000000000000000000000000000000000000000000000030abf338154e355442d9916d630da0491036d5a7b23c42b477c1395ba3bf9b42d1a9ddbb308ed22ba60da2f2e98f3701846e4464d42ec98d15f7225fc0568e8ce3049fd9d18d6a3e6f07206670af0861939fb59708f11c4bddd4019aad0b7f2ea0602a113eb715538d26370d53819aa5d1f653c7f0509a2aa9c5abdc03872a87d0c4557e746c247100779af4a2e4e5eb5e8556261d414978ecc8c775d79957343233d10e0c959338e062b1c76fb81e17fcf61643da568eac372bb7feac8bfa357256c06f8384f82f77f7ab3eb47b9c467f6f329051a00163f3125041dab91c7481a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac9372a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf685400000000000000000000000000000000000000000000000000000000000000051fc7418174246337dbc421413553f3870957829e976a6651f2f07ea092d8e9bf03b075046b71ff5f8e0792de4b82ddc979fcb3b8c03abe12972e65c57759fb4624b0baef5786684223885b4aee14327729edb03f2b1e3569f1644a7c25734ff500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000d9e0e7f11eef7f2eaafa09e24b0475a918bd7388c4dec305145849f5f84d1b822202b9440abd64ffdf5d26f9e76c5f44d89a59e72b697a293d8dcd308b64b1d10fef9ece0000000000000000000000000000000000000000000000000000000000005504001f8b08000000000000ffed5d07781cd5f1dfd349b22559d661e3826d8a0db800db5c530383257763dc7bc158d5181c4cc02601427209a49346420a8150fee900bdf7427aefbd17d27b486fe43fcfdc48a3b9b9d59e6e9e7c93f87ddf7cb7b700efedcc6fe6bd9957f6ed6e2c7838dd1b0f826be30f1fc780e2f9df2aa0b3d80039fca5c73542b906e15ca370ae4938778a706e3250073b77a650ee2ce1dc4c00e1dc2ce1dc9cfc399a62f9df8efc6f26d992cdf6b5a6fb5299545732dddedd00d69ccc3677b7b4a5da52cd6dcdbde9b64ca6af2ddbd6dadeddde9a6c4f6533007da9fee6f64c7ff2e194880ff24a9695d23d3e719e32729c597ec2619b0054004db03a3b3c943f9e1b0c1ecf23c7a7e4cbe07513e0ff44a0538126c507cf63008a331b24cb4ba9f98abc26c4f5ea66b25a1b92eb6632a99b89e4f854723c8900d5cd14f83f15e834a06942dd5429d7cd1cc5b63e5dcf9e291a4f1cdfb3986d00798a29db2516e8b60dc498c81fcf009d4e073a03e84ca71fd04ca059406703009d03742ed06ca039407381e601cd075a10cf1b630c69103e8d314bd15104b8005abcd3d4160bf3516c11ef715dc6bfd9395788b72aed28384b2172f5f53f9c00162a46c1458a95eb1ae5d8209a87968b9bda20d59649a75b33ae5c5b6f329500eded49b7a5d3bdddd9644fb2ab27ddd79e4db5f767d3d94c4f6f4f37f0ec4a00f527fbbb7adafbdb1ee645f12e8e7b04ec98f3105e2ef8c58a61f73cc586e500cb86e7c50bf9966bc3f394239cb6de8b8ae85d2edfa4f21008036a32dfce4700b3973ad7602f95ca079b34efa552422f951e855eea5cc55e2aa5184cd2467b00a994a75e2a13f70838e3a197ca28f652d90aefa59c0db31e7aa96c85f752e900227a97cbb7d9532fd57c027aa9b9067ba9967cb069e5bd548bd04bb58e422f003557b1976a510c26ad467ba9164fbd545bdc23e0360fbd549b622fd55ee1bd0094b361bb875eaabdc27ba9d6227a97cbf77c4fbdd4f927a0975a60b097ba20001f6c96f05eea02a1975a320abdd402c55eea02c560b2c4682f7581a75eeac200b847c0177ae8a52e54eca52eaaf05ecad9f0220fbdd44515de4b2d29a277b9007c977aeaa596c60b7b266dec1d6ad853ddd20ddb0e72637606393e335efc66007a27fc5f06b41c6845dcffcdf4d3157dbf53d1f7572ab72b5e372b491d2c2300c7cbc9f10a5637abe0ff6aa035406b85bad16e9f178fdc06992836a0edf30c0072bc8a1c5fcc6cb00efe5f02b41e68c328d860a35a3bc8647de2dc34729cbd00c90875b591d4c959e4782639dec4ea6a33fcdf02b41568db28c412c55bbfa900cd8ab164bba7d987b6fdce56b4df1645fbed3062bf7314edb755d17e3b3df70065db490cd8418e7792e36d2c36ec82ffbb81f600ed1d85d8a078c32db54bb1006ef61969dbb315edb75bd17e971ab1df1c45fbed51b4df7ecfb1611f8901970092e3fde4782f8b0d97c1ff03405d40dda3101b146f73a42e53ac9b1e236d7b009ea2fd0e28daafd788fde62bdaaf4bd17e7d9e63430f8901bde4b88f1c77b300d8d00fff0f025d0e7468146283e2e272aa5fb16eaef05c3757903a38488e2f0027c78758dd5c09ff0f033d02e8aa51989b1fd1b341bf64832344d72bc9f1ba0090f589abe1ff2381ae893ffcf054753e2f168cce46ffab15db055dff3c9a7700ac63b8408abf2e23c7ce1dcb9fa349db31af5674a6a3d179f50cc32b754cb100025cc3a90ae45ba44189f61c0e77e0b1511e550e5698aee38dd19d18ee36a800666319066b6a98fce4758a8df85171b5c630e44ec8a3223873b9d88f29da4100d3a68f2ec1a6c3c9a2367d34099a63893da94d93e5a5d443e1fcd23dfda94c00735f6b73b2a52bdbdcdb9249f7a65b93bdd9e6fe14004eb767c134fd3dd9b600deb674a63fdd9aee794817dff13686810d3b12ec558fe58faf87df1b806e8c008fee7e911b3dcd1c94eb78c87e91c7e41bd14d3c28ba0cbe5fe4a608813259005e1a62c472f78b3c46d1a96f52eea1476bbf08b581e67e91c7c63d0276ccb500f78b3c56714ef638c586e5cb868f8bebef17799c7284d3d6fba6227a97cb3700a73c14c5809a8b17f64cdaa324cdfb73d72bb6fbc79fa0809a2c2fa51eafdc0016303d21ee11f013e2fa7c6ff61c0493e5a5e37adf4cc6c84a7c431775cbb50083e6cde01b14ebe716a3ce7a8b27677d62dc23e0277a70d62755b8b33abd9f0034cace9a2c2f0de90d93e525d560fa64e5465f97afef2793b9f60de4f8e6f800e04af5d9e4fc39e4181fdb7e0afc3e15e869f9ffc8fbfa22bc6f22bc872bf30074f8bd15e819713fbe7973be8d6a8f2e9f59e1a36a5f7a3f4bd17f0292aa940071dea4e89bcf56d699eb9a2c2fa59c7f6ad68bf3c9677a683bcff1b4d6a6dd0076d28a6de7b60a6f3b2ef62b2e93a59caf3cc743db79ae72dbd1b6a36b339a00630bd76e9eebc18eb1c08f0f6ae37c9e9e2d7ba53bfecf236311d716f0784a00bcf81dffdbe1fff3815e00f4c2b8ff571c9ea918876e373a19547c6a68c86400f045718f805fe461327847854f069dde77185bb9f1d550cbc5f562a3cefa62004fce7a67dc23e03b3d38eb5d15eeac4eefbb3c39abf648e08e3c56eddef58e007865d6b773585735554161d26e07be4683caedaa7b80216eb2948ca32c34830037fd7c56c0dc40bf02b431ce338071be078cc71b5a4d9e02cf0da1d23db1b900399be9efeb6af56983299ed687b4714e378233aec76bc80ef197e4a3e2ddb80025027f5dc659c1d0a4dd6dbf44b1abbd27aeebc068877b043b6857eeddca730084da6074e608be039d7a83bb47b1c1ddeba9c1dd1bc1f12a69b2bc20f0d30800b475566caca9854674ae52d47991119d157bcad4e251d239595e4a9da7683f002b23b764600367ca08ceb4119c192338b34670361bc1d9620467ab119c6d460070b61bc179be119c1718c1b9c408ce0b8de0bcc808cea546707618c1d9690400e7322338971bc1b9c208ce954670ae328273b5119c6b8ce05c6b04e7c5467000ae3382f3122338d71bc1b9c108ce8d46706e328273b3119c5b8ce0dc6a04e700362338b71bc1b9c308ce9d4670ee328273b7119c7b8ce0dc6b04e73e23382f00358273bf119c9719c179c008ce2e2338bb8de0ec3182b3d708ce3e2338fb8d00e03c6804e7e546701e3282f30a2338af3482f3b0119c8f3082f32a23388f1800c179b5119c8f3482f31a2338af3582f3a8119cc78ce0bcce08ce4719c1f968002338af3782f30623386f3482f3314670de6404e7638de07c9c119c3923381f006f04e7138ce0bcd908ce5b8ce07ca2119c4f3282f3c946703ec508cea71ac100f93423389f6e04e7ad46703ec308ce671ac1f92c23389f6d04e7738ce0bccd0008cee71ac1f93c23386f3782f3f94670bec008ce171ac1f9222338ef3082f300c54670de6904e75d4670bec408cebb8de0bcc708ce7b8de0bccf08ceff338200f3a54670becc08ce971bc1f90a23385f6904e7ab8ce07cb5119caf3182f3b5004670bece08ced71bc1f9062338df6804e79b8ce07cb3119c6f3182f3ad467000becd08ceb71bc1f90e2338df6904e7bb8ce07cb7119cef3182f3bd4670becf0008cef71bc1f9012338ef3782f38346707ec808ce0f1bc1f91123383f6a04e700c78ce0fcb8119c9f3082f39346707eca08ce4f1bc1f91923383f6b04e7e78c00e0fcbc119c5f3082f38b46707ec908ce2f1bc1f9152338bf6a04e7d78ce0fc00ba119cdf3082f39b46707ecb08ce6f1bc1f91d2338bf6b04e7f78ce0fcbe11009c3f3082f3874670fec808ce078ce0fcb1279c550c67257d97fa27a3a473b200bc94faa9a2fdee31f2bde29f053670fedc08ce5f18c1f94b23387f6504e7af008de0fc8d119cbf3582f3774670fede08ce3f18c1f9a0119c7f3482f34f467000fed908cebf18c1f9572338ff6604e7df8de0fc87119cff3482f35f4670fedb0008ce878ce0fc8f119c8ea1059c312338ab8ce08c1bc1596d04678d119cb54600708e318273ac119c754670d61bc1d96004e73823381b8de01c6f046793119c000923384f31827382119c138de03cd513ce4ade1730e97f50e7c946dae3945800f9f66befeaee49a69abb7cd64d5c51e7a946dae3798a3a9f66a43d4e1ba5ba0049969752d3637af53c3d6e43e7198a3abfc4c8bea9d38df8cd1946709e690400e7594670ce34827396119c671bc1798e119ce71ac139db08ce394670ce358200739e119cf38de05c6004e74223381719c1b9d808cef38ce04c1ac199328233006d0467c608ceac119ccd4670b618c1d96a04679b119ced46709e6f04e7054600702e3182f34223382f328273a9119c1d4670761ac1b9cc08cee54670ae30820073a5119cab8ce05c6d04e71a2338d71ac179b1119ceb8ce0bcc408cef54670006e308273a3119c9b8ce0dc6c04e7162338b71ac1b9cd08ceed4670ee30827300a7119cbb8ce0dc6d04e71e2338f71ac1b9cf08ce4b8de0dc6f04e76546701e003082b3cb08ce6e23387b8ce0ec3582b3cf08ce7e23380f1ac179b9119c878c00e0bcc208ce2b8de03c6c04e7238ce0bcca08ce2346705e6d04e7238de0bcc60008ce6b8de03c6a04e7312338af3382f35146703eda08ceeb8de0bcc108ce1b008de07c8c119c3719c1f95823381f670467ce08cec71bc1f90423386f3682f3001623389f6804e7938ce07cb2119c4f3182f3a946703ecd08cea71bc179ab11009ccf3082f39946703ecb08ce671bc1f91c23386f3382f3b946703ecf08cedb008de07cbe119c2f3082f3854670bec808ce3b8ce07cb1119c771ac17997119c002f3182f36e2338ef3182f35e2338ef3382f3ff8ce07ca9119c2f3382f3e5460070bec208ce571ac1f92a23385f6d04e76b8ce07cad119caf3382f3f54670be00c108ce371ac1f9262338df6c04e75b8ce07cab119c6f3382f3ed4670bec30800ce771ac1f92e2338df6d04e77b8ce07caf119cef3382f3fd46707ec008cefb008de0fca0119c1f3282f3c346707ec408ce8f1ac1f93123383f6e04e7278ce000fca4119c9f3282f3d346707ec608cecf1ac1f93923383f6f04e7178ce0fca200119c5f3282f3cb46707ec508ceaf1ac1f9352338bf6e04e7378ce0fca6119c00df3282f3db46707ec708ceef1ac1f93d2338bf6f04e70f8ce0fca1119c3f320082f30123387f6c04e74f8ce0fca9119c3f3382f3e74670fec208ce5f1ac1f9002b23387f6d04e76f8ce0fcad119cbf3382f3f74670fec108ce078de0fca311009c7f3282f3cf4670fec508cebf1ac1f9372338ff6e04e73f8ce0fca7119cff003282f3df46703e6404e77f8ce00caa6ce08c19c159650467dc08ce6a23386b008ce0ac3582738c119c638de0ac3382b3de08ce062338c719c1d96804e7782300389b8ce04c18c1798a119c138ce09c6804e7a946704e328273b2119c538ce0009c6a04e76946704e338273ba119c338ce03cdd08ce338ce03cd308ceb38ce0009c6904e72c2338cf3682f31c2338cf358273b6119c738ce09c6b04e73c233800e71bc1b9c008ce8546702e328273b1119ce719c199348233650467da08ce8c00119c5923389b8de06c3182b3d508ce362338db8de03cdf08ce0b8ce05c620400e78546705e6404e75223383b8ce0ec34827399119ccb8de05c6104e74a2338005719c1b9da08ce354670ae3582f3622338d719c17989119ceb8de0dc6004e7004623383719c1b9d908ce2d46706e3582739b119cdb8de0dc6104e74e2338770019c1b9db08ce3d4670ee3582739f119c971ac1b9df08cecb8ce03c6004679700119cdd4670f618c1d96b04679f119cfd46701e3482f37223380f19c1798511009c571ac179d808ce4718c17995119c478ce0bcda08ce471ac1798d119cd71a00c179d408ce6346705e6704e7a38ce07cb4119cd71bc17983119c371ac1f9180023386f3282f3b146703ece08ce9c119c8f3782f3094670de6c04e72d46703e00d108ce2719c1f96423389f6204e7538de07c9a119c4f3782f35623389f610400e7338de07c96119ccf3682f3394670de6604e773ab6ce07c9e119cb71bc1f9007c23385f6004e70b8de07c91119c7718c1f9622338ef3482f32e23385f620400e7dd4670de6304e7bd4670de6704e7ff19c1f95223385f6604e7cb8de07c8500119caf3482f3554670beda08ced718c1f95a23385f6704e7eb8de07c83119c006f3482f34d4670bed908ceb718c1f9562338df6604e7db8de07c87119cef340082f35d4670bedb08cef718c1f95e2338df6704e7fb8de0fc80119cf71bc1f9004123383f6404e7878de0fc88119c1f3582f36346707edc08ce4f18c1f9492300383f6504e7a78de0fc8c119c9f3582f37346707ede08ce2f18c1f9452338bf006404e7978de0fc8a119c5f3582f36b46707edd08ce6f18c1f94d2338bf650400e7b78de0fc8e119cdf3582f37b46707edf08ce1f18c1f94323387f6404e703004670fed808ce9f18c1f95323387f6604e7cf8de0fc85119cbff484b38ae1cc00245bb2d9bed6745f2a93ea4aa6dbbbdb9a93d9e6ee96b6545baab9adb937dd0096c9f4b565db5adbbbdb5b93eda96ca62fd5dfdc9ee9cff39ea3a8f3af464900e7647929f5eb2a3dfbdd1bb751cfd58af6fb8d91b65da3a8f36f8de85caba800f3ef8ce83c4651e7df1bd179aca2ce7f30a2739da2ce0f1ad1b95e51e73f1a00d1b94151e73f19d1799ca2ce7f36a273a3a2ce7f31a2f378459dff6a44e72600459dff6644e784a2ce7f37a2f3298a3affc388ce131475fea7119d272aeafc002f233a9faaa8f3bf8de83c4951e7878ce83c5951e7ff18d1798aa2ce8191f500b0a98a3ac78ce87c9aa2ce5546749ea6a873dc88ced31575ae36a2f30c459d006b8ce87cbaa2ceb546743e4351e73146743e5351e7b146743e4b51e73a233a00cf54d4b9de88ceb314756e30a2f3d98a3a8f33a2f3398a3a371ad1f95c459d00c71bd179b6a2ce4d8a3a03abe37b7c7e92577801d042a045408b81ce733280005240696707a02c5033500b502b501b503bd0f94017002d01ba10e822a0a57900bd3b8196012d075a01b4126815d06aa035406b812e065a077409d07aa00d40001b8136016d06da02b415681bd076a01d403b817601ed06da03b417681fd0a50040fb812e033a00d405d40dd403d40bd407d40f7410e872a0434057005d09740018e8114057011d01ba1ae89140d7005d0b7414e818d075408f027a34d0f540003700dd08f418a09b801e0bf438a01cd0e3819e007433d02d404f047a12d09300819e02f454a0a7013d1de856a067003d13e85940cf067a0ed06d40cf057a1e00d0ed40cf077a01d00b815e047407d08b81ee04ba0be825407703dd03742fd0007d40ff07f452a09701bd1ce81540af047a15d0ab815e03f45aa0d701bd1ee8000d406f047a13d09b81de02f456a0b701bd1de81d40ef047a17d0bb81de03f4005ea0f701bd1fe80340f7037d10e843401f06fa08d047813e06f471a04f007d0012e853409f06fa0cd067813e07f479a02f007d11e84b405f06fa0ad05781be0006f475a06f007d13e85b40df06fa0ed07781be07f47da01f00fd10e847400f0000fd18e827403f05fa19d0cf817e01f44ba05f01fd1ae83740bf05fa1dd0ef0081fe00f420d01f81fe04f467a0bf00fd15e86f407f07fa07d03f81fe05f46f00a08780fe03e41c2c0654051407aa06aa01aa051a033416a80ea81ea801681c005023d078a026a004d02940138026029d0a34096832d014a0a940a7014d039a000e3403e874a03380ce043a0b6826d02ca0b381ce013a176836d01ca0b940f30080e6032d005a08b4086831d0794049a014501a280394056a066a016a056a03006a073a1fe802a0254017025d04b414a803a8136819d072a015402b815601ad00065a03b416e862a075409700ad07da00b4116813d066a02d405b81b6016d0700da01b4136817d06ea03d407b81f6015d0ab41fe832a003405d40dd403d40bd00407d40fd4007812e073a047405d0954087811e017415d011a0ab811e09740d00d0b54047818e015d07f428a047035d0f7403d08d408f01ba09e8b1408f03ca00013d1ee809403703dd02f444a027013d19e829404f057a1ad0d3816e057a0600d033819e05f46ca0e700dd06f45ca0e701dd0ef47ca01700bd10e84540770000bd18e84ea0bb805e027437d03d40f702dd07f47f402f057a19d0cb815e01f4004aa05701bd1ae83540af057a1dd0eb81de00f446a03701bd19e82d406f057a001bd0db81de01f44ea07701bd1be83d40ef057a1fd0fb813e00743fd007813e0004f461a08f007d14e863401f07fa04d027813e05f469a0cf007d16e873409f0007fa02d01781be04f465a0af007d15e86b405f07fa06d03781be05f46da0ef00007d17e87b40df07fa01d00f817e04f400d08f817e02f453a09f01fd1ce8170040bf04fa15d0af817e03f45ba0df01fd1ee80f400f02fd11e84f407f06fa0b00d05f81fe06f477a07f00fd13e85f40ff067a08e83f406e301103aa028a03550003d500d5028d011a0b5407540fd400340ea811683c50135002e814a009401300814e059a043419680ad054a0d380a6014d079a01743ad0194067029d053413006816d0d940e7009d0b341b680ed05ca07940f38116002d045a04b418e83ca00024500a280d9401ca023503b500b502b501b5039d0f7401d012a00b812e025a000ad401d409b40c6839d00aa09540ab805603ad015a0b7431d03aa04b80d603006d00da08b4096833d016a0ad40db80b603ed00da09b40b6837d01ea0bd40fb00802e05da0f7419d001a02ea06ea01ea05ea03ea07ea0834097031d02ba02e8004aa0c340ee7bf5ee5bf0ee3bebee1be6eefbe0eedbdbeebbd6ee9bd1ee7bcc00ee5bc7ee3bc2ee1bbdeefbb7eedbb2eebbadee9ba8ee7ba3ee5b9eee3b99390020f77d47f7ed44f75d42f7cd3ff73d3df7ad3af71d38f78d35f7fd32f76d3000f7dd2df74d2bf7bd28f72d26f79d23f70d21f77d1ef7ed1bf75d19f7cd16f7003d14f7ad11f71d0ff78d0cf7fd09f76d07f7dd04f74d02f7be7ff72e7df79e00fa7b80dcfbd5ddbbcbdd7bc1dd3bb7ddfbacddbba2dd7b98dd3b8eddfb83dd00bb79dd7b6fdd3b65ddfb5addbb50dd7b46dd3b3cddfb31ddbb27dd7b1ddd3b0013ddfb08ddbbfedc7bf4dc3beadcfbdfdcbbd5dc7bcbdc3bc1dcfbb6dcbbac00dc7ba2ee0772ef3772ef0e72efe571efbc71ef9371ef6a71ef4171ef1871ef00ef70efc670ef9d70ef7470ef4b70ef2270cff9bb67e8ddf3e9eed96ff75cb5007b66d93d0fec9eb575cfb1ba6744ddf397eed946f7dca07b26cf3defe69e250073cf69fd00c83d5fe49edd71cfc5b8674edc78d73d2be19e43707bfcddfe7900b737ddedd576fba0dd5e5eb7b7d5edf5747b1fdd5e40b737ceed15737ba7dc005e22b7b7c6ed35717b2fdc5e04776fdeddab76f76eddbd4c776fcfddeb72f7007edcbd10776fc0ad95bbb563b796ead616dd5a9b5b7b726b316e6dc2cdd5dd00dcd5cde5dcdcc68df5ab1e1e42046eafb24b0b82c1940f2f4ec4f17cb7b7d700ed75757b3fdd5e48b737d0ed95737bc7dc5e2ab7b7c8edb5717b4fdc5e0cb70037c1ddab77f7aeddbd5c776fd3ddeb73f7bedcbd20776fc4dd2b706be76e2d00d9adadbab546b7f67616d04ca059406eeeeee6b26e6ee7e63a6efffc5ca0790040f383c254478e27e67f27fdb8f3b4477eea152b69b9adf9dfbb5f75c6dba600ffb86a0fcddb1692b73b246f6f48de0df9df6573bebcfbe5b1dc9f68de13f200bfbf9d754ec7844dc74d30909e12a2c3ad45f2d0068bd9ffaafcafab5b57af001df9ffc9f252aa8ef0d5e6df966c6ea675ea017fa62e186cefbeec833c3df0003fbe1fdba515b941fe5c17971af3ff63c496788df369f417777c2ab99ef20b00f2fc381fccf7a96b1bac8c20ff6a0ffca1aa8eef913cae63aed09698579d1b002a9be6d590bc6a62cfd3997d7cb4356a1f3f6d2d757c2f52b1f6d590d7752e00b1096f3b3166074f385331262f60b238f67a8ff5e200c5983cc4c3ed83c7ae004f457f3cd87774f991ab8e5ed3d57374ed55d71eedbaaaa78faa40d926c879009a4f132fc3cbf1f28d423ec26c20e7c7e48221aa1dff25e7d035d055c6d2f2002caf8ee455e786e2aacfffaf2672282fc451c3cacfc9ff6fcaffd6926bf0fa008420bf96c91f825b38479b10e71517ce617937bc3a2b7fecec8add5e756e90009f56936c6d4b26111fdabe2618da3c0326bf86955f94ff5fcff4c5d0d73142009cfdad5da9fe4c577f5773576f6fb6a76b02e34f6de6ec84ebebb68739d9d60093c39cf0a435cc191f0c1e27c8352ead24bc632c6f9520d7f67027999e28e000af26bab9b43c170ca411ca4df113385498c1ece849cf666c13354161c2bc5a0022bb585f18048531920ff56611bebc1c9749db6f2dcba3753286e5497db1c400930ecd2abd3f9999ff7fa2fb13da2ee341615d705c7c18c7877941111e521d00721971811ffa633c28f49962d824ff0e847312b6f830d8aa056c9c6f55881e00c5e4504c616d3cc6f224ecae5eb17d9d1c2784a68ce77e3ced39d68be304a900fd878d13a4a92b8e0df818a289f073898e1306e60081bfb117b48916cf7596008a32ed9f1e0c266ae79aa078bcab616527e77f5d5f38b108bfda60f83e305e00e4bad3f2c77581dccf77043af69270c4041cc3c5ac4aefb3cfcaff3fd17df600a4bc43da8eed2d2763fb3009637b5f6e28ff20183eb6e335526cefcfe78d0d00c8fa5430746d41f2d30e05bdb0de7df50f2e4d0c8ac74c3ecf5396dd8bfc5700e4f9076abcb303bc57fac19e46feabcac75e300746deabfd601f88556bfcf000cf22ffb57ef86790ffc57ef8f723ff75b9a0dcba2d48c8fb1282dd07fff57e006c33c07f831ffc036d73634eddf603bc37f9b1cdc0ede8cd847f4c8d7f7ac000f65bbcf06f19b0cf563ffc07fc769b1ffe037167bb1ffe03f5bbc30fff16e400bfd30fff8131e42e3ffcdb91ff6e3ffc7b90ff1e3ffc07c60c7bfdf0ef43fe00fbfcf01fe8b72ef5c2bf7520feecf7c37f604c75991ffe03f1e7801ffe03f100a7cb0fff81f8d0ed87ff80fff6f8e1df8dfc7bfdf0efc5f5a607f2fca439ad009ebce624ce17e93a375fd7ab21e715b7b174f1f5a92090b7b10cec7508bcce00bf07b6b1d4303cdc3e7c3dae56c09a10f2781dd60a726a053909218f8f0fca00e1b55f91d70e455efb147969eab84791d72e455e7b1579ed54e4b5599197a6008e9aedeb80222f4ddfd6b4fd36455e9aedfe32455e5b157969b6af2e455e9500da77e098d0efb8e3e1f51fc7738c1ffe99305b509df8be17be4740fa0d0279008c84b2ea83c2b1868f3192a41bc55fac9eb90dca693394579d90e7a34e6b4200f4e6f28b9597c692587e6c087f5abe29286cc363992deafcd8221d566f6389004c943f8e9cefedeb3e76f09223070396f8d818ed761a2b876bc25541a1bdc70014e115b0ffa7b17371c28fa67144876bafbfaa67c391a37dd706c3a43067f600fc7c477bd46081f2472b5854333cc51a35dfc848af4d04850ec527f992b3d5000872245ebd8abc362bf2ba5491d776455e7b15796d53e4b54b9197a68e3b150079556afbdaa2c86bbf22af038abc34db97a6bd762bf2d26c5f9a3eb44f919700669bd08cab3899f53c096ae18b9734611e1d5cc6581e1da8aec80d96e329ce00fe539d1c8f5f10bebc1cc743c74d74b0576ccce092e789c1c0834163fdf01f0098788c0986da94eb34b688ad305ffa455e3c0f658dd682bba49b34494a048500ed924fb8245e634ae475221708a436de188255d2834fb0c326add426587e6c00082e5afe7f65123a9595c34d6de54c42a7b273c526a1e52e0e214e9712022f009c50f3b9a94b1df9df6459a9ad8bf7658abcdb3dc7f756ee7b34f1be90da1600f368fbe77d683de1b5223734af815c57c3ae1b17c2b33184e7f8109c4d213c00e943f57cae7e0ac9a3b18b27691c8075e6ec57131be4cbcb61b2f0d0c0cff300ff2be141bf07f2ffa5b11e5ee7b9af4b8f74cce16bbc16653c456d392e18f400c5c347ba7a97775d7dedb1c37d55cc94bccba5e6a4ecb8dadc55069a1f3bc700bb902a761d76495253a5d7c583c1e79210f39ff3bf4efd07f3c752b783fb7d00a52126ee33763cfec97053ac61a60e1bae501ed8653505436d23854a8a7f430011fc9407c55fc378fc8794f9379343eb87da221693cb51f9b49c744f815e13000f0a6dc2f58c0bd7f1b23c44a02d1b04b918221a198f8efcff6479a98f774f003449dd13ef82120c57100491bb20fa3c4c295351da05f3ae73e07549c1605d0050bb8e23f9b4fc84bc20d71eeeac1d2a6f8280274a6875890fff68d7c1fd6500a2a29c89a40c7ffeff544539f4755e7cca344951ce2452864fb7272bca994c00cae07007fd730ac9435dd13f4f23798ab795ba50c7694161c2bce944366f530033481eedd67992fc13752ad53fa7923c8a8df2a4fe49ed3a95e4d3f28b62830058ee1e37543e9fced1fe0d9f03890785f5342528d4654a20f3a6d7d609798a00759e95ea9cf707d3fdc86e8ee237547e3dc3aadc3f0d0c19a7333cdc3e250e00196933a0ec4f65ecb00c2d4bd3a904122d5fc3fe176b5651868c7541a19b28009ab8db6f734eb6796eb2035b8a66f8c1df83fc4ff7c37f6015e50c3ffc075e00e170a61ffe032b4c67f9e1dfcabb823d64a8d6993f6e646510874b88cf4f88004a25a3864c945f1ff81c320c86cc690c0fb74f15b3cf4c3f78fa638c3fc5330053b00fd6e52c210f799d9dff4f8711b4fc4ca2232d4f8ff17a7a6e63bec212008ca74b38b58c097971e11cdad7b5d3b579be4d823ebc2f92ea4deaea12c2f500dc860de43abe84304ed04d5ac9e479e343f29a04bdf854d1a5f5ecba53049e00ce6e9f8b0df22bd68624db84d5d14c0147535068cb59117885c93e5b284f7900ac66b2a92f9c1d815798ec7384f294c7cadc50d954d77322f00a937dae509e00f258cb64535dcf8dc02b4cf66ca13ce5b186c9a6bace8ec02b4cf61ca13ce500b189c9a6bace89c02b4cf65ca13ce589638ba6a050d7b9117885c99e2794a7003ccf62b229ae79117885c99e2f94a73ca732d914d7fc08bcc2642f10ca539e00a733d914d78208bcc2642f14ca539e6732d914d7c208bcc2642f12ca539e5300986c8a6b51045e61b2170be529cf194c36c5b53802af30d9e709e5290f7ccd004d93800bafad13b0682ee722d66489baa584f2495206f136317de8b53e64bb0084af69690a0a6d978ac02b4c765a284f79e29cb52928b4095e5b275ca738bf001818cf674ad42d2b94cf903229a65b9ae4e1b58d41a15d634cef8c1fbd23cf00ab507e7de0b31e92a1f540edc36f916405ac09218f8ff9a4facb0a72245ee70028f23a5791d76c455e731479cd55e4354f91d77c455e0b14792d54e4b5489100d7798abc162bf24a2af2e2fd0e8d1b8af17760979fe61c8ce20d9b8349d79d00c3f48c0bfa87cd3d255b4973503ea690e6de670bfa2784ebb19ce7baca84d9007ea47356a9aea439abb4a6c56d58ea9a16bd3e6c4d8b6f2ba15b03f8fa13dd00423193e5d1dd79b3585e93a097b4fde11c964777e7a1dde89a560dd3e78bf900f37e6f2927937cf79a64abd15f474f0ef9f410a613b98eced7a1255bf8f1e7006ce4af4c9dcd6c31cb932dc2fa02e99e42583c92d6c8e96ddb837d472f39720070d9f5dbba0ed28d82d455389c46568edf399f590456072b7736fb8f2ecd7100505e34711c71f69f97ef18a63c3d1e279c77a929281efa622c2f0806ab819e000bbba580e5ea0439b140ab89b50e7c91e65c2ffcd3191e6e2fcb2bed42f203002cf43678c1906d916eaff090c2378a2be91f39bca2fcfaa0b0dbf41152c633003cdc3e7c3add24604d0879bc0e9b04394d829c8490c71f7e1c292fc97fcac100b55709974bdb14796d56e4a5a9a3563d06ca3a6e55e4a5a9e31e455e972af200daadc86bbb22af038abc7629f2d26c139afea8e9439a6d42d35e3b15795da600c84bd3f63b147969da7ebf222f4d7b69c6c22d8abc34ed55a9b150d35e9a3100e77f61cca4d92634fb6d2ddbbb633e7f2d07578f122e977af3bc9af279747e00c45fe841e72874b9b52e28d457734e88fc4ff1c37f60993c1162472a5fdaf200182bf28bbc781ecaaa67bcb46d17a61bc5cfdb085dc2a63628c62b5122af3a0021cf479d3685e84de537866095f4e0f375692d4d5aafc0f2a784e0a2e59b0400d9782dda902edd2bda301d6643ea8b287f242ff440bb2d62e556e706edc0db0060a208af80fd5fc4cec503f9851e6175d82060c2f258bfb54279ca8f3f557a0069be729dadeecb17925e1a338ef0bf35fff81ad639dfe6d091ff9f2c2b653300e80773997da86cba9541712d32f2d707507e3dc3ea2b76866d657589af45ce0017b026843c5e87d256d3f9829c8490c7c763e5f0daa3c8eb52455ebb15796d0057e4754091d72e455e9a6d62af22afcd8abc34db84a6bd762af2d2b4d70e45005e5af6a27d5da5b5d56d8abcfedbebd1a5fd8abc34eda5d90f6d51e4a569af004aed8734eda519ef35db9766ccd1f447cd36a13966d2b2bd3be66b6be5e0ea0051c2e5526f9e57938093afadcd11f471c9ef9c6b706d6d811ffe99303b4a8f00be350a368815f9455e3c0f65d5078576f7313f9474a3f8c3da2e7f2ca01c3f00405e75429e8f3a9d17a237955feebc58da8e2ccdbfb1fc82105cb47c93201b00af451bd2471a7cacad4936a4be88f247b2b686769bc7caf1b535da06e717e10015b0fff3d8b9626b6b7c7fdd17f2c697f6f529da57dcce8cb2a47b1d7c6f24005df793d602b91fd2eb1b8af0a22f2ea55f529f16c8b6fa1a59277cd9b8a13c004bdd722bf910e5c15f794075a0d7d2eb6a84b263591e96fd0ed1e595795da400adfb585f9edb474fd4be04e5d70bbafae84ba47a95da9db40eac88a73bacdd00486315be6ecceb8ec60cfa7a165a7e0ed191c7251a6f6ad8b95fe68d92080a00fb8675b9a118a4d718487d895b6eff71d550dd463a26a17c1341a16db07e51000edd1e8f7ee9f0fcae6aa82e3caed06bddf114924fcb3f79dc20cf07f33c9b0084eb8bbd762346e4d13df52b7343cb637de2fd115e86c73d2cff57122b5ec300e2de3441e729219891277db32cc58cafbfe118fec5fa294ff718c47e0a65350031bcbc7eb82e529df076375bb04394370bfa8933a9c88fb4a0fc7ac1263ee20070d457adf86d1f0f3fee3e5cdca278b12ee70979c80bc778d48768f9b94447005a9e1ee3f5f45c63bee2124161cce671581af7d273340e8fc9f36d12f4e1af00000bebaf28df84703db7211ff748bf28879fe37224cc617e37523994171d6300d27aa5f54e5fbf48f718d0faa0b193b6431e3bb1fcb43c5017bf5f1f32d6a3007ddb8cf8f0581b04ac35acfc15a46f3b93b51bba8700eb43aa1fbeef639a200037c6ca0641e15e18a93f429cb545ca3715d16b36b1e97dac4fa4b690ea95ef00dfc1bc6a412f9778bd62f9f923a8d785f1e1b1d27ae5730b2cbf9ed4eb79ac005ea9fdc2ea35c1f268bda28da43e97d779a97d2ebd7e5a889c492c8fd621be00813aecedd67ee74c3d91fb6a3e679aec054ff89c89da87f7d5b3fdd867a0af00961e6f95c6d59ee77019692c506cadbcd8586036b1212d4f8ff17a7a6e5dbe006148f342bef6a7315f1b6d5e61e3175aa72e5e75305bf89a47f218315b518e00342795c663d4d7691ecae1e7b81c7a3d96f3bbe72d9394c6f08afc53d23d1c0045fe6969bd5f8f7f76e09507745d9df7397ed6c99b5ba2f63928bf9e61f5d500e784bd6ad125be277091803521e4f13a945e85b848909310f2f8bddf4ae1b5005d91d71e455e972af2d2b4d72e455e7b1579ed54e4b5599197a68efb14795500aa0f69da7e9b222fcd767f9922afad8abc34db5797222fcdf6b55f9157b722002fcd76af598f9af14b53c71e255eee988fe5cbc1d59bd3e3a5692fcdf1c4ff00423fa4d9ee2b75fcb54591d76e455e27c75f27aedd6b8e4d4ef669a5f1aad400b15ca5c642cdb19c662cd4ac474d7b55eaf88baf75fe378ebf7628f2d2f46d004d1fd2b497663fa4e943956a7bcdf8a5b99656a96b439aed4b73ec5ba963cc004aed3bf87d2c8dbe43ba877a3629e7f9798c8ce74f3065c26c257d8eaa31ff009fde638f15f9455e3c0f65d5335ecabaa5c2740b7b7689b629fee99072da2700f2aa13f27cd4e9c210bda9fcc610ac3efdcc1d4f53e4d5c878853dc34479610079e9136b523b691264e3b558b7e7913cc5ba4d87d52d8d11287f24cf67a1dd00b6b3726b738376e0beb1a808af80fddfcecec503f9f9aca6a0b0ad15db078a0072f9b9b0fd6ef342e44c2e53cee488722cebc379e33e2be973bb7ef799b47400fbdd67d2d2263d8bacc7bfb95f1a4328e24f4bfd8d1eff6cb33446d1e3dfda0086fd13c6349441db56929cd78bb72d99a8631a945f1f788dff03639a24c3c300edc3f7f9a404ac09218fb711e91395d2e703255e8b9578b9c4ef5995c36bbb0022afad8abc0e28f2d2d4719b22afcd8abc34dbc416455e5a6d42ea334fb68900705e7b1579ed53e455a9bead697b4d7bed50e4a5a9e36e455e9af5a8d9ee77002af2d26af7ee988fef2ba54df428f2d26a13eef8e4f8ebc4b4d520a8ccbed6001df339ecc95818ceab57919756cc71c77cada01c5ee39478b9a4e9439a315a00b34fabd47161a5f6699538b77249736ca2e9439af6d28ad127fb8eff8ebec30025cdb995662cdcafc8ebe49ac289f3214ddb6bead8adc8ab52e7439ab6dfa500c8ab52d70b35c73927e3c4891b4f9c8c1327cef6951a277a192fe91dd6098100179697ded74c79f0f78dd039c08208bcc2640ff71e87d5b9a1b2e9dae8c20800bcc26487ed057469656ea86caa2b5e5b275cd791ff4d969532d94601678cc900f5b45fb22fc6e4a18de8392abf9e6155c633b01f40dabb26ed9bf3bb5f22d9001b63fc299ea4601f697f025fb74ee7ffd37741d1f249a2232d4f8ff17a7aee00d49a877f35d7d7dc7b95c6e7f9faddd7d3ec7bdf4dabd456f4f867dbeb04bb002bf21f8813b40df0389121e7f5fc20d51c354ea0fcfaa0b0edfa881319868700db87ef1bca0a5813421e6fe359414e56909310f2f8387aa4bcdcf1bc0ac4e500d23e255e92ff578a8e9b157955a2ed5d3aa0c86bbb222f4ddb6bead8adc8eb0052455e95687ba9ef2d8717f6b318dbf95e6e973c3fcf14b95fe4efcdf3f59d00a9189347ed2aed8947db2d16b026589e4bfcfd9cd2387db120c722af12e67c00e99efe54a6b9afb539d9d2956dee6dc9a47bd3adc9de6c737f2ad5964ab76700db3299fe9e6c5b6f5b3ad39f6e4df7340a72799bf534a7c9466db328bf3e28006c233edaac34c792ea0c6d9711b026589e4b1b7383e5785e5c38575584178f0023e5f07209dfffed716da1b93128b42d6f677ee60c0f3fdb45e5a18de8392a00bf3ef0daee43e70cd43ee5ce19fcd5e7e0f3b37eea2c3bf08edeac3ef681e700769acbe79de12790778b3eee81e7995af5796791775bf9bc7bf9096cbfc5be001970a466b00d396acf9729f6cd80b3493e2dff89da419ed7e479a2ec714436008f3be3c979bd369c4e468d3b28bf9e61f51577c6333cdc3e3cee4c16b02684003cbede34599023bda73f21e4f17b1fe5f0ba4c91d756455efb14797529f2da00aec86b7f85e2daa6c86bb322af2d158aeb80222fcd76af894bd3f6bb15796900d6a3a6ed7728f2d2d4b14789973be6efad2d07576f4e8f97a6bdf62af2aa5400dfd6ec3b703c81f7e9e9f8917f7398b6a5d94c1efd8e25e58fe3525fdf3c4400fe33fcf01f784fcef4a0d0c65427948fe3cca9a47cacc82ff2e27928ab9ef100d2b65d986e143f6f3ff4db5efcdd3c12afe925f2aa13f27cd4e9b410bda9fc00c610ac921e53984d2439d21c05cb9f1e828b9647bfa46d1faf451b9e41f2b400d7a18ad5f7e94426ca1fc93b86d06e67b272b8afa92a28b4fd8c22bc02f6ff004c762e4ef8d124eddb1acf788d633a14abdf84703d968b32b7f71307d25d5100e312ca1fadb9fdd4887645db4d13b026843c3eb72ff59b88348fcfedcbe175009922afad8abcf629f2ea52e4b55d91d7fe0ac5b54d91d766455e3d4abcdc31009f979483ab37a7c74bd35e7b157969fae301455e9aed5e33166ad6e30e455e009af5a819bf34ed75a922af2d8abc34eda5e9439ae3094d7bed56e47532ae9e00b8b85aa96300fe4d078d3100cedde8bce9d460681ec5c0bf613e89e44d655800a60ad7b9e479ed62e07effe97ef80fac8dcc203ac5059d507ea3608358915f00e4c5f350567d5068771ff34a49378a9fb72dbabe426d508cd78c12799dc835004c6a6bbe86296195f498a26893a98cd7148157d8da59d4ba6d0a0aeb13aff500ec63036b675343ec44e58f64ed0ced368f955b991bb403b7f7f422bc02f69f00ef092e65ed2cc17895ba7646af1f1722e7b432e59c16518e657d86dbcbb4a1005696596c2f137fcf3796bf8bec65da5c3b54477afd842028aaff449647dfe300cffb74babe8ae5d0a79b489e9e4fa706f685617dd28479a710d90d2c6f02c900a37af31467ffa94e2e46fc82f0e5e5381e6a438a8df2a4752dd9b586953f50003b88e54de3649e31c293e2c4757d2c8fb6ac0d06f5a66538062cdf4b30bc66009cccb3ba885e4d4578de48daf0c15a996720f094f43a85e9c5312418062c7f0025d1eb3ee2ecb40cfea7b100f76aa3ac0982aca0c839de362614c92b552eb5000f9e9b18416e4cc8e36d89db935e5fcce6bc2d61f963216da951c040edc1eb007d3cc3c0cb9cc23060f9eb050cee076348cf91abaf5fde75f5b5c70ef7052c005593631eeaa5aae655d028f02996d00c0e2dba0be783ffc39a89e48e41917300c5aa7d1c39dfdb77b8ef685f11035531660d4584550572e2b114af73c96f9f0013fd5900945f1fc8edb643074f8ac779c4c3edc3efdb2504acd2f8082b37ac009fe7be46318c17302482e163c7f888fa8c0b061bf6b5478f5c53accdd13e5c006a73e38ac88f09d707ecda9870ce25e78fb7e69db28ec9556e073dd2bd6c4c00d2d823c6f2a8bebcad705fa279b4ad54b33cda5fd4b03cdab7d4b2bc89246f000ccb3b95e48d6579745e5dc7f2e83eaa7a72cc9334d6c33a73f26a62837c7900394c4e9f3bf34ab96bffdbe6309c57555038377109bf4b856d9fae59e8b5fd009e24e2c179758da01b955fc3cabf92f4f56f65e30d692d448a691c032d4ff500e67525ad7786c9a67585e318bfeb9f83f69d41ec27e9369de4d3f26f0cb1af00b43e1666dfe1d648118fb40e3d83f11acebe2b730fff56ba7ddf7902ed4bfd006b06cba3d879bc936c3f45c025c5bb2921724e2b53ce69829c305e0981179d0027c040f8d0757dd76c387274e01555c8929a3560c775ecdc34f69f0f7d27150081cae71a7c1ccfb7ccf2ad7033d9ff53047c52421c34712cf160f8844d1d6d00f551d2d4dfc19abad4b5d1ee08c3255f82a3d7d225386c5ee79372bc199f2f00c8a4e7c29a319693e4f06de01708d7c5581ec5704108067a3d96c310b784e400e985b8ec4088bb30cfafd872e612924fcb7f3924c4e13554ff5982fe1c032d004ff5463c92edf1da464176acc82fcae1e778bd500ce78c921cf4ab26218fb70075c9ce4b42e4d0eb978c923e895192d3344a72a63139172acab99094691c2500397c3981e6f1b826f9e9852172e8f5dc4fcf57d4478ad3beedc61ffdb988e400d13e0e712c1570608cef20e7b56f7953798897db00e5d533acca780696c63a00181e6e1fbedcd129604d0879e790639a47e5740a72245e17310c1791eb46a900fed223adbf8bfce009adbf8b04bb965a7f5966d74e2f7a64d3886b59509830006f3991cddbc20a92477d852769e90a7572e3a6778f1be4cbcb713c1d240fb100350585f54dcbf17a09abab84703d96ab0b0a6da2581f596ed740d07f2591dd004c8e79926c8eb89dcdbf5882cda95d57b23c5aefab581e6db7ab59de3292b700267fdc14146f733196873af273bc1ee9f5cb19067a5db97da284596a974b99003ea5b6cba5829cb0d83c527d24cc617df848e5507d3a999c4e4539b42d2e630072dac97574cb4b6acce035f43a3a47a4d7e2b2720d2bdf326e906736cfb32e0028f48313194bb86fac2279bc9dad2679bc6dac2179d4e63c49f1096de1e2d3008323ec13787c0a1baf781adf451eafa0fcd11aaf2c65788ac51a297ee3b592003fb5b2ebc2c6f89d27d8e69dcce6bec7f89d0c0fb70fb7f932016b42c85b98003fc65883b7110fe6e3cbf1f54216bf901fddbf81af487469436e284f2cdf3d002a312bd512d62fa3ec159e64476d3f285f1a0323ee7a21afba0caceded7d7d00cde9feae54b239d392e9cbc682c2d81e17cef1f5c5954279e955ee68eb557e006c9dc5981ecf0df2a771dba56a92b782e5d5903cc4e8fa8c718d43f1aff484003f8afda9fc84507e3dd1a194ba9c100c6d6bd41f71bcd949f2f8ebeca578d40029c84908d763393e6ea2e55cdc794cfd5099888f6eb3a4f77b8a8d9b1ecfe2008e9f79574bab3456e27167a527d951e30e1fd7503c88bb5ec82b27eef4f7b4002533c99696debe966c7773b63f2c8ed0733ceeac12ca9f2794475baff663eb00b41477e89cd5a56a92c763128d3b88518a3b7ee2664b3a8afda9fc84507e2d00d1a194baf4c98bc6030d5ee347c80b63abd4a757dada0f7f6c83b6b9f92c8f00fad3029647e76b741b1e4fc3ad274d691ce4cbcb713de8f891c7b5d11ffb4500bf3fc0e3ac9fb630387790c604d25a57589f20f9077dccb55c5fe3630f5a47007ced2eea18475a83c2727efbe36c0bf7279a247fe26b23d49f68fbe049f22700d4a9d435716a73c426ada5d272bc2d45594b0d8b8b546fc5fa68471dd706850009f32e26b24b5d1347dca5ae8953bb5eccf268db5cc7f2689cbe84e5d176b5003e7fdc1484b72b9a873af273616bd56b18067a5dacc82fcae1e7b81c09b3d4002e57327d4a6d9761eb98bed6f88b8dc735e4486339292e952b87b6457e7fa600935c47d7c4ef676b4a781d5d13a7d7f2b91d963f93ac897f98cdf3fc8cff4b008f25dc37d6913cdece2e2179bc6dac2779d4e63c49f189ce331e1c619fc0e30053d818cb4fbf1a7d8c85f2476b8c258d7dc2c658ab04ac923f759063eeb77100e15c986f625d36058575c4ef27963a965b2ae8e3771e9b6de5fd1d4dd2388a00df635a4bf24a1d63d1f5c252c658d4e661f7ab7df465581f546fc5fae8e2b1002f10f4a7b1afd43116e22e678c55ee384a6a571bf2c74d4178bbe27d465c380017365658cb30d0ebcaedc325cc52bb5cc5f429b55dae12e4f81e639da8b1cf006a4539b42df2f14427b98e8eb1aac60e5e43af8b3ac61a98d39031564d9ea700e7f95ac9b184fb061d47f176268da3306f03c9a336e769b839e08323ec135000a74aeb3bf93a218d177c9d908e7df93a21adb352d709699f5bca3a61d83c55008a057ee70fd1c7b028bf3ef0d91606c7b0ab191e6e1f3e865d236095e6ec7c009db0d47586a8f37f1f7bfc3ccf25dba4f5124c92aff17542ea6be5cc09df3d00c2f114626b0a8af7efb1a0b02d4599bb487d38d607d55bb13eba799c0a04fd0069df52ea181671973a86d51ca74aed6a63feb829086f57340f75e4e7c2c648007c0d815e172bf28b72f8392e47c22cb5cbd54c9f52dbe56a41ce7febd8d2d7003a2e1faf7592eb86bc2e8e8d61f1baa863582cff8786419e9bd918d6d37cb800e458c27da3d4712ae66d2479d4e63c0d37c77e70847d028f4f27c758fec758001de498fbade6188baf13963ac65a2ac8a9b431165f273c39c63a39c63a39c6000a4e8eb1ca9053c963ac672b8db1be45c658cf3d39c63a9efe8bc7587d51da0028955f69632c677afc94e0c1bea39b8e751f3ed4b3aeeffa6b3bafeaddd47500cdd1435d873b7b7bafe9bbf65aaa0d6f0d5c5bde0aa4554e773c5f384f79ac0089a805f75a5a9ef2408f6f0a0a5bc5da08bcc2644bbd15e5b13a375436f598008b23f00a93bd4e284f79accc0d954d755dc7ae93ee28c48af0e6b2c3f084e100bf44284f79ac0dc17f49045e61b2d70be5298f35b9a1b2a97dd647e015267b0083509ef2d8941b2a9beaba815d4723352d27f12e26fb9222ba51cc1b83d27400dc2494a73d07469f26418f4d117885c9de2c94a73ccf62b229aecd117885c900de2294a73ca732d914d71676dd169247cb15e34d6587e109c3bf55284f719c001e827f6b045e61b2b709e529cf33996c8a6b5b045e61b2b70be5294ffe6242008a6b3bbb6e3bc9a3e58af1a6b2c3f084e1df2194a7386684e0c76ba38ca828004fc5114c6f8cc9433de8392a7fb4465451eba191d9925e9b10f2f82c51aabf001d821c89d71a455e172bf25aabc86b9d22aff58abc3628f2daa8c86bb322af004d8abcb628f2c2188a318dd6eb2226471aa3ad0f9143afe7ab5ef4ba58915f0094c3cf713912e6e1562dfec6562db00d4aab1634f6e3aa0596ff3059b5f867009ea7b4a28518253bf3d5bb52ed2cc9c1be86b661bdd8de3cf0a4201d2360c2003cdacfb591639ea4550ec45dea2a2cb5eb769647e30cefaf69dcd8c9f2a8ef00eeca1f370585f6e531511af7d27361ed7833c340af2bd75f24cc52bbe471b900d476b94190e3dbfff90afa064539549f8d4cce464539b42d6e62723ac97534009e9d5e37780dbdaed82aecf2dc603e2dff5a12cfcecaf3ac0b0afde044c61200ee1bd2b804f376923cde3676913c6a739ea4f884b628751596c66a1e9f249f00a80b0adbde89b8d38df2eb83429ff33167186e7d87cf19360a58257fe27dad00b426b3519023f1daca3084cdf93cd55f7aa4f5e77bce27d55fd89c2f6afdb50030bb6ef4a2477392f7fd34f13e99ea8679748cced70303661b9aa84ea5def500a76d0cb1496351deaf977a77955ecfeffa7b1a6fa6b95d03417fba1e53ea5d00ff918e37a95d793ca0f5be8de5d176cbfb01dacf62df268d37792c2b75bc4900af1fadf166d85d7f3e7e2eb55d86dd8df575d77fb4c6b59536deec2971bcc900effa63f9dbc978b39f8d37a93f57ea7893b7333adee46da39cf126daa2d4f10026ed875027cf7d6786c7e340c045d7eeb708f8c36c41fbc7c38d837c79392e0093fa2d8fc7d2ba81746f6b3139e67e1865fcb858d023cca7fdf6abd1c7ff2800bf3ef0d97606c78f9b23da556ae79b99cd691eef33a57b7b5b0439122feedf0061e37f4ff3a56cd4fa43f9a335fe97d68a160b761d8df65dac9e3786e0f1d300f72407de9e17f5deaafba2586d50d886a47bd61cf736c21fcf158b59a5ee0500a03cf8dea062388bf11ae95e0097f8de201a97b644e035d2fbf82eadcc0d95004d75dd5ae43a5e4ec2329cdebc6c209cc77116ad0bfec4ff165696da8edf2b00447daa8a60d842f269dbe3bac484f2123fda76393f5a67788edfff0f9b7b6d0063655d42bfa763bb1311a7517ebda0b78f382ddd3ba4f6a171680cb3356f3300b4fea47d72eef81241571e9fa262c2f23b85f294078f4f14ffce08bcc264ef0012ca531e3c3ed1f685d786b5cb28ed86e2e2f3100d5ebb1478e1f849dab39300080aeb6207cba373273ee7da2de0437fde43ce9f087f46f9f50cab2f7fdec300f070fb48fe2cad33f0fe264a993d442e9e73b43722262cbf4f284f79707fa60075bc2f02af30d9970ae5290feecf7bc9f5782df6a7d8677e22bfaee1c6711f00c91ff3f515ea0f51ee57d33542f407c7ff3321fcf784f0df5b84bf4bf8750600ca5ff2679425f9335fd3a7fe4cd78e689bfa22b1db5743e4ae0d91bb2e442e00f645947f0dcbfb3ac1f0ed100ceb43306c0cc1b03928e48f6328697d96e64b007bb9f13fd5bdd8188bef2d5b2594a7e356e427ed25e7fb88689fcffbd8f582009ccd822e31f67f6c113db8ed35db069787ed63be20a38695fd45dd20ee1bc8003a152d833c5cf2fbb453f43e0be58fd65a41d4e745d076d2731609218fef0f00959ead5827c89178ad51e485fb43eb843c3dfb667bd05eb42d6392d63d4bbd006786b84bbd67a6f9342ce6d13db7d89f48b1a8dc3641afe76f03e4cff348bf0028879f0b6b2ffc6ddad2d3a0319647f5591d22477a4340a3705db9fa54c21300acbede78c89f0aed24d7d17b6613ea07afa1d745bd6786e51f4bee994dcaf300f4fcd47dc9b184fb46a94fc34ae35cfe4c1d4d527ca24ff28f748f168f4f92004ff87d9b61b2396abf8df2eb83429ff3d16f4bcf984ab1c6991e9ffd39d87700745ddff53bba0e1feaed3a7ae8c8555bfa1e79acefdaa3540dcaba5a509357007f351387e5f832e1ba5c61399a46eb4504a59a0fcb0ff7882e860b490f1e0a004f40338e7cabb1529bb1340cc16bc35e841b567f612fefa5bcf8b619ca3bc900e42c17e42c0f919314307b7e8168c92fd549b23cdacd95faa255d4e9e44b750006eae3e44b758242fb9e7ca9ce5039275faa3332392379a9ce01365518e94b00750e92a9420f9b2ad0387322634925bc54076d51ea54a193e4f1f8b45cb8d6006fbf1a7daa80f247eb032752ac91c624526cc76b25bf5d468e797c88b2fc410079ad54e4b5429117b631b40dfde02ddad0f937ffe0ad340e6c1764c618665a009ef2e0b7dd9685e8bba244d9d20763280f3eb7a1ed15af6d0a0aedb3247fdc00c8fe63be4b75820e2762dec33fecb8c40f9ed00f3b52fb709f8cfa61476aff0062755bea871dfdd651b6b951c01530fd69cce62f52a7fe4aeb8d27a9ef419d004a9d8f503bf3711fc5c0eb6309c353acde1341717faab40f4c943a1fa173c00052e623d4ae7ccc483f00c0c779611f42933ee0218ddfa96c9a873af273bc1e00e9f5a3357e5fc2f4a118f807174a6d97170972c2e2fc48f59130f33ad79023007d6896b71f0d39b42df28f047692ebe87ce46d6c6c81d7459d8f60f94d643e00f24e361ff1f431dd926309f70dba5ec0db199d7bf3b6416fe1519bf324c52700fa11de91ce47787c0a1bfbd0b67722c63e287fb4c63e17313cc5628d14bff1005ac99f3ac831f75b695c1be69b5897754161dd2afa47c91f7de72f382fd64700f124b573d4a9d4b10f6daf7cfcefbb8ff11caf4afef877a9631f1a5b463af600e16b2ff4c5fcc53e30476369d8b848fac0281ffb943aa7a0d78fd64793c3c6003efc4308a5b6cba5821cdf631feef74b15e5507d3a999c4e4539b42df23116005d9fa0639f3fb1b10f5e47c73ef45a3ef6c1f2ed64ecf35736f6f1d3ff961e004bb86fd071116f67513f7a416dce93149fd016a58e7de83c95df2740ec354200d90b581e96ad26f5d5923f96d698ce0f86e69d4ff22e64791790bc7696b74400e019637c689ba3e5334c072cdf90c7ed6c7953a3ccb32a90630eb6636ca3d40047f5da684f12f1740a3a5e48642e653a62f904d1f1adacbdc47383d7a3edf300bb7283ea9c177d520e478e6df7a5e3cd1a2297c7d1b8509eaf95760ae569dd00a0cda498d7c1785d20f0ba909cc3c71d46ab0d203fda06a8cff03680e56744006c0368d713d106a85da3b4015a9eb7810ea13cad1bb4592228ac777ecf449a000bd17651096d80f68fc5dac0dc886d00ed7a22da00b56b943640cb97da06f8003cb583e42d67bc2e1478d1be6035c38abc6b03b93fa2fd152d9f217574dfb800a1f8a43e19f3a43e95f6cb31c683ead120e8d1c8f2e8b58eef919aa1f8710c0077011913accf1f7bbea73bf00a031cd348e34e2abf86955f2af8458c5d43ed0015d6f7847d1c451ad3d0f91d5e5b69f70ef89837ea7a1f1ff3d2f5be4e964700f73b94ba1648ef553c9fc4135e0e136d9b31261365705fe17ed12ee0a5732100beaebb85f8452ff30b9f1f69a47559ecd5cdd46f68f91d217eb17a187b71bf0008db434af1486b1b78ad5f7b95bee792af83d3b6cffd82b67dbe0e2eb57d6900af0fb5094f925fd08f2346f58b5ee617d23a522739c7fda253c04bef8ff0fd005787885fdcc8fcc2cf635f837e81762fe617eb82a198b1fc2342fc427a5c6a003939c7fd22ecf344925f488fb456da6372fcfeadf43a4c694f1a5f33a58fb600f03553fa386ca98fbdd0c7f2a2fac58dcc2fa4bdea51fd622de17b80f905da002e47fce236e617345ef8f00baccb627e41fd8696bf25c42f343f9d25f9058d00bd78ad5f7b657b1b05ac98a4b6cf1ff9d26cfb98471f47a736e149f20bfa18007954bfb88df985b4073caa5f5c4cf84e607e81f67801f18b5731bfa0bafbf0000b7c5d4531bfe0af8bc2f22f0ef10be93556f4d5d0dc2f86fb7416f70be9d300597eed55faeb2df9eb43e9eb87787f11f555f6fcf167e9751a51fd02ed548a005fbc8af9c52626a314bfd844f8f6b0d77060deeb895fdc3f3a7ed18bba615d0046f50b2cffe612fd22acbf905e1718d52ff05acf7e51519f71c03cfabaa5d100f08bfb3df9057ede43fad4231d9b521b0c27d3f3ab377b785b2fe63f9b493e002dffc910ffd1fea46498ffe0b52732de48afb5e4f1e60b11d7bf37107d5caa00ce79d1a74f5affa6f55643e40e57472e951a13f96b97689fbc89e5511fe27100a953e0e97c123f21c6e7fcdf217dd56f8dccf97f7072ce3f90fe57e6fcbff50034e77f7611bff823f18b9a7c1bab74bff8eb49bf1848ff2b7e51c3ea59cb2f003630bf1878cfc5b8c13233985ff879de7fd02f68bb97fc82bea288961f9fc70029f985b44622edcd0cf32369ff5813b31bbdb6d2de8fc0d7ada8cf2c67799a003e13d52fe8fb18a2fac50c56cfd23dafa87eb186f0ad627e817ace247e9161007ee1e9158919de868bf9057fe523963f37c42fa438223d0b10e647546fee1700f4be217fc5a01f7b65bb1a05ac98b8cf48b19dfa0cf70be9dee0487d26aa5f00a09d4af18b4c847bc751fd6235e17bff98878fb18de1bead36e2171733bff000f90c33ad87627b50e8de685a7e49885f487b133ac8b9529e15a778a4e7d4f100da4a7b9e98b77dda6ef9fd741aebf91e14293e701fe536e149f20bfa8c725400bfb898d5f3322683d6954b617b509611bea9bc5f60fd2648b939c1d0bce924006f5a3014cf5c010f2ddfc0cacf2318a4f2c8af8695df4adafe7dcc5fe793eb0015fdb51b312f2098e2825ef319662cbf33c45ff11a6ab7d9e41cf7d705427900aa37e2696276a3d7d6b1ffbaf64a0dec3d5d28d86bae80a78695df2fd84b5a007b4b107d5caace79d147dc7b4aebad86c81dae8e5ce275ba50284feb066d960060e569fd62de1c92379fe5519f9dce3024040c51f77ae2b5ce9717e6035e53005058df3c9ed0b6c9e389e417b43c8f270b0806a97c31dfbc3a249e503b2bc600937ec4bc886092e2c9428619cb1f0d8927525b6a22e778db5b2494a77af3780042db255e5bc7fefb8a278b057bcd17f0d4b0f237468c2773893e2e55e7bce80023c6135a6f3c9e84d5914bbc4e170be569ddf0b8403fa3b880e5d178b290e500519f9dc73048e381a8f104af3d3e4f66f184963b97c99c23c8a47de9cadcc300bf7502661ff79e68cc890785f69c47f269f96784f8f73c41c7d3c839de1686008ba33c26d3788dd77ab6577798bd6647b0d7f322fa7703d1c7a5ea9c177d7a0024ffa66d93fbb754a7b47ca9758a364b048531928f25a80fcd61721a0439d4009fb80fd3bac26b9d0fff2eaf403dc9c75ff7bee98efcff6489a9a7bba53bdb00d7ddd392cab664b2c9de098cbf4b68bb060ff2b3cd5dad3d5dada9547b36d500974d358fb6fcbeee6c7b6b777b4f73b237d99e6acf8cb6fcd6ae3690de9eed00cab6247b92ad2da32d3fddd6d6d29eee4e665b7b7bfa7bb3a3ae7f776f4b4f00b23d93eaedea6a05f5db465dffdedebe5436d5daded697cdf6b68f7efb6b6b008786d7dfd7954aa5d2bdc9bed196dfdcdbdd966c4d77b5f7f6b4f4669a7b860093efe2f203a40ccac71427e7f9f578be46284f79f0f73ac6c9f5351164572900ca8e85c8ae295176ad509ef258cd64d36f0de0b58d821cc45827e054ec9323007fae09e5d733acca7852a5d64323b325bd3621e451dd8ad55fad2047e2155300e455cdf4a1bc8bf96a947643f53d11ed06cf8d56bb89333cc3b59b6a016b2200288c21f85d8fb018552dc8192d5e525ce5b14ab24d3c440eaf2b971a85eb78009be336edc8ff4f969722bf771ae5d7075e7d2015567f925dd1763502d644500018f7783b9162628d20c70a2f1ae7c2e21e8f73c3b547ecefb98fbb849f19e500b1b429285e373cbed3f33502ef1a56fe6f6cfd740cd3a323ff3f5966e2e33c002acbf338a285f7c334350a7af37a1f4bf278bdd731cc348f8e9df9779c688a00b3ffd416c7df5117e17ea3d446622caf56d003f378bdbb94080adb3d1fbfd000765fcbf2686c1bc3f268bbdf901b8a99f689616395a8fd6ad8181baf6d20e700c7e486f23bfe4bced5e48fb13ec6d2f22caf8ee455e706e5ba549fff5f4de400505e88a386959f9c678ef7086ac935787d42905fcbe40fc12d9ca376e6bce200c2392cefeaaa298fb1d8b890d627efa33dc5a096189347f590e2527d50e837003efae8310c4fb1f62ec523ee5763c9751b7383e5785e5c3857558417f7997200795529f28a2bf2c29854170cd5d9a58efc6fb2b4d4cc4fd415d16184fc796a00e7fd124d52bf24f904b51f4d1477a9ef4ea5755ecff2681d36b03cda6f8e630079344e200629c6f3f6c6fd9f9f0b9b6bf0b101bd2e56e417e504c3c8913037000918789b97facbaa1039d23c2c6cbe3e527d4a9da38d540e2dc3d72aaa15e500d0b63886c9a1636dfaeed4558d83d7d0ebe8fd327aeda6dc603e2dbfbd719000e7dafc31c6124ffd532bf7339aa4be88fb061d1bf37656cf30d33c7abfb8d4007133daa2d477a7d271f3589647db0b966b080aeb6827a9a343ac8e3cc5fb6600c487b696da15955fc3caef6d1cb417bf6f2df5a561e3f03aa1fc58c176d29c0003afadd4fe516a9bbc4d8f6398695e23c9e3316a3cc9a336e169b8fe38eabe00d443456212cae03189df33ae11f0d25847c7fb7ccd89fb537550d867f1fe210028c243ea2fb90c69cd6b556e685e75046c521f1308e7246cf161b0550bd83800dfaa103d8ac9a198c2d6ab781b97b07bb9179dee69eeca34b7277bfa9a5bbb005a5a477d2f403f48ed6f4d36a77bb37de9deaee1e44bf36dba57c5259cb3d300393d2d8ffc6a58f95b48dff124e6c735823c57eef69072b122bfc77908e7aa007343cf49737dba0682e551767dae1023e63590bc1a26675cfe3fb517e58538006a58f9dbd81a085db7c0eb1382fcb14cfe10dcc239be06d220946f10cabbfa00797a1e23b65baabbf63ac271998c3f3dc7b1dd5e647d465a2b8cb33cda47f100b887fd9134567689af4363f9bbd87889afab76042ab612d7a1eb980e63880e00d2b8676d6ea80e58fe9dc487ef691c6a33e9deac644f3eef93d63a9a04dc7c00eda2c18ffd069e83c2b10e1d6f52ac0dc1501b61f9570ae34d69df5f2dd1c700a5ea9c177db2d2be3ff4d7e3f8895caa57100cea4dcbf37e759c509ed60dda002cc1caf37116fd4f79d131fa6a86156d581b848fc7f93da1b7903ae2efa8a6007e53cfb053ddf9ba645c902bcdabeb08e62f9c9ce71e4fc3cd734bb93fa4110087e8fce538be5c21ae13e1b7744ec7fd96fa685c28cffd76383fc7359e4450005897bc7d4b7d4d293ee3d26a268fb617ac1bea33c5eebb145ba7fa0a9b1362003d165ba7e27d2096ff15e903bfcefa40cd7b93c3b54b5ebf280f6309f7cb8e00fcff647929f23e10945f1f043ec73ba9b0f62fade5781e3f64c3fa45c91f4f00091e5e1fe17546f1212f3a8f5e937bf8576a5f7cbc57eade387a3dbfe74deb0038ec5e398f0351ee95d3f6de10848fd5638c57b17541de1f44dd33cac7bebf00277e3f31bfa025f92ff77be9bea034bee57e2fedadc0b6cbd7e13af2ff93e500a581b63b30df0e649bd2b1312dffb790b556c91fa4fb961c032d2f8d1da56700b006f626b0ffcaf61a982b8c1fc65e8dcc5e58fe3f21f692f41f1362aff14200f9c6107b515bd26bb9ec62b168b4dae270b6e56d11cb8fc91f0c370f1b4bf40071a93ae7459f66693c47c76035446e317fa1e5a3d4bfe42f09569ed6b714e30079aca6721b581e8dcd3cfed3188fb18dc65269ed9dceef70fcd6963f5727d80041735c4163b336ffb664b68ddf9fd18e4dbef7a07bde6f9cc476b72237947f00c0e4c65939e91a692f0396413d7cb423a8e766cf76ca785e3b18e8e3c29ef300a1f2cbddff40658dd61e7249378a3f6c0f355f1f2e673f361fe79d883aa5b600a6757abc4c6e30af8ae55593bc1a9647fb36d4d1f587679272920f62b9f9e4007801b391cff8ec2b2eb83451c0cfefc5e0bdb32090ef51a15d4fd43edd79f900ff95bc4f7756feb821185c334a137ec5fca02a28e4273d4788d77af6d9742c00288c4b61f35d37f69b943fbef6e8916bfad65eb5f2d17d3dc78e1e3a72d5f200ae9ecbfb6810e64c024179cc8b91f3c53a657e4d9c94a7a921f03bf06e6d4b002651263a444d50b8e04ce5d7b0f2adf9ffda37e7e1de7caa3fd3d5dfd5dcd500db9bed19f6e6fcbefcb1f1816ff7680d7c3d3962b3ef0789a4812fd505f3b1000dafcc0dda72656e28262cb39a94595da4cc1a52660d29e352d8009a77de14008734185cc5f2e8a2e66a964703336272011c039b3b9e4230bab496608fb1bc008b491e5f10f631c884f6deee7902909e18148fc3e86bcb735e64a7b043e52f00b03c010fbf64624c5e10c8938b4a7df8c575d813f3c73d5d870f6fbae6d075005d47fb561dbbaac7f5d95405cab64a50b158174edd8997e32eccdd96bb2a75004fcab7d8f5fc1cca969e67e06bf6bc4af9393ea792ee01fb7e9e21cafb244a0095e3790d2719f61c83efe7c9a5101f301b86d5a3742f3f26f092da209d83ae00207c79398e479a1b4b63705e5fd27ac970736f6e778bcf1047ad0ffa2c702900f511f6bc0af535be2f85e2431e16a622cbf3ff4ff4548476f9d2bb2f786c9700f6698fd67c59ba3f2cad5bf2fbbdebf2bf4ed71d4c37e91eb2b45ec831d0f200d2fb67a47d246322c8a6fd321dead1eb6b83d2f4a7dfc6c36fec49fd5e9ce5005509bc877bcee8bfed1d60a5be836f72fed8f8d4be79b4a6f63eede373bc25004deda5b157d874dbf923ded71d1b14ee75f059b71e6d1fba1e8e7d0eae253b00fdd167ae3a72f450fff5cbafe983b952ef8663870f1fea3fd4770db55cd8880084978b1529676174808b2295303a0888bd3ced444cd711991ef827a5ddd27400976103cb431b540bd7156b7755ec37ac6c2c846fa390873c715181e2453dea00d8ef24c2d747cf73aa1ffe625d4d22c7a7323da9bd3b9430203ff4596966cb005762e85d4e8a2fa68f2f15b024ad3c60c236732a3987f6fc7f52a7d61f2ce100040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/protocol-contracts/fixtures/UnconstrainedFunctionBroadcastedEventData.hex b/yarn-project/protocol-contracts/fixtures/UnconstrainedFunctionBroadcastedEventData.hex index 2965325e97f3..1342f7db998d 100644 --- a/yarn-project/protocol-contracts/fixtures/UnconstrainedFunctionBroadcastedEventData.hex +++ b/yarn-project/protocol-contracts/fixtures/UnconstrainedFunctionBroadcastedEventData.hex @@ -1 +1 @@ -00000000e7af816635466f128568edb04c9fa024f6c87fb9010fdbffa68b3d9923ced3716a04d81b58822bc3e1843626aa2884888b1a2d2250e79fb7d41a365e16ad977a85a570bedc6785d159f137035d3bf9891042ee3af20488686aec168b0624b9dd486acffb15815318ac8eb07814d48ffeca47da1f4de4a733b723a1e424eb989517d084b2d95f40b9837d5e6d8468dd84e20d6ad727a7617a5eb395e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000d91839191a8b89c75f0ad79c19ba53a8bdfcb25bd4f8d33bfa11f1f52528a8ee58fc25430000000000000000000000000000000000000000000000000000000000001476001f8b08000000000000ffed5dcd8f64c951cfeafae8aeeae9e99ae99e5defee0098a99d9df12e60e07dd597b93402db3266910009c18d5755afec01b36dc6bd00acd707d408092410321c015f913880f803cc85131790b9db075bf2d196ff00005b96ebedbea8faf5afe2bd7aaf2ab3a76777539aa9ea17911191119191999100f9b26ae6fd72b8f857cbbe37b3cf96592f8273967d7abb15df222dcfa59cb500e744cebde744cefa732267c3a29ca96c7573b5d896b7e940afb6656c3d073200ee5bb6bbc8d8c8be1f2cfeb517ff3ae6fdd8bb06c486ed658e93c25303a70a00dc079c3ca21f23e5a4e55ff656df5fca3e7fede9d3f8ddde93b766c9577be7006f5ff4cee7bdc9f9db6fcdbe8215ff1d2adecf3ee38b8be44fbf7cd1bb38ef00c5b359ef9d27175fec9dff79f274fea5f377b0ee37b765fabf3b30fdf6b64c007fb003d31f6fcbf4567d7ba6afd4b764fac91d9886db32fdd4b6153fbd83b400bf05756f679fbf77114fff6451f3bc374b922f23f6bbdb8af8d73b88f8b7db0032fda71d987e6b5ba6dfdd81e91f34b664fa47db56fce2b615df69546be63200d67e2dabd8cefe96b82071fe2cfbdbdbadf86da06b9bfec88be66d73b55896003f6c6734f7ddd01f09fd0337f43d91fbd72f57f4b12dc257bacb672f57bafc002cd449ff1dc17743740506e38bf90d82e1e4f2d304033f369f2158d3accb24007a6b415b2cfa956bbb84d2369c27895e8577db0defa846fc8c59e91f61c2bf00639cf601bf46fc441ed68ff8d651f659bf5cc9d32258e372bd1d026b024cec009b7ebe0a78ec5bfb80f74978ce3edf30eb7d44e062d73ad4b7e8b393b6b9da00976cfb8da677b64903607582a1de714d207a3f59fcfbfce54a8fa2b3b4ec5f003a69d372f17390d16f026fe189b2ef113e7ec75825cf7ed1ac60efb507ea09009f3a3c139ec7d9df2d80b52f37d36a28b4ba0a7e8b68ed2bb4f099b43bed13000fb3efe91a2eb5dfe7324373cc4ccb59f6e96d59c259321c0583b1c82afed00034ebbe2e7cb57e603341e67acc16fa1d8b7a94d2243dfe03d83522fde15860002f71178ddbe66aecb04b7fd0d7e2ac3dfac3a1d06fba913fd1e63616f51f6900f30b8bfa59daf7d009fd60d93f6eb9d1ff721c3d02fa16e3872ff30b59e80b000f63567def189edb8b2d7ebfecdc4ff87748565773bf639287f583f38c14d600556415dddd01983dbfe8f7bb0a6fe485306c4757698746ab6991d6ad1b209700d8e32ed4b7d84fe79aac772db6bb6e91964ddb1ede50b9b6d5bdf8c909d4b700381e459aac2716dbbd6791964ddbda6c637b4b5a62db53a86fd1b69e26eba900c576df54dbd62cd26a11ad63a22363bee02cd7f384ff97d9e791c25fe4157f00b807cf2dce6f0635e2678c3ebfb947b2a23c22774781edb2811dc7e130f2a3002499fb9e1ff8c31ad11759f919fbe00b0abe3657125dbf689ce85acd07bd00007a7d4f3e80dd235813602223e683da44d3b6fc65f48ffcbb0a0c7300556c7900d75cf535d41bf66f63d6fb8ea3bd9ad26b03e1df31ebb1c8c5da60cfacebb400a6e894f719b06e578175e03bc2904f5de1f33cd2e2fd06d4611affff7eef2a00de21d0afe57c8a3cfc8ced714ba1a5adb19fc51e87f0ef90acae7cf988e46100fdb0ee6e2bb2761518fbcc6d858f36465c172d81e11c48da7d6cd67d81d7af009ade8e0a64c0fa82e7d8e7fcb6d27e177b86381797f127edc3ff4a3a93795900137486756f031cf17fa5bea2f96fd9b363c2415b1e9b75dbf29cf29074c2310086edd72ae08330f69396c2a755c0e75609990dd03a5668d5cc7a3fe636a2ad00cab4e35645dedafc5feb039aad96fb43c6690c0c44d63b15db7657c1c7bc1b00c7112d27a1e5a22cce25977df3c4ac1781e1ba146dcfa5417fa3dca90ffd76007d4597f19827f6d75382a10e658eaaadd76de69f79bd65149971be8f7eca4500d393c85d554fe8173c17c73c8aac531caf4d8647c4cf2832e3f959f4792e9a009e44eeaa7a42bff818c1705d24a7d8da8aac16f5343e227e4691f965e08d7300632e9a9e44eeaa7a42bf789960b81e7f25fbce7a4acb59f6197a5130480651009c24a1978cc7a3a91f4e47d32499cee2301e0e47de703649e2593f984c83790038997b499c8cfafe249a0c7d6fba9c97bca4d0f6223f08423f1a4e06236fd400f766d351908ce27e3f1ef78359349b075ed01fcc13af3f0e67e368bc781cf900d3d8f3e65e3c99fbcbbdd69715da7e309ecc67fe2cee2f04f106c16c30e9470051324cc2c164ec0dc341d8f7e683f9245e644382d17441771878e371df1bcf00fb43cf5fee83bea2c91d8f16d8c9c09b798bffe6fdd9c88bfad178168de60b007545336fe047de643c4a66437f188f27fd3088e78370a18d7eb8d8a25ceae400be463b994dfc241887d3709a8cfdc97cea45c9e26b1c2ff4134c170a98c7e30099374ee54d26911726f3893f9dc7c1741286fde15c687f5cd3891ffafd41ec000d46f381177a411844de743c9844a99686d160b0306538190d7d7fda0f160c00a251e007b1df9f4cbd304ae281f8d0cf01ed1af9d003786e71fc9ed5889f3100fa9a4af8774856dbf3ed1af11379583fbca6ea29b2761518c62c84219f9ec20047a3f5718bb41a5bd212ff78156067d967300afad3e1783a1dc4fde964b2c800510e67837834f72783d80f26e1c209e3301c45911727f385d387e345071b4d0047e345e858748fb126e7ab16dbfcb2455adbea4fa3757f4b5a628b87003bcb003efd30f26783617f1e2f2244324dc245d05844f7701a87d1229e86137f3c190024e3e120f0a2c170f16c91541e05d1345a586c96847d4dce8716db6c537f2f0059a4f58a455ad246891918636ad9673ba7de59f6b7b75b19978db7c2bf639c00c67fbf48af0f14bd8aee5e5364ed2a305cab200cf9bca6f0d168ddb148ebae00455a2716699d5aa475cf22ad172cd292b9328fdd024f4b5ba9f72c72c9c2bf00639cc605bf48afdabc47f4f3c88d3c5391e7b122cf8302793ee1469e91c8f300ba224f4f91e78ed17d08f5f518bea3dcc283cf0add29c95bf037e5b838778800b192735cc8fb2cfbf4aa95901fb8cd7704218f15580486f640dd70d994eff800c69679a14704c358fe9860189b3f41308cb5e23fc7665dbf3cee68fbfef88c00e368514e0bebd5723e850f3f633e9accc78a0c3cf6693e7fb780cf89c2e74800a9b76b7b3499b5fceeae7cb03d9c9b3db5c8077d91f3bc98873dcb3ebddd4a00e8f6dc49f558c1be8fb19cfd08633bdbfe7580b1bdde50745c3636e1d9976f0056884d79fb80bf595b3d47fa79fb80b7008ef8c7b00ff86646d36d8ee966d900b6acfd4417a90df61a2bba8cc7edc0fe216dba69faad3acea22e9ef5388be300128fb3a85f1e67b57ca2368fd5c68b0724839637d8368e6b327f34ce6ee6f3002cc659f13d9e37a7e52cfbf4762b91dbfc53f558c1beef7a9cc5fecd458b4d00bdecbbad71f692c6d95e062b3bce0afe8ff65634ff8ac65937398d2062fb1900a5dd683fb62dda8f6d8bf663dba2fdaa8eb3a28baae36c0f60d226b181bcff00f28f59c5d4065faf5dad8f3694f36c29de5f6476737b66a27a3fac7ab6c4c60099893263f64d9bdb543d5b82739b2a7a427bb09ed067584f6ef275419ffbb7005164c6fe5df56c89c85d554fe8173c97c33828f1a56dd6e394453d0d581746009119635dd5b3252277553d75155d68fefd06c1ea0a5db73a2cbf8725fc3b66005d972e72e75aae5a3b53aff507a9db35f96361cdacfb4e4379b65740ebc42200ad96455aa716693db048eb358bb4ba166971cc47dfe37ee8684fa4f41e96f000ef18a771c12fd26bd11ed6eb6ee459ee61bda1c8532f90e7e7ddc8b3dcc3fa0005459ec78a3cb887a5ed4f61db586ee1c17b588d92bc05bfa5e0a38ff11e1600f293badabbe016c7f4e5dd1baf9af522b087c0bb6afe4be4ae9aff423d3d240018c6eed70886718ae30c8e4562b763a3eb57be234cdac8cf38d661fdebcae30034a83d589fc73acd8f1b057c5a0a9f23a5deaeedd164669bdbe083ede9129f00ae453ed7ffde45f5feccfec9f91584696b6a2d37c23ac5f85b752f08dff3a80092a3c27b3c3047f5e3daea39d2c71c15d6e51c95e07f0b72543fcd686af760007d506d5bd67ecbfbff4cb51c158e85d2a69bd677aa8e85e8cbb6c642f4351e000b8bf22c68471e0b59bff21d61d2467e5614d3af6befa4682ce4fb7daa8e85004d858febb1b0497c9a16f9607bae7bcc6d9b755f7c96fd99fdb36cbc64fb6000bc649de2585875bf46f454752cc475098e85dedeea39d2c7b110ebf25828f800ff096361487b006ef25637cbb665ed27baa83a16a20d38fe17e530b15f5a5c008b97be17459e5d570e538be55aae22f563396bf285e4e2f3c9bbbf1f7fe9c9002cbe7872fed6ef267ff676f2950b6c0692d69ac9e66f103bc1e32b443a0a9e00211c0ef745cd127c2ded80615eae39285a2a6a57963e4f532d91bbea544b9b0076ee3ad5c2eb4378aa85fae5749376dd42d1151158ff9064b0717d4db74066002d85c553adaad7f634153e45616fdbf668327f50a65ae27beeaed00efb6eaf0079a91e2bd8f771a8673fb2318dc3fecd458b4da2a7aad338f4079cc69dd334004e60388dc3ba3c8d13fcafc334ee294de3708cf9a0dab6acfd441755a7716800031e5bf83a5163ae1ea9611ac8e3a36bf0d6fddc98edafc1e3d72e77b96eee00458bb47a1669e14fc0a47f97bd060f6d2a750e01ce3f8568ccfad863d91fc200b2fe29fc3b24ab2bffec903cac1ff6cfa26be210c6f3fd5daea3133d39beaa006d79d5959662401bf1156c82ff8dac119832c452a40b4de72c0fe2df269cb400c8fc167d98d3586efce98337ffc19f982a33ffe1798dd065df39227c3c9aaa00e1e33c09f1ff6383af959d8f156d29baddd62f1f13857f8764751513b5ad7400ed5a6eed38a8d4d55e2fa8d1f75385cfa9c247a3257dc4ed31e6554c942dd100bcb4eb29c011ffbf4ac6444d179ace591ec4e7ebead3a21d9de0d7293faca9007dd409171ba9fda2f10bedc93151e46ae5e0e3f88cf8ff5732266ab470aba10068ebcf717f2b1d13857f8764751513b5fea96da98aeeee29b26a57b197e9d700da55ec1a2d8e896e7eae601513e5aab1bc6319183311ff3b2563a2a60b4de7002c0fe2f3cf20a44562a2762de487fde84fd5d79baa1efda999753b6abec3310051e46ae5e0e31121c4ff61c998a8d1c2a34882d73357db9216c757f9948e890037e12a9f1e3ce398f84891b5abc06af4fd91c2e791c247a3c557df3e72a39300654cc457f54456cc1b3e0238e2ffa4644cd474d15374c1f2203eea4064939800883eccaf76f500663126dea8d73a058647cd51275cb498d8cbbe578d893da200cbbec33151e46ae5e00bbd26e11f65326d8a891a2d7c8558f05ea4b618e3fc005ad7d23191af757573bd4bf1b5aea81f8e893d4556ed6a47eed73d854f4fe100a3d1e29f9eecb9d149c07e9a17137b0047fcfb1bfcb448179ace591ec4ef01000ec744f461a9fb61bf2e0875c2458b8955af0baa99753b96898922575e4cc4006b8510ff97b688892f022fb9bea8e82747f8aa3b173111ed9dd7dfee900e04003f2ad9dfb46b02b59f2b6179101f75c0fdedfa5fc958e9ee0474a3e98ed7190082ffab25fc272df8b3731887dfd3cda593b645699fbb0f7be06cc326f0dd6400afb4b07db57c31da49daa7bd12c5afac6a3fa95cd4df317fa5e1e3cf0921fe006736d84b3b47253a382ae0833f69e4d2aec391e749bc149f129fe5d20038e200bfb9410769db53dff95c7dd59e94a79323a2bee7151dd177fdda4e8df819a300cf27857f8764b5dc6797f349ed5c29ea47fa62ea9b2766d52f8c622ba1d59300ca360feab1818c3d6578650e01ba3a9ce7e2b0a1e86a1f6067d9a7b75bf1b500838cfb397c6d3baddb4df6d57dbe6ddb7af357b4dd1c80f1bd4def797ca1be007a8eb0bc0dc70ec011ff6db8fff28fb3efc74afda243c17cc0bc515ddffe26008d082ff1d33db31e50392ef1c080ede17ed924fdd4143a7c9fd6d3928b809a002283665f913f1d4845cf070adced6fd8059ec87c04edd67c8a0f9d0afed74a002e0cb4dfffd3062b9607f15107bc898d93b1e5845aa98707e9b5baec2b4720005f112dedef03854ed1617fcd0ff8dd7feda502adefb3def3368c855e93f0ff0066835dddfef6e8ca2ff14059c3e4dbba49f87f57d22f353f2bf24bed801aea00806d89fe2275eb4a3bb07f687537f9651eadaa7e59f43ba50705f21c923c8800cb8bbca6528fc7b6b468feca075da57e9e7ff32131c1ffe792f17cd3988c8b0020ae23f5d2e2f67dcaf287bc857f47699f8b458a76c819f5c363a436c65fc700fa01f9eefa8ef9f3404b7ce219be875afa0e2f7976d3de43e5f525d62d5a2f00d608867cb464e975d1d2ec9dfe3bcbfef6762ced1c7dd9a2afcdc1f35e3c4400393899756cf2edaaad936dea88c7c18659b731f2e735de7f6f18d7b4b6d50b00dae622918e6d6b14b4cdb1bff8acbbefc3faf87fc817b4176cb47911af4bda008a9eb597111a04d35ed2753be75ed967db39f7ff6fb1d181b64e4be3d249db00d48d0e9c2737812fb6d198f5f5675ab65d17682ff1340986f1eb16c1b4f96800d10b62dad82f7e77acf0633fd4721635921bdb8cf8bc76155be7cdd5392f2300f8df2bb921a3e5808be63ea91cb50ce038f68db417eca414bd44aa5d42c0f3000f2d56b08fb30eb8f0e610ea2295d987bec37852ae3b56babde4e2fdf9445a003e8a57373f5e69345b0534b51890370f6c2afcb4b949faef2cfbdbdbb170cc00c479a0761105c7cc834cd04df93b379ba6de40db7b9352f4d232c7492dde690071428b9355e31dde755825ded51479347f14bcb652cfa2eff845feaec9cc7b008f8e72424b9fd6d6d7a8578e55451bddda3852b417acd94af660d2d2ba5cf100c2b89f96fdcb950c0d055fe468127e2f434efbc243f2aba6c2efbd17ae0af0006a399f22dbdab3acaef49bf6e50ac7b67dd3d2b95ce9a1413c519e3dc2c7ef00683b79f6cb8d152c2d874833fbacc333e129b63d00d8e1e5665a4d855657c1003f205a6d85163e9376a7767e9c217488a765dbf8e8537987771cadb343c773006bcff1d9025f7b1108d73243f04b84e5bdfc963766bf0971e253d9f7a231a600687ea2e579f2ce98d89ebb6a6b1d1efbda6e7897de0711fed77599489be4e100b911dbc6d1652b91c8a3ed236b176ddcc9feb1cd50be43a023cfc4b7343f44005db31ecae4aeb5fdf1aaeb8d1ac1b47d163c9b817d85e9885ef2fa3be76a0500ff77a0bf5f507f477e2e728aec6f8e728a4b7fbbbd41477939c53fdcb08ea900517d63d67396c6545ffff20bc1da3ebea6578e738e2ee459e66af110b3a65700be9047f0e3927ad5f454a457ed90b6963b10dda1ce8f893f9f5b401b48bd9b00eebf4f36e8f919e698facf3ac7c47924f413ce3f6967d1b6cd2361bc1559f7001559d1be3c66b581569598ffd512fe90470be79a3f03c748153949c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file +000000000000000000000000000000000000000000000000000000000000000327774539896271d6dbe0c1de45ddc44709d1e8d9a9fb686ca3c105d87c417bb81a9ddbb308ed22ba60da2f2e98f3701846e4464d42ec98d15f7225fc0568e8ce3049fd9d18d6a3e6f07206670af0861939fb59708f11c4bddd4019aad0b7f2ea1980e713dbcaf8ea2c4343bfef4f6b267ca68a9191a591f71b024b204c6d53161b24ce918b7778f393bac313bc14cb4ca5e0e12936fccdf70cfdbce94d5630ac159716eba9df09d5f0d8271dafcfdfcb4cca12c411a02fd5846c308c9f976dca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111cfcfc1125672f40d49b4b192a803a41ccb3ddacec4da05bf7d535224059fa9bf766cd0000000000000000000000000000000000000000000000000000000000003e90001f8b08000000000000ffed7d698c5c5776deabdec8aeee6615494994284db4008d445112a5eabd7bb44c5164935a488a14176da3a5578d60461c8bd43893c5002ec74860208693c040123870128c81208013600c1bc8822446123b8963c488000307fe6104486c04fe11c0018c188831c1247ac33a555f7df5bddbef759ddb005de2d4050856bf7bee77ce3df79c73cfbdefbef74ac9ed526afe4bcb085ce30062d7eacdff6bbd956947ac5a49c819ec846af0eec1dbff8f37ff1e82fa61c7008e8f0b59bcf0976a0bcbe349779f1de59f1d6f62c6d48f6146c0afed6be27c00d468e3735fd23295743a07b6d9dfacb7df33d0262d5f076c6b1f536f9f8ffb005264bd4d1f4eb275653677aa91b48a0fdfb90dc33edd88d2af19c35f8983df00f2f73371f0e70cff6c1cfc59c37f390efeaae1bf02f8a508fa7fb5899ff86100d70cfbb538bad932fc73bdcb3e5dcb90fd3cc8de037e2d0bff421cddb4f05f008f237fcb6e2e367ad67d26f6a538ba9937fc37e2e02f1afe65c0f7f3d999d600d85e8982bfd0d2ffd538f8ad98792d0e7e2be6bf1907bf653f6fc5c15f30fc00b7e3e0b7ecf39d38f8ad1cfbdd38f8eb86ffb538f8ad9ceabd38f89b86ff7e001cfcd6bcf84114fcc556fcf9300e7e2be75c8d83df8a3f6b71f05bf1673d0e007e2b3e6cc4c16ff9ef661cfc35c3df8a83bf3191dc5e779e69263d939fff3b00d0c4fe68f3d64bd76facffd085cffef4dae6a74d829614b83a54d7b1a4a88700daa8a76e7c72ebd3d5f55b2737363eddbc799311429b478c5a06d4afaf7efc00c92b1b8c36ba33b46b9b9fdefcf8c6278c369613cdd6d0fb80de6fdce66bb600a7b09fe443deb83fe497b34dafaabd2fb606e45f2659bdd7c525e267f2b07e006cbfc1745716b256451d8f6159f0290b3e5551c779562f581f3a62bde588f500be2396671fbfe688f58e23d67b8e586f3b625d76c4f2eca3a77dad396279fa00b6a7eeaf396279dafdaa23d655472c4ffb5a77c4ead7b963a3891537efb8bd004f97624ec4c19f0de902fb64fc2d8fd807f4a58cff0d8beb8c5739e9ce356200e448aa6f287fd638b30e7ab119c41a177531c6743cd06fe69f45af7249a39f000ce0237d25e9b6e149d2c5541c5dcc84c66d12781aff49e8f3c6e6da671f9d00bbf151426598f4607abb8fe86cef7e28e9d6f7440656427fdf47d786010fcb0024c871f35b9fac5fb8716bf366b24d0939b30d4c9c05ccf472de6061fc772b0058ec2779b28cda74372e64ad26dd0eb5d968d36539dbb8e0a3b0b61cb12e3b00627de088f5a623d67b8e58d71cb1de71c4f2ece3db8e58fd6a5f571cb13e7400c45a73c4f2b42f4f7dbdeb88e5695f9e3ef4be2396a74d78c6555bcc465e0400adf2e62516abc3e47284ea30513d05fde7c2dbf8d8a7746e3f576ae3321dcb00837913267b59394392445f18b40e074ec6c16f2d3c26924e9d729f2633746500f5ea7fc3e23ae3b55b1beeaa6f6a91544dbaed92175c0a6ba220d65e6e1028001b9f0ac8aafac10becd0a2157562f49301b990fe0765117a2fd1ad34da7a60001bccbb08bd97ae652d427bdd1c3239d3521558b6a0e6b5695aeacdff6b3d9500c50d9ecbfcb06f1f2c633b70927b33721c585773a915ab43ffd9477507a08e00e7e70a60d9fc6c755568b79fda1d0c601e0a601e0ec8795700f36ea81ba7ba007ba00e7d8c8bca316cccd2fe7dbd408eb1fbfb36b7e70396e74edeb7b103ac00a1f9294fbe6ced93a43d46a8c3facef431c31722e7781beceb5894af2b7b4100fd6141b9d331199b6ae3321df3447b3f4075380615aa435fad521dc6528b35009647285b2f25dde33a2caeb18d707b9481e763f5bff149b6e1a364ae0819d80066956f85725ee55bbde6fa8a8f9299c7dc830ff6a74c7cca8e7c546e667c8600a09de541e9c1ac83a5761b6c379ab4c70adb9e6eb4eb91fed9521bf3aee66f0075a0cb3196acb19f61e17c43f906e61b6c671883d8362a505774ae365da4fc008e15884fb86e99245aa31f4dbac7cb1ebc2911ff11d13e2de71b9d5846ff4800a92df7c9a6c091c77749f93ceb85f78cb00ec78673318ccd63548736334a750068339c131c00f9f0c11b2edbd9c5e9027681b1c274319174fbe734f8e729f200cf48737d6bdd6afd503105f98f12fd3cd8dc53d5363dfb409e75fe94a0c77e0087d6f9d6b65f73231597389ee13a88e319ae83787e3a0475a8132edbe562cf0054dbb84c67056d93e723e3c1f16da5d129ef909017e739ebfb48a34de73586008b4beda7e1879bf866f35c46a01ee95f6b02f0bc6231acbe4339b71657a7b7006657b756e7573736e6d6570f117e02bae303eea6db31a0b57691e7809992900053ad178d7f99647596679ae7519387f563ba9c4cda7678fdc6eac6a9d56fdc00fcecfae610a9124fdcb33a118ebbcdaed8323fba56a2bf87a89db99132556c00379cb4c3b4c9fc164c2d57c96410cf520bab1b813a4b53528cf72904a0ac21005597482ea457e9af5a8af1748ff2bf9e213f62a0fca384b1067afa90f484e30083bad8c8a043fe48374c3cb9cd70a2a760ece7b068c7b41c22d4b4c92122d200f6f8a64abfaca8a991d3b62ac9952449ee290edf4351e4f61ea610281b626200baa46e3b70baf419d8d7f7c63af91d12f2e409ad69e165264e1dec2f871df900e0362ba7e87739f2c12d5bdecebddb910f6eff727a768f231fdc4ab674c7fc00f308d4595fcd3fef833ac7a37aaddbef4793ee6275f7036fb6a907a02ef42c0099f24feb5351ffbc17ea5036c444ff44bdde0bf548ffd74a6d593eae76f2e7005b6438bfd916f270d23d4e4792eebe1c493436b61d17758e633ea7c69ce78300fbe3f09ecfe337c8bf4cb23acf4fad94f17e9287f5533065443340f8bb08ce00689016cb5d2012d28fd2df59669527651c4fbaddc4732730ae39d796e29a6c006dddf01f88823fddbaabf3a538f22f1bfe9f8a83bf60f80fc6c1dfe050fdcf002195fa79983690c6e4488bc91727844cd7f28634e35f4e624ee9ed907694e40061fd0c917e1e8a23cf5689f0519e87847e6c2c1f167586f548f36f9ce691fe0021e823d2e36f6b8fd77eb1396055c24c0befd63f2cfa83d74cbfa99dfe421300b722fac373851a37351555457bd621eed0f1127f52f44ded7272dd81405d4500f48b977269b940ed0e0acc546fb5a1365e960d29dd84c6e821214725e9d6e500c339b042bc1f11f488b1d2e8e4fd10b47f24075688f7a3821e314e373a7963005f1fcd8115e2fd65418f18671b9dbcb1af5fce8115e2fd98a0478c338d4ede00d8d7c7726085783f2ee811e312f1c6be3e9e032bc4fb98a0474c9bfb2b4977005f8fe5c00af17e42d02386bd6aad22e47a22075688f771418f9896735692ee00be1ecf8115e2fda4a047cc2f116f94ebc91c5821de4f097ac4b0575256845c004fe5c00af17e5ad023a6ad232a49775f9fce8115e27d42d023e6fdc41be53a0091032bc4fb19418f980f126f94cbda8e8b769edbad26ebb305fb5613f4cf0200cd09eadb335057232c4fde69b1578856926eddd5726085784f0b7ac4b4355f0025e9d689b51d17ed1cd717ad7c7ea660df6605fd0cd0d4a86fd350676da792006ebd96a8df3371fa9d7b5d65fccb49cc71a805c701f5c3b7306685ac5551c700399f1abf59c147613dea88f56547acc71cb11e77c43ae688f58423d67147ac00271db19e72c47ada11eb1947ac138e58cf3a62f1bc8371c331feb64e8879ae00c150ded01a4cb57b94fa392cfa1f5a7b2a5da93528e7146aedfd88e87f55b40037bac863351bd2fd4ed7ac6aacd49a55ed69b10e8bee6961fbd09e161ffbc0005bf7bcff84471c1ea23a3cb9f730d55544bfd4f18447a90e4fee99de704f8b004f81ce36afc7bde55babf1e932a5abdddf47bfbd76417e49b2b7fbe8bc0fad007411c79fe7a6f3eae211d2c5c39174119a0bd43d85503c7a58d0e36dd58f36006f9dbbf1d14bdfbab2fa113f04c727984c9c29a2e33bdb0f65885527ba47e8006f73e9ac875e7178941cc3f437d3d7b7a1c7df93e27a5a2a4976e82b515d9200b48701af856e29f083d4fcd046bdf977ada7b2d87a80f6cb51f0676639dcfe00ab66a7d390bc42a177228a0c730beaf60a87149c8afc5c7826777835fee5a4007bda8c11520e903cac1f5e4e5784ac5551c76358117c2a824f55d4f10b5f76008aa5fca717b9de73922b2dd71cb12e3b6279f6d16b1c13e73e5e75c4f2ece300d71cb13e70c47ad711eb4d47ac3547ac771cb13c6dc2d31f3d7dc8d3263cf500f5b623d6aa2396a7eedf72c4f2d4fd878e589efaf28c85571cb13cf5d5afb100d0535f9e31e7072167f2b409cf79db4bf7e96f5ebff622d766c30f6bab89550069d6e1fa681f61e21a05b75bc793eefe7aae090dff601cfcd6367935a047e400af8e3c9632fe372cae335e65c2f2d65da86f283fdb086e61a30eb2b0aa05b100c6455d8c31ad04fa8dfca702b2aa7ef07a5deda5a9fd0aa33f18900be92b8200b7b5351de2d6bda30e67423a445f34fe3b7989a1e9ed04d1ad34da7a601bac00666025f4f709ba360c7889a05763382164327a1bdf31418f78fcd4e7af34070037d5d5f56667f8e587d83ec5ffc3e6e36536e67ccca1defcbbd653999b353f003846fa41de7894c1712f32f717d78c7f99648d153bb73bcaca7b91c785ac550051c763a88e9a1e177caaa28ef3b15eb0bee688f58123d6bb8e586f3a62ad390062bde388e56913ef39625d76c4f2b4094f7dbded88e5a9afb71cb1bcf48573005dbfd9ea3547ac3b7d1cd3f2a12396a7be3ce7a12b8e589efaead779c8535f009ef1ded3be3c638ea73f7ada8467cee4a5fbf437efadf522d766c30f8bf7d600504ede5b7b5cf4272de3cd6b71d65cedbdb527e3e0cf86f4a81e7d9b123a280065fc6f585c67bcca49b7de63ac0f55df50fe90edf26301bdf881618d8bba180063fa44a0dfc8bfd775b13a8eacd6df46ff64402ea4af08ded6d674888f34c400d85b533a445f34fe3bd95b33bd1d27ba95465b0f6c83c733b012fafb385dcb00da5be3f375334d60d36f24df94c7998d97bad7c167238b7ea807db4f6460e1008b45f165c34713adaba526713aee37aa9d98458fdc2a1f420c7ee501f601db0062bb5141bb9fea8cf645e8cba7cdbea8a3fb365e91ed633def5c62fccba2af0031e61235aecaee4c3f8fc791672d64372a57e17d631e3b8c33f87a16a47f1c00fac87109e3e4285d3bd71cb86ad23d37f0eb59d46b0cd45c926eb79f19eeec00db4e7312c4ad26ddbae117ffe3f1787cf1ffa5e1cebea817ffe3633a47a01e00e9ff70b28d79a5895911edb35ebb51027e78a6fe74a393dec6d3ee8f300dc7003da37f1b62c56714f78e8a3e1f09c86c98f8e65794f97c43cbf03ecd5391ee0031c879ca7855485e1e1fee8b1a13b6bbc7841ef2bcf92f4e9c99cefd488bf100dfad37ffe57dd54a5cfbb8fdb8fb76710be5b5b17c42d41996e56ee843487f000cfa88f4f8dbdae3b51b14873166731c56792f5ec338fc31c528ec0fbf022c00345f216e55b4671d72dea3fe373e7c8df92899437eb7533e888539268e2b8e003bbebeb09a74d2db7860ec443be4d869f47f1ee2f79f09e47a38b7fde8f0f600b24e08594789feb7606efb71b21b3c4360e3a1c687cf7d1c157c4b449b24dd006761d47c64728e65d05732faf593a0d3eb3427a22ed4b8f2f91dab1b11fd4a000b8fabd1ffd40ec6f5a787b79715c795d71646ffcb30ae7f9dc615f5171ad7002ad5e1b89a8ed49ccb635e74cec5f647037ceea63a1c437b4374e8edd371d7004cebb9e76a5e33dd13459ef09a09f5c373f56371f4d39aabd5e3ad2aaf8ebc00869b55b940d65e79562ef018e810e9f1b7b5c76bff88d64e98abf0de9fc77a006db7b142f90b8e691aafbebd4beb488e118f39f2516b52958fa1af639df1e1006bcc07db1b9df293f45fbdf977ada7325b5339bc23feb4ba87e3883fa3f6fb00fdf0e75aaf3cc07d759e73e2ec93cf2fe49d738c7f99648d35e76cf7aa453e0013f8b490b52aea780cd5ab109f167caaa28eeffdf60bd69b8e585f73c4fac00011cb535fef3862bde788f5b623d665472ccf3ebeef88d5af3ee4a9fb6b8e58009e76bfea8875d511cbd3bed61db13cedeb4347ac0d472c4fbbf71c47cff8e500d9c74d27acf437e7f2bdc8b5e524575a3cf5e5994ffc20cc439e76dfaff9d7001547ac771db106f9d7ded9bd676e3298d38a61f56b2ed7afb1d03397f38c85009ee3e8a9af7ecdbf78aff34eccbfde72c4f2f46d4f1ff2d497e73ce4e943fd00aa7bcff8e5b997d6af7b439ef6e599fbf66b8ed9af7307dfc7f2983bd43dd40047802ef2f318b3861fe9134cb3215da9cf51f1333356affe372cae335e65c20072eedb74a86fa16797d0a6f8d321bdd8a7618d8bba1863fa54a0dfc8bfe8bd00402f3f4b7f1f75c49a22acd0334c8865f4ea136bca4e2a82b7b5b5b1c54fbb00388eed4c686c314618ffc9a4f8f359a6b7ab4477b6d1d603fbc6d3195809fd007d95ae0d27faf9ac4ad26d6b59e7408d2f5f0b9d777b22c0e79e1ef9dc939300cf17b93f8c6de7acd4e776e39e3359588b7bce6461493d8bec873fbfa572080047f967d47ce3873f37af72143ffcc5259b9ff09396162f8cf7b370dd2fde2e00cce6cd698c7f39891aff5b39cdb3240feb87cff9d484ac5551c73652137c6a00828fc23ae1849516be67d50bd69b8e58571db1d61cb13cfb78cd11ebb2239600a74d5c71c4f2b20935670e6c228cf59e23d6fb8e58fdeadb9ebaf7d4d75b8e00589e7d7cd711cb731c3dedfe6d472c2fbb4f7f737edf2f36b1e988e56513e900ef41feb537b69a24fd39d7a6bf790d3b888561ac2d472caf9893fee6bd825e00b0269db0d2e2e9439e31da734eebd7bcb05fe7b42b8e58fd18efbd7dc8535f005e317a3077dc1973475a3cd7569eb1f04347acc19ec2def990a7ee3dfbb8e10088d5afeb214fddbfe388d5affb859e79ce204eec5d3e3188137ba7fb7e8d13009c7fa97758570596d1abf7352306bf6f04d7004fe6c00af1deee3d0e2b8d4e00deb837fa540eac10efd059c0b49c6e74f2c6be5adb71d1aedefcbfd653999d009b127296886fa4f3929b25e2673ac26bc8bf4cb23acbd33a0fa0ceaea973730071cf4bd4364a848ff23c2bf4a3ce27f0bef574f36f7c1714d23f0b7d447afc006dedf1da37476fffafe2e34ef7d7d2f72a7da3891bf75ccf7cec73378bca5600fcf0e796c785de1df15b71026d80e3c40c5cf7f383e9f9bc71c2f897936edb008d112766481ed60f9f1b9a15b256451ddbf8ace0332bf854451de7d13bc54a007f3fd18772a5e57d272ce5fffdd2c7cb8e58fda8fbb4ac3962bde988e5a97b00cf3e6e38627de088d58fba57736f2f5836cff2fb37ad3e2d919f67ca3d2ff2007bf3627d67aa44fc50afea4cbce9ee8490b54a7569e1f773aa3cfd84e0f34500c42ab0e69b59df9a9e9ddf5c9caf2daccecd6f2cccce6ccc2cd636e6e6b7a600a797a66796e7966667b7d6e79636966666b7661667d6a7045fb6d9486b9ab900bc36cb67c023ad418367c0d59899ee6684ac55aa4bcbc5469b8eeb86c5b5a1000c2c8e23bd60a5c5deff1d716f617e2ae9d62ddb599c35c3ed67bb909fe90800af21ff7212d5ee836b06d44faf6b86b873ce5c6d5cf4c307bbfd7ceeac3f7600ebb9a0397fecd63341f3bd63cff205c35ef0977bceb0177bc7dee00bdb7d3300e0b79afb3ae6174b4d9aac6f063c02f548ffe4be36e66f37318df724f0e6b8007300aefbf9c74c2d6fdc31fe65923556dc3940f2b07e38eedc2364ad8a3ade006fba47f051efe9af8a3abef7d10bd6aa23d65547acf71db1d61db1de74c4fa00b04fe5bae68875d911eb8a2396a75c6b8e589e76ef2997a7eedf75c4f21c47004fddbfe588e5d9c74d27acf437bfb7b617b9b69ce44a8ba7bede73c4ea57df00f69c3b2c9fb0fbf4983ff23787d1961e237ef81d4bc4b7bc34d6370f0dff810038f8adf7e4dc9f74eb18fb64fc2dcfbc17e84b19ff1b16d719af326179eb2e00d437949fede77e9087dfcda3b0ee2f88352eea628ce9d140bf91ff544056d5008f23a413c547ad518cfe4b01b9905e7d6bcdda9a0eff14d479ef43658df7970080a7f1dfc93b864c6f0f12dd4aa3ad07d6fd03195809fdfd205d1b063c2cea00dcd601c29aa43e648d6f55b437ba3c6bfb38716066356f5c32febbb5b6bf3700a75ef95ba4d8b62aea786d5ff49b8858c76bfb5eb0561db1ae3a62bdef88b500ee88f5a623d6877d2ad73547accb8e589b4e58e96f5e97f422d796935c69f100d4d77b8e589efeb8e688e569f79eb1d0731cdf72c4f21c47cff8e5a9af0f1c00b1ae386279eacbd3873cf3094f7dbdeb883588ab7b1757fb3507e06f3a78e40000b676c375d35d49671dcac0df30bf1beaee2559ee15edd21279efa2754ffe004b71f05b7b230f24ddfac73e19ff29a18352c6ff86c575c6ab9c74eb3dc6ba0052f50de567dbc2fd15d44116d60305b1f6720f1375cd7b984a56d58f238e3a00b997b08e08acd0de59deb1ad24dde3696d23fb586befecde809e90ff4ef6ce004c6fc789ee74a3ad07d6f7fd195809fdcdeff52fb2775625aca27b67d87e3200c0e7be1ef9dc9793cf17b93fdb9d65face98e699759689dff36df4ff6fac8d00f94b639d7dc4f6879224b3ff87a90edfe3cf733aeeaf1a9df97405eafc7c7a00ba752eccc6138bd51d04de13547708eab0df5c86e96fec531a23ce95dab84c00c7f2a00e5136c4c4b1567a1d25fa7f3dd696e5cf553566093051ce954627bd00e9722c69f71b695806a3ffb720c367558d3992d1af4a06e67f051bfef5318d0099084cd5af83d42f96a14a3218fd7f847e5d07a648637f632cb0b3dac6eb9000e095645c63db38945157942feac7ae1dcec1b724ead896589fd83e4be76c4b0046ff3b015b9a1232a03e78dc0f900c4c73906430fadf1532a47ab618b27ee3001bdf3ab5fa8d9b9f5ddf4ca88cc06f0ef56aa87908a6044e563135a4d29abb00308efd1d3213e58e49c6b5ac619f84eb1b9bd7376f6d66286888c02632980d0025ba702cb57669893be7e47f16c0f897136db7751f79a639ce9b3cac1fbe6f005715b2aafcc8063734cfb3afa10c07840cd564fbd87120677f2693b661dfbc0075e3d32c9bc3395cd9dc6406ff92689f50db92b89696d41fffb0e994e3c4d700d90ed6d5bd6c2b2af728511df6976d857d09ebd05646a80ee78b51aac3b965008cea0e43dd3eaabb0beaf6531daeabc7a90ecf5195e1371795ebd998a5fcbe005e6ae3329d95b43fdf6b762a6d7ba7ad61186b28e95e9ba4e56ce3f6ff66fb00b867e167fbeb3593c7d6d5a3a26fc87f94e8cb4d234bc7f729ca37d45e888a00692c03d263bf79acd47e6788378e95e53171f73fdbfa7d00f4a7fa763fd42300fda1807ed5fe5848bfdbed919a3c6a1ffa01c2da4ebfa71bb7ffef77fd1edd0043fda27f3d4075283bc73ba5fb23422e15ef8e04f8dcd7239ffb049f1056550060e13ae1f344f8e36f6e7e7ae1c6add62baa0c12d59ad0ef71ba7694fee6d400f7ee0c5179adc1793c1f99e5a3700fd1df07857caa981c585896e164fb62a6006eba3a06a6fea364ea6a6ac3e9c8c2256fc1615bdc8233f35a063a36e365c10013af85ccd8e8141f3e06fe15d1ae447528c3570232607ba3b310f71cd4f98500b8b956887bbe8997b59df91cd423fd7c20c4591becffc3a2ff2c03d263bf4d001ea57b6b3b25789732fe373e7c8dc70565787497f870c8c63ab675a5e7e702007cb0fd73bbd49fea2ef1a9ec129fa3c4e779473ecf03cdd42ef1e1ed04ace300b8a6fcf4f9001f6ccf7ebaecd81f15a763eb8d1ffd7901ea708e33395e147200588cff2a5cf7bee58dfc4c5ed681f12f93accef2b4b6c6be4af2b07e78bba3002e64ad8aba47e137d6219fbae0a3b05e20195e8076bb347e333b1dbf17e2c800131cbf17845e8b8edf1ce9b51ea51f73d326d7c9a4bb58dd4bc09b6de114d400a1af70515b57f5e6ef346ffaf16a1b97e9581eb43193ad92748f37d2f1b88400c6aa2ada1bdd78d2ad13c7f19865bd26a2ffa781f73cfce6a2746e72a73a1f009b6ae3321df344bd9ea63a1cf715aaab43dd19aa3b0975679bbf2b49b6cd9500a8cefac8d7781cb1fd4b2403b6eb754e54322bbb7c91fa53d42e5f147c42b10079a7fd513287e6f09df2c1fed4894fdd914f1d684e129f256887475e7e665f00bb0db6c33522b6b56de551a2ffb9c936e6df68628e27dd7eb097b1847d630500ead8cece401ddbc659a8abc36f2e2a3e992ed2f874ac407cc258cdf12994af0044caef72e72bc67fb7f29517499eac58a3e2b7b555feb440ed42397e3d4e1f0073ebdcf8ed568e5f2779583facf39342d6aaa8b357d359acb1db88bf0eaf0a00fb0ec52fc3c3f31bf68ac4b4bcdee8c434fa5fdd959835bd109a978df7a94800bcf3da8ff15739b0c95d1675233dc8babcbcb9393fb3b53a5d9b9f5d98dd9c002b25ddb17d585ce3fdc5d3825ebdcadd74bd1247d77316d3871b6d7c8cdb69001981ba5354370a7526633a67fcad6aa7fca723c99f47ffc8bf2ae82f401f8a008ce5a1a4d3d6d01f2ddfac431dbfcebe2ef8d4059faa686f749c37215d1a7700fe5bb993a7c987c72cf17e4f56def4fb1477e2acbb161655aec471e77424de0079e30ee735288fc95d1675bdc49dadf5a5da6c6d61616373616e6d7e6e2b140047f01ac79d1541ff8ca0375d9f89a3eb19157770cd9a9611a8e3988471c764005471274edc5c98c9a37fe45f15f467a10f45c6322616c6030fac033bc4b2d800aae6f47edbfbe1c736d0e68e531dfad3935487eb353c86c765bbfda49f2fb000877712ea38aeed7eee97fffe00c7d938b6d05e3ba89c40ed7585e604e51ff800986bafbe66635949bac788f7eef2e6386a0fcae8e2cec773f3ec4f58943ff100de08fa13da0717e54fd6a7a27be2a873934deda5221ddb529ebdd4505cc47e003b8ec792f5f1e5a4bb58dd2bc0bbe89eb8c95d744f1cf5fa0ad5a16dbe4a750018a75fa33ab4ab73cddf95246c5758677de46ba1bdeab32403b62b65fc6f7c00f81af351322bbb3c4dfd296a97a17dcc587bfc59f9b8071f95cba9b8d42b1f00b445be3f538776b827fec8fe761b6c877be2d896d77646ff97614ffcb1266600dcfcbf782c61df7815ead8ce5e833ab68d7350873ae7a2e213ae338aec896300ace6f814cab1e2ccabf9732ce3bf5b3996ca7d4239d68a9055f913df7f566b00e015c14761d9585692ee31e2fb894573b917457fe2ae63e71678bec3a2f22800bec7f432d415cdb170bfb0488e853a0fddaf8e3197d97860bf1dc76399635f0022fa8fb1af688e6572f79263f59a4729bb3adffc5d49c276c573c6b0b816ca00155e2619b05daf73b89259d9e50af5a7a85dae083eb173acbdca7dce38f241005be47ca20eed30c7daa01ccbdae5cdb18cfe06e4581f518e1569bd563896b0006f601ec576a6f228ab3b0f75a8732edbad018be4586a9dd76f7327ef1362bc00e07d42cc7d799f10c7ace83e21ceb945f60943eb54150be2ae1ff2e7b0c6bf009cc4b485760e7b86e461fd700e7b56c8aad6ecbc4f58749f21effa3fc619bf00c86bc945b55f6245f91aef13a2aff5b226fcf11dfa93c95649b2e7f752d26d004b79d62e6a0eb7f1c07e3b8ec72ac7a944f41fe796a239acc95d3487f5cc5300955d5d68feae2461bbc23aeb235f0be548bc8780ed4a19ff1b1fbec67c94cc00ca2ecf507f8adae519c1e74ecd2d63ede372be5687761daf8ba31cd6dae5cd00618dfe2dc8617f8972d848ebe1c2b1847da3689e6a7517a00e75ce65bb357600911c166335c7a7418e153fc7e27dc2583916ef1316cdb15e147cfa2dc7e27d00c2418e35c8b106395632c8b17ae0d3cf39d61f39e5582721c7fae3418ef5fd007207e7589b796c14f9f75b8e959aab7d4af0a3cd5b173f5bbbfef1fa6b9bdf00ba79f2938d8bab9fdefa78f5fac98d8d4f376fdec4deb035706fd90ad42e6700fafbb8b88e186773f682bd16e911c33cbe92745bc5cb39b042bcd56c85182b008d4edee831afe4c00af17e55d023c6e946276fecebabd44edd5128656033ef00903c21f95f13f488713620ff6b39b042bccf097ac438d3e8e48dfa3997032b00c4fbbca0478c4b8d4eded8d7f3d40e2335d229ec2cdeaf65f40d65be9014eb00e3eb821e670e8b3e15d18fd7736085785f14f488f146a39337ca753107568800f725418f98f656b64ad2ddd74bd4ee12d4215d1636f20ec91392ff0d418f72007c2920ff1b39b042bc2f0b7ac478b9d1c91be5ba9c032bc4fb8aa0474c7e310021f6f50ab5bb02754897858dbc43f284e4bf2ae8518efb03f25bdb3c191562003a66301b25e267fdc06bc87fb732aabce33045bac4b65551c7ab44357e5705001f8575d611eb1547ac971db15e75c43ae78875de11eb8223d64547acd71db1002e3962590cb59886e3fa34f15139dab9001f6ccfbb5ed8ae94f1bff1e16bcc0047c9bcddaec53be3ed3668836ad70263ff28d13f09bb16ef3531d58e163f490091751a7b277a567c6cae411bf68bedf3ad27053147b0627538cf2dc26f2e6a0097c3e42eba0b8b7abd4275186778bec6b8718dead077df6cfeae24ddfae59800a8f25ebc16b2e38b2403b6ebd55f94ccca2e392e17b5cbf3824f6cffe71df400f38e7cb03f1788cf05473e688baf139f3ab4c378f66314cfac5d563c7b10ea0091fe30c4b3bfd8c41c4fbafd602f6309fb86ca4bacee1ad4b16dbc0975a873002e2a3e992e8aeec262ace6f8a47c623ce9b6bdbdb8d36dfccb49b7cfc55833006cb7bfc36b860b4256e54f3cd7aa3d990b828fc27a836408adf9228ddfcc4e00c72ff69a4f8d5f68cd9777fc6649af17a2f4636e8be77e2c3c2763dfac0e730074de0f4c483758b04f45effaa38d996c2a17e579bde8dd556ccf77fd23e59b00d3acd744f41ff7638adef5df69be897ae57880e37e99ead06e791ec079d6e60036956f722c2b9a6f62fbddca374377fd397f2e6a97a1bbb1b1eefaef565edb006ff9e6af15c837d3c277fd8dfeff4eb431ff3de59be8cffd9a6fb29d61bec900b6d14bbe69ba289a6fe23cc47bec685f48379274fb1bdb7692689f451cf6b9000b19fcd372aed1597751b463d9d47a3911d74a02e7dc36b25d14b231ee50a0001f597cf2c6c213247bd1587842f0c993a7c699bff3af338cff6ee5a979ef4d002a7fba483acfcaf9b00ef95c127c1416c7fed03a314e3e5c9bcb3b7ec67fb700d6896afd7642e87537ec3b6b9c5702f2c499e36aadb7f4a97bb86a1d9d7eb9006c2ce9b621756f9ce5be0cf8762d6b6c14ef902f22069f415ac990330b2bc4003b74e6202d2b8d4edea8a34b39b042bc43e705d272bad1c91bfbfa46463ba60053b26cd76fa64dc475cbe7702cf8cd0297881675c7f724ad3f4319325c827a00b43dee4b49d02b3cb45dc653f90e9f335811582abfe4388d39e45ec469e35f0016fd8e11a7d53d4ad40fc6a17d49a7aed96670fcd479bcf4f76ba2af1c9ff200ca64f4d7043d62707c42f9afe5c00af17e53d02306c727b42f6b1bb2cb3c76008372f17ac703eb4d072ccb9fd4d9a06ad23d1657a90ed768bc7e7b4bc867fe00fc365cdf0b7f36fe659235963fbf4df2b07e943f63acccca31f2d0bc0d7ced005afaef9d9c3219fdbb821e31d89f718cdfcd8115e2fd35418f18eccfef407b006b6bf3a9cd994f37df789ee6714f347ff33e0efa439efbe2b81769fe90e2d70002f86f07f0dfc9c04f8b7d0502f1953fd793ce3a758f4ff933ee51a14dcd8300de96037c5f0ef07d35c0d7e622c41fa5bae74086af06645809c8702120c3c500a41b7f28e9f639de2fc67ea3bcf637f67d48c8c9edb10ee9316f353c75669d00cf2be19ccf73ec39c1e7a2e84b89fede9fd10fc38b611bcccfece3b8e0c13900f7f9725beeff03f78b90c630d212f7a9aafc7396f1dfadbd9ebccfa5f05361006a7cb18ecfa1aa67385e157c14d659472c3b873a2eea1cef95aef1937258d400bdb0a2f7e64ceea2f7e63c9fbab53a3cdb6bf3898a45bdda04b6e7b70ef2730043ea7fe3c3d742f6c26fed564f9d96a80efb7326c047bd89604ab4ebb53ffd00f0a46cac372bf2d3a7756887f7e6be495fbeb17679efcd19fdff807b73df6a0062467ebabf702c61dfc05c33cf53b72acfe567f7b0a8f8846f0cd8e959308e004fca27e2be35b1369f77de36fee5a4dbe762ccdbea5956156bd2a38bf68cd100479bb75edbfcd6b5d5eb1f6facdefaf8c6276f6cfef0679b376f6137107a0400ae633d96116267742b44f76aa39b0ecb6ebdf0a0a8fa4269126258b850fde00050b807669cfb5663bf9ab14a43acad9a165e82df59e3177a493062f12d69c4007e96f8bc24f8bc14e0f3ac9039f28b4a0bbfbce759aac369aee80b5dad4f830097f7b4c663f0f29ea45bbf8397f774f219bcbc67677c76f2f29e5fa5a5c24e005fdef39bb054f877b454c038b397b1a41f5ede63ba28ba54a8431dc7a7974400dbb8f36afea582f1dfad0fa9a858a3721215db796b1deb4ec26f8e0f79b63f0010ebb423d62947ac7af3b7e9063fac6b3a4cfddb3eac6bb11f75b344f29c1400f29c0cc883ed59e72adf5c1258467f4ad02306dfde437ea772608578ab0fe0002006afa1d02fac6d25e9d6c973cddf53f4b7d5a7a55f3f54f95c1c79821faa0044fdb0efe7fd5025dbb4c7872ae38ed1dcdc94902ba1fee3dcc02f86c7b88000e3c645cd71d6a7a2eb1ed433e79728038fc773244fd6b8ab186374fdf6c18c00a2eb1e5c6b1659f7a05e3937c50f1a703e89769be7c3936a9d80bcb1cefac800d7781cb1fd6ead139ea3fea00cfc0189a276f982e0138af33bed8f9299c7dc00838ffa702edb8f071fb445fee8611ddae1bae78189761b6c9777dd63f4ff1800d63d0f367f47fe3870e158c2be81fb126c67b8c667dbc05b85a8732e2a3ee100478577baeee1f814ca7dd0f6f622f731febb95fbbc40f264c51a15bfadadf200277e31bccab14e093e0aabdefc3d9e748fada37f14fe883dbfb03d6b8ee2a200ecbcdefc5d34f7417be5fc3ff61cd36f1f332f9afb606cd969eec37b3cf8a10081ac0fe6612c0de545ea83a99cfb145d5360fbddfa087428f7e10f3b14b5cb0017059fd8b90ffbfd8b8e7cb03f75e25377e453071aceb1707f02739f7729f700b17698fb605bce7d8cfeef41eef33ee53e71e6dfe2b1847d03f322b6b3bc1f00f1a8c36f2e2a3e992e8ae63eb84ee5fb1126fba8a0fd0ad519ed0fc178fd5c00f3b7da635a4e3aeb96a1ee79aafb0ad42d51dd7302b34438687348ff14f5c100e83f6dca9deaf2bb558d3994e89863766c368a3eea67a3eb3593a72efaf83c00f07c91fa68f43f027d7c8a7288e146bbbde9bef9d68464a411a53fd3a91cdf00a363c5986f8e025f8ea3c3829ef74aeb821ec7c674a6621ee7a75f1158cfc300b595c6edff77cb064c3eb401f419b601a3ff899c36607add0b1b40bde6b10100a4671bf8aaa0c7b1319d5593ee713f49586a2d8476d10f3680f363960dfcd5009c36607add0b1b40bde6b101a42f6a03bc4e451b7889b09e17583817ac90ac00863d96e8f908e72ba4ff5918a3ebd54ef9d49c6c756a4ec579b94418d88f0900d18f29aac3b629ee6f8d76ca6f39dcb72127f865cae122dd3b6ebd2ac1721a00957722ff51a2fffbc22f4ad406f5159a7b421f7b51390daeefac6dbfdd3be0009c37ef7e1fe7bcb8df57a73a3c5751742f10ef553c93638f046db3443c8d0700fb0afbc5929017d742bcaffb4fc12f7e83fc22e64727712cd55e34fb0dd2ff008b805f9cd9465fec17a1b3aa288fdadbb0b6fdf66146de0747db67bf40dbe7007d7065fbea4c11ea848bf20bfcd8635ebff88d8cfb18c603c72a2dec177521002fde1fe1735eff09fce2f7c82fe23c5ed6f60bd37b965fbc9a74ca6cf4bf1d00f00bf558169e1161bf087d6e49f9857a74b6df1ec7e3fbb7e7a18e7d06cfbe00f19e293e42c37ba617a1aee8e335f8f85f5ebff83df20b7526be0ed7427ef10032e0fe2a3dbe6dbafb03f08b3f21bfc07811c32ff0553cca2fd06f90fe7f0600fcc2f35360ca2f30f6f2270be2e86b6e7d4ac86a45d93e3f5ae669fb56878f00bda34eb828bfc0c7d5f3fac59f905fa8b3e675b816f28b5700f79be417a68f00ef815f54276fffb671c6bec7f00b7b2d46965ff06ba95aaf9e6acaa9fc42bd002eeb3c5c63bfd8ee5360f5e6efd0a7c0e2ea6b7e664ac86ac5eaf05507fc3a00547ccd11cf17795fcdcf8f59abd776e4f50bd35311bf30db2c114fe351c42f005e075c7b4d2efbc5ddf0998563bbe3171bd6371bcbbc7e61f4f715f48bd07c00a15e4b98d72fac6d64bfe8abcf52581dbed66937fce25824bff831fa5412ce00bbfcead40b3979467ec5e73adb7a96ff5c847aa4af05fc27ef6b6843fe86fd00ae377f873e91b997f146bd3e93e3cda2d097daff3e0ffd49cb48234a7f36d500fe378edb28f0dd6e8cd2523426f2eb9d704e7e9dea429f92aa0b4cfc241aaf00f94fc15c7595e6aa7e5df39f0df8da60cd7f67aef9afd25ce5b5e6ffa3fdb7007fb35fbc037e71fd0be217ef0ffca2557e50fce27a24bff80ef985f5f387c1002f7e82fc22ce7b05da7e8176affc025f8584f49f05fc42ed91a8b399213f5200e7c72aa4376cdb6fef61e07d2bf49997a8ced367f2fa05bef721af5ffc04f90085bae755876b21bf380bb81be417d6cf9f04bff859f28b48af629c651bcef2000b7eb5a4d1ff54c02f541c3905d7d82f941f61bfebcddfeaf573fc2ac338fa009a5b9e12b25a619f51b11d7d86fd42dd1bdca9cfe4f50bd35311bff859f20b0075efb80ed7427e7106701f21bf38d9acfbbbe017bf487e81670b62f8857aee004b9d15e0f3013f1ff00b753601cf36b15f849e154779d473ead6b6df9e276600db47bbe5fbe918ebf90c8a8a0feca3ac132eca2f4c4f45fce217c92f4e120f001cabb4b05fa8771ba4b83fb3eff66f1bdf2ad03d9e74d63d007547934e798e000979907e82e89f001914bde18d12fd3f03dbb7336f667fc7a1bda3bfae99cc004f824cc3a25fc74966a3ff97017fb536a8b7c7e01afbeb93821efb6df25448006fd8769cfef6d5d774ebece953425fc7843ca344ff6b39f7deaad09fb48c3400a2f4479e3dc5711b05bedb8d515a784c9f12f43836a6b32ad1e3f85adde35000779cead0671f2019aa4286bc673dad6deacb3fdd0c7895a47bbc399ea06d72003c517e81f41c4f9e0419147d966ffe4e209ea09e1de3c996c9fc34c8a4e209003f8762f4bf1b8827ca962a708d6def69418ffde6788276696dc7e9ef58f1e40084d0d77121cf28d1ff5ece78720cfa9396914694fec87882e3c6f12434466900e1313d21e8716c382e9c80ba27a90ee3c95354873efb04c9a0f281bcf1c4da00a6befca3144f90eecbc4f371c113e7d2d38ddbff8f0b9963dc7bc298339c7400ebf309a847faff1df0ef27441fef836b6c0bdbc5518ec918afad6d647dad8500f4f5580e7d7d37a77f4f407fd232d288d29f75e5df689becdf6a4c91bee898009aceaa49778ce45c027de871e23321f8a03fb10fe35859dbd4872f357d38d500cb9952679b21c06b56b5ec6d18ae3b8e4fee4f84d8b532c9ea2c4feb3d1ac30049b7be513ff6db74372264ad525d5aec9de02551372cae0ded325625e91e6f00b679a59be1001f1eabb44c89766c73acd37af3ef5a6f25f73b2b8d7f3989ea0003d3a1f1537a35dd8d0a59ab549716b69351c16754f0f9a26059fbb4b03fa600c53e273645b4689b1c03b7b3557b8f421a5b31965692ecb131de63cdbff1fa00a8907794e84f342752f38f7d246bbdf977adc772087013e2352efae7c8bbf5008cdb58d25da644bf79dcf7431d8fed38c98c7565a8e36f406019a6bf51172900efbb0eb67199ce8ab29112d58d897e581d8f7b5aaa49b76d8f521ddaf618d500616cdb4775e84baf373a65c6397138e91ebb3c730762f0bb58550e90fa1c8e00570272d69b7fd78a96998df585cd99c5a5dae2c2f4ccf206fb00f6857d9e6d008fe5629ce100765560599c34df433b2e257e7ecfbe80321a6f5cf339aec37300bf4fcdf897936ebf8d3127abbc1bf5c3316652c85aa5bab4588c2f89ba6171006d28034bd9c3002b1b2b2d9c77f4823518c7c1380ec6d1671cd5be6299f8a800783c11e083ed8d6e4ab4e3790efbeabd7f8efcac1f780df9979398f36e7b9e009bcca957d3dd9490b54a756961bf9a127ca6049faae0c33637c0cac64acb4000f703dd7fd1b06c0e5079f44ee71a6c3f19e053ee914f59f09912ed4a19ff1b001fbe96157b7bc1b2fe1f001ad6f301c2e26b213d1f20990f38c86c581547ac00aa23d64147ac430e582a6f2b531dda92edbd589db20dabab04daa14e5fa6ba008380c97b50d8e7579aedf66e4f22ffbda93b614f42c5f37e5b6bdcf9eb83fc003677a7ac0f780ddf4bce15036bb7f2843b2deff941cae32c26a0cdfbf9e0dc0062de9860fccb49d418351df22fa557ce01b12de71a69e1b553d13c14eb5e1d0060ed19d60547ac814d0c6c626013039bd80e6b6013039b18d8c4c026b6c31a00d8c4c026063631b089edb0063631b089814d0c6c623bac814ddc593611bad7003e4eed4a89e7feea46eee7938c7f9964f595a7bddfabf4aaeea7987e2a71f4003357227c94a722f4c3f7e779ecd27f76ef199f7745fa0af411e9f1b7b5c76b007fa1c988ef7fa785edf6a0e80f5e33fda6f7cd7fa489bb5be738149fc91ef9004c0a3e9ee745aa0199d57da329ea4fd1fb46ea9e67dcfbc5615f50670242b60016a23f5490feb0a09f08d0df5510ffee82f4f714a43f5290fede82f4f7097a00154bcd1f8e421dcf43f7c3f5bd98878c7f99648d350fdd9f74ebeea8d05dea0073f61cd5479bb72edcb8b57913e546acdf86eb588fc568f8ccd828fdcd675f002a202b5e3f9871fd50c6f5c319d7efcab87e77c6f57b32ae1fc9b87e2f5db7006267bb8c969fd97c85ea79be301f507a4d8896c7c3fe6659bdea9388d8def50089a0576ded7ac8b66d5e441be6f7418d43bb61718de7456ccfbe511658ca97008d7ebbb36ffcfc28f29ba0761319720d0bec2cded88ecffd85640ef5519dab0050efeba908bed6969f954e8be926f5d37f70a093a7e163fe8b6dcdd74789fe00af54da98bf403929ea86f34894398f4da8b9b49a648fc11e3ecbba55227ed6000fbc86fcbfe8cfb2f23aa65f9ee91b600db0065803ac01d6006b80f5838dd5000fcf8ef0ffc687af85f663f3e4b73be5a3d651dbad23be4beb08d37dde758400d12fc03ae27b817504bf0357e966b7d6188a8fed616ca7b7b14aa73c21bd21000fd6db97416fe3954eb9f609b94ad49f9144af87f7113fa39f027e8f04f8d900be9b1a4396458d05beff8ac70edf67a9e85957467fb829af7abf34afffebcd00bf6bbd9535150faca8755689eaf09e02afcff8fe23d6e17db011aa43fd8f5200dd41a14793090bef05a20e53fd9e9e6ae3325d423c71ecf8f99a12fd8d36c600cf8fee17ed949d627cb43613497e5fc4bd12a43f06be314b3c27054fe3673a001a4a74cc3cdbb8fd7fdcfbaad39b26cf41d17fb4c30af5dfe84f807ff1bb9200d5fd29b567c832203df6dbe451f725f9396cbe87afee3b2a1bb276389e6c2300281f8ed94ae3f6ff3c0f60dbd03c90650b6f3471e39e41985be071435b50fa001b25fae702b6a0ee13876c41d94ee89eaeb2d5106f1c4b1b37d32fc6c318fa0055e70e942df3b9825301fd2adf09e957dddb5567254cbfa8d34384b59d7e4f00376eff3f2edac7d0afdd33cbd22fea1fe95f0be857e92ba45f752f1cfbcdfa0045dd1f26acedf4cb7345bfeaf7f21eea17e3d76192cf62c75b3097ff24cde500185f783d827de7f565c8d7d3c26b23a37f0f74f5dd0c5d0d6560b23ddc053200c5c81dee167dc4b1b82be9eca3d1af097b303de37703ec5ae4ef826ca9ef0600a09d8d025fec5792b4fb8df479ceafe0d898ceaa44afe63475bf107d88e7b4003831a16d0338c62a7fe49860f49fe4b401d3eb5ed800e6226c032a6e85bef700a36c06c7869f9147fb3848586ace47bbd86d1b50f302ca9c352ffcd99c3660007add0b1b40bde6b10175ae2befdc653aab26ddf900ef1ba83509ce052b24ab00e9702c09e7d59cdbff25b18fa2f62ad97ed57b35707e0df563276babef163800e3803906ef1bfd34e4024f543566d67aed52a3939e63755a4e030d9fdde5310062fa2992d9e87f26b0d715fb5cf64ef70ffe66c1fd83d0199aa2fb07a8778e00ad8ab78aadcc7b2c29d6ffbf1318b338f1ba3d662a5eab751ec7eb6f17cce3004363b65d2c347942eba4500c35dd85fa8718eafc7f29e93cdbb59d6d9c6e7400f6d1f8e4b50da3ff87c236b2620acb7536870cca375886ef0464506b9bd0d9007afb1bbfb58163c0df4031fa5f0619de6a0e50bffbc83fd9431f41bdf35e0200f34e0bc6b24a06efb10cfaacfeff4a20aec5598fb6c76ca7ebd17f1318339500b787c62cef5aaf92748fd3dd84a5c6ec74a34dc363667cb2f287acb5d87ff800028ed96feee198a1deefa63ab517c572e5ddefbf07dac7d8cfb367004633fa007d0fd423fdefe45cb7992ee2aedbe616d5ba0dc77414f862bf92a4dd6fa4cf00f37c108e8de9ac2ae8f91b4a6a0e407bb518bb973680369c6503bf9fd3064c00af7b6103a8d73c3680f4456d80f7f08e405d563e8458a13d3c9c1762d8008e00b1ca53314623fdffca6903a6d7bdb0818ee775816f56dc47fa3ccf15e2d8f0001e08da07e7632ab70bede1c59987db36a0e66194396b1efeee17602e08ede100a95c21b487b75dae603acbb397afd69368176c03381e316c40ede55744df38007fdcd7d4777fdccf291e0742ebacb4e4d9cbc7b1319da9bd7cbe4fb8dd7abe001f6c40ad2bd9060ee7b481bd8c03a1fb39ca068adecfc1b109ddcfe17d5f75001679f7efe784eff3a3cc596bff0773dac0eedccf293e1778dfcfe1e7e8d03e00f85e0fae15f12c5ad63d08e499f77e099ea5b56742bdbfadbab9b4bc515bde00da5c9d9e9e9ed9a86d16f9b6aaada1f18ca8ed63a873c7fcad653bcf87d7510037bccf68f4f3bb733e587e6b99cf3bef833e0c933ed27296fa60f4179b7d48006997aa9d3a1b231e5887fa1ca2bafda407ac43b94ddf91bfd1326bf2ab33bb00286bd699dd7acef83406fd49cb48234a7fe6547cc2f3f11c9ff23ed3cb7a42007a1c1bd3997a470f7faf5a7daf7d3f5c5b21594d8763891e23c3e3ef9ebf060063c4f79bd16ff8db46d877fea6f5b0e06b75182bc641e6af534ce098546ffe005debad2caa6747ac4c09bd95a80efd909f19e067ccb10eeda0e837d04d174500bf81ee1187f0f986efcbd7e8966b2ffc16cf2cb2dfaa675e42671cf3bef742009dc360fb56734d119f49cb0af1437bb1b1419f89f1cdf6f5b585b5b9cdb5f50085e9b985d9b9dab6df6cf7e63f37bfbab8beba383dbd3c37bd39373dbfdbfc0037d7e69617d796d7e76b9fa757d3cbb3bbcd7f7175e973eecb73ab730bb5f500dae2c26ef39f595a5a589e59fb3cabdf58dfda98dbf5feaf6d2cacd79667a700375657173feffed2aef77f6363737a6e7a717969736e6e6379d7ed6f7e636d00a9b638b3babcb1beb0313bbf5e24af2f259d71232d78ae82db87720ec4e0f700ffa8793ec47bc8917729c07bb420ef31418f182bc41be3b1b59d127c4cc6710021a7e7fc58227ed60fbc86fccb49f77ce428cf74d17150cf2af2bcaad6a8a100f11b137c1456c9118b9f05456cf455bbbeafd1c9ebfbffc335cb6b2cf7da8f00f454370e75238d36dfb4949b7fdb1a97b14c8e51a2ff36ac6bd332066dac7d0055f01f23fe1d728b6b68878c352cae197daafbbf0d3910c640b6a90efca43b000776b4ff85bcfe68fccb89b6f1ba8f3c2d7fdc47f264d9b65a0771be8a6bd1008b8d361dd7a9b5eb500696f2c75eb0861cb1861db178ff06eda4defcbf56ac00ccf385f18c3eec109fcbb25a875951eb61e513a83f2c2877faff5881e7dd7100ccf97d1e3886fc4e119cd327a90ee3049f6d5631be94748f6b28ffaa66b4470019b05d29e37fe3936cc347c95c49744e80f20c89fe0c05f80c0b3ea13c69a700fd5132f3987bf0411a9eeb471cf9a8fd74e3833915bef3e43fd37d0b7cc78800ca69edd909ded7feefb0affd5f067b72df2fdbedc91d2b109f700db09fead0005e8c6e22e91ea3df8731fa631aa348f17edee4c3e77886037de277dbfc81b80017109a4b555ec23220bddaeb567b9dd6b65fe747659b6cd3932433d6e1d901008e5178cf1375c265bbf9f819ba9793082cb44d8e49c68363d24aa353de5121002fc63af73db799f5f9d5d9f9e5dafae6fce2eac2e2aeef796e7dce756bb136003fb331b739b3b1ba1d7fb52ec3fdf9b4d8da0ed77e486f78a3443fd4bccf9000ea7b84ee398c0a7e29dde1005dd13971a4d1794dad0971ad6cf4c6bbdce89600d1ea26a06e94f84c36ff467d2196c9314af4d566df6d4c707d6bedab82ff7e00e2df21b7b8c66be509413f21e8bfff0eb3a68cad7778016feff5e6f779123e005e63d9cc76b2d6f15979cf91836d1e386f64e53d7c3fdfe89f017b3f0a63c90071c8faa6eeb1712ecdfb0b5897758f8de78c96fd273a9fa937ffaef556727f008fc2f89793eedc2bc69e45e8fd7509e83cf25988d6f333ea1ebfbab7989ad00081a47bcc503ec3c2b5c399c6edff957df1d995a27b95d89edfefa6724fb5be00e27b9a6823bc47a4ee5b4e24e173479c2b64e599bc879b770f9f73e959f0fb006be4f7fb8807d6a97d26755687fd1e6d81f78138afab37ffaef5565ab68bcf009e2a9df23b098cfeb9a65e54eeaefc41ed83b10c48afcec1a867c7a7485f530071f4d53af774601b7df1b3bc46ff52405faafffb02fa0a7d174ee94bbd3f8e00e5b5bf552cda2d5bdc4eb76c8b46ffaad0ad3a9bb21ffa9396914694feccab00b329789e0473ac2c7f097dbb2bf44e3215abd5b95615e33956235f3e478bb10099e33fc6788b6d184bd55a0ecfaa1da19c1465ec652db5bab8b93cb7303bb3003ebbb5bcba54dbf6fcc0ff079d95f8872bc10200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/contract_class_registered_event.test.ts.snap b/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/contract_class_registered_event.test.ts.snap new file mode 100644 index 000000000000..a048778118b4 --- /dev/null +++ b/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/contract_class_registered_event.test.ts.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ContractClassRegisteredEvent parses an event as emitted by the ContractClassRegisterer 1`] = ` +ContractClassRegisteredEvent { + "artifactHash": Fr<0x103db9d8abd8d61dc45f40f7d8a6910a366ae9b0f2bc289e5384688ba20dce27>, + "contractClassId": Fr<0x0321fc89f3f6ce9730f5d48bbeacfb28f611f6a97e62fb4fd492dfbaf93b46e8>, + "packedPublicBytecode": Buffer<0x2600020401270000010480672600000403260202040126020304001f180003000280662d0880660001240000004524000002022702000104806726020204003a0d00010002270080430400052a00804400000000000000000100000000000000002b00804500000000000000000000000000000000010000000000000000000000000000000028008046046a09e6672800804704bb67ae8528008048043c6ef3722800804904a54ff53a2800804a04510e527f2800804b049b05688c2800804c041f83d9ab2800804d045be0cd192d000001804e2700804f04000901000001804f00012701804e0400010100804e0002804f2d00804f80502d028046805001008050000280502d028047805001008050000280502d028048805001008050000280502d028049805001008050000280502d02804a805001008050000280502d02804b805001008050000280502d02804c805001008050000280502d02804d80502700804f04004027008050040004270080510400382700805204000e270080530400032700805404010027008055010000270080560200002700805704000027008058000000270080590100012700805a0400012700805b0400022700805c0200042700805d0000062700805e0200082700805f04000827008060000008270080610000142700806200001b270080630200202700806404002027008065020080252400001fb228020002005189a4170a380102032602040400260206040300380406052c0801020010010501260302040100280202052c0e040500280502052c0e0405260205040300380205042c0d020400280402042c0e0402230200030000026822000002aa26020304042c08000400100003002400001fdb2c0400002c0d020300280302032c0e030200280202052c0d0504260206040200380506033a0d0003000422000002aa28020003007a81a21e0a38010304260203040623020004000002ca22000008062c08010526020604040010010601260305040100280502061f24805a805300062c0d050600280602062c0e06052c08010600000102012c0e05062c08010500000102012d0a8057000526020804092c0800092c0c060a2c0c050b2d08805d000c00100008002400001ffd2c0400002c0c0a07260209040a2c08000a2c0c060b2c0c050c2d08805d000d00100009002400001ffd2c0400002c0c0b0826020a040b2c08000b2c0c060c2c0c050d0010000a0024000020d52c0400002c0c0c090028090206012800068057000a2c0d0a051c0c0506002b02000900000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e3806090a2302000a000003d5240000214e2c08010626020904030010010901260306040100280602092c0c090a2c0e070a00280a020a2c0e080a2c08010726020804070010010801260307040100280702082c0c08092d0a8058000900280902092d0a8058000900280902092d0a8058000900280902092d0a8058000900280902092d0a8058000900280902092d0a805800092c08010800000102012c0e07082c080107260209040a0010010901260307040100280702092c0c090a2d0a8058000a00280a020a2d0a8058000a00280a020a2d0a8059000a00280a020a2d0a8058000a00280a020a2d0a8058000a00280a020a2d0a8059000a00280a020a2d0a8058000a00280a020a2d0a8058000a00280a020a2d0a8059000a2c08010900000102012c0e07092b02000700054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde4022b02000a00209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac1262b02000b00083e7911d835097629f0067531fc15cafd79a89beecb39903f69572c636f4a5a2b02000c001a7f5efaad7f315c25a918f30cc8d7333fccab7ad7c90f14de81bcc528f9935d2c08010d26020e04070010010e0126030d040100280d020e2c0c0e0f2c0e0b0f00280f020f2c0e0c0f00280f020f2d0a8055000f00280f020f2c0e070f00280f020f2c0e0a0f00280f020f2d0a8055000f2d088057000422000005db0d280004805b00072302000700001d3e22000005f02c0d0804260206000226020a04060d308050000a000b2302000b0000061324000021602d04000480032700800404000724000021722d0880050007002807020a0128000a8050000b2c0e060b26020604060d3080430006000a2302000a0000065624000021602d04000780032700800404000724000021722d08800500040028040206012800068043000a2d0a8058000a2c0e04082c0d09062b020007002df8b940e5890e4e1377e05373fae69a1d754f6935e6a780b666947431f2cdcd26020a04090c38030a0b2302000b000006c524000021602d04000680032700800404000a24000021722d0880050008002808020a00380a030b2c0e070b26020604072b020007002ecd88d15967bc53b885912e0d16866154acb6aac2d3f85e27ca7eefb2c1908326020b04090c38060b0c2302000c0000072c24000021602d04000880032700800404000a24000021722d088005000a00280a020b00380b060c2c0e070c26020704090d30805f00070008230200080000076c24000021602d04000a80032700800404000a24000021722d0880050006002806020701280007805f00082d0a805500082c0e06092c08010726020804040010010801260307040100280602082602090409002804020a26020b0406002807020c42f70008000a000c0009002807020601280006805700082c0d0804370c0005000400280202062c0d0605260207040200380607043a0d000400052200000806280200040032b6bd200a38010405230200050000082122000009322c08010426020504030010010501260304040100280402051f24805a805b00052c0d040500280502052c0e05042c08010500000102012c0e04052c08010400000102012d0a8057000426020704082c0800082c0c05092c0c040a001000070024000022002c0400002c0c0906002806020801280008805700092c0d090726020804092c0800092c0c050a2c0c040b001000080024000022002c0400002c0c0a06002806020501280005805700082c0d08041c0c0405002b02000600000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e38050608230200080000090e240000214e370c0004000700280202062c0d0605260207040200380607043a0d00040005220000093228020004008a4870ec0a38010405230200050000094d22000009e12c08010426020504020010010501260304040100280402051f24805a805a00052c0d040500280502052c0e05042c08010500000102012c0e04052c08010400000102012d0a8057000426020704082c0800082c0c05092c0c040a2d08805d000b001000070024000022792c0400002c0c09063302000600280202062c0d0605260207040200380607043a0d0004000522000009e12802000400cd8c9a7a0a3801040523020005000009fc2200000b062c08010426020504020010010501260304040100280402051f24805a805a00052c0d040500280502052c0e05042c08010500000102012c0e04052c08010400000102012d0a8057000426020704082c0800082c0c05092c0c040a001000070024000023512c0400002c0c090626020504072c0800072c0c0608001000050024000023ca2c0400002c0c08041e020005060a380504062302000600000aa226020704003b0901071c0c0405002602060401260208040300380608072c0801040010010701260304040100280402072c0e060700280702072c0e0607260207040300380407062c0c06072c0e050700280402072c0d0706260208040200380708053a0d000500062200000b062802000400f99f5a2d0a380104052602040277260206026f26020702652602080272260209026c2302000500000b3a2200000e2b2c08010a26020b04020010010b0126030a040100280a020b1f24805a805a000b2c0d0a0b00280b020b2c0e0b0a2c08010b00000102012c0e0a0b2c08010a00000102012d0a8057000a26020d040e2c08000e2c0c0b0f2c0c0a102d08805d00110010000d0024000022792c0400002c0c0f0c26020b040126020e040300380b0e0d2c08010a0010010d0126030a040100280a020d2c0e0b0d00280d020d2c0e0b0d26020d040300380a0d0b2c0c0b0d2c0e0c0d00280a020d2c0d0d0c26020e040200380d0e0b360d000b000c26020a000a26020b001e26020d040326020f040300380d0f0e2c08010c0010010e0126030c040100280c020e2c0e0d0e00280e020e2c0e0d0e26020e040300380c0e0d2c0c0d0e2c0e0a0e00280e020e2d0a8061000e00280e020e2c0e0b0e00280c020d2c0d0d0b26020e040200380d0e0a360d000a000b26020a022126020b026426020c024826020d022c2c08010e26020f040e0010010f0126030e040100280e020f2c0c0f102c0e0c1000281002102c0e071000281002102c0e091000281002102c0e091000281002102c0e061000281002102c0e0d1000281002102d0a8063001000281002102c0e041000281002102c0e061000281002102c0e081000281002102c0e091000281002102c0e0b1000281002102c0e0a102c08010a26020b040e0010010b0126030a040100280a020b26020c040d00380c0b0c2c0c0b0d0c380d0c0f160c0f0f2302000f00000d672d0a8058000d00280d020d2200000d462c08010b00000102012c0e0a0b26020a040d2d08805700052200000d840c38050a0c2302000c00001cbe2200000d962c0d0b0526020d040d06280d020b26020f040300380d0f0e2c08010c0010010e0126030c040100280c020e2c0e0d0e00280e020e2c0e0d0e26020f040300380c0f0e002805020f2d04000f80032d04000e80042d04000d800524000023f400280c020e2c0d0e0d26020f040200380e0f05360d0005000d002802020c2c0d0c0a26020d040200380c0d053a0d0005000a2200000e2b280200050097b974f70a3801050a2302000a00000e4622000016ae2c08010a26020b04070010010b0126030a040100280a020b1f34805a0003000b2c0d0a0b00280b020b2c0e0b0a2c08010b00000102012c0e0a0b2c08010a00000102012d0a8057000a26020d040e2c08000e2c0c0b0f2c0c0a100010000d00240000243a2c0400002c0c0f0c00280c020e0128000e8057000f2c0d0f0d2c0d0b0c2c0d0a0e26021004060c380e10112302001100000ee2240000216000280c02100038100e112c0d110f0128000e805a00100e380e10112302001100000f0a24000024b326021204060c381012132302001300000f21240000216000280c021200381210132c0d13110128000e805b00100e380e10122302001200000f4924000024b32c0e0c0b2c0e100a1c0c0f0e051c0c0e0c001c0c110f051c0c0f0e0026021004112c0800112c0c0b122c0c0a132d08805d0014001000100024000024c52c0400002c0c120f26021104122c0800122c0c0b132c0c0a142d08805d0015001000110024000024c52c0400002c0c131026021204132c0800132c0c0b142c0c0a150010001200240000243a2c0400002c0c1411002811020b0128000b805700122c0d120a1c0c0a0b002b02001100000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e380b11122302001200001027240000214e2c08010b00000102012d0a8055000b2c08011100000102012d0a805800112c080112000001020126021300802c0e13122c080113000001020126021504162c0800162c0c0d170010001500240000259d2c0400002c0c17142c0d140d00280d020d2c0e0d140528000e8044000d00380c0d0e26020d04152c0800152c0c0e160010000d00240000259d2c0400002c0c160c2c0d0c0d00280d020d2c0e0d0c26020d02bc26020e026a260215029b26021602d32c08011726021804450010011801260317040100281702182c0c18192c0e0d1900281902192c0e0e1900281902192c0e151900281902192c0e161900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a8056001900281902192d0a805600192c0e171326020d04242d088057000522000013e80d2800058064000e2302000e00001bd422000013fd2c0d130d2d09804e000e00280e020e2d06000e804e26020e044426021504162c0800162c0c0d172c0c0e182d0880570019001000150024000025e32c0400002c0c17132c0c18142c0d131500281502152c0e15132c08011526021604090010011601260315040100281302160120804e0002001700281502183f3f0018001700162c0d151300281302132c0e131526021704182c0800182c0c0d192c0c0e1a2d08804f001b001000170024000025e32c0400002c0c19132c0c1a162c0d130d00280d020d2c0e0d13072800168050000d26021804100c380d181923020019000014e4240000216000281302180038180d192c0d1917260219041a2c08001a2c0c171b2c0c161c2d088065001d001000190024000028ba2c0400002c0c1b1826021904100c380d191a2302001a0000153224000021602d04001380032700800404001124000021722d088005001700281702190038190d1a2c0e181a0d2800168051000d2302000d000015a6220000156d2c08010d2602130409001001130126030d04010028170213002815021400280d02163f3f0016001400132c0c0d052d088057000c22000015cd01280016805a000d0e38160d1323020013000015c024000024b32c0c15052c0c0d0c22000015cd2c0d050d00280d020d2c0e0d0526021304182c0800182c0c17192c0c0c1a2c0c0e1b00100013002400002a3f2c0400002c0c190d2c0d0d0c00280c020c2c0e0c0d26020e04132c0800132c0c0d142c0c05150010000e002400002e922c0400002c0c140c2c0d0c0500280502052c0e050c26020d04132c0800132c0c0c140010000d0024000030892c0400002c0c140526020c04132c0800132c0c0b142c0c11152c0c12162c0c05172c0c0f182c0c0a192c0c101a0010000c0024000031e02c040000002802020b2c0d0b0a26020c040200380b0c053a0d0005000a22000016ae28020005009756f6200a3801050a2302000a000016c9220000187e2c08010526020a04050010010a012603050401002805020a1f24805a8050000a2c0d050a00280a020a2c0e0a052c08010a00000102012c0e050a2c08010500000102012d0a8057000526020c040d2c08000d2c0c0a0e2c0c050f2d08805d00100010000c002400003c8f2c0400002c0c0e0b26020d040e2c08000e2c0c0a0f2c0c05102d08805d00110010000d002400003c8f2c0400002c0c0f0c26020e040f2c08000f2c0c0a102c0c05110010000e002400003d672c0400002c0c100d00280d020f0128000f805700102c0d100e1c0c0e0d002b02000f00000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e380d0f1023020010000017d4240000214e26020f04102c0800102c0c0a112c0c05122d08805d00130010000f002400003c8f2c0400002c0c110d2c08010500000102012d0a805500052c08010a00000102012d0a8058000a2c08010f0000010201260210004c2c0e100f26021004112c0800112c0c05122c0c0a132c0c0f142c0c0b152c0c0c162c0c0e172c0c0d18001000100024000031e02c040000002802020b2c0d0b0a26020c040200380b0c053a0d0005000a220000187e2802000500eb2b616b0a3801050a2302000a000018992200001a992c08010126020504070010010501260301040100280102051f34805a000300052c0d010300280302032c0e03012c08010300000102012c0e01032c08010100000102012d0a8057000126020a040b2c08000b2c0c030c2c0c010d2d08805d000e0010000a0024000024c52c0400002c0c0c0526020b040c2c08000c2c0c030d2c0c010e2d08805d000f0010000b0024000024c52c0400002c0c0d0a26020c040d2c08000d2c0c030e2c0c010f2d08805d00100010000c0024000024c52c0400002c0c0e0b26020d040e2c08000e2c0c030f2c0c01100010000d00240000243a2c0400002c0c0f0c26020e040f2c08000f2c0c0c100010000e0024000023ca2c0400002c0c100d26020e040f2c08000f2c0c03102c0c01112d08805d00120010000e0024000024c52c0400002c0c100c26020f04102c0800102c0c03112c0c01122d08805d00130010000f0024000024c52c0400002c0c110e1e020001030a380105032302000300001a082400003de01e020001040a38010a032302000300001a1f2400003df21e020001050a38010b032302000300001a362400003e041e020001060a38010d032302000300001a4d2400003e161e020001080a38010c032302000300001a642400003e281e020001070a38010e032302000300001a7b2400003e3a00280202052c0d050326020a04020038050a013a0d000100032200001a9926020102732602020255260203026e260205027426020a026326020b026b2c08010c26020d04110010010d0126030c040100280c020d2c0c0d0e2c0e020e00280e020e2c0e030e00280e020e2c0e0b0e00280e020e2c0e030e00280e020e2c0e060e00280e020e2c0e040e00280e020e2c0e030e00280e020e2d0a8063000e00280e020e2c0e010e00280e020e2c0e070e00280e020e2c0e090e00280e020e2c0e070e00280e020e2c0e0a0e00280e020e2c0e050e00280e020e2c0e060e00280e020e2c0e080e0b208055805900012302000100001bd326020204122c080103260204041200100104012c0c03042903000405e58f985907316290002804020400280c020526020604102d04000580032d04000480042d040006800524000023f4260205041000380405042d0a8057000400280402043b0d0302252c0d130e012800058050001526021704200c380517182302001800001bf72400002160002814021700381705182c0d181626021804440c381518192302001900001c1c24000021602d04000e80032700800404004524000021722d0880050017002817021800381815192c0e16190038050d0e26021604200c380516182302001800001c5e240000216000280c021600381605182c0d181526021804440c380e18192302001900001c8324000021602d04001780032700800404004524000021722d088005001600281602180038180e192c0e15192c0e161301280005805a000e2c0c0e0522000013e82c0d0b0c26020f040d0c38050f102302001000001cd9240000216000280e020f00380f05102c0d100d1c0c0d0f00260210040d0c380510112302001100001d0324000021602d04000c80032700800404000e24000021722d088005000d00280d021000381005112c0e0f112c0e0d0b01280005805a000c2c0c0c052200000d842c0d080726020b04020c38040b0c2302000c00001d592400002160002806020b00380b040c2c0d0c0a1c0c0a0c051c0c0c0b0002380a0b0c0928000c8044000e1c0c0e0f051c0c0f0c0002380e0c0f0928000f8044000e0528000c8044000f00380f0b0c05308045000e000b00380c0b0f0a380a0f0b2302000b00001dc526021004003b09011005280004805b000a26020f04060c380a0f102302001000001de424000021602d04000780032700800404000724000021722d088005000b00280b020f00380f0a102c0e0c100128000a805a000726020c04060c38070c0f2302000f00001e2924000021602d04000b80032700800404000724000021722d088005000a00280a020c00380c070f2c0e0e0f2c0e0a082c0d0907052800048053000a26020c04060c380a0c0e2302000e00001e76240000216000280d020c00380c0a0e2c0d0e0b0128000a805a000c26020f04060c380c0f102302001000001ea3240000216000280d020f00380f0c102c0d100e0128000a805b000f26021104060c380f11122302001200001ed0240000216000280d02110038110f122c0d121026021104090c380a11122302001200001ef524000021602d04000780032700800404000a24000021722d088005000f00280f02110038110a122c0e0b1226020a04090c380c0a0b2302000b00001f3224000021602d04000f80032700800404000a24000021722d0880050007002807020a00380a0c0b2c0e0e0b0128000c805a000a26020c04090c380a0c0e2302000e00001f7724000021602d04000780032700800404000a24000021722d088005000b00280b020c00380c0a0e2c0e100e2c0e0b0901280004805a00072c0c070422000005db270080040478000d000000800480032300800300001fda2901000105f7a1f3afa5add4ca3b010102252400001fb21e020001011e020002000a380102032302000300001ffc2400003e4c252400001fb226020604072c0800072c0c01082c0c0209001000060024000020d52c0400002c0c08050b280003805d0001002805020601280006805700072c0d070223020001000020c7220000204b0b28000380600001230200010000208222000020600b28000380620001230200010000207926020504003b0901052c0c020422000020d01c0c0201002b02000300000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e3801030523020005000020be240000214e2c0c020422000020d02c0c020422000020d02c0c0401252400001fb22c0d01032c0d020426020604030c3804060723020007000020f92400002160002803020600380604072c0d07052c08010626020704020010010701260306040100280602072c0c07082c0e050801280004805a00050e38040507230200070000214124000024b32c0e03012c0e05022c0c06012529010001055a02e41bb51ea99f3b010102252901000105e89d09fea1112d0e3b010102252d01800380060b00800600028007230080070000218d22000021982d008003800522000021ff2d0000018005010000018004000101008003800480092d008003800a2d008005800b0b00800a8009800c2300800c000021eb2d01800a80082d028008800b0100800a0002800a0100800b0002800b22000021ba27018005040001030080060002800622000021ff252400001fb22c0d01032c0d020426020604020c3804060723020007000022242400002160002803020600380604072c0d07052c08010626020704020010010701260306040100280602072c0c07082c0e050801280004805a00050e38040507230200070000226c24000024b32c0e03012c0e05022c0c0601252400001fb226020604072c0800072c0c01082c0c0209001000060024000023512c0400002c0c08050b280003805d0001002805020601280006805700072c0d0702230200010000234322000022c70b2800038060000123020001000022fe22000022dc0b2800038062000123020001000022f526020504003b0901052c0c0204220000234c1c0c0201002b02000300000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e38010305230200050000233a240000214e2c0c0204220000234c2c0c0204220000234c2c0c0401252400001fb22c0d01032c0d020426020604010c3804060723020007000023752400002160002803020600380604072c0d07052c08010626020704020010010701260306040100280602072c0c07082c0e050801280004805a00050e3804050723020007000023bd24000024b32c0e03012c0e05022c0c0601252400001fb2002801020301280003805700042c0d04021c0c0203051c0c0301001c0c0102052c0c02012501008003800580072d00800380082d00800480090b0080088007800a2300800a000024392d01800880062d0280068009010080080002800801008009000280092200002408252400001fb22c0d01032c0d020426020604060c38040607230200070000245e2400002160002803020600380604072c0d07052c08010626020704020010010701260306040100280602072c0c07082c0e050801280004805a00050e3804050723020007000024a624000024b32c0e03012c0e05022c0c060125290100010545a7ca711941e4153b010102252400001fb226020604072c0800072c0c01082c0c02090010000600240000243a2c0400002c0c08050b280003805d0001002805020601280006805700072c0d0702230200010000258f22000025130b28000380600001230200010000254a22000025280b28000380620001230200010000254126020504003b0901052c0c020422000025981c0c0201002b02000300000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e380103052302000500002586240000214e2c0c020422000025982c0c020422000025982c0c0401252400001fb226020301002c080102260204042100100104012603020401002802020426020504204303b0000180540005000300042c0d020100280102012c0e01022c0c0201252400001fb22c0801052602060411001001060126030504010028050206260207041000380706072c0c06080c38080709160c0909230200090000262f2d0a805700080028080208220000260e2c08010600000102012c0e05060c3802030523020005000026ae220000264e01280003804f00070e38030708230200080000266824000024b30c380207082302000800002685220000267a2d08804f000522000026a502380203070e38030208230200080000269c2400003e5e2c0c070522000026a52c0c050422000026b92d088057000422000026b907280004805000022c08010500000102012c0e020526020804040638040809043809080a0238040a070b28000780570008230200080000271a22000026f701280002805a00070e38020708230200080000271124000024b32c0e0705220000271a2c0d05072d088057000222000027290c380207052302000500002744220000273b2c0d06012c0c0402252c08010800000102012d0a805700082d0880570005220000275e0d2800058050000923020009000027cd22000027732c0d06052c0d080926020a04100c38020a0b2302000b0000279224000021602d04000580032700800404001124000021722d0880050008002808020a00380a020b2c0e090b01280002805a00052c0e08062c0c05022200002729052800028050000a26020c04000b28000c8050000b2302000b000028040728000a8050000e0a380e020d2302000d000028042400003e7000380a050b0e380a0b0c2302000c0000281b24000024b30c380b040a2302000a00002838220000282d2d0880560009220000287d0038030b0a0e38030a0c2302000c0000284f24000024b326020c04440c380a0c0d2302000d000028662400002160002801020c00380c0a0d2c0d0d0b2c0c0b09220000287d2c0d080a1928000a805e000b1c0c090a0400380b0a090e380b090c2302000c000028a524000024b32c0e090801280005805a00092c0c0905220000275e2400001fb2260206040406380206070438070608023802080503308050000500020f2800058050000623020006000028f02400003e5e1c0c0207021c0c0706041c0c0602020530805e0002000626020802000a380802072302000700002933063806020a0b28000a805e000923020009000029332400003e701a380106070d280002805c00012302000100002958220000294d2d0880570004220000297b18380706010d2800068063000223020002000029722400003e822c0c0104220000297b1c0c03020403308053000500030f28000580530006230200060000299d2400003e5e1c0c0306021c0c0605041c0c0503020d280003805c000523020005000029cc22000029c12d08805700012200002a230530805e0003000526020702000a380703062302000600002a0006380503090b280009805e00082302000800002a002400003e7018380205030d280005806300022302000200002a1a2400003e822c0c03012200002a2300380401020e380402032302000300002a3a24000024b32c0c0201252400001fb22c0d010400280402042c0e04012c08010400000102012c0e01042c08010500000102012c0e020526020704040638020708043808070902380209060b280006805700072302000700002bca2200002a94072800028050000803308050000600090f2800068050000a2302000a00002ab92400003e5e26020a04100c38080a0b2302000b00002ad02400002160002801020a00380a080b2c0d0b061c0c090b021c0c0b0a041c0c0a0b020530805e000b000a26020d02000a380d0b0c2302000c00002b2106380a0b0f0b28000f805e000e2302000e00002b212400003e701a38060a0c0d28000b805c00062302000600002b462200002b3b2d08805700072200002b6918380c0a060d28000a8063000b2302000b00002b602400003e822c0c06072200002b6926020a04100c38080a0b2302000b00002b8024000021602d04000180032700800404001124000021722d0880050006002806020a00380a080b2c0e070b2c0e060400380209010e380201062302000600002bc124000024b32c0e01052200002bca2c0d050207280002805000052c0c05012200002bdf0d280001805200022302000200002e3a2200002bf40530805f0003000226020604000a380603052302000500002c2806380203080b280008805f00072302000700002c282400003e701c0c02030026020501002c080102260206040900100106012603020401002802020626020704084303b0000380540007000500062d08805700012200002c670d280001805b00032302000300002c812200002c7c2c0d04012505280001805000032c0d0405013080520001000626020804080c380308092302000900002cac2400002160002802020800380803092c0d090701280003805a00080e380308092302000900002cd424000024b326020a04080c38080a0b2302000b00002ceb2400002160002802020a00380a080b2c0d0b0901280003805b00080e3803080a2302000a00002d1324000024b326020b04080c38080b0c2302000c00002d2a2400002160002802020b00380b080c2c0d0c0a01280003805300080e3803080b2302000b00002d5224000024b326020b04080c38080b0c2302000c00002d692400002160002802020b00380b080c2c0d0c031c0c07080419280008805e00071c0c09080400380708090e3807090b2302000b00002da024000024b319280009805e00071c0c0a080400380708090e3807090a2302000a00002dc424000024b319280009805e00071c0c03080400380708030e380703092302000900002de824000024b326020804100c380608092302000900002dff24000021602d04000580032700800404001124000021722d0880050007002807020800380806092c0e03092c0e070401280001805a00032c0c03012200002c672c0d040226020604100c380106072302000700002e5524000021602d04000280032700800404001124000021722d0880050005002805020600380601072d0a8057000701280001805a00022c0e05042c0c02012200002bdf2400001fb22c0d020400280402042c0e04022c08010400000102012c0801052602060421001001060126030504010028050206260207042000380706072c0c06080c38080709160c09092302000900002ef42d0a8056000800280802082200002ed32c08010600000102012c0e05062c0801052602070409001001070126030504010028010207002802020800280502093f3f0009000800072c0d050100280102012c0e01052c0e05042d08805700032200002f470d280003805f00012302000100002f612200002f5c2c0d0601252c0d040226020704080c380307082302000800002f7c2400002160002802020700380703082c0d08051c0c05020026020701002c080105260208040500100108012603050401002805020826020904044303b00002805400090007000805308050000300022d08805700012200002fd10d280001805000072302000700002ff72200002fe601280003805a00012c0c01032200002f472c0d060700380201080e38020809230200090000301224000024b326020a04040c38010a0b2302000b000030292400002160002805020a00380a010b2c0d0b0926020b04200c38080b0c2302000c0000304e24000021602d04000780032700800404002124000021722d088005000a00280a020b00380b080c2c0e090c2c0e0a0601280001805a00072c0c07012200002fd12400001fb22c080103000001020126020400012c0e04032c08010400000102012d0a805800042c08010500000102012d0a80580005260206041e260207040f270200080001002d088057000222000030da0c38020709230200090000312822000030ec2c0d0502002801020800380807092c0d09061c0c0601002c0d0306043801060300380203012c0e01052c0d0402043802060300380103022c0c0201252c0d0509023806020a26020c04200c380a0c0d2302000d000031482400002160002801020c00380c0a0d2c0d0d0b1c0c0b0a002c0d030b04380a0b0c0038090c0a2c0e0a0504380b08092c0e09032c0d040a033080520002000b0f2800028052000c2302000c000031972400003e5e26020d04200c380b0d0e2302000e000031ae2400002160002801020d00380d0b0e2c0d0e0c1c0c0c0b0004380b090c00380a0c092c0e090401280002805a00092c0c090222000030da2400001fb22c08010926020a04030010010a012603090401002809020a2c0c0a0b2d0a8061000b00280b020b2c0e050b2a02000a000000000000000002000000000000000026020f04102c0800102c0c0a110010000f002400003e942c0400002c0c110b2c0c120c2c0c130d2c0c140e2c0d0b0a00280a020a2c0e0a0b2c08010a00000102012c0e0b0a2c0d0c0b00280b020b2c0e0b0c2c08010b00000102012c0e0c0b2c08010c00000102012c0e0d0c2c08010d00000102012c0e0e0d2d088057000822000032a90d280008805b00012302000100003c1c22000032be260203040e2c08000e2c0c0a0f2c0c0b102c0c0c112c0c0d1200100003002400003f342c0400002c0c0f021e020003031e020008001e020009042c08010a26020b04e10010010b0126030a040100280a020b26020c04e000380c0b0c2c0c0b0d0c380d0c0e160c0e0e2302000e0000333f2d0a8056000d00280d020d220000331e2c08010b00000102012c0e0a0b26020c040d2c08000d2c0c060e0010000c00240000259d2c0400002c0c0e0a2c0d0a0600280602062c0e060a26020c040d2c08000d2c0c030e0010000c00240000259d2c0400002c0c0e062c0d060300280302032c0e030626020c040d2c08000d2c0c080e0010000c00240000259d2c0400002c0c0e032c0d030800280802082c0e080326020c040d2c08000d2c0c090e0010000c00240000259d2c0400002c0c0e082c0d080900280902092c0e090826020c040d2c08000d2c0c040e0010000c00240000259d2c0400002c0c0e092c0d090400280402042c0e040926020c040d2c08000d2c0c020e0010000c00240000259d2c0400002c0c0e042c0d040200280202022c0e020426020c040d2c08000d2c0c070e0010000c00240000259d2c0400002c0c0e022c0d020c00280c020c2c0e0c0226020c048026020d04c026020e046026020f04a02d0880570001220000349f0d28000180640010230200100000393122000034b42c0d0b022d09804e000300280302032d060003804e2c08010300000102012d0a804e000326020404e02d088057000122000034e80d2800018053000623020006000038a122000034fd26020a040e2c08000e2c0c020f2c0c04102c0c0d110010000a002400003fad2c0400002c0c0f082c0c10092c0d080200280202022c0e0208072800098050000226020b04100c38020b0c2302000c000035542400002160002808020b00380b020c2c0d0c0a26020c040d2c08000d2c0c0a0e2c0c090f2d08806500100010000c0024000028ba2c0400002c0c0e0b26020c04100c38020c0d2302000d000035a224000021602d04000880032700800404001124000021722d088005000a00280a020c00380c020d2c0e0b0d0d28000980510002230200020000361a22000035dd2c0d03022c08010326020804090010010801260303040100280a02080028020209002803020b3f3f000b000900082c0c03012d088057000622000036452c0d030201280009805a00030e38090308230200080000363824000024b32c0c02012c0c030622000036452c0d010300280302032c0e0301260208040b2c08000b2c0c0a0c2c0c060d2c0c040e00100008002400002a3f2c0400002c0c0c032c0d030400280402042c0e040326020604082c0800082c0c03092c0c010a00100006002400002e922c0400002c0c09042c0d040100280102012c0e010426020304082c0800082c0c0409001000030024000030892c0400002c0c090126020300052c08010426020604040010010601260304040100280402062c0c06082c0e030800280802082c0e010800280802082c0e05082c0d040300280302032c0e03042a020003000000000000000003000000000000000026020a040b2c08000b2c0c030c0010000a002400003e942c0400002c0c0c052c0c0d062c0c0e082c0c0f092c0d050300280302032c0e03052c08010300000102012c0e05032c0d060500280502052c0e05062c08010500000102012c0e06052c08010600000102012c0e08062c08010800000102012c0e09082d088057000222000037b20d28000280530009230200090000382e22000037c726020404092c0800092c0c030a2c0c050b2c0c060c2c0c080d00100004002400003f342c0400002c0c0a021e0200030032380002000300040b28000480550003230200030000381424000042843438000100070003230200030000382924000042963302000225230200090000383b220000389026020a04030c38020a0b2302000b000038522400002160002804020a00380a020b2c0d0b0926020a040b2c08000b2c0c030c2c0c050d2c0c060e2c0c080f2c0c09100010000a0024000042a82c040000220000389001280002805a00092c0c090222000037b20530804f0001000626020a040e2c08000e2c0c020f2c0c04102c0c06110010000a002400003fad2c0400002c0c0f082c0c10092c0d080600280602062c0e06082c0d03062c08010a26020b04090010010b0126030a0401002808020b002806020c00280a020e3f3f000e000c000b2c0d0a0600280602062c0e060a2c0e0a0301280001805a00062c0c060122000034e82c0d0b1026021204200c38011213230200130000394c240000216000280a021200381201132c0d131126021304e00c38011314230200140000397124000021602d0400108003270080040400e124000021722d0880050012002812021300381301142c0e1114012800018064001026021304200c3801131423020014000039b62400002160002806021300381301142c0d141126021404e00c3810141523020015000039db24000021602d0400128003270080040400e124000021722d0880050013002813021400381410152c0e111501280001804f001026021204200c380112142302001400003a202400002160002803021200381201142c0d141126021404e00c381014152302001500003a4524000021602d0400138003270080040400e124000021722d0880050012002812021400381410152c0e11150038010e1026021304200c380113142302001400003a872400002160002808021300381301142c0d141126021404e00c381014152302001500003aac24000021602d0400128003270080040400e124000021722d0880050013002813021400381410152c0e11150038010c1026021204200c380112142302001400003aee2400002160002809021200381201142c0d141126021404e00c381014152302001500003b1324000021602d0400138003270080040400e124000021722d0880050012002812021400381410152c0e11150038010f1026021304200c380113142302001400003b552400002160002804021300381301142c0d141126021404e00c381014152302001500003b7a24000021602d0400128003270080040400e124000021722d0880050013002813021400381410152c0e11150038010d1026021204200c380112142302001400003bbc2400002160002802021200381201142c0d141126021404e00c381014152302001500003be124000021602d0400138003270080040400e124000021722d0880050012002812021400381410152c0e11152c0e120b01280001805a00102c0c1001220000349f2302000100003c292200003c7e26020204020c380802032302000300003c402400002160002809020200380208032c0d0301260202040e2c08000e2c0c0a0f2c0c0b102c0c0c112c0c0d122c0c0113001000020024000042a82c0400002200003c7e01280008805a00012c0c010822000032a92400001fb226020604072c0800072c0c01082c0c020900100006002400003d672c0400002c0c08050b280003805d0001002805020601280006805700072c0d07022302000100003d592200003cdd0b280003806000012302000100003d142200003cf20b280003806200012302000100003d0b26020504003b0901052c0c02042200003d621c0c0201002b02000300000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0e380103052302000500003d50240000214e2c0c02042200003d622c0c02042200003d622c0c0401252400001fb22c0d01032c0d020426020604040c380406072302000700003d8b2400002160002803020600380604072c0d07052c08010626020704020010010701260306040100280602072c0c07082c0e050801280004805a00050e380405072302000700003dd324000024b32c0e03012c0e05022c0c0601252901000105be11c73bbb04a4fc3b0101022529010001057425c86e086b03c13b010102252901000105e3b1cb17b4b196ae3b010102252901000105203960faa7b733883b01010225290100010597178cf85aace5563b0101022529010001053b7ee0a2f674688e3b01010225290100010565a49ce5d4594d753b010102252901000105288692b047dcfd433b010102252901000105646188a8c6cf94cb3b010102252901000105c96f933b139de9163b010102252400001fb22c08010226020304040010010301260302040100280202032c0c03042d0a8058000400280402042d0a8058000400280402042d0a805800042c0d020300280302032c0e03022c08010326020404050010010401260303040100280302042c0c04052d0a8058000500280502052d0a8058000500280502052d0a8058000500280502052c0e01052d08805500042c0c02012c0c03022d0880570003252400001fb22c0d04050b280005805500062302000600003f5626020704003b09010726020504062c0800062c0c01072c0c02082c0c03092c0c040a001000050024000043d32c0400002c0d01052c0d02062c0d03072c0e05012c0e06022c0e07032d0a80590004002806020201280002805700032c0d0301252400001fb22c0801052602060411001001060126030504010028050206260207041000380706072c0c06080c38080709160c09092302000900003ff92d0a8057000800280802082200003fd82c08010600000102012c0e05060c380203052302000500004078220000401801280003804f00070e38030708230200080000403224000024b30c38020708230200080000404f22000040442d08804f0005220000406f02380203070e3803020823020008000040662400003e5e2c0c0705220000406f2c0c050422000040832d0880570004220000408307280004805000022c08010500000102012c0e020526020804040638040809043809080a0238040a070b2800078057000823020008000040e422000040c101280002805a00070e3802070823020008000040db24000024b32c0e070522000040e42c0d05072d088057000222000040f30c38020705230200050000410e22000041052c0d06012c0c0402252c08010800000102012d0a805700082d088057000522000041280d280005805000092302000900004197220000413d2c0d06052c0d080926020a04100c38020a0b2302000b0000415c24000021602d04000580032700800404001124000021722d0880050008002808020a00380a020b2c0e090b01280002805a00052c0e08062c0c050222000040f3052800028050000a26020c04000b28000c8050000b2302000b000041ce0728000a8050000e0a380e020d2302000d000041ce2400003e7000380a050b0e380a0b0c2302000c000041e524000024b30c380b040a2302000a0000420222000041f72d088056000922000042470038030b0a0e38030a0c2302000c0000421924000024b326020c04e00c380a0c0d2302000d000042302400002160002801020c00380c0a0d2c0d0d0b2c0c0b0922000042472c0d080a1928000a805e000b1c0c090a0400380b0a090e380b090c2302000c0000426f24000024b32c0e090801280005805a00092c0c09052200004128290100010561be47556b1380913b010102252901000105b87a3944b3b13c563b010102252400001fb22c0d03062c0d04070b2800078055000823020008000042ce26020904003b0901090b28000680530007230200070000435f22000042e32c0d01062c0d02072c0d03082c0d040926020b04030c38080b0c2302000c0000430a24000021602d04000680032700800404000424000021722d088005000a00280a020b00380b080c2c0e050c01280008805a00050e38080506230200060000434a24000024b32c0e0a012c0e07022c0e05032c0e090422000043d226020604072c0800072c0c01082c0c02092c0c030a2c0c040b001000060024000043d32c0400002c0d01062c0d02072c0d04082d04000680032700800404000424000021722d0880050009002809020a0128000a8057000b2c0e050b2c0e09012c0e07022d0a805a00032c0e080422000043d2252400001fb22d088057000522000043e30d28000580530006230200060000444e22000043f82c0d01052c0d02062c0d03072c0d04082c08010926020a04050010010a012603090401002806020a26020b0404002809020c3e0f000a000c2c0d090600280602062c0e06092c0e05012c0e09022c0e07032c0e0804252c0d03060c3805060701280005805a0006230200070000446c220000451d2c0d01072c0d02082c0d03092c0d040a26020c04040c38050c0d2302000d000044932400002160002808020c00380c050d2c0d0d0b26020d04030c38050d0e2302000e000044b82400002160002807020d00380d050e2c0d0e0c00380b0c0d26020c04040c38050c0e2302000e000044e224000021602d04000880032700800404000524000021722d088005000b00280b020c00380c050e2c0e0d0e2c0e07012c0e0b022c0e09032c0e0a04220000451d2c0c060522000043e32d0018ca18ca>, + "privateFunctionsRoot": Fr<0x2e48f56e2f89ae8cad557d2375c4bb45e7061689f591280b2038108dda8067ad>, + "version": 1, +} +`; diff --git a/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/private_function_broadcasted_event.test.ts.snap b/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/private_function_broadcasted_event.test.ts.snap index 087e37bfe5ca..c7644bfa160b 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/private_function_broadcasted_event.test.ts.snap +++ b/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/private_function_broadcasted_event.test.ts.snap @@ -4,28 +4,28 @@ exports[`PrivateFunctionBroadcastedEvent parses an event as emitted by the Contr PrivateFunctionBroadcastedEvent { "artifactFunctionTreeLeafIndex": 5, "artifactFunctionTreeSiblingPath": [ - Fr<0x0aa8c40de16e14b1d7789457012932df51eab8d07d3506a2bf3c0dd0d03cab15>, + Fr<0x1fc7418174246337dbc421413553f3870957829e976a6651f2f07ea092d8e9bf>, Fr<0x03b075046b71ff5f8e0792de4b82ddc979fcb3b8c03abe12972e65c57759fb46>, - Fr<0x1d1c34ad4b418b30c4c8b87939b97bc03d94d24d469d3cb2f419ffe6bd93f96c>, + Fr<0x24b0baef5786684223885b4aee14327729edb03f2b1e3569f1644a7c25734ff5>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, ], - "artifactMetadataHash": Fr<0x16ad977a85a570bedc6785d159f137035d3bf9891042ee3af20488686aec168b>, - "contractClassId": Fr<0x23ced3716a04d81b58822bc3e1843626aa2884888b1a2d2250e79fb7d41a365e>, + "artifactMetadataHash": Fr<0x3049fd9d18d6a3e6f07206670af0861939fb59708f11c4bddd4019aad0b7f2ea>, + "contractClassId": Fr<0x1a9ddbb308ed22ba60da2f2e98f3701846e4464d42ec98d15f7225fc0568e8ce>, "privateFunction": BroadcastedPrivateFunction { - "bytecode": Buffer<0x1f8b08000000000000ffe59d057814471bc7f73609108a954285da4129dac25d04922aee4e71bd241708924012dc823b454b71eaeeeeeeded29642dddd5dbfff1b769b61d9a4d0cca4f93fdf3ecfefb9bdbdbddddf3b333b33b7b73b1bb0f64d7b6dcbbadede371f0031ceab2c0a7a96b9afea7caccfb20a3edfade2b3ac9acfb21a3ecb6afa2c3b0ab4f22c3bd167bda0cfb2ba3ecbeaf92c6be02c53a780f3daca794d0cb5484a8ab64c888613c39150426a5a4a72282939ad454a38259c9c929c91909298184d494a69999a96da32941a4e4a8c86339353133343fba62e76d1b642a59a12d24d7a76fdf79e49de05e256db293baeaba4c39fce7c43ab68be9132dfd559c7fd5e37bcef0e7a809e76d172778af1a441a87453b8b1c66d75b3f5e54d2f6d65c83f6f7a2979d35d99efa1ccf7f4e44d6fbcef03fa82737cf2c6d69c370d3496f57efad233acd627b2dd205ee394b4f54e01cde912b0f4960dd7b18633df1f310d0003c12030180c0143c130301c8c00234104a481749001a2b69318314a8130991843351e283ebabab69da0a645a6f366946deddf3ac9077f7896c94ade52a5bb161caaa1e68a663a93c65a7094a1ccd55d53e98c79b4b2ad704a624242cb44592f2523144eca484f484948c8484b0aa58722e909d1d4a4706a66524252627a467a1ab6190967863223e9a99929fbbce440747b73de49f78138dad65f2bc994651b14ceb2f56f778cc6c2602aee314a75a469bbbeae3a2a8031b6feed8ed55c58ddca5ab65bd62de008c216709cf366bcb7051ce7d3028e2f83167084c616709cc60a603c490ba833e66cd21630db500b98631b14ce31d0024e28e72da0c43d81a4051cefb8eadeee44432de0c4ffa0054c236c01739d3779de1630d7a705cc2b8316304d630b98abb102c823690175c69c4fda02e61b6a0127d90685271968012797f31650e29e4cd202e639aebab73bc5500b38e53f6801a3842de054e7cd346f0b38d5a7059c56062d6054630b38556305308da405d419f374d21670baa11670866d50788681167066396f0125ee99242de034c755f77667196a0167292d60591d78830d1d78b36d83c2b30d1c7873caf9812771cf3170e09565611b62a8b015d806850b0c14b6b9e5bcb049dc73496af951ce81a1bb5ba6b3429867731eb0c30c1db0f36d83c2f30d1cb00bcaf9012b712f206f1d861b2a6c0b6d83c20b0d14b645e5bcb049dc8b485a87f1ce81a1bb75d059212cb6cda661a87453616f659e81df514bca79dc52c6171b887b29696f60a4a10a7a996d507899810a7a7939afa025eee5e4bd8188a1c2b6c23628bcc240615b59ce0b9bc4bd92a43790e71c18ba7b033a2b8455e5bc5594567ba98156f1dc721eb794f15506e25e4dda1b48375441afb10d0aaf315041af2de715b4c4bd96bc379061a8b0adb30d0aaf3350d8d697f3c22671af27e90d4c730e0cddbd019d15c28672de2a4aabbdda40ab785e398f5bcaf80603716fd41cb73be9f63c5f9b67629249cf4dffde33c3bb40dcbc37844b3ab8377e0f56e68728f39becfd6f08df8cf75bc056b0cd367fb3bec6db41c39b35d66ddb0d9575dde9a7f15fb0f0168de9b78324fd34feb113deaa31fd766aee547aeb86ed4a1db04399dfa9cc6ff3d40d17e0fd85e022707119d40d1a6f940b5fa0316f2e2129db1acf89872fd4987e9792a49fc6d3bce18b34a6df6586eb864b943ae05265fe3265fe624fdd7039de5f01ae04579541dda0f116a2f0e51af3e66a92b2adf10c59f80a8de9770d49fa693ce913be5263fa5d6bb86eb85aa903ae51e6af55e6aff2d40dd7d9fb06afbb01dc58067583c69b2bc2d769cc9b9b0ce7cd4d4a1e5cafccdfa0ccdfe8c99b9bf1fe16702bb8cdde7f7b6a9ee83867b2d1c03989db35e6b5a54cba3defd0e6194ef3cbfb3b943ceeafcc0fb28b1f98ef4ebcbf0bdc0dee2983e37280c6bcba53e37179afe1e3f25e250fee52e6ef56e6eff1e4cd7d787f3f78003ce89337bacbe743ff3e0d120f260dd4f2395099bf4f997fc893060fe3fd23e051f05819a4c1e3faca41a69f5fa8745358eaeadb0dd4a14f182eff8f2b79fc8432ff700979ff24de3f059e06cfd8ff3c306569d320a0319f9e34d487d59defcfeaf3ccf0cbf76795fc95fc72e77b9790efcfe1fdf3e005f0e241e47ba874537890c676e4398df95e967f600fd07cfcbbd34bb641e1976cfddbdda5b130988a7b975d94c09ab66bf487b2baadd2a6e9008df9f332e9c1fab2a183f515dba0f02b060ed657cbf9c12a71bf6ae860d5dd13d8e5b8ea6e5d77d9e533bfe3aca25e49719326ef44d94f8c67dbbacb5a434b7f63a0dbb111816363038e8543264841ab601d38e90e40e3cf18238306252727256646232d4da641ef32faf9152add14ee47e2196b95ef32e54e6a65bedb79f39aed24883b8e897c10f408e86ef5766b6ca9f6d87a2b07371df6f8a483ee82f39aa102ae3bbff668ccafbd86f26bef41945b1dbd605dee4dacb2c9fbf274deaf2949ccb6c6984f2189394663cca792c4acb1e10e372ba39843a59bc2cd35a61f4b473264717886493c13483c13493c93483c93493c5b9078b624f14c21f14c25f13c8dc4f37412cf33483ccf24f13c8bc4f36c12cf56249ead493cdb9078b625f16c47e2d99ec4b30389674712cf4e249e9d493cbb90787625f1ec46e2d99dc4b30789674f12cf5e249ebd493cfb9078f625f13c87c4b31f89677f12cf01249e03493c0791780e26f11c42e23994c4731889e77012cf11249e23493c23249e69249ee9249e19249e5112cf4c12cf51249ea3493cb3483cc790788e25f11c47e2399ec4339bc43387c4730289e74412cf5c12cf3c12cf7c12cf49249e93493ca790784e25f19c46e2399dc4730689e74c12cf59249eb3493ce79078169078ce25f19c47e2399fc4730189e74212cf45249e8b493c9790782e25f15c46e2b99cc4730589e74a12cf55249ee79278ae26f15c43e2b996c4731d89e77a12cf0d249ee791786e24f13c9fc4731389e76612cf2d249e5b493cb791786e27f1dc41e2b993c4f30212cf0b493c2f22f1bc98c4f31212cf4b493c2f23f1bc9cc4f30a12cf2b493caf22f1bc9ac4f31a12cf6b493caf23f1bc9ec4f30612cf1b493c6f22f1bc99c4f31612cf5b493c6f23f1bc9dc4f30e12cf3b493cef22f1bc9bc4f31e12cf7b493cef23f1bc9fc4f30112cf07493c1f22f17c98c4f31112cf47493c1f23f17c9cc4f30912cf27493c9f22f17c9ac4f31912cf67493c9f23f17c9ec4f30512cf17493c5f22f1dc45e2f93289e72b249eaf9278ee26f17c8dc4730f89e75e12cfd7493cdf20f17c93c4f32d12cfb7493cdf21f17c97c4f33d12cff70d79da1ecff2f42cee0fca28e650e9a6f0871ad34f7d8e7da89493c9f2f891c5e1f93189e727249e9f92787e46e2f93989e717249e5f92787e45e2f93589e737249edf92787e47e2f93d89e70f249e3f9278fe44e2f93389e72f249ebf9278fe46e2f93b89e71f249e7f9278fe45e2291b64f00c9078da249e31249eb1249e71249e15483c2b92785622f18c27f1ac4ce2791889671512cfaa249ed5483cab9378d620f13c9cc4b32689e711249eb50c7996e7eb026aff1fc67ce4ff61cc47911c8347074a9f7ea991b4f450383962d2f318923214ab31e63a243137d718f3b124c7cd71659437a1d24de1e303faf2b99fcd11f3091a63de4d724ddb8924c74d90c4b32e89673d12cf93483ceb93789e4ce2d980c4b32189672312cfc6249e4d483c9b92789e42e2792a89673312cfe6249e2112cf3089670289672289671289673289670b12cf96249e29249ea9249ea791789e4ee2790689e799249e6791789e4de2d98ac4b33589671b12cfb6249eed483cdb93787620f1ec48e2d989c4b33389671712cfae249edd483cbb9378f620f1ec49e2d98bc4b33789671f12cfbe249ee79078f623f1ec4fe23980c4732089e72012cfc1249e43483c8792780e23f11c4ee23982c47324896784c4338dc4339dc43383c4334ae29949e2398ac4733489671689e71812cfb1249ee3483cc79378669378e690784e20f19c48e2994be29947e2994fe23989c4733289e71412cfa9249ed3483ca79378ce20f19c49e2398bc4733689e71c12cf0212cfb9249ef3483ce793782e20f15c48e2b988c4733189e71212cfa5249ecb483c979378ae20f15c49e2b98ac4f35c12cfd5249e6b483cd79278ae23f15c4fe2b981c4f33c12cf8d249ee793786e22f1dc4ce2b985c4732b89e73612cfed249e3b483c7792785e40e2792189e745249e1793785e42e2792989e765249e9793785e41e2792589e755249e5793785e43e2792d89e775249ed79378de40e2792389e74d249e379378de42e2792b89e76d249eb79378de41e2792789e75d249e779378de43e2792f89e77d249ef793783e40e2f92089e743249e0f93783e42e2f92889e763249e8f93783e41e2f9a4214fdbe359dae73036d018f353651473a87453f8e980bef4db6b7394c767488e9b67493c9f23f17c9ec4f30512cf17493c5f22f1dc45e2f93289e72b249eaf9278ee26f17c8dc4730f89e75e12cfd7493cdf20f17c93c4f32d12cfb7493cdf21f17c97c4f33d12cff7493c3f20f1fc90c4f32312cf8f493c3f21f1fc94c4f33312cfcf493cbf20f1fc92c4f32b12cfaf493cbf21f1fc96c4f33b12cfef493c7f20f1fc91c4f32712cf9f493c7f21f1fc95c4f33712cfdf493cff20f1fc93c4f32f124f8be4fa900089a74de21943e2194be21947e25981c4b32289672512cf7812cfca249e8791785621f1ac4ae2598dc4b33a89670d12cfc3493c6b92781e41e2598bc4b33689e791249e4791781e4de2790c89671d12cf63493c8f23f13c9ec4f30412cf13493c83249e75493ceb91789e44e2599fc4f36412cf06249e0d493c1b19f2b43d9ea5bd0f3a4e63cc8d4962aea031e626243157d418735392982b698cf9149298e335c67c2a49cc9535c6dc8c24e6c334c6dc9c24e62a1a630e91c45c5563cc619298ab698c398124e6ea1a634e2489b986c6989348623e5c63ccc92431d7d418730b92988fd018734b92986b698c398524e6da1a634e2589f9488d319f4612f3511a633e9d24e6a335c67c0649ccc7688cf94c9298eb688cf92c92988fd518f3d924311fa731e65624311faf31e6d624319fa031e63624319fa831e6b624310735c6dc8e24e6ba1a636e4f12733d8d31772089f9248d31772489b9bec6983b91c47cb2c6983b6b8c39d6da774d40d009b809680a4e01a78266a0b9ec07844182a4054802c9a005680952402a380d9c0ece006782b3c0d94eecad411bd016b403ed4107d01174029d4117d0157403dd410fd013f402bd411fd0179c03fa81fe600018080681c16008180a8681e16004180922200da4830c1005996014180db2c01830168c03e34136c80113c044900bf2403e9804268329602a9806a6831960269805668339a000cc05f3c07cb0002c048bc062b0042c05cbc072b002ac04abc0b960355803d68275603dd800ce031bc1f96013d80cb680ad601bd80e76809de0027021b8085c0c2e019782cbc0e5e00a7025b80a5c0dae01d782ebc0f5e0067023b809dc0c6e01b782dbc0ede00e7027b80bdc0dee01f782fbc0fde001f02078083c0c1e018f82c7c0e3e009f024780a3c0d9e01cf82e7c0f3e005f0227809ec022f8357c0ab6037780dec017bc1ebe00df026780bbc0dde01ef82f7c0fbe003f021f8087c0c3e019f82cfc0e7e00bf025f80a7c0dbe01df82efc0f7e007f023f809fc0c7e01bf82dfc0efe00ff027f80bc8411600368801b1200e5400154125100f2a83c3401550155403d5410d7038a8098e00b5406d7024380a1c0d8e0175c0b1e038703c38019c0882a02ea8074e02f5c1c9a00168081a81c6a009680a4e01a78266a0390881304800892009248316a0254801a9e034703a38039c09ce0267cbbdf0a0356803da8276a03de8003a824ea033e802ba826ea03be8017a825ea037e803fa8273403fd01f0c0003c12030180c0143c130301c8c00234104a481749001a220138c02a341161803c68271603cc806396002980872411ec80793c06430054c05d3c0743003cc04b3c06c30071480b9601e980f1680856011580c9680a56019580e56809560153817ac066bc05ab00eac071bc0796023381f6c029bc116b0156c03dbc10eb013c8b3ede5b9f1f24c7679deb93c4b5c9ed32dcfc096e74bcbb39be5b9c8f2cc61799eaf3c2b579e432bcf7895e7a7cab349e5b99ff24c4d795ea53c0b529eb328cf3094e703cab3f7e4b976f2cc38791e9b3ceb4c9e2326cfe8ba1fc8b3a5e4b94df24c2479de903ccb479e9323cfa091e7bbc8b353e4b924f29c0e7906863c13429eb720cf3290e704c818fc32bebd8c1d2fe3b2cb98e7329eb88cd52de360cb18d3327eb38c8d2ce30ecb98be325eae8c45fb36903154657c5219fb53c6d594312b653c48196b51c63194310265fc3d19db4ec68d9331d964bc33194b4cc6e99231b0647c2919bb49c645923187643c1f192b47c6a191315e64fc14199b44c6fd90313564bc0a190b423a143286818c0f20f7decb7ded72cfb8dc8f2df73acb7dc4728faedcff2af796ca7d9b724fa4dc6f28f7f2c97d72720f9adcdf25f74ec97d4972cf8fdc4f23f7aac87d20728f85dcbf20f706c875f7724dbb5c2f2ed7624bfb2ed710cbf5b972edab5c572ad76ccaf59072ada15cc727d7b5c9755e72dd935c0724d7c5c8752272dd845c4720ffabcbffccf2bfabfc0f29ffcbc9ff54f2bf8dfc8f21e7f5e53cb79cf795f3a0725e50ce93159e3702725e417e67cbef4ef91d26bf4ba49f2efd56e9c749bfc6de57555ad22f91a989553439c968c5389fcb357d728d9b5cf325d740c93541728d8c5c3322d750c83505f21fbbfce72cffc1ca7f92f21f9dfc6725ffe1c87f1a728e5fce79cb396039272ae708e59c999c4392732a728e417e7307415d500f489f5dfab0d2a793e7d334048d4063ebc0a9b2325f4b993fce798de4e747c74fc80fe6e704231919c12959f9a3833993a3b999e372a45b51d87f70a77ace6be7ecacfcacc8b8ace991fcac9cece0e848dee860464e342f989d931f1c1fc94f97ce4c61cfc29d42de6f46736577b9d1bcbc60d6beefe58f8e06d373b2f37323e9f9c18ce8847139d3a2d2d929ec8d1caaf5aa43fc4ec0c90dcb494d77aae6bcf6cd8fa48fc53773601695aab8b0cf2453b3835a7b89f349eb435abbb3b2f631ee16727323d38259d919d1a9c19c49f9c19ccc605acea4ec8c3cf58b7d0e31fcc2922c935b82e29d57f757887b44b472de874a3785e395edeade7e4a283929deda7fd2ec9f186f15d506a6d247b6196366fb8557a9cad4b6a068fb6a2cee7eab3aef034a5abadf911aaf86f21d751b96e3ebfdaefbb9c9f852424949f1d6feb5b8def40b175e2d26534cc181e9e77e165be09f9e32c515ecefe5a6a77b944b0bd1ce59a786f2797d653bdef40e9441dacac56d01cffe2c6bff74f6c65cd9327bac043cfb737dbce9e3ce5771d257a651d1fcb64e9bd3393b2f3f929d1e554350375bc327443509fcd6f1aee75dbfaacfe7aea67422dc6aac6241d1e73aab0177bf959cedc7594559e9eeb370b9336f7bd657e703cef7d565272971c914af7ccfdd4f8cb2ccdd6775e77d05e5b3f8827fde56accfb66af8ac5fc1b3ad8a3edb5297b9714b67af8e33afe64facb23d5df9d332a5287fdc3452f3479d6295cfd5f51b39ef6b5afe93c4e076cdb89bfca49665d5e41b6a920d3759fe4dbe37164b59e6aee7fd8eac5752b7c064d7c87cd35e94cf15cc6c3fc14db73825ed627d6272f75fd53ab0790b14f36a59fe4db1bbafca96d1321c2e2936d5df2d1b353cebab69f05fe6839a3e6a3ec874b05dbe38cf67c575f9ea28eb15d70d97f54e76e6a5ebd2d1d996a5a4954cacfd84fa4acc85f128df63ed271cebcc4b1b2bf9d7d42ada5671e5ceafbb5add3ab06e88f36ccbafeb1be7b32df7a4944c1370d6a175eea849e3a3d9f979de0eabba03cb6743eacedde5c53528deefc42aebab134387aab9f3bea40e557f679ebc439556561daa8a66b6dfc2dd7e2533dbf7ed50a9b1b8fb758f8976054569d9ae607f27779d0eca3a1d8a5947adfc3b2aeba8c75f27659d4e9e754aeabcf99d5768e7f94cad6cda7b3e538fa50e9ecfd40aa9a3e7b30ad681be927eee196bb7d2ea5cb07f2cea675d94cf5cff2394effcdd2859fbae0a50f75fb168f7079c4731547e120fb6f3e6eebfb265f478f9bbf356c9e3e34d1fbff328e99171e37ae5664d8ee4473b4cca4e97bf05d410d4cdda3e2116d7cca8c5c2bb9eb798faf591633defe33cefddedabfb29eefbde65aa8f3b5fdd677945cf3adeecf62ef3f68d2bfaeccfef100e14f3eaeec7fa87fdf83997749af150f763fa94760d8fabbaafea3efbf6a6ab5f1faaa4df2c157df663f8b769b25f55ea4edeaad4afbca8cedee3d0f2c4af4e6a4c721cb755b6eb5dcfebe3f75b2ac613875fb988b1ac62fbbdea36fcba9cee7cbccf7e747631fc9a2f6ffc251dbf6ad372a8f9f1f76f28ebd0f2434d23ef71ae1ed3debf80bcdd589918baec6d9cf72575d9d52e815f5d11f07ca6a693b77e3354d6fe3e5fe19635371dbc3e71cae7eafa5dfe211d02d681c75849f5a0d7475ddffbfb5426bfdfb1153c9f9594aeffc5392bbfe3c11b7705ebd0f2a1aff35a5c3ef8b563eab924ef7ed463b19292663255b68ca45942bcb24f03db0f55b40e9cd40b590ef37ce6a6955fbd1028e6bded792d69dd4009dbadeaf399faf3c3bb2cdef35a4bd99e89d303b5cd6cdf378fd40b8c6a7be254d3b9952607777beeb1e9d72fb23d9fa9e75455bf807ebfb0d725c6675feea49615f7f3ff018d8be2fd060d0200>, + "bytecode": Buffer<0x1f8b08000000000000ffed5d07781cd5f1dfd349b22559d661e3826d8a0db8db5c530383257763dc7bc158d5181c4cc02601427209a49346420a8150fee9bdf7427aefbd17d27b486fe43fcfdc48a3b9b9d59e6e9e7c93f87ddf7cb7b7efedcc6fe6bd9957f6ed6e2c7838dd1b0f826be30f1fc780e2f9df2aa0b3d839fca5c73542b906e15ca370ae4938778a706e3250073b77a650ee2ce1dc4ce1dc2ce1dc9cfc399a62f9df8efc6f26d992cdf6b5a6fb5299545732dddeddd69ccc3677b7b4a5da52cd6dcdbde9b64ca6af2ddbd6dadeddde9a6c4f65337da9fee6f64c7ff2e194880ff24a9695d23d3e719e32729c597ec2619b00544db03a3b3c943f9e1b0c1ecf23c7a7e4cbe07513e0ff44a0538126c507cf638a331b24cb4ba9f98abc26c4f5ea66b25a1b92eb6632a99b89e4f854723c89d5cd14f83f15e834a06942dd5429d7cd1cc5b63e5dcf9e291a4f1cdfb3986d798a29db2516e8b60dc498c81fcf009d4e073a03e84ca71fd04ca0594067039d03742ed06ca039407381e601cd075a10cf1b630c69103e8d314bd15104b85abcd3d4160bf3516c11ef715dc6bfd9395788b72aed28384b2172f5f53f9c162a46c1458a95eb1ae5d8209a87968b9bda20d59649a75b33ae5c5b6f3295eded49b7a5d3bdddd9644fb2ab27ddd79e4db5f767d3d94c4f6f4f37f0ec4af527fbbb7adafbdb1ee645f12e8e7b04ec98f3105e2ef8c58a61f73cc586e5cb86e7c50bf9966bc3f394239cb6de8b8ae85d2edfa4f21008036a32dfce47b3973ad7602f95ca079b34efa552422f951e855eea5cc55e2aa5184cd2467ba994a75e2a13f70838e3a197ca28f652d90aefa59c0db31e7aa96c85f752e9227a97cbb7d9532fd57c027aa9b9067ba9967cb069e5bd548bd04bb58e422f3557b1976a510c26ad467ba9164fbd545bdc23e0360fbd549b622fd55ee1bd94b361bb875eaabdc27ba9d6227a97cbf77c4fbdd4f927a0975a60b097ba201f6c96f05eea02a1975a320abdd402c55eea02c560b2c4682f7581a75eeac2b847c0177ae8a52e54eca52eaaf05ecad9f0220fbdd44515de4b2d29a277b97c977aeaa596c60b7b266dec1d6ad853ddd20ddb0e72637606393e335efc667a27fc5f06b41c6845dcffcdf4d3157dbf53d1f7572ab72b5e372b491d2c23c7cbc9f10a5637abe0ff6aa035406b85bad16e9f178fdc06992836a0edf30c72bc8a1c5fcc6cb00efe5f02b41e68c328d860a35a3bc8647de2dc34729cbdc90875b591d4c959e4782639dec4ea6a33fcdf02b41568db28c412c55bbfa9cd8ab164bba7d987b6fdce56b4df1645fbed3062bf7314edb755d17e3b3df765db490cd8418e7792e36d2c36ec82ffbb81f600ed1d85d8a078c32db54bb16ef61969dbb315edb75bd17e971ab1df1c45fbed51b4df7ecfb1611f89019792e3fde4782f8b0d97c1ff03405d40dda3101b146f73a42e53ac9b1e236d7b9ea2fd0e28daafd788fde62bdaaf4bd17e7d9e63430f8901bde4b88f1c77b3d8d00fff0f025d0e7468146283e2e272aa5fb16eaef05c3757903a38488e2f27c78758dd5c09ff0f033d02e8aa51989b1fd1b341bf64832344d72bc9f1ba90f589abe1ff2381ae893ffcf054753e2f168cce46ffab15db055dff3c9a77ac63b8408abf2e23c7ce1dcb9fa349db31af5674a6a3d179f50cc32b754cb1025cc3a90ae45ba44189f61c0e77e0b1511e550e5698aee38dd19d18ee36a8666319066b6a98fce4758a8df85171b5c630e44ec8a3223873b9d88f29da41d3a68f2ec1a6c3c9a2367d34099a63893da94d93e5a5d443e1fcd23dfda94c735f6b73b2a52bdbdcdb9249f7a65b93bdd9e6fe14004eb767c134fd3dd9b6deb674a63fdd9aee794817dff13686810d3b12ec558fe58faf87df1b806e8c8fee7e911b3dcd1c94eb78c87e91c7e41bd14d3c28ba0cbe5fe4a6088132595e1a62c472f78b3c46d1a96f52eea1476bbf08b581e67e91c7c63d0276ccb5f78b3c56714ef638c586e5cb868f8bebef17799c7284d3d6fba6227a97cb37a73c14c5809a8b17f64cdaa324cdfb73d72bb6fbc79fa0809a2c2fa51eafdc16303d21ee11f013e2fa7c6ff61c0493e5a5e37adf4cc6c84a7c431775cbb583e6cde01b14ebe716a3ce7a8b27677d62dc23e0277a70d62755b8b33abd9f34cace9a2c2f0de90d93e525d560fa64e5465f97afef2793b9f60de4f8e6f8e04af5d9e4fc39e4181fdb7e0afc3e15e869f9ffc8fbfa22bc6f22bc872bf374f8bd15e819713fbe7973be8d6a8f2e9f59e1a36a5f7a3f4bd17f0292aa9471dea4e89bcf56d699eb9a2c2fa59c7f6ad68bf3c9677a683bcff1b4d6a6dd76d28a6de7b60a6f3b2ef62b2e93a59caf3cc743db79ae72dbd1b6a36b339a630bd76e9eebc18eb1c08f0f6ae37c9e9e2d7ba53bfecf236311d716f0784abcf81dffdbe1fff3815e00f4c2b8ff571c9ea918876e373a19547c6a68c864f045718f805fe461327847854f069dde77185bb9f1d550cbc5f562a3cefa624fce7a67dc23e03b3d38eb5d15eeac4eefbb3c39abf648e08e3c56eddef58e7865d6b773585735554161d26e07be4683caedaa7b80216eb2948ca32c348337fd7c56c0dc40bf02b431ce338071be078cc71b5a4d9e02cf0da1d23db1b9399be9efeb6af56983299ed687b4714e378233aec76bc80ef197e4a3e2ddb825027f5dc659c1d0a4dd6dbf44b1abbd27aeebc068877b043b6857eeddca7384da6074e608be039d7a83bb47b1c1ddeba9c1dd1bc1f12a69b2bc20f0d308b475566caca9854674ae52d47991119d157bcad4e251d239595e4a9da7683f2b23b764600367ca08ceb4119c192338b34670361bc1d9620467ab119c6d4670b61bc179be119c1718c1b9c408ce0b8de0bcc808cea546707618c1d96904e7322338971bc1b9c208ce954670ae328273b5119c6b8ce05c6b04e7c54670ae3382f3122338d71bc1b9c108ce8d46706e328273b3119c5b8ce0dc6a04e7362338b71bc1b9c308ce9d4670ee328273b7119c7b8ce0dc6b04e73e23382f358273bf119c9719c179c008ce2e2338bb8de0ec3182b3d708ce3e2338fb8de03c6804e7e546701e3282f30a2338af3482f3b0119c8f3082f32a23388f18c179b5119c8f3482f31a2338af3582f3a8119cc78ce0bcce08ce4719c1f9682338af3782f30623386f3482f3314670de6404e7638de07c9c119c3923381f6f04e7138ce0bcd908ce5b8ce07ca2119c4f3282f3c946703ec508cea71ac1f93423389f6e04e7ad46703ec308ce671ac1f92c23389f6d04e7738ce0bccd08cee71ac1f93c23386f3782f3f94670bec008ce171ac1f9222338ef3082f3c54670de6904e75d4670bec408cebb8de0bcc708ce7b8de0bccf08ceff3382f3a54670becc08ce971bc1f90a23385f6904e7ab8ce07cb5119caf3182f3b54670bece08ced71bc1f9062338df6804e79b8ce07cb3119c6f3182f3ad4670becd08ceb71bc1f90e2338df6904e7bb8ce07cb7119cef3182f3bd4670becf08cef71bc1f9012338ef3782f38346707ec808ce0f1bc1f91123383f6a04e7c78ce0fcb8119c9f3082f39346707eca08ce4f1bc1f91923383f6b04e7e78ce0fcbc119c5f3082f38b46707ec908ce2f1bc1f9152338bf6a04e7d78ce0fcba119cdf3082f39b46707ecb08ce6f1bc1f91d2338bf6b04e7f78ce0fcbe119c3f3082f3874670fec808ce078ce0fcb1279c550c67257d97fa27a3a473b2bc94faa9a2fdee31f2bde29f053670fedc08ce5f18c1f94b23387f6504e7af8de0fc8d119cbf3582f3774670fede08ce3f18c1f9a0119c7f3482f34f4670fed908cebf18c1f9572338ff6604e7df8de0fc87119cff3482f35f4670fedb08ce878ce0fc8f119c8ea1059c312338ab8ce08c1bc1596d04678d119cb546708e318273ac119c754670d61bc1d96004e73823381b8de01c6f046793119c0923384f31827382119c138de03cd513ce4ade1730e97f50e7c946dae39458f9f66befeaee49a69abb7cd64d5c51e7a946dae3798a3a9f66a43d4e1ba5ba49969752d3637af53c3d6e43e7198a3abfc4c8bea9d38df8cd1946709e6904e7594670ce34827396119c671bc1798e119ce71ac139db08ce394670ce3582739e119cf38de05c6004e74223381719c1b9d808cef38ce04c1ac1993282336d0467c608ceac119ccd4670b618c1d96a04679b119ced46709e6f04e70546702e3182f34223382f328273a9119c1d4670761ac1b9cc08cee54670ae308273a5119cab8ce05c6d04e71a2338d71ac179b1119ceb8ce0bcc408cef546706e308273a3119c9b8ce0dc6c04e7162338b71ac1b9cd08ceed4670ee308273a7119cbb8ce0dc6d04e71e2338f71ac1b9cf08ce4b8de0dc6f04e76546701e3082b3cb08ce6e23387b8ce0ec3582b3cf08ce7e23380f1ac179b9119c878ce0bcc208ce2b8de03c6c04e7238ce0bcca08ce2346705e6d04e7238de0bcc608ce6b8de03c6a04e7312338af3382f35146703eda08ceeb8de0bcc108ce1b8de07c8c119c3719c1f95823381f670467ce08cec71bc1f90423386f3682f31623389f6804e7938ce07cb2119c4f3182f3a946703ecd08cea71bc179ab119ccf3082f39946703ecb08ce671bc1f91c23386f3382f3b946703ecf08cedb8de07cbe119c2f3082f3854670bec808ce3b8ce07cb1119c771ac17997119c2f3182f36e2338ef3182f35e2338ef3382f3ff8ce07ca9119c2f3382f3e54670bec208ce571ac1f92a23385f6d04e76b8ce07cad119caf3382f3f54670bec108ce371ac1f9262338df6c04e75b8ce07cab119c6f3382f3ed4670bec308ce771ac1f92e2338df6d04e77b8ce07caf119cef3382f3fd46707ec008cefb8de0fca0119c1f3282f3c346707ec408ce8f1ac1f93123383f6e04e7278ce0fca4119c9f3282f3d346707ec608cecf1ac1f93923383f6f04e7178ce0fca2119c5f3282f3cb46707ec508ceaf1ac1f9352338bf6e04e7378ce0fca6119cdf3282f3db46707ec708ceef1ac1f93d2338bf6f04e70f8ce0fca1119c3f3282f30123387f6c04e74f8ce0fca9119c3f3382f3e74670fec208ce5f1ac1f92b23387f6d04e76f8ce0fcad119cbf3382f3f74670fec108ce078de0fca3119c7f3282f3cf4670fec508cebf1ac1f9372338ff6e04e73f8ce0fca7119cff3282f3df46703e6404e77f8ce00caa6ce08c19c159650467dc08ce6a23386b8ce0ac3582738c119c638de0ac3382b3de08ce062338c719c1d96804e77823389b8ce04c18c1798a119c138ce09c6804e7a946704e328273b2119c538ce09c6a04e76946704e338273ba119c338ce03cdd08ce338ce03cd308ceb38ce09c6904e72c2338cf3682f31c2338cf358273b6119c738ce09c6b04e73c2338e71bc1b9c008ce8546702e328273b1119ce719c199348233650467da08ce8c119c5923389b8de06c3182b3d508ce362338db8de03cdf08ce0b8ce05c6204e78546705e6404e75223383b8ce0ec34827399119ccb8de05c6104e74a23385719c1b9da08ce354670ae3582f3622338d719c17989119ceb8de0dc6004e74623383719c1b9d908ce2d46706e3582739b119cdb8de0dc6104e74e23387719c1b9db08ce3d4670ee3582739f119c971ac1b9df08cecb8ce03c60046797119cdd4670f618c1d96b04679f119cfd46701e3482f37223380f19c17985119c571ac179d808ce4718c17995119c478ce0bcda08ce471ac1798d119cd71ac179d408ce6346705e6704e7a38ce07cb4119cd71bc17983119c371ac1f91823386f3282f3b146703ece08ce9c119c8f3782f3094670de6c04e72d46703ed108ce2719c1f96423389f6204e7538de07c9a119c4f3782f35623389f6104e7338de07c96119ccf3682f3394670de6604e773ab6ce07c9e119cb71bc1f97c23385f6004e70b8de07c91119c7718c1f9622338ef3482f32e23385f6204e7dd4670de6304e7bd4670de6704e7ff19c1f95223385f6604e7cb8de07c85119caf3482f3554670beda08ced718c1f95a23385f6704e7eb8de07c83119c6f3482f34d4670bed908ceb718c1f9562338df6604e7db8de07c87119cef3482f35d4670bedb08cef718c1f95e2338df6704e7fb8de0fc80119cf71bc1f94123383f6404e7878de0fc88119c1f3582f36346707edc08ce4f18c1f94923383f6504e7a78de0fc8c119c9f3582f37346707ede08ce2f18c1f9452338bf6404e7978de0fc8a119c5f3582f36b46707edd08ce6f18c1f94d2338bf6504e7b78de0fc8e119cdf3582f37b46707edf08ce1f18c1f94323387f6404e7034670fed808ce9f18c1f95323387f6604e7cf8de0fc85119cbff484b38ae1cc245bb2d9bed6745f2a93ea4aa6dbbbdb9a93d9e6ee96b6545baab9adb937dd96c9f4b565db5adbbbdb5b93eda96ca62fd5dfdc9ee9cff39ea3a8f3af4649e7647929f5eb2a3dfbdd1bb751cfd58af6fb8d91b65da3a8f36f8de85caba8f3ef8ce83c4651e7df1bd179aca2ce7f30a2739da2ce0f1ad1b95e51e73f1ad1b94151e73f19d1799ca2ce7f36a273a3a2ce7f31a2f378459dff6a44e726459dff6644e784a2ce7f37a2f3298a3affc388ce131475fea7119d272aeafc2f233a9faaa8f3bf8de83c4951e7878ce83c5951e7ff18d1798aa2ce8191f5b0a98a3ac78ce87c9aa2ce5546749ea6a873dc88ced31575ae36a2f30c459d6b8ce87cbaa2ceb546743e4351e73146743e5351e7b146743e4b51e73a233acf54d4b9de88ceb314756e30a2f3d98a3a8f33a2f3398a3a371ad1f95c459dc71bd179b6a2ce4d8a3a03abe37b7c7e92577801d042a045408b81ce7332805240696707a02c5033500b502b501b503bd0f94017002d01ba10e822a0a579bd3b8196012d075a01b4126815d06aa035406b812e065a077409d07aa00d401b8136016d06da02b415681bd076a01d403b817601ed06da03b417681fd0a540fb812e033a00d405d40dd403d40bd407d40f7410e872a0434057005d097418e8114057011d01ba1ae89140d7005d0b7414e818d075408f027a34d0f5403700dd08f418a09b801e0bf438a01cd0e3819e007433d02d404f047a12d093819e02f454a0a7013d1de856a067003d13e85940cf067a0ed06d40cf057a1ed0ed40cf077a01d00b815e047407d08b81ee04ba0be825407703dd03742fd07d40ff07f452a09701bd1ce81540af047a15d0ab815e03f45aa0d701bd1ee80d406f047a13d09b81de02f456a0b701bd1de81d40ef047a17d0bb81de03f45ea0f701bd1fe80340f7037d10e843401f06fa08d047813e06f471a04f007d12e853409f06fa0cd067813e07f479a02f007d11e84b405f06fa0ad05781be06f475a06f007d13e85b40df06fa0ed07781be07f47da01f00fd10e847400f00fd18e827403f05fa19d0cf817e01f44ba05f01fd1ae83740bf05fa1dd0ef81fe00f420d01f81fe04f467a0bf00fd15e86f407f07fa07d03f81fe05f46fa08780fe03e41c2c0654051407aa06aa01aa051a033416a80ea81ea801681c5023d078a026a004d02940138026029d0a34096832d014a0a940a7014d039a0e3403e874a03380ce043a0b6826d02ca0b381ce013a176836d01ca0b940f380e6032d005a08b4086831d0794049a014501a280394056a066a016a056a036a073a1fe802a0254017025d04b414a803a8136819d072a015402b815601ad065a03b416e862a075409700ad07da00b4116813d066a02d405b81b6016d07da01b4136817d06ea03d407b81f6015d0ab41fe832a003405d40dd403d40bd407d40fd4007812e073a047405d0954087811e017415d011a0ab811e09740dd0b54047818e015d07f428a047035d0f7403d08d408f01ba09e8b1408f03ca013d1ee809403703dd02f444a027013d19e829404f057a1ad0d3816e057a06d033819e05f46ca0e700dd06f45ca0e701dd0ef47ca01700bd10e845407700bd18e84ea0bb805e027437d03d40f702dd07f47f402f057a19d0cb815e01f44aa05701bd1ae83540af057a1dd0eb81de00f446a03701bd19e82d406f057a1bd0db81de01f44ea07701bd1be83d40ef057a1fd0fb813e00743fd007813e04f461a08f007d14e863401f07fa04d027813e05f469a0cf007d16e873409f07fa02d01781be04f465a0af007d15e86b405f07fa06d03781be05f46da0ef007d17e87b40df07fa01d00f817e04f400d08f817e02f453a09f01fd1ce81740bf04fa15d0af817e03f45ba0df01fd1ee80f400f02fd11e84f407f06fa0bd05f81fe06f477a07f00fd13e85f40ff067a08e83f406e301103aa028a035503d500d5028d011a0b5407540fd400340ea811683c50135002e814a0094013814e059a043419680ad054a0d380a6014d079a01743ad0194067029d0534136816d0d940e7009d0b341b680ed05ca07940f38116002d045a04b418e83ca024500a280d9401ca023503b500b502b501b5039d0f7401d012a00b812e025a0ad401d409b40c6839d00aa09540ab805603ad015a0b7431d03aa04b80d6036d00da08b4096833d016a0ad40db80b603ed00da09b40b6837d01ea0bd40fb802e05da0f7419d001a02ea06ea01ea05ea03ea07ea0834097031d02ba02e84aa0c340ee7bf5ee5bf0ee3bebee1be6eefbe0eedbdbeebbd6ee9bd1ee7bccee5bc7ee3bc2ee1bbdeefbb7eedbb2eebbadee9ba8ee7ba3ee5b9eee3b993920f77d47f7ed44f75d42f7cd3ff73d3df7ad3af71d38f78d35f7fd32f76d30f7dd2df74d2bf7bd28f72d26f79d23f70d21f77d1ef7ed1bf75d19f7cd16f73d14f7ad11f71d0ff78d0cf7fd09f76d07f7dd04f74d02f7be7ff72e7df79efa7b80dcfbd5ddbbcbdd7bc1dd3bb7ddfbacddbba2dd7b98dd3b8eddfb83ddbb79dd7b6fdd3b65ddfb5addbb50dd7b46dd3b3cddfb31ddbb27dd7b1ddd3b13ddfb08ddbbfedc7bf4dc3beadcfbdfdcbbd5dc7bcbdc3bc1dcfbb6dcbbacdc7ba2ee0772ef3772ef0e72efe571efbc71ef9371ef6a71ef4171ef1871efef70efc670ef9d70ef7470ef4b70ef2270cff9bb67e8ddf3e9eed96ff75cb57b66d93d0fec9eb575cfb1ba6744ddf397eed946f7dca07b26cf3defe69e2573cf69fd00c83d5fe49edd71cfc5b8674edc78d73d2be19e43707bfcddfe79b737ddedd576fba0dd5e5eb7b7d5edf5747b1fdd5e40b737ceed15737ba7dc5e22b7b7c6ed35717b2fdc5e04776fdeddab76f76eddbd4c776fcfddeb72f77edcbd10776fc0ad95bbb563b796ead616dd5a9b5b7b726b316e6dc2cdd5dddcd5cde5dcdcc68df5ab1e1e42046eafb24b0b82c1940f2f4ec4f17cb7b7d7ed75757b3fdd5e48b737d0ed95737bc7dc5e2ab7b7c8edb5717b4fdc5e0cb737c1ddab77f7aeddbd5c776fd3ddeb73f7bedcbd20776fc4dd2b706be76e2dd9adadbab546b7f67616d04ca059406eeeeee6b26e6ee7e63a6efffc5ca07940f383c254478e27e67f27fdb8f3b4477eea152b69b9adf9dfbb5f75c6dba6ffb86a0fcddb1692b73b246f6f48de0df9df6573bebcfbe5b1dc9f68de13f2bfbf9d754ec7844dc74d30909e12a2c3ad45f2d0068bd9ffaafcafab5b57af1df9ffc9f252aa8ef0d5e6df966c6ea675ea017fa62e186cefbeec833c3df03fbe1fdba515b941fe5c17971af3ff63c496788df369f417777c2ab99ef20bf2fc381fccf7a96b1bac8c20ff6a0ffca1aa8eef913cae63aed09698579d1b2a9be6d590bc6a62cfd3997d7cb4356a1f3f6d2d757c2f52b1f6d590d7752eb1096f3b3166074f385331262f60b238f67a8ff5e200c5983cc4c3ed83c7ae4f457f3cd87774f991ab8e5ed3d57374ed55d71eedbaaaa78faa40d926c8799a4f132fc3cbf1f28d423ec26c20e7c7e48221aa1dff25e7d035d055c6d2f22caf8ee455e786e2aacfffaf2672282fc451c3cacfc9ff6fcaffd6926bf0fa8420bf96c91f825b38479b10e71517ce617937bc3a2b7fecec8add5e756e909f56936c6d4b26111fdabe2618da3c0326bf86955f94ff5fcff4c5d0d731429cfdad5da9fe4c577f5773576f6fb6a76b02e34f6de6ec84ebebb68739d9d693c39cf0a435cc191f0c1e27c8352ead24bc632c6f9520d7f67027999e28e0af26bab9b43c170ca411ca4df113385498c1ece849cf666c13354161c2bc5a22bb585f18048531920ff56611bebc1c9749db6f2dcba3753286e5497db1c4930ecd2abd3f9999ff7fa2fb13da2ee341615d705c7c18c7877941111e521d721971811ffa633c28f49962d824ff0e847312b6f830d8aa056c9c6f55881ec5e4504c616d3cc6f224ecae5eb17d9d1c2784a68ce77e3ced39d68be304a9fd878d13a4a92b8e0df818a289f073898e1306e60081bfb117b48916cf75968a32ed9f1e0c266ae79aa078bcab616527e77f5d5f38b108bfda60f83e305ee4bad3f2c77581dccf77043af69270c4041cc3c5ac4aefb3cfcaff3fd17df6a4bc43da8eed2d2763fb3009637b5f6e28ff20183eb6e335526cefcfe78d0dc8fa5430746d41f2d30e05bdb0de7df50f2e4d0c8ac74c3ecf5396dd8bfc57e4f9076abcb303bc57fac19e46feabcac75e300746deabfd601f88556bfcf0cf22ffb57ef86790ffc57ef8f723ff75b9a0dcba2d48c8fb1282dd07fff57e6c33c07f831ffc036d73634eddf603bc37f9b1cdc0ede8cd847f4c8d7f7ac0f65bbcf06f19b0cf563ffc07fc769b1ffe037167bb1ffe03f5bbc30fff16e4bfd30fff8131e42e3ffcdb91ff6e3ffc7b90ff1e3ffc07c60c7bfdf0ef43fefbfcf01fe8b72ef5c2bf7520feecf7c37f604c75991ffe03f1e7801ffe03f1a7cb0fff81f8d0ed87ff80fff6f8e1df8dfc7bfdf0efc5f5a607f2fca439ad9ebce624ce17e93a375fd7ab21e715b7b174f1f5a92090b7b10cec7508bccebf07b6b1d4303cdc3e7c3dae56c09a10f2781dd60a726a053909218f8f0fcae1b55f91d70e455efb147969eab84791d72e455e7b1579ed54e4b5599197a68e9aedeb80222f4ddfd6b4fd36455e9aedfe32455e5b157969b6af2e455e95da77e098d0efb8e3e1f51fc7738c1ffe99305b509df8be17be4740fa0d02798c84b2ea83c2b1868f3192a41bc55fac9eb90dca693394579d90e7a34e6b42f4e6f28b9597c692587e6c087f5abe29286cc363992deafcd8221d566f63894c943f8e9cefedeb3e76f09223070396f8d818ed761a2b876bc25541a1bdc714e115b0ffa7b17371c28fa67144876bafbfaa67c391a37dd706c3a43067f6fc7c477bd46081f2472b5854333cc51a35dfc848af4d04850ec527f992b3d50872245ebd8abc362bf2ba5491d776455e7b15796d53e4b54b9197a68e3b1579556afbdaa2c86bbf22af038abc34db97a6bd762bf2d26c5f9a3eb44f9197669bd08cab3899f53c096ae18b9734611e1d5cc6581e1da8aec80d96e329cefe539d1c8f5f10bebc1cc743c74d74b0576ccce092e789c1c0834163fdf01f98788c0986da94eb34b688ad305ffa455e3c0f658dd682bba49b34494a0485ed924fb8245e634ae475221708a436de188255d2834fb0c326add426587e6c082e5afe7f65123a9595c34d6de54c42a7b273c526a1e52e0e214e9712022f9c50f3b9a94b1df9df6459a9ad8bf7658abcdb3dc7f756ee7b34f1be90da16f368fbe77d683de1b5223734af815c57c3ae1b17c2b33184e7f8109c4d213ce943f57cae7e0ac9a3b18b27691c8075e6ec57131be4cbcb61b2f0d0c0cff3ff2be141bf07f2ffa5b11e5ee7b9af4b8f74cce16bbc16653c456d392e18f4c5c347ba7a97775d7dedb1c37d55cc94bccba5e6a4ecb8dadc55069a1f3bc7bb902a761d76495253a5d7c583c1e79210f39ff3bf4efd07f3c752b783fb7da52126ee33763cfec97053ac61a60e1bae501ed8653505436d23854a8a7f4311fc9407c55fc378fc8794f9379343eb87da221693cb51f9b49c744f815e130f0a6dc2f58c0bd7f1b23c44a02d1b04b918221a198f8efcff6479a98f774f3449dd13ef82120c57100491bb20fa3c4c295351da05f3ae73e07549c1605d50bb8e23f9b4fc84bc20d71eeeac1d2a6f8280274a6875890fff68d7c1fd65a2a29c89a40c7ffeff544539f4755e7cca344951ce2452864fb7272bca994ccae07007fd730ac9435dd13f4f23798ab795ba50c7694161c2bce944366f5333481eedd67992fc13752ad53fa7923c8a8df2a4fe49ed3a95e4d3f28b628358ee1e37543e9fced1fe0d9f03890785f5342528d4654a20f3a6d7d609798a759e95ea9cf707d3fdc86e8ee237547e3dc3aadc3f0d0c19a7333cdc3e250e196933a0ec4f65ecb00c2d4bd3a904122d5fc3fe176b5651868c7541a19b289ab8db6f734eb6796eb2035b8a66f8c1df83fc4ff7c37f6015e50c3ffc075ee170a61ffe032b4c67f9e1dfcabb823d64a8d6993f6e646510874b88cf4f884a25a3864c945f1ff81c320c86cc690c0fb74f15b3cf4c3f78fa638c3fc53353b00fd6e52c210f799d9dff4f8711b4fc4ca2232d4f8ff17a7a6e63bec2128ca74b38b58c097971e11cdad7b5d3b579be4d823ebc2f92ea4deaea12c2f5dc860de43abe84304ed04d5ac9e479e343f29a04bdf854d1a5f5ecba53049ece6e9f8b0df22bd68624db84d5d14c0147535068cb59117885c93e5b284f79ac66b2a92f9c1d815798ec7384f294c7cadc50d954d77322f00a937dae509ef258cb64535dcf8dc02b4cf66ca13ce5b186c9a6bace8ec02b4cf61ca13ce5b189c9a6bace89c02b4cf65ca13ce589638ba6a050d7b9117885c99e2794a73ccf62b229ae79117885c99e2f94a73ca732d914d7fc08bcc2642f10ca539ea733d914d78208bcc2642f14ca539e6732d914d7c208bcc2642f12ca539e53986c8a6b51045e61b2170be529cf194c36c5b53802af30d9e709e5290f7ccd4d93800bafad13b0682ee722d66489baa584f2495206f136317de8b53e64bb84af69690a0a6d978ac02b4c765a284f79e29cb52928b4095e5b275ca738bf1818cf674ad42d2b94cf903229a65b9ae4e1b58d41a15d634cef8c1fbd23cfab507e7de0b31e92a1f540edc36f916405ac09218f8ff9a4facb0a72245ee728f23a5791d76c455e731479cd55e4354f91d77c455e0b14792d54e4b54891d7798abc162bf24a2af2e2fd0e8d1b8af17760979fe61c8ce20d9b8349d79dc3f48c0bfa87cd3d255b4973503ea690e6de670bfa2784ebb19ce7baca84d97ea47356a9aea439abb4a6c56d58ea9a16bd3e6c4d8b6f2ba15b03f8fa13dd423193e5d1dd79b3585e93a097b4fde11c964777e7a1dde89a560dd3e78bf9f37e6f2927937cf79a64abd15f474f0ef9f410a613b98eced7a1255bf8f1e76ce4af4c9dcd6c31cb932dc2fa02e99e42583c92d6c8e96ddb837d472f397270d9f5dbba0ed28d82d455389c46568edf399f590456072b7736fb8f2ecd71505e34711c71f69f97ef18a63c3d1e279c77a929281efa622c2f0806ab819e0bbba580e5ea0439b140ab89b50e7c91e65c2ffcd3191e6e2fcb2bed42f2032cf43678c1906d916eaff090c2378a2be91f39bca2fcfaa0b0dbf41152c6333cdc3e7c3add24604d0879bc0e9b04394d829c8490c71f7e1c292fc97fcac1b55709974bdb14796d56e4a5a9a3563d06ca3a6e55e4a5a9e31e455e972af2daadc86bbb22af038abc7629f2d26c139afea8e9439a6d42d35e3b15795da6c84bd3f63b147969da7ebf222f4d7b69c6c22d8abc34ed55a9b150d35e9a31e77f61cca4d92634fb6d2ddbbb633e7f2d07578f122e977af3bc9af279747ec45fe841e72874b9b52e28d457734e88fc4ff1c37f60993c1162472a5fdaf2182bf28bbc781ecaaa67bcb46d17a61bc5cfdb085dc2a63628c62b5122af3a21cf479d3685e84de537866095f4e0f375692d4d5aafc0f2a784e0a2e59b04d9782dda902edd2bda301d6643ea8b287f242ff440bb2d62e556e706edc0db60a208af80fd5fc4cec503f9851e6175d82060c2f258bfb54279ca8f3f557a69be729dadeecb17925e1a338ef0bf35fff81ad639dfe6d091ff9f2c2b6533e80773997da86cba9541712d32f2d707507e3dc3ea2b76866d657589af45ce17b026843c5e87d256d3f9829c8490c7c763e5f0daa3c8eb52455ebb15796d57e4754091d72e455e9a6d62af22afcd8abc34db84a6bd762af2d2b4d70e455e5af6a27d5da5b5d56d8abcfedbebd1a5fd8abc34eda5d90f6d51e4a569af4aed8734eda519ef35db9766ccd1f447cd36a13966d2b2bd3be66b6be5e0ea51c2e5526f9e57938093afadcd11f471c9ef9c6b706d6d811ffe99303b4a8fbe350a368815f9455e3c0f65d5078576f7313f9474a3f8c3da2e7f2ca01c3f405e75429e8f3a9d17a237955feebc58da8e2ccdbfb1fc82105cb47c93201baf451bd2471a7cacad4936a4be88f247b2b686769bc7caf1b535da06e717e115b0fff3d8b9626b6b7c7fdd17f2c697f6f529da57dcce8cb2a47b1d7c6f245df793d602b91fd2eb1b8af0a22f2ea55f529f16c8b6fa1a59277cd9b8a13c4bdd722bf910e5c15f794075a0d7d2eb6a84b263591e96fd0ed1e595795da4adfb585f9edb474fd4be04e5d70bbafae84ba47a95da9db40eac88a73bacdd486315be6ecceb8ec60cfa7a165a7e0ed191c7251a6f6ad8b95fe68d92080afb8675b9a118a4d718487d895b6eff71d550dd463a26a17c1341a16db07e510edd1e8f7ee9f0fcae6aa82e3caed06bddf114924fcb3f79dc20cf07f33c9b84eb8bbd762346e4d13df52b7343cb637de2fd115e86c73d2cff57122b5ec3e2de3441e729219891277db32cc58cafbfe118fec5fa294ff718c47e0a653531bcbc7eb82e529df076375bb04394370bfa8933a9c88fb4a0fc7ac1263ee270d457adf86d1f0f3fee3e5cdca278b12ee70979c80bc778d48768f9b944475a9e1ee3f5f45c63bee2124161cce671581af7d273340e8fc9f36d12f4e1af000bebaf28df84703db7211ff748bf28879fe37224cc617e37523994171d63d27aa5f54e5fbf48f718d0faa0b193b6431e3bb1fcb43c5017bf5f1f32d6a37ddb8cf8f0581b04ac35acfc15a46f3b93b51bba8700eb43aa1fbeef639a2037c6ca0641e15e18a93f429cb545ca3715d16b36b1e97dac4fa4b690ea95efdfc1bc6a412f9778bd62f9f923a8d785f1e1b1d27ae5730b2cbf9ed4eb79ac5ea9fdc2ea35c1f268bda28da43e97d779a97d2ebd7e5a889c492c8fd621be813aecedd67ee74c3d91fb6a3e679aec054ff89c89da87f7d5b3fdd867a0af961e6f95c6d59ee77019692c506cadbcd8586036b1212d4f8ff17a7a6e5dbe6148f342bef6a7315f1b6d5e61e3175aa72e5e75305bf89a47f218315b518e342795c663d4d7691ecae1e7b81c7a3d96f3bbe72d9394c6f08afc53d23d1c45fe6969bd5f8f7f76e09507745d9df7397ed6c99b5ba2f63928bf9e61f5d5e784bd6ad125be277091803521e4f13a945e85b848909310f2f8bddf4ae1b55d91d71e455e972af2d2b4d72e455e7b1579ed54e4b5599197a68efb147955aa0f69da7e9b222fcd767f9922afad8abc34db5797222fcdf6b55f9157b7222fcd76af598f9af14b53c71e255eee988fe5cbc1d59bd3e3a5692fcdf1c4ff423fa4d9ee2b75fcb54591d76e455e27c75f27aedd6b8e4d4ef669a5f1aad4b15ca5c642cdb19c662cd4ac474d7b55eaf88baf75fe378ebf7628f2d2f46d4d1fd2b497663fa4e943956a7bcdf8a5b99656a96b439aed4b73ec5ba963cc4aed3bf87d2c8dbe43ba877a3629e7f9798c8ce74f3065c26c257d8eaa31ff9fde638f15f9455e3c0f65d5335ecabaa5c2740b7b7689b629fee99072da27f2aa13f27cd4e9c210bda9fcc610ac3efdcc1d4f53e4d5c878853dc344796179e9136b523b691264e3b558b7e7913cc5ba4d87d52d8d11287f24cf67a1ddb6b3726b738376e0beb1a808af80fddfcecec503f9f9aca6a0b0ad15db078a72f9b9b0fd6ef342e44c2e53cee488722cebc379e33e2be973bb7ef799b474fbdd67d2d2263d8bacc7bfb95f1a4328e24f4bfd8d1eff6cb33446d1e3dfda86fd13c6349441db56929cd78bb72d99a8631a945f1f788dff03639a24c3c3edc3f7f9a404ac09218fb711e91395d2e703255e8b9578b9c4ef5995c36bbb22afad8abc0e28f2d2d4719b22afcd8abc34dbc416455e5a6d42ea334fb689705e7b1579ed53e455a9bead697b4d7bed50e4a5a9e36e455e9af5a8d9ee772af2d26af7ee988fef2ba54df428f2d26a13eef8e4f8ebc4b4d520a8ccbed61df339ecc95818ceab57919756cc71c77cada01c5ee39478b9a4e9439a315ab34fabd47161a5f6699538b77249736ca2e9439af6d28ad127fb8eff8ebec325cdb995662cdcafc8ebe49ac289f3214ddb6bead8adc8ab52e7439ab6dfa5c8ab52d70b35c73927e3c4891b4f9c8c1327cef6951a277a192fe91dd60981179697ded74c79f0f78dd039c08208bcc2640ff71e87d5b9a1b2e9dae8c208bcc26487ed057469656ea86caa2b5e5b275cd791ff4d969532d94601678cc9f5b45fb22fc6e4a18de8392abf9e6155c633b01f40dabb26ed9bf3bb5f22d91b63fc299ea4601f697f025fb74ee7ffd37741d1f249a2232d4f8ff17a7aeed49a877f35d7d7dc7b95c6e7f9faddd7d3ec7bdf4dabd456f4f867dbeb04bb2bf21f8813b40df0389121e7f5fc20d51c354ea0fcfaa0b0edfa8813198687db87ef1bca0a5813421e6fe359414e56909310f2f8387aa4bcdcf1bc0ac4e5d23e255e92ff578a8e9b157955a2ed5d3aa0c86bbb222f4ddb6bead8adc8eb52455e95687ba9ef2d8717f6b318dbf95e6e973c3fcf14b95fe4efcdf3f59da9189347ed2aed8947db2d16b026589e4bfcfd9cd2387db120c722af12e67ce99efe54a6b9afb539d9d2956dee6dc9a47bd3adc9de6c737f2ad5964ab767db3299fe9e6c5b6f5b3ad39f6e4df7340a72799bf534a7c9466db328bf3e286c233edaac34c792ea0c6d9711b026589e4b1b7383e5785e5c38575584178f23e5f07209dfffed716da1b93128b42d6f677ee60c0f3fdb45e5a18de8392abf3ef0daee43e70cd43ee5ce19fcd5e7e0f3b37eea2c3bf08edeac3ef681e7769acbe79de12790778b3eee81e7995af5796791775bf9bc7bf9096cbfc5be1970a466b00d396acf9729f6cd80b3493e2dff89da419ed7e479a2ec7144368f3be3c979bd369c4e468d3b28bf9e61f51577c6333cdc3e3cee4c16b026843cbede34599023bda73f21e4f17b1fe5f0ba4c91d756455efb14797529f2daaec86b7f85e2daa6c86bb322af2d158aeb80222fcd76af894bd3f6bb157969d6a3a6ed7728f2d2d4b14789973be6efad2d07576f4e8f97a6bdf62af2aa54dfd6ec3b703c81f7e9e9f8917f7398b6a5d94c1efd8e25e58fe3525fdf3c44fe33fcf01f784fcef4a0d0c65427948fe3cca9a47cacc82ff2e27928ab9ef1d2b65d986e143f6f3ff4db5efcdd3c12afe925f2aa13f27cd4e9b410bda9fcc610ac921e53984d2439d21c05cb9f1e828b9647bfa46d1faf451b9e41f2b4d7a18ad5f7e94426ca1fc93b86d06e67b272b8afa92a28b4fd8c22bc02f6ff4c762e4ef8d124eddb1acf788d633a14abdf84703d968b32b7f71307d25d51e312ca1fadb9fdd4887645db4d13b026843c3eb72ff59b88348fcfedcbe1759922afad8abcf629f2ea52e4b55d91d7fe0ac5b54d91d766455e3d4abcdc319f979483ab37a7c74bd35e7b157969fae301455e9aed5e33166ad6e30e455e9af5a819bf34ed75a922af2d8abc34eda5e9439ae3094d7bed56e47532ae9eb8b85aa96300fe4d078d3100cedde8bce9d460681ec5c0bf613e89e44d6558a60ad7b9e479ed62e07effe97ef80fac8dcc203ac5059d507ea3608358915fe4c5f350567d5068771ff34a49378a9fb72dbabe426d508cd78c12799dc8354c6a6bbe86296195f498a26893a98cd7148157d8da59d4ba6d0a0aeb13aff5ec63036b675343ec44e58f64ed0ced368f955b991bb403b7f7f422bc02f69fef092e65ed2cc17895ba7646af1f1722e7b432e59c16518e657d86dbcbb4a15696596c2f137fcf3796bf8bec65da5c3b54477afd842028aaff449647dfe3cffb74babe8ae5d0a79b489e9e4fa706f685617dd28479a710d90d2c6f02c9a37af31467ffa94e2e46fc82f0e5e5381e6a438a8df2a4752dd9b586953f503b88e54de3649e31c293e2c4757d2c8fb6ac0d06f5a66538062cdf4b30bc669cccb3ba885e4d4578de48daf0c15a996720f094f43a85e9c5312418062c7f25d1eb3ee2ecb40cfea7b100f76aa3ac0982aca0c839de362614c92b552eb50f9e9b18416e4cc8e36d89db935e5fcce6bc2d61f963216da951c040edc1eb7d3cc3c0cb9cc23060f9eb050cee076348cf91abaf5fde75f5b5c70ef7052c5593631eeaa5aae655d028f02996d00c0e2dba0be783ffc39a89e48e419173c5aa7d1c39dfdb77b8ef685f11035531660d4584550572e2b114af73c96f9f13fd5900945f1fc8edb643074f8ac779c4c3edc3efdb2504acd2f8082b37ac9fe7be46318c17302482e163c7f888fa8c0b061bf6b5478f5c53accdd13e5c6a73e38ac88f09d707ecda9870ce25e78fb7e69db28ec9556e073dd2bd6c4cd2d823c6f2a8bebcad705fa279b4ad54b33cda5fd4b03cdab7d4b2bc89246f0ccb3b95e48d6579745e5dc7f2e83eaa7a72cc9334d6c33a73f26a62837c79394c4e9f3bf34ab96bffdbe6309c57555038377109bf4b856d9fae59e8b5fd9e24e2c179758da01b955fc3cabf92f4f56f65e30d692d448a691c032d4ff5e67525ad7786c9a67585e318bfeb9f83f69d41ec27e9369de4d3f26f0cb1afb43e1666dfe1d648118fb40e3d83f11acebe2b730fff56ba7ddf7902ed4bfd6b06cba3d879bc936c3f45c025c5bb2921724e2b53ce69829c305e0981179d27c040f8d0757dd76c387274e01555c8929a3560c775ecdc34f69f0f7d271581cae71a7c1ccfb7ccf2ad7033d9ff53047c52421c34712cf160f8844d1d6df551d2d4dfc19abad4b5d1ee08c3255f82a3d7d225386c5ee79372bc199f2fc8a4e7c29a319693e4f06de01708d7c5581ec5704108067a3d96c310b784e4e985b8ec4088bb30cfafd872e612924fcb7f3924c4e13554ff5982fe1c032d4ff5463c92edf1da464176acc82fcae1e778bd500ce78c921cf4ab26218fb775c9ce4b42e4d0eb978c923e895192d3344a72a63139172acab99094691c25397c3981e6f1b826f9e9852172e8f5dc4fcf57d4478ad3beedc61ffdb988e4d13e0e712c1570608cef20e7b56f7953798897db00e5d533acca780696c63a181e6e1fbedcd129604d0879e790639a47e5740a72245e17310c1791eb46a9fed223adbf8bfce009adbf8b04bb965a7f5966d74e2f7a64d3886b595098306f3991cddbc20a92477d852769e90a7572e3a6778f1be4cbcb713c1d240fb1350585f54dcbf17a09abab84703d96ab0b0a6da2581f596ed740d07f2591dd4c8e79926c8eb89dcdbf5882cda95d57b23c5aefab581e6db7ab59de3292b7267fdc14146f733196873af273bc1ee9f5cb19067a5db97da284596a974b993ea5b6cba5829cb0d83c527d24cc617df848e5507d3a999c4e4539b42d2e6372dac97574cb4b6acce035f43a3a47a4d7e2b2720d2bdf326e906736cfb32e28f48313194bb86fac2279bc9dad2679bc6dac2179d4e63c49f1096de1e2d38323ec13787c0a1baf781adf451eafa0fcd11aaf2c65788ac51a297ee3b5923fb5b2ebc2c6f89d27d8e69dcce6bec7f89d0c0fb70fb7f932016b42c85b983fc65883b7110fe6e3cbf1f54216bf901fddbf81af487469436e284f2cdf3d2a312bd512d62fa3ec159e64476d3f285f1a0323ee7a21afba0caceded7d7dcde9feae54b239d392e9cbc682c2d81e17cef1f5c5954279e955ee68eb557e6c9dc5981ecf0df2a771dba56a92b782e5d5903cc4e8fa8c718d43f1aff4843f8afda9fc84507e3dd1a194ba9c100c6d6bd41f71bcd949f2f8ebeca578d429c84908d763393e6ea2e55cdc794cfd5099888f6eb3a4f77b8a8d9b1ecfe28e9f79574bab3456e27167a527d951e30e1fd7503c88bb5ec82b27eef4f7b42533c99696debe966c7773b63f2c8ed0733ceeac12ca9f2794475baff663ebb41477e89cd5a56a92c763128d3b88518a3b7ee2664b3a8afda9fc84507e2dd1a194baf4c98bc6030d5ee347c80b63abd4a757dada0f7f6c83b6b9f92c8ffad3029647e76b741b1e4fc3ad274d691ce4cbcb713de8f891c7b5d11ffb45bf3fc0e3ac9fb630387790c604d25a57589f20f9077dccb55c5fe3630f5a477ced2eea18475a83c2727efbe36c0bf7279a247fe26b23d49f68fbe049f227d4a9d435716a73c426ada5d272bc2d45594b0d8b8b546fc5fa68471dd7068509f32e26b24b5d1347dca5ae8953bb5eccf268db5cc7f2689cbe84e5d176b53e7fdc1484b72b9a873af273616bd56b18067a5dacc82fcae1e7b81c09b3d42e57327d4a6d9761eb98bed6f88b8dc735e4486339292e952b87b6457e7fa6935c47d7c4ef676b4a781d5d13a7d7f2b91d963f93ac897f98cdf3fc8cff4b8f25dc37d6913cdece2e2179bc6dac2779d4e63c49f189ce331e1c619fc0e353d818cb4fbf1a7d8c85f2476b8c258d7dc2c658ab04ac923f759063eeb771e15c986f625d36058575c4ef27963a965b2ae8e3771e9b6de5fd1d4dd2388adf635a4bf24a1d63d1f5c252c658d4e661f7ab7df465581f546fc5fae8e2b12f10f4a7b1afd43116e22e678c55ee384a6a571bf2c74d4178bbe27d465c3817365658cb30d0ebcaedc325cc52bb5cc5f429b55dae12e4f81e639da8b1cf6a4539b42df2f14427b98e8eb1aac60e5e43af8b3ac61a98d39031564d9ea7e7f95ac9b184fb061d47f176268da3306f03c9a336e769b839e08323ec1350a74aeb3bf93a218d177c9d908e7df93a21adb352d709699f5bca3a61d83c558a057ee70fd1c7b028bf3ef0d91606c7b0ab191e6e1f3e865d236095e6ec7c9db0d47586a8f37f1f7bfc3ccf25dba4f5124c92aff17542ea6be5cc09df3dc2f114626b0a8af7efb1a0b02d4599bb487d38d607d55bb13eba799c0a04fd69df52ea181671973a86d51ca74aed6a63feb829086f57340f75e4e7c2c6487c0d815e172bf28b72f8392e47c22cb5cbd54c9f52dbe56a41ce7febd8d2d73a2e1faf7592eb86bc2e8e8d61f1baa863582cff8786419e9bd918d6d37cb8e458c27da3d4712ae66d2479d4e63c0d37c77e70847d028f4f27c758fec7581de498fbade6188baf13963ac65a2ac8a9b431165f273c39c63a39c63a39c60a4e8eb1ca9053c963ac672b8db1be45c658cf3d39c63a9efe8bc7587d51da28955f69632c677afc94e0c1bea39b8e751f3ed4b3aeeffa6b3bafeaddd475cdd1435d873b7b7bafe9bbf65aaa0d6f0d5c5bde0aa4554e773c5f384f79ac89a805f75a5a9ef2408f6f0a0a5bc5da08bcc2644bbd15e5b13a375436f5988b23f00a93bd4e284f79accc0d954d755dc7ae93ee28c48af0e6b2c3f084e1bf44284f79ac0dc17f49045e61b2d70be5298f35b9a1b2a97dd647e015267b83509ef2d8941b2a9beaba815d4723352d27f12e26fb9222ba51cc1b83d274dc2494a73d07469f26418f4d117885c9de2c94a73ccf62b229aecd117885c9de2294a73ca732d914d71676dd169247cb15e34d6587e109c3bf55284f719c1e827f6b045e61b2b709e529cf33996c8a6b5b045e61b2b70be5294ffe62428a6b3bbb6e3bc9a3e58af1a6b2c3f084e1df2194a7386684e0c76ba38ca8284fc5114c6f8cc9433de8392a7fb4465451eba191d9925e9b10f2f82c51aabf1d821c89d71a455e172bf25aabc86b9d22aff58abc3628f2daa8c86bb322af4d8abcb628f2c2188a318dd6eb2226471aa3ad0f9143afe7ab5ef4ba58915f94c3cf713912e6e1562dfec6562db00d4aab1634f6e3aa0596ff3059b5f8679ea7b4a28518253bf3d5bb52ed2cc9c1be86b661bdd8de3cf0a4201d2360c23cdacfb591639ea4550ec45dea2a2cb5eb769647e30cefaf69dcd8c9f2a8efeeca1f370585f6e531511af7d27361ed7833c340af2bd75f24cc52bbe471b9d476b94190e3dbfff90afa064539549f8d4cce464539b42d6e62723ac975349e9d5e37780dbdaed82aecf2dc603e2dff5a12cfcecaf3ac0b0afde044c612ee1bd2b804f376923cde3676913c6a739ea4f884b628751596c66a1e9f249fa80b0adbde89b8d38df2eb83429ff33167186e7d87cf19360a58257fe27dadb426b3519023f1daca3084cdf93cd55f7aa4f5e77bce27d55fd89c2f6afdb530bb6ef4a2477392f7fd34f13e99ea8679748cced70303661b9aa84ea5def5a76d0cb1496351deaf977a77955ecfeffa7b1a6fa6b95d03417fba1e53ea5dff918e37a95d793ca0f5be8de5d176cbfb01dacf62df268d37792c2b75bc49af1fadf166d85d7f3e7e2eb55d86dd8df575d77fb4c6b59536deec2971bcc9effa63f9dbc978b39f8d37a93f57ea7893b7333adee46da39cf126daa2d4f126ed875027cf7d6786c7e340c045d7eeb708f8c36c41fbc7c38d837c79392e93fa2d8fc7d2ba81746f6b3139e67e1865fcb858d023cca7fdf6abd1c7ff28bf3ef0d97606c78f9b23da556ae79b99cd691eef33a57b7b5b0439122feedf61e37f4ff3a56cd4fa43f9a335fe97d68a160b761d8df65dac9e3786e0f1d3f72407de9e17f5deaafba2586d50d886a47bd61cf736c21fcf158b59a5ee05a03cf8dea062388bf11ae95e0097f8de201a97b644e035d2fbf82eadcc0d954d75dd5ae43a5e4ec2329cdebc6c209cc77116ad0bfec4ff165696da8edf2b447daa8a60d842f269dbe3bac484f2123fda76393f5a67788edfff0f9b7b6d63655d42bfa763bb1311a7517ebda0b78f382ddd3ba4f6a171680cb3356f33b4fea47d72eef81241571e9fa262c2f23b85f294078f4f14ffce08bcc264ef12ca531e3c3ed1f685d786b5cb28ed86e2e2f3100d5ebb1478e1f849dab393080aeb6207cba373273ee7da2de0437fde43ce9f087f46f9f50cab2f7fdec3f070fb48fe2cad33f0fe264a993d442e9e73b43722262cbf4f284f79707fa675bc2f02af30d9970ae5290feecf7bc9f5782df6a7d8677e22bfaee1c6711fc91ff3f515ea0f51ee57d33542f407c7ff3321fcf784f0df5b84bf4bf87506ca5ff2679425f9335fd3a7fe4cd78e689bfa22b1db5743e4ae0d91bb2e442ef645947f0dcbfb3ac1f0ed100ceb43306c0cc1b03928e48f6328697d96e64b7bb9f13fd5bdd8188bef2d5b2594a7e356e427ed25e7fb88689fcffbd8f5829ccd822e31f67f6c113db8ed35db069787ed63be20a38695fd45dd20ee1bc83a152d833c5cf2fbb453f43e0be58fd65a41d4e745d076d2731609218fef0f959ead5827c89178ad51e485fb43eb843c3dfb667bd05eb42d6392d63d4bbd6786b84bbd67a6f9342ce6d13db7d89f48b1a8dc3641afe76f03e4cff348bf28879f0b6b2ffc6ddad2d3a0319647f5591d22477a4340a3705db9fa54c213acbede78c89f0aed24d7d17b6613ea07afa1d745bd6786e51f4bee994dcaf3f4fcd47dc9b184fb46a94fc34ae35cfe4c1d4d527ca24ff28f748f168f4f924ff87d9b61b2396abf8df2eb83429ff3d16f4bcf984ab1c6991e9ffd39d877745ddff53bba0e1feaed3a7ae8c8555bfa1e79acefdaa3540dcaba5a5093577f351387e5f832e1ba5c61399a46eb4504a59a0fcb0ff7882e860b490f1e0a4f40338e7cabb1529bb1340cc16bc35e841b567f612fefa5bcf8b619ca3bc9e42c17e42c0f919314307b7e8168c92fd549b23cdacd95faa255d4e9e44b7506eae3e44b758242fb9e7ca9ce5039275faa3332392379a9ce01365518e94b750e92a9420f9b2ad0387322634925bc54076d51ea54a193e4f1f8b45cb8d66fbf1a7daa80f247eb032752ac91c624526cc76b25bf5d468e797c88b2fc4179ad54e4b5429117b631b40dfde02ddad0f937ffe0ad340e6c1764c618665a9ef2e0b7dd9685e8bba244d9d20763280f3eb7a1ed15af6d0a0aedb3247fdcc8fe63be4b75820e2762dec33fecb8c40f9ed00f3b52fb709f8cfa61476aff62755bea871dfdd651b6b951c01530fd69cce62f52a7fe4aeb8d27a9ef419d4a9d8f503bf3711fc5c0eb6309c353acde1341717faab40f4c943a1fa173c052e623d4ae7ccc483f00c0c779611f42933ee0218ddfa96c9a873af273bc1ee9f5a3357e5fc2f4a118f807174a6d97170972c2e2fc48f59130f33ad790237d6896b71f0d39b42df28f047692ebe87ce46d6c6c81d7459d8f60f94d643ef24e361ff1f431dd926309f70dba5ec0db199d7bf3b6416fe1519bf324c527fa11de91ce47787c0a1bfbd0b67722c63e287fb4c63e17313cc5628d14bff15ac99f3ac831f75b695c1be69b5897754161dd2afa47c91f7de72f382fd647f124b573d4a9d4b10f6daf7cfcefbb8ff11caf4afef877a9631f1a5b463af6e16b2ff4c5fcc53e30476369d8b848fac0281ffb943aa7a0d78fd64793c3c63efc4308a5b6cba5821cdf631feef74b15e5507d3a999c4e4539b42df231165d9fa0639f3fb1b10f5e47c73ef45a3ef6c1f2ed64ecf35736f6f1d3ff961e4bb86fd071116f67513f7a416dce93149fd016a58e7de83c95df2740ec3542d90b581e96ad26f5d5923f96d698ce0f86e69d4ff22e64791790bc7696b744e019637c689ba3e5334c072cdf90c7ed6c7953a3ccb32a90630eb6636ca3d447f5da684f12f1740a3a5e48642e653a62f904d1f1adacbdc47383d7a3edf3bb7283ea9c177d520e478e6df7a5e3cd1a2297c7d1b8509eaf95760ae569dda0cda498d7c1785d20f0ba909cc3c71d46ab0d203fda06a8cff03680e567446c0368d713d106a85da3b4015a9eb7810ea13cad1bb4592228ac777ecf449a0bd17651096d80f68fc5dac0dc886d00ed7a22da00b56b943640cb97da06f83cb583e42d67bc2e1478d1be6035c38abc6b03b93fa2fd152d9f217574dfb8a1f8a43e19f3a43e95f6cb31c683ead120e8d1c8f2e8b58eef919aa1f8710c77011913accf1f7bbea73bf00a031cd348e34e2abf86955f2af8458c5d43ed15d6f7847d1c451ad3d0f91d5e5b69f70ef89837ea7a1f1ff3d2f5be4e9647f73b94ba1648ef553c9fc4135e0e136d9b31261365705fe17ed12ee0a57321beaebb85f8452ff30b9f1f69a47559ecd5cdd46f68f91d217eb17a187b71bf08db434af1486b1b78ad5f7b95bee792af83d3b6cffd82b67dbe0e2eb57d69af0fb5094f925fd08f2346f58b5ee617d23a522739c7fda253c04bef8ff0fd5787885fdcc8fcc2cf635f837e81762fe617eb82a198b1fc2342fc427a5c6a3939c7fd22ecf344925f488fb456da6372fcfeadf43a4c694f1a5f33a58fb6f03553fa386ca98fbdd0c7f2a2fac58dcc2fa4bdea51fd622de17b80f905da2e47fce236e617345ef8f00baccb627e41fd8696bf25c42f343f9d25f9058dbd78ad5f7b657b1b05ac98a4b6cf1ff9d26cfb98471f47a736e149f20bfa187954bfb88df985b4073caa5f5c4cf84e607e81f67801f18b5731bfa0bafbf00b7c5d4531bfe0af8bc2f22f0ef10be93556f4d5d0dc2f86fb7416f70be9d3597eed55faeb2df9eb43e9eb87787f11f555f6fcf167e9751a51fd02ed548a5fbc8af9c52626a314bfd844f8f6b0d77060deeb895fdc3f3a7ed18bba615d46f50b2cffe612fd22acbf905e1718d52ff05acf7e51519f71c03cfabaa5d1f08bfb3df9057ede43fad4231d9b521b0c27d3f3ab377b785b2fe63f9b493e2dffc910ffd1fea46498ffe0b52732de48afb5e4f1e60b11d7bf37107d5caace79d1a74f5affa6f55643e40e57472e951a13f96b97689fbc89e5511fe271a953e0e97c123f21c6e7fcdf217dd56f8dccf97f7072ce3f90fe57e6fcbff534e77f7611bff823f18b9a7c1bab74bff8eb49bf1848ff2b7e51c3ea59cb2f3630bf1878cfc5b8c13233985ff879de7fd02f68bb97fc82bea288961f9fc729f985b44622edcd0cf32369ff5813b31bbdb6d2de8fc0d7ada8cf2c67799a3e13d52fe8fb18a2fac50c56cfd23dafa87eb186f0ad627e817ace247e91617ee1e9158919de868bf9057fe523963f37c42fa438223d0b10e647546fee17f4be217fc5a01f7b65bb1a05ac98b8cf48b19dfa0cf70be9dee0487d26aa5fa09d4af18b4c847bc751fd6235e17bff98878fb18de1bead36e2171733bff0f90c33ad87627b50e8de685a7e49885f487b133ac8b9529e15a778a4e7d4f1da4a7b9e98b77dda6ef9fd741aebf91e14293e701fe536e149f20bfa8c7254bfb898d5f3322683d6954b617b509611bea9bc5f60fd2648b939c1d0bce9246f5a3014cf5c010f2ddfc0cacf2318a4f2c8af8695df4adafe7dcc5fe793eb15fdb51b312f2098e2825ef319662cbf33c45ff11a6ab7d9e41cf7d7054279aa37e2696276a3d7d6b1ffbaf64a0dec3d5d28d86bae80a78695df2fd84b5a7b4b107d5caace79d147dc7b4aebad86c81dae8e5ce275ba50284feb066d9660e569fd62de1c92379fe5519f9dce3024040c51f77ae2b5ce9717e6035e535058df3c9ed0b6c9e389e417b43c8f270b0806a97c31dfbc3a249e503b2bc6937ec4bc886092e2c9428619cb1f0d8927525b6a22e778db5b2494a77af37842db255e5bc7fefb8a278b057bcd17f0d4b0f237468c2773893e2e55e7bce823c6135a6f3c9e84d5914bbc4e170be569ddf0b8403fa3b880e5d178b290e5519f9dc73048e381a8f104af3d3e4f66f184963b97c99c23c8a47de9cadcc3bf7502661ff79e68cc890785f69c47f269f96784f8f73c41c7d3c839de16868ba33c26d3788dd77ab6577798bd6647b0d7f322fa7703d1c7a5ea9c177d7a24ffa66d93fbb754a7b47ca9758a364b048531928f25a80fcd61721a0439d49fb80fd3bac26b9d0fff2eaf403dc9c75ff7bee98efcff6489a9a7bba53bdbd7ddd392cab664b2c9de098cbf4b68bb060ff2b3cd5dad3d5dada9547b36d5974d358fb6fcbeee6c7b6b777b4f73b237d99e6acf8cb6fcd6ae3690de9eedcab6247b92ad2da32d3fddd6d6d29eee4e665b7b7bfa7bb3a3ae7f776f4b4fb23d93eaedea6a05f5db465dffdedebe5436d5daded697cdf6b68f7efb6b6b8786d7dfd7954aa5d2bdc9bed196dfdcdbdd966c4d77b5f7f6b4f4669a7b8693efe2f203a40ccac71427e7f9f578be46284f79f0f73ac6c9f53511645729ca8e85c8ae295176ad509ef258cd64d36f0de0b58d821cc45827e054ec93237fae09e5d733acca7852a5d64323b325bd3621e451dd8ad55fad2047e21553e455cdf4a1bc8bf96a947643f53d11ed06cf8d56bb89333cc3b59b6a016b22288c21f85d8fb018552dc8192d5e525ce5b14ab24d3c440eaf2b971a85eb789be336edc8ff4f969722bf771ae5d7075e7d2015567f925dd1763502d6445018f7783b9162628d20c70a2f1ae7c2e21e8f73c3b547ecefb98fbb849f19e5b1b429285e373cbed3f33502ef1a56fe6f6cfd740cd3a323ff3f5966e2e33c2acbf338a285f7c334350a7af37a1f4bf278bdd731cc348f8e9df9779c688ab3ffd416c7df5117e17ea3d446622caf56d003f378bdbb94080adb3d1fbfd0765fcbf2686c1bc3f268bbdf901b8a99f689616395a8fd6ad8181baf6d20e7c7e486f23bfe4bced5e48fb13ec6d2f22caf8ee455e706e5ba549fff5f4de4505e88a386959f9c678ef7086ac935787d42905fcbe40fc12d9ca376e6bce2c2392cefeaaa298fb1d8b890d627efa33dc5a096189347f590e2527d50e8373efae8310c4fb1f62ec523ee5763c9751b7383e5785e5c3857558417f79972795529f28a2bf2c29854170cd5d9a58efc6fb2b4d4cc4fd415d16184fc796ae7fd124d52bf24f904b51f4d1477a9ef4ea5755ecff2681d36b03cda6f8e6379344e200629c6f3f6c6fd9f9f0b9b6bf0b101bd2e56e417e504c3c89130370918789b97facbaa1039d23c2c6cbe3e527d4a9da38d540e2dc3d72aaa15e5d0b63886c9a1636dfaeed4558d83d7d0ebe8fd327aeda6dc603e2dbfbd7190e7dafc31c6124ffd532bf7339aa4be88fb061d1bf37656cf30d33c7abfb8d47133daa2d477a7d271f3589647db0b966b080aeb6827a9a343ac8e3cc5fb66c487b696da15955fc3caef6d1cb417bf6f2df5a561e3f03aa1fc58c176d29c03afadd4fe516a9bbc4d8f6398695e23c9e3316a3cc9a336e169b8fe38eabed443456212cae03189df33ae11f0d25847c7fb7ccd89fb537550d867f1fe2128c243ea2fb90c69cd6b556e685e75046c521f1308e7246cf161b0550bd838dfaa103d8ac9a198c2d6ab781b97b07bb9179dee69eeca34b7277bfa9a5bbb5a5a477d2f403f48ed6f4d36a77bb37de9deaee1e44bf36dba57c5259cb3d3393d2d8ffc6a58f95b48dff124e6c735823c57eef69072b122bfc77908e7aa7343cf49737dba0682e551767dae1023e63590bc1a26675cfe3fb517e585386a58f9dbd81a085db7c0eb1382fcb14cfe10dcc239be06d220946f10cabbfa797a1e23b65baabbf63ac271998c3f3dc7b1dd5e647d465a2b8cb33cda47f1b887fd9134567689af4363f9bbd87889afab76042ab612d7a1eb980e63880ed2b8676d6ea80e58fe9dc487ef691c6a33e9deac644f3eef93d63a9a04dc7ceda2c18ffd069e83c2b10e1d6f52ac0dc1501b61f9570ae34d69df5f2dd1c7a5ea9c177db2d2be3ff4d7e3f8895caa57100cea4dcbf37e759c509ed60dda2cc1caf37116fd4f79d131fa6a86156d581b848fc7f93da1b7903ae2efa8a67e53cfb053ddf9ba645c902bcdabeb08e62f9c9ce71e4fc3cd734bb93fa41187e8fce538be5c21ae13e1b7744ec7fd96fa685c28cffd76383fc7359e44505897bc7d4b7d4d293ee3d26a268fb617ac1bea33c5eebb145ba7fa0a9b13623d165ba7e27d2096ff15e903bfcefa40cd7b93c3b54b5ebf280f6309f7cb8efcff647929f23e10945f1f043ec73ba9b0f62fade5781e3f64c3fa45c91f4f091e5e1fe17546f1212f3a8f5e937bf8576a5f7cbc57eade387a3dbfe74deb38ec5e398f0351ee95d3f6de10848fd5638c57b17541de1f44dd33cac7bebf277e3f31bfa025f92ff77be9bea034bee57e2fedadc0b6cbd7e13af2ff93e5a581b63b30df0e649bd2b1312dffb790b556c91fa4fb961c032d2f8d1da567b006f626b0ffcaf61a982b8c1fc65e8dcc5e58fe3f21f692f41f1362aff142f9c6107b515bd26bb9ec62b168b4dae270b6e56d11cb8fc91f0c370f1b4bf471a93ae7459f66693c47c76035446e317fa1e5a3d4bfe42f09569ed6b714e379aca6721b581e8dcd3cfed3188fb18dc65269ed9dceef70fcd6963f5727d841735c4163b336ffb664b68ddf9fd18e4dbef7a07bde6f9cc476b72237947fc0e4c65939e91a692f0396413d7cb423a8e766cf76ca785e3b18e8e3c29ef3a1f2cbddff40658dd61e7249378a3f6c0f355f1f2e673f361fe79d883aa5b6a6757abc4c6e30af8ae55593bc1a9647fb36d4d1f587679272920f62b9f9e47801b391cff8ec2b2eb83451c0cfefc5e0bdb32090ef51a15d4fd43edd79f9ff95bc4f7756feb821185c334a137ec5fca02a28e4273d4788d77af6d9742c288c4b61f35d37f69b943fbef6e8916bfad65eb5f2d17d3dc78e1e3a72d5f2ae9ecbfb6810e64c024179cc8b91f3c53a657e4d9c94a7a921f03bf06e6d4b2651263a444d50b8e04ce5d7b0f2adf9ffda37e7e1de7caa3fd3d5dfd5dcd5db9bed19f6e6fcbefcb1f1816ff7680d7c3d3962b3ef0789a4812fd505f3b10dafcc0dda72656e28262cb39a94595da4cc1a52660d29e352d8009a77de148734185cc5f2e8a2e66a964703336272011c039b3b9e4230bab496608fb1bc8b491e5f10f631c884f6deee7902909e18148fc3e86bcb735e64a7b043e52fb03c010fbf64624c5e10c8938b4a7df8c575d813f3c73d5d870f6fbae6d0755d47fb561dbbaac7f5d95405cab64a50b158174edd8997e32eccdd96bb2a754fcab7d8f5fc1cca969e67e06bf6bc4af9393ea792ee01fb7e9e21cafb244a95e3790d2719f61c83efe7c9a5101f301b86d5a3742f3f26f092da209d83ae207c79398e479a1b4b63705e5fd27ac970736f6e778bcf1047ad0ffa2c7029f511f6bc0af535be2f85e2431e16a622cbf3ff4ff4548476f9d2bb2f786c97f6698fd67c59ba3f2cad5bf2fbbdebf2bf4ed71d4c37e91eb2b45ec831d0f2d2fb67a47d246322c8a6fd321dead1eb6b83d2f4a7dfc6c36fec49fd5e9ce55509bc877bcee8bfed1d60a5be836f72fed8f8d4be79b4a6f63eede373bc254deda5b157d874dbf923ded71d1b14ee75f059b71e6d1fba1e8e7d0eae253bfdd167ae3a72f450fff5cbafe983b952ef8663870f1fea3fd4770db55cd88884978b1529676174808b2295303a0888bd3ced444cd711991ef827a5ddd274976103cb431b540bd7156b7755ec37ac6c2c846fa390873c715181e2453dead8ef24c2d747cf73aa1ffe625d4d22c7a7323da9bd3b9430203ff4596966cb5762e85d4e8a2fa68f2f15b024ad3c60c236732a3987f6fc7f52a7d61f2ce10400>, "metadataHash": Fr<0x1eef7f2eaafa09e24b0475a918bd7388c4dec305145849f5f84d1b822202b944>, "selector": Selector<0xd9e0e7f1>, - "vkHash": Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, + "vkHash": Fr<0x0abd64ffdf5d26f9e76c5f44d89a59e72b697a293d8dcd308b64b1d10fef9ece>, }, "privateFunctionTreeLeafIndex": 5, "privateFunctionTreeSiblingPath": [ - Fr<0x00a5215d923c08e46ef8298acff37a856da61be92fe1536dd7b4e10cfec9590c>, + Fr<0x0c4557e746c247100779af4a2e4e5eb5e8556261d414978ecc8c775d79957343>, Fr<0x233d10e0c959338e062b1c76fb81e17fcf61643da568eac372bb7feac8bfa357>, - Fr<0x17720805123feb41cde00457a83a9919a315c55d6117267f05edefe119df9a7a>, + Fr<0x256c06f8384f82f77f7ab3eb47b9c467f6f329051a00163f3125041dab91c748>, Fr<0x1a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac937>, Fr<0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854>, ], - "unconstrainedFunctionsArtifactTreeRoot": Fr<0x049fe6a55fa21b718224c0f6e69887dd82e302b6b658c9db0a389672582a343d>, + "unconstrainedFunctionsArtifactTreeRoot": Fr<0x0602a113eb715538d26370d53819aa5d1f653c7f0509a2aa9c5abdc03872a87d>, } `; diff --git a/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap b/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap index 5f68110cc2fa..a8b8bd0dcb41 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap +++ b/yarn-project/protocol-contracts/src/class-registerer/__snapshots__/unconstrained_function_broadcasted_event.test.ts.snap @@ -2,21 +2,21 @@ exports[`UnconstrainedFunctionBroadcastedEvent parses an event as emitted by the ContractClassRegisterer 1`] = ` UnconstrainedFunctionBroadcastedEvent { - "artifactFunctionTreeLeafIndex": 1, + "artifactFunctionTreeLeafIndex": 0, "artifactFunctionTreeSiblingPath": [ - Fr<0x24eb989517d084b2d95f40b9837d5e6d8468dd84e20d6ad727a7617a5eb395e1>, - Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, + Fr<0x1b24ce918b7778f393bac313bc14cb4ca5e0e12936fccdf70cfdbce94d5630ac>, + Fr<0x159716eba9df09d5f0d8271dafcfdfcb4cca12c411a02fd5846c308c9f976dca>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, Fr<0x0000000000000000000000000000000000000000000000000000000000000000>, ], - "artifactMetadataHash": Fr<0x16ad977a85a570bedc6785d159f137035d3bf9891042ee3af20488686aec168b>, - "contractClassId": Fr<0x23ced3716a04d81b58822bc3e1843626aa2884888b1a2d2250e79fb7d41a365e>, - "privateFunctionsArtifactTreeRoot": Fr<0x0624b9dd486acffb15815318ac8eb07814d48ffeca47da1f4de4a733b723a1e4>, + "artifactMetadataHash": Fr<0x3049fd9d18d6a3e6f07206670af0861939fb59708f11c4bddd4019aad0b7f2ea>, + "contractClassId": Fr<0x1a9ddbb308ed22ba60da2f2e98f3701846e4464d42ec98d15f7225fc0568e8ce>, + "privateFunctionsArtifactTreeRoot": Fr<0x1980e713dbcaf8ea2c4343bfef4f6b267ca68a9191a591f71b024b204c6d5316>, "unconstrainedFunction": BroadcastedUnconstrainedFunction { - "bytecode": Buffer<0x1f8b08000000000000ffed5dcd8f64c951cfeafae8aeeae9e99ae99e5defee98a99d9df12e60e07dd597b93402db3266910009c18d5755afec01b36dc6bdacd707d408092410321c015f913880f803cc85131790b9db075bf2d196ff005b96ebedbea8faf5afe2bd7aaf2ab3a76777539aa9ea179111911191919991f9b26ae6fd72b8f857cbbe37b3cf96592f8273967d7abb15df222dcfa59cb5e744cebde744cefa732267c3a29ca96c7573b5d896b7e940afb6656c3d0732ee5bb6bbc8d8c8be1f2cfeb517ff3ae6fdd8bb06c486ed658e93c25303a70adc079c3ca21f23e5a4e55ff656df5fca3e7fede9d3f8ddde93b766c9577be76f5ff4cee7bdc9f9db6fcdbe8215ff1d2adecf3ee38b8be44fbf7cd1bb38efc5b359ef9d27175fec9dff79f274fea5f377b0ee37b765fabf3b30fdf6b64c7fb003d31f6fcbf4567d7ba6afd4b764fac91d9886db32fdd4b6153fbd83b4bf05756f679fbf77114fff6451f3bc374b922f23f6bbdb8af8d73b88f8b7db32fda71d987e6b5ba6dfdd81e91f34b664fa47db56fce2b615df69546be632d67e2dabd8cefe96b82071fe2cfbdbdbadf86da06b9bfec88be66d73b558963f6c6734f7ddd01f09fd0337f43d91fbd72f57f4b12dc257bacb672f57bafc2cd449ff1dc17743740506e38bf90d82e1e4f2d304033f369f2158d3accb247a6b415b2cfa956bbb84d2369c27895e8577db0defa846fc8c59e91f61c2bf639cf601bf46fc441ed68ff8d651f659bf5cc9d32258e372bd1d026b024cec9b7ebe0a78ec5bfb80f74978ce3edf30eb7d44e062d73ad4b7e8b393b6b9da976cfb8da677b64903607582a1de714d207a3f59fcfbfce54a8fa2b3b4ec5f3a69d372f17390d16f026fe189b2ef113e7ec75825cf7ed1ac60efb507ea099f3a3c139ec7d9df2d80b52f37d36a28b4ba0a7e8b68ed2bb4f099b43bed130fb3efe91a2eb5dfe7324373cc4ccb59f6e96d59c259321c0583b1c82afed034ebbe2e7cb57e603341e67acc16fa1d8b7a94d2243dfe03d83522fde158602f71178ddbe66aecb04b7fd0d7e2ac3dfac3a1d06fba913fd1e63616f51f69f30b8bfa59daf7d009fd60d93f6eb9d1ff721c3d02fa16e3872ff30b59e80b0f63567def189edb8b2d7ebfecdc4ff87748565773bf639287f583f38c14d6556415dddd01983dbfe8f7bb0a6fe485306c4757698746ab6991d6ad1b2097d8e32ed4b7d84fe79aac772db6bb6e91964ddb1ede50b9b6d5bdf8c909d4b7381e459aac2716dbbd6791964ddbda6c637b4b5a62db53a86fd1b69e26eba9c576df54dbd62cd26a11ad63a22363bee02cd7f384ff97d9e791c25fe4157fb807cf2dce6f0635e2678c3ebfb947b2a23c22774781edb2811dc7e130f2a32499fb9e1ff8c31ad11759f919fbe00b0abe3657125dbf689ce85acd07bd007a7d4f3e80dd235813602223e683da44d3b6fc65f48ffcbb0a0c7300556c79d75cf535d41bf66f63d6fb8ea3bd9ad26b03e1df31ebb1c8c5da60cfacebb4a6e894f719b06e578175e03bc2904f5de1f33cd2e2fd06d4611affff7eef2ade21d0afe57c8a3cfc8ced714ba1a5adb19fc51e87f0ef90acae7cf988e461fdb0ee6e2bb2761518fbcc6d858f36465c172d81e11c48da7d6cd67d81d7af9ade8e0a64c0fa82e7d8e7fcb6d27e177b86381797f127edc3ff4a3a937959137486756f031cf17fa5bea2f96fd9b363c2415b1e9b75dbf29cf29074c23186edd72ae08330f69396c2a755c0e75609990dd03a5668d5cc7a3fe636a2adcab4e35645dedafc5feb039aad96fb43c6690c0c44d63b15db7657c1c7bc1bc7112d27a1e5a22cce25977df3c4ac1781e1ba146dcfa5417fa3dca90ffd767d4597f19827f6d75382a10e658eaaadd76de69f79bd65149971be8f7eca45d393c85d554fe8173c17c73c8aac531caf4d8647c4cf2832e3f959f4792e9a9e44eeaa7a42bff818c1705d24a7d8da8aac16f5343e227e4691f965e08d73632e9a9e44eeaa7a42bf789960b81e7f25fbce7a4acb59f6197a51304806519c24a1978cc7a3a91f4e47d32499cee2301e0e47de703649e2593f984c837938997b499c8cfafe249a0c7d6fba9c97bca4d0f6223f08423f1a4e06236fd4f766d351908ce27e3f1ef78359349b075ed01fcc13af3f0e67e368bc781cf9d3d8f3e65e3c99fbcbbdd69715da7e309ecc67fe2cee2f04f106c16c30e94751324cc2c164ec0dc341d8f7e683f9245e644382d17441771878e371df1bcffb43cf5fee83bea2c91d8f16d8c9c09b798bffe6fdd9c88bfad178168de60b7545336fe047de643c4a66437f188f27fd3088e78370a18d7eb8d8a25ceae4be463b994dfc241887d3709a8cfdc97cea45c9e26b1c2ff4134c170a98c7e399374ee54d26911726f3893f9dc7c1741286fde15c687f5cd3891ffafd41ec0d46f381177a411844de743c9844a99686d160b0306538190d7d7fda0f160ca251e007b1df9f4cbd304ae281f8d0cf01ed1af9d003786e71fc9ed5889f31fa9a4af8774856dbf3ed1af11379583fbca6ea29b2761518c62c84219f9ec247a3f5718bb41a5bd212ff78156067d967300afad3e1783a1dc4fde964b2c8510e67837834f72783d80f26e1c209e3301c45911727f385d387e345071b4d47e345e858748fb126e7ab16dbfcb2455adbea4fa3757f4b5a628b87003bcb3efd30f26783617f1e2f2244324dc245d05844f7701a87d1229e86137f3c1924e3e120f0a2c170f16c91541e05d1345a586c96847d4dce8716db6c537f2f59a4f58a455ad246891918636ad9673ba7de59f6b7b75b19978db7c2bf639cc67fbf48af0f14bd8aee5e5364ed2a305cab200cf9bca6f0d168ddb148ebae455a2716699d5aa475cf22ad172cd292b9328fdd024f4b5ba9f72c72c9c2bf639cc605bf48afdabc47f4f3c88d3c5391e7b122cf8302793ee1469e91c8f3ba224f4f91e78ed17d08f5f518bea3dcc283cf0add29c95bf037e5b8387788b192735cc8fb2cfbf4aa95901fb8cd7704218f15580486f640dd70d994eff8c69679a14704c358fe9860189b3f41308cb5e23fc7665dbf3cee68fbfef88ce368514e0bebd5723e850f3f633e9accc78a0c3cf6693e7fb780cf89c2e748a9b76b7b3499b5fceeae7cb03d9c9b3db5c8077d91f3bc98873dcb3ebddd4ae8f6dc49f558c1be8fb19cfd08633bdbfe7580b1bdde50745c3636e1d9976f56884d79fb80bf595b3d47fa79fb80b7008ef8c7b00ff86646d36d8ee966d9b6acfd4417a90df61a2bba8cc7edc0fe216dba69faad3acea22e9ef5388be3128fb3a85f1e67b57ca2368fd5c68b0724839637d8368e6b327f34ce6ee6f32cc659f13d9e37a7e52cfbf4762b91dbfc53f558c1beef7a9cc5fecd458b4dbdecbbad71f692c6d95e062b3bce0afe8ff65634ff8ac65937398d2062fb19a5dd683fb62dda8f6d8bf663dba2fdaa8eb3a28baae36c0f60d226b181bcfff28f59c5d4065faf5dad8f3694f36c29de5f6476737b66a27a3fac7ab6c4c699893263f64d9bdb543d5b82739b2a7a427bb09ed067584f6ef275419ffbb75164c6fe5df56c89c85d554fe8173c97c33828f1a56dd6e394453d0d5817469119635dd5b3252277553d75155d68fefd06c1ea0a5db73a2cbf8725fc3b665d972e72e75aae5a3b53aff507a9db35f96361cdacfb4e4379b65740ebc422ad96455aa716693db048eb358bb4ba166971cc47dfe37ee8684fa4f41e96f0ef18a771c12fd26bd11ed6eb6ee459ee61bda1c8532f90e7e7ddc8b3dcc3fa05459ec78a3cb887a5ed4f61db586ee1c17b588d92bc05bfa5e0a38ff11e16f293badabbe016c7f4e5dd1baf9af522b087c0bb6afe4be4ae9aff423d3d2418c6eed70886718ae30c8e4562b763a3eb57be234cdac8cf38d661fdebcae334a83d589fc73acd8f1b057c5a0a9f23a5deaeedd164669bdbe083ede9129fae453ed7ffde45f5feccfec9f91584696b6a2d37c23ac5f85b752f08dff3a892a3c27b3c3047f5e3daea39d2c71c15d6e51c95e07f0b72543fcd686af7607d506d5bd67ecbfbff4cb51c158e85d2a69bd677aa8e85e8cbb6c642f4351e0b8bf22c68471e0b59bff21d61d2467e5614d3af6befa4682ce4fb7daa8e854d858febb1b0497c9a16f9607bae7bcc6d9b755f7c96fd99fdb36cbc64fb60bc649de2585875bf46f454752cc475098e85dedeea39d2c7b110ebf25828f8ff096361487b006ef25637cbb665ed27baa83a16a20d38fe17e530b15f5a5c8b97be17459e5d570e538be55aae22f563396bf285e4e2f3c9bbbf1f7fe9c92cbe7872fed6ef267ff676f2950b6c0692d69ac9e66f103bc1e32b443a0a9e211c0ef745cd127c2ded80615eae39285a2a6a57963e4f532d91bbea544b9b76ee3ad5c2eb4378aa85fae5749376dd42d1151158ff9064b0717d4db740662d85c553adaad7f634153e45616fdbf668327f50a65ae27beeaed00efb6eaf79a91e2bd8f771a8673fb2318dc3fecd458b4da2a7aad338f4079cc69dd3344e60388dc3ba3c8d13fcafc334ee294de3708cf9a0dab6acfd441755a77168031e5bf83a5163ae1ea9611ac8e3a36bf0d6fddc98edafc1e3d72e77b96eee458bb47a1669e14fc0a47f97bd060f6d2a750e01ce3f8568ccfad863d91fc2b2fe29fc3b24ab2bffec903cac1ff6cfa26be210c6f3fd5daea3133d39beaa6d79d5959662401bf1156c82ff8dac119832c452a40b4de72c0fe2df269cb4c8fc167d98d3586efce98337ffc19f982a33ffe1798dd065df39227c3c9aaae1e33c09f1ff6383af959d8f156d29baddd62f1f13857f8764751513b5ad74ed5a6eed38a8d4d55e2fa8d1f75385cfa9c247a3257dc4ed31e6554c942dd1bcb4eb29c011ffbf4ac6444d179ace591ec4e7ebead3a21d9de0d7293faca97dd409171ba9fda2f10bedc93151e46ae5e0e3f88cf8ff5732266ab470aba168ebcf717f2b1d13857f8764751513b5fea96da98aeeee29b26a57b197e9d7da55ec1a2d8e896e7eae601513e5aab1bc6319183311ff3b2563a2a60b4de72c0fe2f3cf20a44562a2762de487fde84fd5d79baa1efda999753b6abec33151e46ae5e0e31121c4ff61c998a8d1c2a34882d73357db9216c757f9948e8937e12a9f1e3ce398f84891b5abc06af4fd91c2e791c247a3c557df3e72a393654cc457f54456cc1b3e0238e2ffa4644cd474d15374c1f2203eea40649398883eccaf76f500663126dea8d73a058647cd51275cb498d8cbbe578d893da2cbbec33151e46ae5e00bbd26e11f65326d8a891a2d7c8558f05ea4b618e3fc5ad7d23191af757573bd4bf1b5aea81f8e893d4556ed6a47eed73d854f4fe1a3d1e29f9eecb9d149c07e9a17137b0047fcfb1bfcb448179ace591ec4ef010ec744f461a9fb61bf2e0875c2458b8955af0baa99753b96898922575e4cc46b8510ff97b688892f022fb9bea8e82747f8aa3b173111ed9dd7dfee900e043f2ad9dfb46b02b59f2b6179101f75c0fdedfa5fc958e9ee0474a3e98ed71982ffab25fc272df8b3731887dfd3cda593b645699fbb0f7be06cc326f0dd64afb4b07db57c31da49daa7bd12c5afac6a3fa95cd4df317fa5e1e3cf0921fe6736d84b3b47253a382ae0833f69e4d2aec391e749bc149f129fe5d20038e2bfb9410769db53dff95c7dd59e94a79323a2bee7151dd177fdda4e8df819a3cf27857f8764b5dc6797f349ed5c29ea47fa62ea9b2766d52f8c622ba1d593ca360feab1818c3d6578650e01ba3a9ce7e2b0a1e86a1f6067d9a7b75bf1b5838cfb397c6d3baddb4df6d57dbe6ddb7af357b4dd1c80f1bd4def797ca1be7a8eb0bc0dc70ec011ff6db8fff28fb3efc74afda243c17cc0bc515ddffe268d082ff1d33db31e50392ef1c080ede17ed924fdd4143a7c9fd6d3928b809a2283665f913f1d4845cf070adced6fd8059ec87c04edd67c8a0f9d0afed74a2e0cb4dfffd3062b9607f15107bc898d93b1e5845aa98707e9b5baec2b47205f112dedef03854ed1617fcd0ff8dd7feda502adefb3def3368c855e93f0ff66835dddfef6e8ca2ff14059c3e4dbba49f87f57d22f353f2bf24bed801aea806d89fe2275eb4a3bb07f687537f9651eadaa7e59f43ba50705f21c923c88cb8bbca6528fc7b6b468feca075da57e9e7ff32131c1ffe792f17cd3988c8b20ae23f5d2e2f67dcaf287bc857f47699f8b458a76c819f5c363a436c65fc7fa01f9eefa8ef9f3404b7ce219be875afa0e2f7976d3de43e5f525d62d5a2fd608867cb464e975d1d2ec9dfe3bcbfef6762ced1c7dd9a2afcdc1f35e3c44393899756cf2edaaad936dea88c7c18659b731f2e735de7f6f18d7b4b6d50bdae622918e6d6b14b4cdb1bff8acbbefc3faf87fc817b4176cb47911af4bda8a9eb597111a04d35ed2753be75ed967db39f7ff6fb1d181b64e4be3d249dbd48d0e9c2737812fb6d198f5f5675ab65d17682ff1340986f1eb16c1b4f968d10b62dad82f7e77acf0633fd4721635921bdb8cf8bc76155be7cdd5392f23f8df2bb921a3e5808be63ea91cb50ce038f68db417eca414bd44aa5d42c0f30f2d56b08fb30eb8f0e610ea2295d987bec37852ae3b56babde4e2fdf9445a3e8a57373f5e69345b0534b51890370f6c2afcb4b949faef2cfbdbdbb170ccc479a0761105c7cc834cd04df93b379ba6de40db7b9352f4d232c7492dde6971428b9355e31dde755825ded51479347f14bcb652cfa2eff845feaec9cc7b8f8e72424b9fd6d6d7a8578e55451bddda3852b417acd94af660d2d2ba5cf1c2b89f96fdcb950c0d055fe468127e2f434efbc243f2aba6c2efbd17ae0af06a399f22dbdab3acaef49bf6e50ac7b67dd3d2b95ce9a1413c519e3dc2c7ef683b79f6cb8d152c2d874833fbacc333e129b63d00d8e1e5665a4d855657c13f205a6d85163e9376a7767e9c217488a765dbf8e8537987771cadb343c7736bcff1d9025f7b1108d73243f04b84e5bdfc963766bf0971e253d9f7a231a6687ea2e579f2ce98d89ebb6a6b1d1efbda6e7897de0711fed77599489be4e1b911dbc6d1652b91c8a3ed236b176ddcc9feb1cd50be43a023cfc4b7343f445db31ecae4aeb5fdf1aaeb8d1ac1b47d163c9b817d85e9885ef2fa3be76a05ff77a0bf5f507f477e2e728aec6f8e728a4b7fbbbd41477939c53fdcb08ea9517d63d67396c6545ffff20bc1da3ebea6578e738e2ee459e66af110b3a657be9047f0e3927ad5f454a457ed90b6963b10dda1ce8f893f9f5b401b48bd9beebf4f36e8f919e698facf3ac7c47924f413ce3f6967d1b6cd2361bc1559f71559d1be3c66b581569598ffd512fe90470be79a3f03c748153949c40000>, - "metadataHash": Fr<0x1a8b89c75f0ad79c19ba53a8bdfcb25bd4f8d33bfa11f1f52528a8ee58fc2543>, - "selector": Selector<0xd9183919>, + "bytecode": Buffer<0x1f8b08000000000000ffed7d698c5c5776deabdec8aeee6615494994284db48d445112a5eabd7bb44c5164935a488a14176da3a5578d60461c8bd43893c52ec74860208693c040123870128c81208013600c1bc8822446123b8963c4880307fe6104486c04fe11c0018c188831c1247ac33a555f7df5bddbef759ddb5de2d4050856bf7bee77ce3df79c73cfbdefbef74ac9ed526afe4bcb085ce362d7eacdff6bbd956947ac5a49c819ec846af0eec1dbff8f37ff1e82fa61c78e8f0b59bcf0976a0bcbe349779f1de59f1d6f62c6d48f6146c0afed6be27cd468e3735fd23295743a07b6d9dfacb7df33d0262d5f076c6b1f536f9f8ffb5264bd4d1f4eb275653677aa91b48a0fdfb90dc33edd88d2af19c35f8983dff2f73371f0e70cff6c1cfc59c37f390efeaae1bf02f8a508fa7fb5899ff861d70cfbb538bad932fc73bdcb3e5dcb90fd3cc8de037e2d0bff421cddb4f05f8f237fcb6e2e367ad67d26f6a538ba9937fc37e2e02f1afe65c0f7f3d999d6d85e8982bfd0d2ffd538f8ad98792d0e7e2be6bf1907bf653f6fc5c15f30fcb7e3e0b7ecf39d38f8ad1cfbdd38f8eb86ffb538f8ad9ceabd38f89b86ff7e1cfcd6bcf84114fcc556fcf9300e7e2be75c8d83df8a3f6b71f05bf1673d0e7e2b3e6cc4c16ff9ef661cfc35c3df8a83bf3191dc5e779e69263d939fff3bd0c4fe68f3d64bd76facffd085cffef4dae6a74d829614b83a54d7b1a4a887daa8a76e7c72ebd3d5f55b2737363eddbc799311429b478c5a06d4afaf7efcc92b1b8c36ba33b46b9b9fdefcf8c6278c369613cdd6d0fb80de6fdce66bb6a7b09fe443deb83fe497b34dafaabd2fb606e45f2659bdd7c525e267f2b07e6cbfc1745716b256451d8f6159f0290b3e5551c779562f581f3a62bde588f5be2396671fbfe688f58e23d67b8e586f3b625d76c4f2eca3a77dad396279fab6a7eeaf396279dafdaa23d655472c4ffb5a77c4ead7b963a3891537efb8bd4f97624ec4c19f0de902fb64fc2d8fd807f4a58cff0d8beb8c5739e9ce3562e448aa6f287fd638b30e7ab119c41a177531c6743cd06fe69f45af7249a39f0ce0237d25e9b6e149d2c5541c5dcc84c66d12781aff49e8f3c6e6da671f9dbbf151426598f4607abb8fe86cef7e28e9d6f7440656427fdf47d786010fcb24c871f35b9fac5fb8716bf366b24d0939b30d4c9c05ccf472de6061fc772b58ec2779b28cda74372e64ad26dd0eb5d968d36539dbb8e0a3b0b61cb12e3b627de088f5a623d67b8e58d71cb1de71c4f2ece3db8e58fd6a5f571cb13e74c45a73c4f2b42f4f7dbdeb88e5695f9e3ef4be2396a74d78c6555bcc465e04adf2e62516abc3e47284ea30513d05fde7c2dbf8d8a7746e3f576ae3321dcb837913267b59394392445f18b40e074ec6c16f2d3c26924e9d729f26337465f5ea7fc3e23ae3b55b1beeaa6f6a91544dbaed92175c0a6ba220d65e6e10281b9f0ac8aafac10becd0a2157562f49301b990fe0765117a2fd1ad34da7a601bccbb08bd97ae652d427bdd1c3239d3521558b6a0e6b5695aeacdff6b3d95c50d9ecbfcb06f1f2c633b70927b33721c585773a915ab43ffd9477507a08ee7e70a60d9fc6c755568b79fda1d0c601e0a601e0ec8795700f36ea81ba7ba7ba00e7d8c8bca316cccd2fe7dbd408eb1fbfb36b7e70396e74edeb7b103aca1f9294fbe6ced93a43d46a8c3facef431c31722e7781beceb5894af2b7b41fd6141b9d331199b6ae3321df3447b3f4075380615aa435fad521dc6528b359647285b2f25dde33a2caeb18d707b9481e763f5bff149b6e1a364ae0819d866956f85725ee55bbde6fa8a8f9299c7dc830ff6a74c7cca8e7c546e667c86a09de541e9c1ac83a5761b6c379ab4c70adb9e6eb4eb91fed9521bf3aee66f75a0cb3196acb19f61e17c43f906e61b6c671883d8362a505774ae365da4fc8e15884fb86e99245aa31f4dbac7cb1ebc2911ff11d13e2de71b9d5846ff48a92df7c9a6c091c77749f93ceb85f78cb00ec78673318ccd63548736334a7568339c131c00f9f0c11b2edbd9c5e9027681b1c274319174fbe734f8e729f2cf48737d6bdd6afd503105f98f12fd3cd8dc53d5363dfb409e75fe94a0c77e87d6f9d6b65f73231597389ee13a88e319ae83787e3a0475a8132edbe562cf54dbb84c67056d93e723e3c1f16da5d129ef909017e739ebfb48a34de735868b4beda7e1879bf866f35c46a01ee95f6b02f0bc6231acbe4339b71657a7b76657b756e7573736e6d6570f117e02bae303eea6db31a0b57691e78099929053ad178d7f99647596679ae7519387f563ba9c4cda7678fdc6eac6a9d56fdcfcecfae610a9124fdcb33a118ebbcdaed8323fba56a2bf87a89db99132556c379cb4c3b4c9fc164c2d57c96410cf520bab1b813a4b53528cf72904a0ac215597482ea457e9af5a8af1748ff2bf9e213f62a0fca384b1067afa90f484e383bad8c8a043fe48374c3cb9cd70a2a760ece7b068c7b41c22d4b4c92122d2f6f8a64abfaca8a991d3b62ac9952449ee290edf4351e4f61ea610281b6262baa46e3b70baf419d8d7f7c63af91d12f2e409ad69e165264e1dec2f871df9e0362ba7e87739f2c12d5bdecebddb910f6eff727a768f231fdc4ab674c7fcf308d4595fcd3fef833ac7a37aaddbef4793ee6275f7036fb6a907a02ef42c99f24feb5351ffbc17ea5036c444ff44bdde0bf548ffd74a6d593eae76f2e75b6438bfd916f270d23d4e4792eebe1c493436b61d17758e633ea7c69ce783fbe3f09ecfe337c8bf4cb23acf4fad94f17e9287f5533065443340f8bb08ce689016cb5d2012d28fd2df59669527651c4fbaddc4732730ae39d796e29a6c6dddf01f88823fddbaabf3a538f22f1bfe9f8a83bf60f80fc6c1dfe050fdcf2195fa79983690c6e4488bc91727844cd7f28634e35f4e624ee9ed907694e461fd0c917e1e8a23cf5689f0519e87847e6c2c1f167586f548f36f9ce691fe21e823d2e36f6b8fd77eb1396055c24c0befd63f2cfa83d74cbfa99dfe4213b722fac373851a37351555457bd621eed0f1127f52f44ded7272dd81405d45f48b977269b940ed0e0acc546fb5a1365e960d29dd84c6e821214725e9d6e5c339b042bc1f11f488b1d2e8e4fd10b47f24075688f7a3821e314e373a79635f1fcd8115e2fd65418f18671b9dbcb1af5fce8115e2fd98a0478c338d4eded8d7c7726085783f2ee811e312f1c6be3e9e032bc4fb98a0474c9bfb2b49775f8fe5c00af17e42d02386bd6aad22e47a22075688f771418f9896735692eebe1ecf8115e2fda4a047cc2f116f94ebc91c5821de4f097ac4b0575256845c4fe5c00af17e5ad023a6ad232a49775f9fce8115e27d42d023e6fdc41be53a91032bc4fb19418f980f126f94cbda8e8b769edbad26ebb305fb5613f4cf02cd09eadb335057232c4fde69b1578856926eddd5726085784f0b7ac4b4355f25e9d689b51d17ed1cd717ad7c7ea660df6605fd0cd0d4a86fd350676da7926ebd96a8df3371fa9d7b5d65fccb49cc71a805c701f5c3b7306685ac5551c7399f1abf59c147613dea88f56547acc71cb11e77c43ae688f58423d67147ac271db19e72c47ada11eb1947ac138e58cf3a62f1bc8371c331feb64e8879aec150ded01a4cb57b94fa392cfa1f5a7b2a5da93528e7146aedfd88e87f55b437bac863351bd2fd4ed7ac6aacd49a55ed69b10e8bee6961fbd09e161ffbc05bf7bcff84471c1ea23a3cb9f730d55544bfd4f18447a90e4fee99de704f8b4f81ce36afc7bde55babf1e932a5abdddf47bfbd76417e49b2b7fbe8bc0fad7411c79fe7a6f3eae211d2c5c39174119a0bd43d85503c7a58d0e36dd58f366f9dbbf1d14bdfbab2fa113f04c727984c9c29a2e33bdb0f65885527ba47e86f73e9ac875e7178941cc3f437d3d7b7a1c7df93e27a5a2a4976e82b515d92b48701af856e29f083d4fcd046bdf977ada7b2d87a80f6cb51f0676639dcfeab66a7d390bc42a177228a0c730beaf60a87149c8afc5c7826777835fee5a47bda8c11520e903cac1f5e4e5784ac5551c76358117c2a824f55d4f10b5f768aa5fca717b9de73922b2dd71cb12e3b6279f6d16b1c13e73e5e75c4f2ece3d71cb13e70c47ad711eb4d47ac3547ac771cb13c6dc2d31f3d7dc8d3263cf5f5b623d6aa2396a7eedf72c4f2d4fd878e589efaf28c85571cb13cf5d5afb1d0535f9e31e7072167f2b409cf79db4bf7e96f5ebff622d766c30f6bab895569d6e1fa681f61e21a05b75bc793eefe7aae090dff601cfcd6367935a047e4af8e3c9632fe372cae335e65c2f2d65da86f283fdb086e61a30eb2b0aa05b1c6455d8c31ad04fa8dfca702b2aa7ef07a5deda5a9fd0aa33f18900be92b82b7b5351de2d6bda30e67423a445f34fe3b7989a1e9ed04d1ad34da7a601bac666025f4f709ba360c7889a05763382164327a1bdf31418f78fcd4e7af340737d5d5f56667f8e587d83ec5ffc3e6e36536e67ccca1defcbbd653999b353f3846fa41de7894c1712f32f717d78c7f99648d153bb73bcaca7b91c785ac5551c763a88e9a1e177caaa28ef3b15eb0bee688f58123d6bb8e586f3a62ad3962bde388e56913ef39625d76c4f2b4094f7dbded88e5a9afb71cb1bcf485735dbfd9ea3547ac3b7d1cd3f2a12396a7be3ce7a12b8e589efaead779c8535f9ef1ded3be3c638ea73f7ada8467cee4a5fbf437efadf522d766c30f8bf7d6504ede5b7b5cf4272de3cd6b71d65cedbdb527e3e0cf86f4a81e7d9b123a2865fc6f585c67bcca49b7de63ac0f55df50fe90edf26301bdf881618d8bba1863fa44a0dfc8bfd775b13a8eacd6df46ff64402ea4af08ded6d674888f34c4d85b533a445f34fe3bd95b33bd1d27ba95465b0f6c83c733b012fafb385dcbda5be3f375334d60d36f24df94c7998d97bad7c167238b7ea807db4f6460e18b45f165c34713adaba526713aee37aa9d98458fdc2a1f420c7ee501f601db62bb5141bb9fea8cf645e8cba7cdbea8a3fb365e91ed633def5c62fccba2af31e61235aecaee4c3f8fc791672d64372a57e17d631e3b8c33f87a16a47f1cfac87109e3e4285d3bd71cb86ad23d37f0eb59d46b0cd45c926eb79f19eeecdb4e7312c4ad26ddbae117ffe3f1787cf1ffa5e1cebea817ffe3633a47a01ee9ff70b28d79a5895911edb35ebb51027e78a6fe74a393dec6d3ee8f300dc73da37f1b62c56714f78e8a3e1f09c86c98f8e65794f97c43cbf03ecd5391ee31c879ca7855485e1e1fee8b1a13b6bbc7841ef2bcf92f4e9c99cefd488bf1dfad37ffe57dd54a5cfbb8fdb8fb76710be5b5b17c42d41996e56ee843487f0cfa88f4f8dbdae3b51b14873166731c56792f5ec338fc31c528ec0fbf022c345f216e55b4671d72dea3fe373e7c8df92899437eb7533e888539268e2b8e3bbebeb09a74d2db7860ec443be4d869f47f1ee2f79f09e47a38b7fde8f0f6b24e08594789feb7606efb71b21b3c4360e3a1c687cf7d1c157c4b449b24dd6761d47c64728e65d05732faf593a0d3eb3427a22ed4b8f2f91dab1b11fd4a0b8fabd1ffd40ec6f5a787b79715c795d71646ffcb30ae7f9dc615f5171ad72ad5e1b89a8ed49ccb635e74cec5f647037ceea63a1c437b4374e8edd371d74cebb9e76a5e33dd13459ef09a09f5c373f56371f4d39aabd5e3ad2aaf8ebc869b55b940d65e79562ef018e810e9f1b7b5c76bff88d64e98abf0de9fc77a6db7b142f90b8e691aafbebd4beb488e118f39f2516b52958fa1af639df1e16bcc07db1b9df293f45fbdf977ada7325b5339bc23feb4ba87e3883fa3f6fbfdf0e75aaf3cc07d759e73e2ec93cf2fe49d738c7f99648d35e76cf7aa453e13f8b490b52aea780cd5ab109f167caaa28eeffdf60bd69b8e585f73c4fac011cb535fef3862bde788f5b623d665472ccf3ebeef88d5af3ee4a9fb6b8e589e76bfea8875d511cbd3bed61db13cedeb4347ac0d472c4fbbf71c47cff8e5d9c74d27acf437e7f2bdc8b5e524575a3cf5e5994ffc20cc439e76dfaff9d71547ac771db106f9d7ded9bd676e3298d38a61f56b2ed7afb1d03397f38c859ee3e8a9af7ecdbf78aff34eccbfde72c4f2f46d4f1ff2d497e73ce4e943fdaa7bcff8e5b997d6af7b439ef6e599fbf66b8ed9af7307dfc7f2983bd43dd447802ef2f318b3861fe9134cb3215da9cf51f1333356affe372cae335e65c272eedb74a86fa16797d0a6f8d321bdd8a7618d8bba1863fa54a0dfc8bfe8bd402f3f4b7f1f75c49a22acd0334c8865f4ea136bca4e2a82b7b5b5b1c54fbb388eed4c686c314618ffc9a4f8f359a6b7ab4477b6d1d603fbc6d3195809fd7d95ae0d27faf9ac4ad26d6b59e7408d2f5f0b9d777b22c0e79e1ef9dc9393cf17b93f8c6de7acd4e776e39e3359588b7bce6461493d8bec873fbfa5720847f967d47ce3873f37af72143ffcc5259b9ff09396162f8cf7b370dd2fde2ecce6cd698c7f39891aff5b39cdb3240feb87cff9d484ac5551c73652137c6a828fc23ae1849516be67d50bd69b8e58571db1d61cb13cfb78cd11ebb22396a74d5c71c4f2b20935670e6c228cf59e23d6fb8e58fdeadb9ebaf7d4d75b8e589e7d7cd711cb731c3dedfe6d472c2fbb4f7f737edf2f36b1e988e56513e9ef41feb537b69a24fd39d7a6bf790d3b888561ac2d472caf9893fee6bd825eb0269db0d2e2e9439e31da734eebd7bcb05fe7b42b8e58fd18efbd7dc8535f5e317a3077dc1973475a3cd7569eb1f04347acc19ec2def990a7ee3dfbb8e188d5afeb214fddbfe388d5affb859e79ce204eec5d3e3188137ba7fb7e8d139c7fa97758570596d1abf7352306bf6f04d7004fe6c00af1deee3d0e2b8d4edeb837fa540eac10efd059c0b49c6e74f2c6be5adb71d1aedefcbfd653999d9b127296886fa4f3929b25e2673ac26bc8bf4cb23acbd33a0fa0ceaea9737371cf4bd4364a848ff23c2bf4a3ce27f0bef574f36f7c1714d23f0b7d447afc6dedf1da37476fffafe2e34ef7d7d2f72a7da3891bf75ccf7cec73378bca56fcf0e796c785de1df15b71026d80e3c40c5cf7f383e9f9bc71c2f897936edb8d112766481ed60f9f1b9a15b256451ddbf8ace0332bf854451de7d13bc54a7f3fd18772a5e57d272ce5fffdd2c7cb8e58fda8fbb4ac3962bde988e5a97bcf3e6e38627de088d58fba57736f2f5836cff2fb37ad3e2d919f67ca3d2ff27bf3627d67aa44fc50afea4cbce9ee8490b54a7569e1f773aa3cfd84e0f345c42ab0e69b59df9a9e9ddf5c9caf2daccecd6f2cccce6ccc2cd636e6e6b7a6a797a66796e7966667b7d6e79636966666b7661667d6a7045fb6d9486b9ab9bc36cb67c023ad418367c0d59899ee6684ac55aa4bcbc5469b8eeb86c5b5a10c2c8e23bd60a5c5deff1d716f617e2ae9d62ddb599c35c3ed67bb909fe908af21ff7212d5ee836b06d44faf6b86b873ce5c6d5cf4c307bbfd7ceeac3f76ebb9a0397fecd63341f3bd63cff205c35ef0977bceb0177bc7dee00bdb7d33e0b79afb3ae6174b4d9aac6f063c02f548ffe4be36e66f37318df724f0e6b87300aefbf9c74c2d6fdc31fe65923556dc3940f2b07e38eedc2364ad8a3ade6fba47f051efe9af8a3abef7d10bd6aa23d65547acf71db1d61db1de74c4fab04fe5bae68875d911eb8a2396a75c6b8e589e76ef2997a7eedf75c4f21c474fddbfe588e5d9c74d27acf437bfb7b617b9b69ce44a8ba7bede73c4ea57dff69c3b2c9fb0fbf4983ff23787d1961e237ef81d4bc4b7bc34d6370f0dff8138f8adf7e4dc9f74eb18fb64fc2dcfbc17e84b19ff1b16d719af326179eb2ed437949fede77e9087dfcda3b0ee2f88352eea628ce9d140bf91ff544056d58f23a413c547ad518cfe4b01b9905e7d6bcdda9a0eff14d479ef43658df79780a7f1dfc93b864c6f0f12dd4aa3ad07d6fd03195809fdfd205d1b063c2ceadcd601c29aa43e648d6f55b437ba3c6bfb38716066356f5c32febbb5b6bf37a75ef95ba4d8b62aea786d5ff49b8858c76bfb5eb0561db1ae3a62bdef88b5ee88f5a623d6877d2ad73547accb8e589b4e58e96f5e97f422d796935c69f1d4d77b8e589efeb8e688e569f79eb1d0731cdf72c4f21c47cff8e5a9af0f1cb1ae386279eacbd3873cf3094f7dbdeb883588ab7b1757fb3507e06f3a78e400b676c375d35d49671dcac0df30bf1beaee2559ee15edd21279efa2754ffe4b71f05b7b230f24ddfac73e19ff29a18352c6ff86c575c6ab9c74eb3dc6ba52f50de567dbc2fd15d44116d60305b1f6720f1375cd7b984a56d58f238e3ab997b08e08acd0de59deb1ad24dde3696d23fb586befecde809e90ff4ef6ce4c6fc789ee74a3ad07d6f7fd195809fdcdeff52fb2775625aca27b67d87e32c0e7be1ef9dc9793cf17b93fdb9d65face98e699759689dff36df4ff6fac8df94b639d7dc4f6879224b3ff87a90edfe3cf733aeeaf1a9df97405eafc7c7aba752eccc6138bd51d04de13547708eab0df5c86e96fec531a23ce95dab84cc7f2a00e5136c4c4b1567a1d25fa7f3dd696e5cf553566093051ce954627bde9722c69f71b695806a3ffb720c367558d3992d1af4a06e67f051bfef5318d99084cd5af83d42f96a14a3218fd7f847e5d07a648637f632cb0b3dac6eb90e095645c63db38945157942feac7ae1dcec1b724ead896589fd83e4be76c4b46ff3b015b9a1232a03e78dc0f900c4c73906430fadf1532a47ab618b27ee31bdf3ab5fa8d9b9f5ddf4ca88cc06f0ef56aa87908a6044e563135a4d29abb308efd1d3213e58e49c6b5ac619f84eb1b9bd7376f6d66286888c02632980d25ba702cb57669893be7e47f16c0f897136db7751f79a639ce9b3cac1fbe6f5715b2aafcc8063734cfb3afa10c07840cd564fbd87120677f2693b661dfbc75e3d32c9bc3395cd9dc6406ff92689f50db92b89696d41fffb0e994e3c4d7d90ed6d5bd6c2b2af728511df6976d857d09ebd05646a80ee78b51aac3b9658cea0e43dd3eaabb0beaf6531daeabc7a90ecf5195e1371795ebd998a5fcbe5e6ae3329d95b43fdf6b762a6d7ba7ad61186b28e95e9ba4e56ce3f6ff66fbb867e167fbeb3593c7d6d5a3a26fc87f94e8cb4d234bc7f729ca37d45e888a692c03d263bf79acd47e6788378e95e53171f73fdbfa7d00f4a7fa763fd423fda1807ed5fe5848bfdbed919a3c6a1ffa01c2da4ebfa71bb7ffef77fd1edd43fda27f3d4075283bc73ba5fb23422e15ef8e04f8dcd7239ffb049f10565560e13ae1f344f8e36f6e7e7ae1c6add62baa0c12d59ad0ef71ba7694fee6d4f7ee0c5179adc1793c1f99e5a3700fd1df07857caa981c585896e164fb62a66eba3a06a6fea364ea6a6ac3e9c8c2256fc1615bdc8233f35a063a36e365c113af85ccd8e8141f3e06fe15d1ae447528c3570232607ba3b310f71cd4f985b8b956887bbe8997b59df91cd423fd7c20c4591becffc3a2ff2c03d263bf4d1ea57b6b3b25789732fe373e7c8dc70565787497f870c8c63ab675a5e7e7027cb0fd73bbd49fea2ef1a9ec129fa3c4e779473ecf03cdd42ef1e1ed04ace3b8a6fcf4f9001f6ccf7ebaecd81f15a763eb8d1ffd7901ea708e33395e1472588cff2a5cf7bee58dfc4c5ed681f12f93accef2b4b6c6be4af2b07e78bba32e64ad8aba47e137d6219fbae0a3b05e20195e8076bb347e333b1dbf17e2c8131cbf17845e8b8edf1ce9b51ea51f73d326d7c9a4bb58dd4bc09b6de114d4a1af70515b57f5e6ef346ffaf16a1b97e9581eb43193ad92748f37d2f1b884c6aa2ada1bdd78d2ad13c7f19865bd26a2ffa781f73cfce6a2746e72a73a1f9b6ae3321df344bd9ea63a1cf715aaab43dd19aa3b0975679bbf2b49b6cd95a8cefac8d7781cb1fd4b2403b6eb754e54322bbb7c91fa53d42e5f147c42b179a7fd513287e6f09df2c1fed4894fdd914f1d684e129f256887475e7e665fbb0db6c33522b6b56de551a2ffb9c936e6df68628e27dd7eb097b1847d6305ead8cece401ddbc659a8abc36f2e2a3e992ed2f874ac407cc258cdf12994af44caef72e72bc67fb7f29517499eac58a3e2b7b555feb440ed42397e3d4e1f73ebdcf8ed568e5f2779583facf39342d6aaa8b357d359acb1db88bf0eaf0afb0ec52fc3c3f31bf68ac4b4bcdee8c434fa5fdd959835bd109a978df7a948bcf3da8ff15739b0c95d1675233dc8babcbcb9393fb3b53a5d9b9f5d98dd9c2b25ddb17d585ce3fdc5d3825ebdcadd74bd1247d77316d3871b6d7c8cdb691981ba5354370a7526633a67fcad6aa7fca723c99f47ffc8bf2ae82f401f8a8ce5a1a4d3d6d01f2ddfac431dbfcebe2ef8d4059faa686f749c37215d1a77fe5bb993a7c987c72cf17e4f56def4fb1477e2acbb161655aec471e77424de79e30ee735288fc95d1675bdc49dadf5a5da6c6d61616373616e6d7e6e2b1447f01ac79d1541ff8ca0375d9f89a3eb19157770cd9a9611a8e3988471c7645471274edc5c98c9a37fe45f15f467a10f45c6322616c6030fac033bc4b2d8aae6f47edbfbe1c736d0e68e531dfad3935487eb353c86c765bbfda49f2fb0877712ea38aeed7eee97fffe00c7d938b6d05e3ba89c40ed7585e604e51ff8986bafbe66635949bac788f7eef2e6386a0fcae8e2cec773f3ec4f58943ff1de08fa13da0717e54fd6a7a27be2a873934deda5221ddb529ebdd4505cc47e3b8ec792f5f1e5a4bb58dd2bc0bbe89eb8c95d744f1cf5fa0ad5a16dbe4a7518a75fa33ab4ab73cddf95246c5758677de46ba1bdeab32403b62b65fc6f7cf81af351322bbb3c4dfd296a97a17dcc587bfc59f9b8071f95cba9b8d42b1fb445be3f538776b827fec8fe761b6c877be2d896d77646ff97614ffcb12666dcfcbf782c61df7815ead8ce5e833ab68d7350873ae7a2e213ae338aec8963ace6f814cab1e2ccabf9732ce3bf5b3996ca7d4239d68a9055f913df7f566be015c14761d9585692ee31e2fb894573b917457fe2ae63e71678bec3a2f228bec7f432d415cdb170bfb0488e853a0fddaf8e3197d97860bf1dc76399635f22fa8fb1af688e6572f79263f59a4729bb3adffc5d49c276c573c6b0b816ca155e2619b05daf73b89259d9e50af5a7a85dae083eb173acbdca7dce38f2415be47ca20eed30c7daa01ccbdae5cdb18cfe06e4581f518e1569bd563896b06f601ec576a6f228ab3b0f75a8732edbad018be4586a9dd76f7327ef1362bce07d42cc7d799f10c7ace83e21ceb945f60943eb54150be2ae1ff2e7b0c6bf9cc4b485760e7b86e461fd700e7b56c8aad6ecbc4f58749f21effa3fc619bfc86bc945b55f6245f91aef13a2aff5b226fcf11dfa93c95649b2e7f752d26d4b79d62e6a0eb7f1c07e3b8ec72ac7a944f41fe796a239acc95d3487f5cc53955d5d68feae2461bbc23aeb235f0be548bc8780ed4a19ff1b1fbec67c94ccca2ecf507f8adae519c1e74ecd2d63ede372be5687761daf8ba31cd6dae5cd618dfe2dc8617f8972d848ebe1c2b1847da3689e6a7517a00e75ce65bb3576911c166335c7a7418e153fc7e27dc2583916ef1316cdb15e147cfa2dc7e27dc2418e35c8b106395632c8b17ae0d3cf39d61f39e5582721c7fae3418ef5fd7207e7589b796c14f9f75b8e959aab7d4af0a3cd5b173f5bbbfef1fa6b9bdfba79f2938d8bab9fdefa78f5fac98d8d4f376fdec4deb035706fd90ad42e67fafbb8b88e186773f682bd16e911c33cbe92745bc5cb39b042bcd56c85182b8d4edee831afe4c00af17e55d023c6e946276fecebabd44edd5128656033ef903c21f95f13f488713620ff6b39b042bccf097ac438d3e8e48dfa3997032bc4fbbca0478c4b8d4eded8d7f3d40e2335d229ec2cdeaf65f40d65be9014ebe3eb821e670e8b3e15d18fd7736085785f14f488f146a39337ca7531075688f725418f98f656b64ad2ddd74bd4ee12d4215d1636f20ec91392ff0d418f727c2920ff1b39b042bc2f0b7ac478b9d1c91be5ba9c032bc4fb8aa0474c7e3121f6f50ab5bb02754897858dbc43f284e4bf2ae8518efb03f25bdb3c1915623a66301b25e267fdc06bc87fb732aabce33045bac4b65551c7ab44357e57051f8575d611eb1547ac971db15e75c43ae78875de11eb8223d64547acd71db12e3962590cb59886e3fa34f15139dab9001f6ccfbb5ed8ae94f1bff1e16bcc47c9bcddaec53be3ed3668836ad70263ff28d13f09bb16ef3531d58e163f4991751a7b277a567c6cae411bf68bedf3ad27053147b0627538cf2dc26f2e6a97c3e42eba0b8b7abd4275186778bec6b8718dead077df6cfeae24ddfae598a8f25ebc16b2e38b2403b6ebd55f94ccca2e392e17b5cbf3824f6cffe71df4f38e7cb03f1788cf05473e688baf139f3ab4c378f66314cfac5d563c7b10ea91fe30c4b3bfd8c41c4fbafd602f6309fb86ca4bacee1ad4b16dbc0975a8732e2a3e992e8aeec262ace6f8a47c623ce9b6bdbdb8d36dfccb49b7cfc558336cb7bfc36b860b4256e54f3cd7aa3d990b828fc27a836408adf9228ddfcc4ec72ff69a4f8d5f68cd9777fc6649af17a2f4636e8be77e2c3c2763dfac0e7374de0f4c483758b04f45effaa38d996c2a17e579bde8dd556ccf77fd23e59bd3acd744f41ff7638adef5df69be897ae57880e37e99ead06e791ec079d6e636956f722c2b9a6f62fbddca374377fd397f2e6a97a1bbb1b1eefaef565edb6ff9e6af15c837d3c277fd8dfeff4eb431ff3de59be8cffd9a6fb29d61bec9b6d14bbe69ba289a6fe23cc47bec685f48379274fb1bdb7692689f451cf6b90b19fcd372aed1597751b463d9d47a3911d74a02e7dc36b25d14b231ee50a01f597cf2c6c213247bd1587842f0c993a7c699bff3af338cff6ee5a979ef4d2a7fba483acfcaf9b00ef95c127c1416c7fed03a314e3e5c9bcb3b7ec67fb7d6896afd7642e87537ec3b6b9c5702f2c499e36aadb7f4a97bb86a1d9d7eb96c2ce9b621756f9ce5be0cf8762d6b6c14ef902f22069f415ac990330b2bc43b74e6202d2b8d4edea8a34b39b042bc43e705d272bad1c91bfbfa46463ba653b26cd76fa64dc475cbe7702cf8cd0297881675c7f724ad3f4319325c827ab43dee4b49d02b3cb45dc653f90e9f335811582abfe4388d39e45ec469e35f16fd8e11a7d53d4ad40fc6a17d49a7aed96670fcd479bcf4f76ba2af1c9ff2ca64f4d7043d62707c42f9afe5c00af17e53d02306c727b42f6b1bb2cb3c768372f17ac703eb4d072ccb9fd4d9a06ad23d1657a90ed768bc7e7b4bc867fefc365cdf0b7f36fe659235963fbf4df2b07e943f63acccca31f2d0bc0d7ced5afaef9d9c3219fdbb821e31d89f718cdfcd8115e2fd35418f18eccfef407b6b6bf3a9cd994f37df789ee6714f347ff33e0efa439efbe2b81769fe90e2d702f86f07f0dfc9c04f8b7d0502f1953fd793ce3a758f4ff933ee51a14dcd83de96037c5f0ef07d35c0d7e622c41fa5bae74086af06645809c8702120c3c5a41b7f28e9f639de2fc67ea3bcf637f67d48c8c9edb10ee9316f353c75669dcf2be19ccf73ec39c1e7a2e84b89fede9fd10fc38b611bcccfece3b8e0c139f7f9725beeff03f78b90c630d212f7a9aafc7396f1dfadbd9ebccfa5f053616a7cb18ecfa1aa67385e157c14d659472c3b873a2eea1cef95aef1937258d4bdb0a2f7e64ceea2f7e63c9fbab53a3cdb6bf3898a45bdda04b6e7b70ef27343ea7fe3c3d742f6c26fed564f9d96a80efb7326c047bd89604ab4ebb53ffdf0a46cac372bf2d3a7756887f7e6be495fbeb17679efcd19fdff807b73df6a62467ebabf702c61dfc05c33cf53b72acfe567f7b0a8f8846f0cd8e959308e4fca27e2be35b1369f77de36fee5a4dbe762ccdbea5956156bd2a38bf68cd1479bb75edbfcd6b5d5eb1f6facdefaf8c6276f6cfef0679b376f6137107a04ae633d96116267742b44f76aa39b0ecb6ebdf0a0a8fa4269126258b850fde050b807669cfb5663bf9ab14a43acad9a165e82df59e3177a493062f12d69c47e96f8bc24f8bc14e0f3ac9039f28b4a0bbfbce759aac369aee80b5dad4f8397f7b4c663f0f29ea45bbf8397f774f219bcbc67677c76f2f29e5fa5a5c24e5fdef39bb054f877b454c038b397b1a41f5ede63ba28ba54a8431dc7a79744dbb8f36afea582f1dfad0fa9a858a3721215db796b1deb4ec26f8e0f79b63f10ebb423d62947ac7af3b7e9063fac6b3a4cfddb3eac6bb11f75b344f29c14f29c0cc883ed59e72adf5c1258467f4ad02306dfde437ea772608578ab0fe02006afa1d02fac6d25e9d6c973cddf53f4b7d5a7a55f3f54f95c1c79821faa44fdb0efe7fd5025dbb4c7872ae38ed1dcdc94902ba1fee3dcc02f86c7b880e3c645cd71d6a7a2eb1ed433e79728038fc773244fd6b8ab186374fdf6c18ca2eb1e5c6b1659f7a05e3937c50f1a703e89769be7c3936a9d80bcb1cefac8d7781cb1fd6ead139ea3fea00cfc0189a276f982e0138af33bed8f9299c7dc838ffa702edb8f071fb445fee8611ddae1bae78189761b6c9777dd63f4ff18d63d0f367f47fe3870e158c2be81fb126c67b8c667dbc05b85a8732e2a3ee1478577baeee1f814ca7dd0f6f622f731febb95fbbc40f264c51a15bfadadf2277e31bccab14e093e0aabdefc3d9e748fada37f14fe883dbfb03d6b8ee2a2ecbcdefc5d34f7417be5fc3ff61cd36f1f332f9afb606cd969eec37b3cf8a181ac0fe6612c0de545ea83a99cfb145d5360fbddfa087428f7e10f3b14b5cb17059fd8b90ffbfd8b8e7cb03f75e25377e453071aceb1707f02739f7729f7b17698fb605bce7d8cfeef41eef33ee53e71e6dfe2b1847d03f322b6b3bc1ff1a8c36f2e2a3e992e8ae63eb84ee5fb1126fba8a0fd0ad519ed0fc178fd5cf3b7da635a4e3aeb96a1ee79aafb0ad42d51dd7302b34438687348ff14f5c1e83f6dca9deaf2bb558d3994e89863766c368a3eea67a3eb3593a72efaf83cf07c91fa68f43f027d7c8a7288e146bbbde9bef9d68464a411a53fd3a91cdfa363c5986f8e025f8ea3c3829ef74aeb821ec7c674a6621ee7a75f1158cfc3b595c6edff77cb064c3eb401f419b601a3ff899c36607add0b1b40bde6b101a4671bf8aaa0c7b1319d5593ee713f49586a2d8476d10f3680f363960dfcd59c36607add0b1b40bde6b101a42f6a03bc4e451b7889b09e17583817ac90ac863d96e8f908e72ba4ff5918a3ebd54ef9d49c6c756a4ec579b94418d88f09d18f29aac3b629ee6f8d76ca6f39dcb72127f865cae122dd3b6ebd2ac1721a957722ff51a2fffbc22f4ad406f5159a7b421f7b51390daeefac6dbfdd3be09c37ef7e1fe7bcb8df57a73a3c5751742f10ef553c93638f046db3443c8d07fb0afbc5929017d742bcaffb4fc12f7e83fc22e64727712cd55e34fb0dd2ff8b805f9cd9465fec17a1b3aa288fdadbb0b6fdf66146de0747db67bf40dbe77d7065fbea4c11ea848bf20bfcd8635ebff88d8cfb18c603c72a2dec1775212fde1fe1735eff09fce2f7c82fe23c5ed6f60bd37b965fbc9a74ca6cf4bf1df00bf558169e1161bf087d6e49f9857a74b6df1ec7e3fbb7e7a18e7d06cfbef19e293e42c37ba617a1aee8e335f8f85f5ebff83df20b7526be0ed7427ef132e0fe2a3dbe6dbafb03f08b3f21bfc07811c32ff0553cca2fd06f90fe7f06fcc2f35360ca2f30f6f2270be2e86b6e7d4ac86a45d93e3f5ae669fb56878fbda34eb828bfc0c7d5f3fac59f905fa8b3e675b816f28b5700f79be417a68fef815f54276fffb671c6bec7f00b7b2d46965ff06ba95aaf9e6acaa9fc42bd2eeb3c5c63bfd8ee5360f5e6efd0a7c0e2ea6b7e664ac86ac5eaf05507fc3a547ccd11cf17795fcdcf8f59abd776e4f50bd35311bf30db2c114fe351c42f5e075c7b4d2efbc5ddf0998563bbe3171bd6371bcbbc7e61f4f715f48bd07ca15e4b98d72fac6d64bfe8abcf52581dbed66937fce25824bff831fa5412cebbfcead40b3979467ec5e73adb7a96ff5c847aa4af05fc27ef6b6843fe86fdae377f873e91b997f146bd3e93e3cda2d097daff3e0ffd49cb48234a7f36d5fe378edb28f0dd6e8cd2523426f2eb9d704e7e9dea429f92aa0b4cfc241aaff94fc15c7595e6aa7e5df39f0df8da60cd7f67aef9afd25ce5b5e6ffa3fdb77fb35fbc037e71fd0be217ef0ffca2557e50fce27a24bff80ef985f5f387c12f7e82fc22ce7b05da7e8176affc025f8584f49f05fc42ed91a8b399213f52e7c72aa4376cdb6fef61e07d2bf49997a8ced367f2fa05bef721af5ffc04f985bae755876b21bf380bb81be417d6cf9f04bff859f28b48af629c651bcef20b7eb5a4d1ff54c02f541c3905d7d82f941f61bfebcddfeaf573fc2ac338fa9a5b9e12b25a619f51b11d7d86fd42dd1bdca9cfe4f50bd35311bff859f20b75efb80ed7427e7106701f21bf38d9acfbbbe017bf487e81670b62f8857aee4b9d15e0f3013f1ff00b753601cf36b15f849e154779d473ead6b6df9e2766db47bbe5fbe918ebf90c8a8a0feca3ac132eca2f4c4f45fce217c92f4e120f1cabb4b05fa8771ba4b83fb3eff66f1bdf2ad03d9e74d63d007547934e798e0979907e82e89f001914bde18d12fd3f03dbb7336f667fc7a1bda3bfae99cc4f824cc3a25fc74966a3ff97017fb536a8b7c7e01afbeb93821efb6df254486fd8769cfef6d5d774ebece953425fc7843ca344ff6b39f7deaad09fb48c34a2f4479e3dc5711b05bedb8d515a784c9f12f43836a6b32ad1e3f85adde350779cead0671f2019aa4286bc673dad6deacb3fdd0c7895a47bbc399ea06d723c517e81f41c4f9e0419147d966ffe4e209ea09e1de3c996c9fc34c8a4e2093f8762f4bf1b8827ca962a708d6def69418ffde6788276696dc7e9ef58f1e484d0d77121cf28d1ff5ece78720cfa9396914694fec87882e3c6f124344669e1313d21e8716c382e9c80ba27a90ee3c95354873efb04c9a0f281bcf1c4daa6befca3144f90eecbc4f371c113e7d2d38ddbff8f0b9963dc7bc298339c74ebf309a847faff1df0ef27441fef836b6c0bdbc5518ec918afad6d647dad85f4f5580e7d7d37a77f4f407fd232d288d29f75e5df689becdf6a4c91bee8989aceaa49778ce45c027de871e23321f8a03fb10fe35859dbd4872f357d38d5cb9952679b21c06b56b5ec6d18ae3b8e4fee4f84d8b532c9ea2c4feb3d1ac349b7be513ff6db74372264ad525d5aec9de02551372cae0ded325625e91e6fb679a59be1001f1eabb44c89766c73acd37af3ef5a6f25f73b2b8d7f3989ea03d3a1f1537a35dd8d0a59ab549716b69351c16754f0f9a26059fbb4b03fa6c53e273645b4689b1c03b7b3557b8f421a5b31965692ecb131de63cdbff1faa8907794e84f342752f38f7d246bbdf977adc772087013e2352efae7c8bbf58cdb58d25da644bf79dcf7431d8fed38c98c7565a8e36f406019a6bf511729efbb0eb67199ce8ab29112d58d897e581d8f7b5aaa49b76d8f521ddaf618d5616cdb4775e84baf373a65c6397138e91ebb3c730762f0bb58550e90fa1c8e570272d69b7fd78a96998df585cd99c5a5dae2c2f4ccf206fb00f6857d9e6d8fe5629ce100765560599c34df433b2e257e7ecfbe80321a6f5cf339aec373bf4fcdf897936ebf8d3127abbc1bf5c3316652c85aa5bab4588c2f89ba61716d28034bd9c3002b1b2b2d9c77f4823518c7c1380ec6d1671cd5be6299f8a8783c11e083ed8d6e4ab4e3790efbeabd7f8efcac1f780df9979398f36e7b9e9bcca957d3dd9490b54a756961bf9a127ca6049faae0c33637c0cac64acb40f703dd7fd1b06c0e5079f44ee71a6c3f19e053ee914f59f09912ed4a19ff1b1fbe96157b7bc1b2fe1f001ad6f301c2e26b213d1f20990f38c86c581547acaa23d64147ac430e582a6f2b531dda92edbd589db20dabab04daa14e5fa6ba8380c97b50d8e7579aedf66e4f22ffbda93b614f42c5f37e5b6bdcf9eb83fc3677a7ac0f780ddf4bce15036bb7f2843b2deff941cae32c26a0cdfbf9e0dc62de9860fccb49d418351df22fa557ce01b12de71a69e1b553d13c14eb5e1d60ed19d60547ac814d0c6c626013039bd80e6b6013039b18d8c4c026b6c31ad8c4c026063631b089edb0063631b089814d0c6c623bac814ddc593611bad73e4eed4a89e7feea46eee7938c7f9964f595a7bddfabf4aaeea7987e2a71f43357227c94a722f4c3f7e779ecd27f76ef199f7745fa0af411e9f1b7b5c76b7fa1c988ef7fa785edf6a0e80f5e33fda6f7cd7fa489bb5be738149fc91ef94c0a3e9ee745aa0199d57da329ea4fd1fb46ea9e67dcfbc5615f50670242b616a23f5490feb0a09f08d0df5510ffee82f4f714a43f5290fede82f4f7097a154bcd1f8e421dcf43f7c3f5bd98878c7f99648d350fdd9f74ebeea8d05dea73f61cd5479bb72edcb8b57913e546acdf86eb588fc568f8ccd828fdcd675f2a202b5e3f9871fd50c6f5c319d7efcab87e77c6f57b32ae1fc9b87e2f5db76267bb8c969fd97c85ea79be301f507a4d8896c7c3fe6659bdea9388d8def589a0576ded7ac8b66d5e441be6f7418d43bb61718de7456ccfbe511658ca978d7ebbb36ffcfc28f29ba0761319720d0bec2cded88ecffd85640ef5519dab50efeba908bed6969f954e8be926f5d37f70a093a7e163fe8b6dcdd74789feaf54da98bf403929ea86f34894398f4da8b9b49a648fc11e3ecbba55227ed60fbc86fcbfe8cfb2f23aa65f9ee91b600db0065803ac01d6006b80f5838dd50fcf8ef0ffc687af85f663f3e4b73be5a3d651dbad23be4beb08d37dde7584d12fc03ae27b817504bf0357e966b7d6188a8fed616ca7b7b14aa73c21bd210fd6db97416fe3954eb9f609b94ad49f9144af87f7113fa39f027e8f04f8d9be9b1a4396458d05beff8ac70edf67a9e85957467fb829af7abf34afffebcdbf6bbd9535150faca8755689eaf09e02afcff8fe23d6e17db011aa43fd8f52dd41a14793090bef05a20e53fd9e9e6ae3325d423c71ecf8f99a12fd8d36c6cf8fee17ed949d627cb43613497e5fc4bd12a43f06be314b3c27054fe3673a1a4a74cc3cdbb8fd7fdcfbaad39b26cf41d17fb4c30af5dfe84f807ff1bb92d5fd29b567c832203df6dbe451f725f9396cbe87afee3b2a1bb276389e6c23281f8ed94ae3f6ff3c0f60dbd03c90650b6f3471e39e41985be071435b50fa1b25fae702b6a0ee13876c41d94ee89eaeb2d5106f1c4b1b37d32fc6c318fa55e70e942df3b9825301fd2adf09e957dddb5567254cbfa8d34384b59d7e4f376eff3f2edac7d0afdd33cbd22fea1fe95f0be857e92ba45f752f1cfbcdfa45dd1f26acedf4cb7345bfeaf7f21eea17e3d76192cf62c75b3097ff24cde5185f783d827de7f565c8d7d3c26b23a37f0f74f5dd0c5d0d6560b23ddc0532c5c81dee167dc4b1b82be9eca3d1af097b303de37703ec5ae4ef826ca9ef06a09d8d025fec5792b4fb8df479ceafe0d898ceaa44afe63475bf107d88e7b43831a16d0338c62a7fe49860f49fe4b401d3eb5ed800e6226c032a6e85bef7a36c06c7869f9147fb3848586ace47bbd86d1b50f302ca9c352ffcd99c36607add0b1b40bde6b10175ae2befdc653aab26ddf900ef1ba83509ce052b24abe9702c09e7d59cdbff25b18fa2f62ad97ed57b35707e0df563276babef1638e3803906ef1bfd34e4024f543566d67aed52a3939e63755a4e030d9fdde53162fa2992d9e87f26b0d715fb5cf64ef70ffe66c1fd83d0199aa2fb07a8778ead8ab78aadcc7b2c29d6ffbf1318b338f1ba3d662a5eab751ec7eb6f17cce34363b65d2c347942eba4500c35dd85fa8718eafc7f29e93cdbb59d6d9c6e74f6d1f8e4b50da3ff87c236b2620acb7536870cca375886ef0464506b9bd0d97afb1bbfb58163c0df4031fa5f0619de6a0e50bffbc83fd9431f41bdf35e02f34e0bc6b24a06efb10cfaacfeff4a20aec5598fb6c76ca7ebd17f13183395b787c62cef5aaf92748fd3dd84a5c6ec74a34dc363667cb2f287acb5d87ff8028ed96feee198a1deefa63ab517c572e5ddefbf07dac7d8cfb367004633fa7d0fd423fdefe45cb7992ee2aedbe616d5ba0dc77414f862bf92a4dd6fa4cff37c108e8de9ac2ae8f91b4a6a0e407bb518bb973680369c6503bf9fd3064caf7b6103a8d73c3680f4456d80f7f08e405d563e8458a13d3c9c1762d8008eb1ca53314623fdffca6903a6d7bdb0818ee775816f56dc47fa3ccf15e2d8f01e08da07e7632ab70bede1c59987db36a0e66194396b1efeee17602e08ede1a95c21b487b75dae603acbb397afd69368176c03381e316c40ede55744df387fdcd7d4777fdccf291e0742ebacb4e4d9cbc7b1319da9bd7cbe4fb8dd7abe1f6c40ad2bd9060ee7b481bd8c03a1fb39ca068adecfc1b109ddcfe17d5f751679f7efe784eff3a3cc596bff0773dac0eedccf293e1778dfcfe1e7e8d03ef85e0fae15f12c5ad63d08e499f77e099ea5b56742bdbfadbab9b4bc515bdeda5c9d9e9e9ed9a86d16f9b6aaada1f18ca8ed63a873c7fcad653bcf87d75137bccf68f4f3bb733e587e6b99cf3bef833e0c933ed27296fa60f4179b7d486997aa9d3a1b231e5887fa1ca2bafda407ac43b94ddf91bfd1326bf2ab33bb286bd699dd7acef83406fd49cb48234a7fe6547cc2f3f11c9ff23ed3cb7a427a1c1bd3997a470f7faf5a7daf7d3f5c5b21594d8763891e23c3e3ef9ebf0663c4f79bd16ff8db46d877fea6f5b0e06b75182bc641e6af534ce098546ffe5debad2caa6747ac4c09bd95a80efd909f19e067ccb10eeda0e837d04d1745bf81ee1187f0f986efcbd7e8966b2ffc16cf2cb2dfaa675e42671cf3bef7429dc360fb56734d119f49cb0af1437bb1b1419f89f1cdf6f5b585b5b9cdb5f585e9b985d9b9dab6df6cf7e63f37bfbab8beba383dbd3c37bd39373dbfdbfc37d7e69617d796d7e76b9fa757d3cbb3bbcd7f7175e973eecb73ab730bb5f5dae2c26ef39f595a5a589e59fb3cabdf58dfda98dbf5feaf6d2cacd79667a7375657173feffed2aef77f6363737a6e7a717969736e6e6379d7ed6f7e636da9b638b3babcb1beb0313bbf5e24af2f259d71232d78ae82db87720ec4e0f7ffa8793ec47bc8917729c07bb420ef31418f182bc41be3b1b59d127c4cc67121a7e7fc58227ed60fbc86fccb49f77ce428cf74d17150cf2af2bcaad6a8a1f11b137c1456c9118b9f05456cf455bbbeafd1c9ebfbffc335cb6b2cf7da8ff454370e75238d36dfb4949b7fdb1a97b14c8e51a2ff36ac6bd332066dac7d55f01f23fe1d728b6b68878c352cae197daafbbf0d3910c640b6a90efca43b0776b4ff85bcfe68fccb89b6f1ba8f3c2d7fdc47f264d9b65a0771be8a6bd18b8d361dd7a9b5eb500696f2c75eb0861cb1861db178ff06eda4defcbf56acccf385f18c3eec109fcbb25a875951eb61e513a83f2c2877faff5881e7dd71ccf97d1e3886fc4e119cd327a90ee3049f6d5631be94748f6b28ffaa66b44719b05d29e37fe3936cc347c95c49744e80f20c89fe0c05f80c0b3ea13c69a7fd5132f3987bf0411a9eeb471cf9a8fd74e3833915bef3e43fd37d0b7cc788ca69edd909ded7feefb0affd5f067b72df2fdbedc91d2b109f700db09fead05e8c6e22e91ea3df8731fa631aa348f17edee4c3e77886037de277dbfc81b817109a4b555ec23220bddaeb567b9dd6b65fe747659b6cd3932433d6e1d9018e5178cf1375c265bbf9f819ba9793082cb44d8e49c68363d24aa353de51212fc63af73db799f5f9d5d9f9e5dafae6fce2eac2e2aeef796e7dce756bb1363fb331b739b3b1ba1d7fb52ec3fdf9b4d8da0ed77e486f78a3443fd4bccf90ea7b84ee398c0a7e29dde1005dd13971a4d1794dad0971ad6cf4c6bbdce896d1ea26a06e94f84c36ff467d2196c9314af4d566df6d4c707d6bedab82ff7ee2df21b7b8c66be509413f21e8bfff0eb3a68cad7778016feff5e6f779123e5e63d9cc76b2d6f15979cf91836d1e386f64e53d7c3fdfe89f017b3f0a63c971c8faa6eeb1712ecdfb0b5897758f8de78c96fd273a9fa937ffaef556727f8fc2f89793eedc2bc69e45e8fd7509e83cf25988d6f333ea1ebfbab7989ad081a47bcc503ec3c2b5c399c6edff957df1d995a27b95d89edfefa6724fb5bee27b9a6823bc47a4ee5b4e24e173479c2b64e599bc879b770f9f73e959f0fb6be4f7fb8807d6a97d26755687fd1e6d81f78138afab37ffaef5565ab68bcf9e2a9df23b098cfeb9a65e54eeaefc41ed83b10c48afcec1a867c7a7485f5371f4d53af774601b7df1b3bc46ff52405faafffb02fa0a7d174ee94bbd3f8ee5b5bf552cda2d5bdc4eb76c8b46ffaad0ad3a9bb21ffa9396914694feccabb329789e0473ac2c7f097dbb2bf44e3215abd5b95615e33956235f3e478bb199e33fc6788b6d184bd55a0ecfaa1da19c1465ec652db5bab8b93cb7303bb33ebbb5bcba54dbf6fcc0ff079d95f8872bc10200>, + "metadataHash": Fr<0x1125672f40d49b4b192a803a41ccb3ddacec4da05bf7d535224059fa9bf766cd>, + "selector": Selector<0x111cfcfc>, }, } `; diff --git a/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.test.ts b/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.test.ts index cc32b4d042c3..ff57600b19a4 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.test.ts +++ b/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.test.ts @@ -1,22 +1,16 @@ -import { computePublicBytecodeCommitment } from '@aztec/stdlib/contract'; +import { setupCustomSnapshotSerializers } from '@aztec/foundation/testing'; +import { ContractClassLog } from '@aztec/stdlib/logs'; import { getSampleContractClassRegisteredEventPayload } from '../tests/fixtures.js'; import { ContractClassRegisteredEvent } from './contract_class_registered_event.js'; describe('ContractClassRegisteredEvent', () => { - it('parses an event as emitted by the ContractClassRegisterer', async () => { - const log = getSampleContractClassRegisteredEventPayload(); + beforeAll(() => setupCustomSnapshotSerializers(expect)); + it('parses an event as emitted by the ContractClassRegisterer', () => { + const log = ContractClassLog.fromBuffer(getSampleContractClassRegisteredEventPayload()); expect(ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)).toBe(true); const event = ContractClassRegisteredEvent.fromLog(log); - expect(event.contractClassId.toString()).toEqual( - '0x1c9a43d08a1af21c35e4201262a49497a488b0686209370a70f2434af643b4f7', - ); - expect(event.artifactHash.toString()).toEqual('0x072dce903b1a299d6820eeed695480fe9ec46658b1101885816aed6dd86037f0'); - expect(event.packedPublicBytecode.length).toEqual(27090); - const publicBytecodeCommitment = await computePublicBytecodeCommitment(event.packedPublicBytecode); - expect(publicBytecodeCommitment.toString()).toEqual( - '0x1d7d509f736d09975b88d01b5779a6f52e70905ba9294776d4881e811e6c1e9f', - ); + expect(event).toMatchSnapshot(); }); }); diff --git a/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.ts b/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.ts index 0568ed6590a2..e93058174433 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.ts +++ b/yarn-project/protocol-contracts/src/class-registerer/contract_class_registered_event.ts @@ -1,6 +1,6 @@ import { PUBLIC_DISPATCH_SELECTOR } from '@aztec/constants'; import { Fr } from '@aztec/foundation/fields'; -import { BufferReader } from '@aztec/foundation/serialize'; +import { FieldReader } from '@aztec/foundation/serialize'; import { FunctionSelector, bufferFromFields } from '@aztec/stdlib/abi'; import { type ContractClassPublic, @@ -8,8 +8,7 @@ import { computeContractClassId, computePublicBytecodeCommitment, } from '@aztec/stdlib/contract'; - -import chunk from 'lodash.chunk'; +import type { ContractClassLog } from '@aztec/stdlib/logs'; import { REGISTERER_CONTRACT_CLASS_REGISTERED_TAG } from '../protocol_contract_data.js'; @@ -23,19 +22,17 @@ export class ContractClassRegisteredEvent { public readonly packedPublicBytecode: Buffer, ) {} - static isContractClassRegisteredEvent(log: Buffer) { - return log.subarray(0, 32).equals(REGISTERER_CONTRACT_CLASS_REGISTERED_TAG.toBuffer()); + static isContractClassRegisteredEvent(log: ContractClassLog) { + return log.fields[0].equals(REGISTERER_CONTRACT_CLASS_REGISTERED_TAG); } - static fromLog(log: Buffer) { - const reader = new BufferReader(log.subarray(32)); - const contractClassId = reader.readObject(Fr); - const version = reader.readObject(Fr).toNumber(); - const artifactHash = reader.readObject(Fr); - const privateFunctionsRoot = reader.readObject(Fr); - const packedPublicBytecode = bufferFromFields( - chunk(reader.readToEnd(), Fr.SIZE_IN_BYTES).map(Buffer.from).map(Fr.fromBuffer), - ); + static fromLog(log: ContractClassLog) { + const reader = new FieldReader(log.fields.slice(1)); + const contractClassId = reader.readField(); + const version = reader.readField().toNumber(); + const artifactHash = reader.readField(); + const privateFunctionsRoot = reader.readField(); + const packedPublicBytecode = bufferFromFields(reader.readFieldArray(log.fields.slice(1).length - reader.cursor)); return new ContractClassRegisteredEvent( contractClassId, diff --git a/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.test.ts b/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.test.ts index 9dd2cdd9a8f3..18e0fc995e00 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.test.ts +++ b/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.test.ts @@ -1,4 +1,5 @@ import { setupCustomSnapshotSerializers } from '@aztec/foundation/testing'; +import { ContractClassLog } from '@aztec/stdlib/logs'; import { getSamplePrivateFunctionBroadcastedEventPayload } from '../tests/fixtures.js'; import { PrivateFunctionBroadcastedEvent } from './private_function_broadcasted_event.js'; @@ -7,7 +8,7 @@ describe('PrivateFunctionBroadcastedEvent', () => { beforeAll(() => setupCustomSnapshotSerializers(expect)); it('parses an event as emitted by the ContractClassRegisterer', () => { - const log = getSamplePrivateFunctionBroadcastedEventPayload(); + const log = ContractClassLog.fromBuffer(getSamplePrivateFunctionBroadcastedEventPayload()); expect(PrivateFunctionBroadcastedEvent.isPrivateFunctionBroadcastedEvent(log)).toBe(true); const event = PrivateFunctionBroadcastedEvent.fromLog(log); diff --git a/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.ts b/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.ts index 27e7962ac5a7..7bb147365fe1 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.ts +++ b/yarn-project/protocol-contracts/src/class-registerer/private_function_broadcasted_event.ts @@ -2,14 +2,13 @@ import { ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, FUNCTION_TREE_HEIGHT, MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS, - REGISTERER_PRIVATE_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS, } from '@aztec/constants'; import { Fr } from '@aztec/foundation/fields'; -import { BufferReader, type Tuple } from '@aztec/foundation/serialize'; +import type { Tuple } from '@aztec/foundation/serialize'; +import { FieldReader } from '@aztec/foundation/serialize'; import { FunctionSelector, bufferFromFields } from '@aztec/stdlib/abi'; import type { ExecutablePrivateFunctionWithMembershipProof, PrivateFunction } from '@aztec/stdlib/contract'; - -import chunk from 'lodash.chunk'; +import type { ContractClassLog } from '@aztec/stdlib/logs'; import { REGISTERER_PRIVATE_FUNCTION_BROADCASTED_TAG } from '../protocol_contract_data.js'; @@ -26,42 +25,33 @@ export class PrivateFunctionBroadcastedEvent { public readonly privateFunction: BroadcastedPrivateFunction, ) {} - static isPrivateFunctionBroadcastedEvent(log: Buffer) { - return log.subarray(0, 32).equals(REGISTERER_PRIVATE_FUNCTION_BROADCASTED_TAG.toBuffer()); + static isPrivateFunctionBroadcastedEvent(log: ContractClassLog) { + return log.fields[0].equals(REGISTERER_PRIVATE_FUNCTION_BROADCASTED_TAG); } - static fromLog(log: Buffer) { - const expectedLength = - 32 * - (MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS + - REGISTERER_PRIVATE_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS); - if (log.length !== expectedLength) { - throw new Error( - `Unexpected PrivateFunctionBroadcastedEvent log length: got ${log.length} but expected ${expectedLength}`, - ); - } - - const reader = new BufferReader(log.subarray(32)); - const event = PrivateFunctionBroadcastedEvent.fromBuffer(reader); - if (!reader.isEmpty()) { - throw new Error( - `Unexpected data after parsing PrivateFunctionBroadcastedEvent: ${reader.readToEnd().toString('hex')}`, - ); + static fromLog(log: ContractClassLog) { + const reader = new FieldReader(log.fields.slice(1)); + const event = PrivateFunctionBroadcastedEvent.fromFields(reader); + while (!reader.isFinished()) { + const field = reader.readField(); + if (!field.isZero()) { + throw new Error(`Unexpected data after parsing PrivateFunctionBroadcastedEvent: ${field.toString()}`); + } } return event; } - static fromBuffer(buffer: Buffer | BufferReader) { - const reader = BufferReader.asReader(buffer); - const contractClassId = reader.readObject(Fr); - const artifactMetadataHash = reader.readObject(Fr); - const unconstrainedFunctionsArtifactTreeRoot = reader.readObject(Fr); - const privateFunctionTreeSiblingPath = reader.readArray(FUNCTION_TREE_HEIGHT, Fr); - const privateFunctionTreeLeafIndex = reader.readObject(Fr).toNumber(); - const artifactFunctionTreeSiblingPath = reader.readArray(ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, Fr); - const artifactFunctionTreeLeafIndex = reader.readObject(Fr).toNumber(); - const privateFunction = BroadcastedPrivateFunction.fromBuffer(reader); + static fromFields(fields: Fr[] | FieldReader) { + const reader = FieldReader.asReader(fields); + const contractClassId = reader.readField(); + const artifactMetadataHash = reader.readField(); + const unconstrainedFunctionsArtifactTreeRoot = reader.readField(); + const privateFunctionTreeSiblingPath = reader.readFieldArray(FUNCTION_TREE_HEIGHT); + const privateFunctionTreeLeafIndex = reader.readField().toNumber(); + const artifactFunctionTreeSiblingPath = reader.readFieldArray(ARTIFACT_FUNCTION_TREE_MAX_HEIGHT); + const artifactFunctionTreeLeafIndex = reader.readField().toNumber(); + const privateFunction = BroadcastedPrivateFunction.fromFields(reader); return new PrivateFunctionBroadcastedEvent( contractClassId, @@ -102,13 +92,14 @@ export class BroadcastedPrivateFunction implements PrivateFunction { public readonly bytecode: Buffer, ) {} - static fromBuffer(buffer: Buffer | BufferReader) { - const reader = BufferReader.asReader(buffer); - const selector = FunctionSelector.fromField(reader.readObject(Fr)); - const metadataHash = reader.readObject(Fr); - const vkHash = reader.readObject(Fr); - const encodedBytecode = reader.readBytes(MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS * 32); - const bytecode = bufferFromFields(chunk(encodedBytecode, Fr.SIZE_IN_BYTES).map(Buffer.from).map(Fr.fromBuffer)); + static fromFields(fields: Fr[] | FieldReader) { + const reader = FieldReader.asReader(fields); + const selector = FunctionSelector.fromField(reader.readField()); + const metadataHash = reader.readField(); + const vkHash = reader.readField(); + // The '* 1' removes the 'Type instantiation is excessively deep and possibly infinite. ts(2589)' err + const encodedBytecode = reader.readFieldArray(MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS * 1); + const bytecode = bufferFromFields(encodedBytecode); return new BroadcastedPrivateFunction(selector, metadataHash, vkHash, bytecode); } } diff --git a/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.test.ts b/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.test.ts index a975bdb28932..ae87730a175c 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.test.ts +++ b/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.test.ts @@ -3,6 +3,7 @@ import { Fr } from '@aztec/foundation/fields'; import type { Tuple } from '@aztec/foundation/serialize'; import { setupCustomSnapshotSerializers } from '@aztec/foundation/testing'; import { FunctionSelector } from '@aztec/stdlib/abi'; +import { ContractClassLog } from '@aztec/stdlib/logs'; import { getSampleUnconstrainedFunctionBroadcastedEventPayload } from '../tests/fixtures.js'; import { @@ -14,7 +15,7 @@ describe('UnconstrainedFunctionBroadcastedEvent', () => { beforeAll(() => setupCustomSnapshotSerializers(expect)); it('parses an event as emitted by the ContractClassRegisterer', () => { - const log = getSampleUnconstrainedFunctionBroadcastedEventPayload(); + const log = ContractClassLog.fromBuffer(getSampleUnconstrainedFunctionBroadcastedEventPayload()); expect(UnconstrainedFunctionBroadcastedEvent.isUnconstrainedFunctionBroadcastedEvent(log)).toBe(true); const event = UnconstrainedFunctionBroadcastedEvent.fromLog(log); diff --git a/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.ts b/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.ts index 51fe3977d404..e4c613102fd7 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.ts +++ b/yarn-project/protocol-contracts/src/class-registerer/unconstrained_function_broadcasted_event.ts @@ -1,15 +1,14 @@ import { ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS, - REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS, } from '@aztec/constants'; import { removeArrayPaddingEnd } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/fields'; -import { BufferReader, type Tuple } from '@aztec/foundation/serialize'; +import type { Tuple } from '@aztec/foundation/serialize'; +import { FieldReader } from '@aztec/foundation/serialize'; import { FunctionSelector, bufferFromFields } from '@aztec/stdlib/abi'; import type { UnconstrainedFunction, UnconstrainedFunctionWithMembershipProof } from '@aztec/stdlib/contract'; - -import chunk from 'lodash.chunk'; +import type { ContractClassLog } from '@aztec/stdlib/logs'; import { REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_TAG } from '../protocol_contract_data.js'; @@ -24,40 +23,31 @@ export class UnconstrainedFunctionBroadcastedEvent { public readonly unconstrainedFunction: BroadcastedUnconstrainedFunction, ) {} - static isUnconstrainedFunctionBroadcastedEvent(log: Buffer) { - return log.subarray(0, 32).equals(REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_TAG.toBuffer()); + static isUnconstrainedFunctionBroadcastedEvent(log: ContractClassLog) { + return log.fields[0].equals(REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_TAG); } - static fromLog(log: Buffer) { - const expectedLength = - 32 * - (MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS + - REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_ADDITIONAL_FIELDS); - if (log.length !== expectedLength) { - throw new Error( - `Unexpected UnconstrainedFunctionBroadcastedEvent log length: got ${log.length} but expected ${expectedLength}`, - ); - } - - const reader = new BufferReader(log.subarray(32)); - const event = UnconstrainedFunctionBroadcastedEvent.fromBuffer(reader); - if (!reader.isEmpty()) { - throw new Error( - `Unexpected data after parsing UnconstrainedFunctionBroadcastedEvent: ${reader.readToEnd().toString('hex')}`, - ); + static fromLog(log: ContractClassLog) { + const reader = new FieldReader(log.fields.slice(1)); + const event = UnconstrainedFunctionBroadcastedEvent.fromFields(reader); + while (!reader.isFinished()) { + const field = reader.readField(); + if (!field.isZero()) { + throw new Error(`Unexpected data after parsing UnconstrainedFunctionBroadcastedEvent: ${field.toString()}`); + } } return event; } - static fromBuffer(buffer: Buffer | BufferReader) { - const reader = BufferReader.asReader(buffer); - const contractClassId = reader.readObject(Fr); - const artifactMetadataHash = reader.readObject(Fr); - const privateFunctionsArtifactTreeRoot = reader.readObject(Fr); - const artifactFunctionTreeSiblingPath = reader.readArray(ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, Fr); - const artifactFunctionTreeLeafIndex = reader.readObject(Fr).toNumber(); - const unconstrainedFunction = BroadcastedUnconstrainedFunction.fromBuffer(reader); + static fromFields(fields: Fr[] | FieldReader) { + const reader = FieldReader.asReader(fields); + const contractClassId = reader.readField(); + const artifactMetadataHash = reader.readField(); + const privateFunctionsArtifactTreeRoot = reader.readField(); + const artifactFunctionTreeSiblingPath = reader.readFieldArray(ARTIFACT_FUNCTION_TREE_MAX_HEIGHT); + const artifactFunctionTreeLeafIndex = reader.readField().toNumber(); + const unconstrainedFunction = BroadcastedUnconstrainedFunction.fromFields(reader); return new UnconstrainedFunctionBroadcastedEvent( contractClassId, @@ -97,12 +87,13 @@ export class BroadcastedUnconstrainedFunction implements UnconstrainedFunction { public readonly bytecode: Buffer, ) {} - static fromBuffer(buffer: Buffer | BufferReader) { - const reader = BufferReader.asReader(buffer); - const selector = FunctionSelector.fromField(reader.readObject(Fr)); - const metadataHash = reader.readObject(Fr); - const encodedBytecode = reader.readBytes(MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS * 32); - const bytecode = bufferFromFields(chunk(encodedBytecode, Fr.SIZE_IN_BYTES).map(Buffer.from).map(Fr.fromBuffer)); + static fromFields(fields: Fr[] | FieldReader) { + const reader = FieldReader.asReader(fields); + const selector = FunctionSelector.fromField(reader.readField()); + const metadataHash = reader.readField(); + // The '* 1' removes the 'Type instantiation is excessively deep and possibly infinite. ts(2589)' err + const encodedBytecode = reader.readFieldArray(MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS * 1); + const bytecode = bufferFromFields(encodedBytecode); return new BroadcastedUnconstrainedFunction(selector, metadataHash, bytecode); } } diff --git a/yarn-project/protocol-contracts/src/scripts/generate_data.ts b/yarn-project/protocol-contracts/src/scripts/generate_data.ts index a447c4987872..19fa6cef7eb3 100644 --- a/yarn-project/protocol-contracts/src/scripts/generate_data.ts +++ b/yarn-project/protocol-contracts/src/scripts/generate_data.ts @@ -131,10 +131,20 @@ async function generateRoot(names: string[], leaves: Fr[]) { } async function generateLogTags() { + // See silo_contract_class_log for all registerer tags return ` - export const REGISTERER_CONTRACT_CLASS_REGISTERED_TAG = new Fr(${REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE}n); - export const REGISTERER_PRIVATE_FUNCTION_BROADCASTED_TAG = new Fr(${REGISTERER_PRIVATE_FUNCTION_BROADCASTED_MAGIC_VALUE}n); - export const REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_TAG = new Fr(${REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE}n); + export const REGISTERER_CONTRACT_CLASS_REGISTERED_TAG = Fr.fromHexString('${await poseidon2Hash([ + REGISTERER_CONTRACT_ADDRESS, + REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE, + ])}'); + export const REGISTERER_PRIVATE_FUNCTION_BROADCASTED_TAG = Fr.fromHexString('${await poseidon2Hash([ + REGISTERER_CONTRACT_ADDRESS, + REGISTERER_PRIVATE_FUNCTION_BROADCASTED_MAGIC_VALUE, + ])}'); + export const REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_TAG = Fr.fromHexString('${await poseidon2Hash([ + REGISTERER_CONTRACT_ADDRESS, + REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE, + ])}'); export const DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_TAG = Fr.fromHexString('${await poseidon2Hash([ DEPLOYER_CONTRACT_ADDRESS, DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE, diff --git a/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts b/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts index 9e9f919f1bed..437fbac857a0 100644 --- a/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts +++ b/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts @@ -1,6 +1,7 @@ import { Blob, type SpongeBlob } from '@aztec/blob-lib'; import { ARCHIVE_HEIGHT, + MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, @@ -24,6 +25,7 @@ import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-ju import { PublicDataHint } from '@aztec/stdlib/avm'; import { Body } from '@aztec/stdlib/block'; import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server'; +import { ContractClassLog } from '@aztec/stdlib/logs'; import type { ParityPublicInputs } from '@aztec/stdlib/parity'; import { type BaseOrMergeRollupPublicInputs, @@ -139,6 +141,11 @@ export const buildBaseRollupHints = runInSpan( const inputSpongeBlob = startSpongeBlob.clone(); await startSpongeBlob.absorb(tx.txEffect.toBlobFields()); + const contractClassLogsPreimages = makeTuple( + MAX_CONTRACT_CLASS_LOGS_PER_TX, + i => tx.txEffect.contractClassLogs[i] || ContractClassLog.empty(), + ); + if (tx.avmProvingRequest) { const blockHash = await tx.constants.historicalHeader.hash(); const archiveRootMembershipWitness = await getMembershipWitnessFor( @@ -151,6 +158,7 @@ export const buildBaseRollupHints = runInSpan( return PublicBaseRollupHints.from({ startSpongeBlob: inputSpongeBlob, archiveRootMembershipWitness, + contractClassLogsPreimages, constants, }); } else { @@ -205,6 +213,7 @@ export const buildBaseRollupHints = runInSpan( stateDiffHints, feePayerFeeJuiceBalanceReadHint, archiveRootMembershipWitness, + contractClassLogsPreimages, constants, }); } diff --git a/yarn-project/sequencer-client/src/publisher/sequencer-publisher.test.ts b/yarn-project/sequencer-client/src/publisher/sequencer-publisher.test.ts index 2510e053423b..10bd479e49c6 100644 --- a/yarn-project/sequencer-client/src/publisher/sequencer-publisher.test.ts +++ b/yarn-project/sequencer-client/src/publisher/sequencer-publisher.test.ts @@ -47,7 +47,6 @@ describe('SequencerPublisher', () => { let header: Buffer; let archive: Buffer; let blockHash: Buffer; - let body: Buffer; let blobSinkClient: HttpBlobSinkClient; let mockBlobSinkServer: Server | undefined = undefined; @@ -66,7 +65,6 @@ describe('SequencerPublisher', () => { header = l2Block.header.toBuffer(); archive = l2Block.archive.root.toBuffer(); blockHash = (await l2Block.header.hash()).toBuffer(); - body = l2Block.body.toBuffer(); proposeTxHash = `0x${Buffer.from('txHashPropose').toString('hex')}`; // random tx hash @@ -144,7 +142,6 @@ describe('SequencerPublisher', () => { header = l2Block.header.toBuffer(); archive = l2Block.archive.root.toBuffer(); blockHash = (await l2Block.header.hash()).toBuffer(); - body = l2Block.body.toBuffer(); }); const closeServer = (server: Server): Promise => { @@ -227,7 +224,6 @@ describe('SequencerPublisher', () => { txHashes: [], }, [], - `0x${body.toString('hex')}`, blobInput, ] as const; expect(forwarder.forward).toHaveBeenCalledWith( diff --git a/yarn-project/sequencer-client/src/publisher/sequencer-publisher.ts b/yarn-project/sequencer-client/src/publisher/sequencer-publisher.ts index 4f6520c46afb..b4d42b8dcc48 100644 --- a/yarn-project/sequencer-client/src/publisher/sequencer-publisher.ts +++ b/yarn-project/sequencer-client/src/publisher/sequencer-publisher.ts @@ -43,8 +43,6 @@ type L1ProcessArgs = { archive: Buffer; /** The L2 block's leaf in the archive tree. */ blockHash: Buffer; - /** L2 block body. TODO(#9101): Remove block body once we can extract blobs. */ - body: Buffer; /** L2 block blobs containing all tx effects. */ blobs: Blob[]; /** L2 block tx hashes */ @@ -483,8 +481,6 @@ export class SequencerPublisher { txHashes, }, attestations, - // TODO(#9101): Extract blobs from beacon chain => calldata will only contain what's needed to verify blob and body input can be removed - `0x${encodedData.body.toString('hex')}`, blobInput, ] as const; diff --git a/yarn-project/simulator/src/acvm/oracle/oracle.ts b/yarn-project/simulator/src/acvm/oracle/oracle.ts index e3de074e2c2f..6311ad8c2c15 100644 --- a/yarn-project/simulator/src/acvm/oracle/oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/oracle.ts @@ -1,7 +1,7 @@ import { Fr } from '@aztec/foundation/fields'; import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi'; import { AztecAddress } from '@aztec/stdlib/aztec-address'; -import { LogWithTxData, UnencryptedL2Log } from '@aztec/stdlib/logs'; +import { ContractClassLog, LogWithTxData } from '@aztec/stdlib/logs'; import { MerkleTreeId } from '@aztec/stdlib/trees'; import type { ACVMField } from '../acvm_types.js'; @@ -281,12 +281,11 @@ export class Oracle { return newValues.map(toACVMField); } - emitContractClassLog([contractAddress]: ACVMField[], message: ACVMField[], [counter]: ACVMField[]): ACVMField { - const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer())); - const log = new UnencryptedL2Log(AztecAddress.fromString(contractAddress), logPayload); + emitContractClassLog([contractAddress]: ACVMField[], message: ACVMField[], [counter]: ACVMField[]): void { + const logPayload = message.map(fromACVMField); + const log = new ContractClassLog(new AztecAddress(fromACVMField(contractAddress)), logPayload); - const logHash = this.typedOracle.emitContractClassLog(log, +counter); - return toACVMField(logHash); + this.typedOracle.emitContractClassLog(log, +counter); } debugLog(message: ACVMField[], _ignoredFieldsSize: ACVMField[], fields: ACVMField[]): void { diff --git a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts index 0458f61e54b7..fc04c1e1d1dd 100644 --- a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts @@ -4,7 +4,7 @@ import type { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract'; import type { KeyValidationRequest } from '@aztec/stdlib/kernel'; -import { type IndexedTaggingSecret, type LogWithTxData, UnencryptedL2Log } from '@aztec/stdlib/logs'; +import type { ContractClassLog, IndexedTaggingSecret, LogWithTxData } from '@aztec/stdlib/logs'; import type { Note, NoteStatus } from '@aztec/stdlib/note'; import { type MerkleTreeId, type NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees'; import type { BlockHeader } from '@aztec/stdlib/tx'; @@ -166,8 +166,8 @@ export abstract class TypedOracle { return Promise.reject(new OracleMethodNotAvailableError('storageWrite')); } - emitContractClassLog(_log: UnencryptedL2Log, _counter: number): Fr { - throw new OracleMethodNotAvailableError('emitContractClassUnencryptedLog'); + emitContractClassLog(_log: ContractClassLog, _counter: number): void { + throw new OracleMethodNotAvailableError('emitContractClassLog'); } callPrivateFunction( diff --git a/yarn-project/simulator/src/client/client_execution_context.ts b/yarn-project/simulator/src/client/client_execution_context.ts index bed6cd34105b..1553d845a0de 100644 --- a/yarn-project/simulator/src/client/client_execution_context.ts +++ b/yarn-project/simulator/src/client/client_execution_context.ts @@ -13,7 +13,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address'; import { computeUniqueNoteHash, siloNoteHash } from '@aztec/stdlib/hash'; import type { AztecNode } from '@aztec/stdlib/interfaces/client'; import { PrivateContextInputs } from '@aztec/stdlib/kernel'; -import type { UnencryptedL2Log } from '@aztec/stdlib/logs'; +import type { ContractClassLog } from '@aztec/stdlib/logs'; import { Note, type NoteStatus } from '@aztec/stdlib/note'; import { type BlockHeader, @@ -331,20 +331,19 @@ export class ClientExecutionContext extends ViewDataOracle { } /** - * Emit a contract class unencrypted log. - * This fn exists because sha hashing the preimage - * is too large to compile (16,200 fields, 518,400 bytes) => the oracle hashes it. - * See private_context.nr - * TODO(#8945): Contract class logs are currently sha hashes. When these are fields, delete this. - * @param log - The unencrypted log to be emitted. + * Emit a contract class log. + * This fn exists because we only carry a poseidon hash through the kernels, and need to + * keep the preimage in ts for later. + * We could also return the hash here if we must save extra gates. + * @param log - The contract class log to be emitted. + * @param counter - The contract class log's counter. */ - public override emitContractClassLog(log: UnencryptedL2Log, counter: number) { + public override emitContractClassLog(log: ContractClassLog, counter: number) { this.contractClassLogs.push(new CountedContractClassLog(log, counter)); - const text = log.toHumanReadable(); + const text = log.toBuffer().toString('hex'); this.log.verbose( `Emitted log from ContractClassRegisterer: "${text.length > 100 ? text.slice(0, 100) + '...' : text}"`, ); - return Fr.fromBuffer(log.hash()); } #checkValidStaticCall(childExecutionResult: PrivateCallExecutionResult) { diff --git a/yarn-project/simulator/src/public/public_db_sources.ts b/yarn-project/simulator/src/public/public_db_sources.ts index 7a21e94ae50f..01ca38703f7e 100644 --- a/yarn-project/simulator/src/public/public_db_sources.ts +++ b/yarn-project/simulator/src/public/public_db_sources.ts @@ -18,7 +18,6 @@ import type { MerkleTreeReadOperations, MerkleTreeWriteOperations, } from '@aztec/stdlib/interfaces/server'; -import { ContractClassTxL2Logs } from '@aztec/stdlib/logs'; import type { PublicDBAccessStats } from '@aztec/stdlib/stats'; import { MerkleTreeId, type PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees'; import type { Tx } from '@aztec/stdlib/tx'; @@ -43,10 +42,10 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB { */ public async addNewContracts(tx: Tx): Promise { // Extract contract class and instance data from logs and add to cache for this block - const logs = tx.contractClassLogs.unrollLogs(); - const contractClassRegisteredEvents = logs - .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)) - .map(log => ContractClassRegisteredEvent.fromLog(log.data)); + const siloedLogs = await tx.filterContractClassLogs(tx.data.getNonEmptyContractClassLogsHashes(), true); + const contractClassRegisteredEvents = siloedLogs + .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)) + .map(log => ContractClassRegisteredEvent.fromLog(log)); await Promise.all( contractClassRegisteredEvents.map(async event => { this.log.debug(`Adding class ${event.contractClassId.toString()} to public execution contract cache`); @@ -72,22 +71,15 @@ export class ContractsDataSourcePublicDB implements PublicContractsDB { * @param tx - The tx's contracts to be removed * @param onlyRevertible - Whether to only remove contracts added from revertible contract class logs */ - public removeNewContracts(tx: Tx, onlyRevertible: boolean = false): Promise { + public async removeNewContracts(tx: Tx, onlyRevertible: boolean = false): Promise { // TODO(@spalladino): Can this inadvertently delete a valid contract added by another tx? // Let's say we have two txs adding the same contract on the same block. If the 2nd one reverts, // wouldn't that accidentally remove the contract added on the first one? - const contractClassLogs = onlyRevertible - ? tx.contractClassLogs - .filterScoped( - tx.data.forPublic!.revertibleAccumulatedData.contractClassLogsHashes, - ContractClassTxL2Logs.empty(), - ) - .unrollLogs() - : tx.contractClassLogs.unrollLogs(); + const contractClassLogs = onlyRevertible ? await tx.getSplitContractClassLogs(true, true) : tx.contractClassLogs; contractClassLogs - .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)) + .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)) .forEach(log => { - const event = ContractClassRegisteredEvent.fromLog(log.data); + const event = ContractClassRegisteredEvent.fromLog(log); this.classCache.delete(event.contractClassId.toString()); }); diff --git a/yarn-project/simulator/src/public/public_processor.ts b/yarn-project/simulator/src/public/public_processor.ts index af9f291cb7fc..f00e3c7cf1c5 100644 --- a/yarn-project/simulator/src/public/public_processor.ts +++ b/yarn-project/simulator/src/public/public_processor.ts @@ -324,7 +324,7 @@ export class PublicProcessor implements Traceable { publicDataWriteCount: processedTx.txEffect.publicDataWrites.length, nullifierCount: processedTx.txEffect.nullifiers.length, noteHashCount: processedTx.txEffect.noteHashes.length, - contractClassLogCount: processedTx.txEffect.contractClassLogs.getTotalLogCount(), + contractClassLogCount: processedTx.txEffect.contractClassLogs.length, publicLogCount: processedTx.txEffect.publicLogs.length, privateLogCount: processedTx.txEffect.privateLogs.length, l2ToL1MessageCount: processedTx.txEffect.l2ToL1Msgs.length, @@ -450,11 +450,15 @@ export class PublicProcessor implements Traceable { this.globalVariables, ); + const siloedContractClassLogs = await tx.filterContractClassLogs( + tx.data.getNonEmptyContractClassLogsHashes(), + true, + ); + this.metrics.recordClassRegistration( - ...tx.contractClassLogs - .unrollLogs() - .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)) - .map(log => ContractClassRegisteredEvent.fromLog(log.data)), + ...siloedContractClassLogs + .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)) + .map(log => ContractClassRegisteredEvent.fromLog(log)), ); return [processedTx, undefined]; } @@ -481,11 +485,15 @@ export class PublicProcessor implements Traceable { } }); + const siloedContractClassLogs = await tx.filterContractClassLogs( + tx.data.getNonEmptyContractClassLogsHashes(), + true, + ); + this.metrics.recordClassRegistration( - ...tx.contractClassLogs - .unrollLogs() - .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)) - .map(log => ContractClassRegisteredEvent.fromLog(log.data)), + ...siloedContractClassLogs + .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)) + .map(log => ContractClassRegisteredEvent.fromLog(log)), ); const phaseCount = processedPhases.length; diff --git a/yarn-project/simulator/src/public/public_tx_simulator.test.ts b/yarn-project/simulator/src/public/public_tx_simulator.test.ts index 5461dcde0af6..c8d8b11877c6 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator.test.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator.test.ts @@ -1,9 +1,15 @@ -import { NULLIFIER_SUBTREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, REGISTERER_CONTRACT_ADDRESS } from '@aztec/constants'; +import { + CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, + NULLIFIER_SUBTREE_HEIGHT, + PUBLIC_DATA_TREE_HEIGHT, + REGISTERER_CONTRACT_ADDRESS, + REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE, +} from '@aztec/constants'; import { Fr } from '@aztec/foundation/fields'; import type { AztecKVStore } from '@aztec/kv-store'; import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type AppendOnlyTree, Poseidon, StandardTree, newTree } from '@aztec/merkle-tree'; -import { ProtocolContractAddress, REGISTERER_CONTRACT_CLASS_REGISTERED_TAG } from '@aztec/protocol-contracts'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice'; import { bufferAsFields } from '@aztec/stdlib/abi'; import { PublicDataWrite, RevertCode } from '@aztec/stdlib/avm'; @@ -14,7 +20,7 @@ import { Gas, GasFees, GasSettings } from '@aztec/stdlib/gas'; import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash'; import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server'; import { ScopedLogHash, countAccumulatedItems } from '@aztec/stdlib/kernel'; -import { UnencryptedFunctionL2Logs, UnencryptedL2Log } from '@aztec/stdlib/logs'; +import { ContractClassLog } from '@aztec/stdlib/logs'; import { fr, makeContractClassPublic, mockTx } from '@aztec/stdlib/testing'; import { AppendOnlyTreeSnapshot, MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees'; import { @@ -160,7 +166,7 @@ describe('public_tx_simulator', () => { const mockContractClassForTx = async (tx: Tx, revertible = true) => { const publicContractClass = await makeContractClassPublic(42); const contractClassLogFields = [ - REGISTERER_CONTRACT_CLASS_REGISTERED_TAG, + new Fr(REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE), publicContractClass.id, new Fr(publicContractClass.version), publicContractClass.artifactHash, @@ -170,19 +176,17 @@ describe('public_tx_simulator', () => { Math.ceil(publicContractClass.packedBytecode.length / 32) + 1, ), ]; - const contractClassLogBuffer = Buffer.concat([ - ...contractClassLogFields.map(f => f.toBuffer()), - publicContractClass.packedBytecode, - Buffer.alloc(32 - (publicContractClass.packedBytecode.length % 32)), - ]); - const contractClassLog = new UnencryptedFunctionL2Logs([ - new UnencryptedL2Log(AztecAddress.fromNumber(REGISTERER_CONTRACT_ADDRESS), contractClassLogBuffer), + const contractClassLog = ContractClassLog.fromFields([ + new Fr(REGISTERER_CONTRACT_ADDRESS), + ...contractClassLogFields.concat( + new Array(CONTRACT_CLASS_LOG_SIZE_IN_FIELDS - contractClassLogFields.length).fill(Fr.ZERO), + ), ]); - tx.contractClassLogs.addFunctionLogs([contractClassLog]); + tx.contractClassLogs.push(contractClassLog); const contractClassLogHash = ScopedLogHash.fromFields([ - Fr.fromBuffer(contractClassLog.logs[0].hash()), + await contractClassLog.hash(), new Fr(7), - new Fr(contractClassLog.getKernelLength()), + new Fr(contractClassLog.getEmittedLength()), new Fr(REGISTERER_CONTRACT_ADDRESS), ]); if (revertible) { @@ -879,10 +883,10 @@ describe('public_tx_simulator', () => { const contractClass = await worldStateDB.getContractClass(contractClassId); if (kind == 'revertible') { - expect(tx.contractClassLogs.unrollLogs().length).toEqual(0); + expect(tx.contractClassLogs.length).toEqual(0); expect(contractClass).toBeUndefined(); } else { - expect(tx.contractClassLogs.unrollLogs().length).toEqual(1); + expect(tx.contractClassLogs.length).toEqual(1); expect(contractClass).toBeDefined(); } }); diff --git a/yarn-project/simulator/src/public/public_tx_simulator.ts b/yarn-project/simulator/src/public/public_tx_simulator.ts index 6eafb6f2e0e9..cc435094d8e7 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator.ts @@ -133,7 +133,7 @@ export class PublicTxSimulator { // FIXME: we shouldn't need to directly modify worldStateDb here! await this.worldStateDB.removeNewContracts(tx, true); // FIXME(dbanks12): should not be changing immutable tx - tx.filterRevertedLogs(tx.data.forPublic!.nonRevertibleAccumulatedData); + await tx.filterRevertedLogs(); } const endTime = process.hrtime.bigint(); diff --git a/yarn-project/stdlib/src/block/body.test.ts b/yarn-project/stdlib/src/block/body.test.ts index c5d61f754573..9643b54ac756 100644 --- a/yarn-project/stdlib/src/block/body.test.ts +++ b/yarn-project/stdlib/src/block/body.test.ts @@ -12,8 +12,7 @@ describe('Body', () => { it('converts to and from fields', async () => { const body = await Body.random(); const fields = body.toBlobFields(); - // TODO(#8954): When logs are refactored into fields, we won't need to inject them here - expect(Body.fromBlobFields(fields, body.contractClassLogs)).toEqual(body); + expect(Body.fromBlobFields(fields)).toEqual(body); }); it('converts empty to and from fields', () => { diff --git a/yarn-project/stdlib/src/block/body.ts b/yarn-project/stdlib/src/block/body.ts index 1da3c21c6cab..248adb367524 100644 --- a/yarn-project/stdlib/src/block/body.ts +++ b/yarn-project/stdlib/src/block/body.ts @@ -1,3 +1,4 @@ +import { BLOBS_PER_BLOCK, FIELDS_PER_BLOB } from '@aztec/constants'; import { timesParallel } from '@aztec/foundation/collection'; import type { Fr } from '@aztec/foundation/fields'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; @@ -5,7 +6,6 @@ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; import { inspect } from 'util'; import { z } from 'zod'; -import { ContractClass2BlockL2Logs } from '../logs/l2_block_l2_logs.js'; import type { ZodFor } from '../schemas/index.js'; import { TxEffect } from '../tx/tx_effect.js'; @@ -52,15 +52,21 @@ export class Body { this.txEffects.forEach((effect: TxEffect) => { flattened = flattened.concat(effect.toBlobFields()); }); + if (flattened.length > BLOBS_PER_BLOCK * FIELDS_PER_BLOB) { + throw new Error( + `Attempted to overfill block's blobs with ${flattened.length} elements. The maximum is ${ + BLOBS_PER_BLOCK * FIELDS_PER_BLOB + }`, + ); + } + return flattened; } /** * Decodes a block from blob fields. - * TODO(#8954): When logs are refactored into fields, we won't need to inject them here, instead just reading from fields in TxEffect.fromBlobFields. - * Logs are best input by gathering from the getters below, as they don't remove empty log arrays. */ - static fromBlobFields(fields: Fr[], contractClassLogs?: ContractClass2BlockL2Logs) { + static fromBlobFields(fields: Fr[]) { const txEffectsFields: Fr[][] = []; let checkedFields = 0; while (checkedFields !== fields.length) { @@ -71,9 +77,7 @@ export class Body { txEffectsFields.push(fields.slice(checkedFields, checkedFields + len)); checkedFields += len; } - const txEffects = txEffectsFields - .filter(effect => effect.length) - .map((effect, i) => TxEffect.fromBlobFields(effect, contractClassLogs?.txLogs[i])); + const txEffects = txEffectsFields.filter(effect => effect.length).map(effect => TxEffect.fromBlobFields(effect)); return new this(txEffects); } @@ -83,12 +87,6 @@ export class Body { }`; } - get contractClassLogs(): ContractClass2BlockL2Logs { - const logs = this.txEffects.map(txEffect => txEffect.contractClassLogs); - - return new ContractClass2BlockL2Logs(logs); - } - static async random(txsPerBlock = 4, numPublicCallsPerTx = 3, numPublicLogsPerCall = 1) { const txEffects = await timesParallel(txsPerBlock, () => TxEffect.random(numPublicCallsPerTx, numPublicLogsPerCall), diff --git a/yarn-project/stdlib/src/block/l2_block.ts b/yarn-project/stdlib/src/block/l2_block.ts index 14cd48b1b442..f36686d268bc 100644 --- a/yarn-project/stdlib/src/block/l2_block.ts +++ b/yarn-project/stdlib/src/block/l2_block.ts @@ -185,11 +185,12 @@ export class L2Block { privateLogCount: this.body.txEffects.reduce((logCount, txEffect) => logCount + txEffect.privateLogs.length, 0), publicLogCount: this.body.txEffects.reduce((logCount, txEffect) => logCount + txEffect.publicLogs.length, 0), contractClassLogCount: this.body.txEffects.reduce( - (logCount, txEffect) => logCount + txEffect.contractClassLogs.getTotalLogCount(), + (logCount, txEffect) => logCount + txEffect.contractClassLogs.length, 0, ), contractClassLogSize: this.body.txEffects.reduce( - (logCount, txEffect) => logCount + txEffect.contractClassLogs.getSerializedLength(), + (totalLogSize, txEffect) => + totalLogSize + txEffect.contractClassLogs.reduce((logSize, log) => logSize + log.getEmittedLength(), 0), 0, ), }; diff --git a/yarn-project/stdlib/src/hash/hash.ts b/yarn-project/stdlib/src/hash/hash.ts index 1c47f1f78343..9da47a3250cb 100644 --- a/yarn-project/stdlib/src/hash/hash.ts +++ b/yarn-project/stdlib/src/hash/hash.ts @@ -3,6 +3,7 @@ import { poseidon2Hash, poseidon2HashWithSeparator, sha256Trunc } from '@aztec/f import { Fr } from '@aztec/foundation/fields'; import type { AztecAddress } from '../aztec-address/index.js'; +import type { ContractClassLog } from '../logs/index.js'; import type { ScopedL2ToL1Message } from '../messaging/l2_to_l1_message.js'; /** @@ -131,3 +132,12 @@ export function siloL2ToL1Message(l2ToL1Message: ScopedL2ToL1Message, version: F ]); return Fr.fromBuffer(sha256Trunc(preimage)); } + +export async function siloContractClassLog(log: ContractClassLog, contract: AztecAddress): Promise { + const innerLog = log.clone(); + if (contract.isZero()) { + return innerLog; + } + innerLog.fields[0] = await poseidon2Hash([contract, innerLog.fields[0]]); + return innerLog; +} diff --git a/yarn-project/stdlib/src/interfaces/archiver.test.ts b/yarn-project/stdlib/src/interfaces/archiver.test.ts index 34fb678c5a44..aaa2f97499f4 100644 --- a/yarn-project/stdlib/src/interfaces/archiver.test.ts +++ b/yarn-project/stdlib/src/interfaces/archiver.test.ts @@ -19,8 +19,8 @@ import { } from '../contract/index.js'; import { EmptyL1RollupConstants, type L1RollupConstants } from '../epoch-helpers/index.js'; import { PublicKeys } from '../keys/public_keys.js'; +import { ExtendedContractClassLog } from '../logs/extended_contract_class_log.js'; import { ExtendedPublicLog } from '../logs/extended_public_log.js'; -import { ExtendedUnencryptedL2Log } from '../logs/extended_unencrypted_l2_log.js'; import type { LogFilter } from '../logs/log_filter.js'; import { PrivateLog } from '../logs/private_log.js'; import { TxScopedL2Log } from '../logs/tx_scoped_l2_log.js'; @@ -172,7 +172,7 @@ describe('ArchiverApiSchema', () => { txHash: TxHash.random(), contractAddress: await AztecAddress.random(), }); - expect(result).toEqual({ logs: [expect.any(ExtendedUnencryptedL2Log)], maxLogsHit: true }); + expect(result).toEqual({ logs: [expect.any(ExtendedContractClassLog)], maxLogsHit: true }); }); it('getPublicFunction', async () => { @@ -333,7 +333,7 @@ class MockArchiver implements ArchiverApi { async getContractClassLogs(filter: LogFilter): Promise { expect(filter.txHash).toBeInstanceOf(TxHash); expect(filter.contractAddress).toBeInstanceOf(AztecAddress); - return { logs: [await ExtendedUnencryptedL2Log.random()], maxLogsHit: true }; + return Promise.resolve({ logs: [await ExtendedContractClassLog.random()], maxLogsHit: true }); } getPublicFunction(address: AztecAddress, selector: FunctionSelector): Promise { expect(address).toBeInstanceOf(AztecAddress); diff --git a/yarn-project/stdlib/src/interfaces/aztec-node.test.ts b/yarn-project/stdlib/src/interfaces/aztec-node.test.ts index f9bcbebde802..d91cab0fa129 100644 --- a/yarn-project/stdlib/src/interfaces/aztec-node.test.ts +++ b/yarn-project/stdlib/src/interfaces/aztec-node.test.ts @@ -29,8 +29,8 @@ import { } from '../contract/index.js'; import { GasFees } from '../gas/gas_fees.js'; import { PublicKeys } from '../keys/public_keys.js'; +import { ExtendedContractClassLog } from '../logs/extended_contract_class_log.js'; import { ExtendedPublicLog } from '../logs/extended_public_log.js'; -import { ExtendedUnencryptedL2Log } from '../logs/extended_unencrypted_l2_log.js'; import type { LogFilter } from '../logs/log_filter.js'; import { PrivateLog } from '../logs/private_log.js'; import { TxScopedL2Log } from '../logs/tx_scoped_l2_log.js'; @@ -239,7 +239,7 @@ describe('AztecNodeApiSchema', () => { it('getContractClassLogs', async () => { const response = await context.client.getContractClassLogs({ contractAddress: await AztecAddress.random() }); - expect(response).toEqual({ logs: [expect.any(ExtendedUnencryptedL2Log)], maxLogsHit: true }); + expect(response).toEqual({ logs: [expect.any(ExtendedContractClassLog)], maxLogsHit: true }); }); it('getLogsByTags', async () => { @@ -537,7 +537,7 @@ class MockAztecNode implements AztecNode { } async getContractClassLogs(filter: LogFilter): Promise { expect(filter.contractAddress).toBeInstanceOf(AztecAddress); - return { logs: [await ExtendedUnencryptedL2Log.random()], maxLogsHit: true }; + return Promise.resolve({ logs: [await ExtendedContractClassLog.random()], maxLogsHit: true }); } getLogsByTags(tags: Fr[]): Promise { expect(tags).toHaveLength(1); diff --git a/yarn-project/stdlib/src/interfaces/get_logs_response.ts b/yarn-project/stdlib/src/interfaces/get_logs_response.ts index 5cc92881fdf7..3bdab68cf3f2 100644 --- a/yarn-project/stdlib/src/interfaces/get_logs_response.ts +++ b/yarn-project/stdlib/src/interfaces/get_logs_response.ts @@ -1,19 +1,19 @@ import { z } from 'zod'; +import { ExtendedContractClassLog } from '../logs/extended_contract_class_log.js'; import { ExtendedPublicLog } from '../logs/extended_public_log.js'; -import { ExtendedUnencryptedL2Log } from '../logs/extended_unencrypted_l2_log.js'; import type { ZodFor } from '../schemas/index.js'; /** Response for the getContractClassLogs archiver call. */ export type GetContractClassLogsResponse = { - /** An array of ExtendedUnencryptedL2Log elements. */ - logs: ExtendedUnencryptedL2Log[]; + /** An array of ExtendedContractClassLog elements. */ + logs: ExtendedContractClassLog[]; /** Indicates if a limit has been reached. */ maxLogsHit: boolean; }; export const GetContractClassLogsResponseSchema: ZodFor = z.object({ - logs: z.array(ExtendedUnencryptedL2Log.schema), + logs: z.array(ExtendedContractClassLog.schema), maxLogsHit: z.boolean(), }); diff --git a/yarn-project/stdlib/src/interfaces/pxe.test.ts b/yarn-project/stdlib/src/interfaces/pxe.test.ts index 30822abf2bb2..8ec3c17a1585 100644 --- a/yarn-project/stdlib/src/interfaces/pxe.test.ts +++ b/yarn-project/stdlib/src/interfaces/pxe.test.ts @@ -29,8 +29,8 @@ import { import { GasFees } from '../gas/gas_fees.js'; import { PrivateKernelTailCircuitPublicInputs } from '../kernel/private_kernel_tail_circuit_public_inputs.js'; import { PublicKeys } from '../keys/public_keys.js'; +import { ExtendedContractClassLog } from '../logs/extended_contract_class_log.js'; import { ExtendedPublicLog } from '../logs/extended_public_log.js'; -import { ExtendedUnencryptedL2Log } from '../logs/extended_unencrypted_l2_log.js'; import type { LogFilter } from '../logs/log_filter.js'; import { UniqueNote } from '../note/index.js'; import type { NotesFilter } from '../note/notes_filter.js'; @@ -247,7 +247,7 @@ describe('PXESchema', () => { it('getContractClassLogs', async () => { const result = await context.client.getContractClassLogs({ contractAddress: address }); - expect(result).toEqual({ logs: [expect.any(ExtendedUnencryptedL2Log)], maxLogsHit: true }); + expect(result).toEqual({ logs: [expect.any(ExtendedContractClassLog)], maxLogsHit: true }); }); it('getBlockNumber', async () => { @@ -467,7 +467,7 @@ class MockPXE implements PXE { } async getContractClassLogs(filter: LogFilter): Promise { expect(filter.contractAddress).toEqual(this.address); - return { logs: [await ExtendedUnencryptedL2Log.random()], maxLogsHit: true }; + return Promise.resolve({ logs: [await ExtendedContractClassLog.random()], maxLogsHit: true }); } getBlockNumber(): Promise { return Promise.resolve(1); diff --git a/yarn-project/stdlib/src/kernel/log_hash.ts b/yarn-project/stdlib/src/kernel/log_hash.ts index 18541755f2b1..feae369d1415 100644 --- a/yarn-project/stdlib/src/kernel/log_hash.ts +++ b/yarn-project/stdlib/src/kernel/log_hash.ts @@ -1,4 +1,3 @@ -import { sha256Trunc } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize'; @@ -8,23 +7,23 @@ import { AztecAddress } from '../aztec-address/index.js'; import type { Ordered } from './utils/interfaces.js'; export class LogHash implements Ordered { - constructor(public value: Fr, public counter: number, public length: Fr) {} + constructor(public value: Fr, public counter: number, public length: number) {} toFields(): Fr[] { - return [this.value, new Fr(this.counter), this.length]; + return [this.value, new Fr(this.counter), new Fr(this.length)]; } static fromFields(fields: Fr[] | FieldReader) { const reader = FieldReader.asReader(fields); - return new LogHash(reader.readField(), reader.readU32(), reader.readField()); + return new LogHash(reader.readField(), reader.readU32(), reader.readU32()); } isEmpty() { - return this.value.isZero() && this.length.isZero() && !this.counter; + return this.value.isZero() && !this.length && !this.counter; } static empty() { - return new LogHash(Fr.zero(), 0, Fr.zero()); + return new LogHash(Fr.zero(), 0, 0); } toBuffer(): Buffer { @@ -33,7 +32,7 @@ export class LogHash implements Ordered { static fromBuffer(buffer: Buffer | BufferReader) { const reader = BufferReader.asReader(buffer); - return new LogHash(Fr.fromBuffer(reader), reader.readNumber(), Fr.fromBuffer(reader)); + return new LogHash(Fr.fromBuffer(reader), reader.readNumber(), reader.readNumber()); } toString(): string { @@ -89,8 +88,4 @@ export class ScopedLogHash implements Ordered { toString(): string { return `logHash=${this.logHash} contractAddress=${this.contractAddress}`; } - - getSiloedHash(): Buffer { - return sha256Trunc(Buffer.concat([this.contractAddress.toBuffer(), this.value.toBuffer()])); - } } diff --git a/yarn-project/stdlib/src/kernel/private_circuit_public_inputs.ts b/yarn-project/stdlib/src/kernel/private_circuit_public_inputs.ts index 18b520fa991d..cae44fad5229 100644 --- a/yarn-project/stdlib/src/kernel/private_circuit_public_inputs.ts +++ b/yarn-project/stdlib/src/kernel/private_circuit_public_inputs.ts @@ -112,7 +112,6 @@ export class PrivateCircuitPublicInputs { public privateLogs: Tuple, /** * Hash of the contract class logs emitted in this function call. - * Note: Truncated to 31 bytes to fit in Fr. */ public contractClassLogsHashes: Tuple, /** diff --git a/yarn-project/stdlib/src/kernel/private_kernel_tail_circuit_public_inputs.ts b/yarn-project/stdlib/src/kernel/private_kernel_tail_circuit_public_inputs.ts index ed4038522099..6ccc5bf74fb6 100644 --- a/yarn-project/stdlib/src/kernel/private_kernel_tail_circuit_public_inputs.ts +++ b/yarn-project/stdlib/src/kernel/private_kernel_tail_circuit_public_inputs.ts @@ -243,6 +243,20 @@ export class PrivateKernelTailCircuitPublicInputs { return privateLogs.filter(n => !n.isEmpty()); } + getNonEmptyContractClassLogsHashes() { + const contractClassLogsHashes = this.forPublic + ? mergeAccumulatedData( + this.forPublic.nonRevertibleAccumulatedData.contractClassLogsHashes, + this.forPublic.revertibleAccumulatedData.contractClassLogsHashes, + ) + : this.forRollup!.end.contractClassLogsHashes; + return contractClassLogsHashes.filter(h => !h.isEmpty()); + } + + getNonEmptyContractClassLogsLength() { + return this.getNonEmptyContractClassLogsHashes().reduce((total, log) => total + log.logHash.length, 0); + } + static fromBuffer(buffer: Buffer | BufferReader): PrivateKernelTailCircuitPublicInputs { const reader = BufferReader.asReader(buffer); const isForPublic = reader.readBoolean(); diff --git a/yarn-project/stdlib/src/kernel/private_to_rollup_accumulated_data.ts b/yarn-project/stdlib/src/kernel/private_to_rollup_accumulated_data.ts index bd6a58d6584f..27ee4bcd897e 100644 --- a/yarn-project/stdlib/src/kernel/private_to_rollup_accumulated_data.ts +++ b/yarn-project/stdlib/src/kernel/private_to_rollup_accumulated_data.ts @@ -45,10 +45,6 @@ export class PrivateToRollupAccumulatedData { * Note: Truncated to 31 bytes to fit in Fr. */ public contractClassLogsHashes: Tuple, - /** - * Total accumulated length of the contract class log preimages emitted in all the previous kernel iterations - */ - public contractClassLogPreimagesLength: Fr, ) {} getSize() { @@ -57,8 +53,7 @@ export class PrivateToRollupAccumulatedData { arraySerializedSizeOfNonEmpty(this.nullifiers) + arraySerializedSizeOfNonEmpty(this.l2ToL1Msgs) + arraySerializedSizeOfNonEmpty(this.privateLogs) + - arraySerializedSizeOfNonEmpty(this.contractClassLogsHashes) + - this.contractClassLogPreimagesLength.size + arraySerializedSizeOfNonEmpty(this.contractClassLogsHashes) ); } @@ -69,7 +64,6 @@ export class PrivateToRollupAccumulatedData { fields.l2ToL1Msgs, fields.privateLogs, fields.contractClassLogsHashes, - fields.contractClassLogPreimagesLength, ] as const; } @@ -106,7 +100,6 @@ export class PrivateToRollupAccumulatedData { reader.readArray(MAX_L2_TO_L1_MSGS_PER_TX, ScopedL2ToL1Message), reader.readArray(MAX_PRIVATE_LOGS_PER_TX, PrivateLog), reader.readArray(MAX_CONTRACT_CLASS_LOGS_PER_TX, ScopedLogHash), - Fr.fromBuffer(reader), ); } @@ -126,7 +119,6 @@ export class PrivateToRollupAccumulatedData { makeTuple(MAX_L2_TO_L1_MSGS_PER_TX, ScopedL2ToL1Message.empty), makeTuple(MAX_PRIVATE_LOGS_PER_TX, PrivateLog.empty), makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, ScopedLogHash.empty), - Fr.zero(), ); } @@ -162,7 +154,6 @@ export class PrivateToRollupAccumulatedData { .filter(x => !x.isEmpty()) .map(x => inspect(x)) .join(', ')}], - contractClassLogPreimagesLength: ${this.contractClassLogPreimagesLength.toString()}, }`; } } diff --git a/yarn-project/stdlib/src/logs/contract_class_log.test.ts b/yarn-project/stdlib/src/logs/contract_class_log.test.ts new file mode 100644 index 000000000000..27fd6038937b --- /dev/null +++ b/yarn-project/stdlib/src/logs/contract_class_log.test.ts @@ -0,0 +1,50 @@ +import { CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS } from '@aztec/constants'; +import { Fr } from '@aztec/foundation/fields'; + +import { AztecAddress } from '../aztec-address/index.js'; +import { ContractClassLog } from './contract_class_log.js'; + +describe('PublicLog', () => { + let log: ContractClassLog; + + beforeAll(async () => { + log = await ContractClassLog.random(); + }); + + it('serializes to buffer and deserializes it back', () => { + const buffer = log.toBuffer(); + const res = ContractClassLog.fromBuffer(buffer); + expect(res).toEqual(log); + }); + + it('serializes to field array and deserializes it back', () => { + const fieldArray = log.toFields(); + const res = ContractClassLog.fromFields(fieldArray); + expect(res).toEqual(log); + }); + + it('number of fields matches constant', () => { + const fields = log.toFields(); + expect(fields.length).toBe(CONTRACT_CLASS_LOG_SIZE_IN_FIELDS); + }); + + it('number of emitted fields is correct', () => { + const smallLogFields = [new Fr(1), new Fr(2), new Fr(3)]; + const smallLog = new ContractClassLog( + AztecAddress.fromField(Fr.ONE), + smallLogFields.concat(new Array(CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS - smallLogFields.length).fill(Fr.ZERO)), + ); + expect(smallLog.getEmittedFields()).toEqual(smallLogFields); + expect(smallLog.getEmittedLength()).toBe(smallLogFields.length); + + const largeLogFields = Array.from({ length: CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS - smallLogFields.length }, () => + Fr.random(), + ); + const largeLog = new ContractClassLog( + AztecAddress.fromField(Fr.ONE), + largeLogFields.concat(new Array(smallLogFields.length).fill(Fr.ZERO)), + ); + expect(largeLog.getEmittedFields()).toEqual(largeLogFields); + expect(largeLog.getEmittedLength()).toBe(largeLogFields.length); + }); +}); diff --git a/yarn-project/stdlib/src/logs/contract_class_log.ts b/yarn-project/stdlib/src/logs/contract_class_log.ts new file mode 100644 index 000000000000..faea090e93ad --- /dev/null +++ b/yarn-project/stdlib/src/logs/contract_class_log.ts @@ -0,0 +1,112 @@ +import { CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, CONTRACT_CLASS_LOG_SIZE_IN_FIELDS } from '@aztec/constants'; +import { poseidon2Hash } from '@aztec/foundation/crypto'; +import { Fr } from '@aztec/foundation/fields'; +import { schemas } from '@aztec/foundation/schemas'; +import { BufferReader, FieldReader, serializeToBuffer } from '@aztec/foundation/serialize'; + +import { inspect } from 'util'; +import { z } from 'zod'; + +import { AztecAddress } from '../aztec-address/index.js'; + +export class ContractClassLog { + static SIZE_IN_BYTES = Fr.SIZE_IN_BYTES * CONTRACT_CLASS_LOG_SIZE_IN_FIELDS; + + // Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + // public fields: Tuple + constructor(public contractAddress: AztecAddress, public fields: Fr[]) { + if (fields.length !== CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS) { + throw new Error( + `Invalid number of fields for ContractClassLog. Expected ${CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS}, got ${fields.length}`, + ); + } + } + + toFields(): Fr[] { + return [this.contractAddress.toField(), ...this.fields]; + } + + static fromFields(fields: Fr[] | FieldReader) { + const reader = FieldReader.asReader(fields); + // Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + // return new ContractClassLog(reader.readFieldArray(CONTRACT_CLASS_LOG_SIZE_IN_FIELDS)); + return new ContractClassLog( + reader.readObject(AztecAddress), + Array.from({ length: CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS }, () => reader.readField()), + ); + } + + isEmpty() { + return this.fields.every(f => f.isZero()); + } + + static empty() { + return new ContractClassLog(AztecAddress.ZERO, new Array(CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS).fill(Fr.ZERO)); + } + + toBuffer(): Buffer { + return serializeToBuffer([this.contractAddress, this.fields]); + } + + static fromBuffer(buffer: Buffer | BufferReader) { + const reader = BufferReader.asReader(buffer); + // Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + // reader.readArray(CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, Fr); + const address = reader.readObject(AztecAddress); + const fields = Array.from({ length: CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS }, () => + reader.remainingBytes() == 0 ? Fr.ZERO : Fr.fromBuffer(reader), + ); + return new ContractClassLog(address, fields); + } + + clone() { + return ContractClassLog.fromBuffer(this.toBuffer()); + } + + static async random() { + // NB: Using half the maximum number of fields per log because max fields keeps overfilling blobs in tests. + // Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + // makeTuple(CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, Fr.random); + const fields = Array.from({ length: Math.ceil(CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS / 2) }, () => Fr.random()); + return new ContractClassLog( + await AztecAddress.random(), + fields.concat(Array.from({ length: Math.floor(CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS / 2) }, () => Fr.ZERO)), + ); + } + + getEmittedLength() { + // This assumes that we cut trailing zeroes from the end of the log. In ts, these will always be added back. + // Does not include address and length prefix. + return this.getEmittedFields().length; + } + + getEmittedFields() { + let lastZeroIndex = 0; + for (let i = this.fields.length - 1; i >= 0; i--) { + if (!this.fields[i].isZero() && lastZeroIndex == 0) { + lastZeroIndex = i + 1; + break; + } + } + return this.fields.slice(0, lastZeroIndex); + } + + async hash() { + return await poseidon2Hash(this.getEmittedFields()); + } + + static get schema() { + return z + .object({ + contractAddress: AztecAddress.schema, + fields: z.array(schemas.Fr), + }) + .transform(({ contractAddress, fields }) => ContractClassLog.fromFields([contractAddress.toField(), ...fields])); + } + + [inspect.custom](): string { + return `ContractClassLog { + fields: [${this.fields.map((x: Fr) => inspect(x)).join(', ')}], + }`; + } +} diff --git a/yarn-project/stdlib/src/logs/extended_unencrypted_l2_log.ts b/yarn-project/stdlib/src/logs/extended_contract_class_log.ts similarity index 50% rename from yarn-project/stdlib/src/logs/extended_unencrypted_l2_log.ts rename to yarn-project/stdlib/src/logs/extended_contract_class_log.ts index 4181cd720308..425ee5bbb6f5 100644 --- a/yarn-project/stdlib/src/logs/extended_unencrypted_l2_log.ts +++ b/yarn-project/stdlib/src/logs/extended_contract_class_log.ts @@ -6,36 +6,35 @@ import type { FieldsOf } from '@aztec/foundation/types'; import isEqual from 'lodash.isequal'; import { z } from 'zod'; +import { ContractClassLog } from './contract_class_log.js'; import { LogId } from './log_id.js'; -import { UnencryptedL2Log } from './unencrypted_l2_log.js'; /** - * Represents an individual unencrypted log entry extended with info about the block and tx it was emitted in. - * TODO(#8945): Currently only used for contract class logs. When these are fields, delete this class. + * Represents an individual contract class log entry extended with info about the block and tx it was emitted in. */ -export class ExtendedUnencryptedL2Log { +export class ExtendedContractClassLog { constructor( /** Globally unique id of the log. */ public readonly id: LogId, /** The data contents of the log. */ - public readonly log: UnencryptedL2Log, + public readonly log: ContractClassLog, ) {} static async random() { - return new ExtendedUnencryptedL2Log(LogId.random(), await UnencryptedL2Log.random()); + return new ExtendedContractClassLog(LogId.random(), await ContractClassLog.random()); } - static get schema(): ZodFor { + static get schema(): ZodFor { return z .object({ id: LogId.schema, - log: UnencryptedL2Log.schema, + log: ContractClassLog.schema, }) - .transform(ExtendedUnencryptedL2Log.from); + .transform(ExtendedContractClassLog.from); } - static from(fields: FieldsOf) { - return new ExtendedUnencryptedL2Log(fields.id, fields.log); + static from(fields: FieldsOf) { + return new ExtendedContractClassLog(fields.id, fields.log); } /** @@ -55,19 +54,11 @@ export class ExtendedUnencryptedL2Log { } /** - * Serializes log to a human readable string. - * @returns A human readable representation of the log. - */ - public toHumanReadable(): string { - return `${this.id.toHumanReadable()}, ${this.log.toHumanReadable()}`; - } - - /** - * Checks if two ExtendedUnencryptedL2Log objects are equal. - * @param other - Another ExtendedUnencryptedL2Log object to compare with. + * Checks if two ExtendedContractClassLog objects are equal. + * @param other - Another ExtendedContractClassLog object to compare with. * @returns True if the two objects are equal, false otherwise. */ - public equals(other: ExtendedUnencryptedL2Log): boolean { + public equals(other: ExtendedContractClassLog): boolean { return isEqual(this, other); } @@ -76,21 +67,21 @@ export class ExtendedUnencryptedL2Log { * @param buffer - The buffer or buffer reader containing the log. * @returns Deserialized instance of `Log`. */ - public static fromBuffer(buffer: Buffer | BufferReader): ExtendedUnencryptedL2Log { + public static fromBuffer(buffer: Buffer | BufferReader): ExtendedContractClassLog { const reader = BufferReader.asReader(buffer); const logId = LogId.fromBuffer(reader); - const log = UnencryptedL2Log.fromBuffer(reader); + const log = ContractClassLog.fromBuffer(reader); - return new ExtendedUnencryptedL2Log(logId, log); + return new ExtendedContractClassLog(logId, log); } /** - * Deserializes `ExtendedUnencryptedL2Log` object from a hex string representation. + * Deserializes `ExtendedContractClassLog` object from a hex string representation. * @param data - A hex string representation of the log. - * @returns An `ExtendedUnencryptedL2Log` object. + * @returns An `ExtendedContractClassLog` object. */ - public static fromString(data: string): ExtendedUnencryptedL2Log { - return ExtendedUnencryptedL2Log.fromBuffer(hexToBuffer(data)); + public static fromString(data: string): ExtendedContractClassLog { + return ExtendedContractClassLog.fromBuffer(hexToBuffer(data)); } } diff --git a/yarn-project/stdlib/src/logs/function_l2_logs.test.ts b/yarn-project/stdlib/src/logs/function_l2_logs.test.ts deleted file mode 100644 index 61e976890e12..000000000000 --- a/yarn-project/stdlib/src/logs/function_l2_logs.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { jsonStringify } from '@aztec/foundation/json-rpc'; - -import { UnencryptedFunctionL2Logs } from './function_l2_logs.js'; - -function shouldBehaveLikeFunctionL2Logs(FunctionL2Logs: typeof UnencryptedFunctionL2Logs) { - describe(FunctionL2Logs.name, () => { - it('can encode L2Logs to buffer and back', async () => { - const l2Logs = await FunctionL2Logs.random(1); - - const buffer = l2Logs.toBuffer(); - const recovered = FunctionL2Logs.fromBuffer(buffer); - - expect(recovered).toEqual(l2Logs); - }); - - it('can encode L2Logs to JSON and back', async () => { - const l2Logs = await FunctionL2Logs.random(1); - - const buffer = jsonStringify(l2Logs); - const recovered = FunctionL2Logs.schema.parse(JSON.parse(buffer)); - - expect(recovered).toEqual(l2Logs); - }); - - it('getSerializedLength returns the correct length', async () => { - const l2Logs = await FunctionL2Logs.random(1); - - const buffer = l2Logs.toBuffer(); - const recovered = FunctionL2Logs.fromBuffer(buffer); - if (FunctionL2Logs.name == 'EncryptedFunctionL2Logs') { - // For event logs, we don't 'count' the maskedContractAddress as part of the - // log length, since it's just for siloing later on - expect(recovered.getSerializedLength()).toEqual(buffer.length - 3 * 32); - } else { - expect(recovered.getSerializedLength()).toEqual(buffer.length); - } - }); - - it('getKernelLength returns the correct length', async () => { - const l2Logs = await FunctionL2Logs.random(1); - - const expectedLength = l2Logs.logs.map(l => l.length).reduce((a, b) => a + b + 4, 0); - - expect(l2Logs.getKernelLength()).toEqual(expectedLength); - }); - }); -} - -shouldBehaveLikeFunctionL2Logs(UnencryptedFunctionL2Logs); diff --git a/yarn-project/stdlib/src/logs/function_l2_logs.ts b/yarn-project/stdlib/src/logs/function_l2_logs.ts deleted file mode 100644 index bb1b6e541561..000000000000 --- a/yarn-project/stdlib/src/logs/function_l2_logs.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { MAX_CONTRACT_CLASS_LOGS_PER_CALL } from '@aztec/constants'; -import { sha256Trunc } from '@aztec/foundation/crypto'; -import type { ZodFor } from '@aztec/foundation/schemas'; -import { BufferReader, prefixBufferWithLength } from '@aztec/foundation/serialize'; - -import { z } from 'zod'; - -import { UnencryptedL2Log } from './unencrypted_l2_log.js'; - -/** - * Data container of logs emitted in 1 function invocation (corresponds to 1 kernel iteration). - */ -export class UnencryptedFunctionL2Logs { - constructor( - /** An array of logs. */ - public readonly logs: UnencryptedL2Log[], - ) {} - - /** - * Serializes all function logs into a buffer. - * @returns A buffer containing the serialized logs. - * @remarks Each log is prefixed with 4 bytes for its length, then all the serialized logs are concatenated and - * the resulting buffer is prefixed with 4 bytes for its total length. - */ - public toBuffer(): Buffer { - const serializedLogs = this.logs.map(log => prefixBufferWithLength(log.toBuffer())); - return prefixBufferWithLength(Buffer.concat(serializedLogs)); - } - - /** - * Get the total length of all serialized data - * @returns Total length of serialized data. - */ - public getSerializedLength(): number { - // adding 4 for the resulting buffer length. - return this.getKernelLength() + 4; - } - - /** - * Get the total length of all chargable data (raw log data + 4 for each log) - * TODO: Rename this? getChargableLength? getDALength? - * @returns Total length of data. - */ - public getKernelLength(): number { - // Adding 4 to each log's length to account for the size stored in the serialized buffer - return this.logs.reduce((acc, log) => acc + log.length + 4, 0); - } - - /** - * Calculates hash of serialized logs. - * @returns Buffer containing 248 bits of information of sha256 hash. - */ - public hash(): Buffer { - // Truncated SHA hash of the concatenation of the hash of each inner log - // Changed in resolving #5017 to mimic logs hashing in kernels - const preimage = Buffer.concat(this.logs.map(l => l.hash())); - return sha256Trunc(preimage); - } - - static get schema(): ZodFor { - return z - .object({ logs: z.array(UnencryptedL2Log.schema) }) - .transform(({ logs }) => new UnencryptedFunctionL2Logs(logs)); - } - - /** - * Creates an empty L2Logs object with no logs. - * @returns A new FunctionL2Logs object with no logs. - */ - public static empty(): UnencryptedFunctionL2Logs { - return new UnencryptedFunctionL2Logs([]); - } - - /** - * Deserializes logs from a buffer. - * @param buf - The buffer containing the serialized logs. - * @param isLengthPrefixed - Whether the buffer is prefixed with 4 bytes for its total length. - * @returns Deserialized instance of `FunctionL2Logs`. - */ - public static fromBuffer(buf: Buffer, isLengthPrefixed = true): UnencryptedFunctionL2Logs { - const reader = new BufferReader(buf, 0); - - // If the buffer is length prefixed use the length to read the array. Otherwise, the entire buffer is consumed. - const logsBufLength = isLengthPrefixed ? reader.readNumber() : -1; - const logs = reader.readBufferArray(logsBufLength); - - return new UnencryptedFunctionL2Logs(logs.map(UnencryptedL2Log.fromBuffer)); - } - - /** - * Creates a new L2Logs object with `numLogs` logs. - * @param numLogs - The number of logs to create. - * @returns A new UnencryptedFunctionL2Logs object. - */ - public static async random(numLogs: number): Promise { - if (numLogs > MAX_CONTRACT_CLASS_LOGS_PER_CALL) { - throw new Error(`Trying to create ${numLogs} logs for one call (max: ${MAX_CONTRACT_CLASS_LOGS_PER_CALL})`); - } - const logs: UnencryptedL2Log[] = []; - for (let i = 0; i < numLogs; i++) { - logs.push(await UnencryptedL2Log.random()); - } - return new UnencryptedFunctionL2Logs(logs); - } -} diff --git a/yarn-project/stdlib/src/logs/index.ts b/yarn-project/stdlib/src/logs/index.ts index 373aefa35f29..9a56f9043602 100644 --- a/yarn-project/stdlib/src/logs/index.ts +++ b/yarn-project/stdlib/src/logs/index.ts @@ -1,14 +1,11 @@ export * from './log_with_tx_data.js'; export * from './indexed_tagging_secret.js'; +export * from './contract_class_log.js'; export * from './public_log.js'; export * from './private_log.js'; -export * from './function_l2_logs.js'; -export * from './l2_block_l2_logs.js'; export * from './log_id.js'; export * from './log_filter.js'; -export * from './tx_l2_logs.js'; -export * from './unencrypted_l2_log.js'; -export * from './extended_unencrypted_l2_log.js'; export * from './extended_public_log.js'; +export * from './extended_contract_class_log.js'; export * from './l1_payload/index.js'; export * from './tx_scoped_l2_log.js'; diff --git a/yarn-project/stdlib/src/logs/l2_block_l2_logs.test.ts b/yarn-project/stdlib/src/logs/l2_block_l2_logs.test.ts deleted file mode 100644 index 5d8e30f3f329..000000000000 --- a/yarn-project/stdlib/src/logs/l2_block_l2_logs.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { jsonStringify } from '@aztec/foundation/json-rpc'; - -import { ContractClass2BlockL2Logs } from './l2_block_l2_logs.js'; - -function shouldBehaveLikeL2BlockL2Logs(L2BlockL2Logs: typeof ContractClass2BlockL2Logs) { - describe(L2BlockL2Logs.name, () => { - it('can encode L2Logs to buffer and back', async () => { - const l2Logs = await L2BlockL2Logs.random(3, 1, 1); - const buffer = l2Logs.toBuffer(); - const recovered = L2BlockL2Logs.fromBuffer(buffer); - - expect(recovered).toEqual(l2Logs); - }); - - it('getSerializedLength returns the correct length', async () => { - const l2Logs = await L2BlockL2Logs.random(3, 1, 1); - const buffer = l2Logs.toBuffer(); - const recovered = L2BlockL2Logs.fromBuffer(buffer); - expect(recovered.getSerializedLength()).toEqual(buffer.length); - }); - - it('serializes to and from JSON via schema', async () => { - const l2Logs = await L2BlockL2Logs.random(3, 1, 1); - const json = jsonStringify(l2Logs); - const recovered = L2BlockL2Logs.schema.parse(JSON.parse(json)); - expect(recovered).toEqual(l2Logs); - expect(recovered).toBeInstanceOf(L2BlockL2Logs); - }); - }); -} - -shouldBehaveLikeL2BlockL2Logs(ContractClass2BlockL2Logs); diff --git a/yarn-project/stdlib/src/logs/l2_block_l2_logs.ts b/yarn-project/stdlib/src/logs/l2_block_l2_logs.ts deleted file mode 100644 index ab053bde6a8b..000000000000 --- a/yarn-project/stdlib/src/logs/l2_block_l2_logs.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { BufferReader, prefixBufferWithLength } from '@aztec/foundation/serialize'; -import { bufferToHex, hexToBuffer } from '@aztec/foundation/string'; - -import isEqual from 'lodash.isequal'; -import { z } from 'zod'; - -import { ContractClassTxL2Logs, type TxL2Logs } from './tx_l2_logs.js'; -import type { UnencryptedL2Log } from './unencrypted_l2_log.js'; - -/** - * Data container of logs emitted in all txs in a given L2 block. - */ -abstract class L2BlockL2Logs { - constructor( - /** - * An array containing logs emitted in individual function invocations in this tx. - */ - public readonly txLogs: TxL2Logs[], - ) {} - - /** - * Serializes logs into a buffer. - * @returns A buffer containing the serialized logs. - */ - public toBuffer(): Buffer { - const serializedTxLogs = this.txLogs.map(logs => logs.toBuffer()); - // Concatenate all serialized function logs into a single buffer and prefix it with 4 bytes for its total length. - return prefixBufferWithLength(Buffer.concat(serializedTxLogs)); - } - - /** - * Get the total length of serialized data. - * @returns Total length of serialized data. - */ - public getSerializedLength(): number { - return this.txLogs.reduce((acc, logs) => acc + logs.getSerializedLength(), 0) + 4; - } - - /** - * Gets the total number of logs emitted from all the TxL2Logs. - */ - public getTotalLogCount(): number { - return this.txLogs.reduce((acc, logs) => acc + logs.getTotalLogCount(), 0); - } - - /** - * Seralizes logs into a string. - * @returns A string representation of the serialized logs. - */ - public toString(): string { - return bufferToHex(this.toBuffer()); - } - - /** - * Checks if two L2BlockL2Logs objects are equal. - * @param other - Another L2BlockL2Logs object to compare with. - * @returns True if the two objects are equal, false otherwise. - */ - public equals(other: L2BlockL2Logs): boolean { - return isEqual(this, other); - } - - /** - * Returns the total number of log entries across an array of L2BlockL2Logs. - * @param l2BlockL2logs - L2BlockL2Logs to sum over. - * @returns Total sum of log entries. - */ - public static getTotalLogCount(l2BlockL2logs: L2BlockL2Logs[]): number { - return l2BlockL2logs.reduce((sum, log) => sum + log.getTotalLogCount(), 0); - } -} - -export class ContractClass2BlockL2Logs extends L2BlockL2Logs { - // This class is identical in methods to UnencryptedL2BlockL2Logs, but its - // consistuent ContractClassTxL2Logs must be treated differently, hence new class. - static get schema() { - return z - .object({ txLogs: z.array(ContractClassTxL2Logs.schema) }) - .transform(({ txLogs }) => new ContractClass2BlockL2Logs(txLogs)); - } - - public get type() { - return 'ContractClass'; - } - - /** - * Deserializes logs from a buffer. - * @param buffer - The buffer containing the serialized logs. - * @returns A new `L2BlockL2Logs` object. - */ - public static fromBuffer(buffer: Buffer | BufferReader): ContractClass2BlockL2Logs { - const reader = BufferReader.asReader(buffer); - - const logsBufLength = reader.readNumber(); - const serializedTxLogs = reader.readBufferArray(logsBufLength); - - const txLogs = serializedTxLogs.map(logs => ContractClassTxL2Logs.fromBuffer(logs, false)); - return new ContractClass2BlockL2Logs(txLogs); - } - - /** - * Deserializes logs from a string. - * @param data - The string containing the serialized logs. - * @returns A new `L2BlockL2Logs` object. - */ - public static fromString(data: string): ContractClass2BlockL2Logs { - return ContractClass2BlockL2Logs.fromBuffer(hexToBuffer(data)); - } - - /** - * Creates a new `L2BlockL2Logs` object with `numCalls` function logs and `numLogsPerCall` logs in each function - * call. - * @param numTxs - The number of txs in the block. - * @param numCalls - The number of function calls in the tx. - * @param numLogsPerCall - The number of logs emitted in each function call. - * @returns A new `L2BlockL2Logs` object. - */ - public static async random( - numTxs: number, - numCalls: number, - numLogsPerCall: number, - ): Promise { - const txLogs: ContractClassTxL2Logs[] = []; - for (let i = 0; i < numTxs; i++) { - txLogs.push(await ContractClassTxL2Logs.random(numCalls, numLogsPerCall)); - } - return new ContractClass2BlockL2Logs(txLogs); - } - - /** - * Unrolls logs from a set of blocks. - * @param blockLogs - Input logs from a set of blocks. - * @returns Unrolled logs. - */ - public static unrollLogs(blockLogs: (ContractClass2BlockL2Logs | undefined)[]): UnencryptedL2Log[] { - const logs: UnencryptedL2Log[] = []; - for (const blockLog of blockLogs) { - if (blockLog) { - for (const txLog of blockLog.txLogs) { - logs.push(...txLog.unrollLogs()); - } - } - } - return logs; - } -} diff --git a/yarn-project/stdlib/src/logs/tx_l2_logs.test.ts b/yarn-project/stdlib/src/logs/tx_l2_logs.test.ts deleted file mode 100644 index a81e5b3da8db..000000000000 --- a/yarn-project/stdlib/src/logs/tx_l2_logs.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { jsonStringify } from '@aztec/foundation/json-rpc'; - -import { ContractClassTxL2Logs } from './tx_l2_logs.js'; - -function shouldBehaveLikeTxL2Logs(TxL2Logs: typeof ContractClassTxL2Logs) { - describe(TxL2Logs.name, () => { - it('can encode TxL2Logs to buffer and back', async () => { - const l2Logs = await TxL2Logs.random(1, 1); - const buffer = l2Logs.toBuffer(); - const recovered = TxL2Logs.fromBuffer(buffer); - - expect(recovered).toEqual(l2Logs); - }); - - it('can encode TxL2Logs to JSON and back', async () => { - const l2Logs = await TxL2Logs.random(1, 1); - const buffer = jsonStringify(l2Logs); - const recovered = TxL2Logs.schema.parse(JSON.parse(buffer)); - - expect(recovered).toEqual(l2Logs); - }); - - it('getSerializedLength returns the correct length', async () => { - const l2Logs = await TxL2Logs.random(1, 1); - const buffer = l2Logs.toBuffer(); - const recovered = TxL2Logs.fromBuffer(buffer); - expect(recovered.getSerializedLength()).toEqual(buffer.length); - }); - - it('getKernelLength returns the correct length', async () => { - const l2Logs = await TxL2Logs.random(1, 1); - const expectedLength = l2Logs.functionLogs.map(l => l.getKernelLength()).reduce((a, b) => a + b, 0); - - expect(l2Logs.getKernelLength()).toEqual(expectedLength); - }); - }); -} - -shouldBehaveLikeTxL2Logs(ContractClassTxL2Logs); diff --git a/yarn-project/stdlib/src/logs/tx_l2_logs.ts b/yarn-project/stdlib/src/logs/tx_l2_logs.ts deleted file mode 100644 index ca0c9e2d66d6..000000000000 --- a/yarn-project/stdlib/src/logs/tx_l2_logs.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { MAX_CONTRACT_CLASS_LOGS_PER_TX } from '@aztec/constants'; -import { sha256Trunc } from '@aztec/foundation/crypto'; -import { Fr } from '@aztec/foundation/fields'; -import { BufferReader, prefixBufferWithLength } from '@aztec/foundation/serialize'; - -import isEqual from 'lodash.isequal'; -import { z } from 'zod'; - -import type { LogHash, ScopedLogHash } from '../kernel/log_hash.js'; -import { UnencryptedFunctionL2Logs } from './function_l2_logs.js'; -import type { UnencryptedL2Log } from './unencrypted_l2_log.js'; - -/** - * Data container of logs emitted in 1 tx. - * TODO(#8945): Currently only used for contract class logs. When these are fields, delete this class. - */ -export abstract class TxL2Logs { - abstract hash(): Buffer; - - constructor( - /** An array containing logs emitted in individual function invocations in this tx. */ - public readonly functionLogs: UnencryptedFunctionL2Logs[], - ) {} - - /** - * Serializes logs into a buffer. - * @returns A buffer containing the serialized logs. - */ - public toBuffer(): Buffer { - const serializedFunctionLogs = this.functionLogs.map(logs => logs.toBuffer()); - // Concatenate all serialized function logs into a single buffer and prefix it with 4 bytes for its total length. - return prefixBufferWithLength(Buffer.concat(serializedFunctionLogs)); - } - - /** - * Get the total length of serialized data. - * @returns Total length of serialized data. - */ - public getSerializedLength(): number { - return this.functionLogs.reduce((acc, logs) => acc + logs.getSerializedLength(), 0) + 4; - } - - /** - * Get the total length of all chargable data (raw log data + 4 for each log) - * TODO: Rename this? getChargableLength? getDALength? - * @returns Total length of data. - */ - public getKernelLength(): number { - return this.functionLogs.reduce((acc, logs) => acc + logs.getKernelLength(), 0); - } - - /** Gets the total number of logs. */ - public getTotalLogCount() { - return this.functionLogs.reduce((acc, logs) => acc + logs.logs.length, 0); - } - - /** - * Adds function logs to the existing logs. - * @param functionLogs - The function logs to add - * @remarks Used by sequencer to append unencrypted logs emitted in public function calls. - */ - public addFunctionLogs(functionLogs: UnencryptedFunctionL2Logs[]) { - this.functionLogs.push(...functionLogs); - } - - /** - * Unrolls logs from this tx. - * @returns Unrolled logs. - */ - public unrollLogs(): UnencryptedL2Log[] { - return this.functionLogs.flatMap(functionLog => functionLog.logs); - } - - /** - * Checks if two TxL2Logs objects are equal. - * @param other - Another TxL2Logs object to compare with. - * @returns True if the two objects are equal, false otherwise. - */ - public equals(other: TxL2Logs): boolean { - return isEqual(this, other); - } - - /** - * Filter the logs from functions from this TxL2Logs that - * appear in the provided logHashes - * @param logHashes hashes we want to keep - * @param output our aggregation - * @returns our aggregation - */ - public filter(logHashes: LogHash[], output: TxL2Logs): TxL2Logs { - for (const fnLogs of this.functionLogs) { - let include = false; - for (const log of fnLogs.logs) { - if (logHashes.findIndex(lh => lh.value.equals(Fr.fromBuffer(log.getSiloedHash()))) !== -1) { - include = true; - } - } - if (include) { - output.addFunctionLogs([fnLogs]); - } - } - return output; - } - - /** - * Filter the logs from functions from this TxL2Logs that - * appear in the provided scopedLogHashes - * @param logHashes hashes we want to keep - * @param output our aggregation - * @returns our aggregation - */ - public filterScoped(scopedLogHashes: ScopedLogHash[], output: TxL2Logs): TxL2Logs { - for (const fnLogs of this.functionLogs) { - let include = false; - for (const log of fnLogs.logs) { - let contractAddress: any; - if ('contractAddress' in log) { - contractAddress = log.contractAddress; - } else { - throw new Error("Can't run filterScoped in logs without contractAddress or maskedContractAddress"); - } - if ( - scopedLogHashes.findIndex( - slh => slh.contractAddress.equals(contractAddress) && slh.value.equals(Fr.fromBuffer(log.hash())), - ) != -1 - ) { - include = true; - } - } - if (include) { - output.addFunctionLogs([fnLogs]); - } - } - return output; - } -} - -export class ContractClassTxL2Logs extends TxL2Logs { - static get schema() { - return z - .object({ functionLogs: z.array(UnencryptedFunctionL2Logs.schema) }) - .transform(({ functionLogs }) => new ContractClassTxL2Logs(functionLogs)); - } - - /** Creates an empty instance. */ - public static empty() { - return new ContractClassTxL2Logs([]); - } - - /** - * Deserializes logs from a buffer. - * @param buf - The buffer containing the serialized logs. - * @param isLengthPrefixed - Whether the buffer is prefixed with 4 bytes for its total length. - * @returns A new L2Logs object. - */ - public static fromBuffer(buf: Buffer | BufferReader, isLengthPrefixed = true): ContractClassTxL2Logs { - const reader = BufferReader.asReader(buf); - - // If the buffer is length prefixed use the length to read the array. Otherwise, the entire buffer is consumed. - const logsBufLength = isLengthPrefixed ? reader.readNumber() : -1; - const serializedFunctionLogs = reader.readBufferArray(logsBufLength); - - const functionLogs = serializedFunctionLogs.map(logs => UnencryptedFunctionL2Logs.fromBuffer(logs, false)); - return new ContractClassTxL2Logs(functionLogs); - } - - /** - * Creates a new `TxL2Logs` object with `numCalls` function logs and `numLogsPerCall` logs in each invocation. - * @param numCalls - The number of function calls in the tx. - * @param numLogsPerCall - The number of logs emitted in each function call. - * @returns A new `TxL2Logs` object. - */ - public static async random(numCalls: number, numLogsPerCall: number): Promise { - if (numCalls * numLogsPerCall > MAX_CONTRACT_CLASS_LOGS_PER_TX) { - throw new Error( - `Trying to create ${numCalls * numLogsPerCall} logs for one tx (max: ${MAX_CONTRACT_CLASS_LOGS_PER_TX})`, - ); - } - const functionLogs: UnencryptedFunctionL2Logs[] = []; - for (let i = 0; i < numCalls; i++) { - functionLogs.push(await UnencryptedFunctionL2Logs.random(numLogsPerCall)); - } - return new ContractClassTxL2Logs(functionLogs); - } - - /** - * @param logs - Logs to be hashed. - * @returns The hash of the logs. - * Note: This is a TS implementation of `computeKernelUnencryptedLogsHash` function in Decoder.sol. See that function documentation - * for more details. - */ - public override hash(): Buffer { - const unrolledLogs = this.unrollLogs(); - return ContractClassTxL2Logs.hashSiloedLogs(unrolledLogs.map(log => log.getSiloedHash())); - } - - /** - * Hashes siloed contract class logs as in the same way as the base rollup would. - * @param siloedLogHashes - The siloed log hashes - * @returns The hash of the logs. - */ - public static hashSiloedLogs(siloedLogHashes: Buffer[]): Buffer { - if (siloedLogHashes.length == 0) { - return Buffer.alloc(32); - } - - let allSiloedLogHashes = Buffer.alloc(0); - for (const siloedLogHash of siloedLogHashes) { - allSiloedLogHashes = Buffer.concat([allSiloedLogHashes, siloedLogHash]); - } - // pad the end of logs with 0s - for (let i = 0; i < MAX_CONTRACT_CLASS_LOGS_PER_TX - siloedLogHashes.length; i++) { - allSiloedLogHashes = Buffer.concat([allSiloedLogHashes, Buffer.alloc(32)]); - } - - return sha256Trunc(allSiloedLogHashes); - } -} diff --git a/yarn-project/stdlib/src/logs/unencrypted_l2_log.test.ts b/yarn-project/stdlib/src/logs/unencrypted_l2_log.test.ts deleted file mode 100644 index 079202f1bce2..000000000000 --- a/yarn-project/stdlib/src/logs/unencrypted_l2_log.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { jsonStringify } from '@aztec/foundation/json-rpc'; - -import { UnencryptedL2Log } from './unencrypted_l2_log.js'; - -describe('UnencryptedL2Log', () => { - it('can encode L2Logs to buffer and back', async () => { - const l2Logs = await UnencryptedL2Log.random(); - - const buffer = l2Logs.toBuffer(); - const recovered = UnencryptedL2Log.fromBuffer(buffer); - - expect(recovered).toEqual(l2Logs); - }); - - it('can encode to JSON and back', async () => { - const l2Logs = await UnencryptedL2Log.random(); - - const buffer = jsonStringify(l2Logs); - const recovered = UnencryptedL2Log.schema.parse(JSON.parse(buffer)); - - expect(recovered).toEqual(l2Logs); - }); -}); diff --git a/yarn-project/stdlib/src/logs/unencrypted_l2_log.ts b/yarn-project/stdlib/src/logs/unencrypted_l2_log.ts deleted file mode 100644 index e94d5cc6b965..000000000000 --- a/yarn-project/stdlib/src/logs/unencrypted_l2_log.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { randomBytes, sha256Trunc } from '@aztec/foundation/crypto'; -import { BufferReader, prefixBufferWithLength, toHumanReadable } from '@aztec/foundation/serialize'; - -import { z } from 'zod'; - -import { AztecAddress } from '../aztec-address/index.js'; -import { type ZodFor, schemas } from '../schemas/index.js'; - -/** - * Represents an individual unencrypted log entry. - * TODO(#8945): Currently only used for contract class logs. When these are fields, delete this class. - */ -export class UnencryptedL2Log { - constructor( - /** - * Address of the contract that emitted the event - * NOTE: It would make sense to have the address only in `FunctionL2Logs` because contract address is shared for all - * function logs. I didn't do this because it would require us to have 2 FunctionL2Logs classes (one with contract - * address and one without) for unencrypted and encrypted because encrypted logs can't expose the address in an - * unencrypted form. For this reason separating the classes seems like a premature optimization. - * TODO: Optimize this once it makes sense. - */ - public readonly contractAddress: AztecAddress, - /** The data contents of the log. */ - public readonly data: Buffer, - ) {} - - get length(): number { - // This +4 is because we prefix the log length - see toBuffer below - return this.data.length + AztecAddress.SIZE_IN_BYTES + 4; - } - - /** - * Serializes log to a buffer. - * @returns A buffer containing the serialized log. - */ - public toBuffer(): Buffer { - return Buffer.concat([this.contractAddress.toBuffer(), prefixBufferWithLength(this.data)]); - } - - /** - * Serializes log to a human readable string. - * Outputs the log data as ascii if all bytes are valid ascii characters between 32 and 126, or as hex otherwise. - * @returns A human readable representation of the log. - */ - public toHumanReadable(): string { - const payload = toHumanReadable(this.data); - return `UnencryptedL2Log(contractAddress: ${this.contractAddress.toString()}, data: ${payload})`; - } - - static get schema(): ZodFor { - return z - .object({ contractAddress: schemas.AztecAddress, data: schemas.Buffer }) - .transform(({ contractAddress, data }) => new UnencryptedL2Log(contractAddress, data)); - } - - /** - * Deserializes log from a buffer. - * @param buffer - The buffer or buffer reader containing the log. - * @returns Deserialized instance of `Log`. - */ - public static fromBuffer(buffer: Buffer | BufferReader): UnencryptedL2Log { - const reader = BufferReader.asReader(buffer); - const contractAddress = AztecAddress.fromBuffer(reader); - const data = reader.readBuffer(); - return new UnencryptedL2Log(contractAddress, data); - } - - /** - * Calculates hash of serialized logs. - * @returns Buffer containing 248 bits of information of sha256 hash. - */ - public hash(): Buffer { - const preimage = this.toBuffer(); - return sha256Trunc(preimage); - } - - /** - * Calculates siloed hash of serialized logs. - * In the kernels, we use the storage contract address and not the one encoded here. - * They should match, so it seems fine to use the existing info here. - * @returns Buffer containing 248 bits of information of sha256 hash. - */ - public getSiloedHash(): Buffer { - const hash = this.hash(); - return sha256Trunc(Buffer.concat([this.contractAddress.toBuffer(), hash])); - } - - /** - * Crates a random log. - * @returns A random log. - */ - public static async random(): Promise { - const contractAddress = await AztecAddress.random(); - const dataLength = randomBytes(1)[0]; - const data = randomBytes(dataLength); - return new UnencryptedL2Log(contractAddress, data); - } -} diff --git a/yarn-project/stdlib/src/rollup/base_rollup_hints.ts b/yarn-project/stdlib/src/rollup/base_rollup_hints.ts index 0bb14d0d7e30..33e9ad1c7f4b 100644 --- a/yarn-project/stdlib/src/rollup/base_rollup_hints.ts +++ b/yarn-project/stdlib/src/rollup/base_rollup_hints.ts @@ -1,11 +1,13 @@ import { SpongeBlob } from '@aztec/blob-lib'; -import { ARCHIVE_HEIGHT } from '@aztec/constants'; -import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; +import { ARCHIVE_HEIGHT, MAX_CONTRACT_CLASS_LOGS_PER_TX } from '@aztec/constants'; +import { makeTuple } from '@aztec/foundation/array'; +import { BufferReader, type Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; import { bufferToHex, hexToBuffer } from '@aztec/foundation/string'; import { MembershipWitness } from '@aztec/foundation/trees'; import type { FieldsOf } from '@aztec/foundation/types'; import { PublicDataHint } from '../avm/public_data_hint.js'; +import { ContractClassLog } from '../logs/contract_class_log.js'; import { PartialStateReference } from '../tx/partial_state_reference.js'; import { ConstantRollupData } from './constant_rollup_data.js'; import { PrivateBaseStateDiffHints } from './state_diff_hints.js'; @@ -14,19 +16,30 @@ export type BaseRollupHints = PrivateBaseRollupHints | PublicBaseRollupHints; export class PrivateBaseRollupHints { constructor( - /** Partial state reference at the start of the rollup. */ + /** + * Partial state reference at the start of the rollup. + */ public start: PartialStateReference, - /** Sponge state to absorb blob inputs at the start of the rollup. */ + /** + * Sponge state to absorb blob inputs at the start of the rollup. + */ public startSpongeBlob: SpongeBlob, - /** Hints used while proving state diff validity. */ + /** + * Hints used while proving state diff validity. + */ public stateDiffHints: PrivateBaseStateDiffHints, - /** Public data read hint for accessing the balance of the fee payer. */ + /** + * Public data read hint for accessing the balance of the fee payer. + */ public feePayerFeeJuiceBalanceReadHint: PublicDataHint, - /** * Membership witnesses of blocks referred by each of the 2 kernels. */ public archiveRootMembershipWitness: MembershipWitness, + /** + * Preimages to the kernel's contractClassLogsHashes. + */ + public contractClassLogsPreimages: Tuple, /** * Data which is not modified by the base rollup circuit. */ @@ -44,6 +57,7 @@ export class PrivateBaseRollupHints { fields.stateDiffHints, fields.feePayerFeeJuiceBalanceReadHint, fields.archiveRootMembershipWitness, + fields.contractClassLogsPreimages, fields.constants, ] as const; } @@ -72,6 +86,7 @@ export class PrivateBaseRollupHints { reader.readObject(PrivateBaseStateDiffHints), reader.readObject(PublicDataHint), MembershipWitness.fromBuffer(reader, ARCHIVE_HEIGHT), + reader.readArray(MAX_CONTRACT_CLASS_LOGS_PER_TX, ContractClassLog), reader.readObject(ConstantRollupData), ); } @@ -87,6 +102,7 @@ export class PrivateBaseRollupHints { PrivateBaseStateDiffHints.empty(), PublicDataHint.empty(), MembershipWitness.empty(ARCHIVE_HEIGHT), + makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, ContractClassLog.empty), ConstantRollupData.empty(), ); } @@ -94,12 +110,18 @@ export class PrivateBaseRollupHints { export class PublicBaseRollupHints { constructor( - /** Sponge state to absorb blob inputs at the start of the rollup. */ + /** + * Sponge state to absorb blob inputs at the start of the rollup. + */ public startSpongeBlob: SpongeBlob, /** * Membership witnesses of blocks referred by each of the 2 kernels. */ public archiveRootMembershipWitness: MembershipWitness, + /** + * Preimages to the kernel's contractClassLogsHashes. + */ + public contractClassLogsPreimages: Tuple, /** * Data which is not modified by the base rollup circuit. */ @@ -111,7 +133,12 @@ export class PublicBaseRollupHints { } static getFields(fields: FieldsOf) { - return [fields.startSpongeBlob, fields.archiveRootMembershipWitness, fields.constants] as const; + return [ + fields.startSpongeBlob, + fields.archiveRootMembershipWitness, + fields.contractClassLogsPreimages, + fields.constants, + ] as const; } /** @@ -135,6 +162,7 @@ export class PublicBaseRollupHints { return new PublicBaseRollupHints( reader.readObject(SpongeBlob), MembershipWitness.fromBuffer(reader, ARCHIVE_HEIGHT), + reader.readArray(MAX_CONTRACT_CLASS_LOGS_PER_TX, ContractClassLog), reader.readObject(ConstantRollupData), ); } @@ -147,6 +175,7 @@ export class PublicBaseRollupHints { return new PublicBaseRollupHints( SpongeBlob.empty(), MembershipWitness.empty(ARCHIVE_HEIGHT), + makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, ContractClassLog.empty), ConstantRollupData.empty(), ); } diff --git a/yarn-project/stdlib/src/stats/stats.ts b/yarn-project/stdlib/src/stats/stats.ts index 9c9e8ec4076a..0cd7493098c7 100644 --- a/yarn-project/stdlib/src/stats/stats.ts +++ b/yarn-project/stdlib/src/stats/stats.ts @@ -222,7 +222,7 @@ export type TxStats = { privateLogCount: number; /** How many classes were registered through the canonical class registerer. */ classRegisteredCount: number; - /** Serialized size of contract class logs. */ + /** Serialized size of contract class logs in fields. */ contractClassLogSize: number; /** How this tx pays for its fee */ feePaymentMethod: 'fee_juice' | 'fpc_public' | 'fpc_private'; diff --git a/yarn-project/stdlib/src/tests/factories.ts b/yarn-project/stdlib/src/tests/factories.ts index 0282248ed9ed..6bdb34b4ac73 100644 --- a/yarn-project/stdlib/src/tests/factories.ts +++ b/yarn-project/stdlib/src/tests/factories.ts @@ -4,6 +4,7 @@ import { AVM_PROOF_LENGTH_IN_FIELDS, AZTEC_MAX_EPOCH_DURATION, BLOBS_PER_BLOCK, + CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS, FIELDS_PER_BLOB, FIXED_DA_GAS, FIXED_L2_GAS, @@ -109,6 +110,7 @@ import { PrivateLogData } from '../kernel/private_log_data.js'; import { PrivateToRollupKernelCircuitPublicInputs } from '../kernel/private_to_rollup_kernel_circuit_public_inputs.js'; import { CountedPublicCallRequest, PublicCallRequest } from '../kernel/public_call_request.js'; import { PublicKeys, computeAddress } from '../keys/index.js'; +import { ContractClassLog } from '../logs/contract_class_log.js'; import { PrivateLog } from '../logs/private_log.js'; import { PublicLog } from '../logs/public_log.js'; import { L2ToL1Message, ScopedL2ToL1Message } from '../messaging/l2_to_l1_message.js'; @@ -168,7 +170,7 @@ import { mockTx } from './mocks.js'; * @returns A side effect object. */ function makeLogHash(seed: number) { - return new LogHash(fr(seed), seed + 1, fr(seed + 2)); + return new LogHash(fr(seed), seed + 1, seed + 2); } function makeScopedLogHash(seed: number) { @@ -183,6 +185,14 @@ function makeNullifier(seed: number) { return new Nullifier(fr(seed), seed + 1, fr(seed + 2)); } +function makeContractClassLog(seed: number) { + // The '* 1' removes the 'Type instantiation is excessively deep and possibly infinite. ts(2589)' err + return new ContractClassLog( + makeAztecAddress(seed), + makeTuple(CONTRACT_CLASS_LOG_DATA_SIZE_IN_FIELDS * 1, fr, seed + 1), + ); +} + function makePrivateLog(seed: number) { return new PrivateLog(makeTuple(PRIVATE_LOG_SIZE_IN_FIELDS, fr, seed)); } @@ -314,7 +324,6 @@ export function makePrivateToRollupAccumulatedData(seed = 1, full = false): Priv tupleGenerator(MAX_L2_TO_L1_MSGS_PER_TX, makeScopedL2ToL1Message, seed + 0x600, ScopedL2ToL1Message.empty), tupleGenerator(MAX_PRIVATE_LOGS_PER_TX, makePrivateLog, seed + 0x700, PrivateLog.empty), tupleGenerator(MAX_CONTRACT_CLASS_LOGS_PER_TX, makeScopedLogHash, seed + 0xa00, ScopedLogHash.empty), // contract class logs - fr(seed + 0xe00), // contract_class_log_preimages_length ); } @@ -1060,6 +1069,8 @@ function makePrivateBaseRollupHints(seed = 1) { const archiveRootMembershipWitness = makeMembershipWitness(ARCHIVE_HEIGHT, seed + 0x9000); + const contractClassLogsPreimages = makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, makeContractClassLog, seed + 0x800); + const constants = makeConstantRollupData(0x100); const feePayerFeeJuiceBalanceReadHint = PublicDataHint.empty(); @@ -1068,9 +1079,10 @@ function makePrivateBaseRollupHints(seed = 1) { start, startSpongeBlob, stateDiffHints, + feePayerFeeJuiceBalanceReadHint, archiveRootMembershipWitness, + contractClassLogsPreimages, constants, - feePayerFeeJuiceBalanceReadHint, }); } @@ -1079,11 +1091,14 @@ function makePublicBaseRollupHints(seed = 1) { const archiveRootMembershipWitness = makeMembershipWitness(ARCHIVE_HEIGHT, seed + 0x9000); + const contractClassLogsPreimages = makeTuple(MAX_CONTRACT_CLASS_LOGS_PER_TX, makeContractClassLog, seed + 0x800); + const constants = makeConstantRollupData(0x100); return PublicBaseRollupHints.from({ startSpongeBlob, archiveRootMembershipWitness, + contractClassLogsPreimages, constants, }); } diff --git a/yarn-project/stdlib/src/tests/mocks.ts b/yarn-project/stdlib/src/tests/mocks.ts index abf82abd7319..53dd8e17c4ee 100644 --- a/yarn-project/stdlib/src/tests/mocks.ts +++ b/yarn-project/stdlib/src/tests/mocks.ts @@ -20,7 +20,6 @@ import { PrivateKernelTailCircuitPublicInputs, } from '../kernel/private_kernel_tail_circuit_public_inputs.js'; import { PrivateToPublicAccumulatedDataBuilder } from '../kernel/private_to_public_accumulated_data_builder.js'; -import { ContractClassTxL2Logs } from '../logs/index.js'; import { ExtendedNote, UniqueNote } from '../note/extended_note.js'; import { Note } from '../note/note.js'; import { BlockAttestation } from '../p2p/block_attestation.js'; @@ -200,13 +199,7 @@ export const mockTx = async ( .build(); } - const tx = new Tx( - data, - clientIvcProof, - ContractClassTxL2Logs.empty(), - enqueuedPublicFunctionCalls, - publicTeardownFunctionCall, - ); + const tx = new Tx(data, clientIvcProof, [], enqueuedPublicFunctionCalls, publicTeardownFunctionCall); return tx; }; diff --git a/yarn-project/stdlib/src/tx/private_execution_result.ts b/yarn-project/stdlib/src/tx/private_execution_result.ts index 37a51e6884d7..0788c91b8da2 100644 --- a/yarn-project/stdlib/src/tx/private_execution_result.ts +++ b/yarn-project/stdlib/src/tx/private_execution_result.ts @@ -9,8 +9,7 @@ import { NoteSelector } from '../abi/note_selector.js'; import { PrivateCircuitPublicInputs } from '../kernel/private_circuit_public_inputs.js'; import type { IsEmpty } from '../kernel/utils/interfaces.js'; import { sortByCounter } from '../kernel/utils/order_and_comparison.js'; -import { UnencryptedFunctionL2Logs } from '../logs/function_l2_logs.js'; -import { UnencryptedL2Log } from '../logs/unencrypted_l2_log.js'; +import { ContractClassLog } from '../logs/contract_class_log.js'; import { Note } from '../note/note.js'; import { type ZodFor, mapSchema, schemas } from '../schemas/index.js'; import { PublicExecutionRequest } from './public_execution_request.js'; @@ -48,23 +47,23 @@ export class NoteAndSlot { } export class CountedContractClassLog implements IsEmpty { - constructor(public log: UnencryptedL2Log, public counter: number) {} + constructor(public log: ContractClassLog, public counter: number) {} static get schema(): ZodFor { return z .object({ - log: UnencryptedL2Log.schema, + log: ContractClassLog.schema, counter: schemas.Integer, }) .transform(CountedContractClassLog.from); } - static from(fields: { log: UnencryptedL2Log; counter: number }) { + static from(fields: { log: ContractClassLog; counter: number }) { return new CountedContractClassLog(fields.log, fields.counter); } isEmpty(): boolean { - return !this.log.data.length && !this.counter; + return this.log.isEmpty() && !this.counter; } } @@ -203,7 +202,7 @@ export class PrivateCallExecutionResult { await timesParallel(nested, () => PrivateCallExecutionResult.random(0)), [await CountedPublicExecutionRequest.random()], await PublicExecutionRequest.random(), - [new CountedContractClassLog(await UnencryptedL2Log.random(), randomInt(10))], + [new CountedContractClassLog(await ContractClassLog.random(), randomInt(10))], ); } } @@ -245,10 +244,10 @@ function collectContractClassLogs(execResult: PrivateCallExecutionResult): Count * @param execResult - The topmost execution result. * @returns All contract class logs. */ -export function collectSortedContractClassLogs(execResult: PrivateExecutionResult): UnencryptedFunctionL2Logs { +export function collectSortedContractClassLogs(execResult: PrivateExecutionResult): ContractClassLog[] { const allLogs = collectContractClassLogs(execResult.entrypoint); const sortedLogs = sortByCounter(allLogs); - return new UnencryptedFunctionL2Logs(sortedLogs.map(l => l.log)); + return sortedLogs.map(l => l.log); } function collectEnqueuedCountedPublicExecutionRequests( diff --git a/yarn-project/stdlib/src/tx/processed_tx.ts b/yarn-project/stdlib/src/tx/processed_tx.ts index 7005ac1361af..142cc64a2f1f 100644 --- a/yarn-project/stdlib/src/tx/processed_tx.ts +++ b/yarn-project/stdlib/src/tx/processed_tx.ts @@ -95,8 +95,7 @@ export async function makeProcessedTxFromPrivateOnlyTx( [feePaymentPublicDataWrite], data.end.privateLogs.filter(l => !l.isEmpty()), [], - data.end.contractClassLogPreimagesLength, - tx.contractClassLogs, + await tx.filterContractClassLogs(tx.data.getNonEmptyContractClassLogsHashes(), true), ); const gasUsed = { @@ -143,7 +142,10 @@ export async function makeProcessedTxFromTxWithPublicCalls( ...(revertCode.isOK() ? tx.data.forPublic!.revertibleAccumulatedData.privateLogs : []), ].filter(l => !l.isEmpty()); - const contractClassLogPreimagesLength = tx.contractClassLogs.getKernelLength(); + const contractClassLogs = [ + ...(await tx.getSplitContractClassLogs(false, true)), + ...(revertCode.isOK() ? await tx.getSplitContractClassLogs(true, true) : []), + ].filter(l => !l.isEmpty()); const txEffect = new TxEffect( revertCode, @@ -157,8 +159,7 @@ export async function makeProcessedTxFromTxWithPublicCalls( publicDataWrites, privateLogs, avmPublicInputs.accumulatedData.publicLogs.filter(l => !l.isEmpty()), - new Fr(contractClassLogPreimagesLength), - tx.contractClassLogs, + contractClassLogs, ); return { diff --git a/yarn-project/stdlib/src/tx/simulated_tx.ts b/yarn-project/stdlib/src/tx/simulated_tx.ts index 1caac2081739..7c4d1ae8e881 100644 --- a/yarn-project/stdlib/src/tx/simulated_tx.ts +++ b/yarn-project/stdlib/src/tx/simulated_tx.ts @@ -10,7 +10,6 @@ import { PrivateKernelProverProfileResultSchema, } from '../kernel/private_kernel_prover_profile_result.js'; import { PrivateKernelTailCircuitPublicInputs } from '../kernel/private_kernel_tail_circuit_public_inputs.js'; -import { ContractClassTxL2Logs } from '../logs/tx_l2_logs.js'; import { ClientIvcProof } from '../proofs/client_ivc_proof.js'; import { PrivateCallExecutionResult, @@ -33,7 +32,7 @@ export class PrivateSimulationResult { } toSimulatedTx(): Tx { - const contractClassLogs = new ContractClassTxL2Logs([collectSortedContractClassLogs(this.privateExecutionResult)]); + const contractClassLogs = collectSortedContractClassLogs(this.privateExecutionResult); const enqueuedPublicFunctions = collectEnqueuedPublicFunctionCalls(this.privateExecutionResult); const teardownPublicFunction = collectPublicTeardownFunctionCall(this.privateExecutionResult); @@ -123,7 +122,7 @@ export class TxProvingResult { ) {} toTx(): Tx { - const contractClassLogs = new ContractClassTxL2Logs([collectSortedContractClassLogs(this.privateExecutionResult)]); + const contractClassLogs = collectSortedContractClassLogs(this.privateExecutionResult); const enqueuedPublicFunctions = collectEnqueuedPublicFunctionCalls(this.privateExecutionResult); const teardownPublicFunction = collectPublicTeardownFunctionCall(this.privateExecutionResult); diff --git a/yarn-project/stdlib/src/tx/tx.ts b/yarn-project/stdlib/src/tx/tx.ts index 1825b1a8f16f..3d5ddf34c46f 100644 --- a/yarn-project/stdlib/src/tx/tx.ts +++ b/yarn-project/stdlib/src/tx/tx.ts @@ -8,12 +8,13 @@ import type { FieldsOf } from '@aztec/foundation/types'; import { z } from 'zod'; import type { GasSettings } from '../gas/gas_settings.js'; +import { siloContractClassLog } from '../hash/hash.js'; import type { GetPublicLogsResponse } from '../interfaces/get_logs_response.js'; import type { L2LogsSource } from '../interfaces/l2_logs_source.js'; +import type { ScopedLogHash } from '../kernel/log_hash.js'; import { PrivateKernelTailCircuitPublicInputs } from '../kernel/private_kernel_tail_circuit_public_inputs.js'; -import type { PrivateToPublicAccumulatedData } from '../kernel/private_to_public_accumulated_data.js'; +import { ContractClassLog } from '../logs/contract_class_log.js'; import { PrivateLog } from '../logs/private_log.js'; -import { ContractClassTxL2Logs } from '../logs/tx_l2_logs.js'; import { Gossipable } from '../p2p/gossipable.js'; import { TopicType, createTopicString } from '../p2p/topic_type.js'; import { ClientIvcProof } from '../proofs/client_ivc_proof.js'; @@ -43,7 +44,7 @@ export class Tx extends Gossipable { /** * Contract class logs generated by the tx. */ - public contractClassLogs: ContractClassTxL2Logs, + public contractClassLogs: ContractClassLog[], /** * Enqueued public functions from the private circuit to be run by the sequencer. */ @@ -106,7 +107,7 @@ export class Tx extends Gossipable { return new Tx( reader.readObject(PrivateKernelTailCircuitPublicInputs), reader.readObject(ClientIvcProof), - reader.readObject(ContractClassTxL2Logs), + reader.readVectorUint8Prefix(ContractClassLog), reader.readVectorUint8Prefix(PublicExecutionRequest), reader.readObject(PublicExecutionRequest), ); @@ -119,7 +120,7 @@ export class Tx extends Gossipable { return new Tx( data, ClientIvcProof.empty(), - ContractClassTxL2Logs.empty(), + [], [], publicTeardownExecutionRequest ? publicTeardownExecutionRequest : PublicExecutionRequest.empty(), ); @@ -133,7 +134,7 @@ export class Tx extends Gossipable { return serializeToBuffer([ this.data, this.clientIvcProof, - this.contractClassLogs, + serializeArrayOfBufferableToVector(this.contractClassLogs, 1), serializeArrayOfBufferableToVector(this.enqueuedPublicFunctionCalls, 1), this.publicTeardownFunctionCall, ]); @@ -144,7 +145,7 @@ export class Tx extends Gossipable { .object({ data: PrivateKernelTailCircuitPublicInputs.schema, clientIvcProof: ClientIvcProof.schema, - contractClassLogs: ContractClassTxL2Logs.schema, + contractClassLogs: z.array(ContractClassLog.schema), enqueuedPublicFunctionCalls: z.array(PublicExecutionRequest.schema), publicTeardownFunctionCall: PublicExecutionRequest.schema, }) @@ -170,6 +171,40 @@ export class Tx extends Gossipable { return logsSource.getPublicLogs({ txHash: await this.getTxHash() }); } + /** + * Gets either revertible or non revertible contract class logs emitted by this tx. + * @param revertible - true for revertible only logs, false for non reverible only logs. + * @returns The requested logs. + */ + async getSplitContractClassLogs(revertible: boolean, silo: boolean = false): Promise { + // Should only be called on txs with public calls + if (!this.data.forPublic) { + return []; + } + const contractClassLogsHashes = revertible + ? this.data.forPublic.revertibleAccumulatedData.contractClassLogsHashes.filter(h => !h.isEmpty()) + : this.data.forPublic.nonRevertibleAccumulatedData.contractClassLogsHashes.filter(h => !h.isEmpty()); + return await this.filterContractClassLogs(contractClassLogsHashes, silo); + } + + /** + * Filters contract class logs emitted by this tx. + * @param logHashes - logs to keep represented by their hashes. + * @param silo - whether to silo the logs before returning them. + * @returns The requested logs. + */ + async filterContractClassLogs(logHashes: ScopedLogHash[], silo: boolean = false): Promise { + const contractClassLogs = []; + for (const log of this.contractClassLogs) { + const hashedLog = await log.hash(); + const logHash = logHashes.find(hash => hash.value.equals(hashedLog)); + if (logHash) { + contractClassLogs.push(silo ? await siloContractClassLog(log, logHash.contractAddress) : log); + } + } + return contractClassLogs; + } + /** * Computes (if necessary) & return transaction hash. * @returns The hash of the public inputs of the private kernel tail circuit. @@ -202,6 +237,8 @@ export class Tx extends Gossipable { noteHashCount: this.data.getNonEmptyNoteHashes().length, nullifierCount: this.data.getNonEmptyNullifiers().length, privateLogCount: this.data.getNonEmptyPrivateLogs().length, + classRegisteredCount: this.data.getNonEmptyContractClassLogsHashes().length, + contractClassLogSize: this.data.getNonEmptyContractClassLogsLength(), proofSize: this.clientIvcProof.clientIvcProofBuffer.length, size: this.toBuffer().length, @@ -214,8 +251,6 @@ export class Tx extends Gossipable { ? 'fpc_public' : 'fpc_private' : 'fee_juice', - classRegisteredCount: this.contractClassLogs.unrollLogs().length, - contractClassLogSize: this.contractClassLogs.getSerializedLength(), }; } @@ -223,7 +258,7 @@ export class Tx extends Gossipable { return ( this.data.getSize() + this.clientIvcProof.clientIvcProofBuffer.length + - this.contractClassLogs.getSerializedLength() + + arraySerializedSizeOfNonEmpty(this.contractClassLogs) + arraySerializedSizeOfNonEmpty(this.enqueuedPublicFunctionCalls) + arraySerializedSizeOfNonEmpty([this.publicTeardownFunctionCall]) ); @@ -235,10 +270,10 @@ export class Tx extends Gossipable { */ getEstimatedPrivateTxEffectsSize() { return ( - this.contractClassLogs.getSerializedLength() + this.data.getNonEmptyNoteHashes().length * Fr.SIZE_IN_BYTES + this.data.getNonEmptyNullifiers().length * Fr.SIZE_IN_BYTES + - this.data.getNonEmptyPrivateLogs().length * PrivateLog.SIZE_IN_BYTES + this.data.getNonEmptyPrivateLogs().length * PrivateLog.SIZE_IN_BYTES + + this.data.getNonEmptyContractClassLogsLength() * Fr.SIZE_IN_BYTES ); } @@ -268,7 +303,7 @@ export class Tx extends Gossipable { static clone(tx: Tx): Tx { const publicInputs = PrivateKernelTailCircuitPublicInputs.fromBuffer(tx.data.toBuffer()); const clientIvcProof = ClientIvcProof.fromBuffer(tx.clientIvcProof.toBuffer()); - const contractClassLogs = ContractClassTxL2Logs.fromBuffer(tx.contractClassLogs.toBuffer()); + const contractClassLogs = tx.contractClassLogs.map(x => ContractClassLog.fromBuffer(x.toBuffer())); const enqueuedPublicFunctionCalls = tx.enqueuedPublicFunctionCalls.map(x => PublicExecutionRequest.fromBuffer(x.toBuffer()), ); @@ -296,7 +331,7 @@ export class Tx extends Gossipable { return new Tx( PrivateKernelTailCircuitPublicInputs.emptyWithNullifier(), randomProof ? ClientIvcProof.random() : ClientIvcProof.empty(), - await ContractClassTxL2Logs.random(1, 1), + [await ContractClassLog.random()], [await PublicExecutionRequest.random()], await PublicExecutionRequest.random(), ); @@ -316,11 +351,8 @@ export class Tx extends Gossipable { * @param logHashes the individual log hashes we want to keep * @param out the output to put passing logs in, to keep this function abstract */ - public filterRevertedLogs(privateNonRevertible: PrivateToPublicAccumulatedData) { - this.contractClassLogs = this.contractClassLogs.filterScoped( - privateNonRevertible.contractClassLogsHashes, - ContractClassTxL2Logs.empty(), - ); + public async filterRevertedLogs() { + this.contractClassLogs = await this.getSplitContractClassLogs(false); } } diff --git a/yarn-project/stdlib/src/tx/tx_effect.test.ts b/yarn-project/stdlib/src/tx/tx_effect.test.ts index 09517811075c..deece0ae4072 100644 --- a/yarn-project/stdlib/src/tx/tx_effect.test.ts +++ b/yarn-project/stdlib/src/tx/tx_effect.test.ts @@ -12,8 +12,7 @@ describe('TxEffect', () => { it('converts to and from fields', async () => { const txEffect = await TxEffect.random(); const fields = txEffect.toBlobFields(); - // TODO(#8954): When logs are refactored into fields, we won't need to inject them here - expect(TxEffect.fromBlobFields(fields, txEffect.contractClassLogs)).toEqual(txEffect); + expect(TxEffect.fromBlobFields(fields)).toEqual(txEffect); }); it('converts empty to and from fields', () => { @@ -33,8 +32,7 @@ describe('TxEffect', () => { fields = txEffect.toBlobFields(); // Add an extra field fields.push(new Fr(7)); - // TODO(#8954): When logs are refactored into fields, we won't need to inject them here - expect(() => TxEffect.fromBlobFields(fields, txEffect.contractClassLogs)).toThrow('Too many fields'); + expect(() => TxEffect.fromBlobFields(fields)).toThrow('Too many fields'); txEffect = await TxEffect.random(); fields = txEffect.toBlobFields(); @@ -44,7 +42,6 @@ describe('TxEffect', () => { // Add an extra field which looks like a valid prefix const fakePrefix = new Fr(buf); fields.push(fakePrefix); - // TODO(#8954): When logs are refactored into fields, we won't need to inject them here - expect(() => TxEffect.fromBlobFields(fields, txEffect.contractClassLogs)).toThrow('Invalid fields'); + expect(() => TxEffect.fromBlobFields(fields)).toThrow('Invalid fields'); }); }); diff --git a/yarn-project/stdlib/src/tx/tx_effect.ts b/yarn-project/stdlib/src/tx/tx_effect.ts index f8f6e14ae263..c753044b8b8f 100644 --- a/yarn-project/stdlib/src/tx/tx_effect.ts +++ b/yarn-project/stdlib/src/tx/tx_effect.ts @@ -1,6 +1,8 @@ import { CONTRACT_CLASS_LOGS_PREFIX, + CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, L2_L1_MSGS_PREFIX, + MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, @@ -21,7 +23,6 @@ import { toBufferBE } from '@aztec/foundation/bigint-buffer'; import { padArrayEnd } from '@aztec/foundation/collection'; import { sha256Trunc } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; -import { jsonStringify } from '@aztec/foundation/json-rpc'; import { type ZodFor, schemas } from '@aztec/foundation/schemas'; import { BufferReader, @@ -36,9 +37,9 @@ import { z } from 'zod'; import { PublicDataWrite } from '../avm/public_data_write.js'; import { RevertCode } from '../avm/revert_code.js'; +import { ContractClassLog } from '../logs/contract_class_log.js'; import { PrivateLog } from '../logs/private_log.js'; import { PublicLog } from '../logs/public_log.js'; -import { ContractClassTxL2Logs, TxL2Logs } from '../logs/tx_l2_logs.js'; import { TxHash } from './tx_hash.js'; // This will appear as 0x74785f7374617274 in logs @@ -88,10 +89,9 @@ export class TxEffect { */ public publicLogs: PublicLog[], /** - * The logs and logs lengths of the txEffect + * The contract class logs. */ - public contractClassLogsLength: Fr, - public contractClassLogs: ContractClassTxL2Logs, + public contractClassLogs: ContractClassLog[], ) { // TODO(#4638): Clean this up once we have isDefault() everywhere --> then we don't have to deal with 2 different // functions (isZero and isEmpty) @@ -154,8 +154,7 @@ export class TxEffect { serializeArrayOfBufferableToVector(this.publicDataWrites, 1), serializeArrayOfBufferableToVector(this.privateLogs, 1), serializeArrayOfBufferableToVector(this.publicLogs, 1), - this.contractClassLogsLength, - this.contractClassLogs, + serializeArrayOfBufferableToVector(this.contractClassLogs, 1), ]); } @@ -182,8 +181,7 @@ export class TxEffect { reader.readVectorUint8Prefix(PublicDataWrite), reader.readVectorUint8Prefix(PrivateLog), reader.readVectorUint8Prefix(PublicLog), - Fr.fromBuffer(reader), - reader.readObject(ContractClassTxL2Logs), + reader.readVectorUint8Prefix(ContractClassLog), ); } @@ -216,7 +214,6 @@ export class TxEffect { } static async random(numPublicCallsPerTx = 3, numPublicLogsPerCall = 1): Promise { - const contractClassLogs = await ContractClassTxL2Logs.random(1, 1); return new TxEffect( RevertCode.random(), TxHash.random(), @@ -227,25 +224,12 @@ export class TxEffect { makeTuple(MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, () => new PublicDataWrite(Fr.random(), Fr.random())), makeTuple(MAX_PRIVATE_LOGS_PER_TX, () => new PrivateLog(makeTuple(PRIVATE_LOG_SIZE_IN_FIELDS, Fr.random))), await makeTupleAsync(numPublicCallsPerTx * numPublicLogsPerCall, PublicLog.random), - new Fr(contractClassLogs.getKernelLength()), - contractClassLogs, + await makeTupleAsync(MAX_CONTRACT_CLASS_LOGS_PER_TX, ContractClassLog.random), ); } static empty(): TxEffect { - return new TxEffect( - RevertCode.OK, - TxHash.zero(), - Fr.ZERO, - [], - [], - [], - [], - [], - [], - Fr.ZERO, - ContractClassTxL2Logs.empty(), - ); + return new TxEffect(RevertCode.OK, TxHash.zero(), Fr.ZERO, [], [], [], [], [], [], []); } isEmpty(): boolean { @@ -377,11 +361,19 @@ export class TxEffect { flattened.push(this.toPrefix(PUBLIC_LOGS_PREFIX, this.publicLogs.length * PUBLIC_LOG_SIZE_IN_FIELDS)); flattened.push(...this.publicLogs.map(l => l.toFields()).flat()); } - // TODO(#8954): When logs are refactored into fields, we will append the values here - // Currently appending the single log hash as an interim solution - if (this.contractClassLogs.unrollLogs().length) { - flattened.push(this.toPrefix(CONTRACT_CLASS_LOGS_PREFIX, this.contractClassLogs.unrollLogs().length)); - flattened.push(...this.contractClassLogs.unrollLogs().map(log => Fr.fromBuffer(log.getSiloedHash()))); + if (this.contractClassLogs.length) { + const totalLogLen = this.contractClassLogs.reduce( + (total, log) => total + (log.getEmittedLength() == 0 ? 0 : log.getEmittedLength() + 2), + 0, + ); + flattened.push(this.toPrefix(CONTRACT_CLASS_LOGS_PREFIX, totalLogLen)); + flattened.push( + ...this.contractClassLogs.flatMap(l => [ + new Fr(l.getEmittedLength()), + l.contractAddress.toField(), + ...l.getEmittedFields(), + ]), + ); } // The first value appended to each list of fields representing a tx effect is: @@ -394,9 +386,8 @@ export class TxEffect { /** * Decodes a flat packed array of prefixed fields to TxEffect - * TODO(#8954): When logs are refactored into fields, we won't need to inject them here, instead just reading from fields as below */ - static fromBlobFields(fields: Fr[] | FieldReader, contractClassLogs?: ContractClassTxL2Logs) { + static fromBlobFields(fields: Fr[] | FieldReader) { const ensureEmpty = (arr: Array) => { if (arr.length) { throw new Error('Invalid fields given to TxEffect.fromBlobFields(): Attempted to assign property twice.'); @@ -460,43 +451,30 @@ export class TxEffect { } break; } - // TODO(#8954): When logs are refactored into fields, we will append the read fields here - case CONTRACT_CLASS_LOGS_PREFIX: - // effect.contractClassLogs = ContractClassTxL2Logs.fromFields(reader.readFieldArray(length)); - ensureEmpty(effect.contractClassLogs.functionLogs); - if (!contractClassLogs) { - throw new Error(`Tx effect has contractClassLogs logs, but they were not passed raw to .fromBlobFields()`); + case CONTRACT_CLASS_LOGS_PREFIX: { + ensureEmpty(effect.contractClassLogs); + const flatContractClassLogs = reader.readFieldArray(length); + let i = 0; + while (i < length) { + const logLen = flatContractClassLogs[i++].toNumber(); + // +1 for address + const logFields = flatContractClassLogs.slice(i, (i += logLen + 1)); + effect.contractClassLogs.push( + ContractClassLog.fromFields( + logFields.concat(new Array(CONTRACT_CLASS_LOG_SIZE_IN_FIELDS - logLen).fill(Fr.ZERO)), + ), + ); } - this.checkInjectedLogs(contractClassLogs, reader.readFieldArray(length)); - effect.contractClassLogs = contractClassLogs; - effect.contractClassLogsLength = new Fr(contractClassLogs.getKernelLength()); break; + } case REVERT_CODE_PREFIX: default: throw new Error(`Too many fields to decode given to TxEffect.fromBlobFields()`); } } - - // If the input fields have no logs, ensure we match the original struct by reassigning injected logs - effect.contractClassLogs = - !effect.contractClassLogs.getTotalLogCount() && contractClassLogs ? contractClassLogs : effect.contractClassLogs; return effect; } - // TODO(#8954): Remove below when logs are refactored into fields - private static checkInjectedLogs(injected: TxL2Logs, expectedHashes: Fr[]) { - injected.unrollLogs().forEach((log, i) => { - const logHash = log.getSiloedHash(); - if (!Fr.fromBuffer(logHash).equals(expectedHashes[i])) { - throw new Error( - `Log hash mismatch when reconstructing tx effect. Expected: ${Fr.fromBuffer(logHash)}, Got: ${ - expectedHashes[i] - }`, - ); - } - }); - } - static from(fields: FieldsOf) { return new TxEffect( fields.revertCode, @@ -508,7 +486,6 @@ export class TxEffect { fields.publicDataWrites, fields.privateLogs, fields.publicLogs, - fields.contractClassLogsLength, fields.contractClassLogs, ); } @@ -525,8 +502,7 @@ export class TxEffect { publicDataWrites: z.array(PublicDataWrite.schema), privateLogs: z.array(PrivateLog.schema), publicLogs: z.array(PublicLog.schema), - contractClassLogsLength: schemas.Fr, - contractClassLogs: ContractClassTxL2Logs.schema, + contractClassLogs: z.array(ContractClassLog.schema), }) .transform(TxEffect.from); } @@ -542,8 +518,7 @@ export class TxEffect { publicDataWrites: [${this.publicDataWrites.map(h => h.toString()).join(', ')}], privateLogs: [${this.privateLogs.map(l => l.toString()).join(', ')}], publicLogs: [${this.publicLogs.map(l => l.toString()).join(', ')}], - contractClassLogsLength: ${this.contractClassLogsLength}, - contractClassLogs: ${jsonStringify(this.contractClassLogs)} + contractClassLogs: [${this.contractClassLogs.map(l => l.toString()).join(', ')}], }`; } diff --git a/yarn-project/txe/src/oracle/txe_oracle.ts b/yarn-project/txe/src/oracle/txe_oracle.ts index 43b9c49dd54d..d8b0372a33dd 100644 --- a/yarn-project/txe/src/oracle/txe_oracle.ts +++ b/yarn-project/txe/src/oracle/txe_oracle.ts @@ -63,7 +63,7 @@ import { import type { MerkleTreeReadOperations, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server'; import { type KeyValidationRequest, PrivateContextInputs } from '@aztec/stdlib/kernel'; import { computeTaggingSecretPoint, deriveKeys } from '@aztec/stdlib/keys'; -import { LogWithTxData, UnencryptedL2Log } from '@aztec/stdlib/logs'; +import { ContractClassLog, LogWithTxData } from '@aztec/stdlib/logs'; import { IndexedTaggingSecret, type PrivateLog, type PublicLog } from '@aztec/stdlib/logs'; import type { NoteStatus } from '@aztec/stdlib/note'; import type { CircuitWitnessGenerationStats } from '@aztec/stdlib/stats'; @@ -760,7 +760,7 @@ export class TXE implements TypedOracle { return new Fr(this.blockNumber + 6969); } - emitContractClassLog(_log: UnencryptedL2Log, _counter: number): Fr { + emitContractClassLog(_log: ContractClassLog, _counter: number): Fr { throw new Error('Method not implemented.'); }