From db7139ed1e20e9fd5d51f3acc25f351324667c78 Mon Sep 17 00:00:00 2001 From: Dmitrii Shmatko Date: Thu, 17 Oct 2024 22:59:44 +0200 Subject: [PATCH] Checking correctness merging of master (from beginning to infrastructure module) --- .../coordinator/DepositProviderBenchmark.java | 2 +- .../coordinator/DepositProvider.java | 3 + .../validator/coordinator/Eth1DataCache.java | 14 +- .../coordinator/Eth1DataCacheTest.java | 31 +- .../coordinator/Eth1DataProviderTest.java | 2 +- .../beacon/paths/_eth_v1_beacon_blocks.json | 4 +- .../_eth_v1_beacon_light_client_updates.json | 2 +- ...p7594.json => BeaconBlockBodyElectra.json} | 0 ...ckEip7594.json => BeaconBlockElectra.json} | 4 +- ...teEip7594.json => BeaconStateElectra.json} | 6 +- ...7594.json => BlindedBlockBodyElectra.json} | 0 .../beacon/schema/BlindedBlockElectra.json | 34 ++ ...Eip7594.json => BlockContentsElectra.json} | 4 +- .../beacon/schema/DepositRequest.json | 41 ++- .../schema/GetAllBlocksAtSlotResponse.json | 4 +- .../schema/GetBlindedBlockResponse.json | 4 +- .../beacon/schema/GetBlockV2Response.json | 4 +- .../GetLightClientBootstrapResponse.json | 2 +- .../beacon/schema/GetStateV2Response.json | 4 +- .../beacon/schema/PendingConsolidation.json | 19 + .../beacon/schema/PendingDeposit.json | 43 +++ .../schema/PendingPartialWithdrawal.json | 25 ++ .../beacon/schema/ProduceBlockV2Response.json | 0 .../beacon/schema/ProduceBlockV3Response.json | 6 +- ...594.json => SignedBeaconBlockElectra.json} | 4 +- ...94.json => SignedBlindedBlockElectra.json} | 4 +- ...4.json => SignedBlockContentsElectra.json} | 4 +- .../v3/newBlindedBlockEIP7594.json | 1 - .../v3/newBlockContentsEIP7594.json | 1 - .../tekuv1/beacon/GetAllBlocksAtSlotTest.java | 2 - .../v1/beacon/GetBlockHeaderTest.java | 2 - .../v1/beacon/GetBlockHeadersTest.java | 2 - .../builder/GetExpectedWithdrawalsTest.java | 2 - .../handlers/v2/beacon/GetBlockTest.java | 2 - .../BlobSidecarSelectorFactory.java | 9 +- .../tech/pegasys/teku/api/schema/Version.java | 5 +- .../epoch_processing/EpochOperation.java | 2 +- .../EpochProcessingExecutor.java | 6 +- .../EpochProcessingTestExecutor.java | 7 +- .../operations/DefaultOperationProcessor.java | 2 + .../SingleMerkleProofTestExecutor.java | 11 +- .../sanity/SanityBlocksTestExecutor.java | 11 + .../phase0/ssz_static/SszTestExecutor.java | 10 +- .../tech/pegasys/teku/ethtests/TestFork.java | 1 + .../ethtests/finder/ReferenceTestFinder.java | 1 + .../teku/ethtests/finder/TestDefinition.java | 12 +- .../schema/GetPayloadV2Response.java | 8 + .../schema/GetPayloadV3Response.java | 12 + .../schema/GetPayloadV4Response.java | 12 + .../BellatrixExecutionClientHandlerTest.java | 45 +-- .../CapellaExecutionClientHandlerTest.java | 64 ++-- .../DenebExecutionClientHandlerTest.java | 88 +++-- .../ElectraExecutionClientHandlerTest.java | 86 +++-- .../ethereum/json/types/EthereumTypes.java | 10 +- .../teku/networks/minimal-trusted-setup.txt | 2 +- .../builder/ValidatorRegistration.java | 1 + .../execution/ExpectedWithdrawals.java | 18 +- .../electra/ConsolidationRequest.java | 3 + .../versions/electra/DepositRequest.java | 3 + .../electra/ExecutionRequestsDataCodec.java | 111 ++++++ .../versions/electra/WithdrawalRequest.java | 3 + .../spec/datastructures/state/ForkInfo.java | 10 + .../schemas/AbstractSchemaDefinitions.java | 4 +- .../spec/schemas/SchemaDefinitionsPhase0.java | 8 +- .../ExecutionRequestsDataCodecTest.java | 282 +++++++++++++++ .../teku/spec/signatures/LocalSignerTest.java | 2 +- .../blobs/BlobSidecarManager.java | 5 +- .../blobs/BlockBlobSidecarsTracker.java | 46 ++- .../BlockBlobSidecarsTrackersPoolImpl.java | 196 ++++++++++- .../statetransition/util/PoolFactory.java | 25 +- .../BlobSidecarGossipValidator.java | 21 +- ...BlockBlobSidecarsTrackersPoolImplTest.java | 333 +++++++++++++++++- .../BlobSidecarGossipValidatorTest.java | 11 + 73 files changed, 1477 insertions(+), 291 deletions(-) rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{BeaconBlockBodyEip7594.json => BeaconBlockBodyElectra.json} (100%) rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{BlindedBlockEip7594.json => BeaconBlockElectra.json} (89%) rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{BeaconStateEip7594.json => BeaconStateElectra.json} (96%) rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{BlindedBlockBodyEip7594.json => BlindedBlockBodyElectra.json} (100%) create mode 100644 data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockElectra.json rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{BlockContentsEip7594.json => BlockContentsElectra.json} (85%) create mode 100644 data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingConsolidation.json create mode 100644 data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingDeposit.json create mode 100644 data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingPartialWithdrawal.json delete mode 100644 data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/ProduceBlockV2Response.json rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{SignedBeaconBlockEip7594.json => SignedBeaconBlockElectra.json} (73%) rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{SignedBlindedBlockEip7594.json => SignedBlindedBlockElectra.json} (73%) rename data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/{SignedBlockContentsEip7594.json => SignedBlockContentsElectra.json} (84%) delete mode 100644 data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlindedBlockEIP7594.json delete mode 100644 data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlockContentsEIP7594.json create mode 100644 ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodec.java create mode 100644 ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodecTest.java diff --git a/beacon/validator/src/jmh/java/tech/pegasys/teku/validator/coordinator/DepositProviderBenchmark.java b/beacon/validator/src/jmh/java/tech/pegasys/teku/validator/coordinator/DepositProviderBenchmark.java index ae392ea42e9..b3f3c4c83e7 100644 --- a/beacon/validator/src/jmh/java/tech/pegasys/teku/validator/coordinator/DepositProviderBenchmark.java +++ b/beacon/validator/src/jmh/java/tech/pegasys/teku/validator/coordinator/DepositProviderBenchmark.java @@ -68,7 +68,7 @@ public class DepositProviderBenchmark { new DepositProvider( metricsSystem, mock(RecentChainData.class), - new Eth1DataCache(metricsSystem, new Eth1VotingPeriod(spec)), + new Eth1DataCache(spec, metricsSystem, new Eth1VotingPeriod(spec)), mock(StorageUpdateChannel.class), mock(Eth1DepositStorageChannel.class), spec, diff --git a/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/DepositProvider.java b/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/DepositProvider.java index a0c3dd25d0f..db6d0ebdb3c 100644 --- a/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/DepositProvider.java +++ b/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/DepositProvider.java @@ -184,6 +184,9 @@ public void onSlot(final UInt64 slot) { .get() .thenAccept( state -> { + if (spec.isFormerDepositMechanismDisabled(state)) { + return; + } // We want to verify our Beacon Node view of the eth1 deposits. // So we want to check if it has the necessary deposit data to propose a block final UInt64 eth1DepositCount = state.getEth1Data().getDepositCount(); diff --git a/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/Eth1DataCache.java b/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/Eth1DataCache.java index 81e0977eac0..d688d0e057e 100644 --- a/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/Eth1DataCache.java +++ b/beacon/validator/src/main/java/tech/pegasys/teku/validator/coordinator/Eth1DataCache.java @@ -28,6 +28,7 @@ import tech.pegasys.teku.infrastructure.metrics.SettableGauge; import tech.pegasys.teku.infrastructure.metrics.TekuMetricCategory; import tech.pegasys.teku.infrastructure.unsigned.UInt64; +import tech.pegasys.teku.spec.Spec; import tech.pegasys.teku.spec.datastructures.blocks.Eth1Data; import tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconState; @@ -39,6 +40,7 @@ public class Eth1DataCache { static final String VOTES_CURRENT_METRIC_NAME = "eth1_current_period_votes_current"; static final String VOTES_BEST_METRIC_NAME = "eth1_current_period_votes_best"; + private final Spec spec; private final Eth1VotingPeriod eth1VotingPeriod; private final UInt64 cacheDuration; @@ -50,7 +52,9 @@ public class Eth1DataCache { private final SettableGauge currentPeriodVotesBest; private final SettableGauge currentPeriodVotesMax; - public Eth1DataCache(final MetricsSystem metricsSystem, final Eth1VotingPeriod eth1VotingPeriod) { + public Eth1DataCache( + final Spec spec, final MetricsSystem metricsSystem, final Eth1VotingPeriod eth1VotingPeriod) { + this.spec = spec; this.eth1VotingPeriod = eth1VotingPeriod; cacheDuration = eth1VotingPeriod.getCacheDurationInSeconds(); metricsSystem.createIntegerGauge( @@ -111,6 +115,10 @@ public void onEth1Block( } public Eth1Data getEth1Vote(final BeaconState state) { + if (spec.isFormerDepositMechanismDisabled(state)) { + // no need for a real vote when Eth1 polling has been disabled + return state.getEth1Data(); + } final NavigableMap votesToConsider = getVotesToConsider(state.getSlot(), state.getGenesisTime(), state.getEth1Data()); // Avoid using .values() directly as it has O(n) lookup which gets expensive fast @@ -134,6 +142,10 @@ public Collection getAllEth1Blocks() { } public void updateMetrics(final BeaconState state) { + if (spec.isFormerDepositMechanismDisabled(state)) { + // no need to update metrics when Eth1 polling has been disabled + return; + } final Eth1Data currentEth1Data = state.getEth1Data(); // Avoid using .values() directly as it has O(n) lookup which gets expensive fast final Set knownBlocks = diff --git a/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataCacheTest.java b/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataCacheTest.java index 0419e6ce86d..ba6e5027341 100644 --- a/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataCacheTest.java +++ b/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataCacheTest.java @@ -67,7 +67,7 @@ void setUp() { when(eth1VotingPeriod.getSpecRangeLowerBound(SLOT, GENESIS_TIME)) .thenReturn(VOTING_PERIOD_START); when(eth1VotingPeriod.getSpecRangeUpperBound(SLOT, GENESIS_TIME)).thenReturn(VOTING_PERIOD_END); - eth1DataCache = new Eth1DataCache(metricsSystem, eth1VotingPeriod); + eth1DataCache = new Eth1DataCache(spec, metricsSystem, eth1VotingPeriod); } // Add tests for eth1 block with no votes @@ -215,6 +215,17 @@ void noValidVotesInThisPeriod_eth1ChainNotLive() { assertThat(eth1DataCache.getEth1Vote(beaconState)).isEqualTo(stateEth1Data); } + @Test + void shouldReturnStateEth1Data_ifFormerDepositMechanismHasBeenDisabled() { + final Spec spec = mock(Spec.class); + eth1DataCache = new Eth1DataCache(spec, new StubMetricsSystem(), eth1VotingPeriod); + final BeaconState beaconState = createBeaconStateWithVotes(createEth1Data(STATE_DEPOSIT_COUNT)); + + when(spec.isFormerDepositMechanismDisabled(beaconState)).thenReturn(true); + + assertThat(eth1DataCache.getEth1Vote(beaconState)).isEqualTo(beaconState.getEth1Data()); + } + @Test void shouldPruneOldBlocksWhenNewerOnesReceived() { final UInt64 olderBlockTimestamp = ZERO; @@ -254,6 +265,24 @@ void shouldUpdateMetrics() { assertGaugeValue(Eth1DataCache.VOTES_BEST_METRIC_NAME, 4); } + @Test + void shouldNotUpdateMetrics_ifFormerDepositMechanismHasBeenDisabled() { + final Spec spec = mock(Spec.class); + eth1DataCache = new Eth1DataCache(spec, new StubMetricsSystem(), eth1VotingPeriod); + final BeaconState beaconState = getStateForMetricsAssertions(); + + when(spec.isFormerDepositMechanismDisabled(beaconState)).thenReturn(true); + + eth1DataCache.updateMetrics(beaconState); + + // all gauge values are 0 + assertGaugeValue(Eth1DataCache.VOTES_TOTAL_METRIC_NAME, 0); + assertGaugeValue(Eth1DataCache.VOTES_MAX_METRIC_NAME, 0); + assertGaugeValue(Eth1DataCache.VOTES_UNKNOWN_METRIC_NAME, 0); + assertGaugeValue(Eth1DataCache.VOTES_CURRENT_METRIC_NAME, 0); + assertGaugeValue(Eth1DataCache.VOTES_BEST_METRIC_NAME, 0); + } + @Test void shouldIncludeUnknownBlocksWhenCalculatingVoteBestMetric() { // Metric needs to indicate when a block will be voted in which happens even when unknown diff --git a/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataProviderTest.java b/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataProviderTest.java index 5d77e652c7b..3f436c4c519 100644 --- a/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataProviderTest.java +++ b/beacon/validator/src/test/java/tech/pegasys/teku/validator/coordinator/Eth1DataProviderTest.java @@ -70,7 +70,7 @@ public void setup() { assertThat(slotsInVotingPeriod).isEqualTo(SLOTS_IN_VOTING_PERIOD_ASSERTION); final Eth1VotingPeriod eth1VotingPeriod = new Eth1VotingPeriod(spec); - final Eth1DataCache eth1DataCache = new Eth1DataCache(metricsSystem, eth1VotingPeriod); + final Eth1DataCache eth1DataCache = new Eth1DataCache(spec, metricsSystem, eth1VotingPeriod); final DepositProvider depositProvider = new DepositProvider( new StubMetricsSystem(), diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_blocks.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_blocks.json index 50651b47d1a..703cca02f5b 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_blocks.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_blocks.json @@ -10,7 +10,7 @@ "in" : "header", "schema" : { "type" : "string", - "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "eip7594" ], + "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "electra" ], "description" : "Version of the block being submitted, if using SSZ encoding." } } ], @@ -37,7 +37,7 @@ }, { "$ref" : "#/components/schemas/SignedBlockContentsDeneb" }, { - "$ref" : "#/components/schemas/SignedBlockContentsEip7594" + "$ref" : "#/components/schemas/SignedBlockContentsElectra" } ] } } diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_light_client_updates.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_light_client_updates.json index 7b0a5b2cf60..56fb7296377 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_light_client_updates.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/paths/_eth_v1_beacon_light_client_updates.json @@ -44,7 +44,7 @@ "bellatrix", "capella", "deneb", - "eip7594" + "electra" ] }, "data": { diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockBodyEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockBodyElectra.json similarity index 100% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockBodyEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockBodyElectra.json diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockElectra.json similarity index 89% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockElectra.json index c6c35b11df9..227ae04b0f5 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockEip7594.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockElectra.json @@ -1,5 +1,5 @@ { - "title" : "BlindedBlockEip7594", + "title" : "BeaconBlockElectra", "type" : "object", "required" : [ "slot", "proposer_index", "parent_root", "state_root", "body" ], "properties" : { @@ -28,7 +28,7 @@ "format" : "byte" }, "body" : { - "$ref" : "#/components/schemas/BlindedBlockBodyEip7594" + "$ref" : "#/components/schemas/BeaconBlockBodyElectra" } } } \ No newline at end of file diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconStateEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconStateElectra.json similarity index 96% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconStateEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconStateElectra.json index db6584061d0..a776461b6c6 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconStateEip7594.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconStateElectra.json @@ -1,7 +1,7 @@ { "title" : "BeaconStateElectra", "type" : "object", - "required" : [ "genesis_time", "genesis_validators_root", "slot", "fork", "latest_block_header", "block_roots", "state_roots", "historical_roots", "eth1_data", "eth1_data_votes", "eth1_deposit_index", "validators", "balances", "randao_mixes", "slashings", "previous_epoch_participation", "current_epoch_participation", "justification_bits", "previous_justified_checkpoint", "current_justified_checkpoint", "finalized_checkpoint", "inactivity_scores", "current_sync_committee", "next_sync_committee", "latest_execution_payload_header", "next_withdrawal_index", "next_withdrawal_validator_index", "historical_summaries", "deposit_requests_start_index", "deposit_balance_to_consume", "exit_balance_to_consume", "earliest_exit_epoch", "consolidation_balance_to_consume", "earliest_consolidation_epoch", "pending_balance_deposits", "pending_partial_withdrawals", "pending_consolidations" ], + "required" : [ "genesis_time", "genesis_validators_root", "slot", "fork", "latest_block_header", "block_roots", "state_roots", "historical_roots", "eth1_data", "eth1_data_votes", "eth1_deposit_index", "validators", "balances", "randao_mixes", "slashings", "previous_epoch_participation", "current_epoch_participation", "justification_bits", "previous_justified_checkpoint", "current_justified_checkpoint", "finalized_checkpoint", "inactivity_scores", "current_sync_committee", "next_sync_committee", "latest_execution_payload_header", "next_withdrawal_index", "next_withdrawal_validator_index", "historical_summaries", "deposit_requests_start_index", "deposit_balance_to_consume", "exit_balance_to_consume", "earliest_exit_epoch", "consolidation_balance_to_consume", "earliest_consolidation_epoch", "pending_deposits", "pending_partial_withdrawals", "pending_consolidations" ], "properties" : { "genesis_time" : { "type" : "string", @@ -207,10 +207,10 @@ "example" : "1", "format" : "uint64" }, - "pending_balance_deposits" : { + "pending_deposits" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/PendingBalanceDeposit" + "$ref" : "#/components/schemas/PendingDeposit" } }, "pending_partial_withdrawals" : { diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockBodyEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockBodyElectra.json similarity index 100% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockBodyEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockBodyElectra.json diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockElectra.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockElectra.json new file mode 100644 index 00000000000..e9f8fc4a9d7 --- /dev/null +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlindedBlockElectra.json @@ -0,0 +1,34 @@ +{ + "title" : "BlindedBlockElectra", + "type" : "object", + "required" : [ "slot", "proposer_index", "parent_root", "state_root", "body" ], + "properties" : { + "slot" : { + "type" : "string", + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" + }, + "proposer_index" : { + "type" : "string", + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" + }, + "parent_root" : { + "type" : "string", + "description" : "Bytes32 hexadecimal", + "example" : "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", + "format" : "byte" + }, + "state_root" : { + "type" : "string", + "description" : "Bytes32 hexadecimal", + "example" : "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", + "format" : "byte" + }, + "body" : { + "$ref" : "#/components/schemas/BlindedBlockBodyElectra" + } + } +} \ No newline at end of file diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlockContentsEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlockContentsElectra.json similarity index 85% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlockContentsEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlockContentsElectra.json index 762b399d7c9..49df0784a17 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlockContentsEip7594.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BlockContentsElectra.json @@ -1,10 +1,10 @@ { - "title" : "BlockContentsEip7594", + "title" : "BlockContentsElectra", "type" : "object", "required" : [ "block", "kzg_proofs", "blobs" ], "properties" : { "block" : { - "$ref" : "#/components/schemas/BeaconBlockEip7594" + "$ref" : "#/components/schemas/BeaconBlockElectra" }, "kzg_proofs" : { "type" : "array", diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/DepositRequest.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/DepositRequest.json index 307cbc95ab0..5dca2c975fb 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/DepositRequest.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/DepositRequest.json @@ -1,38 +1,37 @@ { -<<<<<<<< HEAD:data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/DepositRequest.json "title" : "DepositRequest", -======== - "title" : "BeaconBlockEip7594", ->>>>>>>> das:data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/BeaconBlockEip7594.json "type" : "object", - "required" : [ "slot", "proposer_index", "parent_root", "state_root", "body" ], + "required" : [ "pubkey", "withdrawal_credentials", "amount", "signature", "index" ], "properties" : { - "slot" : { + "pubkey" : { "type" : "string", - "description" : "unsigned 64 bit integer", - "example" : "1", - "format" : "uint64" + "pattern" : "^0x[a-fA-F0-9]{2,}$", + "description" : "Bytes48 hexadecimal", + "format" : "bytes" }, - "proposer_index" : { + "withdrawal_credentials" : { + "type" : "string", + "description" : "Bytes32 hexadecimal", + "example" : "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", + "format" : "byte" + }, + "amount" : { "type" : "string", "description" : "unsigned 64 bit integer", "example" : "1", "format" : "uint64" }, - "parent_root" : { + "signature" : { "type" : "string", - "description" : "Bytes32 hexadecimal", - "example" : "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "format" : "byte" + "pattern" : "^0x[a-fA-F0-9]{2,}$", + "description" : "SSZ hexadecimal", + "format" : "bytes" }, - "state_root" : { + "index" : { "type" : "string", - "description" : "Bytes32 hexadecimal", - "example" : "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "format" : "byte" - }, - "body" : { - "$ref" : "#/components/schemas/BeaconBlockBodyEip7594" + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" } } } \ No newline at end of file diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetAllBlocksAtSlotResponse.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetAllBlocksAtSlotResponse.json index 04cdd34b0a8..80cd5b0740b 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetAllBlocksAtSlotResponse.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetAllBlocksAtSlotResponse.json @@ -5,7 +5,7 @@ "properties" : { "version" : { "type" : "string", - "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "eip7594" ] + "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "electra" ] }, "data" : { "type" : "array", @@ -27,7 +27,7 @@ }, { "$ref" : "#/components/schemas/BeaconBlockDeneb" }, { - "$ref" : "#/components/schemas/BeaconBlockEip7594" + "$ref" : "#/components/schemas/BeaconBlockElectra" } ] }, "signature" : { diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlindedBlockResponse.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlindedBlockResponse.json index 5142d0303ac..b6bba539a51 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlindedBlockResponse.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlindedBlockResponse.json @@ -5,7 +5,7 @@ "properties" : { "version" : { "type" : "string", - "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "eip7594" ] + "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "electra" ] }, "execution_optimistic" : { "type" : "boolean" @@ -27,7 +27,7 @@ }, { "$ref" : "#/components/schemas/SignedBlindedBlockDeneb" }, { - "$ref" : "#/components/schemas/SignedBlindedBlockEip7594" + "$ref" : "#/components/schemas/SignedBlindedBlockElectra" } ] } } diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlockV2Response.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlockV2Response.json index fb7d2a7fdc7..87ad068b65f 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlockV2Response.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetBlockV2Response.json @@ -5,7 +5,7 @@ "properties" : { "version" : { "type" : "string", - "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "eip7594" ] + "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "electra" ] }, "execution_optimistic" : { "type" : "boolean" @@ -27,7 +27,7 @@ }, { "$ref" : "#/components/schemas/SignedBeaconBlockDeneb" }, { - "$ref" : "#/components/schemas/SignedBeaconBlockEip7594" + "$ref" : "#/components/schemas/SignedBeaconBlockElectra" } ] } } diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetLightClientBootstrapResponse.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetLightClientBootstrapResponse.json index faddc373e92..2d83bbbbbab 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetLightClientBootstrapResponse.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetLightClientBootstrapResponse.json @@ -5,7 +5,7 @@ "properties" : { "version" : { "type" : "string", - "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "eip7594" ] + "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "electra" ] }, "data" : { "$ref" : "#/components/schemas/LightClientBootstrap" diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetStateV2Response.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetStateV2Response.json index fcd39d7f559..27b011ce585 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetStateV2Response.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/GetStateV2Response.json @@ -5,7 +5,7 @@ "properties" : { "version" : { "type" : "string", - "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "eip7594" ] + "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "electra" ] }, "execution_optimistic" : { "type" : "boolean" @@ -27,7 +27,7 @@ }, { "$ref" : "#/components/schemas/BeaconStateDeneb" }, { - "$ref" : "#/components/schemas/BeaconStateEip7594" + "$ref" : "#/components/schemas/BeaconStateElectra" } ] } } diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingConsolidation.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingConsolidation.json new file mode 100644 index 00000000000..aa9b77f2895 --- /dev/null +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingConsolidation.json @@ -0,0 +1,19 @@ +{ + "title" : "PendingConsolidation", + "type" : "object", + "required" : [ "source_index", "target_index" ], + "properties" : { + "source_index" : { + "type" : "string", + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" + }, + "target_index" : { + "type" : "string", + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" + } + } +} \ No newline at end of file diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingDeposit.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingDeposit.json new file mode 100644 index 00000000000..27ec4a2f0cf --- /dev/null +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingDeposit.json @@ -0,0 +1,43 @@ +{ + "title": "PendingDeposit", + "type": "object", + "required": [ + "pubkey", + "withdrawal_credentials", + "amount", + "signature", + "slot" + ], + "properties": { + "pubkey": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{2,}$", + "description": "Bytes48 hexadecimal", + "format": "bytes" + }, + "withdrawal_credentials": { + "type": "string", + "description": "Bytes32 hexadecimal", + "example": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", + "format": "byte" + }, + "amount": { + "type": "string", + "description": "unsigned 64 bit integer", + "example": "1", + "format": "uint64" + }, + "signature": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{2,}$", + "description": "SSZ hexadecimal", + "format": "bytes" + }, + "slot": { + "type": "string", + "description": "unsigned 64 bit integer", + "example": "1", + "format": "uint64" + } + } +} \ No newline at end of file diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingPartialWithdrawal.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingPartialWithdrawal.json new file mode 100644 index 00000000000..8347212c107 --- /dev/null +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/PendingPartialWithdrawal.json @@ -0,0 +1,25 @@ +{ + "title" : "PendingPartialWithdrawal", + "type" : "object", + "required" : [ "index", "amount", "withdrawable_epoch" ], + "properties" : { + "index" : { + "type" : "string", + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" + }, + "amount" : { + "type" : "string", + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" + }, + "withdrawable_epoch" : { + "type" : "string", + "description" : "unsigned 64 bit integer", + "example" : "1", + "format" : "uint64" + } + } +} \ No newline at end of file diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/ProduceBlockV2Response.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/ProduceBlockV2Response.json deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/ProduceBlockV3Response.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/ProduceBlockV3Response.json index 1b50ae401dc..3abeb040a5b 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/ProduceBlockV3Response.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/ProduceBlockV3Response.json @@ -5,7 +5,7 @@ "properties" : { "version" : { "type" : "string", - "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "eip7594" ] + "enum" : [ "phase0", "altair", "bellatrix", "capella", "deneb", "electra" ] }, "execution_payload_blinded" : { "type" : "boolean" @@ -42,9 +42,9 @@ }, { "$ref" : "#/components/schemas/BlindedBlockDeneb" }, { - "$ref" : "#/components/schemas/BlockContentsEip7594" + "$ref" : "#/components/schemas/BlockContentsElectra" }, { - "$ref" : "#/components/schemas/BlindedBlockEip7594" + "$ref" : "#/components/schemas/BlindedBlockElectra" } ] } } diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBeaconBlockEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBeaconBlockElectra.json similarity index 73% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBeaconBlockEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBeaconBlockElectra.json index 87cdc1176c2..f4bd8db4511 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBeaconBlockEip7594.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBeaconBlockElectra.json @@ -1,10 +1,10 @@ { - "title" : "SignedBeaconBlockEip7594", + "title" : "SignedBeaconBlockElectra", "type" : "object", "required" : [ "message", "signature" ], "properties" : { "message" : { - "$ref" : "#/components/schemas/BeaconBlockEip7594" + "$ref" : "#/components/schemas/BeaconBlockElectra" }, "signature" : { "type" : "string", diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlindedBlockEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlindedBlockElectra.json similarity index 73% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlindedBlockEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlindedBlockElectra.json index 7cbe0739c80..89ca16c5a4e 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlindedBlockEip7594.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlindedBlockElectra.json @@ -1,10 +1,10 @@ { - "title" : "SignedBlindedBlockEip7594", + "title" : "SignedBlindedBlockElectra", "type" : "object", "required" : [ "message", "signature" ], "properties" : { "message" : { - "$ref" : "#/components/schemas/BlindedBlockEip7594" + "$ref" : "#/components/schemas/BlindedBlockElectra" }, "signature" : { "type" : "string", diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlockContentsEip7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlockContentsElectra.json similarity index 84% rename from data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlockContentsEip7594.json rename to data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlockContentsElectra.json index f4a9e559bda..c1e294612a3 100644 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlockContentsEip7594.json +++ b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/beacon/schema/SignedBlockContentsElectra.json @@ -1,10 +1,10 @@ { - "title" : "SignedBlockContentsEip7594", + "title" : "SignedBlockContentsElectra", "type" : "object", "required" : [ "signed_block", "kzg_proofs", "blobs" ], "properties" : { "signed_block" : { - "$ref" : "#/components/schemas/SignedBeaconBlockEip7594" + "$ref" : "#/components/schemas/SignedBeaconBlockElectra" }, "kzg_proofs" : { "type" : "array", diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlindedBlockEIP7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlindedBlockEIP7594.json deleted file mode 100644 index ee89ad769bd..00000000000 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlindedBlockEIP7594.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"eip7594","execution_payload_blinded":true,"execution_payload_value":"50756583220288449835724789919752990744036228048165053817930899246206127260481","consensus_block_value":"24799950324699182119107049583125116496986047597328004586475399986067975839137","data":{"slot":"1","proposer_index":"4666673844721362956","parent_root":"0x367cbd40ac7318427aadb97345a91fa2e965daf3158d7f1846f1306305f41bef","state_root":"0xfd18cf40cc907a739be483f1ca0ee23ad65cdd3df23205eabc6d660a75d1f54e","body":{"randao_reveal":"0x9005ed0936f527d416609285b355fe6b9610d730c18b9d2f4942ba7d0eb95ba304ff46b6a2fb86f0c756bf09274db8e11399b7642f9fc5ae50b5bd9c1d87654277a19bfc3df78d36da16f44a48630d9550774a4ca9f3a5b55bbf33345ad2ec71","eth1_data":{"deposit_root":"0x6fdfab408c56b6105a76eff5c0435d09fc6ed7a938e7f946cf74fbbb9416428f","deposit_count":"4658411424342975020","block_hash":"0x499db7404cbff78670f0209f1932346fef68d985cb55a8d27472742bdf54d379"},"graffiti":"0x0000000000000000000000000000000000000000000000000000000000000000","proposer_slashings":[{"signed_header_1":{"message":{"slot":"4661716390776343276","proposer_index":"4600574485989226763","parent_root":"0x32a7d23faa44fc04cc23dc3b560a55ade3deb2c393e9de2e6d20bdad2416c39b","state_root":"0xf943e43fcb615e36ec5aa6b9db6f1746d0d5b50d708f6400e39cf25495f39cfb","body_root":"0x0c65de3f6bad3d7be19d0de5aff82b13d6d8b49f26588dba111e361d6f545486"},"signature":"0xb520c40e02457e0d3d61ebba3b04912f7db82a9a74132fedf190d94b32738dc62744644455959b4b4dc7aaf1e54064fa0f4aefe30696b7ed758c921d266402360e9abc003374800cd2aa6ffaa0c11a5cbfb3798b1816bac7be1e0c67c3305483"},"signed_header_2":{"message":{"slot":"4661716390776343276","proposer_index":"4600574485989226763","parent_root":"0x7e2bbb3f2a737918a12f79e9a52da7e1fceaae0b6c0c82172425cbce8d99a0c6","state_root":"0x45c8cc3f4a90db49c16643672a93697ae9e1b15549b207e99aa10076fe767a26","body_root":"0x58e9c63feadbba8eb6a9aa92fd1b7e47efe4b0e7ff7a30a3c822443ed8d731b1"},"signature":"0xa01cb4e18fb43a400024b67cd091680b8412ea66ed4a0d41f7ee611a87476d153e18879e22a5dbc98df9ea4ecd016c1801f1ee9411e103383c73c06cb5331b8377ef8f2f4ab67a4975135a59d9121279f9d979625d78f339f71aaaec565911b1"}}],"attester_slashings":[{"attestation_1":{"attesting_indices":["4585702132744102314","4590659586689121994","4589007099177470570"],"data":{"slot":"4580744678799082634","index":"4579092195582398506","beacon_block_root":"0xded09d3f4aedd5706b7e7dc2c7d90de31bfaa9e5fcf74dba08ab1cb8d17d357c","source":{"epoch":"533461240","root":"0xed7436400b3f287283b1005a48f4f70e79abc311779529d2628c4161a3a79565"},"target":{"epoch":"538462976","root":"0xc7324240cba769e8982b3203a1e2ce746ca5c5ed0a04d85d078abad0efe52650"}},"signature":"0xab7a632a4707b1f8280944e479d239726caec1c6a73e8cc29eb98aa9cbeaa97d4c4921bdb8cd977f07a172062b8143be0d2db585dd2e8356897ae04f59234c800f2a6a2607a9491de5c57a92fbd8ad6e3f5e525618a1481b1f1446623e8765fc"},"attestation_2":{"attesting_indices":["4585702132744102314","4590659586689121994","4589007099177470570"],"data":{"slot":"4620404293179370891","index":"4618751809962686763","beacon_block_root":"0x14b72a404bd6e6fb6d37cfb0f00521a985b1c135e4267b46be8ec8f15869047b","source":{"epoch":"538078227","root":"0x867d07400b9c22992dc93ab5e53a9c77abc3bba12adb6fa3d1955da376ae50bb"},"target":{"epoch":"536923980","root":"0x603b1340cb04640f42436c5e3e2973dd9ebdbd7dbd491e2f7593d612c2ece1a5"}},"signature":"0xa32991816eb9f297553b4732309a4cdba7b33287264611715b0ab3319bca19e581da6e2659912a4e0e94aafc01c488e30ffc96ed14e2a726b9d3c618405ee0bf54bf6ae7f2097465cb27ab8132ec24eb93d3c9159475304082f7f0e452b93b65"}}],"attestations":[{"aggregation_bits":"0xfa79cdb89d0d51c5cdd001b7425c6d726750a9d5f89ade6ed9890ce3a706140c399a5e10c90a819094b65322dac7501f7c75471e69d4567358d8ca75f7c1b3133ebecf006b369a1f36efc5f2b706d5922ff98c58a1825a53a864376658f816600cf021cea843d4396502bb9c74d1510afe26036f89f783b4f5c7bacb6649c46f217a6af835f312d6fa253d2bbc83c07993f4f10de2ed2d952689379dbe4f794c1a1055a6b364d68e038deec9667f576b3b9eca5fcadd6298f181e1edb876efc3d0975ae14ae9a0ad2f1836d4c3f1080a96d8ab7c43b34bb2eda895ff66be698b363cfa4be33da3ec94a1a7a90672fd12c4a59916bb937e78476e4f08e4f4031001","data":{"slot":"4605531939934246443","index":"4610489389584298827","beacon_block_root":"0xbfe0f53feb7ec0670c92703760d5d9debdccb8574d35ead15a1928fc05d1765b","source":{"epoch":"529421377","root":"0x95c9163fa9b8e5a07382c4a8ca24e64fab3f93035e00f87325462db67031aff2"},"target":{"epoch":"529806126","root":"0x6f87223f6921271789fcf5512313bdb59e3995dff16ea6ffca43a625bb6f40dd"}},"signature":"0x8f8d16b39e14569aab1b712e5c19ed51afe3600a6b017e8ab432f43a02ee720a733c33ef087d2f3653a9701e8d8a836301655b9195c0373b775c88ba1368e5d55354a70a3096bd26dee29dddbe7a4820e2b1653e84122beacbc01af7d93e6bdc"},{"aggregation_bits":"0x4ac567b296efbf7cf3209e87096a7a1a50fd523400113f917f6584a5a306f06b2d8da9ae858d47ff2594010089838efe41f19a78d9aae27c2ffde26f278b8681db9d091eb72e7cab3e449dfccd46a270693e1f88f197324e57bfd45573315cf9fb60d770937b32f7c0c6ce1581ec51e6b60f71acfde304dc917f2e0aa7872038b7d9140d15f7927c23a0490a74c2b0aca2773fed9217067e4444f9ca93874e4ff8407111c3efdb138b97c6d4957b6a70ec1debb283e3d0eb1cfef068adcffbf057d20fdc339eae03f0fa2613abdde8158a7fc40c3cfd1117eb6f8c4ae21d6b2ab4b57ae9a8653a34451aee6418c0c3609dc937293f5f5b346a7ab1a0d144185101","data":{"slot":"4544390030852162633","index":"4542737547635478505","beacon_block_root":"0x1bb1ed3e09ca0083285797d894e275ebd7548c015a7d158b66ce053068d7b2bd","source":{"epoch":"527690007","root":"0xf56ef93ec93242f93dd1c881ecd04c51ca4e8eddeeebc3160acc7e9fb41544a8"},"target":{"epoch":"528074756","root":"0x6735d63e89f87d96fd623486e205c81ff060884934a0b8731dd31351d25a90e8"}},"signature":"0x90309dd491ae6ed51917dc305a3d4ae68d0a0d4792c7eb59c193bd03605bd94e61cab37502de0ad3e6162bc02427bba80a798b3670d5de82a854094016cc298b265371345c0e3ac49fd44bbb9ba0d4fcea0c1a80cecb60e93921d907e8c48120"},{"aggregation_bits":"0xe8c9759f0840f980ae956b15fc383d992e7d4420d12ba5bf32f669f446ac6fa388e20e5ce96e9266dd98840179d2cde3cabd9a8bafab5dec9c2e89f7f78c989e690548603984803b80c82d7b76443194576a1ce49da5cfe56f56e83b745fb01b5f18ccc86d88f5a22d927e64ff0b8e880893abcddec45b268531c4a0697537dae643a24b1a36432f37d42962553bd39af71f37e0429b81470c11316aa39db074aa3f1df4124e7cb203debed60b885ffb9b27e46a1434e81bbd56566632d0729c0822ac415cbb67f25973667d88e58df9c2f058a0ae7f118c98cc448453b6fbe590363bd17ed62c2f808df61f2a9e593235eeb56db74b9dd15980189a5271468301","data":{"slot":"4529517677607038185","index":"4574134745932346122","beacon_block_root":"0x64b8743faafef0521f5350f290979d7e470fa3e3f8746bd14933f531ca233947","source":{"epoch":"532884117","root":"0x3d76803f6a6732c935cd819be98574e43a09a5bf8ce3195ded306ea11562ca31"},"target":{"epoch":"531729870","root":"0xb03c5d3f2a2d6e66f45eed9fdfbaefb2601b9f2bd2970eba0038035333a71672"}},"signature":"0x8c40f51a99fce6ebb9a4db5e80d715fff319e7ae523e46afb5d03c000d427e23c7a39e77e2af53851706283c8ca91d680997cb459386fbdff52c4d0ecf498e173717a838a792b210bdffaf476538628584a133899bf30dd5ce7056463b8cd683"}],"deposits":[{"proof":["0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c"],"data":{"pubkey":"0xb1f8f6e731dbf6b4e3265fb857c7190adbfc7e6cc95ce2e8bda72be8b6ea3459f862310a2484c3b0ee33b30920f18c1d","withdrawal_credentials":"0xfcc0453faa5beb79c96a8a4d2dde41e779279b73abbab1a2b73c11749d2af49c","amount":"32000000000","signature":"0xb594382214f5bdd375de66c45e1c61a526c7b73fb166c72433bbd9c2a7ad6881244e61cc6427e0206a50b762a129d8830e8708c55761d61ce9e3b19c1bee13bc55daa13bdb07118efdbf57a588b8a64e6392d14f935e53b68933e3355b35acdb"}}],"voluntary_exits":[{"message":{"epoch":"4562567354825622634","validator_index":"4564219838042306762"},"signature":"0xb86aecf4e9673e9ac774883f03c46c2cfe59320e441abfc2e2bbaeda2193f58c57a3aec0ae63ba17d3b1cb81bd548689004773c1867cf047e1a2d5c3c51973fca33040cae49bee51bf4d2e23786f51dc5672bff5e9df8f7bc5fadae6be5c146e"}],"sync_aggregate":{"sync_committee_bits":"0x01000000","sync_committee_signature":"0x919ee45cc18456f6e85da6bc21c2e40f44f9a887932c73ea9ad354f88e56d4ec0a8c396ed143082c8e31d697b877a2a215d2966d91c7beb156bf7ab5777e210012f70dcd5f7657808a82cba51e194be994f917150ebdb9e5c57476f1edb47206"},"execution_payload_header":{"parent_hash":"0xf8eb5a3ea82ccf3c1be1ac153e3f77f273a07343291711b9de6b9dbebc4c9b49","fee_recipient":"0xbf886c3ec849316e3b187793c3a4398b6097768d","state_root":"0xd2a9663e689510b3305bdebe972d4e58669a751fbc85bf448269162e078b2c34","receipts_root":"0x324f493e880f6d0bfaa9e297b9d9b45986a970f94c718be767ef67174b6fc1e9","logs_bloom":"0x4570433e285b4c50f0ec49c38d62c9268cac6f8b023ab4a19570abdf25d078748f9069c96e9d6a2801cf607000a52447e46e1bef4e056ee30d4bd3517aaf7bf65ba04dd28c3a4a14b8dc72a300f051722a6814fa3931d90a82d23285d4c1127b6c67bbc4f8682ddbf9b31eb3114c26dccc5330109d6f17799339c2d7ed7e4e3a7de5d515106aaec7be6d78be3e21806d6d30c39b77c75dcf354b63033fb200b3b9dc023d948278f0956c0ee99323da0162f2a84b6a95749d2fa1d4e089af416d412ccd992683f7e41f7b496ca04f9f463806e3643d1c07f39d2a65f84e97b7dfaafac740d1e03f30923a4270fcf651ad2ca3737859a524e86e02229a55abd1a7","prev_randao":"0x0c0d553e4878ae811024144112c88bbf79a372d5dfdf39730cede08696ad52d4","block_number":"4489858063226749928","gas_limit":"4481595642848361992","gas_used":"4479943159631677864","timestamp":"4484900609281730248","extra_data":"0x6bb2373e68f20adada72181a3474f2c098b26daf6fcb0516f0723270da91e789","base_fee_per_gas":"91973405088222260025272995045243630915786868313949746451634391325697029602367","block_hash":"0xde78143e27b846779904841e2aa96d8fbec4671bb57ffa72037ac721f8d633ca","transactions_root":"0xa415263e48d5a8a8ba3b4e9caf0e3028abbb6a65922580447af6fcc869b40d2a","withdrawals_root":"0xe5ca603e08e1eff7259e45ea6bb662256d9d74b1724ee8feb0ea59f6e2ebe3be","blob_gas_used":"4476638188903342311","excess_blob_gas":"4521255257228650249"},"bls_to_execution_changes":[{"message":{"validator_index":"573888","from_bls_pubkey":"0xb8343e90edaecc9df1223293465ec067b3c9804f43e25817d27f1f4785bc5f554462032370781d9c65ab27bcc3d21415","to_execution_address":"0xdafbb23e48beb933bcf49f8ad83a43ee157382b5"},"signature":"0xa519e1354ad927358404a58bdc19113e5fd97d5cc19943888e22105ee943ca216a14898283fc3712500ba767de00022905e4198939b44a5f5a43fa0c87252969c56a26345135572101b257f87245a5e42fb2407a0ee67a6c2d039bf908b9aa8b"},{"message":{"validator_index":"189139","from_bls_pubkey":"0xa9ddce0cab5b51d3d2c710396b85e3fd7a87f1738fb5cfd5a7b25dbb483c167a80e785cb4ca7250c14a60cc282b1d9b8","to_execution_address":"0x9946783e88b272e45092a83c1c9310f154917869"},"signature":"0x8edfb3b9ed80067d0626019a1be330bac43c7ecd813f7ce781d0e6e34fb583803e9d2b047ad3294d6d3a54d020c68231085f7d9085d0afefb047def063a4698277e66d4a560f4b5bbd16586976f0bcf90177c00abd4a1b4cbd0ac393e5b904b5"},{"message":{"validator_index":"2357271","from_bls_pubkey":"0xa287d120292890ab1aa49bae1e3cd88bb160b5640f18c64f1aabae5990616e53099fe61698c3b812e2bc2ae6b6965960","to_execution_address":"0x09988f43d11dcf2aa7811c9997eb4119e8f153ce"},"signature":"0x8ca190827c66ff26c1fa594eae169b7efbd84c9456304f2194df7b0c204b0a29ac53034c9b20e4977b8e8b46d6b246da03a9337d3bf5e6f7ac941407a2a3437d7e2c0dcacda29b7623141833e02b4b12350ccaf8b27dbf96b3c520078f49efe2"},{"message":{"validator_index":"1972522","from_bls_pubkey":"0x8db8ee645b614f990839e4d98fdbf921263bb62cd917fb4eff9084dff23d7cc453f6cc645ad8b869aa9d31a6b9560630","to_execution_address":"0xc8e25443111288db3b1f254bdb430f1c27104a82"},"signature":"0xb0c3172e9bab8d04faa5d27f9818c36ad61a71b114f5bd9dbe77306be3edef2bcb56c215511ba76145006daec95f24be0f1f0dd24377cf7b440b5cdc7d0b520d6b64c539eaacaf14875d49c293af5974751bb0ce2daafde3bd01e097a466e75f"},{"message":{"validator_index":"48778","from_bls_pubkey":"0x8ba697cdd6f8c34a1fb96a4c88f03360d19515ccc4e1ea24aa5e80075d821059806a0047e6bbf5d908d312d1902aff5d","to_execution_address":"0xee24494351a9466526a5f3a1825538b6331648a6"},"signature":"0x87fadfd11bc5612e06c59d576c91599bc21095531fcc27a177967de7b521c377ee7a2b10d0fadf38779089929cfe136518757803c369b4ce94873e28d7d9cdf54c31a53ed86b07f76ea6104ee65d76de02267a4b736c949785ef233cbb73ad4a"},{"message":{"validator_index":"2820011","from_bls_pubkey":"0xa32a5f28ae7d36f888820160335232fc42ef994b4f93acf6a8659762b2ec52ca79354cc07c73a229b529bfcebc705eff","to_execution_address":"0x4a4dca439229167a13e413e752937416aad35d1a"},"signature":"0xa2089742415bdf32fa2dde853661a095ac24d273413687ae04fabb99ae2982700bcdb885d239e32543ffb95763a43e690cb1bf3a33df40d24e12c46d150e9c59dd63f960dec39712dabf74c08a55ba1bcb6db664ff9d5b2261da353e4374466c"},{"message":{"validator_index":"896267","from_bls_pubkey":"0xb679b4b686530827b2a201eb2b18454e9a5758d7257737b29bb215b9f354c2ff57e912b19d4a051556187aa24c97371b","to_execution_address":"0x708fbe43d1c0d403fd69e23dfaa49db0b6d95b3e"},"signature":"0x8da9cee45a3046b209da332512a6b4e4d7c89768f55998eb79ee236b4fb1fbcea87e0bba7b05d19ea7b8c5ea6dc0081e17a7ad0ec41566a0c6d9e127b87691e1d5b823fd178069e3f30091dcdbb44c36408656941755177c45bc976bf270289d"},{"message":{"validator_index":"511518","from_bls_pubkey":"0x83b8c61b63de768821cbd82ee3c67c81bb848163d6af0186ffe1ca3936d283bb4cab886f3fbc7f6336fec3da8d542c76","to_execution_address":"0x92fcc742102977503966d35cb217fc55bd583232"},"signature":"0x8c90298abaed4b5124cff46e41c9a4ed2b2baa0d2089add6b64c70dc7547f1a83bed76aba1fac6d36605beea72734b490b7b98994c7c65fdb436286b0df898731f6ad536e5a603da85ec8cc4488b94dc8c61e11363d1cc18733382dca51c7008"},{"message":{"validator_index":"1431791","from_bls_pubkey":"0xa532ee397fdd9e388888d90f712e13b085ad5043402debe1caf3dabbb514ed0d06f7c897e4e2795fd018cd672bfa8948","to_execution_address":"0xb83ebc4250c035da23eca1b3592925f0c95e3056"},"signature":"0x8fb8cb9373db269dd2a05fe0a07484db022a95b06c03807426a352499fcb65c55f8c388fd4cddbdd9936d5fe5ac5898e0d8b58ae09a73bdc7e584fe9940d3aa967607a0c4a1ad1ce5ccc0ad83f63a273e140ae0510f709cd0c214b645d68e3f4"},{"message":{"validator_index":"1047042","from_bls_pubkey":"0xb7d85608c3cf919ee72c0481283b468c2825850f6f6028c000cb19bff464556973909667d0353582d673e1049795f20c","to_execution_address":"0x778981428fb4ee8ab889aa659e81f2f2087d260a"},"signature":"0xa1079cff71763f60894927a0ac68cfff88642e5ec4e11d1f63ce7d7b15f2567842c80c0238a0f6e4d38ac2a9d09787c50c87daba460e05a0336332f1d37b65fed7526c5eb51a84d3a0169d09ddaf271d13710d22469e8dffde8859d50a2dd0a1"},{"message":{"validator_index":"2279280","from_bls_pubkey":"0xa46cb4c6f51759dd36e897cf8f5f8a774dbb5968defec8bcd85b9ec0f3d873a6569fabde6c6cf3fa5dc77e910bc39938","to_execution_address":"0x3aa93143d0d7c378fbb0904fd1788aea4c2244ee"},"signature":"0x988ea703ce8fcbd5bc7811c49e1eede7061ce461966a9a52f03afdecb157f065a1993fd71ea29c6769121610fc9e3e190eff938fb8c2f77dcf5f511208ad23cf427c05dd207b6c6004ba2a1ee3b6a84949e39db4ef1ee254635d3527010f7794"},{"message":{"validator_index":"1894531","from_bls_pubkey":"0xa18343c3306dae4ff3c78428069a4ae7876f0ad620219648b99b4bfaeea1d7898df50d508533e756f5903efbdf585076","to_execution_address":"0xf9f3f64210cc7c298f4e990115d157ed8b403aa2"},"signature":"0xa120e4f3144799db31e7487d25cbe6d8724f0076f23fdd7ff1f00b24b304a93a97862a3ebecb5e1b91018a0496a3c4020004b5d49571f4b9a3faf0f9d8f1f067d7005b5600db18872732313acf1350e1bec278384f3e0fe28d43f00203ae10e7"},{"message":{"validator_index":"2970787","from_bls_pubkey":"0xb23734206f673528ad12bad1b7815a9db722d7a5afffdfac97e17d453fcd2616a804619bd9f8db50b9547a357b1f5813","to_execution_address":"0x2036eb4250633bb379d46758bce28087974638c6"},"signature":"0x8de01f498b48fd1df0c20529228b7e8616c7bfc35457d392404110e394db4c884dad325363be1f2a83ac383486cdea460e78e89a728ac9464f71dfbc685ac8be3fb9ecb21d67a6c105354c58bfb78f2adf7ee65f5a4d7fbe5989e522b52daccf"},{"message":{"validator_index":"2430055","from_bls_pubkey":"0xb490d2df5759bb5115690df9aa805cddc1787b17fc3984ec400d03ccd5c6da6dbc54a724816ccf0c86b4b23e4daf0b17","to_execution_address":"0x42a3f4418ecbddffb5d058777555df2c9ec50eba"},"signature":"0x909ac7032213a33af76294ec19617f3fd9859bb22201e0502ae7187debe740c5cb0367ef03e944eab7fdc5ab23d303f916904a1ca5f7aadbcfbab89bdd82931dd7ff3e0efdd1135698f54774989ddd6d8ee07bebff863718c927072564a547bb"},{"message":{"validator_index":"506311","from_bls_pubkey":"0xa2810855686190fded08fbafafc427d3540a58c2b391c0d05a71be7a4d1aff2b4ea501c8e4c1ebb79cb49f1991ada976","to_execution_address":"0x68e5e841ce629c89a05627ce1c6708c7aacb0cde"},"signature":"0xa108770fd60463dfc982d8725440e47c54730329420bcf05a969e4937d06e468385b53c4a5f6c69e55a775f358fa0948171dedf3bb0ccc1679280251b7abe4cc644e10b46bcdaddd590951541bda68373c8a8dcbfb86d3cb97822a5dfc21f481"},{"message":{"validator_index":"121562","from_bls_pubkey":"0x8deafeba9f0184ffa1f3d1422b9d97d6975fc4d5a21df265b48b6e831d6aee5a6236b3d5fb9e03cab1e0795f3dd45206","to_execution_address":"0xc40d6a420fe36b9e8d954713eca4442721892252"},"signature":"0xb489851f8a8fd535ee14505b9ae32ab27cd8d5e637236f491f71bfc987316491ef3f1b7670378875580eb247993d82511128502ea093d108730e070bb8c5919b39e78893139b3f1a499e885b15d385073e227d6a4e85ba0413ab9e2481d0b8da"}],"blob_kzg_commitments":["0xb1ec6f426f978c599752e0e7181c305a1b8623c06088b5480b9aad7fe5f419d6c81a8f6862abe50a5e8cadf8649d347c","0x109252428f11e9b162a1e4c03bc8965b3a951e9aef7381ebf01fff6828d9ae8bbeb86d42469047b0c205fd55488427fc","0x23b34c422f5dc8f657e44bec0e51ab2840981d2ca63caaa51da14231033a661656d833a140f1279e0a1e40020f4c8be2","0xea4f5e424f7a2a28771b166a93b66dc12d8f207683e22f77941d78d8741740768f79e18451ce86d434d576fdbaf45f2f","0xfd705842efc5096d6c5e7d95673f828e34921f0839ab5831c29ebba04e78f7002799a7e34b2f67c27bedb9a981bcc315","0x5d163b420f4066c536ad816e89ebe88f53a11ae2c99624d4a7240d8a925c8cb61d3786bd2f14c967df66090765a3b695"]}}} \ No newline at end of file diff --git a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlockContentsEIP7594.json b/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlockContentsEIP7594.json deleted file mode 100644 index 37ea0fbd18c..00000000000 --- a/data/beaconrestapi/src/integration-test/resources/tech/pegasys/teku/beaconrestapi/v3/newBlockContentsEIP7594.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"eip7594","execution_payload_blinded":false,"execution_payload_value":"11103013652248291612222159278156471032005615587981889885338966324871092985294","consensus_block_value":"19755222334871137581966673778023884694586692954373005173000436914838007452761","data":{"block":{"slot":"1","proposer_index":"4666673844721362956","parent_root":"0x367cbd40ac7318427aadb97345a91fa2e965daf3158d7f1846f1306305f41bef","state_root":"0xfd18cf40cc907a739be483f1ca0ee23ad65cdd3df23205eabc6d660a75d1f54e","body":{"randao_reveal":"0x9005ed0936f527d416609285b355fe6b9610d730c18b9d2f4942ba7d0eb95ba304ff46b6a2fb86f0c756bf09274db8e11399b7642f9fc5ae50b5bd9c1d87654277a19bfc3df78d36da16f44a48630d9550774a4ca9f3a5b55bbf33345ad2ec71","eth1_data":{"deposit_root":"0x6fdfab408c56b6105a76eff5c0435d09fc6ed7a938e7f946cf74fbbb9416428f","deposit_count":"4658411424342975020","block_hash":"0x499db7404cbff78670f0209f1932346fef68d985cb55a8d27472742bdf54d379"},"graffiti":"0x0000000000000000000000000000000000000000000000000000000000000000","proposer_slashings":[{"signed_header_1":{"message":{"slot":"4661716390776343276","proposer_index":"4600574485989226763","parent_root":"0x32a7d23faa44fc04cc23dc3b560a55ade3deb2c393e9de2e6d20bdad2416c39b","state_root":"0xf943e43fcb615e36ec5aa6b9db6f1746d0d5b50d708f6400e39cf25495f39cfb","body_root":"0x0c65de3f6bad3d7be19d0de5aff82b13d6d8b49f26588dba111e361d6f545486"},"signature":"0xb520c40e02457e0d3d61ebba3b04912f7db82a9a74132fedf190d94b32738dc62744644455959b4b4dc7aaf1e54064fa0f4aefe30696b7ed758c921d266402360e9abc003374800cd2aa6ffaa0c11a5cbfb3798b1816bac7be1e0c67c3305483"},"signed_header_2":{"message":{"slot":"4661716390776343276","proposer_index":"4600574485989226763","parent_root":"0x7e2bbb3f2a737918a12f79e9a52da7e1fceaae0b6c0c82172425cbce8d99a0c6","state_root":"0x45c8cc3f4a90db49c16643672a93697ae9e1b15549b207e99aa10076fe767a26","body_root":"0x58e9c63feadbba8eb6a9aa92fd1b7e47efe4b0e7ff7a30a3c822443ed8d731b1"},"signature":"0xa01cb4e18fb43a400024b67cd091680b8412ea66ed4a0d41f7ee611a87476d153e18879e22a5dbc98df9ea4ecd016c1801f1ee9411e103383c73c06cb5331b8377ef8f2f4ab67a4975135a59d9121279f9d979625d78f339f71aaaec565911b1"}}],"attester_slashings":[{"attestation_1":{"attesting_indices":["4585702132744102314","4590659586689121994","4589007099177470570"],"data":{"slot":"4580744678799082634","index":"4579092195582398506","beacon_block_root":"0xded09d3f4aedd5706b7e7dc2c7d90de31bfaa9e5fcf74dba08ab1cb8d17d357c","source":{"epoch":"533461240","root":"0xed7436400b3f287283b1005a48f4f70e79abc311779529d2628c4161a3a79565"},"target":{"epoch":"538462976","root":"0xc7324240cba769e8982b3203a1e2ce746ca5c5ed0a04d85d078abad0efe52650"}},"signature":"0xab7a632a4707b1f8280944e479d239726caec1c6a73e8cc29eb98aa9cbeaa97d4c4921bdb8cd977f07a172062b8143be0d2db585dd2e8356897ae04f59234c800f2a6a2607a9491de5c57a92fbd8ad6e3f5e525618a1481b1f1446623e8765fc"},"attestation_2":{"attesting_indices":["4585702132744102314","4590659586689121994","4589007099177470570"],"data":{"slot":"4620404293179370891","index":"4618751809962686763","beacon_block_root":"0x14b72a404bd6e6fb6d37cfb0f00521a985b1c135e4267b46be8ec8f15869047b","source":{"epoch":"538078227","root":"0x867d07400b9c22992dc93ab5e53a9c77abc3bba12adb6fa3d1955da376ae50bb"},"target":{"epoch":"536923980","root":"0x603b1340cb04640f42436c5e3e2973dd9ebdbd7dbd491e2f7593d612c2ece1a5"}},"signature":"0xa32991816eb9f297553b4732309a4cdba7b33287264611715b0ab3319bca19e581da6e2659912a4e0e94aafc01c488e30ffc96ed14e2a726b9d3c618405ee0bf54bf6ae7f2097465cb27ab8132ec24eb93d3c9159475304082f7f0e452b93b65"}}],"attestations":[{"aggregation_bits":"0xfa79cdb89d0d51c5cdd001b7425c6d726750a9d5f89ade6ed9890ce3a706140c399a5e10c90a819094b65322dac7501f7c75471e69d4567358d8ca75f7c1b3133ebecf006b369a1f36efc5f2b706d5922ff98c58a1825a53a864376658f816600cf021cea843d4396502bb9c74d1510afe26036f89f783b4f5c7bacb6649c46f217a6af835f312d6fa253d2bbc83c07993f4f10de2ed2d952689379dbe4f794c1a1055a6b364d68e038deec9667f576b3b9eca5fcadd6298f181e1edb876efc3d0975ae14ae9a0ad2f1836d4c3f1080a96d8ab7c43b34bb2eda895ff66be698b363cfa4be33da3ec94a1a7a90672fd12c4a59916bb937e78476e4f08e4f4031001","data":{"slot":"4605531939934246443","index":"4610489389584298827","beacon_block_root":"0xbfe0f53feb7ec0670c92703760d5d9debdccb8574d35ead15a1928fc05d1765b","source":{"epoch":"529421377","root":"0x95c9163fa9b8e5a07382c4a8ca24e64fab3f93035e00f87325462db67031aff2"},"target":{"epoch":"529806126","root":"0x6f87223f6921271789fcf5512313bdb59e3995dff16ea6ffca43a625bb6f40dd"}},"signature":"0x8f8d16b39e14569aab1b712e5c19ed51afe3600a6b017e8ab432f43a02ee720a733c33ef087d2f3653a9701e8d8a836301655b9195c0373b775c88ba1368e5d55354a70a3096bd26dee29dddbe7a4820e2b1653e84122beacbc01af7d93e6bdc"},{"aggregation_bits":"0x4ac567b296efbf7cf3209e87096a7a1a50fd523400113f917f6584a5a306f06b2d8da9ae858d47ff2594010089838efe41f19a78d9aae27c2ffde26f278b8681db9d091eb72e7cab3e449dfccd46a270693e1f88f197324e57bfd45573315cf9fb60d770937b32f7c0c6ce1581ec51e6b60f71acfde304dc917f2e0aa7872038b7d9140d15f7927c23a0490a74c2b0aca2773fed9217067e4444f9ca93874e4ff8407111c3efdb138b97c6d4957b6a70ec1debb283e3d0eb1cfef068adcffbf057d20fdc339eae03f0fa2613abdde8158a7fc40c3cfd1117eb6f8c4ae21d6b2ab4b57ae9a8653a34451aee6418c0c3609dc937293f5f5b346a7ab1a0d144185101","data":{"slot":"4544390030852162633","index":"4542737547635478505","beacon_block_root":"0x1bb1ed3e09ca0083285797d894e275ebd7548c015a7d158b66ce053068d7b2bd","source":{"epoch":"527690007","root":"0xf56ef93ec93242f93dd1c881ecd04c51ca4e8eddeeebc3160acc7e9fb41544a8"},"target":{"epoch":"528074756","root":"0x6735d63e89f87d96fd623486e205c81ff060884934a0b8731dd31351d25a90e8"}},"signature":"0x90309dd491ae6ed51917dc305a3d4ae68d0a0d4792c7eb59c193bd03605bd94e61cab37502de0ad3e6162bc02427bba80a798b3670d5de82a854094016cc298b265371345c0e3ac49fd44bbb9ba0d4fcea0c1a80cecb60e93921d907e8c48120"},{"aggregation_bits":"0xe8c9759f0840f980ae956b15fc383d992e7d4420d12ba5bf32f669f446ac6fa388e20e5ce96e9266dd98840179d2cde3cabd9a8bafab5dec9c2e89f7f78c989e690548603984803b80c82d7b76443194576a1ce49da5cfe56f56e83b745fb01b5f18ccc86d88f5a22d927e64ff0b8e880893abcddec45b268531c4a0697537dae643a24b1a36432f37d42962553bd39af71f37e0429b81470c11316aa39db074aa3f1df4124e7cb203debed60b885ffb9b27e46a1434e81bbd56566632d0729c0822ac415cbb67f25973667d88e58df9c2f058a0ae7f118c98cc448453b6fbe590363bd17ed62c2f808df61f2a9e593235eeb56db74b9dd15980189a5271468301","data":{"slot":"4529517677607038185","index":"4574134745932346122","beacon_block_root":"0x64b8743faafef0521f5350f290979d7e470fa3e3f8746bd14933f531ca233947","source":{"epoch":"532884117","root":"0x3d76803f6a6732c935cd819be98574e43a09a5bf8ce3195ded306ea11562ca31"},"target":{"epoch":"531729870","root":"0xb03c5d3f2a2d6e66f45eed9fdfbaefb2601b9f2bd2970eba0038035333a71672"}},"signature":"0x8c40f51a99fce6ebb9a4db5e80d715fff319e7ae523e46afb5d03c000d427e23c7a39e77e2af53851706283c8ca91d680997cb459386fbdff52c4d0ecf498e173717a838a792b210bdffaf476538628584a133899bf30dd5ce7056463b8cd683"}],"deposits":[{"proof":["0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c","0x8afa683fea95afdc0ad91e4937a9c6185315a1076506bd45a4357cc27fe5a75c"],"data":{"pubkey":"0xb1f8f6e731dbf6b4e3265fb857c7190adbfc7e6cc95ce2e8bda72be8b6ea3459f862310a2484c3b0ee33b30920f18c1d","withdrawal_credentials":"0xfcc0453faa5beb79c96a8a4d2dde41e779279b73abbab1a2b73c11749d2af49c","amount":"32000000000","signature":"0xb594382214f5bdd375de66c45e1c61a526c7b73fb166c72433bbd9c2a7ad6881244e61cc6427e0206a50b762a129d8830e8708c55761d61ce9e3b19c1bee13bc55daa13bdb07118efdbf57a588b8a64e6392d14f935e53b68933e3355b35acdb"}}],"voluntary_exits":[{"message":{"epoch":"4562567354825622634","validator_index":"4564219838042306762"},"signature":"0xb86aecf4e9673e9ac774883f03c46c2cfe59320e441abfc2e2bbaeda2193f58c57a3aec0ae63ba17d3b1cb81bd548689004773c1867cf047e1a2d5c3c51973fca33040cae49bee51bf4d2e23786f51dc5672bff5e9df8f7bc5fadae6be5c146e"}],"sync_aggregate":{"sync_committee_bits":"0x01000000","sync_committee_signature":"0x919ee45cc18456f6e85da6bc21c2e40f44f9a887932c73ea9ad354f88e56d4ec0a8c396ed143082c8e31d697b877a2a215d2966d91c7beb156bf7ab5777e210012f70dcd5f7657808a82cba51e194be994f917150ebdb9e5c57476f1edb47206"},"execution_payload":{"parent_hash":"0xe5ca603e08e1eff7259e45ea6bb662256d9d74b1724ee8feb0ea59f6e2ebe3be","fee_recipient":"0xf8eb5a3ea82ccf3c1be1ac153e3f77f273a07343","state_root":"0xbf886c3ec849316e3b187793c3a4398b6097768d06bd968a54e8d2652d2a75a9","receipts_root":"0xd2a9663e689510b3305bdebe972d4e58669a751fbc85bf448269162e078b2c34","logs_bloom":"0x324f493e880f6d0bfaa9e297b9d9b45986a970f94c718be767ef67174b6fc1e9f770a36a743c8a3abab61dc439ddc0604dd5015b1ed3835787d9565dee0f3e64b25de4c097defe3001f483a4b6feac22b992cada114bfc709d483b4d94f07bb0a1c4fb9e93ca3c31f4b9683753ba33ffd971777e301367f1edfe6809da491535c711a7877b4c97fd1a756136c412b4f3c4471ba439607333623558a63030f2cb6bc2ba885822672de14ea697d44fbcde134b6909208466be0b4c981658ba30f999c991aca746c3331766af1ee10cbe69624066708ae086999a0a3853eb777b3f9f0455cfd98a98c7719710515b97c596d2b662d353a90206e470c523d4374853","prev_randao":"0x4570433e285b4c50f0ec49c38d62c9268cac6f8b023ab4a19570abdf25d07874","block_number":"4491510546443434056","gas_limit":"4489858063226749928","gas_used":"4481595642848361992","timestamp":"4479943159631677864","extra_data":"0x58913d3ec8a62b95e52fb1ee60ebddf392af6e1db902dd5bc3f1eea7003130ff","base_fee_per_gas":"48712354854557871613352262057776104244427151172201944877932608112921551169417","block_hash":"0xcb571a3e876c6732a4c11cf3562059c2b8c16889ffb6d1b8d5f883591e767c3f","transactions":["0xb736203ee72088","0xc7dab83ea972da","0xa198c43e69db1b","0x135fa13e28a157","0xed1cad3ee80999","0x60e3893ea8cfd4","0x39a1953e683816","0xac67723e28fe51"],"withdrawals":[{"index":"4864971916622804241","validator_index":"2164897","address":"0x09988f43d11dcf2aa7811c9997eb4119e8f153ce","amount":"4866624404134455665"}],"blob_gas_used":"4858361979461100433","excess_blob_gas":"4856709496244416305"},"bls_to_execution_changes":[{"message":{"validator_index":"625901","from_bls_pubkey":"0x8b772ee4cbcc67f534f33102671346cc3d0ddecc1a81f0350f68dd3210681c9e4bf907b49211cbd390bfadc7f285214a","to_execution_address":"0xb5c15a4371c6a89646dcbd1f07bbfa4e210d4bf0"},"signature":"0x85cc5356a9646f0ffd512b7d2e7d3242c81303a415e61b490d28635896aef1f2db03ae8a1439908d03cc131515ef83f003dd7b36ce480c43f4495ffd339b2b9d1e5461309a02ce193202f27d216a4f0e13f7b47295f3e1a44c8f0e8ae8e1e5a8"},{"message":{"validator_index":"241152","from_bls_pubkey":"0x8183f3f5071394e20f83599fe297dfda37f77a040362da8f8fe926a451eb9cfd917e953c51b81619f8e4925fa6177b49","to_execution_address":"0x10eadb43b24678ab331bde64d7f836af97ca6064"},"signature":"0xa19b99131e621d31846245039e99d6540418acc08844a3996544cca2d9965f8a24cc49cf695bd78959a784e1b5646b480b88aec749a62ea934ed3001af50bb8babfb15bb9df1f3d57abd738f65de02b77398c82302f500218675cd96ee3b2357"},{"message":{"validator_index":"1473390","from_bls_pubkey":"0xa83cbdf40e5c4bdb4e9802d94d765c70150d9926521b0ec4d273e788b83a9f304694e75d2e381ce631b24121ffecc9d4","to_execution_address":"0x372cd043f2dd36351da1acbb7f0a6049a4d05e88"},"signature":"0x998cb975f863e95fd53ee74c5beb85c19b8b3858773432a371e6a3f229f67b653165adf3bbaa6015dec12a1d13cc9d5c080915c55c921fb056fd32e9da643d96dcbe83ccd456b3072dce2610d7b96e69488468c83d26b7251a466571a5424351"},{"message":{"validator_index":"1088641","from_bls_pubkey":"0xa7f8aff7b912b6363efb810f2b661643624ab914b034e78d72397ef84fa04862dee94c9b2f46b872fe852f197f558fce","to_execution_address":"0xf676954331d2efe5b23eb56dc3622d4ce2ee543c"},"signature":"0x94773ae9e3d605ba2612dbea934955e7af438154f7572136c97bc3f858144ab833aa7bf6caee2a2c4ad066d36b1d0c3501359ff577de486f81a5210258cf63ff45bb0cf91526eca949dfee984c6757a957f9c7ddfb8b599d3cfbec0b778e9396"},{"message":{"validator_index":"2008914","from_bls_pubkey":"0xa6c59055cc0bed5baf1a815f59d9d1cbd7aba1a4fb8d83de7310ad85640524318110a6a16f5bc141a81c34e103d9b7be","to_execution_address":"0x7fdbcd4270dd970b44236c31de8ee788b75533a0"},"signature":"0xa28a524424e49283f416545acfa1dc063866bfe9892c60370705cd8133fa949d724421b1ffff5a757d573391ab2cd9fb043022aa8354e4e93c91d126cb40f9ca7f7be8e8293be5a97b0eeb79df9c051f90e4d97c9157efd9b64125cddfc257f3"},{"message":{"validator_index":"1624165","from_bls_pubkey":"0x83190d18858cb148b28aa89911959562dca6653f220f8b4878a5d580958dbb3ca184d97880f7c2bf0fa970cd41b70dce","to_execution_address":"0x3e269342afd150bcd8c074e323e7b48bf5732954"},"signature":"0xb469d5c6626f1c42e7e914ecaf79388360d2ad196f2edc1f7b6088422b4f32f43f36b12898bcccc46c5ed15285ff0cd503f0ba5f6def9b4c1e523e941f1de95263bcdb014637c359464eb2cb974e06faa164827b21ee15dd68b2375b7e76a700"},{"message":{"validator_index":"2700421","from_bls_pubkey":"0xb7ff61729743df75a8b0b7e5b95617b9aa407e2e6a30cd8101c6a4c851b2cc366cb80e68a19a23e19625a596fdd1ec61","to_execution_address":"0x64688742ef680f46c246433acaf8dd25027a2778"},"signature":"0xb29e4c2b22ba8da0947be521fd1710125a95d9465632c3d2b5cffafe6e7070f4a6bd71385760b2b1670add9981225a18060be73e5f486535919fd3577b7ed850b3108dfa0fcc9215cd9d526295616e09619e07977ac7208edc5a2af93835a18a"},{"message":{"validator_index":"2471654","from_bls_pubkey":"0xab0a4039f2f00ce09018af228a696b7b87c7bfc111e7782bf7a3ffb423c681c04fe335152668abc7d20b6e9a9bc4933d","to_execution_address":"0xc090084330e9de5aaf85637f9a361a8678373dec"},"signature":"0x90f650befec00b055e261a38b4ea0bc65a0d71fd735b46f8387f565fb0d31494f90645c40dc07b0f3ee26d7807b82bd914d4d7c81b3ffeaf9a32730ab7cba7265dd09a0e0f94ccdf2ff3bc53d49fe99a488cf7238200ae12e6c59960e71d5877"},{"message":{"validator_index":"547910","from_bls_pubkey":"0x83e4d3825bf069cd0b19ca5072eda2f7d141de02c9e65f9c0733c18252c1552cda074eb613e1f435a880262de2a4672f","to_execution_address":"0xe6d2fc4270809de49a0b32d641484320853d3b10"},"signature":"0xb9b292bb598db604142750cb641cc511a9081656efb8271132d7e0de30554dfed4b16e418100d9085951c1502d6ab657179da8804cb08f1c69b1210ce94bdf6a0b66976233a34a0acfb4b947cdc192cdbb8576a3453e50143e7afecc8cbd264e"},{"message":{"validator_index":"163161","from_bls_pubkey":"0x86c03ea323e3551ef39c8c4e5355c4d3a2cceea3c8acb3d947b39e245d2ffcab53b4479c670d8b268828fd4fee89eae7","to_execution_address":"0x08400642aee83f31d60723f5fabaa1c58bbc1104"},"signature":"0xb58eaaba3ba51d7098d65fbec3829ace78576a2276fd9c97c293aabdb634a2c50f52611f48088da5d4a5b5fa2c5f4c0513d8dd91c8534b50a7b8ae0072583612610ada0c81a261641c66ac542428cedf20f1b954ad03505fc058b40ce0bf4182"},{"message":{"validator_index":"1083434","from_bls_pubkey":"0xb54bda7a570f90c2d38e836a3a256a6a2230a6384a29af7dacac3eff1a981d3f50918e2b546b3d78e72a545870b5ec9e","to_execution_address":"0x2f82fa41ee7ffebac08df14ba1ccca5f98c20f28"},"signature":"0xb851b39a32955a7f05acd7707c6859df4ee2b1472996d6a805a61e14415db550a92a7eaaff14a67e858a9d3633306efb12a62ed84f76387a84deefe726afcf2fb744f616f67d144411689343e6e0dea7a88b57449b2cdecb43cf0b5a80887550"},{"message":{"validator_index":"698685","from_bls_pubkey":"0xaa3588a5cb0b5d8eadd316046b661044c97559a4350464e338456c5b728880b4750b94af5fcaf478e3bbc86ac3e12d0b","to_execution_address":"0xeeccbf412e74b76b542bfafde5249862d6e005dc"},"signature":"0xb99cdab802f2f2683fabc52c8ea095386730c43694a9a5f7a42033e6dea53f4896092b207f56b1402c5c69937a3e2fb41958e001895bb43c2ee1e360da601e1ac56ffa8bd5371b1dcfe85518f297f94c02cd4981a5961201d2c2fb4d2a15c888"},{"message":{"validator_index":"1930923","from_bls_pubkey":"0xa55017fe14158ad9caf1d11f971b71b1941799466d063c6c77d7e41e20d5b74fd7fbf969243f3f507f8c04a5f76c3722","to_execution_address":"0xb1ec6f426f978c599752e0e7181c305a1b8623c0"},"signature":"0x917311e1a5f7a689ceee1af61f06519a3e4c6d68a4af6f4d24da0f57a2246c963c964d0e576607222856258c0e34b0b1014b68dfe481454ceaf521bc6f87c15e6a21f6db1c303b2042d5857ad4506f00dcfdfc5e65bbaf1b4ee9fe7ddf7b738e"},{"message":{"validator_index":"1546174","from_bls_pubkey":"0xaa865744dac51436c21adc2a1373eb6b8d407fda20bc67492d80a43812dd2aedee636192b1fa742570ffc2833ec58b29","to_execution_address":"0x70373542af8b450a2cf0e8995d74fd5c59a41974"},"signature":"0xb875609f4aa01bb03c08b4f13459fa7696b969fc5e8440c89f690478820b8b5b4ad75e7fbf03c4b0e919cdc80b07857604bd81f75128f2bbc61861d0b5a7744e21eb4ad008f05b46be2c2780900a7913abc2cd3591390f29e05e2d5b2dba570b"},{"message":{"validator_index":"2622430","from_bls_pubkey":"0x99c16f59ffb2e2138feb9b6f1804752cdbfe3796e20c52a3ae489f8348df4c1a9614cb6ce6860bed51544aaa1d22cc80","to_execution_address":"0x96792942ef2204941676b7f0048626f766aa1798"},"signature":"0xb9196e6383fe7a9eac1809c48fe10e45ddf57d6ee7946c22d48873b45064a39e66f861d7b36d82699f4b1858c3ef093f13fd758af1ff4deb2b7e1ffc7a7179306726cc556abddafee546ed2a6d7c4b17a1498494d994ff4188a2edf3c261a683"},{"message":{"validator_index":"2081698","from_bls_pubkey":"0x9786334738ef86988505249871273257e40b3e3c47995e751a40a52bc46f915fbaab7e2b1802ca3dcbf2db0567e8c9ae","to_execution_address":"0xb8e632412d8ba6e05272a80fbcf8849c6c29ee8b"},"signature":"0xafeb0dbcb7463673415ae2897857e5b13c4299ee60273bbc406c38f4e805cf7bc147ad40d7873740f3d261bd592574e618efe8f93cf439d13db8b86ff91918c57578b1080c6e51cf121d816eb3e5a2003ad57799d24f1ddbe495724d9e5a292d"}],"blob_kzg_commitments":["0xf14921410d6e44af323bde913793c2037f32eb41f938cabb3c5db5168485eeb88923ac822543db013af49d53be186cc8","0x046b1b41adb923f4277e45bd0b1cd7d08535ead3b001f37569def8de5fe6a543214372e11fa4bbef810ce1ff85e0cfae"]}},"kzg_proofs":["0x3ece09418d9cc1c206477b3f86b61438983ee789d35b6da4f361c337ee08cce3e8a1c4fd0fc75cb95755aa04da37fb61","0x51ef03412de8a007fc89e26a593f29059e41e61b8924965e21e30600c869836e7fc18a5c09283da79e6dedb0a2ff5e48"],"blobs":["0xcb072d41cdd6852547b50f3b90819969722ced1d8ca77847e05a2e86cfc37fa35ae41fc530811a26acc317fb2f89a4fbd13c6876261f3f7aedf916080789e969b18e152f3c9ce7511d6aed2a6c3c7eefc18473742e0343b6ea6965c1e9f240fa5aa4a90a7fd4ce8c81abd7536ffecf3f4d3c78c58d9599280f217e798a2aeda204de9a8cdfbc36868414133bd5f24401e6c476bfc18f14769977e3dab02cce1200d03dcd13c5d92a14b067862f180e96e1f1146e5c017af54a64e68c550cd8d8c43a57e925800dfce50bd9ec8132dfb2f4e0fc1a847e698ce74802072805e4616cebbff8f63a3c45ee4ca2f6c485ae7dbd620e95729e48b9b9ce35e20b5ea1b7342c7494bae28ac5ea53f0c36460c10d3bf324a8f3c9d0850dd3eae4961bd0f6ffc4f077783be568d8f10b0ec275cf3b534274edea591837b4633f4693822f4ed38bffa38b66ea187c2ce69ab30847004c4cbd5acc05319183cbc1ad806aca5a5b85554b23b97383db9238a7ffe5fb945302debc22a2b56dd4aef14410608be16495a4bbc5e2aff1c3a1ab5fe32ecb2ef8827d980b2fe135043818c8aa97423960bf0268c7630cf04138b55d8ff3fd6aafe2d6c1b736098af35349e4e8af8733e6f6c833d5536794281c2141a99d747b5184e45aed7b950187fe9f581a4421f62f804b1f6f7843a5918e75ebc92ae5b398016ecd86f8ce77299f0741c14edc019be00d8268abf8c155f0a596fb36b659a6a3bac4ef2b20cb467524a9145cfd962a5f541069911af19576c5fc40d7407f7f6bea20abb9a04dcf142d067e8cb5c2041535046ca08fa733efab0a0d4483428aaa375ccf570667b9f2c67e1d6745a4f28d8ae4417612705695be23ca538efe142ba3e0850d55117e0138f8457cb7e3e2f8698e0c7f17d8eaf54ed153c537decce8cc5a89c1e8ea9b5d7fb8fbd75ce766e8fe57c5eb502c1de441d47b5adbc54859fb2caf18b291100a270d7b44751036a3ee5db6f84adce47df0f385c234b97f4493c35ba4c0dce3bce0ceb35cad2aa904a54e0184da1174407591a9549cb94e2d82b2076174529dbb3fcac56e5c4540ed2c5118f45726c92cd7fa959a3098f3495d31c184f0eacbc7210e892eac601c4376f7436ee02422fcc4b5e9aab65e950c37c2aa9da9c77e1b99e0083814b483822b861d5d17768264d27dba533bc1ba3b6d8d7800290acc7569a30262d3d65fde783e17472227316d697e1015bf81ce9af142f4865f5d4c376a4169e050bebef066c0f4f4d8fa3ad3e16467eb76cea322cf1f7d9e21169e8e5fd6e4368f5953fbaa0e4be86399eb7d704332ea6b6aecc9ed0c84a6a608e1b41c234dfb1a8cf3b70e370922c3bf5703e1e153a683dfc0dd56aa0e9f25523b3a010833681f6e1ab9d124ec38f745d73c4b05a5703b101dea7b803527e95e556223b059bf8a02645aa6ac09c0c62f85eb366c7360a03e6332427fa7cb7466dc90b94f357c6c0714412c7446fd59c1bf6cdfb8fd2d4e05d5b9d46825a5957001c694587256f71f906c0af1e1ef26beaa7e8947fadc7ece1cdc7ec4054778b7fa2abecf6e14d15ae2d60a5ee7a6e78dad141dfb1137750cc375117cb1fd1de47fae89ffbd2d9a0239a5d92ebde79400f23b755e5e16ccd5bc9c9454265dcb334db1af19a43dd7b966e8493d9b249fcfe80f1815f47f748fd9e84709761f4a0ea7c23f7d9f45a61e60ed41a50dc3dfc7c3be487a558e6cfd544c33ee465318f6d06c7e3cdbbfe995c01db10670b2fcbcfa9da579fc2b796a477ccaa551dade049211002fbc81d368457031af7b523804c94ec420d39d6c9635e964a3e337c957bad69254596ef912526936ffb3a9e739adf27d25bdddc3c180478cea5eaf98e899a2c98dfbf85d7a6babeb38f5eb0882ea6fdda00dc5a47cf0a763b9b9b28c5185283ab7a27716cebc1725c9f050b44908c6e18a0d0787d63220a992fca07ae35605c004804579f3927e0205a83a61cc5272861779fb112b5603146ac5d4ae46e9eb56127bb5fdbcdfdf2849f5ab394556e4c3f10139f90f51aa118cc6027198a1e15d80afd437a1ba3bb361020ff6c167027a75caffe1d679cc223844e84598e18a5519eafc994bddf23c24ce4bfb011ebe7675ee739bad0c685bcb9a49480193876b6f2f37e62b25b7a72fae2eb5a9d5b80acff7a733a6a93ac7c6b440339da4df6498346e791c160c7fd7c91e67572bf8dd086877b3d7d4c9b4f394dbf7f7857fb92ee370da5255571b5b9b24edd383aaf67e34318b5777fb2866d10af8dbacc4f206dcc436112c81e6aa724027af84fb232a4512fa025c3efd2313e040e8111a9f18f248b7fa09256428f41009159af83ee5f68ffaeeb4426ac5981c5ea3b1a46cf2aaa7d67fff51dfff97c9878d7485f32e9a727ddc9342017ab20fa1660f003db1bf99239343dbdff42879e0a6846003cbf3bffd3d71da557b47c5f45eae0a44daa1f818bab038c9bc45a0f03e82373552bb75b732aa71da1c508499a998c283a8f1a0f59844f7444de3179b3de9cb61b41f140b5bff32b1565a9d6144da3137560625be4ba1b95ad6c8477317792751ec3ef8d790139573df08894922056bfeaa6b4fd2398dc8577a11ad285db3e059a9ae86d75def7232a78e568536af95dd9f5e75c0947233e837aeb06cf1606ff47ef82543817fb430cc386a5db1f00a613a5399405ede8003e5e1cd4c3c0b91b43e17094ff513871af0e18b74fbe68178d8705d81a404ef8e8bc3083bd882bd5a7dfdc943acdf25bb2a7c455135314cdb060ec6309f3a44d7f2bfb43ec259abefe70fd440ac7b3273b58f91442277a207a43eccea7a792f44a3158b070c66e41bfaa49ef147639df1d0b3d9076fe1002f8241c0f7ebe038e73b5811dd6b466a2ddb89b7bff1781ef1541645ac359c93a1f20f7c84143142c883f14fa4cbd76a7da3809d4b8e7d3dfccff856b5795ab38aa5d265bee55397113b9ad87525bc042810bc6a363a9bea791b31dd7818ce71101168427de6ce8e7d52e31c7e91dd1b48b7664f862edda684ceaa2e1e5333362823e4d7643552baa7d9b0142266e43d29231cdc2fceb53c4e08dfb9d6a8c669b2590c60a8af30a723a7b834a2b0c09621d76c1c8eee750812a164e329314734af7cddcad960df2e7b7708b5b51926f505255e81d31bd7d0d7ee5d346e077d489e1e03d16ec3795776027f27d87e0bdf69e6e79bbdf1762f89f104d9c9a1afc05bb762d6e5e43bc44e504f5e43262bb61da177a715a052891be8266f541f2b0b0ca6909cb43308b6b06a82a2cf7885ec9c5a6ce4c7595097d006a62434b2c2e6e8a658c56a98e79bab5f733a349add485e629cc29bbcb87ecf44f925d04b4a6f01523825b27e8133f46e5140620d393b38a7d0dbd636b57998fda95c729a1b3a3f08e3e5169ea4391a249fc8f3cf65414bc043be540fd90f1571d37df2389382424cc178c1a5c2aa9312b758e9fc6f5b24ae2787ddfb96de4603a86844aa9266e7e46a598c697293bfe242ad2f142b90097d204dc520c5f1d67aefd4035cfe32864f2fa01fd2ee704261c1d0a779af81a25dc75a1eec23ac07648251577441c040f89164fc9c94215e4c0882ab9bd8116f7d2839087ecf3fcb2bcc92c4a0c6deee66c7efa1ec666527adbdea4776c416bee4448ae536ceb6007d5211d0747fd37b0f3dbf36c48aeebaa4dda5a8d5561f16e490b38293878b19e827f8812862e4c6bc10575fcdca01d4b738166dcfb6474227745877b648d1a9e375632ab0e7f4589d92e42c3214a766cdf00ce267ce1d7558cea44cddbfeca4c2fbeefe378c3281d1ccb04de8fb691f47febf593dce95335a6c67328781dc48538a946b0751d1aafaf762e98534aaead4ad101c61a80efa8295fc4c428611fa7787da30b13cd8fdb30213d39b1a7ce5e61d22a93a9466cdf18108e6ebabd791316d52a93ed7fd9c0c102cfb9b2b195aebc13f486f8e1f2a07dc010aaf2f4ee1404867d0b5ad941214f71e4b8689e0a9d8e2131d4dd393034a478c5c3436f06abb3a7ce4f2d087be49c1e454f17ae746dd192e3d26683ac584d7a22d4549ad94adf95abe4f566757482e518087e9191f72d9d97f5d93fb87b29492199bd491d42a4ff237fcd784d0563135a0bce2ea1a76e34402a46095ed68fbc4bdb4a7ff99fa99643c3cf11f37a06f5119531995916bcff5990b1d1054c77d5a4c4f7676f56649665bf9c4a258b4c318054364ebd46a8a92af1fde425398fe94089459ec409065ecf93677ee439bbd42fab83db936dfd2f63b2bfa67b63e5712f61f4cb64a0f052b7a01b1b7f7351e2e652d41b329aebc9ae12f8cc1633bd4d644cbb000c59dd8e3f46120f3cfde5d139a08b3f75ffa2f495cd7f24de495b627447dc8d7fbf2a0045eb9f651843c25070be3f91e094f6626c1d5528c7d35b135e6683dc01301b1952ea767cec902d5cc4b341edc91a1720649c810510f4570971ec59bdf524576f8ed482c48e9ebfe78cd2e4f2d8742b6139f9959aa27100d94a573d2b436ecec7534310331dd8ee9e37b995e1c7f8869c5edd99cd4fe63993dea0fb5605820251d01ee2c49c8d50feca6b3420f29ba182624460c3f4d639a5b3d8f7e7e61f9c7f17c57ed6bd7c09e88e19295a8e77e216a2def1fa02de887257ff2488c93268b6a8529106ce0d1fbabc0f5153896e738d6140f121a7d034ecdd98894e3a39ebe3f989b600050f53af6a33923bb5bf3e6f54f9f626f6be5cfd952eac541ee54c389fac32fc038fda837f2fc476dad4e0522a93054472d7f5f513d20a4e03f328e2f3594d32f95cb42c373faaae8e2ec4557845a6e82027a46b4d668dc1ebd552aa5402624dd0e193b91b4d59ad6fd06ab5c7854fc9e02b441c798a27fb8a3f035faf9e2008cdc5d7a3198e30a3087fc0d3a76f28c2d614f002e0ab37f8febe55f38bbc3c87289c2198e89750f0ea48d97fef84872551c85a9d5172c360408b5ef113192e086b726e77df0d0640ac4e748d7f7b3456947d8532f410adfdd4b1d3de0c79232d92e3ce726d7c7e72f8b08757594d8608b63fb8c3a21a51ac3b15539f24977ac02cc6ccf30e9da197bd90c46c5bf7e626278b5d45f1ed36c420babe32a89d0bda01fc28ac736e8a2ea111c34f44ecdaeddde58201b4bd0bc6ad8d4d0ef2d77dce1d04db76d65adcb1f03c292c73a88ec09f0e95876c1afd8f34957ac67058d012215a2279f38cf038f13b40143036e86f509e8d95303feeef62fd7b20869c92a97cec162439cab5b409330f99e71b62ca59cc7f38829c21337d75a367799bcd80d249023f09af609205561478f3202501831906bc8eb3abff916111cb426978fb5a32fd8fbe905e9def16c89d902c0ab5d9cbdfb5ccb8b4f6f115e5e9bbfcb5afd42f12360f5b9f762562cb43b6829b6b7d077ceb3ea0d82ab689b89b202934480cd6b5b6c9526d6c77fcc8fa2307e32d1fe7004b75b1ffd2dea2f40472af2df0195140c48d8784cef86fe35b03113a101f93d34f8ee1ac7faf260b8ddad66c17a743a7345891ac4a15dba9792021ecaa10ac9e5aacd99cd420e863bef32c203357894020460bfca3edf02f829aae43970b593136f683f5f9c9015a5f86613c1f8bcade26201db93fd168c6f7f7b1dbc0507d8b1eb8417b1cb3157ead89cb19c4858586c433cfa72bddd9e688b9ad8e759783e213974fd5b1be7678e7f47a23bae5bf9af1b2c9d64663117234ce341915789c9bd1bbc9ada4480a02bebab98c51645f0ee582b7b85d9e7e4342c2de755818acc520ebd4a0de9c85eef7764c1683f6e941f92bf8c99719f0801b924f412a6463fa01c1f98b89830a71b7e8f64d6314d436c8ae9d284130fa147a935026ba57e84db8d0f18046d3b138540c32ac3d097c2b6038396d2ce173f96333fb0484469c52d5f991efd2f3d07172b217a68749cc90d6194c5300e3a61d0b40c335311a958328ea226131521384d6122f2039761dd3919cc27f15750a9aea6cc747c596a477a3358cf9a014020bb9cf78555915ecb35f9815e8a9eb1193be6ff26762c9be70a6d13004a658720855b96162267dff6ae36f00715211d69574a9b5f37716faedb18011bbfa272b1e65ecdb6b4a3655d88528ce8d2db1147358a55f77c0aa3d25a5f1626fa079935a979faf4594698ae59cba9b0a288733cdd735be4430b2c12e60d1c79de56d2b5b3ae3b9fe1be9414ec9fd0cf8b2f9faeab72e4394ffb4ef356c1daceb4dd330d779f357821fab251c0a171ca3747516dce65614aa72b472570e0b18ea71f68d1804ac93b727e0ea98797e2b17465ff1dcac63fa7171bf538736623c3490d2392eb1953243298669fa72fccb1b57f87c9f61f7b5eadea44c68e7d1e790ccdb4e0ea414dda41962702bcc273218fbb56cbffd276e33de23e3766e91233ca13fdee426f6f598616afca14e68a2a3dcf6963632fda85de04f4dd944117b23e0d417bcdc5a5df68621d6431ce6ee21df2c836f7d868366bb5b8ae25fcab9689d4a52cf92e796b56db45924b8101a6315d611c627e119f036b5ff41848e541ae7c517a48f8c2a83f7790b8ccd986a39f5b5eae9fdfac408a756598e4b705ef15a974b5cec1c56b1a4dde87d2582fc131eb633a7f24275e26d24325efbbd3340cb6bed4b6bc05046031c32ab0c83a7ad6ec4cd525830dfac20f567d18ed33fd4171fe2dbd397ac18d62a6df6dafdcdf1fe54e898836ba108e43095d2e27d2884962f160b587f2ffa3459c9043914ca6c34ca5cff4c498867d0d45237673e3431da383540422c8eda6320b612103ac091b7126c989963cf7c5ac400729c34a089848024e222f380c20516d592a8dac61a6e463f3bbdb43af632436d7f379aae8fa5a02d81f4ffe189f84c151345d1f6e877f386ad0c340a0946fa59776c82cc7685efe641aba0aaa33697dfb4ac9d8c102f0e51f6503230b5dc619dfc5d60cca696bec57cbae6d45f15f12742ba2913403db23d8eaaadbf205f2a296e9be2a376ad74e63fa30d22872ab5719c855b0ef968cc21c214d352696b174db5f57345f3b6d81fd05182245549c6b71c9e1237d7038c3d4a3751ad55f2e5e1a98cd2c08913545ff5f6d2d2cb8cdddd70996ba3a65ca07a15b6fc43274800b2278105d3682cfcc5f0b1b6fcfc271344a16a79eb7ef46fca3085b8c9b2c4343d5d80af7490b59cb6725ea48f81dae1e1eb290e2ccaebbdbe3c0955812a239925a05aef5268de747a359d150537408e6a3554847b5e2bf7209686fe0ae360317233ecc03844c9037506a9389c1fae2f0b7a83fa603f38481d73c3140c309e05fe639c3738cef002006adada063e308680e0b37a91aea761f594e74971484858cbd9ef691b803a844d98b968b7ce94a519410e0b9b3f56cc26ffec7ab7fd10226dc8b1adc1e786d204a024c1edac82bb199fd4f5316e769cb1b87a8c9c760b55e010e4ee78722fb2de8253275ebc19c85984f421fdcb5ecba9472c55d1b644daca0ae05ff3d399540ad98414c0e1bcaab54322b8981fad06e082198000f54e2edece3c5c6e8d982efbc14869de59df702c1091ab18d74bf0ba3464aee6c6a17906599ad68c48306d661e9ec20bd166d5e8eec6be8cf852e745368ec243c27506141b2d01a2b9be6a9d877638716d6721889254e220cb2f26e9a65fca2cfcdf40717816205b7e8856ab7b4458b7e325e58f2b2100273285fdf94eb3b8083e4c64c6f4fb0d339168c2a85a91c30b103ae5dd2c748716d32f6b05bfdd6da0ab645ab81d9eb7966371e3665f5accbe5273762d949c3e796c4a958c674dad2d6d222da37d0c5f9503ea7978e4855b2d4ff60e5c45347cf3cf3ab0d977bfa0d2c8cc63db958d82fd783303da7e9bca0a9f0717267b528ad5c7bcf1b1a13a97df17ce4762b89e1f39c424a400031d23c9fe2eb336170aafbe53878f14b8d7c6120fb1f7f09f1cd15851b84121f0e194871c4f8e54f3b31ddf7ad1bcbab12e6bf02a9c0056f11930178937590f581495d2c06e7f9bc014613ee80511efb1e38cf1aea76fef9dbd913d892563da9203e53231db6fc586168e353fb73264c01fd08a3633094703b79e93ae42729d095329ffb02b392232db1d33e8dd034ec5d9de11382fcf12d8bc033deb86b43981c5250d3b3249af7eb4469264768a6e8ab565e01f40094741c92dbd5246e1c6409967e7cb1084793579652096040a127b68103f02d7e1229b44d7d209e1d570640f446ab81df499cdf78a793b242fb4f1d29d575e3e398240b8b87a684734debbbddaebc2b895350250329053aaeec05d5ef631993f57a424da486a7966ca92e080d096ebe31888a8141abc99b177054a64720e6fbfe99889b1067407691f4d0c8a4b575ca4db3867db812119cf97175a9f76d9a9e188c4e898eb8842f0f60ff329e576fe4a64e5357b78f37a5d5318dd0f231a9447cb713a11e3c1cab5f47a68d87d9f62678ae33827a017a46e476575e7ed40577e9d3c8dfcd46753c822f55b992db1eac9ae44b251eab45b1557a376ba8f1d6061a84ad3450c36314c444d1a7f364a817c22cd09a60a46d3b22a995610e32b98546f986046bdc73cc189991dc8ef2820ec9f399f034b0b3df6a9ff882f30531ccbad2e0a72f9a4ee102a5c6f3f73c25b90dcc746a25635dbb69ffd05fa73c47747aab3deb05fc4d320ccd7c18c04f4044dee0adfe85c30190f20582623cb2115df50799908659c584ceeddf8d14cc2762f5ba70d776cd564683feca458e8d162bcc9560cb251492fe8b30a428ad700bc7066844d4b6848966e4f8579998c80dc4a4ef16c4ade33fad57aa1ed30a41c7ad5b578c06467e969e5962ea411dfd81d30e57261889476b01ce87a60c06e6a0507f7d4836d80b2c4162643cf49aaf364978160657dde6134e5dc76d62ad21c272fb90705c1773dac4092b7cbe939207d6317db98775e93f4c1ec41efe7370a1d824722e29b6dab942c874fe7f237c297483a7db9f7c93a8983c133217b031d3caf70fec7e52d738f9f20d926ae60753ddd084df0d08ae2731ef751e7d69f1ee97045ca1f327c279cbbc19b0882f1f5810cecde731728644fb00e23a0f78ad4d0f6c1f0f51924380bec64a9f338fe130d0c3dc9edf848e8e3fe9e26845f22f6707ecc29b1860bb737c406d829ba9a73924e499c2e173e76a2974d563a7ebd87dd9fb5b57faf47066d498e434445d1ab7d9aeedac73a7619949fbbfdf53837119e1f890445e3cb56437befec98639984efb656bfdc556bbfc132ec9787b42e28a01632664de6b600a3cef3e7e0c456330609225ad7df227215f6a8fd2e5cae6531e294729c99555801c1b02ec561451261d98de41325f6a93e9a4e22c69d518d7a005daeca20bf68e36d21e5f3730f7960e5b078af2ff0b5ad2e1a2217780ec25f6ea75ae9f90ae658dc6623557cc8dd253f33d47bd907ac91d3dc5358eee771b1080c7f12b5c08d345dc0f54b1cd02accd713e7107d1167b3383c165c6342034e3ac79cf64ece7eb29cabadc1621f775a5b477473afe7d666059eadb479985bbe936f3609da8e38b284a2d76a961a0f8c64bb63b321e98fb53f6718dd02149fb9e6d7b86dd53dcabd3d92db062cfc8da5e6d97dcbf1935a3a26a1d913172850e04e797a75f4f4147e10a4f438b95674561fab54a26a7423b4479e8a0d1fa14df204cb57510adaa6bac63283046618b3e0693c36fa004e5fa15001c5e2877ff9a7a356de91512b319b2cf9a0b0448915548bbff22da82fca955f0989d46bca8a1a117fbaa42693bd114a002180ffee1bf660fbfa274dfe13e29d759384bd79a81a53fb2d6a36582fe1a1c7925015daff26388f44e826f63c419f66c9aec7b05219bdf8696f7d4b900aca187954b3a6c1b86d0ee5c0e1a4de190ebe890f5c24c941d2bfc5930c2032edb55ee48af8df895dba7bb509322057a60eb9da5c1384177c783098ef467010c566560b0c7e7bba4b158e36484c307ac3b8785adc43bdbd6bbb5c8961ff35deff5d457b37c38283c1b3c6eadc3984bd23b07330d02ab93da1e44ff743f15ff5732e262a28fe55ea86f4e66af2adad8585a52c69c95e4b36599c5d4f11667c5aaabf38cf41331f230c9d3465a06661de5fb6623032a1437dad85048631c9b065da219c521f0effca3890c0ccd969bc7bf5f6370d684d116000ef9361cfb7f2b417d1e648662900adfd1f9d4149105327c311e1ccef80e1dd5705a056311d31b67462734de797089010832491f9dd4a990fb4eefd8f05795b2b5363e5af1e261ee2be49b8f9784c1f159c5346fd9291af2ae46eaf7695f77c79d21b89ee201303bff50cfb1f54d894235320cbe5431e6cc1e38f15474dee45e673d147f5ec8b13ab80528731d213355cd694a99930cfc238410892ab8c214cc5807a898952753c6ef16074771bc6cc899e4da360f8d6a76fadf26b8eeac051e3b342456e84be7c06386e20ca32e0be2d3c60130b4be038b02d2d3ac64bf91eedc9c8a446e4fd93b764360343b0dfda6fc14748e6442d62800b627287bbcbdb98c3a457372bcd0cdaebba0bc15fbdcc157f8919b727887d2bb17dcaf29755d2ba033701cf2df734735fb1acfe07ede2d6913f52d287bd891e0e7793e788767baf2f7a8a222ec311e5a5daca0a0290fd97fe6c4c541e9df7f7fb4e3dd056d92ba5e6df489e7ea3e380ecdbd352c0d2616284483a46f80c2fd8c71be1682d914c6462c8e715d802b406895a0a0b0825bc3b7d54231d687f4805fd1fadb3469a3020fccb23c527dc24922c284532d410381c2af79668f0a4e6d352d0180759f054ea23fb788c841165d1910ab29f4c3e22fa6f6e1ba26e27bb6adfd41af3335dccfec41ff4677efe76fd06db4dd2f017e3400931af31d9197e94be32c626fb772c75ed2a4d1486cd270ee0b31bd5870d4a935f6f98d67edefcef83ed036c075b6ad6dc1e219db34e34abbfdd08bc06048c3ebeec409ed9a4c0b805aa3a8cec0acec134d949f02ff8a33a769d8b20aa0aa1a8e8dbb140d56360712213d2bd778027f4ccd5bb9442c1028c449b90bad70a48ccc18aed7150e0eeac467f9422cec8ec39b7042555b0ced3a47bcf4ce75d0f99219128cedcdcffca50dc6ce54b505e4b18208e3c1b6efc3340be4a572020f5ec12c4a1f47ea7f06e949fed60c69cb45660de67140f809d3170d59588e47b4d4268005652e9c65c94639f64be9d72ca3ac48c6331877241248f1280c2c0cb7d8dad43037d90185b415803ffbada1216acbc4ce35a4be2064757b6789486d03c4eaaca5377fafc9be4927307242fb175150169a585c0b4b86e8174f65a75a513131cd7e2fb32e01e90d198b64c330b36f0a5854002bd17ca77e53f15a89154b525ec47c54d47ba514fda8b80f5e1dda40aea7e7fb78370fd1725f77d945b603749d607a26c88777f9a1068f9ce2b51568d9a3387539989d8b0f94f2e942aabd2bd134f1d6d1b6e94355cdaac1d87b3f544df272fce702986986eabcce483001e654168e6c48615a26a8785728480b801941bd6500dbb7a561768069feb8db02d28fa3d51421541ee748e7075654919d1c9c30f04585aed7221d18455cc2135a636ab8d855bf505b35b6df5e1c42509a69c4ff7d304112abccca9866d0469307e4e4faf811418ab24e2588c7d17a1ca3cf6cdc93ed08c2dbb4f28a4fa1c8eccbd0a250bd8f882abb3fb6ed9dd4a7e04d1c78026cd50ed006251f9c1c316001cef93b63b6f79ace4cc9707fe71a0f1a281098ada29281021d3a212146006d8991a1892573fa85049ab48b939bd0ef5a95e6c79ff2e2e754a54f118ff0176f913d14f3478590e3d31aa02fdf7b46bcc6fd8a239d01036874cfa017ffcc3d38f73271f2c195063f33478f3d017db3b4994cd5e5f03c17ff45560980b089936ef0f2a0a74e89c7129021c7a0f8be8a94a0be6789e5c523255d32104f85d2832c8355b154edb496d24b91c15aa91568babb0008214d6e659a861ca66982e11e640b10120c61222c7a398d41c75b21d570629e8dfdfec41d2340e04164529f488eb88b6baeb2e464642216d28d3bf768c41dc0bfa0503224c73e7e4439c4535a180f0c0a93aa7c79c343013a55d95904a20b3abccda024cec2e51ecf7949e619f5662517db594deceecd92ae94a9812cce5ceac140d04c00b7d0d4740778ae28b069831b7d922022e063e8cecd8475c6a4d7677839c5ea7ace4e2f72088bd44b6598ff828b6cbbd6a2a033b21124f3b47655000f8ce829b37ee29c5493df413007c6071d16c182df328fc492f2abe71ac94407cd5ea68dcb42c29d3b8278218c739b54d34bb22fee3c31e4dfea1d7844b02574ed12f06d7d2f5ac61df97af0bfec13f0102f2194457cfb7ec0d1e19978fe0dd1df18bc830587c691bb6db11e59b3fe8b9344356f92fb559f502c443b350528794899828565845b042a6b0a3f18a47e28a121da515a531cb8230af5fb973532275aedbfd38c6d1e1e1fde18c85cf18b0adca33e93b21c20bfd5a28a75f502fcd362da75353a9c4b1d6a729064184972022fea55553133a717b519fa13e108ede4a565a9a4a895d090416dcdd3abfa52028cdb57994a0de84ccfa3227e279c7eaadddee42a5979cf3a517b4d5a4ffa9e0477253d648b66919ceacb408e7d9cbd2efe70b3cd8b0720c3b11c31c2e8f19e42972147f364b3425136b77bdae592cb531322278b3940cc3934b4c1eb70e9edbac8fe78007a5a10edbb1c59cd0ee75e4254ac5666a1239369abc2e6ed4a73fc0768df1817a07b0324db18464e2b3c4028c603d883ba6d67fa1c82afc62eb38e86d25b31f8062198a65a2514fa07d4ce4608ad4a561d3eef6304e8cd9b89083acc54fd130f38133fbcd74576eb5e2d79512343ceda357e05b01111168b759fed6d01d3d1f5df2cddad9ee78313acf0481c76ab89e5d07f380d0e3c050babad65162a37c20994f74c00360b392204a5559a1980247e56be4b31d0c438db0dabb7ec74390010068fd77e260df8feaf944b2c562a4c4c43e5b48b6a03f184b767c94ac8e6ece95744bf15caca03d18ebfef3e04003314b33e1e48fd8e966ba17bd8c386d5a859813fb87c2bef039880b79439f2770c430e75e720d626326d502ef47ad5f19bd6f9686cb140eb83545bc9a5bca932928b2c23a301c86ff112249f7fc9e682f171183af7410a7c75c02ce31f302e2682927e069779e4c6a7512ba9b23583c719cbdbae696761a8ab97ca3e13a28eb41cab10c73efe00a64adaa0b718b94a5545140c7847f07ecf5f70f3f529f564d6a6a37831c8fdb17974fa70821157689bed26e9b80bfb84b8ab23824b185f9ccbe9a1006f96c1a553e20c6b745103b2864ca8d60f9f80959212c675a32f3719f6b20fa140bf208997f779004f5ed86e4ae23db865e6ae3f7cf62fd0d9d0141c9b52979b818f02e09b3a48b379159e3dbef0d1ef0334134e781f168de6ef3d7a491f30c93e03b17b3bd33c964d25a0d596ffe72fbdd0943fad3ab233839765058cf13aed7f4dfb787f128c809792d49bfc59019489793ff56b57fbc4d465babc60a6ae9f785628f0dce919d77d345246a88e11b1d2dedd5ec16b6e08f30b45a1a69e54a03637b9c0fc6d4a0df1351708bbf10290d025643046cc667984ce9647553f15a50bbffb22a758623fd0971ffffc194bc4c4652aea76b806578c09c880da7254f5e0f16ce9378a7788f5accbde09618f10952bf7bd1dceaf98f6a8c6b46b245e645b82eb9bf384f1f56f9c96103967594b43f9d91a3f920bc963aef4c771c6e27c365fbad6b0eb993a4be21cc5bb90db7504c2d5e988eea30935af16a677ce83ef852553978c0b3d8367cf72af8083c53645705bc57bac0bc1de5692cc2c3470969ca70861cb51da0e0e06cb64eaaa282bbe5f94b564fd96b516e1fc6d1ef610a0306c79639cd0646c21fe6c9a4ab46cbfd6df7c3bc5f5a39688a0f908c394c5b2f42fd20c2fbd13800284fbbb61165482f9b5ceb4f60c73365a79688c5594b01b465de0b16ef342b285360b94d7851024299abb62ad9e8ff6ee67e462c6ff935ac09af435c370e3e99d080901bf7d679319bb779d7e6cc82808f691ffb9e2bd9c7e3c95dc68d67b34b5c370f0bbbde6ea4c3794feb419b86696c93dc625ce04f993ce00af4cebb83d0581531a50c9282038a5298c8caedd214e15cb689d59d47ecb8f801fde198ef8a3332e37286729a73f8bd22e681745ee5723f213cc9b496a11f18ad4f1efe51b631b10aa0022aa7b70e875fcb0a4bf4943d24e05e6b25f0fff1ab6c5a49ee254135211d9ddcba64236abe121d789ace1b812bf64183e2c4ee3667a142a7cae50364319aee1f2d975f33935755b5e5199476a117b1ee52ba249e3c44a9185dcffac2ef5f9fc7151cb4ceb1bfbdf9fc2d20d7203a02cd09e1e72d359e9ddd558b579a6beb318e2124b2d8dd7e8fc2d5cbcee5a9079522df5e9642e07703c2fe9024014924e1824d0c404e11aedfecbc9a479628f664fab4b0a4c1da749bc793d75c631959f43daab97861ab4c9c2a29f97a760a22e9501f8948680f245b93e909160904d0e3ceb0dfe3a61078899bd82c4193d7451de6725937869238b0a2ad7b6d11247099e03884f895459d27f8ee1729178478f4e1a812d739f6729209283c4eb6f0af9d411caea7d82e93bfa673c84f0a1d4848dddf6f0301c23ba73ead2a8e6b4632b75c7a6b972f0dc819702fec62fdf7874ac737d3e4a8f02b5134caf3830bff870a41e2881ed97f80e71fae39b5e6bb496f126f337b6dbdd649cf81ff33dc52f67b7cfb36f7be32b4c014ff7afed13f98bd4430abce4966aa6a4ce4992bccd65a82eda3f9b0d35eb874ee614cd3cb8c8c9909c45433e8bbeda7fd5ff8b5333755cac0397615e625a7eb8070603a2d0231db40405b0de39a2b739b8e3e314268ce34f50addc333347ccaddd28abe6e4479cf8d6a1633051b3dfdb4416f19b295395228c04dde7e3f3d62dfaa8088513bea18a6f9b2aa53b576c60ec77f9cf9663cee5c8201c7aa4b1f242d04787c78eb9aa94afd3d12a927dd32f4579c439160ec69fd40c99951a4bd28f38b5da481ac6328c7ddb7621a432d3ab8a7b87dd2a71e6b9caee505ede3e89a2ef77803a91c6e643404fe589f3014d1419c1cd94a6dfa06084acc590fcc9aafe146666456143c938664393dab6283b06f3ed3df63097f81921a0047975c24fb7acadb7ce0b0922e9e0c00e6a589829f040185ff3c5c63d35845c1f8bbe410d011e6d12e9a5165345a451eea5f8c8dc1ac968bf7635e5b2cbd58148f33f1f265bb8dba74059dcec732a9d965de85b10507c4b1e77a2571687fea10648d63a81ce280209dfe4c99b33f01467402f8e77bcec2f7c2605684a482e352fa551972e480303a2b9182dc91ef6b01f4f077b6965cfd9311ea98b95155a9e9bdaf744854441f3259c5a6009f643bc91685f2ee36d7e4171abaef9346db73fca05001c24d7bf426d262449b1df5eb1ed495987c9717804d2a987913b36429fdde118475f9bbcb4884384262d3cd5264053cdea9471df65cbab7c11f70e389bab55e09de43f5ce80ab69baff247bacbef20c5c5d023f9de3d8b299d55a59eaece4b6dcfa02f2871ca132082284520744e93ffdf1805b03f6edefd93051bba45ebacc75c2f518c7f9ed1dbe05c50a3358f2d6e7e7e2a135f1438bcb7493497229b686c635ff55819d8cd2ac2e554dd93b3cdb9557fadd35b5f8bfea2bb3586d1b0d5ca3797d440e2791e7f2ec4cef2bc419fbb4cf883c76c1187ae8f76e2982dc556c8cf206a5c7470c6dfee242905d6d5d2010fbeb96841153d8b6d640124f5401c3efda813a8484d5b648bd891c057e0144f6fc54c55f22ef6aa48a72d476e541178787b1a852f4693bd995c0bd17a23f61c9a0560d181aaa3f2ff587b5f1b8f7db7ba453336597b29a95b506067b4c17811187e1440ec29fb9e4b1ba7907f09a9b0a86a1064eec5847fad6e5cb942efbc8da00a1baec8f4eabf13321c3ff352dd0b0d315a9b389113aa4467587fc9985824bceefc47796bbfb816221a99889571e5e256bfcb5a805d253e31b777fe903d1b37432ce0eb7f04c0df0da80d00a22c4e70d3d7c799e26103fdb06ce1651732ee63af286dea55e8630d4bd1ceccd52bcc30d242c93438f8e958cb06041fcac7cb2d186889fb6ca602e8e9db52290daad78f30c0eccd498e921c40fba7c0546d14fb2e3ef1d2f54c4e4829c7d53b13765a730805b16294cd4ad4e52d98456eafe15f0ab109523500d1cd1065d74a42a4389611b27bd40b6874ec20bc2909f8fd7ca03204551817ba6565abcf9a01460bc5b2e3211301768a0520b01badd34f52e303ccc601a45166ba1f9ccfa5c43168497d63bc246be0380637288400f726e449f6c85c5a02be25d557070743165d9a816ee41bc072f2271515b96bfd7a70b295fb4d4e5310c5758b290a59050bb8431e5ec997d91d1e7ce4171699055a3806e171b123014b04f30a383a133cce893e43edadb7c970f135b9c59bed7ecd753dfc23c1371f308c7051c4e7d38036cbc50bc162a9cb560af9edcb0c9452aa2a1ce9ab37b58b2e5a27b3131c052c6a8fe1008d46137f1a6f496d4d80b16ccd619a5ea58be7c726f0d359268e09df932ca5a5edc5836a6e4d513c815b0f3f98dea546b08222797b2bb2bcbd07e6fca61611ee120c4e730562bfefa070763e7d8f963f4332c7ebb1bd692eb3f4462b349ef6c33a2edb68bb8a542f279d9c659c15251d4e58588ba2e827529e163fd64d051081fb5b56774d45453b5e8197af6ff38a65ac35236c396055a0cb9601ad7c9c9b785ede21b5a21caa633e2bc09d873414d36754bdc4c67391e382f02622c4d92c6ecaefb19ba446d88e9cced4b657a0d2d4cae37a6cdfe0ddba9d6dc1eeb69b121abeb64183a7f4a1b5a8e4ee0113ca520d43940c63cdf1301a6e2fa38a9b0aa6aa5aed552f63182c66bc4c958c988f2bd2131da74c90c9f5caf4fdbcb7a0c9113ebeff27437b9f3d427948cbe96fd900afd8d571eb6dff5ce567576af6216aa56a2eabe3c69767aa7e376d7eacd5ad1ae3d70d7dab12ecc15c097ad411fc5295b8126818a50d6dc266c4e41eeed7e801e0240b2c1b424ad3724d625390f18d1b24bf28df3017f67bd670977ecd822baccd92dbd16c170da03e51f7d8451f2d4a9e0e37fc9b9cbc65bf6f194de91cd4a00477613bf5d58d232ca1dfffc1803a848bcd3ab47e8c584ca88475a7e9731129943b4604b049736e7c4fb84cdc84637e45f4b22256c46ce42a022f3cf438630dc0c1bcdfbab7f413c25aa88d31b2d2dc96b16b9f028958b973181575396d199b7d943d71d65e5a1564648a099f5be9ff4145bb27468f6f16c473c1f167dea4acf8eaa6eceb87dd1f1fb7265dc964cb5579aa8fcf4b94fa9ef32adc5e35b3ca370e7b6a7881264a93839d377a9716ef92681297f51d8682cfeafd7e5fdb070d75d31bb3374909047272083239b3032388aa2e0d552c3c28b126e451cf979ada0b0c38acf5929a510da5850c540dfdbbe8cf4bf716ccbf0a9e39eb3a1d2a8857cfb41055a6d4300efb27867e6d5816dd37dc3bd9b3b524fe134865bbdf5818d17f7bcf895429ef25a4d8f471fd8aba0b40ca102dce83f114398d67540d6c9a2eb542692ca0cf357d85eb1ca19860d081ec06a7272d3718bee3d6988c74b151f18ea05097a2a7a2250f68e09a0ed7eeef17f0ff93a6b47e79ae04507128fa71950660f8c3eab9a102e8ab3ea746b4a1a1e85c6ccf15431765dd8d02ad971b2c66c90126cf45ae8d3f3ee32a4699febd359e148730750f8924a2fb028ded6dca164f3514c533546039b794b242a17ec65c4953ff62ceaa68e5986b8f902d4eddb27a6265df3b1ef3bd831574942446604fc24b3382fd8600822f0f305b339f77b77324e69ecea2cfc217136589c227d7ee56a09afc317da90406ac652462447b678dc91f6b071990f5060ce9f18939b2c115ec008aaf4ab30d3e1da8fe57a8f5ac02d3baa16ae2cfc791d537497757583e4f3990be900edddd1cceb48f6a368c19057ab13fb0ffabd88015141420a0c415e38aab0434cc5d075a412d140ce1f8d71d27528ec696d3dd06c7d1ef7df84a70335299078bec7c07f38d85c8789d96a027fa117e7b71286e83bcac0be1846c4e24fafdd8bbbcba4a62da421136e3fd0239462f99a67fef4f2b176f068f32bc7f6160265b62ea885da6e689fcfd31b196ae0f24b84051912ccdcf676a782fd3e1415322ba470b934b9c83fdf6aa88d9e42493e8e1919deacb2330b141bc6e55d90218affd9418976fce16edcd98ec121d9abe050281bf2c39695ac77c66280637c3e8f1fd5ceccd35ff1ad358b9e848e71fb4775e1c334e7328c16e25f356ecfa986f0245d9c7e392659b23644c07a3e47d4b60f7a41c0b8b9dabea97a53987a7594f45a7dcce8031c7bc6ab7c35c81b1e58e893ac2c175504eb5833cb0d31217319b969ccd8861985a31bb50ddfb887a613bb8b4060a17f2e74f5e7b7e6bdc04ef5c44a4f162ffcaa1c56c2f677dc076f646ceaa99079f2fd83ba1e42f0da7bc0710d93df22cc9263cd62a487180bcd88c54bdc4ac6925028b12ecc6780820a2a025b6404b9beb7e04d4527ceb25dc088f4149346007fadbafbf1daea96e6382a5837e9cc1c5a9b8aec6a2aece91953ada9a9a01db5b05e26b016b84949790e1cfff50cc18a7456a7ec4374ff96cd2ae0a24a167a802b9c0e8edc44f639e6eb6bde9d286fca2783e9e7edcf8d8655c356653466ade4090fe416b8fc539e22046b17f0a757bfa7b1e16b3a7f9d3ab59bfa7d46f102d7a20ee6cb4a72ea887eb11587709fa7e56a1645cbbeae02675d914b703d2ebb8b9b9a159daba558bf307090379675563437b9904fe6f6c937c70ffe77592d88e2e97823540ec79f25189700ea38caa32b1957d1c7b096fcf7ce57bb470ba1e92a89f6d6a1ecc7f09115133d404ccb60c74be615e426f8a1bb7edc4056e795f011fb677affe9ddad266138c67214e40f4c4dd0f7efa6dd6ca71f948089e37f8112d9abb4242efe7b1c76b3b8572cb8792bd5ec67b5c65cfcd7510dd366378c5ac9058d32d9c7db7636e01bc97e6164780e0270817b51626848ebebec1d38c6f0aaa4bdf48936d7909dcbb266b5b78064b9123433168c34a320f1037b63916abc801ac3c8a05d10c555307b93027d7d2bc97588f2e6a9bcd784c9ef05393581715bfb04d139f7d68bd5a292fbe92b49ee39e920829c57bee141fac52cd145da4b53240f5546733d8dd3da5648959f6d7f4b89a841915fdf50264527348a3e4aa094d30a898331348c88bb0ecbc2d81fc70d8ffa7ee0ed231d47cbc72565b2a209a261736352f65182096b794e632a337da566f9be9f475aeabce74513f09768f7276ababb85baf3348f6f1022d804e52e86e9de37d212b08de42c19370b17ec3471cb5f05a0b1c61cc0607e3ada6238063c0bd1d608249eda1c40f44150a9d49649a8d031f65300d7366c252a2224cd3b6d18ba2651add2b98c772265efdcd386e9730f422e6d2021277d8802bea2461da89e351557f946433bf2d2f492985e65c5bdc00c1dea1ce55e2baaf35e6b8616cb4e908d058ffbc30a6518ec7624f73605642764eef99c628127d0eb4730bd4af81c48405e51c2b647869e2f92e45591099473577920cf04bb5c81994e13271ae06e4b300773a3414b63664da474d66f15b55006f92e63d013fe2762bf642f8eab9dab7f4f3213902e77d1d151c2fcc467539f2738e46e15b66bd7a8f6a071de8f8c5191a5398a90513e37cfe4f75302de796c0677b63a6e8a721cf39698ea3478346f359252cb9d146d6d8903820e63151e6ab9720c397e5c0dee7991483726cfc080e3b0a546f161390b3196028bbf37a063f2599c0612d34113ab70058a6596ede3b4338dd2caf0e1ed2c707d103decd5c40e4d5623050ca7667d4b541efffc3646945f9a900fa517f789ba0cacdb9d78576ec188301110ed3cf173001c4494d3f2de32ac065c4f8d05c524f2565a4cb9522907a43a5a3cf633a9a617e33fe3edfd5debda74473a58a23c9721395f5fee851e265d5e6949f6589e0ae325f012fdc37b93719522dfcca76f4157c4ec36a84697a1a90973b56a8a9b16e63e8909ddcbe7c32fc24d828b40a047c5d9efb2f068dac2d5776ee9033306e6f2cdad9670e8385dcb59da955d8207a9dff1d810e26c30005512d002afb578b715adaac522f658c77c778e833b65c02a3f64651ecc5f94c5deddfafc9a35197a915ab2485257339d7bc26387a45fb9a6df5547f55924b78c63b03d2535717393f5c47ca0d281708e76a43756093bf330c709fb9f732299823927af273a936f2d04c24215a77d355247e46b9246f263e480e9522220b48ca2b833216198c4205ec40618dc0a58c0a205947958726b3ca1ceec2814f8a78e8ea24b40ff853dfc799b7f034f76fa4670043eef44e5267b736b69134960cc6f540a76a8f07cd9ad3ce0f04d49c256731ffe5ec63c2b2b7237878a2d1364b82ee603a95b5015f02fdf912447caea18d94e91d98a12f1c90d67a64f524115d1e7753451ff1e541a9b47a4fa0dd11d3d5dfa0167d8768733883054a44062d47f3bf73ecd86376c2107a2543bf060ed5f3679bba0b4941ba2ce299eb3a8e341d5cd6f0e7c9d9bb96a454c4555982d1975db26271b0fb142c3a63e820775af5b1c3854eaa989e80423ddb93a30856ea18b351132ef7273d6a73d659c97ae3e1d787dde5d63f21d48bda2ec29757aecd2bc5b4e0cd91dd9eb8cdc9868ef9628e31d46a60088c6389ff8771f75618f352d27c878fc65b651c4a7981be762c6c3892d6373fe71ba8b8859daec9f94e963525252bf924b5351f9d4661844715233beeeeab5590dcae3a06cedd4697382f97ccd9398bdbce3e16e8aa550db8dbf29adbbc7a4a4b3c152f1db6a66e1f395a7b081cffc860c2fdf195354bc673aebe7ba22cea19918d1c7bdfdcceb505ba654a49d04dc49d8e06a5d2880bcdecd1cba9dde5d99362542e44af58c885bb430b50582622ab2c54deac2727e773fec60e11abbd20dbee77f376208aabbafa5b533c102e0c38e76a108228a86bc05fb318456c0e07e98992b83fed9e0224e0f249a4a51a763ec52a62292f2606efe5759dfc1617df07f3d92693face3108d668587f7f7677230b82eaa628f7d9ed96106e9015c4fe56eb590ea96c85f3a04e77f1a99fc90c60c8b29b82710244de8b52ce7eb783a84a1c7b1b7bcbe753964e86ba629b743902a6d17e49c2457b99a3eb3fea3108c32a4e10d74a376dd38dc73885cf23c2cf2c05e0790e2c5b7f270554381830199a91ee633d19ad77dc98c2393b781e7159936d9bfae524120e477231baf4f3d644f0e6ff8d2d5b2184c15a9455c84d39e1004c5c4968a46da9ed6924768b0611b809c329b39305b0a28487209891890c2cd2009e98335099cfbf1a27ea907892fd75274dc59a7a60ac51b7ce9085871647793e0a1f68b8a7669725e8f1d8b285832098cebb54177c570d3adcc9be33bd2dfcb721ab2ca42b060430cb5dded651f9c88e00521a5cea08917b3ab5369923b1741fdc28286efe38c846797140af93b981e134840591b0342a0eb316505af1b88f74d9820971c5095b102b9e3f301453337924ce767a115c178592194eb9606b0ea3fe210084082d67cf16684388de5c1a5827818e1d3f170f1fe44dd830d5c84771970f4287ebe34a35ac2955c0d76346f0f61db794d0a4b84088807b9c7ccda3be57678900dd4297048852a4ec796a19caf49a19f46dcd31bfafc027f1bc392112d65791c7cbdf958349d301ed9425cc7a2fe5253e648689fa85ecb18570b8d27859699cc2b50bbebeb3a262bd36dbe9ea9fb70e6813a245c813ce4feb32385bb41424efb2a1a3419bc4ab62561d8bd2ec58194b6e6809de2da5281e5640f376b928785311563581b9abffbf1d54d23923a3701779d56d41eb3b16a095a9cf717e087b94fa5eac9427cbd9dbe6decda6373f1ef1107a1f4dd5d8bb369dde77ad191827052c35fcc5e32bdf3d83941af56048011c636db75800a6aaaa9cd1c92030a1cbfb0f9844132f10060de38af2d539711920965c92abba4b3ba8a83401d3b376c44dda6cbdb0af8dbd9bc5b6524ae794ba472eefab0157facf40f3934f65f2e1e1dbb4b44f82635940d8f9a0052b8fd6692182a3470cc7f23066944e6b87f3b2a204fc6b21a5622f79db2e536aa41ec989013f15f8f005982672e2affc7e278e032e8b6482e67180825d54ded0b66059707dfddf01c652530ba15aabb6a565d12f41196d984a654f963d8b1c50b264745ef1e58fcb1b3bd54e9219fd56e83aaad12ca557e185526836fea5900ac234a416fd6452086e757dcbc9e3b0bf498837185ff2b02184935b70443985f260dc1c7d03f0588fb58bf35d2fbe51da5e71d0cb50153b9fe498e6635b3ccd3fddbef3c0aad91f5ed8553a66901644fbd19acaf1f60f7d96788cb49db039c8f3db3d7b0b5e360b183544c8b81b7c0c0adfb85992517ef9b2c6c3a06b550f8cfad3affc97cdd00b721b7a6e0de6e784c9da6d622ce052def18b02e50a813f56b291a64a636b2e3e5d4fb8182968954239a7785a4429a33fbf338ddd730ed1a6e4b385e557efa3b56f8a17b0d6fd6aae2f4133904434842f4e610b4d92fabfa6862d69acf8d479e5fef892aa4266f291fa3461739610f744246d3a4aece6fdbbe8c75b5411d9205a9bba62117446e11a0a224eb9754de56391e16f41159a026d579ddd1fe18176b4216526086da6319768423c767f812dd854fcebb3cd7fecf5919eba90899419196181df1ef471ca6b07dc228668c4bf15012ffc9e5b233131e50f310e489cce856b0cbcf826f9b707b8cebcde9733caafc7a2edb47ab9ddb52b0568b92669f4be00f4b011be70f4d5fd0ae7a49a70f55837b0cfd13e96674d6eee35ea5d8e08c728a0e4ac5870c06fc4154f1f8920b1fe1d66065666b50c236209370e95e13b12ff68e9353f748b916b8a71e07c6c90513108ad50e534c44e8ce933e48eff16e8e318c89ec95c6c948895e8c12981b64c588dc8a3e5d5be9d64f6d74d92c52ea5c572da84feed296e33790a8b8410538e701e4a8c137e77ba6bebb7310ed8e8cef7a875260f4fd379b30bd85c23ce2e93329be137d1b95316cb59a8278c1e502b1ae664730b8de88ae6343b3dadf547276816a052d735d436bf2364e90243f94ee6c633c28818130dcb72955b3fc27e9d00556ab6db435548bf0083c1fe35f75256d948f4fc456e322c579ee827f551a0ae543ba612595f180ffdbf72e3a9dfa47b25d0123fca5f728d09929bb754abada3c1363fc29387d92af88f51c094df2289a275aef54500db18c1af3e3427bc8fad7f8b09ab2de0524626088accb2dff507bcef8bbab513f7814c08dd27bde964722326d3bb0af95ceb8d14cca602b9dbead4596762ff914a858d9c6b61e6c908c87a333e623070ce9d8bfed7e04779d337bf5ed8266abfa7eaf9cb07fd782ff02b0173adcc4a123a4d4d43a53489b75d4c4533a16723d5deb6191325b3cb46ca306b59789d258b204759ba1dfe92f8c254a360f257ba398a870b1a447f3cc2784f1f0391e233a6774e050ca7397223126b0a5f6d33a349f9e902130d68ad1631e9b8f605a00b1fa977fd77f454fc05c9f61e00f085b7af7bdcc268e7d303c8d87083b709dfe7016b6ac1ebda9446e9585277a972a8b04d8f8f24bd685ea7c5eea104286afe249c13b5246921b02d36f96f235f83d4b0b4b2ea9837359406d7936371bca1f4c5fc4aefcebc8784cf297a33229e2717bb2dde4e9e232b5411188476357dec4ef1043c84bb847d780e9a097be9062ffb3852e58e4cdff3d5be8513556fd90afc7108a71ebb86433114ca1b5de0d740fa7434431ccb19547f859a7fbc70499c5c33fe77dbf05671c2ca4eeaf5e4372ea31f1813f5da61d5c2e3fa272f41c13ba6c940c299524e19615f033b3bc55053ebccba37f64a04a33bda31805f1bf3c761ebde43f92ed104f2c70d61b1c9391150752cf3d2803ab41b6f7dccdbec6181b0f07bd2daa3e5c27f39f3a98827b2aa44f6377119f6a89dca2babfb82d943e80e59c05380241a83c2b0bca89e8dab0de88d5b065ab92da4449b043043b634847f475a23bcf9bbf6686c2b111b9ba45325615125bdecfeea62d14bc96290b8ff62008e08fabd5db2be6efd14e466d30231f8274d124419d7b6e0c7011d248e41c66e561d4ee1adc9a1ff4175f2f61f5accbeea71a88bfe010c636170ab65d16d9a9f154920289d9f7629beb9a1c8ee31d785daa10e1ec455f5f7ce01eef9edf81d46d5307d29d524ee3c6140754cbb3b800036e9316f712c03bcd13ac3bd6136b93917bf8fd17efeff4bc9166f6882aad24692b62b83ae8c61d881d5ca3d4f0db4f135a548de584f6fadd7cf01f3fc8d7755c3417a74c2dda6f4aa0bbd3de0bc750d5578c3641e1d8e7c55c7da3baa6a408d54b74af0e1ac8cbd3820b93378da72cfe14b8b4c3d8cb819a8853e80aad87731912af3b8cd5d2564b3f9edc9b6f3889da3eb7ad0dc6b2ea695357576693304ea1c90b822c1e0e21fccdfc7604a7e4a815c17970134cc868a195ed1c718a41f431c438398b0c76ba5f9ad5e8892ffa8aaf961eb413099f6f148522f8ffa10c82eedd63217d854cdb6240d388912967ee9539624c96b73084a470968de7bbb107d6f37d8b1995c1291648691deb34eb33580c35d24744131c74a50163a1f972e6add593b0bac14a87ccb804eb5d8ef1d27b05257b26033e2e0b088391a37a36f0f3400b8e0982a4340437c56703e24cb7fa2c81926b93256d02264b56c70d14cef2b51ab7c8bbb28aa791ba826b02f099da314d809acf85d16ca506a0f2d436d6cc14662416f07d80cddcea522899771081e8fbf359544dbf69487a65aaee7c04e4d35b7255ef912b9a832296307692debba09465ad4ec70f68aeefb940fc5cf422ded52325fdf2c8c0172ba1b6e07dc931293707cf3c32a6131411b791076fa58fc38d40575eb57622241e131f8abd7f2eccf7f731d8c85c7ff3031bbafa6af855bbaf650fc57639b9840e5bf9a010e1f120c6969e4724c7be46f667f9599891f4a6730595a49fd9d90db7b94978646d4aa64856058cf3614d9d68fdc4d00de640e2a2378fbc6145132f3d1b2df9d7bef30aeeaaa6d1c0eec861ad06053b089f3ad65ae9da16569a40de917d1457adef1eff7f36fb36969a4fbbfe88ae9fea850f66062c7027daf0897da36db804d398215cf992a5abcb89e6d433c51c7cd7c6515da958eb702f1f0b31f9e6efe64a6eb51a35c2c8a1a708210a30f9b9192f3fcc144649a7964fc57575e285d851efe9a08efad180a3b9fbaf9bf6dc725e32c46f4746929b2fbc33a2ec5ef2fa8def0a21005f765351328f514472b24b450d5572eb8258d58f489195c3f899e07737d3805a696e042bd13a72814ee77aa9b67a7549f93ac20c1957a47b3861a658a573726bf7027db703a88ea40c7796e8a379216fb9e7ff976f966769e5044852cdd9dc8f4f52eff8790112452e357e8eca9d9e6ccda93dba99eea7aa05f73e25b6d0c57dadabe3ecaef02e7341030dd96241f842e0a8be7a46b98efc69e322f4b4d4ae2f910f13e7821dfd1fd5c9b195b106d1172ce9bd417d30384ac47c0a8d0ccc1410df6b890d1426e649ce31e6c51beafbefc120faf93894619bdd98e390106ffc30a1855d70e5b3a64f4e0b86ff12035019e9dc2e6706d7eee30e6c56b1d67376fe75ee13e0a1f13510f9c5826cc10335c6580a7adf8e64bdd904abe2b3a31bfd130e7c742106c8ce957416363ee4341b9380844a6eb2754a6d51b875a4f399062e05a47c492f87cbf11c332063636db50ad2932e2bfbac04d74f465309684c9710a20f470b8167edc7e0491042400e222e55b9e3030c3bd87e98f4c6f61cc2ca94a473679022a707665114245f58019ff7247cbbcf62afc34969e6965d990a01c10bec996829ef8b3e7e7784a0c50a91d87ad8efcccb633effe8499bf4525adea2aeb3c635bc5fa80df665cacf5a09d47e671d1ee0aa99aa5c049ef2bcf0b036d3d8674fe84f7237330478c6391a4678f6dc010aa7f286f49cc4d32cce209f3f8f22c260510c562bec1a297e32af9599924dddf3a5d1b728abb8a5c78a199f42f1ef360d760c46939127082058a6a2d74204c61d2518769a350fb1cd104c020e020ed002f1dca3072988546c2469a7e01b9a4d24428d19d3673825522a4dab4743f7e3b06c6ef73d2602c4fbde9274ceed291ffd789675b3a3c1d9d1543ab94f6c10618ce37d42fd49b05fe9ea3977c3b4037c961bb7d75f5e26cbf3494c2c49c0468f3f48aee29460e0b293fa58556567972a6b66f7cbe0b9dad393cd96ef0ecd9b6fbbc0ea167a095be969f62ab05c13033206809b8929ac3ffbf3d4b7ee56be05eb36258f7b468323183b64adb1b4b837654d3e5cc4b65cf80b692747815deadeb7493a09f20a74a662109be5e0adac645737f8bbbcd11fe11ba9ee66c1818f2a6ea33e9bc7e6a16bc14164e11abc1397844ccd57ffb74b2d21862f518255ff33c9376a5a4e55c686ef58f8f2bbbac14dda0f077673fefe14454dc62f19d5906a34442de77306844fdd06709ef5915c1e1f54871dd06d920caa53e2490818fe38da3e80ccd7e6af63ca6a70a4c8a4d36bec4f54cb942ff1fa874eeaa21f77afcdfad2c264db2fa9a19ec1c7129b617bfaf24ca4662e62fad0be1575bb0c928329a32998f3bf33c4ca40bd3aa2d28cfa9d03c8aaf3f6ed688913e901b98e5688f035427f95d2ec764d4de5d7cc79120a5a9cc792a0154a8a2b491c823ffde8ee8ee0c35559e8f958a8337f455bc8552cbafa53a9e429c618f2116907aec69c2823fa5cb680e0c0f748f595a41b1fc1d9e802cfbf2f049914957bbe6c677e1df24103f36aea9da1999b87f9cb2fad31675d3dbf4f79de5758f2da31f6299c4e8332a4de8834ff53f42c95499c57e49a420c6c03a0aa3fde96fd1a493d3543404bdcc17b4e1f49de3a7cc7a5cb29c8289c360fdd7568ba360d888c9232053770f8f1d39510efad38313a2034982db07fe24eb463ed2bfebf13516d08b978578bec50022330fe6e1103504fb1350994456fdf366043fd86e777be5ac840915434c687d96afcc86cf501e31dc8e9c13093cffb8baf4dd45cab81e4404b78cb48cbbfd472d75249aee5396bb174282e80a779ff4b46ba1451fa8dec5b37d416a29a73886d25164b151f9b6b292d7d19f5f45ddf45906fe2893ae64a04678ba0394a21c614449e7f54f830639255561e204448d44c4a0b20dd008133881edf4b66a2a3f8598fbced2033c7fd81c2718c55ae7e81ea1a4210e81339250dafd0ae4ee240643b55b134dcc29375db8fa81f4a583645bb2a715cdd867ef53fca5098787f2059bd6b56200cdd399c4ae68f29c8be50d7e4e5a0b010b285eeb469194ac3d0ee1240c068c4c6e1666dba66f83a29b7af51eddc55a4cd2dbeeb44abc4127403e4b69ba9e6d3cd907e278bdbe781bc40964e95ddbd940eb7ccc394ee7d6d6615412fa171fa2147eecf6e103d0d106dafbde09e051d2e69753d368ced8d20d977e4e4dafb965458f3b27c3fed214e814343d000cd564801ac392c1f86fec047c271c23e2ca6db085b3905c26679c4890784e719983b38b3e260c0c2e8771d7ce66810764bfacd0997e6cef6726f21dce6ad7c1d7bd6d37d0bbc0f188a6af36ee016154bb4a3c574c67bf38a2ffffbb3110e4fa2544979622a3e00c4f86d0dd64fc9cf1c5ede73ddf1c2cc92b61224982eab2b57ba5a4e188e8ac0a8361d4d259b8caf32fcd1125dc8719564c3365a16ca0ba93e1fd46fcdba15e4e561894ac1ba71a24fed7eb0f8b2e9fb4c1a2753501368c15f6048148f91a251aaf22f5689d89556e0a3e3f377da9e90a3bbb12b933d593796a6cdf8842120da4a952b9d9f440112c7e363cb8052809e9ddd106645c26faa9838eee341d05e3a411679451db2e7f465a160c5aba045c66c2bff31fb73828279c6c472c718c62dfeb6d710630267632f1b61f82f769071575ec7b3ce4faaf4aa2fdcd252cc944d6edf6119174eb99dc6b2c74b45b0630997728922a68439b3496ccfa91c0e0ff670216710d4f45c2b544cc47aa4ad1e4f5bc57fa4e2a6963330de749e8a189494fc83594a20b9d0332cb83f91e69dfed2d2eec4433f86b137db31b2981c8a7ae9713bab3a3142ffb36a47e0cf02647f1aa2930cf3b00ad569ec388ff2e33f9d1ed6872e50f7ecb4028471d8a122d15a0f9fd6092905737761a917a28c262d2235382dcb2f07f26207b7f3b3c2df450ddcd7099cb1576988655009afb84dcea2425d13645fbf0b8fbfcebc6795c301111ee398cc628b74848080c6b3c86a8398698f66211e3d030fb4180a57fc15ea01999860e5554dca37c2b421b8b39d4e1b7c049982d00c171e70305ec8f043bb18c367772bd578971b17e43a0b08ef22eb9fc53e6ba4689255693956451de4ca33aa5a0b129aac5fdc48c4526e02196a13b2a54870c1093dc86df2165291257d725488b67e11b7dc1a45691ce4790d90b6b50be0277e16bbe9303ecf58900e8136006349cd855019b089b06be8a4dd9bdec8bb71ff12f46cad7b90d486e1dcdf97fce8b5e5dbf85962c08957bfe8f37c2e7e59ca7f01a77a7ac90f07b7f249b88a0d2f52eeec0a246cb82c39ec50a972a286879f82c3cfb05e23dd5b79bd927b31c9ecc398372d2acda132ace2136236caf30916731f5ee8e90f8508eb9810d04795ada61d482f7b1cdfcf80d97d709cc437fdc73e91614652a53c7b461052c522d15e21a668cd42e5ce86e5eba54f8dbd0b784c8905a5135eba9f70939db2785409c1814671c9284132c62aac51ca706ab1c670fb1e631d709dc70ec546ee669e893a3b2a8663dc53195bd054b1e4f2c089498931706617d4db014e153b113979fbb225c3c01456c8d49fe3ba1cf2c4f3f24deb3ec493476e8f79c8974f49e6163f524917f09fea68bdbb6aee3c9ff4fa1f23425578b1f7cba3c13eb24e23ae10b86aed7a0c3202d67ce0a849f578fbafc78470555a43d965c8a5904c4badd04f031ba75e71c47a9496e342588a123a21e56fbbcb442cb8898aba1b48f8544b7474db2fb477874b1f90d020dcd54098ee295e7b257ebadd52d08f3f1f8f16c13fe93f99e0fd48a4f1f7256e6eab71376a38dd4cd281fe84c0629ab4fd8111aa9e5a06264b0a6d2196170a4fa112415cf1f7241c77096262d3ccbf8d43cea54d18028b71af8c777dbdb8e77f07bc268a7229ce24d72b235d493545e23cf15e612d0af33253c5b0bcdb6beecd94a3e6ad383091df8779888ff4a6e34ed0259df96d853081644f6005dd6223493cbd4fc2951088b06bee4b49c5f8527bc901511add45adb18fd2f3088ef31177135cf03d132227df6e186f429b0f1b507f2ff946040b4432d405956c27d696c3f41fae7995c4e75e4c124a6a6978fb39bd956431c34414d313561936e5d35a28f3121166e9e28a8bef553cc13e7a9c84ee2213d5fbfbafbbb1cceeae70ca63b5726eb82cb656c83474c158c845e2cef08eea965813550c0c78a42c319d60d4bded5ba1f51c23a23e8f540b0be0739f919ef72e3879ea3052d5c3e6ca862a3fdfd045a665bbfc2db5247fd276b146509e0157ca109be9ea8ecf0a993a97cd60eaf584bd5b0a4bbb2f53ded82d6211416be9c70cf2362b7784a7541cdecfd1950e85a966d3ef0c0e23c307f784104a36c62acc0607eec9dbab7432513d42f8429cdccc233e41a085ba553a762c17b552b5d124f8b6047fda78da9ab40bc1dcd112ca081af517a183d9f025dc0b07444c706c47d4ad5b8e7eb97980f94f59be0184d323370f2d1256240ec64b2afb5dc86b667e8dedf45c8286f0fbf344c05705d10a21385ea646ed2c6974d7f341dd805495e0949c0973471a342dba720f1ad985c5b5705239b854cebe50612acd0fdb4f6065bd24795c7cfb6d0f35a1064a491dd31eb89668bc4c4037a28772aff5f557a3744853d2241c0e78a251d2e3d64a612a5dcad8dfc31dff534ce63ab194081872244b1d2b683b3cb9c8ca5cae1a249ad27a892bbaf1378f92bedaae2a23c2391265f6827c1ac8db91c6908cd6939803f84cc5faa05031f2bc526c69cf8edfadf3ec302df027127044f6c439bce5e643ab90bbb0751cf95eee36a57afb8a11bf910f89ac45c1acd042664b792de64a23ce6b255e167b052214f2d9e79a3766e54d0b38f7fba00c0f5c8e1a810f735fdb0241c5d21464cff1cbb8d00f51db52c63729b0558101cb59c2b87bd0ac7cfcabc655e081bd3dafc8921958955b5e267e6ecc9620b9d5955c5005f83379c7d727eafc80f271c43db015196663a46b9829578f7d1b0e1b2bb8b9101eac6fca2f39b535730509665e381ded26a6ea9dcb514127fc2ad01a1f9764350c6aa8f7d6021f9caac0f39e78eade2c08a3808e48a3bb34d68ba7c6b9363d7404f6f95635caf936ac71984b90be12cb1613c3a0e63abfefb39f674fd013eab88a1a373aaa3f9a1c24c3ac24bbd13d620adeacec2f1b557f0720cf360328d88f73dd2148f82954de507411bcab98a5db4d081a4d3be93a06c9168dabb04cdc9f887091f305a1846c848fe460f4c5bb9b54f9e2e4da5ea18d8d97a7faecd98e00046f442e82186715e664ff3f573bd04f2575bce8554a4166bd10c1240d5a586a42682251de00fccf43a3b2f87622eb6fe3303de06d114939fc5a54d19d98d23b63920a6e53622112ba01e6d1bfe628741d74f52dcf270c66e44ff21aa8a69310d728183c0d3c3079afae8ede3620a7991583b13d2e3944b71a08945fb0c3baa8a29f7a0f2fe438cdaac68a77a5e609cea72606e28a41a866c7100e4587828c8849a596e0a1039b129a1a7f706f38f8c7901eb445389c044b5120fdbb75a86a20365803474f7ce9157c457b73dd8e5c1368818d769b81fda14230537b333b2711f0f4b4801b465af07884f7d03f8d22865ad484f07aeb2258b059be143f8bc8360803966c2dd7ff48a611625c0f2bea68aba9d6e7ebb2b475d61c6b4e091e52b388494b89b1c01b7c44981ea8298aa76e41e2dfd6c811bf65da19e63895be336894a264a87adbc539d3c5facee70a287eceabfdfed79e7b7417651eb5aa700aebde882e790e4533d7ebc352886360147405523f5e26e106e1e50277eb03805f316d4e0b034a56498344d0d41585882801c39091d12ffc8f6eae9971a80c9f07ebc6c81deefea07bf60fa4da33c79243ead93780a1b21dcd9f0bb6e40968585cd8c70a9798141a0454acfab57c9eedbd1a306cec39d9be33ba785ff75908da23fdb82290c8f4bf85a895c2317ea441573e0594cf24389ce915bca6a8ffa766efe14ad76881f3eb19d773806728ab8071a80f53c63c1dab7ce6151f2e9bec85129bedb52eca46401c1c37c171c14bdd7824a68a05c4ad20c0643a65d0d2e80c1d8575e05601b9ac29ad444b8ef9a7a89824fe46ea7708803bc86986e653e8ed9bf866823d41ad2d074e132247a7049c3177ec06871d269615e40b965054958c7764192e85f9691b8bbc6ebbd22813a60e122f6766888b3919f7fe196a7743504b8e4591fe26a72b564a7976b3f4d8ed2e486a49bb1cafb0bae1fab0d5b34f35f1acb9c99a6cca100a55c6503a8883c56ce5a8b729dd6a80a8236f74191bb52db116d2039121a606fd48e05c89a6b6ff3143693413cb97591bb9266dc7d0d8752411d0c889797856195132cf503880551ac3445993345f3c3ca4be18afa59baf7662c6de1751ffaff9bd6145c7a8612572ea94f857724048c5c6513e560ae889d6d9fb32905de3ccbae23f90f83865ba1a6ec044dc9a8629045ecea600c9d81d16ca9321790c9dd79baa19d22eefddcc16990d9c31db8167b65c01a577662abc6a1caa20affa2032713b0c4705edb4253a299e9294df401903c749a171e3bfd0fabcca077d5f2e6d03c20b97e4e6072db7df9729cae0756932d48240eaf11e52a91d32bdd43a45527d577c864249f007e2328561681d21e00a64cb9f61669c3d96562274e509632aa78ffc1cb26cab97edea39b00440fb38ea6231c227e6a6c4e8481dd8957b9f117bde47cf964881a942619ec5261e6450b66af52ca534ba724bc2b79a468151d2c9b9e4fede355d60970231544cbd3587c08392877e0d3b32cf1c68b3f3d64d4ade194998ca28c53b3ede98a8a6f334499a43fad7210abc005fab38752d0bf46ce8bc43bdf46142daeae56e12ca2c3b490112db34d68307188c7f04583d54439d714bc1a5c86deb2f4c14953e2e16e271f37a35274551960011f5f810e936e882923d49f459b4665c049f53f0398b872f5d9f166d24cbb9a3b71815c40e05f9f8b24fa361659227cbca882a809b63a3d6f1e8a0c8869e81f5b9866d97c4a4301c8b5bbd2fcb1d36208333cb2a152bc81993bf229ae7d886387860c61d8a26ac39bef826869bff1350a0dba284aa88b108918d1e32ac7a4d0652fb9404076dc0ef5f21c6fa99f30491122fcf98417f00d01ce262596ba70426436a82533328ca0814eb56694ba07a3c85ceeb7970ebb706946ac202e96f689d32bf3a609f88f4c8d176a4e483f367e798b8f16dcf838831576a1c5dbae72ebd162c9bace60457530d07d2cf6ecadca1d9ad673a0970567dae5064b47a9149f05aae33da8b37c97ce74f589be789ca8420c7d4b98669190f5895caffc10d25227719f6fcf5070bfe44a22f29d2244efbae008bfdced7745431f852fa0ff31a65c2554751953840d284b3078694b14aa2149cb177d232121c5885ace32c67daf62ce44d70faa8839f4405330db1dfb982cdf0c3b9f3e8a9578e7d4d466ca8e7488360700992e7e0c0af995b3ae9c39abce414b3c309e7c637d66634b040a8674792759c23074ade29d19a0a0cda71b892a443fc924a5eb248cf53a835df6151ed88523cfb058342fb67d00168ccad50e55185eba49aeacc4bc6bec8ed399ab57a855da41a9940df7d92dab3af5e472c8e71fab89a4793e019dcc88c56a39b0f889f17f1249cefb530f5063b727022c7a634cfbd463b5dfef96a9f7416fe4504ec3fe50a5d6f0aff329a9ba39c2edbc9a62393edd5f84c676a7d9e86229a4b5991be8853cb8caf897698929f15f5a48d29b6afc0a2b24e5d26401f84ca23d568d85e9a57f0c34c895683e831425ab2682b457fd65b2144a1355a52d6578b726d399f69efbd23f60575a64b45c5bb28a3ce32ff31c6e63d49b94c006d9c315aa89e10535a0a43909d999b049851ef73f47627f1d0222fca6a2cc1991160bfe95bef08a6243fc71472f880fb7d11854e61eb2200f0d2e2180b579d0f750473596f75029f31a0f1ba6fdba2fb8854f01f7eeab2327d66e6ddc3382dc10fef829ebad3beaf84335b8d2fd7ad46c6aff5a8f1b6494d71cae0197cf1c7a195b4cfc12cd247fbb3de2e1f27d9289044d89f775bbdc4b8841a3bf8a1107bcd4e64db66836155b686c2d60d4de6b92e67f6ede0e198834bfcb83b492d50bbeace22ea6a93ed5ac1999eaddd516802e44555df2fb349bac3ae423152acad9314cd7990c9d2ee783c17052b62c2f158deca94de0f63d30f0d5dba66dd6f32940630f1791aec151aa25013b9f7ac64c0a0b57ad250a1d39b562a1bfe6782a36f8ef1a812e28a93afd5f40e0317c8d828f31c19cffaeec41631e4d81c29d987fc76f4a8989dc0a514e46853c94f7c9fa30b24c3b557e7b03910c99bf72e33fe5b3d4384ce37efd0718b40df1c4f8d4e062d4e103ef12cbc5b14b62ffea9c700a52f63df6199a0fa18eef77be4bd79c955fe36c398d7394921c6c2bf70fe5550db27bfa776914bf06d84a478d5077224e996c6163afdbbf37d7ec9b9f6673688dbce8d14ade71037774b166065bb6fd01514632da1e02ec19cf44fad364a4fa01ba8e6945ac93c4fd2109a0bb3cfad4a9ac1fda638e0cedd6694ab8820552ad60fe9c2d80db865dbfc42c24e0e766e7cde66c55e0e03749b8975ee76d824bfa13f373ce49fd1020131ecf089134568764717b2506e9dcbaf5d17bbc7b5575ad41f9a9bd2bdb0dd16d5cc2c3add64a9a00265bcf2eb4e1afc7ae2c1297e3dc6361dee6b2fe515d291ccef8b14006be1850dd125c33b2d7cb49f578e61f73551323ddd7280fcb1454cd401293779cd590ea0748d9584cff642d5b0bdceb4f8682a56403de5105e473edd7700c2ca746a46f221ad74cbd29053c562db9d63eaccdfc1f3157a820211bd0639f25fcb46688f51e74eb313cfaeca9abb9e6e2a2b2e308f86f5b351dbcd5aa834ac9f25bb487c71d7f2fbccc578d38a7d1f4e9f5b2099c098174c1406e9c5f1c2d4ac0bced7e740f33bf5d46f90d2924f412dd765b54f1c993722f14d66217ee17da8204225f2d1a3b3d8364d5c7fed11099952f383273d3cce700ebd48bac52ab131f2f09b073dc844ee0f1e8cb115f558135b45be2d11406acea266f6fe56e7170288c530918e7da1bcc60355af172bde9173e6ff7695c945a79a9a4dc7e60c6d159c8909a8808dcd1ad62126b96a2e1935104c4d9fa79a3d2c5253393063363fb9d7dc4a26f437a217950ed2a66c81c65c1f39943ad70e7b63944f8c785a56f16a88bbcf9a18aedc13a765973046ae2e9b02872c66973f6ed63cab5a1fb0ab62d1cbbc3875d9cafe8b493e45bf6150ccd04cced457fa59c23dd384ebea7cff3b1476d59cad796a7d60b247ba814e3f664fd356c7799d9df463c912caf246d48f7695a2d551c20254a823e4854ce7b85248778556907c9360a1b366e7752d773b58ca0bc4b3b3bac0a4622e50e3b5f7e261bb3c0f9517dac662a17921111acec89eca493e8c724dc5f4cbf5cb8fd4149a92fd2ef5c22e64515579be4e8caafd572f18966f8a6d0ec963eceffeaf6b8c190389cec9878d50417fefa9b5dcf608155b73be85e2de357807649466ec797b0df372e6d0b32dc502d31fc9c457dab81792655868f8e3f43f20a5903c222ad8041de4908e2dfc063600b432c683d09390b9c5ff6149b852c46ec030199f1c6ee853b17aca3ed8a947a15a864034d94819b222fcf0ccf1826d91038b15a4428c81dff3b3ca4175c018bba46274758da459d3a5d3fa7b08aaf8bb1fb019f15db459d486a369131922566cc355ed8e477d6ea322450ac7e82d44296d98ab8dc87364208c93eea3ceb5e21181cd74e8cc65e3c111d0af42e7cc66772da3926f0bcf369efd77f82cfa541990a13afb706281ab50aa23fecbcf89667519d5e20b8cf1213f1b0db01cad7e0eb6489451305b8d2598cd7b617c8f9103313617211b1c1dc6752c906635e75ddfc0018f0d7db6ec18fd39deb8a82e2f1c0f81044173ed3db304b94c67766c223f3a57a356bfdfe1ea416eda76fef17eb8840a63f864bae385b36a9b8620a28bcb9ec1e2aac44f793483d5e3f8271fae608d3706063c152347b524f3919b7a8f98034fba46a0ff43d0e29e25097a9120540ff18feeac52ec74512913aea646c9d39a79f67eb28e92ef08de98f12a58ba236476c0c09d00c5114fd381ff42d1f3c1c4eb3006784ce22ca5a7f3c6d5c548d733c4796e289c150661f5af7aa341c4f24364f2489c739a7dab117a0b6818231846c2e344d83c34d5c0b46ce53da9ee090a4e971f4a4ae174771151b0e9fd0297a5d68ff53b416793e6912148d4574af645bc323bc06b0a0974b480d2b85511d6a9aaa0ab4cf350ef517108fc638e7fbe6ed08f0e908dcf23670e529d709b33deecfabb96265e32790ddd5abc238e0ec21251a78f8c39c6ef6c3bc956e16aa0aa3f82c6904d50c90c0a7c074180374a16574a9fe59e737588aa9ac8464066238a9994bb97410290d5b5c0bf4b5545a90c57da5c1f2234713095a96e9bd5509b8260f2f74412ebdd2dc39e045570007cc97a61e419a66e37b72cd5432939fd5eac3e8627b2eccf005e1c7052a12555f1ff8bb9af09fe20c33223378f794ec18f92d56705eb1415cbaac570977cfd445bc46a7884c41ec191b5ffac7fd8251422095a3883d75a27a66a314096bc83a7662a432c61134a33650d16acde5b1dde38b31c65263d8906992d1a47f780ed26b7a79dd6961226d3fa003cde86b8bd917f7b9f82d916ee0e06e6259b3d7031c4c9df1c042ef274080e4e722b3290f55dfe4ea677b517c088c152befaad7e0c60f687a84c0f553bd22a74f70ae5f4e0654b707efc0c37e662f6f1fdfc9a330f463454962358e2c1b552d7593866cee77c74e53e4b63ea150431fdb3e76f553cffd0ed33ba43829e0735674ad643da787292398f592d449f8ee5f1b316af3fc735a0454be8cd2386dc0bfcc1a1731c83450fba314223e8d1c8d6c42e69252b424259a4b9767f839586e43e2fb0f9eb2befa7ec57383f1b68c24f4d72c9fa655d1bd12fcb8c4d1809611397d4d7c695c13aae153929631c47a7e1002929fb28fed99a5edae3d945777b7d44a91f5e3ce8da8cd27596eb3e99dc46913125a74669779386902ae9d796e34a15a06906ea604db871e475b0f0b25d181fc583397b20dab5200af63e299ae70599f714741962835fe98ad5e9346799a9dd292cff59d76d6ff05a73990d993bd5372760c0ae332eb13fbfc183568d064664fccccd329f60bcd0e68ce3353de7d49107ff401e8e3ba0730218551748fa32753e33883a8140ee8789f486194bcaa8418354e8491d1e54125ee12a1207db4815f07a53b427512aee1de5bde1ba6ff630e8a9c29e105b730499cf24656c4de8418caf80272dc72a4ac607f8fdf05d7b5dc4fbae66cedad1b1255a32ab6c63f6bcabf66aa898608eb80dc88f6c6b401a14c61a8b6dd95a8fe7acf16db13bf8f93e2af240c2ace2bb5c96b1de52f4423b28f5ac8e3723ca78f7efcfb12f233e8f17355c9e8cc22923b367eaa2169185d2bb9e1851b7b2c038b9ec302960e3af6e6b2af71fd3c4f84e639ded821395352e3427fb015deed324361cf2a87d78642517ae20f2e181027258ac5aba9588eced7860608bf96c3753ace696f88ed5279b7c9a685e954facf83a501be12f3659917468ebd842f7a003ef36862ecaa0cdc9d414b6c3fb9b1a01847284f3b2ad340ce25f9ea944c868513612b880296da4674a844ac79616fe24af5db12a19156e40b2d0e43a62273324baea4860ff0ed730d684e466e3dd8db4e7520f4f7b1f24a5a47217c1ffaa07c31f27979d22ca5663b101bf0278f231b6d52bf3ea188f6cd4fc64b3745b253572d4a2efd906f7e2800d19466f670916e515cbce0c30598e217dd34666b3d11ad10595fc38315da41bd01ae97714b31052b26dab56a8d5e4c58246a71051e503602c211c2252c8d98ef9cc1057d60f8715c872e0ffa795d42f11748a1d6f17507b1af0d5058f6439e50be8306e342288bd719c7e881963e11d697728b72e32570734d4bc0866bb4f8a82a82bfb159056006bd5d7feea31c04a367dd86b335df05cc4d6f4ef4b5a00d3cc634021e61ddbe4f151d38ddd62d9ea4b06468cbbdebf39065576e27b2a91c771d9e6952e95d05db09750ce8583e6fbb7df50919649eea9acdb6d0f575f1d079db7b5b3bd53a353443ffeb8dc4fa0ce740465efba9e14772c3c2ae0cc48d74215507cf12dd2487d6b273c67aac0afb494b1f13711c1653ea07ef2ef19cca2f7bff45fb280c10f6700bad2fd614fb8b2758330472e440a6fb5fbaf45ca93cfee4f3e94e2941ca7ced43bdcf6bf5f804b4028800963a8a1e78158b2d8bcfa343b071c253e5b1e1ffe0161211f5bb5b8e8e496ea4caec0bee63749bac82a49d2acc59bc5f8163db1d0f84a9be87c8ffba63120b4a90dbefa8d84ef6e7a9f32737d9b37235b9b3b95f1a4e568431ef70b086a56f52747dde67587983e8f93af3b60a274ff6d4cfd2834e7d148314f9e439462d4249455bbd59604d247ff52c85f965853a08d13df7dcafdc6d6bed230650623cf6a4cb94bd5edb28e05022312b7a423fddd02d53e8ff1f79eecfc79e8ddf4d449525a859ba86ceea208c21e1bc6569ea6f68d6be1e397528a9a1c90eaed8d71e1714576fe78c3a79ff58ae8d2e26d6c11ba68ffce084d700cc086b0c4ed16d874ae43db0cfaab63ea056b8b6f3dde422eb276be1a90393dc440b24a412c4699e4dfb168aa35cbaa79fb7889331fdae0e4a38cc16df24d5db75b395d839b6c368969c057ed7f0e4a38ecf6090c15a71ad16b3a695d70177e0f9a8781b454e0f4d8b3f1aa212fdd2297f2349ca037b1ac8414cc22f32a30c12796d27d673a5e498abcf15206d123bb1a04fd89381ee8a4dffd9f6067c2aee5d8daf6ee60ddeb2fa4799c8b5fe4a1cb9ec5391f45ff2a4cf86848813271ad5f0b6656a1c7e488207cbe47f32bd8ac241e3191926a2bc030464fd04a1d035f5bd60a39abc3c215bb7918293ffaa8d454f5745eb183c1e1645572045d0d7b42dfdf45907fe8931dde753c94a93551df16c4ba266edf4646311c69f801344c10ca901783e91f8dc13d61cc9fefda307b626dec1017b19a7f48abb9eb3b2fb7ce4026d183413c865b9a8d3b4955ef5b05c8c469838ccfee237f6785af0494a071e09bab3909a0f72ebe653c4316c8f5bb3b5e02d4ca0549c353f96459947b73c4c075d85c52eb81bcafc151134f15c7e5b394ab53dea47e19c74b236ea702c2b3d072097534c47159aba672f824afcc42ab68e98864f75e1fc46b48ca95c6c746e5797240e6579adc9d4348653e91d934d4c644fefaaab807e8c9a6a54f5d818d60ba648c55cacbba7625fa7a9d432257a2278108f8b7e8f93bfdc6c9bfd8964e67a1227b20c1abfb261a82afd236ba88cdfcaaf6eb3a8935c7e5b7a8f86b3f810bf2a0432c0e2ba252f28cd968504e4d5311d3c81993e4af90ce19270785c2bd23979fcd9b9e798cf1357d782bce84d3f4a6c2da5e8b04d93cd31bdaa0e65377b0b894eb1ac751d51b3a50b0b1c9ca4285d7e3629ff9e89b5cdac762f59ddf6869dba686c41bfb5949ba59f29107c688c267f0be06f79666e397c4604bcab214219282dd79527abb2bdc10176964dce895facaf2681f4d6cde35556916e834af5ef991d39b95c857bec866da2be1b05ec4c121c61ae4ab18bc2cb32f5fb2a148c518b61623042a5915f7c90bf2e66e9a730585159244ffe05702c1565c31259eab73ed83c75ab6252358cc121a19f7f92d59c269d48502852aaf3586b7a3b3fbd5de2a83073e636ceebfb8cf163fccfc30963676f2eca33cfd4cafea7a66c729bc0c402680b16beb6e7f49627d790fd321b8e122123e96b8272195f9125bbfeb42599ff01915c9978f19c16f2f1bfb219626eccaf24dc2c8bb0256e95a45f852812ccd9904fd67baeb4be6b48bdf93c96b6ddd55664f7b525dbc433e628ddc550d3e7e8d30164ecb9420291bfd6c9f1d4f56b1a58caa62d08e69b582e8977b502f608167a584586958db56c88ef35b7c2809b27a370304160e6efea64f2f99ec1cf62badd7783c2e3ef2442df4e6cc9ebbb2d1f2825470a5b9606bdf963cd0464f5d31917792b94d4a383c5194cc217b3907ff694ec6c24ecd416ff9d2f5f3f81c38aeb76e95861bb496494efd602d37fedf594f37b251c7c22c9f6fe7ed71145d8b9a2764810231666c1148fef0c07d8417aa31fbdf8a1412648f6e2cc1faff3975c69708ae9b555e195fc8e2cc259a003071f5351452b4c2ae1f43a6839e97da80bfffc998aa5ee880504d3364549e22b44001908e3eab19d346be5f6e3840275e1eda9d1f1fc18891584084c88838bb7338acd6a954be690f65411ee93ebfeae6ec7d68290e52cf9f40376be2b319228ee1174324e56f9393f7a6a1ab9b53ec6be5bec72351fb951d5f67673ac4dcb026f5112ce3fae63736b627a1c55c74e736c1ccd58c79a47eb522c2364e266894f7197f1e0bf0c0e3c8d92f3e6e1f85532c61d5262cfc143896db54f1ecf5dcb1d5c661ebff96676376cf9ee408886bac00268e4b0d3349dcf10404d44bc025cfb3e543ff77027302816ab7d45a6bfe8a2858ac6d6810a91c42c2b860baaa6c480de3d64c55325807aff4d53e6a5b0e49e33a36e5ea9d97a555ed564bd0dfc5dc5d01ebf9b9d4380bcb3dbb76523c10d40d74b65440618aed227e8b837e0e01be5a92050a209e2091f169761dc6380a056951f7a78db971f6fb9a1286afcebe98438b36e33d589a1fa315a52b41b1a107471cac2605d2e16c5495f19ddcdd78f45d2bfc15d5280c1479b9d552e852d4671e2d4c553eccc304efee9e0294f241e53b049a9634a292c235fdb46dec60035e8769d661f1f97cfec6348ff7c588ad4d95b0d543b30636251842fda2aaa4aedb88932a4839dbf5462771697173e1a4d8a2af1bb0f2347f5b81b583bcfa10c968506fe00b6ca35c1d93da658d0be1f781acb588cc0c0f62de1e076795d20373a353e7575de3f6ee85ded6a9a9142259ec2e1ad855ec861717a6a3660b63e125d73cb3e249a16d0d55ea57067d768b02ec0b4af49b18c2dd9d5ea341193b2a4ab2f8780a27903910530b7e2e233e7919bd5e85b9cb43628b66980d66aff1493ee1b8d478b81400ac28b7ee27dccb7e2e1c54d820d14d8f1135016e10bd978319530503c41a947d04d0bca3023dc9708abdaba55afb54dc5e0c8d4838d5751c1cf27bf14365e5d1782b1d36baa2fd65b2162fb8bf62df28a0fb221ac5f7ea81534017976cb02eb2e3060c9e39aa77148ad2ccbde2047209fe51631ca8daba5175580113be568a91de461e54784ba8704d10fe3ff868285f6a89d2567940d64e58aab6548915a9ba89ddf16aef9f21236426415520f90448a0e15c12e5a281985664e006fbd13d84eb46c3ab7896cf92132877af98ed7e7351cf1a44e51538b66f1778e00d0c52504627ae2d1e45a6b3e6e59ad1447f32371acc7224dc03bd82ce6fa63101c1564b45fe3afddc0819142a4c11731d4326a8f65d09cb9335e8b7a85ef0f90969ac6d995623ab1efbc8b0d9e264f4cd6164b6fc16b7658249104ba862f01bae561dfaf221889448c77bffebaf780f44fd7a8c3b59a94acef7b2e1ceada3a7ce06c79cdde081b82183476994523ef593bdfb960a8836e005b1785471ed318d5d72e432f189a7f00e40acc8d85a17c631c4cdb369ef0ad50fb366c7101422454901149fd721c7f261a20ee8097ea4918677133e5fed05fba06fbd5dbc211f830a6f03f95be3cd37b6437a92e257a61f06955240edab4b44e465d39f18e7035aa329d9fa3148f6f28241e48be115274de0b328ed75652516e19a8d8783d52889eed5c8d55c70e5ae4e33bc2640f79a62416f7e140d9062f0ebefc579deeedbb91b26696ed7a9413dac9093aaedc766b46f2c70339744c0c885bcca3bfa03edf8f44683a454661903d7f94cb0899d872a9bc78fd9d72476dd89f6127504e8379a068014605dd9ac09939ffaa6a39aea4b74c1581901c3e2c6c1955532810bfcebbf247fd9e95c6a81650fe922da70f2e945b5d3bc561199adfd918741e163934742d43165094520a3a0d5c83797c949db54241f6bdbce82e51586fd8cd04fd74c5187083bb830e9ce43b77cfd8a2d90ff7e3698b14765cca29fcf047cd6c5946bc58400ee10aafd28d44bf7ccf51006cf22cb0a6416a4c847c3386c9cd9c62cce75097c17d9f4b39008e3af18f0c2db0b54fa4588997320d607af3b95b056d2ec7d54e241f6be059183b03f226470b4e253b0779f704ac9ee34249323cc2963ba511b14373b8cd35484dc6f1b84c45979d1551d99506fb7b813f70bea0a23c1f94b6018e9fc5564ee1a946afaad90e3aa57c2b47467e8702312ca463ab3683257b5bf37ca8e7243d677ed823cf9d9acdc214f55eea7b584a7ad4f4f6fcfdd08f68ee301034a2c3dc6c06e5c1f483a26ec784412ec38a9f562dbfc4c347d05179997ad31731b62301bec36c036c2de46b205055a6320d2bd69e9a4c8220fe73cbe91cee4e2d3118c0d7cf7d486189a1020224adde4843f5738c3e169e87756a429ee505466436da49f10bbf0524d11e2b7d137827c7fb95b70adb84cce46aac81ba92911dd1918651179beb42b57b2375d2ee16ec827ac9751eb647f36ea4763855827e10cd249a051c404e6937ec7ff4935aa06552d2f5d0e3abe95e3a8b46569cf8adce04e37d985def4b6219b8823d688b601dedcb9ec9647f454967925f4f7bd973a7ce65f558a522d705176381718093543f6a76ee5e81ec09b02a5a4871154218842b13ae5aa143fbd86858555b13ffb0bc46a9343f8b553b7bab314d47860259b2fc74baaebacf561cbdb9dc9b6f15593e1d13600877d9b1f3ed3ffc0e9ad4e77e38a40c2c4aae992ad45577e676746ae779eb8b18c599978947a9aa3c7050e69f279bfcc76d900827dab98b4d94e4b3e773016dee83f9edea147cec0f3a0c6f6ff5d8c67e001800fcd7d9009f7f3335def6abe5190ea9076aac0c1e3887080ef61c000acc76f16ba9d53dc5d05f9ca70be61375bc65640bb4c6addf88d28644c57c004db3a1024de387fa497d1ec4f454836bc4994f6476d7d75f93be40ac06a21bed77589a4e3b00a3fd0470fe98bb15c4e91ab88fa4989a1227e052c3de3cffe7d454285835df372d5fec41c774cec27dcbe790e94b132210353161119f4348fcd41391b34376316a7a000618b9b35c942f3cd1c5b460e755f8369b28be6cfb3122ca4ad7de51e2398ac105b3bd26b2945e50aa9fcf49ff3371624d48317a940df7ef2f62b457bc0466b48dd450957264f1fcb19bda70b0b5e06c73987328474d2ae0a5bbfe822c8fc5e1c9e639a210f2554053eab3c7599e03cfdcee58a189a4b15d955c5b5e694e2357b22427a5740e64bcced75e16a9ac9049616471066f6e7b09f30e278d9118eea607fe2e287fda0f37cbabad79219e9e5f25aca1ecd160d9ecd76512451a4a3c635f4e96695b72ca1c76ba64dff1acebd8ee5e60db4e8a2df329f0e6d08dba9ba740b9dcdba1c0ccf83349958c1b82bd3e89ac1cd00e25aa6fd4e7430b9a1aeb9050bd28a54aa35bfee0286197e8d535603a25afbb6108bc92905f6fe76e9562bf8e500d2170cc0f83a127d26db23885d3468d590229c326f53d3137ec6ccf12d9a1174b5ee1084f8142bcf24cf8bd5a6c86ecc6fd11a9f015cb2e43b1239c2a07348a9f9f84d66f182a8ddfc9c5834cc7084cb178a05cfcd1ad572865a00545755f96ecda89747309d8b41b4b6950bac4c9d34e3409a094eeeb1403490c7fdad62a95033a6dd7dd39f6e50b8d7ac0d804763a6c65dc763e93b3bd5c349b5cb1de15a2269ec92af634f9d01e2031bf28703fb9263580e2dccd83e6a60ecaead2c7b5a7e317fbcaa5a8506dd3e60a439cb3c1f58b407bc3900ce53ca555edbe1bcd61b3446e91e03ee527088098c2880ebbf69302168fa9c6a4b1f1b49b0f1bf7b2ef61719b9207af64b63a77429646833c3b6242bda29c934eeef3fe05207f363b8077c54f8dac053d202aeac2dd91d52d6351cf2d7d28d9a4327e48ce70c13fb05bf4106b7b09c1afe6b2b14cf1701c48deaa5ed14f35a8a8a1b843c28548fd60de382e8774ec079ce861fae85f53108eec364a0c1177013d7271f8c33240151b750a5b6c30b2d10af35ca9f375ea29c1e24439b2a67d61ac072e1b480ae4edb6a98bc99a591e01a3e19c329a131c08e97ec7738be0af7d219a16efd91b39ee8b3f79aec3affba1364f1b8362d309e8d04cf7e7d342bb362c6f7e9d9402d13bf65f3eaa4efaadcc34d6d593a380669f861a2dc7bda0420c41a20ac4ab4370efd9d6b1cad5ca1f2e33e1c83408de9396dd7ce6c2eb86d54c387db958e4fcb15b185f8e8ba70fb6d56f0b44a110bc42b5ed63265ff8757ad4cd604ce917e3028a1efff72b477633b644113a79905f8f1192bfa383eeec556b213dd6a9b4908d835775a067eb9db539b5506ecd2f38d476e9337871d04338bd379a70bc3a24f254b4b45c22fe193664e8d9a106e9e6ac86d7dd408712561c727830599ac12ee3fc2a713ddd9e443943a80f22928d94e34b8227e3c91bfde0263011fa8c71f2019f33bc7cdc1ee194d4e2d75a683f984294d5ac67fcca5ac7e40e5f9eb309f193654bb1d2bd858e7821285c4eb4f66d844b00309d2deef37f3da896d52859caeb75743203df0e0a2206315a141dfffcdb5ef69d7506cd9ad060f566c778c86a9f3cb2b4b65ca641e7015704c374782ecf65ee224fd09e291d58d119fabfcf89e51f901cf0a172368076177263dad6d35d6ae34e9b1e0f0d5d137c8c4d787b78b4579aaab17846afbaf095a0d3ae60ddaeaf144a9643bf9e471a1bb82c30ef3f7c44e1f7a24c2ebb01701503b816b1e0bd438419003cc54fc18336ca3726e00f961e7a02cad8e903632583a3de253aefc27d7bf3098a27a3d34c38cde80917fdc241ff49a9c969f0fbcdecd2b53abdbc4e4803a4e98b64f8b947f3e0f4eff30f54a90cfc54f55497f89f036ab882d315553b6c01c536eb25cda219036cdfe4a2d56ac33051ab86818ebc9d99f11a67a69f17c870e7c2a1e35776c467d93af110581e49374b468d3c9d3c354bfac13910632a6f7a73c260059edfef61e6ae33b4af2c46f2ff992bbdde386911129b5d51f07c7d6e02507285a0eefadb413e583446ed6944e10fd891d1a17aa83514b97abc794f19e47e1a5f68132a60ce7821255756e28c4c453ee5c656d006559b8ab638dd0a88f0fa0b39e2c626b158eae4f4b1c3e73364c6bb50beae74fd0a71df9e345e14dd1dd2efdf94e27bf258530a2b5b012f47de10e27ef990956878911de4c47699344cb6e190bc791961804c92f6a6587a265a62fa9d714e04f0245e7943e81b0799f9a1f313950dd59b158c8c0ca7d707400ff67da298a8b757076e81cd64ff9207d0aea9a6dca5e57b61229fd6056c1bdde63d9b5910d5496017ab947c972cb1843f197cb6d9ad677daea885f1a8b381fe5253b54b41d978370baf651b306e9f4096e0596b6d75dab79c8c89fbb49605497454e26efb4ba67822237c7b13f0dbcb482f1f02fddca266cc570fb3ccd7f80161a26da98a665abd20c1b5fbddfda85b5cbb25f73b02880121120d65a5c8af1b9ffd5424e951bcbdd975be5ec0938e1e259bb10021bb38e51ea38aab4a3a0452234ecb6df9c71c01f10f9df1b0b4d7a0ca9e81d98f4bc28b2565267cab91d356677cb76bf2736b1eafd729022b1e1341441b46db81091a5588f392864aa27e0e6921341e67f8c08c0e678ca5f6fe94b4bf372569b79298dfc79a13e32b926adca4fb10329424d403621bc7ceb2cbf39ba33a342a3cce79f06db803115a9380ff5c074d63ddad866c36842eb51b298927a007031448335cec4dc650459cb0adfebfd0a3afa4b559615245e88a4729f7cb7ffc104547b6c5df2bc3fc0838446225c016fb58e57ef13ef5fb708353c69e06aa9e51af124c9d170c299b27d8f01410ae1df5b73cfa9ac4b7d9172a3b9a28328a17af92a32ab049ada7d8edf21dbd48e82063de4a3ac144b0d17f08d450fd6a4c5285c7cbcd2d4def67f0b7490a59f3312bcc0995757865bc66219d2736cf83a2a925d9bc4d2a6328b335d05b806a8a823deae553f6f6701264c8a1a5900f0a837853f067c41e0fab778c9de61975ab60142c9fd73b15367c0b14a2e82b755a148dc88d0056657ffe49ef21cdc883f3190c35c56b9cd378dd8ef9e106967bc53571b0142cf0c0858b30edc8000da1eb699c5bfde4e9d1f2e7fc3d94a916e3c358b82c25a8fad21fc0bd258645d8600562a4298542f6d7e31e23fd6064542d3b9c06d1c67103a48febbace43eba155a7a447dd840d594e328c49283c07f222d25b512863b7e7210455ec32a1d6959a49456eea316081c41bc916028ce42a4c55a5ed2c901f1a9bd14e452f01731b4ca2df1077c1bef36c753c5da39f459a7b2b465dcfaa2e6e443a4839b5e8672a0be2b75adf2a2c8e9b7cb00c767587e741da626f7541d53fb6c61fb54aad2b047d00f65330ba24d04c37a205bbd19905779aca35764e71e56c2e38b28973cdf2ca184e36ac72686f9d64ec1505a5da11b6fc7884a142cc1946d011439e7d909e21d6a7c64a41bff550fdaff8bcc287a3df9df72cb4dfdf7209bb6a6fccc9326532f0960e35ff20bf4b449ccd9be7408a94eb91ebe5e26b09dd452734e700f9deb3b7b6984c44eb721867f81d3310548fbcf88c085c7fa62ccd388581dab4d966dcb23ae3a1090ffe66ae1030671fceca0362d503b6a8915c4b855b2023ef610cea494614fa1b6027863ee91beed489825742d53d842dbfcca98e68fd520f2dcf9f83dd1b535e7012ee6758ced513b7566c376474caa18d60a002f1778ef90965c0d180575adca068ba87eae9fa7894b43976031780192869cd4131f70f95271596edc57bf2ac526b2678313f9241552579efd7e914b3d26c2f586338a59ae2636ec47f00b1a461e515916168a3816d142b84142be7f14de6ab855b7d30b30e641974478c61d852cd8d385eee8baabe15134ac672cbe85a3a8856fd0125e6d4836c5778e482efe06c3903983f77615e8937e034d18b34aa18f34b0be510588194c122f1b6c746d00de6645eabeda5f1b762d3484463c6bf1c7c1413ff0c59da9d75102c2b95e2347f06f186864348d627a412aa78847e95ca985478f84dc3dac6681d808887319441302b8c9825b094f8cf7388ef929606f21dffdf4d96a9e93e80559d67ec9e8ccb9ee785f213f35387fc47400e25dc4d1bc83d7ed8c355e99b263096d547f5ec23ad3b9d5be03a4a7c04004d514bbb20debae908de4197b792c7fc0787ce90650160fedd90347c63a608e13bd8041931ecf79350a29161f948545f34baed613dbbded887b00b7d98b7eac890c4c5fd1f27e61dc2f2c9ba4bc0c2dc1dafc0bfb499f0e6404b342bb009d102cf71f60f2b51d4e1522a12fa33048b77f9ac9c0a008084e7cbbfd3426510a92b186174de1ec7716b99ba2b5669d52c5c8764861e047d2cfd23b8e0442a03a12613cf10fb573950c0145de4c35186a59d241fba953e8ba0fe1fd9a6bd0596ab210d4f0de5dc886b38e4ada424cc9dfc01a89226db83ab3857fff744db404effa98672a6c3dac49ee67117e4c4a19ebade5b62ec0c7d91727782732f54e21c98d09e7886f00ec42891d1a4b22a39036c05a74de4ae0f4c72d570a0ae9d2f6eb55e0e3d4e52e7fc2d3ad6862f34641623c036cd172d19af7d7dae935d72aeca5a1aa5221287630e363820d6118663d3f5ddbb67452e28c77d3243f6aba8607bcc1a7b81dcde00e3aedea562224a79607acf8c5760b61d4b801ef5f95c593460192d483528263b7667b6782fbf3da5084fd3be320f19e0d2391359f70756e24c8e48934466406c0c1446c98f591064d2963288272cbc89957e5a7ab898efb4cd3e13ac3d7c92141ccc6a6bb8f8118cf2748dfd0646aabd94c8167cf5d00cf12a8276a0d2413dd63e8e405dffb331a16392377cc820f50b66b633d612c090dbde7443a0710328ad3fb79a12f1394c3adb9da4536830e88f3e8ae60fc35211957772e7801302db2dc38d0c87d94bca5130c7e47f04210b3280aabe19c8c0dd450ba130533ef329d515b881585d3f8f9b06433187e251f437cb2046a9b21b5554fa68223d467daeb263c3666c457f373a3ccc88cc9954eb0b821b323828c58c9fb8f1d9092bbf12f8fba061e1ad08a76d281f5ce9f56f5b66c06c2389eaf746f8bbab82210dc82b374a219a4f5fece714337c4ae0441d1643020af7d3953c39527bca5adb181ee458de80929937d0581dae29ee3aad8e654c1a8ea6fbccf4a2679fc6c75bf338f69633d88fcf2d6e2b3923efb864d823efa5a2b8b86f55d233c922d87a7028047702e6a992e7aa143377799be0d4b5f36541c6e8419b765f42942480a51cd5623061ad58df4ba72403966f7e5bd95b4a0d271ca57403cb7552499e013ec7cea6cb6bc3ac16823b925d2ce9eeec1413240b5c511ac27793c4eb7c02e3533dd31accb65252de6c1869f10076c341026ab68a5089948af58650c05c077174fae17959d02a5b19eaa946692b4cda1c0ec6e6aeffaf055e210cf0224385391f69bb76da5c3db9b0cf7cdbc9d8a696931a48ce542b7484cc77c3d1cdd25e8f4a0da7335f3c57c5eb88df6e20cd1c5a5a7d023da65d43cbc6974bf2f854dd09f8ca0dcadb0220bc58d69a5781fc0a1021cb6e357c9a6cb88e4833a6c053c904d9ba29c8324da93d45720e8556d5a0a5ff01ca6e91ea81cc371d1f15dcaacc1e033f09ad0fbdbeccc69bf3fafd15758af2e47dd2842a2cafb7d742baa38858bab449676d91a5b65353ca854bb847cb35679a06ffabc7e7aa86ed70e667195f7f290867f2c4b2ba9ce90bd821e738db9ed8dfd3c8b5548c2bd0cf2c3c17d7add97e631597ef155fd8c9cfabba9b107dc27b647db41c20144533d95e3335b79a77a809afaea900e61bbe1f346875d59524fc1c427e6936d42d1303839720b103cb74f00dfcc878bcddf289ce11d081814748a23293457a38be77c46d09aa56558da1844d381bcf947a5f3de1ad42ff80356eed96975dbc22f67dbc0c7afa786a3800f7a88ff04202b3be1abccc6da3e3fb870218e013fd3e77580adbb4c9139c8caa59d323769ca02c17bc900d1a083d2ab85cf6f90242fa07e0741bd1e4f8450a477f8d87e0c7a1ecd3b453a8a6587958362d1e2150a94c10b4c34cc204f6597b5dce094566bb12df6c8c9fe5c76e0b9d6bbf3acacda43220ebebb6c9f46e586abb7ac2580a3248579f3580a39558c1171f94021aee86846a53f261ff08a62aa5e8d6c2b23605ab87360464d2e9210566b205d66d85cbd64443a541cfe42ce8c0abaf08b7262f8b0764634df90efb70306e8772d15cc630a7f98fe379913786919ee38ec021c0b753a8cec6b1be16a79eded1ec8894a1b2b28ec97690e4cbccb5d2a8c69a8550594c4bcf082770d94edd3f8e5c8ad6d5b6287481977c3607b30a8632c104a1b9f3b56400389ef633f29ffa52a400598696ed856be2f968f47033e7a80f345e1f83b7745b9feb6f433797300389cab06afb8caa6df6963dac2a18eaa46b53bd945f5d8c4f51f782909b0059e3dbfa733095b403313537fcb915632ca28efc1ee5f1190665a841ee876717edf4d257ac7e1bb6ae78459469fe5e03ea183bc15e4c4b3dce6fb65966060a9c246bcbdb1905c109156014b80d8be4ad01325ea6bd2761833b92cf66c4116d56c24a9a3545419fc7cce2d482ca2f0c5609475da49ce90486779204a184191e8cf0863f4862e32d2d09504727c2b49cba72a0162707daaf4677448ed89458558c2d2d48aa02fd8b1f9b8b64ae8dfa84d9bf23d9910d6ee1a8830ae2ec7232012748726c2698633ca1813e6372c37ae974c7e39ab5ef3f1ef451ae65539ba5fb336cb2fe3bc7f0f95f0a59efa4cde2a59409c5025c17f29455ac147f97472d79083fb6909a898a7326828856c710c3ad0414a86dc4e2860d5daa8d0ad47cac91040ccfccab201d136875825e32628c5cd2f6cbf31b3ff70e7e79c3183e6a3c7d07019ce009d8f06dbd80477492ce55d2d2c85a970813121692b589339917f8bff77a8aff019805a05cb1bfe565b024f01b3c52312379ee4f53510f4fbf631f093e62637318485e9fa67552e17f16b16387423a6678ca7a89e30e35fb1e532bfb47977769820166879c1d5c09897ae07737c25be80979f2ec46880a5f37aead6b046f3d2bab11d9f764eba2837dc7700c0d5a699149ba44b5e4c7b30620f015eb6b3f71b9b2ccdbe5c8b32d8f2cb08d2c3136cc69a101b636087139920385b58df4fb0ad1e92f29a9b60e1ed5b8554a398df40688ee4a467b637805e29d589d001de29a39575483a2c11770db1a3e39825199e0ce0135a638896c0e74c0b42eeee635dfdc36b1cf939ebec13a9d9a9c736f9349f51eecc414724ef342d16f7997560ea58f752e89a5a8a7837a61dee83620d12cef7ee44005fbf9899e4a6bc150f43146a4360772205d9c35c1d9a493bf5de49ec2cd644515631ea2233962c5404e035657517caf15df8b90d84de868c366371d11ace09e04cec6fe2ec007a15b757d4fe7d056b98a741bc05f5988e00a3f51cf2030231002c572c8e5937564137f4056b0713ac74107c70d686c202edb2e2afcfd6149323ab4bef9337deabaa104ae5cf527c8a5e2a4919f224a2e05f93f902561bc8c69136b9c88efdbd83a1fa215411899901d1b00462cb88b884be8c09b7b62b2ddb8b69e1b4ea51f4539d67af1b3e2a2d65549ee46c7dd1925349ac5339aa7274e7ef465c2ee724e743a60b032f929cf21dd65ebef253cb62f7cb0a5a2c2a4f34b62abbd7545b783ea5926ee9dd687e4a0412e938500497470c4d97b3a03bf64ab039704f212516ab943cee137411b585c630429b670c43b024190a609ff98ba812ad381d3f399c51e99f6bbc19b43d438ea9114aa6fa6465939b1499f4798aacf8b6fda2edf49eb72da66b0459811b7c989025ca4d5eaa69912f9cbdf7abddcfb67279bb9aff54467308079b30eb995f3fc9231337d54be3dde6c59e9963d6d1d8eafb68279e9ce94ae4dd48c5aa7b35ee34564f06bf2c50ca71f5f0836e76e168e14fe3aaeb59b5ae90b01a211028db9eacaecd122ec4761f68e13bca442627e2352aa0d52e4510cf96046de253a51cbed07630a78dca4bf4b07eaca0388c45c23a4d908c3f1a87044c76d24c40f6156f33e87799ccc90bc801e2167e8fa7fb376100816d5d2f08facde413b82dbd5ca367fb9ac2eb39133535735632cf774d9eb509d82440888d2f37015caad31f7c8a4ea816f7d3584cd8f6e6b76e0fef8a4e8926018c17d686f7af73c65cefcc573755c08ec5b4b19d796a7499192655366477afcc51339982aaa5992aaacfc7293ce289c5b2950526735ab1b425ac942b2e87383d7202cb663ab6cf16d702fe58797003047eefd08d60c316f295d6675fcc3abe7bec85275743d76bdf5a70a380be97fd957b1c9668202b9997ebd75120281e9826ce9a3185fcc9559474a923ac4c29052b7651a6ce9710f30a424353004e42d8f370243fbcc1d80b083064ceea8f096790015de6d0c1b348fcc5be85dd2962aae563cce0b5d2f6bad5372c50a314a4dd0bf26139127078155aea42219a5189564e8d99a48422061c264e9e37958b557fc83e7f554b8dd9be548c4e958c8dee4988b4d304a32407265f52f7dd97197d04a7eb1a405d463d1e7b8f1d00416f04318887c58b9a39d678f712ac8fec89d8325b3583748ce1ff8c51c1bfe794085581287eda9d45cada83b1f3c0d6d15081ba1babc78952f5bdc2f89322808ed77159bdbe586eb51e5ffedda1e9ee2bcde3ff410a2abb6fbfc84970d7501749e8aee2c5bb72ae5d364cb28e44585cae5be90f7f634064d48f655b6c8dd2c776fd3a41fc6c084bb0e04f0f7b91d8dca59265ea9e2d7d94c233b32050d37d23e9dd35e36c0e24efbd764966507bb373638694eac7f1faf7ac9814445957b20e9e105e715596b0346cdde5205a0caff9a78bb66c63f1ef8f52c4203f8c879920d9fedbac324ba14d2c260da6a8cd4c3353df879627b615dabcbaf59e510eb9531d8f00b2de41e0fe881a1cfb026248d79f510a90c224214dfd5a79c983b714954fd86f2a3bdb41b67d73985f246e7fb8d504e74f9fa6a1faba4cd17dff12b62658586db59053cb13ff281cad17f5682cbffccd77d75b6d478804f8c4e3bd8edca589ba6e895341ef7114cfaf46af8404249e0109209c68587b70df0bc12ac92da0b3004cab8bafd2985d68b820552c6346a44f55828f5b26b041e19c40a602263e95360e19ee89600f88e57a91c962c99c94a388fbc89c28d44e5c6450219d224cd670ff068be9cc012819a1bca25109bfa69951e3b44d0a77e41a7e3e8232d54ce9b8020c0d2c23f688a848c00f4a1188fdb9a9043b1cb4a397e8b8393b5e41aba87f17dfe4d2164b4adc635281ea924ba31ba92d0dec558210dfed3a020f3125e687d77e7f170af6a1f2854cb4b9f84c20e5877f856018a003dcfbf6d3325cea2cb6962f02fbeb194e5a1aa52a733334568cfb43d8211eb0369fcfd19b0005376b541f61890508f0025e2fbd18168e14700c0646fd3185a525a8a839c102b988687a7cf53ea2983bf756192e4f32f6f1bfe8ac4195fff0df3d5880be808e80acc35c5ee7e34af5bf4d865ba990de4740ed193b886c04d0904917a961f79030be491e936ece6c2f8f1296846716737bbefc6b6454e6e32aa4005cae6dac17e6e3bb730f07939d7d1a924520a682643c360006a1577e01922d8dfc8027baca5fd08e20c473bbb446d6a5bf45f14c5273df8ac28f6262a2cf29304f5b68e59c3f4173b24cdb00680ecedb5e4a3d2334e9234b91b5be3e8f4724e5fe31047e78b8362623ff590949f7fb853afb70122b75b3e586ed961ab744fb9fd3de4fbc1734f7cc2f39620ef00ecc6ebe47f4f82eee77a1360abe831dd07742bb849c0d099f1ccf64b6e1bc8c20b8d031b65159c29b8ee49f12f3f2a446f728ab81a07f09d759aceef9d2cb3374b449763d7c43bce067049fa672e49aa2eb361be77576cb9dde3b63426f7866b2e8a0d1bc563d4213aa96b987991e3ce3f469c3441116fb39c0b950e71aea653c84e902c2419a42774ebe01f30f6686a73a3327aa1418fd71c525c10cc3eb648441325166dc92dc507d1122c78cd6194ec50f8648187f8e83820e88ae5057bf65f781e071ec3991cf7afc8fbe52bd34ba4d907691108da28c221e55f511beb04eb1cc16c387bcfac82dc77012d1a2a53e41347dc44730febfe2fd34d0929ad5b4ecc3522bf595a2f94bb6973a97510d3cdb7bd82501836e0250c6a51e8d38a0700fd22423e966b5c51a5a1b2d960cd81d245b8ad320aa030e4e9ea372eb49777109f874940248bb58f97ac92dd43135f3c3df1bc2854d7bfdac928a500de0efea03ab1d4d8afc93759b8c4e7fc5c5d6ea5a23abe343ea3741da4519fe5f9283f645e67c01aaa855e6da8f24321e13e3c7dd6613da0a1c12db662c2294aed6c7e285ea6e29f651530bfa5167759ac456589bb4713754dc61f20ac6f9700133d89476183df0543e825f47d0339568252c75e2d6728027bd2b4cd7dad04b903a35334c113d86dedf0a1e8501560efde8880eac643ac5b5216aba1965fd78eee9b3af5b771d2fba66a4b2823ee299e563861ecf87a38d77e4e1b75b1dc3b7c816745a25e38c35aa54b1d7940426700876100777071b392d3af44958f0e54e2619badebfb1012357ef6284f6edece5997b83473cdd68be9fff27743d398350435fd6b90a22b4cbfa3fc0f57ee51570d49474e1ca979130054723f32aa10e38b386586e61fbd782cf10300ed50e6392898100f81ec25553f958bee0b488f23036b2b61593adc2c3647218ca617cf2cd7eb570b067787bed1e2b716eb30297b5c44e164e43f580d99383a17c827bb75edd66dcce3144b5c24aa0bfde353148e6afe59df9ae462e696c63fa3cd0c32b15f6824cba2c5f7336bab100f77f586e7656d4325217127e2742d54c1e40a678ec80b4d19a4523a7c1f0e2c82206a99746a68d19f3241a9b0fbc02d0f70016c4ae6f9e15b9d359d117a8502bdcaa0b402f7c13da01b9283a4f7d84826871dee681b39bd8914cfe68afa848ce6567d57b873d01e893da164e1bbcdba21745ce603ed2dffbce4ec97bde484ccfa19033dcea486d61b8d1a5eba9b04b8e735dee70e86bb8647bea04458bf5659115b4f2dc6361c9c7e17d76447700c1f34fd07f61534f41c25a566c175d5892e16da6303fc3b46e2dd76eb990a18ca9af9b3760c53ea5936d8709b5eb1b5df741144c1b1b4a6ff1b625e063737f4b42d0f72c1c270beae6bb84b43ac51b3d0343fc0d14fbecfe12191131f38cd69233848070cb6f369550cbc36208094672025a466237a4bf20cba18ef731c465fa74b057669a20fca416cd0851838042a820781c2728ff3afa0046ee0d85800c57a5d04760e56a06379cfe65eed72039c4d4502558594a88bc4cea3e75555f00bfc29b7f053e819da2315f63e41b9692143becd14d4c8026e400e589a15105fa63adbae8389de86792b845374eed0205f60fb9ce705367924a5079fa2a3bfa78f9344bc03982816af6d5befa5adb42fc1c437e62b3ac4fddc04e1603e7b0ef7c55d453cf6731f4e8d7b0734460c6a85f7a5f1b231239dfaac3ba3b4bfe5c907c6a624a81660efb44aea1f8125b32f237454f526bdf0e7dd0ac8eb610a291eba1afff7e9d1ff17a2c0338e7de1fcbdfaef4f14e7870a28385433d1d81906ba2bc8566725cc39ecf7ec2680c66ddc93f2e26bfa82bd9ac8f04a0abc9d7a8773a8dfe95f9d5cea3bb771e807d391138a070e04d3417fe89e3b8f65365dce1f4864ef3c881f0b6691ba16838b3e69b92670f540b03562826dc92b02f4994b18d2708d2987e619ccac694408660ee4106bfb5f6ce645ee38b2240bea942d3b4f8dc9d3fa6f34f92827e189405cf146af15a2d655cdf420e9484b80ace4a27b4685a3dd99e5fecf6867dd17ecc6e9a6f2926629c79901e916ad5cbc2698c6fd8146664dcac6e6f91953b34593944d71c8152ded0841abac57e4a358dccba946362dd5c776755d83ff64c40de78489e5c3922af7769845c48c5b5bd1dfc4b7f0466bf9760d0b4ab17313278db13f9f978497e6e3242306fced4048064bb66e29955f4e85ec0bb9799ab0af865629e8ee6c389190923f6a15e424b2bc478dc1339e188ba7de6b2106642e21e0e31641a5a88e9ba270a75c43b3eb4a1aa80527e2691c2590a7f591365f701024b243654d838016ff74734cb0f559522d0f89e021c9cf517aa067aa1d5c15f000952ae9c80ece58533f15bcf8e5c59f65a99a116de416dda164d79b80dee2cdc79b24f8cf199cd28c4df96aac79b7431675d1d6581a09a5c78d2e8c5b603c86ee61efb16e76f7c15e00c320cf4b8122f91aa3a9082ed2ebb180d2a05c64509590ef7cc783900ab1bfaf544d5c571c40a8568104b5c51afaa749c9a46558e538eb29afc04254ff436ccf1525bd81d07425ef0b692e3992bdf888edb60e48f048e1d3e026b364c7e16323299d55f573e9533f59a055b07328746f03ad205f5f08781e5eaa32a24430670485aff84b4b097c4e974b9e912018f0cac0e01b3cc2325bc92e3bef008c3180b41f9b6e89d48ec97887a194402a72c6221aecb112bab656d3d3f76caf3c0d78c3a168f4e506f0cda79683552c65f852e46672499e5be0ddbadac6028d25365e8350d8ba68d1b5fb1a94eb112edf0d769f2e747de4ec31864e686a5cf0b2a9078d22026552e2392bc048118e37d3471753b1d39cc7a8cc8a0d1ddff9bdde7b8854305d8f5701dd191c718da751f42e9dc97ca0296972164818f5e1aece9cbfbdcdf29742ab8607e6c2db2dc8eaa9067705a178595ca23cc3b0058b22a6fd20c62002a781d9b82c9560ae24747517c995bd55ce99a8574f1f4b3a0551798133846e46b4c0711b998f5113bbc05609c8ece92229079cf6f3272e738d0a85558c20a5cc246781f80a20cbd1b5d524218cf65fde89f46dbf18caa3a70d71b4753d8564b1bf52deaef3f79392287135db9c2f7f10f168b1a6a69ab9edda7d97ec2be1f2d31c53418fc7aa4cd38a667c47d599ed91a79e97d9e94c9189577ba9ab08284143e6af3052f13048ca7f1aba8fca396474518302984c3a41667c89e7b56891ff96239dba70d565f4bce806faa492978b88033b674e0be4449a971cb7969617c2a6bacbffe9d089d28a873761aeea42e8128c9d8019bc6a7dd9df7b1c5f3cf934518dd88d3f46c1ff6eadd04c13564ad781dfb2d11ddf14c2f6d64141a3f23a614520db89b29a954d3a3086c03a50c49a362239f85c30cb00d7d7df4a321622010083dbaa0b7d70ea872622255a144a76b31826cff21e9dee779617818203bbe46e45540478ee249aaeb90357edcf78dbc0df1f61e4a03c48ecca82c40bfc5466eca3b8a0444d637e70b29904b24d70a65baefeaaea9580a26fba0b550a8702ef84b6eceb8210476fab43eb5c4048576a7e0b522ee30ee0caf3d372e863141a8bb85cc7eddffacbe38bfc120e9b9cd6cd1752dd53d01afdb7c91fcb10a905b98e2ad39654384a4f6a04babc9350869af7bf95179e932d180a48d4fcf26c063c4af15c9b4fb3d018b18be5aad507e8d30afffaa9abcbcf971b91fb424d6dcac8ce772e89396ef3cd1e634d32169264b9b3365ef409800a84a1dab8accd44ddc3c223d40a130342fbfae768bd30dcb503c480b488d784ec0ddcd8659fb8a12c584631a339cd73b99226b1e94a2859406edf14eaad36c09a05572f7350df3a5bf8e7765f286444cc67647b10ea05c05a3c380722dd8fbb97623a09b14de6fcb7d4a803255cc9cdf8b031265b42073723b25b722347a42a52bd2a3b67f5db29ea6411c9d04c9e130e8b2e43c70c1d4604980e5e704e705295d5b9906efb1e6500e355c397e5bea63e7716fa1296b92a3dbd39f5fa08de79290c67274fe794e595d08a5138099c5ec8d848431c41ef66da71e6dcadc047cecde82ff9419430482e6ee9af350b66f34677e1babc03dfa58c094bbe0475ca65b894b0f8d5b3c8bcbd4424c6d93407c3be00618e46e6764fb55fe755c2596849f45cd460e3473e87909fcbbb4d42ee4a0c83e54615878065d150b1996952fbb04834161a6a28f30e6a0bc204f6e4a820acf4f2717b97ff83243c51c87f7cf7dacf325157f28090f6c0dec0d7623f4e73beabcb6ab45ee01e27886e73c5a4fd29071021cc08501df672adec40926cb95fc0e558c66733f656c41f0cd784cf3d72edabd21e7aec647128d57942f5f793a1b441a323ba054a00e5edf40fccb1a9a0b786e477037bad04e5f360b5a561306b5c43db62ddd5b8b31e633803ea37f725bf4817514878be81ef6c23dc7ea0346eb0d4f1849039e2059ff6b608cdfe72cf90390ee6ff34371751e69fd9569a145f01c0c0b505db663d94a0beaaf2d9a2f76dc97fe87651359ca8cdf67d6bad5c7d0636c34233f87622665eb70c704eb838250af659b4484b3af4cf7e1b312acceaa74c5e80aae2b0c10ab0dfca3a1ad30ae3311fadcae4c6ef4060c95516d53fdb8179b9dfad7e4f3ca41b196542a913f87d19ae9020c547a4e437b71c7c676ce7f41927b765c7a8ff5daac4861a9e7d50cdbfca05c7dfa5c904cf9c45150c690c17ed1c7fc149fcfd3069afbdee51aa87ccc712a444f827c3b0e776741de609220098bc85c9a691c2cfe90e72384c4ba6a8f6292d982d0a8dc4032f475b880ad2bb23ec5ae315277b7cc08d3138ce7c7958b5dad1966d545e1de8eff4ad7b085aa279fe76d1deaf50f405689f8348e8690b95c6ca34fc003f67248ad3fabc4da2f8ecebdd04df62a9ecd8979b11e2b6248ec5a626b9f272ccef83e874ab3c6b737fae1ac12d0a192ed8d811730ef75380bf9e1cf057ba3ca6779b944e915fa3d40859b761d6e5fbaccaab112b6a94ff465318120d3093363df1424b1df07e24dd41689db5390884335c7a763983fd30d16b52aa793412e5fe7812a176a46513829ebbcf9075a3c7f95c722f3c8829c999060ec2c01a9e2f1798ecb63ad8d5652bbc178155aef518f90444b8812b411536d33200d402f366421071fed77a038d199fa4ac6cb8d6f4470ba5a5740b25a15bcf4876a52ea09b69048b0e93bf17f0e5e56d3e09622e4195bacf413cc3e6d9ddedfed024ca8944034fe2874438ae36a86de4cbf7857bdb5ca9fe3824ef4d80cd21a71882766535723c68093fbf59638ae85bdc7ca64f77af35f4559d9053eb2362b901d80541e5dcacce344f471cbed5978bc183edd0cca745764ee925a71aa49d4dcd9f96fb0437d60cc307d5ef8ec2b11100a0153717e716cd9fc3792b99db21a3b99008c765777cdda8cb5841a894faec47a3ed51e3b218467b99a7772f6dab9b02cd96ae2f347b404b48dd70c1cebf01fdc9de012e8ee5b2c2221155660f313c727e3d0a681fe9f9c3518251a186b3974fc01bbcd26772e7146e0a43d9e87d308144730cc81df30d365308af18241ddbe401e50b4ab8723deab1d1f45834db460716a936e3f1c94a32c544c4cc14745d0f569d0db828c211c17400cfdd565cf07b78f5e19db5a2bc2b5cb4c1d13ec092976a3ff24a9d5d455ade036f4ad1dbc2c62e4ab9f39bd739fce0834c153c0b5014cf2381e9bc16be05445221feb75af99fc1953b0eb5abd778e5d4fd98a8c454d3d2ec933150b6e5fe410469379a3ff280833c3eabae117016c7b7e07c0d3bbf5107dc95c611b327d9f32f7d4603e5ae24f26667d3ca1a259eb150f6d93232954469cb0af0c9fb75fc1de5c88fff02559897bdb3e08660d8f193e1b36ce22e3d3172820788cf94c5315af1695e4fc2afdbcc4cf1d4acd0b0e038ff810f654704969425b63948f28f3f99a3b18631b3ac1100754500c9c0990bf60b3c0545279aa2e40cd30fc20950968b9ea9d8ef74de4060fea7f73d13c1d9a22eb5131f7c9280ef643253000f0a0dc36989629796faa310a162db70851d7dc9602f6e8c30e72b039b37b915b1c2ad9fd94283861c5b8a459595edc7f3e20644dbe56f6fb172db68bc5ce2257601925996f6ccba217fc8ec08b578757d0c8cb71c82262df975f9539eaf28688554cfb9027ab7083f88b8c3aa090649f7da599f01a7ac9d4313ac87da51be45c8cc735483db22a7bdbbcafcd42de4000a4f3adae96854bd1cd5edf46af81badcc7f9255afd6a9b81d04a6d64390fdd5adb3c8ebb3cfa168f32636d3f46dbff43b056033445ec4bc2471d8c6aef6fe3b7211d6636a5815ad78d8b1f5a10f3ae70afb5ed7cd19ba127bb3171a0df6cd0f26b7dd1ddc74c678db9e0b5fbd4f8fd2c0849c10d5e464f8daa0112cc97c4fae01b8894afc06ceb25f8fc4552632e3b454c3fc600e4bc3aef6b3cc98a7497ead696d4775d3e88006e7aa1c7b13d278e02862977773125bae868a9809b26ed131beefebf7fe677aebc04c8ba68ddd00b19e0e24ea69af6b1564678e7f07d5f219709f688e38c376b47ebbc7878014382c95f876ff19ccf0b92eb0a13d0eb8c57ac29f8ffc23b1fdae979f61513dced5a7e6550d9de0ca7489c17040b42528bd253457e8f7acd9dc9d6083e9edd172cacea2dfa9a95739b320a3d38310a18782338af093c7935772183959a981a500ce9f53530177c8610bc5b3aef050850eecccd9dc414c633ec798d8f3ec3a61893e3f15f17604fcbdc22995f4c701404843acbc4c3462ef107a42548bdab24ab24eb6a9ffe82c457b17abab42e7024e95db1011b854cfa64779accd3cdb60db3684f9fa468d1151fd22e9235439f993a8f81e435b582f78d08d37ba8693e28e6186d0ae93dd53c25a8cec1a8db64dfc0905e622b5f48fc58bb5bb59ce6b1a98953c79893794f0dbdd0a3fe274f5dbc8941887b70724afe6cc4d9642dba8666bc93c205d88b8cd8885b8a15c314bb2e8f9ce3555da790d06dd0d63e05a1473d2058a882d5ebb4ddd84344b9b147c858c3a6e0d79798746b97ad1e9615c35678ce7a27c0097a379c8c195d7360ffcb9262f5df4927250619153330bdad318735321e0e28c934a940a562d545a37bf24fe05ea07f318cf0a048df7b54618aafc7ef8228f9bb8a828af1219111a479ae57cbb604a850489ec7a41462fc8689bef5fc7d32b76ef31e538f7a5227b1c33fd6ea4718de39033910afcb5379262def1e27a30d4312542d665bd82bc833a818076e7e7d28a5b68894e3e26d7078aac7efa13eb39fccb99d1f24ec2d0c745de8b1502b09daec869c22cfb69d901ca1f2ad1291870d357ea240d48ae9c2889a657d0432eed397ef740ce1dc24577ec5a8fca646db539c172d9317e690de9736910144ee5dc0ae932b2efff275b9e2142abe702d0d78707ac1e12776226cc16aa54c19a6c225bb79384c8f367db237dc3a53955330b7aa905aeb4ed95d3ada82f7a73f3b6e3945dec7a2bbe0baf4578af4bac43c74d742db2397450a1d1e902e6fcdff9a89f88907eeb2f17152c756e21bb97c576b3c49c8338ab41a595ef224eb9f3a0ff2216cc1f1da72b8889a42078043768b632db03d8a0d517f85e95ac7ed4a5af86c3dfd16d74dd1cc6498a32dec157cfa2cc07f49564b15da8dc1765b473d2419f5b8c201363ab7db7a5f4ab62e7542e6f2ad10239c06e52cf1037b772a5d14616c071821b4ba6d8c642be77a14db5d1230a5f48eeae5167b35b8c31341ee9034baa3e8258c85528abbd14e8fbb89493ac14c5e3c0153ec5bad80804abaa298ea55060eed511ae5f02d48831615f546837f73373d67788c52d7786869179c3535d276d595e65b4e1bb36cfeaa62eeed3e2d9379ebb450d75c97879b30a9f5e928f83d39c0faf1e07534f308f7155ac70bc8d348dc019011a22401ba792738fdea51a6851ffdef39ed9816401add0f46c0f0c416e657324a8d598da257fb0109f0c983557ef9eae65d2b5010395ff4e0703215df0d6c3054c8ee37813106c079139c31b51125a2892db2faebe4d80c719895bbdca7addc4e3d4cffefc0f57374302f06126e0c89e4e2906043d0cd75c8b9c9c92348c185b80b38d9e8d04deb79942b35d82fa727a34d0b96ff2cea12dd9cfdf436bc8bec3ea27a1ac18ef0f6d4bd315b45421d918d6dfbe5b2fa65ab7972b178a322b90801b66c113149d6c4164d0bf884e3739c1384dfda9ae8cea92e95c343f4cbb72dec2ea6d0b9a88fcdfc32fd62369561e1753ad94d30ad08ec20934b9fa03679f0ec25d2364ea4854789da784345ef42ed294bf6c064309d3d2c47269c7a4f0dda0b1445a6fe49265e8f9e46ddb2d17eb3e5ac85c3f3ea5a1c6fdeaf75601eba12b5a85b96490c93f8232127c159a994c107bbbf3ae43fdac0429edc819edc51af73bb82629961e228679adcbf4ab7f7b56bf362bae7dffb242d206248ac3ea8850084b9e87c642815351afaa522c5b0803644c8f277e675db915116fcbe0e869c32673fd3e92a6e2451101e64a2bc05e3f991da5a0b886c0c1238f4c7725b24dd631f027c38f4aaf2c6643dfdd7cc961fe03459afe059dba5bc35cb71376e76611769e3333f81f604fcee4248c35ad649e3a1187b81fc1b502cfac75363d35280579d983d12bf9a5f91d88869b3361f1244d8fcd6829598ea4b2577dcbe7bf80bf71aefe3d290a6f9dfcbadffa944f0f9a3a655f962423a084f179234d66a0899ec7dec5cd1af9ebb265fc12673b1bfc4c777cf41d7bcd3b539f6231fead70b6b79bb21d9fc77ef6a02913ef88507488586c7c7cda781f07c8e6d1385f37e8da1a3f9b6b731f977b226ab4f840bdfc8a91f614550bccb1099c8587c12981889710b9a576ecb241cbcf217a523bb23c1b26e6180f7e0b3768d64d212a158c59ff1345bd538539d2efac99293d3321a786988068ccb02d5410fda349568a5cb688afd1bda7820cd16ee0f249ea0242ae316dfdab80f90f09d7e0023684347b299b9580562921aa6b15009f0a9bb911e8d6d609de9e3df0a8cb6a7675e30e76594c4528bc8c7c3575b2b3e8794577cb42d6e845a6fdecf462c106210fc7275f051e4cd42b4304f3f6dfc7690b3aba7549865bc683fcc1a45a5105b9f08cd34911cfbd423db8d6ce503e2d916e83205578b9ba94c733406c50d79508ad9472d0a291cb6505f706d5e9c2ca24b5fa5b77a1e9ea2c5f390a1cda2ac76b8adf3e8e4d387ce408e1a3b970fc7bbac9493d2961bb4dff6e44ee682b175454e133cfa74f2c679afe605351ac6e0e3d3656477fa2cb72f1bcb9f8686ed3dec9cadd1e3ede3efc1462437716dc67936f3ace31d033f92ddaeaeaf219acfda4e21e67f2fd81a75216d69e1ca7a8f1e56232d21e366b9c2008819273d944daa34ec3e0629283c1b11657f66947a4bfd6fe4cf40c12db5e3fbbc8d60deff8d99acf4997322c685a06bf3d7fdb5a5b3d0a7e92083c8716a5a2a876dd3a0181a858b9de4c4f027ea33f70113560ecf41d37f33a7fd0fa85bcfb77253a519bb645457787528fcc78181fbb2aa5552a630f1ebf5443fe984b3f5d45a0c13caf4ceb2906b11a48481eed5ee6259c73e62373451cbb5769d03760a123fd8bb01018c1cd780e1fd6b602d4326d251ff417913e3e935cac37d5cd109d95872f3cf5e7a11c73c7338f5d55300f7ee45aa757c164f985d1e5841d58337b137b7e047dee7233b0f6a1e104bd04537b99722e63f86b7fa6421186e40c4b0f8b8d51df25b9cfdb7c78a393794431e97ca8584b9fa7102e7c9f7eb0aa425cabdd49293953b90cb73a091a300e57d235ca251b0f8ffe177ae4243ba4b1b4ee085e3ab07acf5cd296deb39bae17cdd2ac65284eb35f0bb4158e33e66f80d7632156e3679b44b6d24773902e4e6d08033f7fec7d165c6b1b467c76da00623d1366828d0a2ec4b55b6197d24d6bee204763ffc5d226798b36258759e537e80adfa492e06b7a41f1c782fa2712d3fa20aee100e35001cb788486dacf0628637b320aac4de22715fd0fc6e36697b6f85184ae4fde5d2f0d419938756af3796b759c1de74983927b54fe14aa8cf9eacf98b213f02176371de3d766abbe52cc5b2f784ad158bc2413d2c77c3f0c83936de2fc1e99193ca97dcf49f1a41cf42dd2e35582eae612f662b80a92a26ce6ac44a0f1cb35354be8d3f8b5aadc95737c339615cb27f4147f504a767569379d31c8549ca862bb783c6974598fa253098726e7e5166f8ec469a8f39c0f3d37c6b8f22f4dc4f36b6c19aeaae3309a3d7d5215f99898211c08659b01b3a85c061d82c0bb079070f2ba22b31798c63cf078c0b06401e38d76e9683deb3b1719ede4dab2986af89128ec2cae9bb78a5203b229693d498676d4ad08072ae85e5810e1a84f4a2269c728175f7a5b93507ea0a62ff925758a9784104753a225bf13f0b3b19e13399ab330fea31631eb88b269e627d974851a1a782ae0e39b24dfd73540e6ade3d5ffad53d4cc22ac793cb5af2108ca68e7ef229dd0235b4a53fb47d3e4920e523c753efd162365a2cfdea5f878a74e6d28924309734ac2e591b69870aed655ab1f44a64325aa4950e13d70d6c67e2c6f1d4b04f4c6a50553a177142bd82c9b0d9bf9570a7ffc5d09e73c590ddeceef40f0c36481c52d745c8e0997a33525fe94609277f4d583d278737b790af638680fc59b525cc9b1437a1b8c155d60a11f98f16762275ac6ff71e1833caabf6228e6e9ec3421d5640b2b6b9f126bc20da2f4f1f027ddeca6de507b9ee04edc340744c2a161984c9346dc6c1c2870d816b16be8d606c722c18ceafdf0f946b19fa0bfe0aea7c0aa0fd662ce9985ec444c7a0efe1bf83f407dcc0d5924f083d197d2bb00c4c6a9fe4a7e0374736adc8efcacba8e0b274f99138593cf647fa07728402cd2c9f21e391d670bb908ada6a555fea69c78717aff7940ffd8323637ca0fd269c98e552195f89df8fa6b385b847fa9ff785de9682721abaf6625fa88e455321765598a32a5a2903231cc87418ef7e89233485655307b189f6e708173ddb450159cb2246fcf94945293772eb77eec7f8da31fb350b77ffeb3ddbcd7b74675df87659f257942d561fc8f74515e06bc32471bb5ad5420c577a153a1db90de97d5e98cac8732ad70934696542b9c6ffc491f19472826ff51c1574ad5c2996dc2ef3144a4b74743bc2bb373128767e4ad12698791bb07cafcbd048b0a94040b6b2b072681148ad82e0cb848844a672f485f685d482f3c400b73a41233aa20412a4b059a36751a1def7fd75527e760125b045eb3e103592ec68c21c8db3631ccf15911cd32a063442caf4823d2e9f68b605aa49b64eb687ae1d705a62ebb93ed221dbeaf12d4e4a0f52e30c5276db7a631bfdb528a4ddea1ebc4ba392191368d24a9c0acdc40ccfe8c6f683e7da57aab47142799dfc2551373ec599a4e635fa326ce74093b8961c71e49da43405611d1943d7846bc9b280e33870d39feb0c1a435a471229b484037627a65e2d45a43c348a5ec6bd75acff164f4002de34de5ea9d062ef6ca8a6231e32259c94d201e9b46b73994f63414274635e1dc31e1dc52e413b5afaa4efb789e447c3b592793226b6629f5b696150dfe70ed27c4674c8c46af6a23cc0a215c2848a6e83a86667d03a626a4b79d1894526f977026b0bfd2ca00e06f66274819cd7ce731b1676d91fdf0d91f7c9c2b700521b42a92de500b64f1b734d8808d89f98e419a32871cc86cc2d5c0369a980d47173ccf0cea9e8094b29b110fe7d0d9c113f06506b86603f71d53e34ad127b167079c571c2014b746353f5f8fa19f5c8b0441aa5960ebdf9e05fedbbe31326ed24d95a2c49e7c1349b3755483e4eebeb53cfd4f98f8749e2905d20906da83dc6865ae64cbd8ec4df62656092d60a6299ffb60caff8dc74e10a8069783a60eb8897233869217f8ea19cc6f0a53b3fa198666a4849741bf1585010cbbe69c6cd467bbc61033f536350daa0e6ec3f397fa9a04144879cbbea89624978f097e320eda28810ee5e21d715e07909dd5299cc70a42b91c9af36d58e5aabeca4b3c122478c9a2fc2aa3234511ecc644e7d06147ebf192661217c844ae3227f07a7fcda1ab4fd3b3a9cd3790acab70192d5a1aa2b8c35d413aaa7a942ada3fcb391ff8465791f2e70f4e8928d755b96cd4ab386283d1ec5ccdaf93c961ca8e4481ad8a93da0979a1f2e59c3c3a42d0b85e9cab27051812dcaf42808d97a90de444ea4464825568520ea5b350bd8d8c9c5479e89791f716f8db0f5b8e6e2696927d4ee0c8eab6cb68ee768112f59621f7e984c55440b2c46a76d98a47b3705e6cdd82127e7194c8809794337dcb7ee315f1702404bcf2fce005f5b0cf82be85b637e65fb59bf83e98720ec707fdae1b2687e66cb2d943e2f74fcce7052bc9b049380cbe143d10fae56148afd70350ed5c3803d7197b9590866c5d51b8b24db6035e3b061841ae70369a79cc316fd44987f6d8859845bc653636b8f59d718c5b124ced373e33ca15f0952eb2a3726df5f320e971df66f0d9ab5d84f13d81ca20296e518bac05fc382139c53d9fad929be908af23a4f74ee8c10a79f41d19d21df49bca53312102773908f37c82c97df31ad2163edf8b54079a25e70fd2196fee59e06db2d07c40ba50253fe44591aff4ca4affd8612769b182172ed5c723f4ae5ec9871845563bcb1da284d54a936a1b935bbfabcb1c537df61144c4e697b508baad159a1d281d71fe967376043336bdfdfa9f072c54bec635b0320a60c98c4e72254b1064a53522b3590fd7744d5c6d66255aa2d715bce63c16978f477955a90e8b0e0cf5d57444b0202f68b8386e71d235a1303dbd40fc18862357d06d725432bb7998f3e9f0fd265affc119f4bd45b3209ad0c2a6a244ddc21d2c469847eab2705ccd02fe649527007fba67d3e131c57d5d44f6421e04bb7edea01ec6bfc07b8bb8312fd5ae627f3d02cc87cd36ed7b0276fc997854fefd7f545dbb4ac555d04844eeb180504f34c9b1cb7edb5953af0a66f25866ca7eef1e80bdb768cccbbff3ebcff708f1e6bf7806f06982ae287a1122532b2465f1e13cf8bfdb824876dbdc4c1a966ed9f76bab512722b8ddee7c8892f9b55bf40ae7da66440e4633768278392a17c578c3725b37be83cf51c9f64f13b92e6ea581f204079ae00e8966545b38e8c8bcdfbec4d32d5694feb871662ef6778f658e556bdc2c5e8dc6cc189d6c050bf7ab45e39543012c015e863ca50aff19221e25a96d2bbcaa84548061cb0e0e2a3b0b838e14ab52aeaff6712dae57e63aafecc8293f10b094df8ab0f4442ef69fcc6399f3ebe613645a8ff61b8315d9b8d9843708b8fe96fa54256752291f123dfae1271b74f20c237471d3e7e106f80e710a1581a28b10a3890b38c3d5f2efc93719f473b1d25996cb498bbdbb3fd87fc4076af5523452abd588b7643c76ca59690a6bf385fee914a99ee56aa0fc0110417a2393fa9aa645d994fe45605a166d562819c6b58200c860126dc38fc77050e445918d767eebc77a9929948820fae36ee93190a192b52193cef214e34a16f94d27e6e59d0a120a285cdad6fc43d0c04b71083ed8b075a3950106ac40d756537aabbbc34ffca01475d1b63c5cc3a8ba95ff9964e21c7ef4bd4c8268cb8d8b746fcb8d5dc47a301f72abe5f7e19bc39f3b1d0132e9bd6548895fff610054804867893b71e275eede526496aa2801188822f404ee1a549115dac05d9cf432f66b40548a4c9bcf1c25416079e33e1cd2d7b9d8870aef54bd1bc6f440cce48722d73f05a1658f9491cd748243aa1ee5cf111dd013c4ab787abaaec28e2b49782b586d038d837d0e34fdea3a2d1cda39237aadc85952cfa9aa979d5cf25ddf6fb0dd1477be763e8986b056a376180faf93884d4ea9a83eb906961f8e5c655c0b4191367f88614f39169a24bbdcfc73b51b2ba8be79c65bf49a1b18e67fa6b8b6e1c1ef09a4902cd10a51ac3327728f9868d82d65e497657c44a8460452fd47728b9e2648ace3fef89ccfe8869f48ed8a5f72b1712866c30838bc78d090e10fa6aac002b4a2c55d0a9b4152449064626c94f8ce6f27d81d907e0ea266389b0da79f86fc4869b52728e622b398cdba3137d40a86c0e782672e721355f00d875e963e3e8ddb4b5eb308f5ad12172a5d24099c3bb29a120a378044d35579166b7c8e511fca757140db8e509a0eb20197e68d9f324b4277d014967610410a1fdbffa61416743d6ee9a59c152b3ea6ae193c28439f967987389e9461be81f937ad9a33b75d46afb5bc8c60768d78cf1339dd9724fbb5aad874a010b0c70e70307e3cc7e0ea8dea1e4ca3bc3987188415380f02901c3aeba6e88c38e224ab94234693f026a6535f6540214d3675979a1da549330a99a6c64d18e9e6cc42a2ade9fc59599776a370abd11002dd9919af97c67aa8c8f70eb0d0299ccb15b93acea24e27ee321cba83f3cf2336adbbc5177617bd6e35b4371655f53bf4b95059523260aef86eda2384a63bf1aabe130238aed38f306f10e558a7a5bb1d875a0e80bfa3a3a2b2f2151c106e1dd9388cf00bb994e4d7cab74149b3e81d64a355072435bdb72bdaee8cbfe0d12e91da4ec4d613fe93044b3187720bb00c1704e61ee3c2765a39b9bbf92fac2b110074a3cad7be790b372d225223668178b4f71a85485ac5370b9193874d6b7289c86d1e41cbbf0446f760604c131e57a14c9a053a4d34dda00b9cb844e2f9371c093d1f53c59f0b627005d5168cb0102bdd629fd4324b56532787ffb79296a128d4f49ed8a6ea5666f1f32e9d2f40731f839500d010de605094f229ad4667f039d6b24eb004b307088435653dd112baffbdd1e6d860f009b633f110422cf499d1a42d06cfdb0fa483528a096d5a12b74760838bd52bc88fcc868e9f7eeea8f02b762e825ed59533dbe5e46ac65e4d83043471caa13672c6b943449d01d8555cc1d01373852fe56b0b5ee987a7d676bf60cc3198b9b23d8c8cf285488c61ad2286174fdbb2981eed09a675d1cc7262644877afc84b843c4e929f36c1761bcabf2ab6e6bd866c658e9e4d16bd911e8c2386c4ab256f24c59c289c2e4357f8a7cede16f21cb2ca65ba69238f27c1919257fca139d57383f4cf7c7bba3066bea4815879204868f1cadba9e156871f46b684db9e3f108b1429bcebf41ced68cc06ab2239337b3b1ec5d9914015ef18c05d69f881fa283f598676f31907872d6e7455730f80cc7ef98ba442892ce03cdd939ea30179e175d87229e9592533e1b37bec0c63716b8739d6d1b9542ded71c686c8a4152012f76918f9e4219196cb1e0bf5ebc6032f67bc6249477a5f2c0b3707573b0e27a0b124e9f795835de1387df955c35e4774facf71015c513d7a29050cd6465519c4380b162bf0310eb99cfe7b3089fee44c63c148cbc352f48b123b30cef88056a033c7169fe64e1bf337e0af48968093fd4b16b02f9cd5e8d1679c3235b2299127b961268ca3f9711fcb1114fe19fca2cc8a03755b9a1c2f2a6725726eeec65253d2ebc48af048f2e21fd90ed4e43b722001ceea1b722814639fed77db5db174aa9c7734d8c061f12173ca668acb13f9edcfc364eb6fcc968dc2da6bfc914aa817c797fbaa0fa6b7fa0963c8c524f941773b65bb0d9852e61f80bb9d20dd34f10f63d86697848c02907b3244482391e759d825ccbcdc94ede790b5fea64778260944490404908d81a379c6ceb90ebe9deddbe7f9643dd1c3cd5e6da5cebc6b7440673f28aef1b65900227cbe009d12a8f2a9f4a7f1e0a63966f2f04b17d13bd9d01de8683edbe2a3b522f1512aee786290f9bebe297d9a5055103bd031c4f2aa19f32521ed2044eb203b0e26e3ec48b9a32b2c2d1c9d38c080b016b480a0f70e758974f0362af5b3c8e38bc17f1500ae5dac7b649c986c721239469e289a14803ee73d3aa1947bee0627610b95e54ad8317a24d9ce4eeb064b2715d9b00f375129ee20a58ebabe8583f4c3d0207616df142c2a84c5f5a04e2410e6d233ce4523e7f6259d2390c3d57e7941404202ef010b117c622c91e9d1c322e29b1f7b9c6f1ecbc3d03a889c2fec47fc6e825c06900643eaf505e2fb49bd96aa6b8645f500b177e4b2697360575c564dd4ac94db7116c71dc277e1562525b0cf1cff40cc7652b1cefa148ba706b822dccd3750a39ee414cad2a61832087343dcac150c92c56ec5f523951a0268ca81c11a3d973ea5849fff31a467e94834e3f7bc4ba455b3605137ec6a78189f9be56f5e0218c42892392073690d1d708e217d14a989e75df839fbd88341a83e9b24eba211235e5b9f6e772ae502c7be918f641ddc93dab2519dffaf8e085fce9a0b51d1e1e18589f32be27117fbd6a65b641065ea1a31f6fab857fb5feba64c9844d33d0f8a7290995242643e9afe4d09f6d71f7155f7416bfe498c66c0d5a9585c0a18248fe960be0cb4a512b6370e7a6eada0750e86fec8cf46f52fced349d2f0f8fcf0147b7f5f009cd913b136f9e1655be3c514ab6c009f260cfd3e3b8567522d6475249c8849b9ae29e5426b4f2c4d2306e9057f202a693b6e66c22529f1212f305865fea766e402c2b93f6a072ed2f8cb9f56428141c886f8100f5af698b5cd25f05dfb1f5d361955d1309b4da8a73118f5ba354b2b15934f72364f21844ef36bdc7be7c47d17869704d0ccfd1a5b4477de4f040d0c540359a5fc87d24d69580d2d67a781026f92c261b8e32c67221c976c2800abeee4eac24ea61ca651b3d17d1b62f0d49c27ba13d9dd2ea041cb9ac98b2024dcba32637991eee52ec66efa0d53b7324d5447684af99d0d5375361d84541788ac7bdaa2301317a06ea74fac76c9784b13b5b4b12dbc7b7bf4f5083ae1ebf2b6fcf5040fdf1044895f711b0d552711c15e4e03190563d8c565c27c7d1ff40f20fd8eec5c418396726daa95f9a9c0697cfe80e1961e633b283e977b98208dfeafb982c9de5553b6f7f93d833c571da7a6d29d013c4c62fb4b49716d54ebe4ae768a6a9e84de9ebe94d8a6ce4fa611be91525498c261435ab004e064a028586f23a1139feee40cbe9ed2e9165dc36663580771ca4eb84266d022289337a7225e0980a52b2c31323db7246033d23e1318300deca36ead2232740a362eb4d99f305180189a67d5057d2ffe5176258c03543e97477223236836fb5660325d551b72f74cfc47cca3655ff40661b854837211206b3e9c5ffca6ed9556faa9a055319c38648eae69b1aa2b08d4c27641e0d13a3962c250eda4defd548bb664f736bfaa169c2073b3dc4da143744b8e4bc442bd4fea4aa72387e680ac2cd948e2fc630db69acfad83429c0a14e7475d73339e41ec84730b2997ea3d8aa43aa8cccb90186a5b89e031c67b4130a12856db940dce7846ea0dc3c7f7e565111a43e26f29586bae6358668f3fd8ca0cfc4cb83433d21b59aef4dc9298a5c2c7bfe252d5b4655cb742f3ce898cd89b04b9099fc3e25fdc7c9ea4ff74819d71cbefb510901d24f46ecf83bfe24dca385a59e9a4d56992b27f57beee704d1485592cd9d15502835e1ebe4d158eb9f49552c497f8626866c5c9620880894a734c5fc8b4007f962b27e664546ac4640b3824892c6f4639843dd3b4808b485660e1ffc91a528b12b9cb3ba275c28068b9917e693401c2eabec2ab7baf833cca86c6119d4eeb9db45e6564138b61ff95bc4400b4715af9c649f0723d15df7678e1d89e95605dfa501d34fd9a0b6745bb8282bf6e5d6e746ce6c9de46cefc09b8975c6642873e8c72ea377537e7209af77a94c251b37a9e768d82b969c5979081bf3e5b8f60d5610b6b6e8f2997c408208da88891920049b653b3600b102da89b96bd24b8441d2cb523bee56a9c62df33695a8179fd0328fa8d7744834df371d704899b0a1566c38140126074e67532e1a01690d6c150536775c16cc92322115d79154f7930f59f5b56acc154dc655819bd609031149bc661cea0f27433523108754b03fe77585ff6bf3b1c1702af6bb5c139cbd96711e1045423810a1daf7ed453f62dcc8c8f454f78dc5879742bcc2ad16084bf4d5ce92beaecde9a718e295a27557853b2cab7bd94b9b0f2b4219d4fe2eb6f1e6418860ad8a35cb1a8bf685ab4f84212fe41bf93c0b1340a8055452fbac234f8a08d43558dd366927592f35be5a91f38bf928c4e5c0649fda753f0ee9bdaef5e81c612fab3f6f9c915228757446c54184824ef5622d025b62d970dc260adb38fe730c56890ef270a73ed66744dd05d6c8350df5173ae541212f3ceeee94a02ddb1a1966bf25395593225d5d4acb16766ff6ff500ace8367999e1abe21e90576954eba08f3898fd910a629d72b92dd6935874f1b226037ec2fbf6df56e9829cb1ff36631d2853ad2efca68c0bbf16c18f2e6f3344ca9bb46cbabaea84e18eb4e71df744a19b8a076b44acf11de96871850c3f42af483cb42317980d6b9c62f21c31990a044a37ffb0257122f5e04de682ef9e492d6fb22e97646bd120ce79a03c5c14623328f4a057dffbf9c5700c529b540095e6296924a12b6f803bb2f47ad620115d5a271c87b16e0053dbbdd99bd9f8ea18331d2f6ebc5ef1aa426c3930b91baeeda9516f666bf3df90d2ebe1dd02b518e96af6d139cb1546a2345200e75ccad46bb187b6833ad11316e83a06e6281f27c246d6f7842d8ce2ff1a53d8b91da3a8144760c336dbe8a0ce53f3beb90cdc8381d076aaa1275b681bafebe430460ada8700ed976e5f82a0a5b5af470c51ca2ba7e3ee19ba982aae970e5b93cfe9ed8d493b65782dcdc2450d92d8bcc97c71f0dc3d35374a015280d57f0949898f121a41b5f926070dc70779de621990cd5e3a691fc5e8a0d923e97d46539948ac5a0d3cb55290a728bec1e49d231434da59aabc7b06c66038dd4df987296567ed92da6ac37abd4bd99cab4b8d4ab43a059b8ee8b95b7801c97392f83f3b6339538d03dff137f6436644072ee0d5145dbf6ddc2205f71a4f12bcc3ef4498f3801b95d113b5159d75d3363f130d11370c9ae841452dd934ea0ca27c935c00cef67b857f624ca174dc5f32fd03aa70f4ea29a5ee4f179c32c6096e586060500ec72c0d398dba9aab05544e700c595d184eb9a1e5e2bdea97aae84f491572bf5e15c3e879384e1c4490207393bdc4bf6ac1cab605c4c1c87ab19eaa973640de8373db1d276abafa27b5cc47c6acac5ffc826b4a795f8a0b3dcb0cdaa3895a8a5a6b1481330fbfdf82bcb4ee73f401685605562be941f6a6e23d266d419996476cf8d810c07961e1c884982bd4af13a2466fe4bda19d9bafd51d670ea83684b19a0cfbee6fdbb49726fdf9cc0c81cb39e21cd3e4d4c9983463d79a9483f3f1f6060c1e0317cd32f3f5aecb721a0dfa1c011ad34f46bef452beabf2f5a1a78191464ff18f01cba355392f6f0cf17db347e4abec19fb9b8f24e12c6c171bed4cab2aa23a45d2b697af0cb003a835febb8ff1c7b1e1f823a36c35c287b293a499e4dbc6b0985b516ea47271046dcc4104c16f9840c5bb3ad32389294fcb696f9e6bd0f1a56fe8c5eff6e14837dc36fc351df6fb15eccd6bce4575f0ab702e3557982e4982631f1d75c07d1eebae67675090d206b088d6657e8207fb0dc1cda2697e826c0e2b0bcba034f17286ef42c0542c027c007c8979c8b43102626d2ba5192749eb8df2d921a7f37dd465257ac702be775baf041c1ede403c0f5834c7f04d65b8caa9ac94d9262dea6b0aaed542a58c544f2d24466e1dbc3a04fa0f327ba47556022ba6668e9115a270989d457aee96673c96a363a681804c13920fba0297dc680085e60c4124708eb1a5c045bde4debfb863e2faaaa30d4544e117b882af34fe233027acd46f2fd80f589939dade965e8defd8ca7e4a5932f2a50358c0ccde5a41d46b9b92716e0f00d47166a890411e3cc6f884ce8b71194e72de88c276c6dc234385a8a53b44f20dfbdd1a7f2717b475c9d482677c122cdbd233005343acfe044309fb9f2d345e557a4664bc764149a122bb1abb7011acf0c4ace0834aa8ff16298901f2bc3ccd0929576c4234c1895805abb162cdbfab397d75a125abd6d7fd4311c478cdc61deeb66a39f4440e2feb41504c9467a7dc377e2549501f608f51163b8eeb99f74adeaa4d163c19c5fcdba7ee2baf7542a8bbfe23ecdfa050c121615c226e2c272947b1f2568719f3dd5f3867f7b70f91e06fa0c2a3f11dee0f6bfe9c8e02677d30aa3af288c722d451e328c10bd13fae704d7688e0693d8194a58bfd4b129cf7dd1d6aef5ff012139f84b5e0d2c7a2c697255b670f6f33c2e037e49886e8b65839ca533cd77b65df5494c3556a879812631c98d506eda55bfcfe6baa4d35f4c59c6e8b5713e5df69791c546c77a404b64d28db059612a135e5cb2923f18d2a12f1db021d87314e9a6555c6e8c0d39ea727957db7ddd39b7a7de2b1d701e8a2f92f7638c4c1624f10b62eea190a70d301a7831a59cf658c887e7ce090402381d023b9b505140232c1e9cae22ab6f7335f516575774cc40c40fc456489477dbc650ab2dd01ec9fe0c43effd8deed8a7724bd83b0b2e5308f6340de1822e11aa81cf7820bc36048de231ed77d205d720bda8479d3b325aba2f8495c31d7cd840b7f8ee00075e71453b8ef125d0f219633f7a8b6a1dca97c47dd08c732c03224cbc9fb94a4ab959b28747fa3ff742a05bbc086fec0ab07ae5303829cbe2409cd2036cffc1053a57b369e352fdecb2b73341dfde92f0fa392e703654c2df0ae326401ca8af22228d47ed84391234225b3ca80d2610c1f2738f2fc3fbbf80d276b63757b4336aff9cc7a0191593f62c442a152f128aafa47fac5ea6ac1f6f8af754b73f8410870080d77429e48484b18bcc46d9a50f9c1d1f2bceff7ac630716ae2043e533225bff4200ddd7d52ea38e64ab9f3fc03ce5cd7fed3b72bdbc3d8e5dc7a97fd869e8329d5f89c4abbfacc8a1454652b61045b5c4ee86f9a66ab2f5289c875588df9b755427784e29762b9b7b9e6ff440c1dc3a29ad4d54123ccc089b9c81daabdc6e211fcf48f1e01eff76220c1d25c1f0f037d84e46e71db0e584a81f771d3fa2b234bc6087f0194aa18b68f08bb2738efca74128bc1cd8101f2e221ec674563746da6c3483da4d8eee2f4209a6f7df1cd66f96c0c5aac75d6962400ba0169597391673bd9083aa9ae5804a51fb2b6648c7e050e686536206143a213df138b73138999b660856951946b14070e7d7bccd9085a8d3f02e9774673542e59c8208b654eeb27e944b2263393884bbc4d067b094cc1f63b2494667161e09990f4eeb3410500735a0249eff6ee89ec64efb44c1a08ff6534a69c41c90123e6a6a7b558db672f1a5f97a06fa56fcb78396f40375134fb79e6d11594d7da88c8fc8564f2b6a7b48f7f81c8d02644f1df429aca60a5533aad9337bc2f5f1b2059d61657716792cea84beb61a617f4fc36851ec0602df8c61adbb0aaff11d809b4c8ac27f50d508381d5a2fc7b718adbe5284c74ee24b982d5939f446668651a8d6d513ad83cad1964ded4763957b73c9a377e47e5029c1a647a12d9efc116967dad9015a014b4beebe1afbf1d754fec2be67ace975867b26b3607e45ec714478d6569173106ea42da254d327df91342bf87f71b7b678114e5ad67abbd5b1876031c7aefb8bf93ac52cdceef08e038caaa681bd64b8106f81447d7df56cf8a607d296bc87d110b22a2584b0eb216f9c89c30c1b3fb8790c6496fb3bdbf3c296384885fac0ff627d557f882ce9cbf673361b2cd6ec313d936576876ac98425a92485f42ae584721344090d39722c0472c40d0763e3d5e4c0300154fc122dda45df2326f146fdcff2782715aa41911e2969dfda53eecf74563b4ef8f378d7285ae241a901ca61628775a106a9c40857abfe989d09af5d78993b840263b606f23487e77a646a8616c6457e09489d4434b08278ec9417b59a08adfd282cf75f660290009bb6b4e88f06f6f0d669234c483697f1278ff03a066b4f7dcb575b053542a1e4178f49ceb43b1755c9d6e2fed99d033edf0d5509044fa372b64e79c03a62c16fd2e95fb32f2d3f3b3fe016674cbd317eed3435c69561734e5a1bd8fcfb1eddaa7cc03f0940bd8685a34334dc2d1bae69ea55d3c903c647e7e8e57492736a450495c8c84474970a94ac1662f5184dac8fd0fd489599b9f1ed0a3c406000612d1860a3ea3c27de6c81a466fa4bd1758227fbcb00990a5d02721f599eb67b432e0923ab2cd9da8d506fccdc0b0e46002971dd6f394b397252763790e891c284c26820ef2710ca56e1e22c2ad8606400c1a515b5878e5a3a7c953f2deba43bb8cbaf19de09364c9e4a3165355793e3150a78bd175368af655fb6099f673324960c475795139be3323efc4b05b2207548eb241af557074f339ed0288090bcad59ae1f79c81b7a11ff70be722bca820218ef130e0f231abb7421c1d02090753674bddb91bc0b3749b01c68de01afd4e2e6c307eec29c753826922e2c88029426f0a9864edf60ed9cd87d0b8767294532f7bade9b06770b26b2e17dda7f79683ce5c6dd2c19ac4efd8a549970c73359b56f49e308f9c230ccc2c1d68720f748510fcc28021814d126d368ad6e1e7afef13f8bac81955c345ebb2838d182764be1ef57a25475d22d96b3006be563e26d6846bd8e65e37845288ed39ce6ab63d0dfe1687049cab42f1e856b69193201de15cfc39b2bce1eaa23abbf2f9d891ddda22ee22c29799bd1f8ac78b0e0caa205ab5ba233d7abaa456b2fb190e3d57b46ef810efebc32fdac6d9ffec4c69d446e20aa04253e5a4b6f4a53af28ca0543ab6f12173f060464b8670e56c5f54499969219b75dc2c58518e051858e91fcb43e20738fb81207ed5594f4dc95768607e58fe02e2b619eb04390aa42fb7017fd627949e968efa7cab1e5e6711d9a472a6a4203fe0a3afa76cabda9b8ce064bc3136313fcdcfbccc07092b7fc919d8850731f9b620befa65974869bff23a5779f203bbf86182018aaaeecfee4d4db6efbec06cdb8bb80f52b5d7be8f275eccd9e377817a70ea7e4f44caa8f97df1d1c6395fcbd02ad87de93ab8fa1b0536619bfbfb3ea62aabf9b209178350740dc91f2fee4f16682ed768f97b7ad1d25120b798324681f67e6774513f55d28a58327c662f0c2af9187cfedc0f1e05eff152a322bd45f2c79b9d58bfc6575747b0e2b32439d0bc9133584d0d5b4c1618905e5c88719f53786f9beb095cbd16799851b3dde7cb048e562713189fba653f0705a0cad21d9d6edb8728625250002fc398d21702372e2d616415cd9682627ecadd343dc9152ffa1fb4b721f03294c93c92fcd45ee52f08de4c26fa63e7f16d40c99a43e8c2e908f498eefa1c00acc1e419e649f89e7f2f46d4cde9820cc19c3ebbadc6fa136c896f54d0945feb8111aed99bc62601c083c51b2f257dd4a71cc59a78cd878eecc131be0e33838ea2ab9ab10e09d5f557969a6c34510b8f620403ce8cad8392b23f793fc31b4911d2ef5d1d78fd9b750307a6e94474aec066dff27329cc2ff8d3a6e6902beb22f4cb6a8f554ba3b86e03a12964dbc1066a064e1600080a4e209e21b819de803bd2a5ebc2e66097a8f6249bd6dab3c67e82e5427b156e7e35e65cde088621fa9f1384763a1bb579c76d834bfb9cdb2101c674f010be6b5a72516143463d46a8437fe9867637c328f19a67574bb7edea540e8ad2226bdc312a0edb40b96ace156c6dbf8860e815c86fd46a942d6a0d3fb79d189668be25e4eafcb0c557e2e340fd1cd16df91a64d2ff5be1419b20479daf3634284c0b1c56473f460fd49c322689e4e226a14bcaeb36a251a81fd830c0356f8fcd38599aeeb22b5598afa1a03d7a64f518bfa56df8bf76dc73e31df9b8642231d2358e5c17e3dbb8342f2943fca11e65cab60687221347c4881f7868a6cd8e1d098a8901c0aa3e0cee5cdc0d5372cd901e59cc7ad41e9a370a3182c10a9740c85aa7cbecde459360ef68c5ed57bb2ba81c199050c600df2347c0fabba632b1b6f2068545bbb0dc77b8f4a63e686079221051cc5bea837fe2f3fa7aae68db37c042a13643e4a91e132d1082ec15cb36ca98b458423e3728f1fed440f49c9be5d8182be8262e8ecbab1d55046b3e2c257e834e73b54249a126654be366a9ef7c364a577eaa9e1c3de5f3ba9b41ffee25e2de173799b51a9bb8aa1e0ca2403204df012ef4465a11a34023d2543fa02512fcf7da6a0f672ab2eb57f08db28310ab8aca4224ce2acc753465a8eba4e72fae5a7212dd298d530b835c96dd779cc659ae4f14d01da6d198d3d90ea7eb70866619139eb8c69fe7670fdc704fbee599b4b27c4d216ffcc7a3cda2161c4e91c4029efc4a47f816cac1f230617abb305301ac79b0b4e749c200775f0bff3284ea49e25a22429b12bfa5c60aef555c8b96b565c443af654d209264a6423bcce827eb11eeb2fd5fa363d2d937c676480843b9a4179046e2a93dc29f9e482bdc8369dc8c661d83c13ab99593e3eb4e3044f8afb169a3085770c6a8808e223ae1a1a4fe38decff90e7c851d107e36fa8cee389833c6f94e0301fe3d35c6b355b57ffa53cea221ffe15c88aad391d67cc2e45a65a5cfe670e3dda07b3c45916eb291ab9e1d6e9a0c86f79e9d840924f94c8531d96e16e6ecdfcc4db906e070856cf8d80bd4d2065f97bb930f0309b1dfc14c5747979fea625bbf9a88170984f209a4b2496d15b3c32f5b24bac3f952163dd69484b9705785541105c0a40d307ff6f41d858e6b46eaa4bf16d0947c24e13c3c42a92f40b864246d8824e3c89253748d89fda97a39f831f43336a45b94da9b9f091ab0aeda811f6e377a8248f7034b3c292e5f0eba09fc96ce928dd663cb587d70a34980cb1c572e284d69b45730c511b7d03819a06e0d3aa6d64d39d3d4649b82ca5219bee484eca05b7a9b1a25f58d3f4f7e2108e407b04485993373a75eefd06e36ceaac1114d4d6043b25415112713e452922aa8d346eee42aac4756dba65033005d213a6c04497a4a277bd1c5c1e9b68753fc69025bc59944acdd8e3c4757623bb2321a043088bda10ce90252807dab367b4126ca8645652caa11268794358cc2030ac76011c25301ef4dc3cfb0747cba4f3eb87cc123b7d24bbf47c178adf1e0c5ba53c52c984e749444d3e6fac50d854f32ee4d408efc276aba9ef3311f9281bc003bc04b06f9a7020fc13b27d7f72a6990cd8b6526a25819ea9773363d54e2ae712ced7a0920958fa5ea706a198194a392e4b9dc819dd2d6a8e43d5d306fede8812970048133028ec7a433fc605ddf51d3d3b68e1d081032f29b9a7d6e9da1d635a57a7a7bc66ede0e3724866dc75e1281ff128553370b1887b598ca55169921d74d8696250c1174d48729e511eaa4a7d7aa1a68fc0748a4e766b3d37b3962d3edd18d6d5c6d7fa768be6d38e0d49f23c5254daf2ea0003e49fcac5854859a12d63bdf40488dc4f4fb0a30c89ad719d54ced775e9e491381904f90425e6cce54b4bfbba52e737b0d916f8848ecb1d9658803258c90d7c649b0f5e2e297dd3b414b922960c6ce01f25ce1d079f281d2971b7811b8628016cf5386e495d83440c5404ade8c4b04e7fd4fc29788a9ec52757b5708733c67255209951b2c9bb23b36af1b6847de33a1a37a2104b5f5a9e6560d67d1c588e25caa3d581998a192dada2fd1a34a2304919f131190b2986353c9cfe128c0f4f259746fec180f6b640c79331f434d3a2690f34cc6ed5fefb200b00de0e3efdfeec304f40c5c0141bdf10982b2eb47f41f76f87144ddb61dce3b0a3ddbccc0e1be12b5491d3036447f35a5054eb5a5078911121e9a8e3eb2114130ec861850e0aeec19cb3bdcbf0479dbe386ff6bd611142b1cd7c1ac64d8ca49c917e73ec0570775211367ceabb3f8d154df928eb4e4cc17069953cf19d7ca8b8b84d4a37709bb8debb51e708712bc47fbd07ace40bdc9051e8f0aae7f69c4057c2b29ad13c76d18cd8c60f216dd43ce0b2983d1c90d535bdee1248bc656da0712ea44ed8a1a4fe26761be30415ae145e238830fd50d91000fafc789c2810467c5aaf659fbebbe69ba6ddefd57b9749e5b69ab1638c0133c9189393423def8ef82d7d5b2d0eba797d3fcb508b59bb06a3bb50f81e635f15ae33afd2813f15cde4d68f34bda92b9b812a0100735108c88c2a736e73c31048a6e524c1bf9753e245964bb93c5ba4b201469415ab88fb50d7bb8c859b2339058de4373375f98f2fa69c9c97ce7f79497dd535bfa88cb7907e0bc1e5430c6713a3f94694b031d35793f6cb1b4abae50f1582c510b089a112c2cdb3dd0b73308a0d8aad849345f3ef1d8955f1b97500ff11ebf22761d1fe87a613727f07e50fdb53af1d82d3e0f2b4591ed1e4db3733d05ac6507f28b14c4c6f9f8fa24181ccf7e0dff49a3914704ce18140f0a2c316aefe907bb7cb984c832a49ea1734c3f68e86274dfb2464bce351ad54f3b40be2d5afcf358fe090fe942673c5b7531d441ef7efcc780427783bcb047c59edf4d4db45df9b3d53010459758e2f978063d3094d597720e033cbce74a3cb97dbe848683855d1e3e4c7243870afe39d9505a4fe8322ff2fd1e094cef4b715dd4038518e26f0c955a69ef0e7303219eadf19caa5f9215ed285512d9afaf0be86944d15505318100c82d2b629166ff3eb9d372915f44db36dbd159238b6f924ed81af4e8024f0aaaab2494e23437f83e68521c0791b55a94ecf1718165d06a8e265d394f3a3f4852b46da677d20118e904040cf2efbc6e70324dbfcf3a970a9d0d3bf60dffe2dfc64a2f06470d84c87e3eaec63d484cc50cabb0a7188566411b6127ff25708f06857fe85ec4dd9c876c3938b12ff8b700d01a557f6c6a69b2d6b9c618219b72ae066e566b8e2578eb50ec075e9c94678aaba87a72a2ade2bfb76a110682ca44a7068b7c95441c92db8d0eab4e6ead3cbc7261b935aa1c7612d728270217f8ea98f342735cc236ae356c7fd8c7ae9b16e1cbeaf3475f52eae836c56536344d78e9742bdb67917b9cb4526dbd6e0bd4408d1d0a4463b9264a2400968fb9dbe05c06eab54697b13f927af88d72a5b6f55fc7255f091c3a1befcd30fb66d9f2543a1c5d39d4b7fefb2b2214d3bdb953e9013029d9dacae5116c509fe74943d7edde585e89b66e46d2e04452cc2bec18805b4dade4708a4ea487950c18731328fc7d0574a25446a31fd0606b71ecb2cd7a8a97e65a250f21bb649e81c0ba1929917055fff68b5e803717c2d8d737f637ed17e7e83f2196d7ec5650d6bce6b8d1e87e6904462e9c94823919289da1e25c7bd64055e92dfe1da5e586f57d2a957c7f489466268d340536c815bd5dfbab4da0bacc9086e52be316e7487e9cf347477e135ecf9a1e1759ded4dfecf040e51933fcd636588f7c1da6651a0b5aeaabeacf572f01c8803248b0880f3fd3c26dde042014eb67616d554bb57a0530f40e49378ac549f6d00607764fe4cbc70df03a9e0690edce2f75e87675de94ac46234a3da608142f51d844a6df1a24bfe2d60e949ca4dc10974b5476652df7a542cf3202de23f8796167abad1b708e13439746990cfdc903dd17fee3afde7a779a497b5a6a6fb2f1c60dda404ebfbcfd94579792fe9e9ee63f226aa68c7f53ca2d39f0d2029adbe27c2afa7bd737f8ca570521281b1e99476d5ac04f999ef8172a5e49998591084aa3c9a3a77aed438c5382c2a47e6f35d026285c4fac9877f3f9b97b0b29d08286e3ef40ff19f84ae58da923824f19607a9874ae9fc145489944e54ac336154ed8d2b0b72ae39ab76f47809b4210064a9a2ac650694ad38efafc3ef298536f254f73364a676aeb6f1211a6cca29aeb52b356c08a7dc5778a7038cef303687d92ff079f21dd3d60c03dc6fa6b48e3b73d440a50eb8f095fbdab7b8d2e579d4e89f90887b5e95a548f1167389cd8256d256b5d8a32d72e4a01d269d9660a3872b03421aa41e4fac01d033cec9029f7359b119d8c53b0707a8c45d612165af52d946452f5f03d7af4fb48c17714e60b6a48b07c4fe81d8648a3da1647c06bb20b1a92e74b9caca4c7c29eddb4ba6a669afb3ab5af07b1275d27fe66f08b18996918764f83a7505ac94d717791e363308a4d048968a61663bc4b458b815b3ff227162a334592c2d47cd113fc8aac832d5745fb39b07638ad4e8f7d6b1891ea79f17ff7a61b33928bde90e8d98d0faad04bf93d5f806d6b512cfa372b17cc92f813b16cd1d1360a2b61ae29ff952331674bac52c33627a272a93f6f25ff946ea97e4cc53656b4c89da03e703560c61bff237ac4aa694769f6dfff952fc47ec4e6036e118d74fa292d2db37c05d9b30611af0bf55b2d00ce31a5883406e6f5a74e3033bfd4b9e5cb25fd8f0cec0d2c199b7a4cb863a1c533c3724cf9f28d68e9c27cf5933bd54d8a57e587899b975e466c2d6daaa730e6af77b85b505dc2c31a63016ecc47acde46a9c7ebf82670b8bade6126fa40209c7e552f1b33cf90cb099900fb60ab2dba1c4da2c735ef9d271b59c1622e96a0628dbe25c11c403f5c0208838d0364482c9bb649561f5a722efabd14fa102cd57b0332c2e3250b48c0307b75630caec3e4019d3d0ec8480bb812020793d0df5eb7e4a3584c945eb5adbc35ccf611fb8236ceea02c3f3cffdbf88698541f3db9f9c70047a8f53e73570ee828764ce0c938e00db0231ac0791b01b619c79056a8271d3b39ba7d8a93025ab09b35eb8d73e05e8cdd3285ab5958786c39d6af32088b1864cfe956ac72ecfb7bf632defa9a371348a6fb550827432ac9bc4a4f3e241810e824cf4fda48d61d49bc4fd6cd70ac265edb6687d862507ed1a0f9befdeb5dd0b829b4407f62d73042c22af203774585b366b99990311b2febb2f5b384e1a69ec92ee167baf22f862ed002476bd752b86e1fcdc198d5825a64b92b8ffc57d9eb95823ea9ddb5b3dffdd01cfa290a843c79aedf81cdf90c19ec2b2bcf2402b132991ddd40ee63f64441938f8135cc9b9d0383a962ffcb5652177c1d90cdd02b75d55e381829f3a325af1997ddda653cef00d7aee774e79eb3dded2d9b5c2144ae4fd842567caaaeb4a27bd1dd374186efa7c3fc85630fb2841a00e4ac4b3c5256902b90f209043d73985507d0c1d0823df365c4587ab9c4960f653248a723afc925f62d0ca85f8115b3c96148bfc595922313868b596803b0df8a3ca293b172fa1fcefd846285e5463810300dcd966edb3b9dbef515d6e3a513b414f1c5066757934ea2eaf7f7335613989e925a56346281a74830b6ee80cf16a0f4ad04498b3b1b3451065917a97d52b701dd29d9e5f8000be480b89a8b98bac3b229b0b1bf8a54891c852f13164ea6eb9512d42c2838084b95548e599ac4b21176283aec74595ee3840a53ad7fbfe5aad77f445efd73ac19cfa51aace1611653ea17a7c4789e5fae66a754cce28c8ac3d4533a901dfd42ec9797374f9f81e20f77d911263af7008a941ff5dd08cc334d19e4ca61eca2e79f1dc33046c28b76073b0826691e78eeb5b0a0ac09962522291adadba4442ff92d693145b5996a1739ce18a7f2c15b5a8e178d2433bbacbe123f46a86494c29b7024bf2d8c94da6d7c0cafea213e257a18edc5bbcc35190f40ee36413c038c34f7a3b48f005ce103aa6a0c598fce72069f9f6f057a871145923b1c0bfd9c56f0eaa6b088d8d2cecb539887f19a6f4fbb5e718447828f4631561df33ca5bac93d037fa02885c331970d7094c44a504bdc42dba8fc12f05cc99448ed60a62308508a9264f40c47d9a145780177793104acb1da9d5452e903a9f3160dd77ba18e9e716aec66c62e5304ad76b6c5540c10f5687c5db04194248d2518f75491ffcf6376be0968e2fa564030d86dfa2b9a6d846a36662770a7c7d8ea300d5f79b1111e5631f6ddc62734ba7fef98788e97b7aaf8e2f9057d2f2b11a269c1d47399791313af8b1939dca939284cdd35badc58bda26e1d466ae5846068cef06244a912c8489f7b635842856a3bac5f3b5aa5e895618bf61fbf0c1915ca02010e5957cb88905d657a6815035e884a5f2895a1a70fc4fabc767a03a122036b6dad402216e3f5a9880d6c2e3807648b7aab6baacf8d2b41d565d5ed779ccf0c6b6d719ce12c7b03f5428f19b4be014a540d6733097518d4d2bbd527a73ecc894c4c5fba12faad1e833062fe27c05b4837a597d3e2ae8615107ab066b7e566d5599fe25c89a74bea9964e3641bacab83c363e37f98265aae425afcb31e155f88e18dee51fcd4f5d3bc605aa19f07736fa746a450d14edb19f345b4ac3e72d6f363929745a7e3f63e251702f181b81359e5e696ec3b9c437406d909ae2948f155dafd695dda7c165f35738391b38cf8752beb18f31a085ade99e907dad00507d246711078f8087ee966d03f5d7eb34d5e5393b7ffe38f1f0847fc041ed0b9620eec684a4b5639ad4d747e6bb6a34149f633300e210db48bb489cde5a4c89d9399c5ab32dab9807e68df42f8cab2ae03088fa8f4dc05fa584866c92f5f1d894d791cdbd5fdee963be3a4d54f7bba56e00f0af4fd1b226be1b5a194eb8af07bd9845dec18fa02f4c1b0df64de6dfafa85fdcfa14696ee140b58d38457657417166da9a4ef583e5ab75a5c0e6d195e3e67ebaf52939bff86448e59246a70fc220894f021e385e14cce10a0694cd05b29db0e4b3bbf50cc57912bc2b324f6bf06fb15cf50e8e3fd901aacb3fe4e1649a7c5622aa87abc919fa60a88a3b5b3e95231a6c777865782b1751817c893cb540ad0ce6274593d8a7b17591f1a6bd663372521eeac4d7fb77ff3d59db920f61e8531cdc4923143ff8e916b2a7475b4ca0c59f68c5b9d14f58d668499364d3455b007d17288c965dc7b292d59bf79eb13cab7cbd2c3ba2e4fb2f4aaa396fc21d2073fef1fefd632746cb77be53df4cec29085fc1f7a37625789bb2d8ca6a83a7d6b0b8c26f44c4d188e4303d7e66a50f620e0d51de5a7f6d2f084236e283c02909ff00e1ddafab7ff93826a39e36fcb3760cfb263c1a9ac748c8bfdb04fbd7ef4cc5adf8c767a65b72e62e23714745fb5dbe559109d3ace3d444f33c844c84c28fdc62bf6b26e67029aa56aa18b69c17d3e713e685d5e8327c279e4d7a5d9d86ea47b3d590a1257a014925db10f36af66db3a873bb915a51af6d222010169872413d15a141215d1e95cab14189af56e8229d8fc90bba488099245d6fc5dd3d5b3040a7a03eecc1e943980b827db0c046c418b41d545297d348ef36cd8b215be0412bc4675d8b16636f2868db9b50b043d63b3f4978981f53ea55ac91b6c57e73d3ec83bb79d2dfe5bd50950d8be5f35b36fcda3b28f8298c0d788205cec446d566ae3d3b020bab608b323717cc1d661e76d04ab8fb27eb16ae660ba43073a4846e1ae1244d64f409562cc46af3df106fa05526729231cbbafd9eec562863ca09acd60e8ef4924fbb23af5803ae304ce45072f5c44657bfe177bccb3b1a4c694d2c0fc317f96b8d23799b575a11b2ff6fae5d32e59cfad8013dc95c889936143302c1c5865ee37fc0b5f87168280171a823409999d0d7cb826cf6dd9fcf70f1799eb46cec71826b2347293a0a35f82fba72f88b59da07cc6c46b9264e16988aab7b7dbf419ed5d47803b0e5ae93db33e5f34eb47e1597a29078b01789cf53fc7d0b3881f9fdb5f2bc928a4ee174e9f3fd8442ee22ae22a29b84e2d18af9c444ba4e053c21c63f0b91e28f63cdcfeef6aca87bf09f9353571d297c01851d3e7ff41a93307859c06f0633226a7ca6cd5c40dc61fbe13228896ad8d7399ef0239abf158374e68ad0a601dbe73381eeaa8870ef012031bce00818c1cf098390750e62c9e3f5a8a5664ff384ae831d77f5f04389560503d2f61f32773c64f81b06782300f472c0e6859a793d613d07865cc2e2f6e2409779196ab1c8571459d44c886daa33acf49483c63e168d95b0e8bb37f98d3ae5cfe1350d5d9886b5120fb8111613762967970eae5668a4bd84f13ac163043f532c92be5c8c97852fab381f7a4ed0a599038ee9ac0a3c798dfb6d5d2452ee092066d1e8c50f4951ce59c7738ac4f409630dae4fc34a631088114db4cf14df058cef289e0ed46e05c46f5f22b40c86385717f06a6bc42de0532c1e3996c4d5d6f589bdbb9d904a29787f5fa8a7768dc2ef1071fd19fd2663f24d0e0b6bf6d3605b9fad851b89de6a692b70cabcb9a7e70cacd8c6c356e67d092c779107e472c91ae4317bb3b4ffa2e753d99185c37fcc52c71bf78a6d0017fd83f8945994716a21d1685a72e83f2224e2885011bf26ea1f4d6bdb64e345b0861739db9d9496d3f06a6e17ea1d02559b778a96f2c09d153c6e3a1a614801c7dc73979f7e611d1d9949a3dc533e4ae2f1de6515302d983856d6b17d6520ff2adb32094e309d782cb309783d1b358ec40b6d6be5dff62cb3e8342e17e2c370fa8485597be12b2e768aafaeed38eb602280dc6a5abaae24f809c5e5675676da64136d9e1f70c800ba1ea028d2ccb6558554ef4ae3fbe449b6b8377de66259e73b6bf0e06d0aab71b2ec62dc311875b18f3cb8cf64c9ab2a1fb3caa776816cf315449ff4bcb92c2e955d661ca8635b1b2d9690e8d51e76b344ddd3433d5fea721373fe02cf4f8a66c3a79242ba213215894e3a4f90071d78c776c80b87caad989166742d7ed2d313eba5be44724909883751e4eb1fe830bc5f45d54be21a7a53321ef07aed60d581ce12e2ad15d9fae6cbbf91aa368580d5f9a5c3d954860faeae9cbb5c9fa784a6ae86a53526635d193c44e97af3153aebf216de79c5576b0006437f57256406facc74155a4a2606a3c5413692a4c283dad40a969cbfb6a77cbef6222a7e82fa40e5523e8789bbe12ede6cf825ca42738d45115482afbfce82377ae959bd52034def57466d0234524f216dcd902eb3ecd468d523e582fcd0be699f6ec35593d4f0cdf5e9b85cf99a5d910136dcc2f7a3bf5d02fbc05ee264775eacbfa8f89e04bb0e5d0b8c2b97193f617f28ce04b0d193bf95a5b78b5056b343aa52978e9bb9984df20ae879bb302e01a53c2561c301853c9b47b092bb2f80df65e11f3ca2c1c6693e42227325673f2573565b98c5724dd6309a2a8699049ee9299b5b681eb93d839e96bcaf534f1cb1146f18c7195985e532f2b55a0f98a460ac963ac657edb808d6aeaec1f554dcf531b6ac33229dfbe22cf63a5003bc78c66077073a51afda86beb67dc0155cfa3c652ad46468b01c885551b44fd135db85ffc1fdfe8dc93bf04522b3eabff3bb4940665727a7d8fad11d2566dd84d58c8076ceb75c3837dd69c29b689e03ef3b15e4a699710eaca8185c4de748246173d873edaf1f6159d23dc2b538a61e5340d40a2c37ba79b35bda21a013cc8888a9be91230c0851e5281af73e1e07f0b517ee3a533d5f51775bb95e006c1d1cb24edf9aec587956853efb8fb917d05f8a581a74108d35427003dee658b90f0f3423e2fde689a2165cf0d504a9f2b6bcfd2d3d2475d941ad330e727d9184abeee6c20a9915b857da40fa2126d61055f8373f9d84351afc4e424c0c29b2c258b8451293c539387a70d601805a682f99abc0fb9aec193abf22f4eb5ebd00b6a1c79c8728e5daa126bbda5fe426c834d0bb9a39f2e7bc0853031b316b5e89ef8ba95771744eb8b4d53b7e4853fa22e1745584f798d1d582d91cba717df29e1c09176f0b93b8fc5926dd2ee04962319c44cd044dbde98cb08192f3551307c4f475c353effdaa70ff0db8b99756a0cca92acc4059ca92bfb6ff8317f3e5ef52727654be3106b3f0fa937a923f5595cb315dbb95a578c9cbe2f96a634c085ea398ed444391a85eb8bb5c3d4e647fbd6b4b6f11e36ecf15388086a787f9a33887cbd4e1ffdcf8e7d543e6f9d0c52ef437d2fb367e1fcd547f92ea799f8f6fc32a08ae26d94e34696d522a884c19f8170c010e2f0677099eb47cbb60bdbdda73255de479c408f616ef575fd034cdcd894e23ee7a830f2e695b07b828c10c2e36910386eeb0611356620fc91b4805bb7fe6b6ec8b61c72a70ec2ce8eb2b9f8911cad295b018d2a762e92b25e024893cb2352ae6e994ea206373dc9e58182379e0669d658268b9e049ccf4745154d9e907de5dd3c79f27b87fd6a65d1c36b1b67455e797489beb7c778f59cf2d978babed0fd2ef6a5fdb62810400f66abb0a5b6d5cce04c2677c39ae3f84891548fc94bc2d0a9f47ae05499fe6127dd9017b84aa83bed3026f692491136164ca720d0fbdbb8aaaf2393177dbe2581bfcd4b9ded8eb7148ed6d2f89c80b285a076027b8162156092fa3a06c1c3ebe6df03d67f1e843ce0ae8e855177f347468195b1982e9f554f227ce3edff1ed2942559e7f0490fa46ec91e09f800bf85c248234f97347f34cf75086bdaf65391ba2672736392c749f05da23ccee44476927b85671175aa238afaecd0a209da7cfd923504af2837f52be5cf50ba9ca79e055be7543ee273e7028c70875ad7780cf66da2499234a17ef9ce1f1523ce0b7f9d4729da7d6f456f09dadb49dedef207b21943a72c4d6c12c8d0646a78b6f89192f36986d0916908461fb83b4d33b06a303107e8808133ed1a84af79a8a7a9494d65938c5d505423b727bec38a405b59e7328ed0f6f0bfe80355978faa9462d2eec995fdeee4cd052aa72faabd9fa10f3dfb2c7fdcf36c38aec042a5f7ad1971c7173abf72eca0eec2df947fd0fb8a80110f3868e0d3b841d8e3c8b10b0e082edf80b62c7a27ae6178981836f305188032b65c44981404945359c6d7e775f31a71b56e09bdca878d9863fc24197a1bb1e5e51276fa4bc1a085683f64921943ed6af68951945ff6fd4035df6279337f1e63fb7142e48a97fbe683295d937c31d4eef7487f7e340919e449d0800d51675b5846f2b8955539988617360f795ead6bd393450f9d5d9436cd5c6835166ae5416663e54c322cf2b184a7b8a354b7bb6c244c066938453e7c952e637496d22deca066aff242a32cc7983ec24839c46c449f9d8fd437cc7e0aac5b73c4d4ef80500fd60a0a320c73598a2cccdec123b60a3822ddd0aafa3171d6824a62dc9c3afc3174e17dd3adacf0b8148c708a02c46a94836cf24340a0d4abbb0fe5fc9eb9c674da8349d78c9936944ccbf2b55793ee8f3d446cd6441ea6165dbea5492a11f9c0e3490257c4cedd248a5beb6631e7c7b6302089e048a655d71327201876b653eae6e51b506eb56d81e282a74811eba0ce04aea5fe150dec01498de185619c8f42c1f45c211c4efb5818799b065914374b5b03b0717fb40f7cd81a5eef276f7406b194600edfba4c6c3ad05dd3c61483dad1b7cba172dd8f8417a4337a25e261ecff0c11c0e0d1e31292e272e301f0f8d7d44c7d9797fb34282b76f58cab41369c7dd0bec38b3af2b3e19fc5f03686fbd741cdaa8181ac3eccae299a50e5bad034ca64d60744d7474df3533cb6c425f720daced2316f34aaa7aab30936cc0b0ac270f83e60af7de2f376405176f8f5b62c853f169f9ba21646da2e17712c8de2cdd1b11a068e3fe4483124f877da4c712a63a814631effdd0743176777b9c8d0cddd00f91623c65b087a0963800a42b77dafd0253b5c24c59f1af25f85320d90ae9f7d8a0e2d8278800af66960ac10ec3b73ea2e8b07267695fd9b481997b28a52971d8d556eb27a111c567267641a29af07b32cd8b067d3c475b724766b00000ce4c9f6b1c582edb1d63cb4ea639d7bd768318f4ce7c413ddd0f5b4230de851253fa05bced6c57f690fd4a4c2856f39e657fcae36e96c82e246343e6c17057b5ac6682cbe420b1ed856951ecd7a50c2c34d32f787e453afad70a75fe0d795895c960ab1747014c7ae5726996c06a563893d8dda55c75bd7670e8f4dd1d25d204f35099248e5e9f13285f263044bad3c05273c4d5ba0964d111e2c3bd757a46a4bcd545b762d1343bd19dc5f7d2688f13b796c48778f44b9fe41f39b4d26c1a4de36f7a19e54b3bc3d659e25c69e95b3e244adcf2c466f0e57773529d221e95689d3675d46ee8b8bb36bbbdf4f5e0aa6e33e960b1e184541961cb946ca162da43e38909453ae2811b5d30e608d40c6eddd925c50989b95d60b48fd75db8edc9be9a7cbb59491b5d1ed24602279eebfcba4853f5209da119e5a6e210570b5be4fe45d6bd03796417a97568efe118b97f9bee7f65c82103215fb58ab0b394cd38d80a8896d5204704a07ae2e46d66f2220e5578d1e3a00e32bb96ca514a9af8d8083d335f55b46daca21edb8ea4df901a8875550790acf5c663440cf8a77ebbb24a5e24264b051a4dfdfd09a127e6397544923c0dbf277c5a15f82da181edf8b78121c4396119f05f5cfdfcc3478b6e6118079a9d092cb80130231eeb45c726083eb627a8e21b3c8399288c26bcbc23a1eb608d3d4b2005075391feafbb7d968dac561d1f9e836039a5f90cf310c2e9c402bcce802bad4a2b2f3cb24d6f3ea2b122885139b53a088727dd15c22548f6d0d522c8fd13a3cbcd574889d1c9d8179a111c60172b36ad9c3cc4986acc29bbe524ff1c7f264a38c65d3eedc1a84f37316704404353adf90013d79fcdcf46228a68005135f8dbe63df7da8fd563a95a322abb18424816d937955104386929b44b6f107f5b9b0eadb79b08497fe974e46ef198b3b5605947fb4afeea617c4ff1172e6aecd88ea1da1e801df86b4363f4d5f8824fa55a558231f77718564b6b9d75055fa2728ff67f56ad655ca40f772ba60b882bb602651f8c2ef11bf761be059056936ee06d4021509edd0f0d07ba65033de05068eaf3be8d1ed536f48a70271af00ce2b72f3f2db86d3d7d10cab1bc79622e4e7f24d27dc4f5b0444ea94c6562f2eed46270a384f3c6e388a40327ef32621741829702cd832b6c70d2d1e933996b8f3dbf56c8debb674fdf641fed79bc86b4708ac6cb5a5e890f8635e074ee9cf9ab7a4f58ebadbc0f1b42885c395e2ed0615ea2cfa564e4f0fd675091428af89829715388b73782dc5068908789b7ea5e973fe55b438e9d36b0263f68d79a20a525d9a68a1c9b394249bac5ed76831dc8265ac749c0d7d997351b5d3c1ae0c2aa2f09c81b22b52f914510b21e14d2df431b03029969cf83f09e7d50e8044aed03bd9bf97c4f61230f2c4188458af5ddaca09ee89e9d88321a1a597619fd4f6799d91f6bf81962ac0ed26779a445bc30d1712a81fc18aaba2c6ec3084783282fa7aa96540b835b0df8a613e126fed56a1541d33bfb087298096a73e4467976c6939b8348fdafee0201e9091dce943231db1ce628c297b4bdb41abaafa4edf4f6a741fbc1d7dec5a5f57c5fc3c84038a47d4824161043f3a248d658ffb11d5fb3d7a9db891dd29b17eb4215533582ce44b548ada6bfdc3a3e755db72241b8f3bf0cdaf6ed95603fc95083a151041bef0673f342114358a89f305f7721ed8db39b1a5c5e77aeb664636fbcd6f485c6dc34595a8be22afa9353d20273d4339be56e96c42b399c3f4fa9389ce924c8e66256cca92d0b0d46a9870bb4ceb5433fa7fde4150d571a69fb27d81b4d437fd239abb489ce29ff06e9017fff91f6240b15ed27582cd7184dd06350727c6af94517ac2ebb6ac38b268dfd5aa00fc40dc0eec581048dfb0ee67497012f2612c84c1d6ce83376016b064cd4c8f50c70409053f474d2e063a9b8c4306ef4cd530bd70150955c08db3e1a1bcd7112667b3cc18a50219f33f87e50d5f07bc709ab1799b7a8e9bfbedc421fa2f79ac88fb48ad3e5828986716944993da51ee7edf01b2e10f77ff25970db0da05fe6d193ec93bc7637ea0229321eba9eb00cbb77327a77b9bee2469697fb3cce99275317cb7865b8ade3d0307210f55f070f100b5615b7e990c1d06bc49b28d3ec6795046cfa3093f542b834fbea12e12f5cdbb3705163069e3f44f95ef18b8023745db2e412c6103f75fd9832dae17fdc425ec228be26c20532576f79db7fb71ff342a3208bd9fbc227fec3333e9788b1b8fae7ad80f1bb788201f0cc241e66440bae7a12578edd18f6515a35927138af9f7fed24eafaf7cb6cad2384ed03bb110dbbeadb282a92575a0b1a8e8e35ff5811dcf242d1bc3097ffc3466345fdf0c7ab159e3bf84c63b4ef2852001bb81526f146dbf246cb51fc00310045b4e4b351be9af3fec2a371f18d3f014b0f1c405b4c53990cb026328e71e2f94b9e2995d7d46a5ab76a76ad8d7ecec0c69eaafc8f16aaf3ac201e947bd0409c658c21d25291df8fd4d30d986059ee3271ab2a3a11613b8baf9cf7932a55b3a6da97b8a980dd87fdc4c7ca06f07794ff1f7770cff1724548b819841389942d0dc04feacffd973bb16604b309340c52e16320a22d876d5908bacca5a39d4c86271301db4798102b053cfdc069c56fc4566fd6138f5f1b1ce1b2899d273f472ff536d1109aa3d29172d41747d383b4d32cbc218a0c18d17582dd67cbd5d93b9e3bff4f7b7f70ba2dd115ddea431351b4c1fceeb1649e3bc473ed8ae5bfdc1890755c04e6821cfbbf1891ee631d19d7c590e8b3dc8427a27bf7b3eae4d7195c47741257ae527f5d561b506dd796847bb106a3994dd4bcc346d843bbfd89af3bd804b184437d1bfe6ca205a187f0a8ad76a9c051a9fb37192648592693b1c1cbea806e8594a4614f8164982710dcbc302c6219d1e247be24542ab32f6111dfe827abdd9c6288d04a88b687bc4e614b222d834aa91936a2824a42198f6ca8647bb1fda5c82c2e11ba82867f073ffe8695371161d8af45dd95cef1a98bb2bab3e8dcbd777e5452fd53d560848e3ca18dd620e9bccc28e2bb3eb669ab2dee486e311f506a929082c89c1e3af6ffd97cdca543be8c219dbc53c2692fae1b836128ad361aeb4f0fdd98f225658a1aefdeeb1ddc58b7e0f047be233f36925eaa5511b550053c1bdc36d47618694bb67573adceabf568b4bf6731d900dd8b0d5bf186f8a9230b27936de301590b6039d511de11852a6191801d5588abc0cc223efb0bc5b282de7f09b9e58e50f76534a86a50f3a5e04a6e3062271c7d9e3973c60d6f4266ad168525b45d011b2afc46a291707d6f14956be3dc8dcbd33e7edd2f5bcf33ab30f0eb2452114ea1018e77fc5fc65a988ad6ce07fefc638d4c0ab564d0fde5cfce3588a6effd556e3fb6c0e08c2df1f1f6714232cf5a7d8963f2d80d319a84496169e3594a3cc4d7b6705209e2b39db14d4d685963231900fe8a4cbe893ba21b4ab8b7418b5d55e944fcbc2203ea435df443ba708f1b329c14ba0f615b9e411c6c948ea8822ee2b72954a851166b4b78bde6e5152ad85bda3a0a28450a44faaa32039a0b73d43e84e009dfee6f2ab9f123a55ece90c463cfb521f3d4f1ff374861be5826312e5e019868a472937346179ab0d069d2655ea7d8bdbabee57206dd467a7df70b970f0857de97d9edfa922c55accd2d0003bdfcae3e29ea52d1383ba9a87edb1aa5f0a6893b4408753073ebd98e1a552673b8630c3c8a809091f1d97ff18423f4f87b4659d6d36eb2f1fc27d19ed7ab87ad31ec31de5a2636ff89334d94b5c6056ba86f3a36d87f52f49f2d9fe856f519b683cc38f982554c4d0b1d39fde1b048f6bb0a3bdb3626114dcc58edc1346a6910247540f691288eb753806068441c947a871c4959d77f65bcf64452030e5891685fb82aef50b7dbc6b5d59cee1f99677bea14eb8b57c15dfa7af6587aad6b91c7fe79b2755f7557a0149d0bb434dc530692824fd6ca954a062b7b88c36c80e7e50efd12d7082bfc1b9972e273dafd5206c849eac253b2c646945dbf7da0c3dee18ca34bc4d9ae49ef7d812037b71bb1e1d486d3770f4b2e1bc5280f8771925559d84f7dc14f372bdc712e158b74cb4097997c49bba996a9e688d83771b08b4f212fe06a3bc84afe4c83d7d8816ddb07a07addbd1fc731cc704d8cb87661854ee8969f04f00089b31abc5d5d435234d0aff57bbd91dcfc59782cbfd20fa2bed3383cf17e0327e26c1790b3e07da03592dd2755c44e67e9424c030fe8dbc4875c0178a3e77faaa77bce6e498337cc4f0e98a7f16525656f39568854439cc1711c0f9cb5967d1923df91d1853e7e99425e721fd5d001faea629767dfdc01f68c41f8214b9cb670115a036e42d4dcd0136994b0ed3a0cee6f88a437ffd7c26acb274efbe7cf2a507fd8a3879d90f3980568c0ce29fd3faddf6537a2683e0377aef5af5745c0e1d76db4dce7a5f0543e90910c44027ff5279bcc954bfc961430cdfadbdb6bdea2867111b29825ded4ff809c54201039f0f23d12599ce6bd1fdbf263c87571a9ce2b41ff64f9c0fccf1cebfcff0935204a44894fe6c89954bbc972dd91f00b766497b5be60fc92aac216f4cb1fd765961f1d9b9a09f5b072d48b82cee91aba955b4a1b21b077e87d12c42210912c26d3a7bccd66b5263e8b53aeecfec7f28303cb44c8037d1239ca6e49428c101a036964698fd83f6f26844da266645d29b561b0b68712b2f95c7ee7f157e668bcc3a871ebd6a6a6f11355106f3a1c28efced254324796021a46b072359b7b0471abfe8f13a414fcaf8b6977a0aea6cea96d2dcbc72d5174f96d7413458bc798aeef468df15572e6298291495c63957e98882fdc08a2338c2a202a078ee2fa81cc2783a4ed7110979137bc1d5a491f72947043d406784f8f276167e745c68ce64a42007230d53cf463eff4082c8f7eccb1a1d097048d11b5bb2c9f2b2c5f77fcab51afeb9c874c93e26f2d532770855bc9dd7c96031e0ad4c6b8af065b2c49fdeab5b17d01e5695d488ca5e919b1613143f5a5dff68d87494a97871488fb22819505de6eea777085a575c363e42dcaa9ec30dc8b0f8968884e93038cb2bda32cb002d963f002889a739cb26a21fbb9012c31353dc3123c25f9b66ef5b3c52373a2fcae8e24bc0b0200b4dd86f088d11fe280d93452633f5c2a54eb205d987d4b7e1d4530dadf0484f59bc65ba760434eeb330110d2dc02595ded947c1fe2695ef308c942fcf1cf6bee6fa00d2089d35df78b1908b63ab2b3c94bf9a8a0b937b92ca1c55655ec820fc2a24d18a001c85985d752a012672764f075838b845ef53fe713fbd3c8c13f098cf8f742dc4a05c30a01bb93e99f2e2c6eb46e02054b70e7d792708ab8c4767e334a4d0135e455d954e534f052340d5afeaf56e52c3e7a53e4dc179ab1973f887ea7819e0fd4ecea6cd81b2d4f08708c720dfac7c84b64e3eea404d97f0161eb439493b4f72ee611653b913476e05c7f19da7ccb969dbf9d9610077be51e2cd6c9cb60fe3b490a1086cff80e5d2067c75e709a20dac6864015aae532a827fd6b441db08045cbf632b78e3c8959101d2f87590dbcb68333b888ccc9ebc4c707acf8a2c3cc52a91edc32a65ca5fe7b6cecd3520c9141dcc1255467e4a0e7cfad9638e2df7287eaaa1080a2b6b4d53689fc0065379bf300736dde9a6128b6324fe8598f1479fdfcd5ef4f408ae95191c07ab3fa2375768158d9b6c58e54757c196b2a76e237b78fcefa397d6a318bef1a0582661b5c9732c1ff7d7917afb308ebd9aed9f134696263038f795306f908668dc7a8767025fbff05bc84db551cb5d50355178972d2b6cc329ece9de761c6a3a54ea4be3f62147401ff1e0a78b8b55b4ebeda49e404eed87f5a1dc3b4fb6a23e3b9c8e4397119b632697a855ffd33914e0901fcbd6b92a200b15f67433f4416fd8a713e1ac6cd9c72d15098c938dca6b3b3c9162464af638f19da232783309ad0a998de7f0d1dfd5fb57bc6cc5a62ff229a984190182f36ca560e9e83a111e14b0f177918bc553bdc16070831e8f75b5acc168224b09a8e757da7218fdf1ce822aa6c114bc2f3b686ac4b58043be1979af22632a03281c2ac55adf397b7a67840f9e478aa0dc24199e2e3ef4ec2ba729e29ff22d5d4d0b939a836d4d8c181512e6381f5af4fce075cfdc6aa02cd36277adbf614f058ba48c84cff048bc7adbdbf0c3b0f622a3c900bd1e2b415b39086a3a3c0919db17db81bf0718dea012990b6804a2f03b499b4270da2ae0ebe095ffec8662d558cc46fd46cc03539d981bb431b490ad2c4add26ea0b51102bd22928e23eeae6c5a8949308122d67e788445e1c009d4b2367da4c5a3d8eaaa11ceeb0f9bbd249864d877bd29f9b7e249f3d66db07c47b2544294ff513fbe56b4f15f0b48886a9348187f50f916c8de361bd1a89600a5db5e8c4433cc246e55601e743bbe4fab3b7aec4e4c7d5a87d8d965bd03e9176a2d540b5f6cd937513004adcb62540d2942e62e53bbcb16b0923c9f55a6799db8ddd9b47a1a864efe98248cc5acbc54ec263d0471ffb3a594344c8239fcc677389542fd71f1928def97a9b282da8cc1486704ed2deacdf64478b27bc2d0560496a7c9325e87262dc5241e949962063bdeb5ed553296cdce7cd38bd681bd3dd74a54843434212aef3a0555bccd553cf38ffe285741b00c8079b8e244b8639aa2302402008861839eb9bd41efcede7040185b71e360ce2086d04f93db17b8a8974922ded1b5fc844e6a1b6e451e0b92f1c96c58704399359490756aad92f73ad21fd94d38e5966a552975260ff4ca52defc9014a56b3684aaea83d53c8b9183ffb6195dd0139084527664ace8bc72611e0d7d416dd311ebf339a2ce22ac5abdd3163457d5fdccba372b697688072f4a2c8daf83c46a73270ee5cd7464dec7516711d9a0524b0844f39bae8f224b4c8da38a0ef338bc0cb67b65cb9341eac47efc9189a2f36f10c70a426de2f4c16836889ad9915d2ac9f86bdbd28a143245a616d7cf4964f420e3f80b4046930a3732fbee4001fded02eff75d6d4493f152cd8360f143bf555438a0ac295ed5f511dc538f31c35104869dac88f9a2ca3ce9db506cf6c0100afea3211f0238cb950fcf53af4325bf754b6729c25070b56ff93cdec281230b5b960ad60d4591c794ae53d39f1743d712336f8aa01b7efe799b5e9221c9bf66ebf9d84821bdaf553e66251fd29b1a85a7e00efa8aafba3f63e6d44d7d1f8e1d476a2d6cbb32175a5260f96984e340fd05a15aebb01d935a2df3210c7732b66a432b4d4bbdb057cab6d46a826157d07fe5aaee13f487779118a46f1a84bb05e09f1a743aa2d09f1d23dbad45fd502cb81aaa208e0a79c860692718067751b8386cd61fdc5024c3b14075a9efb131cb859d698f7fa369e37838717c92bae8ef86d971c7063c74dc85f93c03de32705d26582d4555ab37daa7daddccd370aa6bee98e031d9b1a0e891ae4d41a3463223e781e881d396d96c5a4e26b01919b0240948a261a38d35d74aa929555126adcc6f5fcb41f9a1c51ac342e72ce7a53d2c8a007d791f6435901130616404ba1e058066dce80ee9ad34cdb62ba0fc1a8930794e60a3f125916aea10f8de1c7de228755ba86350cbb86d4ac896f96d2ccda918cd677f524698a7baac0f474cfc5b8086334678d74b999362807f1a6ab790d5e1bb1b81b55d38c6f548b23e719798a37639f16a4eafe5fab4bac4f7a90a2e14bac48f428d4c4a4117600775db28cdf90afb07bf1592f832cb9257fbd9791ea977e6b2b2badbf01ef81bc20aca9610236c7783bb90cbf88f9ea7a8310053ca7662d1d8a45e3bc971b8355e6df98558f6fdfdc6d9932881716788f668873d75342c848d62de003d9a8295cadb4f36f88250482c400b71abfc968d88d2ed0f937957b6d5caa3211f132e7c17c1e2b77f167c8cbcab267c0bf1e9bb71c7d24ce492fc907891c9d26b5531b36b5c49f978be686d057466b6f7763372f6ce63028c6c650b9b3f4735eb82f504c2280640643783265c5a90725a5ac34df444fd780cc7128717f384c5c12e9867d2ee2d0490499b6a20199b862a950ed7e74905525252dc5169900faf4702b9456f4abe311fae5e7861a2b96c7476ac3448cf54f23175873798cfbde67fea38c651f5275caa79f049375460b003359d5ed11bfabbb9a395f86ddeb88037f8041b88f823a51f02ec5897f26dc85d940c25731a3396644762d079224a04fcaf9ccfd7a9a9679db9afcae42da7cea7e877ede084930b0fb9b236bde1126166dc62e9d562c3e48d813c92afcc5b7a5aa5838f0fece767ff09ae05cb6b003e6d2a5f8522e7ea9104d6b54727b20a4a25a224c892b42bf844846a5269811e8e8ced60a282b0c57de819724d8d077ec04351a498ac42b71e6add72c2708da7626bda060d3f604ded35431fca5922865e029b5051aa801646e3f6915d9d7c6c68ebecaecd857c8d069b3f94a62cae7f2dc9230c48594b069c4617cd82e82213066c32286f7da706fb7864f2e236e3dc100e40867515919a97f987553459d4e6bec30fae3b79e452a2f9cbb01112404c91a6e82b5695190c818dd1ce0ae9f41ff58f0a5aa2e5e47f47817667f7af0eda6878824b0aac25fe806e11dfdd8fd0600879eff8743a8a86554259e701c59fac14ab53af52b53426d914787864ef2381dea64e35f0fc94faeacfa56ee7e7a04c2b5f7523505a1ea9a202b4f7ed8198a00a7bdb288234b565848a6a3318a86365618a3c0b77c2d7afe1631ce64bf6a42fce805d217cc1e8ddabede40f4b425904b325c1befd1380da97d063f21aff4b909cf4a2d3e9f65f5fa9dc10b616e3e65f361e5be1d16e02e3a0d5f427aff44dc178a2eaeb4eb984501e96b8694a5b8ddd9c892480ac5ca5dba5d775c1e6341aea9861cc838d84167b95b6f57ad90ed74cce0f01cc40ffa914547aa753c3fc9c4c4bb44ee1846c2fc451b6bc86c159679303b3de2770bd8b185bde058ac2d74c72f79ff1cd1c8bdd4c2be794767753490a964ce045436791afdaf8236a76b52f6004f4c4db7448a78b7d9b9e7c41f283010276d327d041f1c21b916231037aaa17ce81702b806b0a05972f1de91cad426b8a3eedf12676e7d44a6ed984c5c4baf43f4d5c12267e9bd9f0d30059f358810070014c1437f79f451220eefac763819d273c59486494270233b5e5bf23814e35a9ed15472efafaf560d14eb64a5136c4d0ce7869e0bf011d4cadc82c7006566401da558697c05cedc4ade2d14b7f24ba332462a4eb53a297916b1402099b5b5f9968e4fa0f022e51511b5bfde0dfdebf74cb714ae7b58f804093f00e52a67be54db96009073417ed5020a8e15be7b966423965d28e96cf0b6cd3c4f958ce9c7d19d89f716c764955b9e12e86ea9d229063a6123a53cf5370e515f5f880896e619d2af02ee1c051aefca4402cf982f955bee4706c7d1cb298cfd3987bd7ad788c5b0e3b52c76dd72488f2c74a0969a61f471e2ad37a494d4465eefc03c287deb721e4de7ddbe7ff7cb3a29babc0b79266ffc533f0440d57b4b919b2a07f29fa32c6f7233a4178473948b5fb5e4608312c8ce08eb09b13214d1b3d48597c5131920c00e786effa4a94d9b9528c926a366f7e11a60724350ca3ab238b9f26cf907a4614c5a3c4fdeccde9cbc3da3062ef8df5a29554027927bea25c34e4820a7fd8e0b97bef239b106e5b4a3fd5cfd77b28d1d1802ec48973ae32a91f4227bc8dfddd5365240c203f3fd76aedb49a3c511c419bea50ff195ce3b57ccfd28b74865aa2f4a039258ae23e2d1702a6f823da6dc2a02ff23fde632613eb1de6c4e549a714e82841793ae9b4f74c1a25cbd9599f5a447d44cc3f313292a09b24d67815eaacf3aced7312254c4f42adf9488e12170e9546f35f36a55b4f3f9b6e7abf8e4ab86229ad5e0a1bb0846a3e28538100dbf9c0f1bfd05198f2126c2ce146f4a34e4b0b0e9436a4f308a42188e11e6653e855783ab330f018a0fd5d2fffc4076aa5e0a0f7dca4aef878558af2ca6eb732a04eda8f3e5005bc5efd0bbf336558d759a7cf65ddad9b18a01a18de8e6bcdd5bdaa04d4cbab4ecf428238a78785c4219b16139551278e47499eb9c51e4da84ee11e64a141d4ccb7d09fc8b01d7b3abeecc955b73b3759f77178909dde4e68c157f81f82c7db9f2f9897ce823980b779eefd0a58b25a3a938dfde2362bd1507956e296478988449b9df051d1992e7cfab080397b48bbd364e280de89eb985fa49a4fc6263d81b973fdff83c411c9b44e65bac73c96829dac60832adb11439ed9da96a0258be44abc02e0fc49d8fa207f9376cf8ea53ad03a24f13659e01b707136c67374a607d75a948b8e653577c05dffc3fe2f8bc1ea0552f3964cd43956bc22b04ec2df56013174e248f2e91636966722c141cc1320448b8c3e18c576c5bd2b9c7b47a7161ed5da9e6a01a3e8e55b46e4b9f400fe51b5923853d892af86001076088af3368d182805ab0ab02d1c5bfcc77d794dc26f557ec2aa25a6467b4210287cdcdc02f9bc0f732169777cacdd4b211ec0be9c72087bc7fc8f53e1bc697c634f4d89068620744e12a370af8a511299531db93cb102225107838ef59f2de1a79985bebfa56778dba800b6d5645eafffc6501009c8fd429bce0629db514023f96dee1d3f76be9a1072733986f97a7062cbfbb48cda73f9bff0f98ed29e7260b37517d060bb26777685bf659f8b8e591d67f0cc662d87641fb93611832d7fe5dda0b430480cab07e35923f775f071152a6243b61c83d82d688d52b93594155dbcd64cc2f2c2cb5c5c8691b5cf039f07992f854f9f16be1d0e3d1c44809d289fa519bb6f9cf0b1fead8ef3c5c6b2d1a35a604a5d7521202feb0a3e16193200a65c147221dc199c6db4f9b798335857a6eafdc42349f26caec6eba9a9dbf77dea4d56c35ecefee3b6f47804cf681c7d0e68fbf83ca893f122899b6ec395a252023631297ac99733fc0158f52e216242f9b2adf817deffc264108a0366c87987c762643f7033ac24a649322cffe8fa77f7b27699c0c23d747aa5893bc69dd0cb5017d2084748d09056d05bd279d4037fc700717f7d74a732a6162122700877e20e2228075e9b6b8d03a559666491754b5b442a1fab402a778690bdb03bef029262e50318353dad03d1f8089b9fa244d0e766b6ed0d2b3a94c17ff8640abc2e7c683cf976a55be8f93cf6802f3d3a93c3ed18e3ce7ae548eb829143eb291284c10e7e7c46c0047474ca774c80974c9e4d2154e507219830440b56b7491d5aa8eabf03397cda0db1d97ba9ee596d64843285d6aeaea492a8c5cde9204fadd19e6504cc0b3589a0924d6b8ea7458c4f77df570bc61890327bbfb6331f56b0d4e324c870b5cd854f6a3219f61d6b1d3a79bc001d344cdc99bf0fbf90ee14b4abe83022fc13da03872cfc23a02a227f9d257642db153fb24e7d5b273794760172f4f673f4a5a04bbbef9b77b4fb6e4a75341925567f79af66d5968be5502573cfce184e18c0dde7a595a349766ea3682d03e4c46801af4ddab63daab65be3ffebef9f879750c0a6d5eee1efac63e109abd856bac7cea98ac3b63b98c8c990ee85238740723ede918536e900b36e38841150b1bdcd617dbeac9f0299b1cfa1b237b8b3dd1d06be2e46c765abf680b576b2a775ae7489f526c233842357749a25faa85ad65d728dd72a4ef7df85c575c9b36b07c044f0459f4d18793e7897b434daf13b1e85e0dc60c2880b0bb8c8719678521aa44202a8feaf8649a47f23384a347f14cb29cdd1021ff49de31655034865fff5e9a97a5581f64c54d9ed2e84abadbbc133db6c02fcff086a67aab63f87217eae82fc7775aa0fa9d9462a19a64b2e490b064a3af1d84ffa0da4eb931d19ad97cec0d309e009d07c8cc837d97002ebf9760f4a9cdd6a60b3f0073bb77d41e2287e211d8cafa5a0b5c4584d1473499ec2474854ca6db546f5dd4f95b6b3424fae99534b8e3bb3a0605c5634f317602057dd3adc62db32ea5f2c4568237ceb45e54a5203d9efacb6f7b045a8f342483db9b777e702a66344cd0734013899e2f73640519d4a831f24b4b2e61db88fe3797f6ec51a35e00b21a693663da1d484961057d2fbe59211910456490f120a7c9c26dd4eaf963143c92e49ae307a3909c083c29cba3c74c794a7d3b46c7f22785946165e205aa36bc8671dcb0ebb3e2cadff6f87ea2857a6c3d8b3b2397136c04f120e966d473808dca186fa7d874cb2ca9df2d30cff935d2e0ca61d4c3b8c466eab93d4adc000ea991697a8359197d12dd9fe28c666a4c84fbc29dad59f56419be8852602f4782e25d3957a321a04f94eb8280d2256b54db46745514397be42f93c0b02d09c680348659169a63323bf3b7e349e485492243ce42e0b933bec14c7b8feee51401331dab94f89177df5f89ef5ccfb1d27352dffc5e0ca6a696da19786d3bba0426c70aaa7ef47efbe07c4a1e4679ed589cc43f0b1099115be8f450879cd8775437ecd7e1a13521d72e7ad4a2a1051324871925bf05bc10b8e13654f7dd9c7651d85a58da5c99d7cdede20fe44100be06063a55afe39d0d8f1ead5686e76fd7c17f47f5a0533442882e62606a965050e7a3d27f7d8cd9120d59c9140e31cf12c567f2596cb0cbb43f864d65be43abe88ae5cf32b84f00e69a5ade1cbe494ed7c70a1c30598f5a797545194a2f631da958d3e5de560118f2b58da5a726021138a55e8aec51d98ee25f74dfa6e209864dcfb40aec012e18020ce9b800965e532b4f4885ab73824c2ef747def0cf801a12a783fbdd98136ecb63eb197f8a73e05898f3591d82982838cc75f77a8969dfe9d9a1b688a8c17a481c07ac0d3b049a38f9d3d9823cceeffb12a83206f5e532050ccbfe54c3c911e34c2bb84378f9f8806a14d9b9a5381ee88a5639e255bb42a80e0fdb94ed33fa6ed00f6a0d688d82e5ae25b35991c368002f74d89d4a53945177e017e88fff74f4c48851e4dd565625a6ebc3df077b33d0d7b48347a06f7d3085e7c1b0a155af4a4a6de3975135a66983c3ebeb53271b2d39a9d03d1d60abebce56ae97fdb44e82898cf7a5b67c38f4003e108dcae16ec9e592f88fa58b9db772f4f32012ceeb1f4fc34923b6a6e41debf19a9da038af96429d5bee5a2826bdc2e76c5060779326c283fa330d3d1aa59c3cf82f5f3014f8931bf92a9a10eecfa7a0395e7a2046f201080d1412a75a4c461f1a0bc9f108c58e87f949f8bcf17434db3c7b746d78e2b4f7ebafa102b9c81ba9f536433ba91b173f2622a18dfe3822d79ca5f93093d4d17fe0ccf7366200c087039912bd4b03176b6c8db9b739573358448d76cf736e2ebb9bc133fe13998a68c0a00060f3de960c6029a75d99afb2e964880c32e8389cd1b2be8bb89cd680ce2e043916dcaf81e8b6a75f936a0d8c2cef973ed4388a9e621ca7707a64c91be2528c723ef627bfedc8ae2152cdbdb6ac1c7c8a239a4003a8b57824ede4cc3589b5f1b4d1628c8dbc164a39a93376ecd7e6d85f5cbb4ce83bbd4485472956b9c6e3c84d8cf7674529c0eab1cbe68ae6348c6a274c3d0cf89459b80edb5612ebfaef7ec602c00df1ef0ef817f581759be7114a4ce43374e61a1135546f2055691eed65ed1b7ceb6151e9efab8172ab36e4bd417956a70b792c517975ec50d73a7b77d143b91dacadfd5f17a9007fc4c4ef9a317c8615b6a38fe8d84fa345c586b82943636f492a3d8322bb81793ef1cdb2f78381faed4d848b8b056ed86f1dd04625a72b10dc32d7740a0033979bc158afe9b19916140f475b5367f814d55ece5b90a0cc706417519c8f4312ef563b0fe1c5d7ba5c63d13dc03b05282790873db613e6fb45a410cfda4f0cb6228240802ba859b09e2713b438a3fdfda94e633f535baeea281171beca8e8adc2e0846b77fef97aa8b9fd349c8d08e4162d0292818992cccd758a7f3d2b1a871d3225aa4cfbfb360c7823ddf4d69af06bd6c6dd034021dff8cd610961dc2ab16a3e07a0e7b7e63f6c476215b1afb363f428b59c6ab50612cd81e9cc3d0ef63cdf2a63c0adf58d717f49a40d6da779618dc2c41f8fe3fadecbc773b16fa0beda894acc02e16bbadfd6afd66f5efaf20286a5f7db2781143c7fa5c2775d90cffa5027dfb02c5dbf74a1c24567cfbdce2a735cb9b0aea0bc09b4afaf0db9a8bce0c61784b5d032f4ef7d3887f63c41b0d46822add1101f5f8c80db564011a477dfe89525faf10f2f4b6aa168ffa90ebea48a5c703698a9ee6a263a33c08fea21a1026926c7886a310935badc5e1bdb06b09c307720f0b56a209da0fa3a356223415b014b6572985eaa3eba323e4a7343b0691dd988720737233f6f88459e7f2f57b248762794e20451f604163fcf5216a114153b6aafecce6fba28fb4cc785edbdc06efa25708bec02cd342c30ef087a65a0808e4c53341054a2abddb38db5bef9f5a23290af3ef4f321458a121d65c04588bad75da9431865fbf9a3e8ac0fc9cd92550ee9d8505bc8a24a7e41e1bf855cfd587a71bd5022123c8f74dbb37fe0fc11774492f439839d84d483868fd9514826cf09c03d59ce8b703d509625e3d2562f6e455c003040d6543c815c836d5d83d74d6ae9926eeb7f364ec3397d03ceb6c89c6a905d2e63e44bca69f89643b6353e03b0ac49d68ae86f72552a17aa2b244d2985ca388a3602438d84bc157b034b618b39ebe0480bce56e20810db3b7aeb083a75d946ee160062d475e10b500b7468ee95c11362d404a0eaf1620efeb25d0d5991ab68f0c704ab04e336d2a5bf508421ac59fee6fb158715914c7f650323405e475b273d2f4c4c93f5aba08d4e4495a98c5aba3c55e405dd86978381b124106540dc222a790cd03de7f363ee53cf57e48e9e589b539662a9b07a6c02708393889d0001d42347a77e4280f86e9df9ddc25d6e4c347b3ec8645c1b16371cc922d76e74e061e4478887d3ca020a1d3fa5bbb1b9e5f8aa8aa4a2c008bdc9d8c7df1e4e8f74dfacc35c0ca5e2a8fb0c9dad1ac51ba630e5f63d5db4560fd707cb48ced609a065ac84cbc601b0a9d1f38d0a92f86deae699151f8907e0e9354f603ee81a70978047162f0c8dfb977da0118d48cfc44d4b38b57bcbf233847d72b22c5e40624b283a7ec0ffdc528b630af7c8da13b3f720958666e8d2e2ea02c66bd502e32d78ca7668f50f12e30f7573638ee606c7bb80dfbed3b55da1439a8d6e19ac90bcd0e0248045a072d322ee553160b4e0827f564c068512737ee6f46f71821f7bb7a296d18bea49abe2acc587359da06d84809379753dd448c7412247be46f4a178c16817cba3c75d8bdb2902724fcb441ec95b37e2592a38aee0504cf76cb2a55e5671fa5335a5a400c464f3369fc9be7f78c89021842704f6781cc29cb995316b508e91324067c375901c021a4a28f96c9916ec7d2f78736f434062d7fe454bb5003c66fce0c04f5caa9ed6edc697c84f13e9c274c7ffd7cf2a3611510f3100bd5dc6269bbd48ff0cf994840b549dddea6f74fdf70aa98b3660b2e7b5db04129c5bcabafdf4caefcf2a623ad8b8f45a9cf644ac964bd5201e868e3a29348f0dc216455f4db08643128d33797e5a4daebb51e50ab6e56da35c1999b5ddf2efe26b32c570089ceaca6dc512113b346d431c44daa12e1d512ac311595798d849f287ee66cd8414cf1fe5268e06024df0358e33da74092c292fcf777b1c277adda59a16e93f19d6b94c116585974166a47ab53f91727b5e7248090f2f692e1b70a10114890758db86a8590d1d30d588a15571b01d07425f146a2d1ae0ff325206054ee53689709a13beb04647c62493cf92364222ab2781bab03d06cc84ad9625e0a7204e9f7cae5446888ffe25498e00e866239826d6625ba6c34ea96a140c25d66a60a201ab870b6e0b1e47a3d1b3088fb9f6bba7759100d906d220d6f409e08b4688ce0e7fde93512164d1c430c082abbc204b7303c66f49c671967fb24c0df6c6d65424604d159ced5ae844327e4d0b22caae2e3d1aaf0a1b3ad0450e605b59e40d31fbab0923005c9bcd34b6c4ae7d50b0ba8342f5738bf48e2e4b7c9ea33a27c31981ca912ba9f102c0da18862f0bbb58bfa9a233e3729492b2fd082855321b1188f5f88616c2a19d799582871018f68acceefa5800bfb748cad2836b6e56db4472b6237e6ae4f580dc480b2f5434acb149c09964908d934c34f74ff680d28593c58d5db145d224fbe3ed931b77548c73ee168656033636649a449dd03c334c24545300fea49389bb59b1b6c23672295b49ff47842c87754b9647324515104cf27e4b44fc5b894204dd3d3690180dd16b7dbc655dbb54585fee9d0dc79d9285a1c6d84dde9e26296d1c2c8f09e396ad9ea1e09eb231c2f48cab1c6a9edcd3c441cdbc375e172800055a9f4b24ea072575bf5e08ae9d57b2df6de3e2068751985df6dd09d380bd8dfd1ab0d3443d67857bd726c64bde9dbd1d9b639ac9d6d5dbdf027847090c18b2351519ea79091457f5aa8ce909518baa71c23ee677c234302864e8a1fce9cef243c07ae49669ba67679324c05f9545ea837337a86575dc7dd8df0c39a44195438239cf9f35d517d3367ac77fca744e016ae992334c6b21fbd845abc0f11a8a09c08c6bbf116241d497f396ea892c2e9beff2a280e790c8147349f2d33872fbed3ae9c05542f1cfa54b2fc2340985d49597a611e94cb2c3657731895867685d1ad801aa7481550a7e2129fc0b9f8d854005bdce5346126068f5adfd70b46f8459168a0a735186f2561e2cf0bc49ba91bde23dd27d9afe0eac52652f71860c8a7c953734e9b973a810371bde9d04f7b697ea5cb670df49817c32f96d53d2ca94ee72d3bbbfe2b07c2a6e49ee742ecac986efeaea32dad5b4f04ef120a6ee145d879d7830e5f2c402817a42cd80fd2d03415bfb684346a8f8b880ff0c5e0ceb872affa3d22f700e2bb4eb524806a9e2c6deb72b41f10626af2d8e49fc8585612f7a2a73bd24d4aff2a87d6c65245033c57820b9e459e0c781dca745364c6b6d9d36251b7d4d6013cf8387b583ec0a12d01fe0c1064b2b319b0af74839275f284c7fa1bcc22a65f53f9611fa388d3726354f0e6c6f5c6bd003efc376b183a90016b0a6bfaf0f77e9225ad9474bbc9c2f5c7bd9724833c46b581879388bb4bb32f8cb247a6378f715bb455061da15a042ce3f593ae32487114e3f4251e86c4096558e38397cb2cb0a28bdf71f15079c8089049ee90e9f3cbcc4df44ab51bf35dea5655787b06a19c72fefe3bcb4b27f8bb3d09e816fcd1f2e157573c981df32a7a33b7d960ff391868db495a88a8de052bd35465356e46ac2bb83489559f3d71c758da683b53900736cb8b438850652c7471673b01c4879dd50c94183fab232cf65ae830647df4fa22ffd779314c1bf96406a9f23562b9c3def15b62efd664351e32eb9d18c0fe18842fb20a6c1f1650feae6f61ae7ec1e49b677c66bfe75318cd4432f5f69c03d74beae8d226369bd0f8e99a77f0a0bc3d33898f2f4e873b5282425ea083dd6e017931fbacd160cb003c9a72ae9fb230cf22936a5bff07f5c134ce1d4ba62b4714a36923f2e06091ef6ad973d307a061c9b73959397939e394c9f8e40a2c3a5cea729861df4e85250c559af54f968869c5954ffd8a284dc3d3a08b29a7457de15724f31e811857b8ca821bcfa25c7ff6a936bc0cdabbca05ce0823ee9f0573775b0bbd44c1be55164eac296a7c92dbcf5463c267a2a494a106c618a6bfe47be52e0d76e014c6c356b64232ebd010198564bd9641459bfc92f1933ebcdc3e4306a72259af0f3983e7e4e725593fd548e8c7384655d71be878c59c6846eed4b7a800da2a2bd52402887ef22aef5f8211360b9aec6061e40402e101c8afbe4a94676ed457f2f7193705b4ec1f02e7df3f0db5013b6117770d1cc856156456a777b9794863a5d9abadc8e214ee230d55e797675a4e47609d1d1789248bc5afd88dbb8f7ea59306f5a28c6edeab6e58731288e4ead52245e1162f6e69b0f7642cc878e0555ad1591432c74d6f8f21b66a03ca84c989fa0311152d3c14f348cfd9a5af0dbdff90efa8909ea223b1f9ce91040e2f62f1cc0fc1f212e38a12457f768c58043d04da0c585b7862089ef0a3e1c88b5af57973bcc7dd0272245aba0b7fb06ec26ec5f62c4bf2757e60ba4acc795ca13516dd6132c0fbd453aeab3bf5d58dbdb87dde3356afe56f3723741f211ba52f9a2bd77b0b8a1e0d56ea59e9c23bf0b4eeadc6cab0357242487a45c53dad72d613f12d7b27c88822c00bd38a8cda8b850cd3bf111c930d7d594587cbffba1f72def706a0db62c24bcd3b1b43ddbd2508f6d8144b270103c7c197136c1cefc17c6d218ea59e027d402f15176a39564c31af3ba8ad64bd1f8bee34b89ef49eea34bf26ec34b79788a3dc2ba65499f79f13d98cd28086876fbcf01a79380c3ef7ab78138d5040d6d70652818d15da5aabb234f29065172509c691f5a2c0ebe8f11d8ac7b6710cb494bb981032817c1a4c283fa60327e8e0eaf704a9ade5bfdc0135e5756f528ded44e0da4423fe0938abde28763cac7e05e702c2cceebbbcfa6b1aa124b49deb80fe5e087f75ec1d97c5e01f435de5ea66a05555281c30264a2377c232ffffe631accd1494ecad617f8483238306ce67d6966cfb3e9e57e274e9c5bfcd1e52ec066262a24cf698c01e66e95dc015df17b14367acbeb288a549ff98c4795bd80ccbc16d82e47460b802b6224e16b489fd514674d5115f641b3865b5a88deecf268e6f0d508d59baf1a055ece3b9b495099aa0e65dcf323cebd9ab258ab5c8c49c2396088eeb0e4f3cd1144f0c6d437dba6f0306be49da7d196654a6fb71a8696ea17b081d97b33ba04f9aa1140ce31f513a2becdd00810e133dc10dc39580ec62e2259f939d24b1763ddcaeb704bc6610684c012b2b04c0a260b69135c72e013a070fcefdfed779629c28039fd63ab456eb8fe9d236f5492cf4690c5a05821c86f2e9fecd2f877090d7bda1a098fe38a1b69ff55a3d6c70cbc524a31b1c9199e7cb76a05599a931df38f3a407741788b2454368db95aa4261c17270013261c3dd7c67d9ef17bf916c70f18ac427950427120c23fe448d9b2c79e313123cdcfc47355403257b6aa28e13fb3078836502bb21128c8084cf4d46a35a49c4881781fee8bfdf71095c506d1945bfeaed82b46775c0be60441da63c9af0e91f35ea759fcd2cb909f90be4485f5f07a6df72424598b1590ea7f52c15dc62f87cb6d34acae040e2def944eff8242d171967149fd1179c7bef825dd22e8b149ba054329e885efa4479aa7e71568c6d02e1a7befad4044fc14ae261edd9ed9e2552a9c922914cf4f3a61f083d1321d4249153afea9d73be562f846ab9feecf193e425993f66f0baefde6102e7f74db15e9b36c99fb8fd1f6d445c5c3bd69704199b8c02640f56309242ed2acca0e02a0ec7ada2c6954017a8810f8cb88c9f15a34175404a51cc0052863376f4999004c7fb2ae4eace5cf253b2788029a0db7b77cccd2ca2d66627d0ae197adf2874f80a03b2f677d777f6764d278552f0c40648545257deaf7b82617b77a8832a899f844a6002b1f23bbc0f9ddd0c6cc1faee634e196c1dee2678868b99590a2b2dea869ee03c3a38539c126711e48465bd56e67209ea69e2c6aa02c9c0a61244a728d34af4870d4af12bf84a6e3308dc745a045d5e29cab77ebd8664a114855d9da3e70df35ff41f4bc9eece5352117a2ab1dc9326b2dab3b5281ebfe40d42249bc458d1451ae1f5193801a8516977990cdd6a54c7e2ec66981ed3eea62d356993cef627e873c1fb194ec420b1e4ba5feceb7f2777e6e379937f3a29f75997a25826c228ee6fa4de8caf5da2ecb63ee9c1c7e208c3fb4995dcded9425dae69f8222bf05bfd854da4b69bf54b306b77882517faa6090b5812e896999e5036739c0d9f8215cd208f9b61c9e534e207fa53d5ada10cfd8ce9c3f4edb45cbc774b2d999f33c7ae6c06555a53376e16c194f1358d0dd928c1962a7d4ada5482cd3b8b2b2eb889ff7512b1f3b44118197bdb67ca74dc0364346fd4c8776d6bf69101d58b489b5bb897201180d67ce9e81cd2c2bd02bc0d61970e7e5bfa1d1e6219bb396591335ae139a8a3da29d853b6b29e835f64406824e505c8827443b8827c89ecc888758718e06f93dfd6280e6a606d269f96d1d183d9d2f8cb1ab27b0733b1cda954a4851088f59beff780271e24f0849636d05caab7df508a38f92e147e434c611923100c58142671e681f2a168247ffce153db986045eb56c43deec4a29a9a2be2e8de689d41994c97fb06f667481faf272573a3b949038a0423d0a2f4328fa7195910111bfbfe6e076b50d35d2a613308d52ff062d4bbc54373ec2fb0aa725a92822b07a8406f49b829a0238a3be02d061483fcbd53336a957a965fa5f28a2c1f074be21d33fe513c6082850311f3e7c6aac51644ccc321aa45291cb2f96ae8bb2d074a97320c7fd30d25ca593c26d042b6f5e22c0ccc54b43698c20c5dedbf45e1437efe15ebd117b7f87a08a69bf9850921d7643d44b35ca212a15ee747c5c39d1dceeb55c4c7b98d5250b9d38e9800d724c2d34fadb0c6666d7faee8d4733f8ece21d4448de84c23c0ba56c421896703ae41f3f59f04a5aeb1131bb106232d5d8b7087ae9f3b24f9ec5aee4ba1c824c4af49b52d5d285e52248b65b8789864790549ff783ece3e7ff2876319a3f8576bd8a1ba8f47dd408955074c3c3973a9d1764d7d20e7334454abcdf1cfbadf6683e665d9de19a5c8dc4c1bb45f35bec348d9b2f928d2fe90d82a687fde06e71d9c2283f3910447f28fb151a5142966286432c1e1de6d485366cacdbffe809f606bac411d52994fa0ece3a5135b93b931f7a9592601f02fb7c055222686d1386a23bcb513a7908b0f2958077a9ef6ece7cc786a9a2e5454238cc0c1a7f25f099e20734b034c038f5bd727dd443c1c9759929a7ba1303e5b85e176b94e5d7e0ce85059449ee6a5321311bb7e0c7d2936848394262e7d406eae4ecb4d9cbcd85eadf62e31831af30fddd09eb79f8a13aacc9c9096108af8bbbfd53c73bb20c4c34ca94c7bf332f5052c2c1a4ade2c67b60753830f95cb4bf1a6bd4f558353a51f2fb565dfd9dc8db7035fd86b63576884121410677278d1c7aa457cd4498669fe673d23ea20abaf0dcddb094100d2441dfb116785086d1e76078e460086f7f60de6c0b881595ffab13ad1b26b068674f4b81a65e9eec7393a9b47eba142ba8e9e33e5445cb13090933dd87978623a695c757ed424d319fad4a2fc2cb160095428c7a88b86398bc76609bc2d6d86c85e0d6446cc5ba7426c0b8604b6e0a9d090c5e35e59df7c019220298e6544241474a32b3ed1c82056ae26b474330fb355dab30917a89a666a0e7ea3781267b84f341fde918a398621da7390a0c5d58e2aecd4f65173bf7865c17e2f009739e4575f648102928fce2cb4c46efaa2fd4fd4ea2d372600aa52bf5ce378a8fb8d982f0fbb27f325410f51d5ed9f67d2065ccfc26a4536428a8770d3b4742c252d10e74f5098d049d63a3eee478e59b2a28ddb83593b1af0e3c430b5bdc5bc84549a77deb287952f6e2f8a9530ea3d9a3727baeb6a121fcc0d49d8710c31f69634355e0a57606d9b3a1523ca89e617446195c7ce36747da0b2a90932752282aa72f8fea4159bb750000d3ff5368554d46e011bb0f51a6a7054eadd670f4193d3a54f1b81aaa7ed7d982e23c0a2f32b46e0b315a606c2a169c4e28c17b513b0a5da04e54336652d8b71d75b8338f721bbef468c9b6ba65234acf54b1d86b57d49131b7830bc2a6aa50d49406eeb6977ac05a9f3184a9785590717dd62669a7cc8c378c525a55f86de8097dbc6afc69e4540ef3b046d96689aa322880c7b63e9f45462383e3ca4d7c0f5e794cbfdc5053ff3f74231c3081d3da6827822b0c33328a1c4a05f328ad7c229ff30d1530ac66825dd0830dd76eb850626b9203574bd2e7c4f2c911cdd021eee1f0731b2dc0eb51037108172ddfecd0fc74825fd38d31b2960781cf07a292aaa39837c1ff959faa32e943bdb8d09ebe18100293ef5116de1bb06568cbcb084d5664f34226bbdd501607e3c979e75e5f0ba46cdf5cfa9d8501a9f682f6e8af97ebbbef2497aec0d008d4628c8eb024d8255c8cd5f68315e188067a6fe57e259c7635392a6a6b997ab1f26e5b5a7f4d5353ab212811afbb54c69bdb18056c42a65127a5a4db52be5c17c49b6467b304b762d25b5a2531e07f5c3194723033d5c21bfd4a5d8cc77783326e9cb8b36f14b0af6dd04ccf6a6e091ba8990b5ecb60759b5aec6e3a172cca9ad74ef3611efbd89d34bc34ed19cce8f4e86b2eb5f968a7ff273278fb34a84fe7639ee1c7b1f57de448f553c1fd587d4c234b1ddbf553099d445c603989d7cc04a2f88b77c6e24c91e1ba4ed1fc09d39d659e4886ea405bf180734e6583ac8b1b8d4f3a7a7137d5df2f1bb7cbaa4cb0ace89ef4b454a5ca1297930e7df22db484a457b2c97646482c3b90a4932fc7e88505f9b6a9dd1fdffbd44d636739e263185f351ae0047f6740f203c75ebdff6680fc3fb8ee839092ec7070b08426f31c9bdb0853654a41c42234854693fbb6453428e0643d934fe9aafc29016017dc7a3b9ecd8f2ec807650c23da04f61b3cc64f1111d791bb0863ee93ea71e97863405225767b4d1980bd51ca67a97527700ad0f4d12049dad252dcc48a561d9ac9d6bc64c317405a4215e1629b074e769f3b265dbe61c66ac100dc5d6522358e87503afba0dca67a44a49dc4c845ddb57d3ec4be7cade01241f97d377162f3bbcb930ff600d7525df8d4bccbdf48cf52bc54735a8f5c876d4e91959a339502eb81608a89f0dd6b8635febaa3cde823d53e1a409388941cfece9f436c4a0d95d9b63d6ea3614757a42f4042aad13813fc30f5850c9080f324aa61d3d19551e832ad698aba5107bc1d46347bffe4c1161d4afab2a88dedf8a51c3a0e8c427f9000b3481930fcb3794b8f0b6cae9107c45628c5a1eb00dc0c225181972a686461035d47903d51b9ae861c62a0dbb615142e47816b0a074a8883cc2392cd65467fccea698d64602ba746372cf6ea702e4e36f1803cefaf1eea9938e4732df39c06f83a1aff41fd4520fd162a31562a0cd81d7bb3a0a1157cefa08f69c6610643cd0a4debfb4ae8a41a05dbdfacbee0465e356f847a53451e9ce965826c17e2bc6abaf757f0fd82507a116f5fdb6eac34cf47f94ab68a95ac2017719e6ed925cd134fe93daa15e384b2ddf9e265dc579e68859ad5b514a53418f6ebc723b3c32d1cebea46f7f17f457a30c27c5fca3cdd932e2813f0a299834bcc32a73d92231c0aa7f6710d5f6779ad4c6347e32e9e290256927b436b250c9cea0d4286773269a73e1ac435b1eb525c60dbac9ef9accbb2a6f850b8d202f1657e579e2d11d86e10a4311c49857fb2f0187e971c120e2cda6015c07c148119207a8038683a1451955787501f5a3209173748d1666148a7dadc1c3633e08c6981debfd0ee1c0194d16de259c9acc424be07685abb41e2d4526098b4ab3e0baeb5945ef0819b6ae89de5c98ed291c55fddffd82f8d21a88e600e00fdd6a8a7c2d8981021542c30b5d062d6a7e3bac076f71877618bcf981e279b3bab17787c4669c76346bc937d460bb6dce8db2f018091a1182fc1620ff016f010a4eae014584519a7e54314581ab1ce1ee8ddf6acd5b965cafe75c38e9cdc36933b16f7d83d56b1045ad1f3d015a675fd8a572ae1c971aea1af14fb3c715d6d7baca432bda8e7c38a568bc12620f33d36c2f3e221e1223cabe84c170d26d02b604ff43e226473bfc1f0a60394e6fbed07c3ac92663c7d4a88ae2a84a5dad385dd4a8550dc67d6e60812d923a2ca24b1a9b09b28c37d3edb4009c897cd86ea032dc913415370f641ad5ff579da2d78ca37492e08434fa4544211c2a2167904d25017b4d112fc2f92baec2d2f81abe20e6770089742d21df57091d9a403ab7047eb79a68c9edbd35c8054a2e4ca00c1f995e32fe5641d285614a2d892874c90f33eb182452600d6f027c82dff51dfbb41dbd395497c6bb01edab32ed08557122323a913ecefb22060ad3e732e495c7d13213ded28bda2fd60ebae2f80ed7a04e52e395b11e4251adf4130b2bd95d32e3c1f91938fd98a392ba3d496278ad0609e0b02a9c8b91504159ea14afdbd400a2d6f19bca636332b3627e47f958cf9d3df55147fdaf37bc313d6a3a09304b7cee1309453cc42a1a1184f6108e0c541f740f0a5a3e32bf967916a24cb57108f2bc3700af5c56623de3fef6aa278f6c8b04965ac38d1317c227e4102c7fa874321280e0a29b5f1ca14e5f8f728a35b2a45b424e5709a08187779f564ef1726a141003f59e5bebd5f08677f3970e80d8724f9c5adeb849301279873b3d13a0a1ee114ced55144ba1f97eed809ec6010dbf83fc5f9458f810f24909791778d2f21fd9cf862e4588b22d299e79dcf595f59adec62cacf397989ddd46850c9d06ee88c9097bc33732cc2348f881ffd65d4ad80ccf0cc84ef045ea557e00e29716df0e365498639231ae14cfb0f486b2407e8e16195a83220f2f95ebd349741595e41abdcddb91ba8b735fd272274445e8c5980368b8e725cf2abf66402f2ea8992e18b5dd1a830740bf06086dcee176731216904ca1f7e8450f6b27a6a2936658d4fba8294ba4c4a8b330d8dec659605942e9f0a52a277f220d02be4edcb8d99ef0b8e40dc012040af3a5fd06b37ba236e03aa8c67ddef94667d0135359c63b90dec611ebc42041385355b615fc6a0c7f44f469af49fbb226a58523b0b27b063b81a4e3dad3d5d28081d183040120924dd4451012974d67b3e5b4410a60a9d1e17953d49d486c2e3e8fd07b7573e692cc6421a00ec91a21e32757f56017b6811112d8f0d3d7d2f9c142ac28fc25de6ff07fbf5ddc4199f21835496035a11bc6de67bcb5d2422bee7e13e2f971d979727e641af1d0167880fa58ca37e5a6e5e7e41b8cfba9b84e8a9ceb964438e901039a20719a777b565c7c39ff4c3c3737e8df5958f3291544955e240cd48910102f5213c776aa0f4a2f2ff170a57e7bc6eefb953833fcb6cd700ab6300a3ee51780e97663d4df085ab4170589236d5d5c0834c2c2d221f6db3b343f0f909f0ed921d25252971d4305839bee19bf06ad55355a109697685c14c59d5a5c9638b1ed589859e0ad44a2baa94cb9d54d08ab25c8a28ed331a9a1544d11b6eca5b6023f4935c42395a6d05e189ea3d6db6cbbcf13cd0d9e88e015291ae27f3a00487b8f0c843170ed1654cadacac8179470696f6a43c9a216769355d8fc0be48f14a4f018d3ede31eeb264b237a99f838d8d4b26bcc3a8b56414c50ceb1042c69b4144bf7cbcbdc0d9a7e2125ea4fbe2c7f1659a3a75c8a3f20c4c4dea21677dac5cbda492be57ddfed2d00bfab9b100a6e28ba772f5ed4d130140f5b7fcad20c05b1ad22032f2dcef91c92f538787bccfb633e685a7823b3ff21c4a5772a683487b928aa81ca170e46a5f23df080f088bbb6e49bb52033db3dce2aa592e40d51fbd883157660acc1e33c32983e1c41b63845bdbfb2524650cf3ebb054fd6b67e12a549ed0da31dfe5abfd6790287a705c4506e356308a1f34450a74c3a51ffd57152d9a38446e2dfa4cf578871203fcbd2dbb191fa440d5e13eb4fba67f3a4dccf7ce87bbf5e35afa342a2230b5688f6b2b6d46ab24457cc1871cafcf0a108861ffefdbe0f159714cb3d96c06136e69a95543877e97ed01b44b863b2ea0eb1c3eaf2f44395164b5deab98913c50023083207d3fb9728cdd66e0f18bc7637c9a53eec7c45fbf0d6cf4a66c40a17ffe9728305af8a73ce2851bc9a1d60de719f0bcb39998889d08610947c02995596482d63f069115c6fbdd40fed573cdef624e4172922d3c3b7e79528f2f54fa3c1366f015eb237ec38eedd6b24e2088e4c6ffef11044b211564f2dec97c1cad81a0baf7e53d20d47a920684cf78c2a8e9c396a7102fd902818538fa6257fe8e82a018a277a200b7d623c4a4e11571565ca62683b03a21e32ea500474e2bcd6a1fbba3c154c8b5c226d2ea3b5d5fb7e36126aebe1c65905e968e318f697f7eb94cbb9ab346a1483f0006956a51e61613e13f8a782f7a0f025ec716236c226522f54e7fbf5cb51428d2b629819d829cdb96c57b50740c4e396eaa0536d7a32814d4910bb267fecded0d6118bf765258c277ff4bdab746be09ab3dc201f6f7689d3986498b83c22ad25c173eac39cdc930a77e1bfa3680bdd7b61d3b44058442e1478f6ac762d45efdaf30ac9d2b408489881565d103a700b8133f9b456ba60d0107c4054ebd73a0485245b5c0208188dfcee2abd981f3a6f93340596c0778328dcd09d94f856fce5c4376fd9529aafaa1d115efb500d5cc46e3072c0a1a3d9d1a923ce17e5a617f810cd5361ed6523fe09d99329ced89eb5987effc41a4683a454fa76b3df0c2e26595498fd6b23fe7c79908edf89de1c63981730a1c44516e065029e813b5b7552a0afd3ac74cf81070d90bb5bf78cc63828beca13a0761b26e7583289e61a3714e5cb1e7ff97e1c8b357ea733eca3de145cc35b01ebe28d4489eb81f6dc7051c6f3ed95c2af2bf7f4ec7585943e697dbef511afe88dbe5ed0e9dac1e39aecb5e5fba8da3f90026df4aa6faa13bb8d0dac61ba5c67131af28f013588b1ce4ae9bf0296928672668b8d3f6a120fd4ffd019162e37ce5b56a1b5057654efcd9d85718dece6491549967b7d1cd89dac7358704eb6ddc57e8e3aea45fd05d48e3bb9341c0e03cd25b58263de6bc11061fa0dfb5c772c038da97b27d10a5e462847c4ff50ef9a5f18647bd68a7fb202af9cabee0c7fc60b248a9a62ebe987751aaa7e73db0a60eae3026024700a36f95e8fc1bfcef1950a06debf069ea38d01e2d7cf1984338f8bf25843fe4d52f994114232c9a86741b42764873fedf3e1b397c435f4f02b6443d9dceae8e58c4f52523bb84226efbc3be61b83137c43d5c79e0d425afd639fb0a862517fb667aed9116f5c87bef9b75657b4b74ea91622c3a3711c28bf9c06dde8772685ecf12fe0e97effab6eaa2a52e5be1b3d6fba65de6d5bfc3c937de21992b14cc973ab1198cc1dd5657f9cd036a99c1d3590f69dfd4471af49cb5580ec94a859d8512f36b101a3e540b13da8fd34da1df2d933af38eed018efd65fb10ac3a1177fb4caa5e992b28a26494475d4bfb1f0be89d4e2f380deac2c02dc4a672be6061d5e55062e8ac3f533b79e3f72e6b75e701b7464889652f41e2342a54e3ba1d9c659cb294aa336a8e0d177d07b714ba42f0d63c37c96820f0ed19a1f9336b2f538217b7f2953a2fc74df8f38f8d33cf31462fa744d21b42dccfec998c9d83ef5999e169fa746f39cd0e7374ad55346ef91ed514fc5dbaa15641236f69531fd280db498c3f0ba02088108b21d7c0e5a30acb17b10e61c86a017d4bfa2070e1b111533bc4872514e1328c5968b754b7fc407daa5d86040723baece7008068161e6c56db4325b418f66328e24b51ecff4abc11d6cab9e9fa76913fb9e1ccd5cb312c8cbf2a5ac0809fbddf70b7d6d1f925a1a9230f05873af3f45d185d079af4db42a0d086ddafe89a2905b600ac5eced39f0378bf4c11fede792187e9fa694411e06251b77fb6a427f7eddd148da10a4250acebe673dadf81d2b110f0618ee7656eed502568affc88aa0103b65a8d531ef31b2a8dda86f6db5fad00c0579d52798357acabfb5dddd0dfbb2d955757643da1edbd04e341e6e13dbedd8a227d92cd2fea14d0d4182bf2a343c3f50e60cfa2130351696cadd45b110cfa3661156a2262071a1bdf43d2f537a38234f245ca56ff7ebf2f609003c9d19403ede9f80676bd5e635f39e1b95d0baa9c692102ca965936a7b91cc78e6f8cb1ea41bb5eeb7ad4279f4f4a3550d3c28e9841c8926ca17da1c0af0404c0578c43eea32b8b4a8a9c6ae24aa1ebd8b0811c38335bd68ea8f533b017f927737e624dca2bdb167a2521d9f8a2391b4abf705c731e7913a5249042c2b0d2216a8a1a2371d597896094f5286061225a035a050066782169efdb5074209504ec5281ae5351e26ed8b277a83d3f74d7ceddcf0b9ba891909a90bb9fae5cf5fcc880c56341cd14a486c0d62735dc94d11153ca5a08f0d036bda582c3671e63690b17c6f77c4b86e75ff9bcaeba657b127379ed45f87015a25de815cd94580354589ef1383e25a3f80ba1228f05c55bb4c36b86305b7257fbd700889a4ed4ba156c4de03b83438ee10da8827c0786dd167710d9058522f9419551867a349442288fcd996f1b965b1f89f7b25aaafa5fd5a7f5e6830c27600558e76a0a71c67431eb69733c446c440ce052db5ad1a6f6e338e2a511abf48efa44f7950937a73f696b1b5da0b1465589a76e61fee3fe6f5e947fe8150aa78d04c54838773e6d90df28b6f9cca20233c946153dbf4e7fe89b35e0584009f9fd5a29161cb6a29b7c289efb01e5781da2feeb70f1ac468bbc3e12216b9e1f5a876247516936b2c0a307bd78e1bdbf5effbb1a7363db9501a6353c438d61b35eaee9a2012cdc25e54d79ea761df21620c6dad25365b3f9b18c974217e607da609bd4f56935972737b1c111b70ccb60009d66e186cc051d9017cd045d434020e64245107f18b5b7f12c64a4b59d9536b0a8b51361a68cef74aa72ffa6801aa3a77acc6b5d8ad39c22783c951320ea0d2b1669ae80d88988d5f974a0815cb9e6b149f551d227a6ca4536148469a093eff1c44a4c5f1068bdb1c3e09143d6aabc3c28d95d3b4a592b30c55889bdd7c2af626851c749efc3ae830b3532c8f090245c7c994d22050f4a733b7a81ca0ac6a5afc8f4f09e9398a6137b0727506a7520fbdea6c1ff795bdbc61c40f0d6bf40ae69f4b85345dbf092e3913008fa89931da854be7fea30109e5c21be32ceb406d946ca76dc909462cd8265d67978206cee59f8a316a8814baa72c4110a4a092e757fc129d7b06b8483d0136f6ee856af8db9b0ca2b554c227acb11de5154181b2741b0219dda1b36c2aa7e77c1c0713795b82788c9b32f49641297c385f12b527db9971f4f1360affd0a9de7e75cba7b6277638261d2108856b018e22c1126c501bdd5cfcea8144323d1d2ef36bc49cac36c5fb7aeb004dc23c3967457ad9f8c3cb0e4374d9eb1c4738150c95a3d1bf3117e836714a34885c8b907fa510b93fd67da4ace26dadff9e406253c43025ae8e69a49ede9f61735947d13212ced23a1699c7a1ed13d9919e812d01f6a22f5e6464a4afac20dc3841fe95411e3179761cb8d42d47fd542860f545b8b4bc4b95e29f5a280d4e72fa78551850a8547596a960c3e2a9ed8d4f361a4c3e31fbbb704ea1f68dbe34e64c6d856166f38f81cf1431c856e5d93345fee56cfd624feedfd8e083a460a01fb78c1fae704fd1916a0addeca1faaba17c42e10784b8aa6424c5430af8d8b43c3912a9f5bd517550459a93aae048bea91a2d946f0458411358df44ac5ac79f01c19fd44d839d9c8c5396a8ccb6c9df607b4aafeed3efa37fe642454c5a0a54ccb4a86450593c423517419b02c65df329ad1b9a5fec16136e0e71bf37d253811d6bac00c2bb8694e22d4cd4913a297cb4f27851ef6e3dae7463b756b45ccd39fcb34087778a9c52ddc226b5883f00a9d842c4bf17192d605e4ee6fc0fd7ccf7f54beca6de896d300a179cd2ad86e3b03bc6ebf878d419abe18957a802e698f54069d1c79de151831d01c27427c58c926f5e3c04fc2942b6d1a44454c5703d0993362890769d32b9016c37b680340b89d11c041e95c71f3f9a836d453f217076934d898df52f425c69d3b2dc421170c7c2c7049b0eff275089dd0ecd0fe884686a4008cd80ea44a51bcae0c4d21c8b4df759b6d780481cdf23bf280408777206d5131e6c068569dea875927ba31bb7e77e8159dd7ebceab484081539ddc7e65251bf636ce39eb118da0e3c5e1857b6abdc22daa68a981e418fea6d097a916b4a69b01c549a35eaf55d62c35ca21e9f84f9d2812f17c0e03a926f446259d59af1e0489165982d3489ea549e36bd3fd89ffe5c7ab539388831d0f2a6e0c35763458f5a397797ce1c904a5941cd729125cd2c3e20da2eacba6e46a2774c9d1d5d3ff6afb6b62146468692fbdde5f36cc423962c258a03e91cccf4029327adf22d6042849fe05b23a055085771f4a62e987e378b82d70462935edb6c468bf2e7fd71360a19b781da2fa51e9e22cac6b766a14ff73b2f15ac1219dd8916cea0cdfb74ace541c16f4469084397f1404ced2419fabdf194a80200c9b8dad5abd7bbf1e7c0ae6c9d2c1b1791241cb53e67395329046243cef4c1210e54330bea068ee9de71712a70a382d385869869a93c096a58aa1a02a8d5ed1f30a63aa8b23264e1997730253aa87a103fa990cf26f84c566d6d5133bf00ab94f3aaed0f1ffb20908d605eca1eee6eb06cd1175ac181f905f07526e37767c5acd0e7196dad5eea39108764c5e5cea82e467c576dcc5088047f0debc60b1129582d38e3589aacac941c4b1f4a41a2d957675d0feda1e677278c8da7afda496a0a7dc743d1580195bcdc16602fa3ea95925b59101b1375c64a52c394cc66c03d0b685a847fa2f49a38ef186bd9aaccd4b7194ebfc5a6157b1d1631a1bda60bfe565c4ac64edad5f00e984b78f4751d737bf2a097c6febf1ffe03c5f0759721290f2ae17c52bbf094e94f5436ff5dd3b164b337a4d0fede40e73c9659ee3778e17a8d14effc8dd9c34a630343a5eccbb25600b9088f8efded6be4f8e6a758e66c97c8fbb8a55dad82d193bfb5e910a900a925ae791311853dc441c255fee8dcb438aebb4a60e887178eedf59421dffe05d0e466c194ebf0c8e945e6994aac3cc8b9c00f6622432e8d6642ba5dbe652a9195fd4d3d7db52b2cc408b059d580df593d4609a43a6c12358bfd2081e860f15ae175b35fc9eb0389650fb77099a2e73d7e7417f116466120fb407fe3e9d6797711e2ef2db641c706576d5b6bd6930af02f16ee0b5bb4c1a5187faa5e68e73fe5e22f2abfbfe81c4af512030e7395580eef4b6a0747d5c8e14d02853d70576f02eab5f7c4ef692803ddda8acf2fd974dac14a27cc6d91ec32c114a1c14ea46d159b8984fe7bead76367285e5aa9d7cdbb283a0f96bbfbeabc19ba889f3ca770c4e25df0c1b4f5019d3629700b2b7428b9be93d673cc3b32e4532d447fd813b59b4e6c12784326a06dd20be27751d8bb046aa6fac992fcd1d7a5940d7e715b478cc52ae520b948058d54bd79e37c312f6e1c1f8ece4d99e404749dbcad21bf586ad0cf70cc6cd1664125002dcb13ba05ec23b9d80fd0822b9e55f2588fb89ac96d72e7291faabf72ccc7edec5d95b868180b7891ea1597cf1b29bd6e9f7532e9b1917a5fd52f48f4f8b6358efb7b5ecab2090d45132c65d3b738a734c8928d6ab6ef8a823afee0ba9351ab22bdefb08f1a054a4c136697caf26e094feb9e2735e1b1e5c6b1758810ecd6f458ed48e5cad820c490c4e4fdd60e9b3e005da88207fa798edb2ec5610d5a736d7f8962db1215df0740d66cf3c092c549e26637e4d8ad0e453fbca80000b55c8c97c4bc9faf1fd100784e8d163ec99442dac218c7860994e703f977fef2dbfe627f856f1fa7e9d776e90216911e44c139d224f8cba10354b3a99584b2112d380497e6ec77b088f4c2671ede6726549a87eaafca321df416a619d7c8274f0fa6e66fb6938cb7b7a81d5fa1da8ccd919ab63f7b09273b170c82ac18e6a93b6b019404f811cc6554e72835e184adfe560c7c1616bc684f0c42369a457383662f8b37af62974f18e19497a90391f73142be703b00531cd958afad23619bc702ca88dd95dfd7bdc60498146784f44deeb8c77ba82d52cb03e3ca4647010c41c7b3d0758b0dde9ba1077acb16b33ca8d0605d210e87cbdfd678b475d6ce33e02ae266eb74c0adf59958973473343596b6a4b527b36aa9243a48ed525106d142305529e3197db688970ae006097ede218e34fd433926c9147d67a01803fccf2eec8d8cf3e80016dadd5328718f5eb4899a825bc13981e5023e4e7bd07894791ad40e68679fb6aae2030c09fd0272448db247075459325164655716b491c8f11babe2d2ddf443f63aed3450bdf8af14461afc6a8a666781c86845ed01172506da9417105963fecff0666d01aaf1dcd9c61f62598e5240684730b9e748ff4e4c586f3c8b8ee470e770657de64bd014fefa8efa512858519f70c8be716c3f7890b815e8e48905d9162e64cfaf19f5487780668ed53671246205823e24e351ed934b97330ff501ab85f012f0a428f0bbed75f4a6ca0b4fb55807408afdf16a891b8bbf3b7a97b00d9bf64f12e51229843277a714f26166f431e67bd629e6a6404ed784a150deea59c051698c3735580f06426d696bdc43470ed6f6ba5b8f5d9663111509c47fc19ef328c3576ca62e9c2ebd6d7d49424a05ba9826b2b47c2c25a26d409e698b401e2acb4b934c8a14bfde5b4eeb36e82ffcb7432b9f3dbe371bae16f48ba679bdd182bb99001ba277de6b17ef922afa0ceb1bcd8245ef2c97b9277c4f832c0caae148212b86a43cbeb75479bf152c9790093569becb4a7be4d59966a03a8611af2cc64501ade0e794d7976f5f5c28f1fe7c0803353d82906459b82a3be9b35d62c6e509be252286f7235ae53c11d6e2eee39b590d0d31f054c1ee95b5ced7894374a67d7c40d7a80853dd594424aaad59cd0f8c018ea4307ca13e6e84aaf24ccb315d03d973da528472c6ef8748dcd173408a1eed78b4c13a1d6e9f5c41b07f41adc7a800d952845d60b4aef5737b32f233f1c18d672b86ff70866f02dd431dbec9ee9f2aaf2432e05026f1d26292f7d2137568de5cbf013266a25462cc54d3311cd90192d9f18a834ab238b8125ce07d42eb701b3a9a1d5ae10c46e8ddfaf292710d45e15caaab72aa8be2354888f71393f8f2cd4a72c58b57afa20be7cad45347e51104e2ac25b49f59761f0b90db12d00b7633b832dfe252d006ef43f301184faf5e7f3977f8c2ad5d89b8241a0d0434289df613345f2aef21abc44d68b435f2a1fdc2d4e6e05d2bea6fa3a56ff5ccf27f9174d1047b9f60202761e62080f1c99d06634809204cc628377f5f009758acde35bac8c13c206ac0b007f562378a23c0c6cad17c1bd9fc30a1976af719c0fce36cfbb6fef8fae76d3304e11f5c1b82c51fc6ca6079d2a26e1de7a1dfa6cbee0dfc85bb3e6902465ad8181961b0141e3c813138d699e65f58f7ef235841a18493d518dafc6c80061bda1d8cc4b7856086e53b4010905b2f76359fd4d894bb310fd3177c44b31f3e98bd7331093cc468ad7ce9adf4fc38e0b7e280d986e5ce5ff92a4becd9ceea184b4a1181ab26058803eff06b4c6d29981bbc0a20199716e9f22ab9dbf2760d52ccdb07f8914157c79661a00e841d8a4da47ca7d6ccfba1a1df00b0de7ef61abcb2e65197c9b00f6073a6324cfc445a4ba0417aee695d9bcbd09c44ebff0b3bbcc1caa06552372040b642e07fea4afdb23fc186a1577230a0bff562e0f2bbc4cd674ca8e9fb98ff8b6f340324c9860df67a4d08e9c0b0b7cd173b0bfcc7d77cfb8c4f17b251abc41755a2d75e586ecf5d49dd4604c931eaf111bd7e646b3be468b1ad06cf97e7d4ef44dfbe732e532f84279626f7cf168e22de95ee9f5d03c0cb5b412857d78f0fd1976b6d4ed81196dbed8f0309c7a2b9699e5db51b5c3d4cecd78069e3fab8aeb143de17fc89544b24f7cc28439579eb41317344a699d5572945420e0ffbcb2f34cedf852f5f4b8ef896a056f78bb7901ccca3b4f586c2def5f48281fd1a5075360fa1edbe2bfc0742e0fd5936ebd235de653b59202bb19553194c3bd13410fc44c3779d23dc8bbcc2bb68ab5876798b60f1c7cb240cb4405fc30e243616ed6d23ee8ac4fb65232b8b4e83697818dc9cee6719a660a7b69cc53111cfd7ecee14470db91e8a4852de85b071c8f6981a11caa34887187ab719486fc7bee7c267b15c1a22e3349d1049ecf28d3cf35fc115a70acf0ff5990aa23d4131a79a0b39fec15dff1705b8c26ecf76263cd84a8b9c2e08f93783dd26310d66974ba93f8ebe0811b3592a58e07e92934071cf90d9ea7c583dc3b294bf0ab7234226d2899e8878d139367668213f6c8d999948b79315a222439a56d12cf94b260382568347a18be26779de4f52d9eadb5f20769661e824e3a084a73f641870aeac0e7a00932470409c29fdd131646ac05eb2d06d71e37b269e12c28e0459df0fd04206ed79678a82d37f917ffa48a12c96aa90083c6f9313828626693515e57f5d0ec93876f7ef8d44d9fcb6797915f9783a37f2f8214dc6383437fd5dc7e533ff7a13d4b5dce917f17bc434d644a46b4b9e07bbb4f6fe79591dbe15f430d4cf49d839bc00cc79f8d30a1334687bfc0d5c83874c3ba2ee83d78667c2e505bb241cfb1418a4c5cf4c97b1371f457c20d41003034e48c6db1de8e441905f7f393fc8e88264f436d369fc6223d060b9e992023b0a99af9f7300e7c04252f10efec5dfffe4b03814a09e5f00ed60663983c6a097eebd6ff0ddcd432cc17953c951a8bd519feb108903c701e44e8caaa0eca8175c4798e052314cc2eafafe4e068b1c27699b3ea9cd00ae0113259ed954789872cf71f36fd7fb6f97bd8ed989219aee9d2bc77b4c674e402f4ff4f342614fce34bc093f9ecabc362d2000093a3e7f1e3edc9299279bd68e225c610de4dbee64e29c73532dc569519756382d016ed0ce4088743f502237a1400eb72c95ada2ae33e55746b3b4ea9e02e504af72a137837e4e6362603e451898256287f9c910dcec54204f035f9c76a96692780657f1ae8a045ef1382686a0bf8977061516b0f293267cbb1effd0c21642f83d7a134f9342b5e691bd62b43420372997a9764d137f39dff39ffe4aebc1e7ad55e34c386ee955806c9b1b3d305511550bbec18610f50bff8fd17ac28f4d1f0c21f397a5f82bd834096d84c6318cd9f789f09851555a77597be3386612f366d80430952435a570113ccd92a4cd0ebbb38f7684731ba4a5ab29f0e856f2e48fb3f12452578ebe82a7212be66110603b4d7fec0008f28ba478dbc31b27f6b191a57cc990724505248b2b71523dd197de31c2569401943d5087f2971b6126f3059c87a4adbf304f92d63cd1ceaad4e57bec78f668a10e790c645634ec0198cedce6796bab1dca4849a6d647a2cfbe6611b0bbd35e003863e8dee82813f80619a2b80820417d8d469d9c54a88707d6b4e1d46a1fff88757e56870a116da940201aab8feea564a773e25d39442b5f95dec8528fce3e7bd28597382f13416f5e681439f94e3c6df3b730128b7fd41b0fad01484b11886a6624548a820ef815d0e51144372a2cc44aefc5e73fe445311f6407775a8714bf0bc3a65d9c28595c367ec3904b0672ab224ce18fba86decc6d66dbc722543c3566e6035545adf1780dda7444e07ae7f97affb3be56cdcfca4167b9c15474005a39d704584b725a9327d12e6d70704f951c80acae05edca3f231430131cf7c0140f8f151166316149f7fbbb7b00ec7e00280bf39bfaace1f04d60a710e0fcc1192e236c702b8ab82baa33c1c3666951c9f3376747674376d9f3db982e949ddc75e0277d28149eb53c130bcbfb230636163bb9cf77485dfea84fc1218698187b080ac655309078ce77658a88c0cbfec8219ca5367342a30d3f87a121572af0c9050f7de1432bb50046beb76a13fd401bb966e19d8a8d4d94365edbcb8364d2d9750acb2660c115040c80b687d8ea1300bdba83508cf2987e56b8456d10d07148b25435f34ac3fa309d7c87ef567419f7a5f650174ed72eea1fecb72aa884afe8ec596b44088bef4ec1efb397bacd290ff975a47f2a5bd2f643e559a819d9b8cca7c07df966c0bc13b5496da293b8cb6cd79f63357c83e4cf2917e6dcd6a3fa063be063fc73cdb2f7a9c9eb0c574c4bf57145d429267891ec6b3f47cf750b0c715387492101631e2842e815c0dd4eb1fd8d5070e20cd0b8ac58f83ba02fe7f2c96f125f6e290d19cd1a92ba95e11c1dc303c210d499ede268721bea0c64af638762d2255cc4d7278c3b32e823842243e043000a20396bd5c3f1f38b8a14fedec7d4c272e3f2025a2da88c2a07c9e311eacc751362dd97988c3f41a136669fceedc190a1db97c7d98cd568b9f31995bfdbb67f147f7a0300c87a094e1a2532048ef7f0b140d92b218f290ce20cc043c20029ac308e891b0889f63bd1aa3d583b869c464976a4e744a2838435e16e8e7499e448ad0689d79a17b8233d0443778142a799d28126590773b2c245f1b6ed688db7418a5679758d85fca9db16eb08a57262dd36835389a5e0fc84fbd5928cad1c094fe8e65e46e939af68e8e28f7b0eb3ef86e768624090e69811cff2ddb082a75274965cc38ad12af58c8ae9afa2a4f6bf7335f94d2a832734c16d1fd7b34552a2ce6094345f9876a489382d6bb79ed11c202ed0550bac016f5996dba58a928119b3fa73c2b8d4ccc899ef760be9651fa02d79de7d04d4976037366fcfdedde86d1d9e2982718ba01d13e918787de8dfbc39f04a0ae8bc070d4a11d0c1b6092c676ebadd0e65bd6c9888b712c08100933304eb55099e241af5dc7e454aaeb6e2657a4c2b029dec6cdfbcf54d950ad0ca9ce57902c99820158732058a1fbf5322dae7b9ec808d6a0bcc64f1a5cf043528e39508d75d59c3fda9eedd9959992e92cadd490cad6181efeeb9fb8fe695b676c84223fc1b043e823251ad74f38b06734f0295103158ca0507dd4985780c8e275ef6575d1f05f0f96f40f6d74dfde3f116c9860ebb2f43158f088fc2c960adfd8d4d6e35c9c41665a223155fac733694e211ca837ba3f4732f93ba8c3e45e556927e6f9c3a6c0f1a7e8dcb84b72d7b890817bb5da6f73b3648c283ede1c68c207aaf3843dcb95cdaadb6a6b9fb4aee34f2ab381af69509c46a6cadc5e17d4c30aa9c9185d7e5e25d4ac8ca21698408509dcbee8027baa617dd6b2b260e4eef6b5a8f01619c960bff67f6ec93d374cb9c1a77f4ec7b2ed4091be1931c61b75ae515a4dcab5ee5c316886a862272711e3d10e4d67f371854f75345868272b610d23a61431d947286c326fe89cf63f2bd6a38fb6be024d430bce84cf2ea0035dd0f7e9d0e54798ae34a2ec5260a258b7f79e02606590fe35279f099687b6d0a91ba68b6e10f8c5939017f68613d1c73ecc36971e34149e637d9b63edf5a3f8cec30d416dd3c10318ea770508e05129e7460c9f3f1a527acdc9039109462a1ae1bc9710dab478ddbbe7b479ff699b164bc430a9443f9834c2caaabc8f6e8dfb4655f43f3e06c4d0173cbc3fb31970abdc6c2c913cb89395586bdf2f9c4d1ee71f2db21a2ee5be09c89b6932bff9d1003fe3db86e3c0cab062ea02ad0c189e118c7c6383b1693997feff1dc7da5291e515d1c1c892a483ea0b43520a4b337759d5c03863d264f0ee611c8b70529986d683c244f2ebc6fdbbcb002d95d913786a471d75fecefc69b1c5f48b0a4db9d9f2980ad3f5f92206fbf54d709a709e89804fa72ec05b4afe033879348e51445379d311fedf0b9646b4fb6689dedcded4fd64d49a7c9ffb43fc56e7674a51a2a1e8cbda8f07ac24b44e5d8f732364b53f714faade14eb4a35fc705121d9184da20a85e2df09554ddf466cd359bbeba56fdced4513d2b3285ac7274229e6ca41e6d4474e62b6ae13777d4786c5e70b44b73e6366f3269e3ccd4355094492fbd7a189ec757f38d45a74f04d4933723adb090617dae8cce9d074bbaca7ae2ed12659bb401cf2d3479600170b66395af0a7c2e4b340eeb729731c8f80c2622951d8552b2d3cdd3aaa75896107ea218d1b7af4a238d6442a6e7f4c65d300d357468cffbe4936c7329485f1b4b26e919d9617588df02625927ce9704fe877b3d97e8783c4651f9afef113c21ed9fd52231ca60ad7b4d574caa3a4f05db2b75cdf1d38b1d949fd5bbb3e5123d397c2c71add5f8231a07630baf4eff9137f8126e59435f8af99ddbe26006b989033dbb7aaf435378b4a415d8a7d33032fc72aa1d502952d246fa6002263bf822dedbe462183762df5ba40ccb6fdf27b82b4972cb9e67f12bbaf2440bd4b4f5a8555aa2850bfb8dad09138051112195b66756f8dcbf0d202b589854838cd013c13d6d69f080ad58ddffcb3fa9dc8f50028568aaa9190af050d4d3b605c011af950d95dbe7a7b9148db9132866ce76e9393031e7fe08d8987a09efffbd7ced07534c355861194c2a7f6b70a7f045169d38a217899cbbf4606c02a502ee0c4184ab0d7d8c87da2a039914e289020c5672a464dca0b8da245e4e92fa726ce58d34537e32e4392f9b77651edcdf2da941ce632641227a05d5a72d7d61f522e454328380b34e883c3f82928da281540c49d221a026997f1b1ff67a30e8428ede2afe7858bd233d7b151471c2ec612f817f3acd88d29958573eaf870b78a14080607df468cd1351fa031d78c9ef9cc8f6523f199a4f8309397c140e38640d5f795798bcff2cf873719940c33b32f300967533fda419578a40e096a912cb1723fddec31932fa068523ee398eafcb290ba8f33334b687dd49782c5b5a238cab5c9031f158c9bf671f91cea4bcb8f19bf0ccaf45bd4aa60aa7cff09b05a6d4a0ea276e794a3f6e650bfb99bd5379f4230a82bfa85b94739b7645bfe7f1a284454297a69ac4cac782c7b47eacfec10c6489f861ff16ceaf2f82e2ca304c97eec6f04edd05207c91860647fe1b89c29d61f23b8b23b8a0b3b805847b42a4adb3b70f6b8ccebb691b2d2f62e32d694acc579ba83d2b5197fef13076c0786e86bec2d21190c575ecf18cdda0135d32998da030b22b29b4a36fbca9de2b8482909efaff218eea34ecc9645d1ae77d1ebf8f9531fa5bacf7b259a107f7209d9df1c51a6f313528613cfa7833c5efd98d8d9d5471b6c9def751e67658179fc7ddfe6b7e90dbec00690814df95a95a577f17606599673b68d261781b9d9073b049451687e35fd12a3d506c96eee354b71cc29f58a2dfc9e76bdc00824857dc3b47220aab7e90145bd274a8145d771e3a2de5669b5f98d1ebe9a877d5c47de51424ec286a8a101eaaa2d49f7d33f0b462a0fba7e2f15948cd3880ea4ded7e0b6c90aaf8f5c6e2040b2a78241679d63f27076449c65031b1b886e1d36d9458ec9a1f5fdb6f02483c4a6ace842167f0a89619b1b85cc9b6287cc716acc2fc751192c9ddb63ea5ed8de86879d8c1ee540adf308a67ea7ba443673249e6ef606a1ccd6a358f23286cbbf0ad2a6aa3304edcabca1bd402d9bcb9a6c2a5cbbf6b7be00843a8d56299156197c68fd033020c0d060918ffca2b01170bb791e631befb321e77346e8e1914f40dc44e88e571266c3b334771670c38ed1612efef026d757c338facad3a5ed8f572bd1221893af013d632a83202edc33f861c7170f682a454eef75fd22e32d8b63249a84f155099ba571421553f91c9233edf00883e7941b36d7e53b96ff29c427d052a774f592115408cbff4688fa6ceb8ab318dbac29b7f9cda09d2d90f224faf133d7ba6321ab6e06f89cf15d4b78c8f93c57669430489db22dc92dd908349ad985ded39673a12a439ddd68f1e705ab9ee414159d307321952e2ef578ffcd9383d3be777bbbf94b886625cca82be1972d693c290c079582cca6b966eb835793aaf2524f4a6a1ed83998abc49e6c49d83acc49ded4a4e44afcf07efcdcde3f0d120892b1bd29303ded8a0a8f887de06d792be48b42645a7a6091e28a524b6e1c1c37a9e2c9ed833d64d6b728975f628caef20569cfb63f7f70317cb422795a8735355fa779be3c9b0275bfbab122ef6c1ef247577e840ae11af149e42d3303d628d65622f11ccd8dd374d291397d327d80192d92dfd1c372fdf3ad4d33adfe333b1a642447b8fe0e574da02ff90a89f4f57c2fdaebdce9551cd87cebc01cbcc2b058fdda90624e9ab7738d5c25a783bb069b7f0a1a27c105d943cef67e271fae552ec160a175bfdefffa90589acfe1408723ea214992766cbb4d541732b73098165d00d71c2932fb06f7f70680b1e68d5f124df2582055c099293f9f23eaeb3728f8d57b4533d92e14ba777b9546699892a7defa9b1ababe5f59208d50fb1284526c3ed62c929cefdbfce227b36eb166ba3f2081670099c6e8b75519aa9769564027a21db56b0400d1812f382b56a0dd9a72e07937b32cf3a629a35e8a97575f5005125bce19fcb28483d4c24a9c32b99c64c1cf482f90e616fe6814bc1fe866583b900498401c1e9669c95f63dbceee4535f6b72aa5a22520a1dfce337eb7c0aee43fe7a0dab94e12c5c746370182f61e503bf7a0cb6f55e70c81296639bc7aa2bfce67181a13dfe777ac1b09700ec07d607ce8e35da9ff440b271ce34450f3e27d69ca8954b71b3cb461d4cd9b78b51c71cc037a5de0d7fffeb7cd9ac92398c532ae6d4347422dccd724238b1a20c981a9de44b50ce5f729467f44e5f90149325427ca1fc1cee8ac6b27a9e709de0c37760cd5520224032cc1f4218f8eb00c495f4ae81c020606b27eed6b0b9a26ccf48a03fbf700bc06dd7d03426b582353ca0522fb607a639e9ffff0c3c03c266933cecac7e928e820dc9402901e63f7613c963d33a8b61230e87071d821b668c9bc72e266a4b6d40011a18e4fc714b58be93f264bdbca875e9974820399feb6a78a1c1fafe52e1ee10274a9eff51886d4a0869cded3b5400612e9ce3d38487342043927561d4261355ae0d067a1363f1eb35bd30705f72fc7ced702f8c907ddb756d566a94f3d60c215665366457f0d0edab6dc979b3c9919c9c5bdf00e0a6edfaa3d0846c421261f92538e7d1555b2896008e97a9762b9a83a5372b9c6448ea05ab248c8f4b7b50a708fa57f655a48ffa4ce334fe19968cdd94d7c3605e390c94103c0ce40901429a4ee4b63e36afd010ad1060e2c527baa49d45a52ee759c2f2a23a17326e79cc8e2dbe0680e8a1e081c3d3102ad3e046d81694c00a6a59500af402115ade0b69e23c35c513f29236e6345127825136880ef83ddf7627cd5108ddcab672b26b1812f7c5d324ed87d91b297108458474b3bc62176271b1961986f8bfd453b7e284a13f34655c06c4bf57cf4bb9de60f1058016cebd46719a270c23bc5b8fac2b6b0fd793f1948066596dd8a54beb120fd14ffaf9d6f820c62e01040ac99ec71c548be8e0723730596088f77cad02770e144399bd9fa2516765a87f3912173122e9d77d286c6dff8e473e67a42db5a2b18d7fa0f698e8e5d119d04104870985886d2408417d606c92e36d657147945aae6ffb61fe18399456c53639425b54559726afdc128556076426ddb177874399f01df653fa79596b89177a19eeca89a57bbcb1b0709497f7a808e612569b750eada36f8fbc917f48d8b398d9390a416e02de6f228033b17529facccf92de699c43c8715534150160719bac35b373181d23b13f32b2bbd84f9f738c3688f6f6d9f1edb0856ec974ba797d892a78a66c115ada0ac34bc8e466d483fa18614f6f905524e62726a4fbb29367577d7b86cc20d324161d7eff933011722e4b258cb43fbf1847e4e43d4a77b5901734d9507e126415d56e0fb69d36dbcff527d63b9f9a54ceab8ab337f58c4f383e1a3b36fe2557f22d44932f57970394f90a9b6578060348458b5a76754bc3d3313f4d2d3b87050ada14337d8e840519edd4fdbda21e428e437e3255535d29048d7642ef7adf41427db7063d9ac2b418c26b3797b932a6ba6c9d8432ea43680e76d668503ac5923aa7e8fcbb832b3cff65398cde5bc342f371467bf73fd19acf3b3ace6613463d8b2fc7533c9f2d6c2ffea9b8b89109dd7fc27ba27d7eadc667adc1f430af611feb4558a162dc495912f2ad6d8f3b6dee62b861f8f3b6d4e2144f4e97ae0c8c5a461e056c0b97954a0c533bdda1410f77203dc48da5b9162ef8a3097e9df32fce0f5818530bb73bf8b05bcb566a4b41a09c7092b6c3f695d5bf41dc624c3d2762571f42c79b7bf819d1d0dbf36a9e092f3c6f5cca158f4aeb6e48f6e535ba45216f8d175376659e453b086b543364a3c6b00fd874b0f580acbd254c9255dfcd2329fe8f73e050921d4a3a826bb1fffdfa1a54619616c65718cc4013f26812f849f8e587002af74ecf998ca75b1f4a3a336c5575b465bc42d6204847b38e6072c67d343e2560bde0e17ef568632088305c32a336fa6f0f896c2e6128dcf5a6dc784d76d8e836ec695418b1d6d9dea7ea6a376deac8e5c6c8c6d865b80f8fb94b18f3b7df466b2ba00c1782073b3de126af9e4f7bd8f0096e0cb5b13ee2f1dfc72d82a3bdd71f614d95946193446c21d7f56945f8e7e2cc3fc7fdbdc53de814cdde3a714209f6e3ce2c9392182278c3a47b901812fed9b6d35975f09dd651d1ce870d0b24e7e54495230147b7a99ef767af11a2a0397c9215c6b08ed9af51cfae2607327a7316d4a78a592594a880e3b0c4ad4f1b322d1fc4c384bcd0aff71e4595f08b418f386a1e323c07593f80f540162eb023e85ea2f5268fc99d44d819e193aa3ed87226eea9f7963ab34ede1d8e58673af845e02a8f9616d79f18443fc2a3102683b6c98407653a68d4f368a0459c5f1e01304b12cd92ba0cf9d611c79db16cc0ebea8957909ef303f014cdf9c42042b34925f4eac0cbad2713002cc51a90c5a49bc1c563aca185d3c0fddce39df60a00fd6ffdb2cbc7742d17ce540c564292b585c518d459d31bab020c5edc167214f0efe56fd725da62707529d29a62169c497ca36ffaa9de0ff7f66b2fb2ab6df0ff16397b4c5a694fe15fadf33fc28f1934b8022d2041e31c0ce2e4db848a5c37920cd83fc2cb853ddf4ebca455ee214cec55ede007dcf3598090b5e852152d37a78e5ec4c729d0ef527ba47cddd4ba2a14d3c8542ac6e49500cb8073ab64fbab650096f87ffeafa2e967d4fe0c541de34497deed6e626aee2ee549f157c093ecbde705e86624da66af531ffd58c30b3c576974a85da587bc18348120db29c534746c147e874b27d61ec9114e5c69422255f5742d8f984c30bb91208072d183f709e0b67d6c78ba1cf91156498a0342eae04aa8c46dd9e435dfd7d7dddf9fdb625132b28e09807790debc28bc7941ea10265d7c25301af67d4e6a49cda0adb27ff17b6b82d391c950ad1edd47b949e48456875d6855a14ec304ad561a62cb5b97c473483241aab9a820cb715c8a32ddc24e039f9acfc7e3a7898b7c886df9f8c8c5f89f99f81e552d09213541948a904e3a71f3b6787920c310ef3f7188f1adf8358e3a0dfe1664d2babe79dd9cd1a252f956750464ba83bb564baa133a9aa282bbda62b2550b706ffb065b3399fc4b71979a3f1e1c1f8f857315d6a6b896d55b83268697a9501a6fd19e91bef3f2d10f5b089625e451052203468b81ccb5be8ad5e16410b186c2a20ff45729bb12d3a6d3d19de0a08f787517d9ebe8d080c121221cd33748257d7460b45e0988ac60e1d409a6c7242929135f5230589aaf6f25470d09b960fa59f1df54d1964c83e9947b29004338063415ce34745372b39b08b390834237a3fa6509896a8fed52f4db308c689bdd1f115cdf8a9217892d3ba812a1744483157987dad098b77743aadd1ef2fe5efe0262cf355f12b9357519f16ce3c3dca8179e6293e6b2ab0179310cb2ffce3ce650107afe4623841d145a99e91c9f124fc4678b67503cf3cd88d7e390bde898ad3fbc9bf5d2a9afe34acb9703b69ac31e0de046cad439880df70b75eb16095bfc187b095a1f5cb552890843934062e4d83543a9bcfe9544b7c52a43235bd2b95bbae5776b48eee008f76c42efebf8f6645376e2a99d95e744e1164293c09404a415778849ee4ee891f0d5ba5e0e8ad8f2d3cd32eb435ca5cab1a4fcaedda6adf1b03ab42ab8f39e7f8235613aa3c948cdf5234202c88072ca8cd42dc72e4e17f324cb6debcd351684f0f45c65c7e4cc044d3fd3f5c7b17d5840dd56819437e54e9fa014e75bbebcc73027243a3e02d0ac41890d021f6a89a28d061c77d37fd45862af93e514034fb66d8bbba2ec5223ff8e14d7fa73b517b0a7537281124c5c494356c5a9acd2aa45855f04d75db23f5cc4f3f853ab049a3db8fde7ea5df298b22c9df6555cf1d7498b0202273ed7eac8c5df07c0711217e95bbe912326b243fb9ac3236d62c5d7c14667414ae113223c4a2e4bbcb5d7f88222ea6698c0fcb83e1f1fc8b07f130e29b156cce8bda66cca5e181c2d2a90f439125b16ffe34d4f0fe0495b7c77cb54c179825275ec9af77de1507763c6ce3e85222b9ebe2b94803e17a1d58895e40c7a826772fbac381d7506ebba8146a27d24c03e301c9929a8fc9213d633244abe9063004c38df053ab3d590ca3aa7c92a494b9f2d7b105c57583240437ff7d71848e547c72e8a56f1e9aa091454aef8570199a5424ed98582636de481ffe266681a878b386c596d4363b4102e28612c074873f4ed4e20b6080bcd9a9ad73ee9cd9cfd8d4c5d1a2c171f777b0ba58c0f89b31543fc2f74e957fb6fe9e8b36997cfe0ad7966663e5419294ab0fce53e6f9396aff7c2464bd22fc385a02d6d442c128230a3d9ed5b571326da6cf99649bf018de69123967b31c5c3d4881e9fb3314db6d71ba929acb71b1aa5dcecc3c5ae71d953e5a13dc3bec7633762cd06205dcca52414b74d8ff8417380fffd938dcc2dad0324178e40a10c691a3280eef9fb0f0b4c0e8eaa061f987612600eb6c03b1870f5b8cbecf877df52ffe1d4452e705e98bce02d6837c2bb47561ae9f0417887629ff2013d53f23b0dfd2d4a46b4bc58ea918886cbecab40e51d32dc5e382b477f6a7d3bbf9cf8715b3ce387ad0422e4de1ecc8a6014099f9e8a39b659900f2f5831aec3348464f6e67a6e00a89ccafaff6aad04f6402a87ba9447620176e601c4c69c489da04962f589bac57f7d873552afac951327d4bc3e873e9c94e07b86986d0e8d13e6cde266ce5eab04ab9c203fddda8c752220dc0c8362778804bb0c585f307d2534929bc4c41d106cb19dad8314bc7c25b0eca9d1fc3fb168dcd2d0ad49223083c9aabdd477b3e8171a5a54032dfabaf9f4ddd19638e20a10a96aeed0ca50a007ca2755600af4e54df9d9b42032e733a132ee3321d45922b56de6d569f89f24edbe2d0f95313ad068626accc4e2cf3be4558e23a84093869d6fbb7562dc65f476139e7ab3b7257277eeb90f8e2e1e486e6c563adc3e7dff05bbd4891df1344078974f8588faa9ac8d3b05fcb8bf4bba472946a0a6677f44f4a007c3eda976a9e8ffd637876a6c8e456a53f1336da426226195eb83a6409b333098b849e8d5222563dff1350e73880f9fc267f8c9d8c0bc8e14fadfbabd18b3c3cdd52587798393c012a908fe221afa85e4d1339460d8f1501d6662b9af7ed97497b511d20e571e7592ecafea8e8e8ac72abe0246ad8e71e71279ad8842ef27a2409e320ba4b465c6ffae5a9115a51998630981882c31c9bb72bdab631bf1b171350ff9e55226915d1419674b503fe82c4634baba1ae119d574922a5baf7d8647d7927b09bbeb65c3cae68480516ec93d0f2e956e2573cc633c632ad3e913234f6146b5944c21a4eb16115a2f3379d0872d262febddb0a3389863ff0323096ff9dcc982976296b4a82ec65068f5b6ea4bfe3639abfb65c94953f4177566928a78268a1c962d5c603262f253d2ac55aed099fbd4dd6ee3d5311511008b0940f2420197f90a6e57a2a684dbe5260169f0ddaf621ce342e25caed26903f791e514943c777adffe5ea283e4902ab1fbd9e5417450f9d550f03d21ce09a240ec277fece7ac77f62fb1902dd43136d62512ac4c9be131fdc1d0d11228aee544f22b2d8d97dbd3a4f0c9676dc24c2d8af77b175366619659627a11aaff2d88b1411f68feb8c27d32cae391efe2d88bd795328f2fc0440e1dc39dfe382396c58a6295d28bf77de25baaad0ec2668c3559e17a8ebe69bcd92e2ddde8ad50daa6a83df3ebc3b0bdacd07dfffcdc4491c8c4d4df1d6136b0bda76320a61f063e8c36e36260f878e9d1b79a975b9492da095c330c377d5835f85836ae7749e2d6c034a109f0c2af5e5a28fb2a6b266c9c287b87bb8ffabdd1cb42e4f5200a95caeaf6697a957c243d06af47525b336da8040e715cb9c77c1e281c4e32a8e25f2a3ea28a9ed8c6ca73eccdb11dd33eb9b09919443edc544f9b76d1f8505478268e72b5b18ee8017fff75779e59752f94b32f2ff763961621c5da00e0c6be160fd19d7f45162cd6da8da39520ceb7d48a11f7fa6156af06abc1447b183d3b2bb39140a20adb75af19f65f844303445b2b1045b9cb8f632220328ec8423f6ac8df5703971a63ee3d0d3abe9525549fda4dcbbbbdc95a03ebe9fe78a3cd558724e681dd292a7313f02101668ce25a07c8ecd646eb6d3e82e6742ed07a0836e6187c5ba1f71f7fe18273bf1d214eff46818d13fc3dc5515d1b0d191bf005f21da42c0033f6fa26596df1fa55827eb2c7c538779e41a610f099ca8b4b5a4e52946858eb01ee08fa17709360d5cf26a1493903cdb698cf8be8f08dac8f4562c3762cc657b7f86cfaa80e9e9b299dc1e67ce425adf478560e0db50cb1f8ee0c81b158c3d06d06f69a860ef7204d748b0b2db4a62fd02b6592ee02eebaf7c886e9207cd496305b453185fc896006514d57cff7901b338e499f74f3f66acafa67220ccaf5b9f30f451682a7bc0ee125f7c20be2bd944693d36a682a47fdd0de6a79f3976b0bb08ceeeec0a1f37746530a93470e2d8a60bf0358464ba5007084fe2ae0de2249d01461d755c226102636d4e44ff5ec6672ac092da681dbfa8f2ca978aebca124a738486a58a685b0d39978b8017993c74888929a7bf7238c05d03a393ef58707386292de602a2c353d3dcc41345e4636629567ee4960a5e32c98cf4c116e9fb7364c77b5fdf2e66c5d56ff8939cb532f21a75c0b2770ff96cb63a29ea2b17c3cc487ceb265e6078dde0e18ac00cd5af0a3a98e001361e72edc45af9eab6cafa819f6b519a7b14a9b32013d3644d503d49a18f2d9ba6fd4fa3e03265da1f282a803508867fa41c97f04c0cf793635493c0c863184365cbcfd6b99acb1edb84ef8cba12307ac4a00b1c84e57d4cca64f4d1318dcddb2eddf052ab47118ccd95624f0c97fb645c3e3ab60a63a3b22c4cefa4c09e44f426aa741ff390f2f3d933c34cffb94983d6703aa38334b946890092ad5256d873f228fe387bc3cfb36c8fe234a40922d7634bf4703551fa587ee56ea6b4feb2ac7e523a71f0a5265137e8a4c2df263ab47f08b0c3be33ca3d7253a0699fb90a4ce880f49539f9990415fdb1d1b418a70a09f4707dea413af5c620b6f6ab40d5c476535445f3073fb693aaccc9ab13f8b070e9ef06bd5c7c387343045b8979cf98ed8de65992346918880b7d5df9aef8ef14c7d850ba6cce5c811e47eafd6628c26c3f70a03124418fbc88778d9a7fc31e52b9a0be0bd4e9a2dd0906fc2371eae4b0b5b186a4cfba4254bd88b1b58d76d62c3043204b16ef1dd2eb7b1049323fe97182f006f54b9fd1968854d3c80641b5cf0ccbf53904bad894967356657ad8d3c5952667e60bd17a2210d1055c7b34559cfb6c22959dd4fbe27497537067a17c8bed7354ddb3a18299d9fe76d2806ad0045ff2f7d839f19ae303514dfb4ba1ca83c9339aee32b8341a4bfb8be742434e678302952750b4327b05c65af8d5141be4db689a8ccf381f226734adace0532ef5306574a0be3fa595702a1584c6081746d7c608e9bd16b89b4033e0a2ec6e18707630c3b184bf392b8c2c78ac4261ab49ee727748b22fa67054f0e5ddeec6a3185532314deb5873fcd6c76f85b314004e58cd2cf8c74d22a73a7782900033ca50424c60e979dc567716a2c128ad7fcdeca70d138bf68508f7b44f114057ab1e78184960ff00ee249e5b8c67f5e0acdfbdcf33839fb65b9b2414305fd37e242293abde4638903e6e94c713194fa72dbe82bcfe6e04b1b44a00937cc7d3071b04232f3e885768c9b372ee191b513e1efcccc20bb536ed29da6bf49cb3161d8eaedb17c3060c1cc05e4f9326bfa72096e95598836dc5692d79870eceb318c6baf9ac145b19ce5c3ed1e7ba67f0a7694fd246e530f24a911e5f1cf1768ce4b9712e3b24435e854e84d3c695970a88f7cb5502dba8f14437917cdb11ccef387a7723196fe0fb7f391a6b0dc9f5d27c4bce49abb2bcf88b2f63dc991047e3101de8c1ec61b5004993485eacfec09762e4fd2a3c1aa186cb91e56370d8242e1ccd8ae6b5b0cdfb8936ac84ea24a41577b7b0e3aeb391017cd1ff6686771e781d0483e42b5bc40e423cf6a049a6387d56c752fcd6c5869be9bc4da8d05e9eff049f8108ff859e5b4fca8de4b5e1a4efe574b13c7798e408e80464353f1d9cdd147214fe58a263f2ac86444d57cb23677a52401f9c9096a9d0ff0046359403d1b2c14da51975e0ecfa2df05e8e2881f8e55d043db1c4a473c8f8f80f310e4a475312e71ed8d2c95669c81a035655c00fb78a317d7b1ddf5427bb9e3d40ba99ecfe01f0fc9a0ada55b3b28a8e03d26d7a8b3a70534ce2de9ea00db5fcbe66f09509b8339054706bcecf6e04c9887822781c019068b3b5b4170821c41915d86469714c43c82bd869684ba73eda7c2a8ce63ed3704d3c72a712f17140f8fd3a78413d3528e9c81dffd6a69bd808152f42d2b9b609d33c20105340a482133ce8d3a06b42ecfd5d665affd56dadf9801fdeddac08035cc81f29c355a8151d5781033bb66ba282044689bedca203b5d793fdcdd66d2ba86ded86bd038eeb53e20d7cc5bede2fdbe1593e99083eb43bdcb55a58529ebb2deb686cd5e8d148d40b7984fbb20962a55d96475363034d5e9ebbf6dd5bd1a6b3e6900c6397194c54054ec78732b894bc6e2b2b48bf6fd24fa313c8bfe661966355cc97b4eb5bacb45b0a9a2aa0f4fc805c93d3a92ee8fc8abd9afe0dc7f0661547a40ffe65ae386d6abd924e71dbf99cbe7554656a47f15b8849f9e2ef4b689ecaf0cf13c18acb0f6c536d5657fab066cdd8f17949a8ba91fb5376a39c753c0486c99d9ecd8f6efa2a53dc683afe7d0bc0d89edbdc345235c55e52c0d8e48fe3826a343a93abc617396cda7edfe9e8c071ebcef60088e559f307e0e9bf3813cf1d7d3eb9c10ae797605596b710ffb1b867b656abbc6dc7f2676f95b6533fc724e7c6f97c3e1a964e905a60d81591a89cbd57713734e5d552f3ab85ca3a0a18b8d9510642167fb562ecb1ea8afa856b8c89da049be64d8dc4bf65d58521f796261a774a228116f704431b22bb49cdbacd18b5c7fffc16e73a906394fd3ab242d1ebd588ece82342010374467c7288d59251a1c44c691237c5e283b2763d0afe361e36575c7109132f67eae3b85143e38ff09789d65f63686f902824ff130ae843aaa2d1f234662f2a6cb501fd37c362127db75a2d38350f45b9c6f1c9702aa4e4ca836880a6270087a8a3153b0500a1d4958dc8a52c1796e61e2525e388ee248e3f41842b0d890026748ae6b3ed2bf2a1c0a98a477ade8a8f423a0f4a3b25ab52caeaa0a9dcd98ac7938bc0ec31a463484c12fe180389a49f995b95fe16037460e753c6c629c1fa59cb0b809de953bab681049ed8dc6bcf6e1ce4793361d6e3032efe578655511d8b7a9c920b1820488eecd3c043eb0ead7e04c228bd784c375e845e2f2e33911c96b42ce39417431a52194bbf167c2341460efc7641fc119006fa4fc738e3facd7253cdfc4ead335b1de4582f31dbdfc16d77a67ffa8170f680bbd0c6612935be7e47f5f845d5a6e30fc821e6df3d69fa5201578649b5bec80224583deb6115715c9959c16369a77494632c39f8635f10f2dcee17a0476e303237606afbfce3766742affe2f576d455de012dd8a47784054b13b6c62ae69df4a98c1e3da2906a955592cb4ccca5e470f4dd96c4fb2dc8d948397837553d1b99c049f2f2375172703143724d5e342b7f9e7abee42e5bf0405ff9f546a6a1df1e7572135b02c0fa67a25670d87b01e567c5cff84554fab0cf2dedafea4d4b724758505b3945bfba40d10ac0aa7c41ef7abe9756fd4f76c8c71017d21984082cb69b30d73233e6260e5d41d967d0fafd3c2cd2d81142305afbbe5bbce973bb55b9a5e3c4d6a9fff3e043024226288a22142f41b5c83efd18d16d001b837dd996a8f03f9f1a028869d3a0f5aecd811ea28ec3edaa85d5a541b3b0348f71fbebb332f59c3a9b4a34845d3feab3e8473c1c3e69a066b17e656573e885e70f060f9d34b057f134d96ae81a575204ccaa3a0161d26af757e56d046d5e68e8128678ccf30d52e0c481c4a46c3ec4433552c458d4691e53712563f87016b5a47445eaf4d525723325e892c4a0857a66c3885ad807f2d2ea0584dfaec3f9296642943f00f0ba2082b65355b289b7d1a1ea0ccf49ee5c634fa1daed33b83ce2250f85e45d06e7c93b0823446aafefcdec45c5cb412442eee5c4eb8e0cb2c7e7940cbb5ca1d82e5e24727eca7c8491921068b04a26c70558ac4c1a36e197fb9eb40c42bc70d27fd5e0b03005e148afec488e8a1c85b6d7c80df8894ff8006154ffedee2dc37bc0a693d79c4997841ac874d6cd63ba393027c78883b580a7b0b92034556e6f42ae4e8928a19b1b44abb9d6dae317e74354a7db291339ace92a613ecf74500a77bccff4a6d637a880067465d5998537d0b83999103c1f9a636344d053e1381597892ebc73050b485e0f54acac2acc7910d215ad89c89f11ec7c3e09254aa07c3e49f45447d639b9293ad73b8c7c5f0468f83648e4b1670c7e5190cf53f995665a32aeb09ac1991f402b1eaaea8186ec6c92db53ed571711d9285d4534153a51779a6d3951fd34874a6771231f08dc8c69a008b6ec43c35de26f2ee1eb2e458144e847def5b1ca36775db98ae89fd25b181b03a656ff75e2105a6f167aee7dc0a6f0d42fdd104dd29abf052a88b62b129454d710a39aa90b6e75ef8dfd7a426cf4a2b18cbefc644d63ef05f351687e21b6afd40dfddcd05cf50064ee379405d43422015e96d6e9ad0643924fd40fb87a5d8f0d63bcb9cdda5c44e5349230cbe77c8ae763e3a86b9e17072482f91697a45754d819db947b46903f6e9d23d9ae36c3aa0d12915badd0696e5a96c4192f22e69d5223d913242769c75f1b7deb5c3dc5ec20fc20d32530301476e18bfc69291ac6d90cc0b40ba56d8cfd613b5f9604d87d5152e5dd7ee4be4fde12d3317fa980c090c43829e433a097f07ca1abb20fbe8cd56d5e9a16249b5c9dd4260e82a1d816de6de57f570daa80c4f8bdef1a9bdc19666d0d9281d6c244dffb9bb2d4c6cdbcef45717a807beaff689bdc8dcb2a6a68c1e14d1c0407568e7849d4c8ae7bf1d83198080b72f33486b1ac4601d7687098268a08bd1b270ce95ebaaa059b156c6ed9c22ad8afff4733d8ce93d3e353bb52db20511bf3201f7b2b68e929fb7320085c4b08d2b1fa46dbf8660d3daabd0fb9a93741dcf03996f89cf9aa0282e63b23f602df586599c0ca9195e629781943fe5d24a22629c51a6314a349bdb6636c1c263b0630ab450ca008bf4a14af9a0e2348fd37d4e7a5c02b1ab7fdbc740f37d0300a9d7dd74808e024a4846145a3b755c0a5bf5d2aa26c73d6c68d026b1129f49a9f0c6333c682e3930ac0b64482e75b9deaf15e2485c2519852b2209fbbdc6bafa8d04e7b85d75963f527084a824c3fbdae1d28bb11c55d510a0faae8000d82ffc437045f8d8ce4896d63fb0748de2e80272b330bc5912e199ee3ff703b31fbdd0a0e7a048ef73e5ddab294c180df274c291a7ae268e22da71ed66a39435b6ce09b631d841b36fc1cea2f0cd2e0f6820a844d9d43763ee1dced787195d4511e6249e1b969b80225650af2162972f9f2a76f3580e44706c2383f6e72ac46210a04495d4536b030e6bd7019e6c53240dc94082b83af1cc2d763284ba2f9919c2928f9a110dec1d80f0bb3029c3e03a32c47dc8ec944ea5e8ba6419cafcda6886b75b5986b4b9a805c1cf024fe3ce57205b8857c0b76ff42956fd6ad79cb136c1857bb4a9fd81ec75620885cb8fd890d9ae559a54aca76647bd1a5f9786afc3c5a7d1e6a3cd7875f3b2b65a49cd330e49e4e242462fb78cbcf01335cb2775f67e659cd54210d4b6564b5d37fe8a4d50f8679f35bd1784f2a43daa5735090ade57ea3a5c34631d652a21beb96bf69afcc8f6ff53352e44675aa5a3bca48a9af651cd7989756701925661b8647b9affe76663d6442c39661a4492346aec48bbdb318b2e0764cece175c75ccb2c95192ce3967582b8ae17da0811fbbed95f5044e69db9432ce438049740e445dfe8db362bb7aaa7213fa675e0fd4c654bb1e99c03f4b269fa65de56f871a08d6fdf41734b77f75c47c3b7a6107aa56ff3fc98321c0428405575d97c625ddf7f5df1269928287989ccfa6f7f336a37cc155f76f9128deb6eb3e21b80d050d7070ed27d22d97ed0ae51452a74609458f1833cee348e138edc6925083cf2271f7701aeccf94b7ba2353476f6ed5a2d033e1045408eca8be842c30ef997a1a2336e4c3bac78a66218ca3a7f15ad10a557eadcdfff7a4a1993d3c57bbb91d44df454150c4ab6f3ae60c8c05c7ffb913e1488686b93f39b0570ec58470d18d6e325631809e925ffae29b932ae5dafed9a21137a55b879ae3c21dcbc8226b5cf17ef3874f85e8574522adeed2d8ffd9a2108924eb1fe6e73328eb686062c09ee775e07417b931b9f479bced4cb281c5b1c7846aa9c47bbc212613992c2bd14aa70e148b4fa04476221b9232b86ecb4bc6fc36daf764bc3bd818ac09bcf6a530183ce09d393455c45b547358a3cd927ab145d919ca517af2a00bb4a742937a6a66edbc0f42e7ad4ac4208e600a19b9db3da6367d46a8900823cec8d01251d0e7668a6b79896ddcb9a3d4680b01b16eae9851143d10ed679a836d81b7c298936b5742f03508f3bd090c84ea278ede03e970e4b15e68005548f217f969df0dacfeaa3590cbea877ff6c02f23a841ec3ad1ca415fdee6072c5345ba2f4b095e6b956406ca8f1bd06765c4e0596c9cd407bb3171b68534b4cd8bea84ad6b60775fe54f196c198e1720d3da5e278cf460741f57e2ac3fb291691aa2142e90f07c59b3579658fd0c0d86a08d1e64e49db81e05531b5ba1c3f2a6549da985d5fb3051f53f94e5f945d695d222cf2655cde4645f9be510bfa983101076b206a97d2da0e72972aed0c60ec8ca41fea3aa047a7f78e2239e202a0ac5f31e7f1e06166dc25b3f6b44b42243a78012538d62b74257f1d3bcacde97a6f2f3db3e6d356d91a5da2350c5df217c1c3988049384234f794e78d083e9a16208ac0ef1e49b30992c62c0a36db8df202d816440fd66fd48926d56b18952dbabcfa9ddb7cff81bbba3787239cf09dcf14d0b9687d252b19f7270ad9c4c7413113d419a527436888fac34f318860143a1eb8d5fa0e3a4a3496369500fa8d53c147d7d39e0bd288372f0774ceab3f48c5e01b32613f71df936c0b60914d23fe50512adfb257d02e842a40a615993ca1e62be51ac4112f4f0ab3bdcb1c739742627c9e723bfdcc32be2f3b6bd44a783361648a3e7988aab0375ad5a272c5ae38c3e846eb1d36d64b5b770c0b299beecdba068db3222ecacb4c842d4b01c252cb22085f1b22fb9dbe84ae9aeed6cb6e3de01d48bfe09010463806a761748c92620924811f058dae1ce975f933c4ff23c654cb0e388fc098d00eedaa292769339d0fd82c34b4edae059ee19383e2bead1507c69a9c88d1226907f67c7a8343d17b8f939d457164b71caafa26703c75c82f2cd8ca3ad25f3000b5155e1411298f9f7619f13360fdb5a3e33d8cebfff485174f5eb1ffe50431163fef7e87cccc577e52029e052106e36e2c1b549a25ee15371acaf2ca87e4be213b5fc2165802aeae29393a82a8934522b8783010c47d1ec83d21745f3522ebd070f54f40bc470dad377d91ef7dfb47ebf52c2f3f359da4be3c7e594bc9689a774372f6d5b837dabc2ae30bebe1595c28eb85c4a3f3ad84f8d78d5461da64f13cb34d5ecf1a15e3c615526499270cb1b048c4a5f77bf17ab34511439d3a45d1d9e8310c4026487057e205afa6b637f5ad489b73758f12bc8b615e1d8eb94264fa067c331be7d8e41db10db0d0c1422d3a6fb534f7e99c1d8587df349ff713ba948cc258af26f5ee8f41cd81f5ba5797339c2ea079de7ecee0da91c2daa87674c6eb49c403d77148922b7c8be0f2e69ff8781738ce538e9fc14f86c5ff1eab830b198ac4810041074970a6c74fa021e6fd30f433864a03dce0ec64310554f9f2dfbeb6c093a1ff7d71a9ac5aebbe805070903d3b606cf9b1d560e36c64f727c51e722f1b247b6bace7e83f7929d43f315518e0efc224f02ab1345320c53103e1afbb0ae42578e63f392ce99e58addb7ada53bd480e694db4f09b1354e4ebdf0d570c945b9139f523682284144a979904c9be29bccda6d83709201bdfd0660f00b6b7ca447e53c4a23ee4c0c65665ffde4ad96c3a15453dc40c2c7325d7dc6c75d3e3df0746f3a015d729a26cb8da59b8779943f892c58bc52ccbba26b6b3d461b9f2baa4d7f97c25397afffd70ae355159475e0920d9b8cd1ac3a0dcf781a72bfc4b7575a7106d9b2ecc057a3a6fe7005af4e3cad9aa1aed89916ce986ca4cf83c94dfc0e4e22ec1b111b3fd3802064a4f2be91d0e3cef9a52ba7696dbdaaa08f950fb1cdf6f9d5197315c2a6954ed7e922afe7184ead62dfb41ae225aa9af2538af7fa1c55e3cf9550529dc041c3b76d9f5a29fed2154e4a6261461bceacd1ceca356ea2957b1660d0b93305834534fc1d1ca9284c8517dad273da7a0d6784c13e51feaf0a446eb2e9eecdcc033dd463d475ec5292e98605d32d50b983ca940f04aab8c9bd969ab69b3d7d4d158439b5ba1ba8983245a57aa5817f54d9c5e5fe800822911b02d5fbc46cc40d5d0358112f43125ed6dabd4ca4c57f7a2ec17a5db8d5fc65533c8a2cee496c426a72628071f85ba3ee004ce05fb7903d59e5b710724b029d60b13d7f3fad4152062ccce80eb7104b86fc023330176e50e343163c6d817bd33e20d9279e37be2916fa4e7f9581fe097d59f99b071de12f96ca745bf5ceb3fbaf9589f23f6520703086b4d0168b2a72aad455fcd8551c925b44f0c558db849e97fbb90f73e7416301da6875d37be5c59b1bc28eea1057d72e5bddf69c0ba9cbb919edeb9dfd22d853d1b1fa413cba2033ceed6eb534397b8fd0a3ac7fb664896a29198be8aaf1d8c135602b72dd589ae472cb06ec2ea84678f5413bd61e29b09c4c5a5eff722df884d25fad908cf2852fbaa28485aeb14e2113c1ecafc88e8cd4891952aaf975abe461c2e52551b085037003b0d65cb26b94266145fbc6714a660eeff57054e7e15c112b9c1d8135cdcb1aa50739a24a91dd9fc120fe5c2fc1196fc75deb3dba4205ba24db139840f64f089ba31ac24e823bd2c07bf6e8fa8fa897b025304a44bb533abeaf9ff2e9eb9d261b969420c2cb2cda52aa6cbf84ac2e4533a892466199659d19f00e045bf12745916d7dcb2a734011e90315bde1562370cdd64d9b134e73afa61f672f3df20dd7e4b4b93ffb67056d0bf1c5c51dc7f7256050f7167ea6645d1ef8dd2d36dce613f3c35be726d119cf66351891985a5ac83e9708741a4a44d46c6d92a78f16a8cf27d37269c74c78e540560ad304d042c082c16ea4a2fb0200b254439e4f84f274e300f78a23a162fadd7a36046da6d0b00bcd8aa6252fbd81923d3db11d2484def654d60be7028794c9663d63c1d6d5da945f83abcb4672c29d32a486c154768d61ca5e0bed945da7c708115a904a963e4327f3a6014bbee3c78ff3d54002eade6c6cf268468c4d810068c3958fffa4bb93b1782aaccf37014cae98ca09fbef268624a6b84ae8e64dc734261c84ee3e7d186afcfc9ac373bb849cf9116caeeb888226d24499a992f3970ddbfab2945fefa599668411e57dcf4a550e4f5ea34d5d5a79f28f085e33e8577afde67ae942aa75ae8f5699b1e2fd62ff0486c9c927fc5c8ab30ab95d69da108ee7c98a5e0b76d5e77daee75f082335fe2202012686b2fea70893f6628bf71f1b5a38c14628988cb8a434eed608a2067bafcaa535a2ecfe779aa860b919f60ab9c74c59f7bed54891b405e95cecf79da64ab1747d676c58c37d5ee5ef32fd9c760f17bbd522bd3806d3cc50c31b55d60221b668bfa7a169ce1d6f99dd0e5cf6c8b7b18b86cb62ead285a7e0398b1af7874a60d23f2972a694085bb58219236e11413ba80f9362cbc533f5a91149497502ef375ee09514c00e1945fb0edc787295e6bb451b600bc3ed2207cdc0611ffa61b5e79f60abd2ddf75f5a2e53e2d40b411c60d219225716948ffdb0f0ac417c1ef09eb86a3f7623d66f75637440a6216bd23ffe27d0c01658647c3a1f81dd26e6e0c1019e95be1e4cd1be110c54bf1d735c2799c1258c62edd4954eac26b671f01e11f0e3d24889a6f96bb883af778501b119e45f7f33d09ff45020a1240d0052a3cc5391e8b96165c37f42e2ac08293073d447c3053897c4d1b1320f10e4e4d8797a33cb1af308d4fa8ab2b9c07226d41327606c444f0e6b60724d1f6b7e35d5852cfae0950ddc607a898adc60f6c6e0180f3245a475d9d8541a51da910d630b70e4f1a7ee20bc9143483a84897f9099cd5acb5c6efdd9bc2a25888153e33b5f707a1c590b6880ee65fcae38d6067c022eb4926a4c922c60d0fd68cd7d14844df7a364e378d095016eedf583663d75c4e87a5366a1403b80db70a66072c2a26a6dcf2128b87a6dc379fc8e19a866e41c4fc4e8baae2fa25d9deb324cb982e26f589ae6e2c625c82a38f9e37c9cdd4c308e906105d6ca4cdfb56e61584fd703751cbb6c2e2b28a060cec0e4191ceb899b037442a66d845f6f8698b79d2ae4f29a7884c514345742ed8badbb07d264955a36cb4bbc05c41816d9adb88e935ef6be9c923e868c2c45785765af4d161bef18000b3f4f557a48a3330e8cced60b5e4f12ee45a068704a194bbf471e771d06f7c2ad4f6ccf19b99293d15c557f7cfd219ddaccd5dea24a2c45aa71784613b823dcb5d475ce4f9607f749add94d0aac339fd8ccfe63ffab499b68639046f414a9b4cca11e749b30faae901b660d87a9703c90845ad8cbdcd767134c0711526244232493a30af6431628eacb790c1b595e8529922b3408ae3c8176da7e2d6b58396c73d402d35ca1e4d114dfc4bc59891fda72bf7de43e0e806a07eccb8cbb9e066cfbcf0424047fe33916b84e9d1a11e8fa79f46414d23548850c80c9d1385b33e5a11e9750e6154ea72e4bdeef913d557f04ab4baca1c3874d941b44f466d816cf03ae938914224468a655ae8c875a68a8f75fd4c9677ec4a37f23ba8eb4bf90c0d6af6c21238a0cbb0f4751761134223b2dbc3a0554346cc407a585ed3fb1fad7f894d1782366aeed6670d2dea7b892e752e288aa776603c99895876dedf8c55aaaf2529bc52640a97eac48de60215fd159134963267f4481e66d36a6d5bb610baac42c5cb451176537dfed7793dc8712f1f17eb3e524211cf6aa76d2f5a4e3ee884572be5ee8450f37440a6888876de65632c05c5d889129883485a80c7ae458beb3881d5cfe4ec63f5ebc7de829720dfded91ac27c12fb65b25e33dc1556793dcddf89b98e78fd1e7d436a368f0bf0288538313226c4a55f8db44530b8733da9c93b4a12764ae0175cc1eb0f55f091bb408f2b47a44fc02dbe754afbaa84c399b0d585b9f357af9c34be53c73f85611b6c9d5f5324e7ddc481bd223fe7ffecc70b423dcb1a52f6e97e67a839fd1fe1b75ab57865bc86f83c2a750640f112277b936398541eee2f6a05069d990231450bcea6b3c2e3cca2df9d8240ee4c6e517eb77de67bdcc56cdc689452c80558ab298079bd43f5626cbcd446d2a00322021919179ee050c8c5e79ca524a481886fe39ef7be17b2f53ac15d6c9878218ab8b511ac86251e3a7cf3689bbc44343e51da49085f98bfbd998ad905cb5c394bd19d293176f20a46e975e82ce508a3c15a6d13dac5a8239841de7ffcf202df5e4dbc9f654c3e801d9f4e0b3dd8af957cbc2b87ddea90ccae5b0896ceaedd2d30bea8e6f5155d0da95d2a15010175945e0e93a18fb76508b14022fe9de01e3fc8e853256e8121e3c8bc611e776c4a6f51a9395214c9d50c9cb69fa88e1f33b70af28fb6fc0f5c5925ae3d902c62dbbbbd0a2afea0daa17113ef5d1975863d39022656a804ac25698f380fac54dff54d1f7420fdb6221fb149c8d5ecd43924f03cac1c3e808fae31f10e12062fee56c1a938901d2e2de1ae7812014d2f3faf0839bbc66e33a4bd73cee4a305be139bf7fc6ad21e0ffc0f2ceadbf87ea17f1432e11cba63aec7a71455a2f464cd4d4190e9dca3353e79fe5290055155d30f0d2319166dfc1f9d49a0fdd9f5b4485b447545a3248af5824c2e2ea2bbbc351739145a03504af8d679c5bb21fad8e148cb51d08fdfb90f1d3f2e10e28c3091f028445f3c4e165b227dd3be312787077cd7122853fc55229100a7548d4e43e45ddb71e2104258621e4043c2ea97cd2bb6a36ccd38a36168872951c44eb01b92e9e16368f09fc130097f2deea5cd8a5aca9c5638afc5d57c624bc83a51c8f0e0cea5621d0f4d32d40c8ed04770daf11fff798afc0df31fe567330d9ff1c591c80379bac1190e43f855280eb213800bbf560009fe4b9d9f6b7f45046c87eee0103e383ea6ca3abd685e87ed7d0f5a32b8376995b59735294a939cf4c885fa51c00d44c2b8716b20641507178be20a969f2f3a368503d58724db950a3277af70da6680a0a0c1a51ebecfc65af8484fbb43ca98b61cb8b9f5d29b0bd5b095e1586e34db34eb73261ed2290a29644fccf923b7ca25ee5ebda3fc25cbcba401de3cf5ce9360489645ba4545981abd5d67fb36b79f55b2b60d37821dc1c31bd99ce100701e09d7921b419b0cfb66a29bf941010df85efd83dc48b853ee7abab100223afd079881457d3694664b6d54503a9efb68771ce34f70e471be760e3537d76bafc4af796ab09dcf63832a2f3520ceba498cb9acaba6fb0bdb55038557f0443f7304069f68212476b1ada3d3d8498390c01b0bf397c8e43123e33e479e6cc4b38a57bffe93dacd4c6b49f524a644e5f13c5dbe17b6feb3c0f7096da05e5ce7f02b629610e28fc2a168eaaa0f07637c004ad9b003c605b393ce16fa407f5596b44c574651d24b9b7ddcac0526295a40b5171b7ce72d41647d005c69bac046a2d28031e2c32a8dbb1b98396b204ed1fe5ac10819b6fea75cc0b327370896db18ad28b90d6bc4af04681d207756ac5ab910e48d72a7089eb796969c1a058d52f3c1efb166d267f21b8881705548df77484b859281b5ff2a50ac69f792f24688651b9bc91d84b9ab73521fbf4016e88be3524978111fb04127a25a0bd3f2003949dc27225894368008cf19fc5808bedc87c0f99739e84209e38c2effec8dacbadfb93991731741ab4bbfaec88b076f069b065c79ed58925a1f743c95973198b16a7ed9eeb0a43cad03135934f221d0818fe657bfc2798ee35bd5378805aca781ea86830d19dbbaf00474c30bdb09be20c4f96d02319bb1a2b022cbc60eb31c7ea7458635aadbb73884bb8a23b494eda1512b7e131dd084ac153d02985a5fef1909bfb03dfdc9e6e96c77d048283d4cbefb3ade607670346df70085f250abb69aa40e519b9a500e81956a9dc112a1f051053ac0770a9734d804b8a19058f720105bdf8203291c75c8e40c14875c049b823913e9db77a2f537a1a4278b4e88fc91d4f5cd77785e5e9e7a0773a372cbc5051601b7af56b6a88f277a11853305d006a5a514d82d4b965eb7b9e75dc80046e8a41478e6423914c139e3ffb1c1fc02f5ec59d2537c9d0e418db5301ec3d27b793eae10fb705778e8a9fa8341fe5b9620570daa54eb108b3fdf4210328111133c1e07f264db7e83a028d239f9dff76cf7e9d544bca0e65d54d1da8ede27b653fe6fac6045e4e25620c7edb207d408240e4255808f08643424d6ad0d67c859027c3cfc0a077cfa9a6588c5305a41ab7b2f7147ed68fc53f364f61c29f476b9d02b67aaefe97a01a4dcb0462fff295f4fc0ebf99d4cbe7fa393463e6b84e1385e1ac13e94b5e076a6384052bf5fb1881e7aa4cc44b7333b6ecbbf5ece50905cc8f40e948b0b1b9cfb6d053cb1599df024beb4b6a202cfdca9cfb87a0f4ffc50cba4c25b4c1448fb7500094d8f84df410303b6c145797e39f69a0cc6d0bbd360722013965780a8ddc5179e43682bd38cf71e3f8a97b3c932690594278cd61781584f0f1faf1719d2ed0b47cd69c523c5a570cec33b18ff26cb53f8b955393ac67827431f9c51792cc75bbe104bf73e447028c8b1be99f47be3c10c4a6e7603ec8e638898c5ae5984963fe1258767cc45603416ae930b6819d559cddca5e5d7cf0775a6db96cf2933b049ed9867efe4699e9065a863a87cef8aaad9278ecbe2f381937712f68063da2cc77eebdef2a9337bfef2a0aba32c6d342fc2147d44cbfcdd0b63b74a39dddaadd2011133e96c8c0764572dabe0c609d279c7435f9dd936df301f1bd4bf83dd314bd4f37760ce403d56caf6a228babad172ba865a04df0e5c8fd7e04ff8374bf9202beed9051b7fb78fdf3b637a0080bb3f856440bbc496fe47067ff00c73d67aaae953b87cb45cfb55da4d2a4d76daeda28497d035630595b089c4a370a0ef67f3fde68f0e8351500f5012d3e04a4e6ae6418ecbcd2435f29ec14da973d24ec1378160b57d44ba288bf98253f57fe5b1a34decd4f602245effc90e7964936efbfccfeedf840b551abf402c8b8320abb1faf307261ca07396983acff9761a0e337b09af83cd6ac866fa4eb261516f33bf09436910929bea5e1f2eac07ec18b17148ea39fc66951b14d21d48357bcf12a5b864535045c0f2a1fbb4944a33a91f0278c2148708363a95475339994c9260bf289d352f125a19216142cc5c01a7e2d49f5b3d0ea8dd7402ec7f626402273a285c573776edd092b59d14694194dccaf475ffa5c22fb1ffe101acb50f506242f4e589b43049a4b220bf13d92aa0fe690bf873b0865c6d7180dffeb864c2b41d7fb565b93e5f04746cf2235b919e6598f54eaeb7280fef48d913b2037c5930f4c74eb18bb74b92f6db3e73829979d0f067e031866d9a2d640f1070c60bf42ef4dd016b1e1c2143fa6b7edcb6cacd4152a3408ddeead7fb887557b440066644ce5cf34c9e5960fd66e3b513b2153c366039f62af4b10df4dc2678c1498854e837f90796ea9b7e4bc4732ef2072b860701e141b8f0c9eea96e2f4e47c91731ed691d050b14f06269c3e9f2e298216f4de15a5cb8707a409dac4453e23e32ee6aa195787be2b60506b46d92221c6d9a72ee65dc760266ee6eeb0dfd323b2b473d9f4c393650e79b4d0dd44a3fa024e380dcc33670ad749789e4fc6b6ae35ab596291893c10c21f833ea7dfc080299e55da24d8a73698eddc531b6eccf729c6c7288956fdbf98e0b8287c989ea773bb54dfb172a35a2250292d4090ef1b51cf9e008160e3ead99b0dcc712847805d4f896e6a797c5b99199cbb17b4de48c7858447d9b1ce6f26929d6b04348db0a08e7902737df6483395fc9105c9c446f2ba891b9e4439f483bfc1eedf4ec9cb330dd38c4088876c88d740a1c703f52e64dc397178a786c627e17164b1ea44d86818aaa88cd8aeec5d3949f662acbf310a4691bf329a3f9a5cb674b3c577263d97ee97a8318006caabf07aa62733e281dfcc9522fa571a4aca5490357a75db458c4810387e3785a1ddf5c3be8017ed9d4dc89ebb06b63d2c60b816cd5e675ec831bac20ad2333dfb6d33978b543b2e40e84a44fdfd8623a76dca00516af586b2de2d2c2ce6d9c0b815dc51fe8d5499c3935bb4e29a07d80f2070ca21adb1207fec0e8f70babd4ca7f357980858da2fdd5d7b0aa7f498e02a592fa990998814cf2b18fbf46dd224425b86472f50f9b52fae5aa47d7bde8fcae672cf4ac0595f7d956aa11a6f38df8db5f2a2684fb8efdd1aad1e8a9e35b3e5ffb33c3f1661688d59f51fc17af0bb67e0f4277e29f7fbc17d16974724b1a7bbebd82836ae2d309dec168a3c896f796de2c4af7a3466bc69d4121b335ec5bee075da102ced25361417d4939abfcc3a8418b7117bf0b15c4ca51a95ff5efca6227d83d3b77a771b01db442bdf8111781de2544ac1246bfcb1742f8243b900dea4361f99ce35486b0e550e369aa0bc6fc63aa6487dd7f9a35920cccda9602ff832f10206a3455fe31e17c4b42005760a070d3fc0943ffea545c8348e9177569b6f864b430b0387f4bac26fe1afedd3c961a93ee61cdde26e02bbfca3dd11a539e5b9a78e741c6fe24b7d8eccfe95b3b12690d109be7b58e18c9dd4ba45f4830544bc8dfe2f5ab6db5c5dfb716cfc1abf7d962fccc60d102909210eda95ea08c946fd610a97fbfd73b6dc15c81fdaa0dfadd4a4375eefb16c2fafa8666ee4ffd7ea13e65a7b4ce1bb79c02cdd287e19915577e017da8d6a693056156ac355b6ee5709f0def10009d21103e27bcc3f2c72822f22b808ac16c32cd252026dcf91c169f1ec6692fc38fc0dd8a8c76ced341ac89e117acf4535dbc009a66dd9003d142a49bc46a5451c468ec32cc720596f702cca809f22b65c98c601a8a7b826c27a82ab24a1be5bd103577b95f858d2b45a0a26fd459d7a4880b41feee59e8d1ff5f8f8c8505ec96bccc8f31718acd3b5c4eb2a3d4f784c3ae600ed6821e7a165f5a6686a5eb9815900296e4e57aef0764331943cf68212b8d7dc4f93a33f50e5950f79e572cbade6847c548a750625f01d0e7f67fbd83470382746766e09b3ed3a4babb0a3149537625a747a4e55aa43816a1fddf6ee35e5fa3c6f1ec32b1a3320fe0baaac5de707fbb9cd4442e4fe0dbe3c1e56f4b5cfa516071bed5200094469cca55bbc43842d4f957d349cd7ae8f69f31180e4d6edeb5fbc414af8f55a9020a8fd3fc35badfcc34614e53045b92eb76d43224ee7e932eee207cb1f902bed9c27b8b04d9e8fff77a94fd867136f82fb5fe3235e4537edf3c7c2ab86f5af9cbc58a377318ee175bffa01c11e090cde00cf66f161d9b88bd69e0c2689f38ec7998f116b38d190c66d2899179aeb7c399267b655d7b64593d00ea63245679bdcef896e067905b707c16276307f338fe45ba3c4ecc15a31d60974c069cb27d6613649385fac7cb5836d7a47fac936797da905f8ec7acb0e060804b2b22d8aaff7cb1b7c3ea5823babaac02d333fcda342d3cfbed1da0c874843f42db1380e91c88ee0488d012405ad55e93adabfaeeab58069da3adee8aebcd5a1df4f236273ab363322137f7a650aacd7f7a468f41b66196c72eb0b07b9e9900dfc70b6cd6376a282b42bc8cfa16298041c62b2a36b60d0c6c02b70c82c760861c0bc0bb69e734f58dd41cb58629a15a2a95f3e6748b1de176ffa2de6ca927c67f13d105dba77af32b9b1928b8371a2add09c6d267775eb241bf2027694858ef466643f229126d228ca45d48a2e451e3d15b592fbe11432f1dae73e18db20b76c196b580d3b5eb886b8dd0c27c1781aed31d48f2eb4cf6d2cff5990c50d8036ad674441f5fe572d43593fe4b1edc4a1b81d47975a68a1ab61038138c0ff5d7a4808b568fd69267358e7680da87d37622cfdc976a6ac0a6bc0d19d403888715ed4befe88f453c5241cc2d8df0593459ed86a2c8a8f7ab939fe59930fa62da5762da5c37de3ee8da637a671fe2595b0ab5c0262b59ce174bd62e43c759a31c984462a7d99e543298efd7dc5888f4ebcf6d6ed6cc5bb82f0b30711fb7e4380a386f2c77b0aaa367033055740d7eb580595dd2b0137c40e5af01a985aa49702489ae16583b8c45b323f61a34a0d4d0ebb22c05bed63034649428c8b38052817ad26c13183233dd5ac2f982049c2b9b070e8172d59e3128977ec73339a01302021712a7757b85110b3a119b42b2380f17c6a859b4c91ff2bbc68e41313c1a6f7f1ed86b1edbfd083433b2a72209194bb63e744d6489df2f082d95bf4d1657a9fe82c28ffdf079f075df659ee20338115b80e4b6f1f901bd5d0f436fb187ea73dbc4e053da63327a1d86dba9ccee324865b4f35072c7ce3f0ff195849ada05f659a7fe8d4651995cb0730ca80939e478bfe25daa5b1e119db4860e27dd3ecd3ecf576d26dd5c84ce899e74ad4326ac510f93faa929e0c8810fb8eff62de384ba59219e9dd0f8980e8792bb7f182220247633ea02555646daff49117f3cfd5ac029afdd82c9c16adcc37549185c1f8568e16694c399dd035d88226dca9dcacf065a1f9dfc14081dfe66382c272baddc37eb9c36ca8d43c6ffe258bacc86d4132a58685c4423e0a1bd7e41618fcdabd7ce4a958c4c87d0297ca583ddf55600b42cddd277285654e267ed2a10e668cbb410d5b0ee50d337c7d4f5f6b1a3f23692ef758ad0891f9234cb655e83f7823eec040d321c323ce888c8cee4b3acedac78bb9b8686dd6f2c86c077a5b340544a8d5344cfc920e0769e6154915fd985158dbe5c4ec0ad74cd899eacfe0b75ea9e5dcb4b38f7a0571eb96a380dae656d4a88869458cb18a7f108c2b349a3fb1aa11ddeb37100082c8ce1f12e28f4826532de88b40ab64f2a86330f9f9c896e4510d0239d275a059e7644ca728d8cd4a8f0f09d1c98e2177a8468682f54ef1be6b186d4185aea15bcb4c80c5a3c22f425a701800344f84a69e57b373131dc87f8ec004f1905f90dc9d21e91face24ee8955d051efc706567085efe9e814e5e6297f5c96f2a5c693f25c3f7ade40ecc31a9fc314bee0a5bc4bd4ed708f2ecfa4dbb533ce6ac0f0a4575afaaac82756e8618100333e445992ea6916c0deab57e0f5d4c7c35ac5ee105fb24f46899032c5a64511f856818702adda5552ae3e67ec89954163defc1bf95d76c53be2f1aa3839379a14c18ce0c9f26413a39f09d1cf44e6a43f1556f5588e49d6b87be7e90f8ce8211b4ffc26b8f951f8b6dac55cc3b157d00d733e6c785561dfafe8a6ae911f112206c632ed370c24768eda3344b74cdec328a0e27179dad7aa59bb6023f63b4e6daf45fefdbdffebf9b549297ccd64d4750eea7a28ceec4ad0afa9ff41ea7b507558416bd65903606cb9eecd19ddce65b0e143857abf3a01abf1c1f74e0e2740242508cecc2cbe8d37a9a8d9e4f167cfcce7d60e32e8d70f9223af1776775c62cb9ddd443fedbd418c9c7be5afc7671ca50b236f0cb8133a548b0d8e612d0d49202da2346a63357e0a2aad216052834bc059af16b1f39f85b635cf94b7adc61761a50b8255ef0a9b41f1f002a639df0590854a53e43107bdd96fb074c7684da77fb86d899dff36e9b511a5b84857d2519265db2bc95d735af84dbcd252420792a2801217bb9c72f33ab01e7e8e3978eb4c72c1b58736c494e326e1794c14367362f922e2d3dd35b67a780619bca3132d634cc58537d1f588031595129a2a02e3e8821f4c0b7106697314c516de0b41b17a33991e8015d7b963798a7a62c554f97d5fe866c11a16b38eb6ff9a0e1df9183e8ee97efb3d1060827574ae36998261203956832c2c3165b69424d13235639f9068fd30095a79442e71db776f51c6487b9c62ca3f12fd1274660753bbe87765f0eee67d6acfc01ebc9701516e078bb1ec77e0a2dfca8625baea8d164b7b739f18f243a6b2d361b24156d7300ccc86f555a0c4e5fa6421416e616cb4486a180e306b8e4250f2ea2352e3ff306526a5801f4efe223e8694182e0ff21946e3c16d33f3fc2cb78c9440ecb3e53f5c8cc10e309ddf78bceb9a0711bee5f7da4846c5d648f396fc5527b2e803df50a6ec31f6960d16c017dfb00e5a3c728006b1a9becbcb022c09d332593b5062bce82621495003330e68c5320a27d822466d68a07336047b645fe49347c8df4ac27a8fb9d7d847c4d06091cb3e2be9ef4dd06be1571d1c8a6956354b1562362d60a66f1f5d3f85fc02f84f33956c475ba6eaed482bcc61ed2c94cba389c4a1bbedd8833b61ffcceb3f229a3d1fccd09c157bd5ca1d75c53196837ea9d203ae3a31107b5599391248b30c2538c0dbe4deb09f3d358fd66084e77d79efc4f5b105def47d7ed1ccadc52a9c36991224ea8a6ed1f4c2144fea12bc60bca6dd8f4123af7fa0cba869dbffc9de26fee486c9a505befd7dae9442fc41549a040112b9e98fba7260aafa3bf1228ce279e8db6f3cacf60e725637e9d091973bf92e1bb8b3842b73498da152fcb4a56d336a3e4ee086ea12af533287a345431b36a872a1a445bb9826a519088414c85c5432c4da33dbeba71bfb1265a9b11489843d651c7dbd75c9a5cd8628143dc35847e27e0c87570fa117c8a6f26a607e296cc313937fde5663cd5a97e319d09ea0466cbae283018d85eef6b53f84b46c7329e4f4b6647f72b616d8664d2c4245843a7e64ddea9dea0f1a0b0b82f5d16732f4c919f75f322a8758a0bedfe438afebe7f969815fa39fac54ebea970331fe05965b7a0f3448d090819828f4479b8ece6ed4a0d8440a13007c7d2c7aa87cade15005ab7757710bfc2297c74cbd1627ba18f785f0a98bcb6243ec51ce939ed18d1548e3f028af8aebca42108b981a385277fbaf5846216b5bb6006159bb1a7c240a8929fc33871df42e714cbb318c9acbd2dc58a786d8962b8b39bb857b1c789760dbcd6285aa109e26514ac68db57a6fe8f8c9f5a84a3c44458ae1e147d729297dbe1aae0f83c3e575e9b7fd9630e51bf9f9c660e94bbecd27ece29feb1c6af16c0a48ae1f59c7bc67b67294e5d0b3c027844d89bea37220f82a30135a4bf95bac8449f6e0027d853870822318cec5e527c0201426e0824c9097b23a0ff4a6a73dd7075df24f129a50448d26bcb0d4233c1da12c0196b293418a4e3000dfd5690fe4ef7e0aa3f4c84e0b537ec6c325a884e461fc80a0c5ed06df6db91b4b9607b3ae8938ac6b4acfe24524ef9b0cceb59d77c737a331418487d5c9b95a8e2a3e6356f52feb71c9e377ea58a0a90b3d208e54ba90bec50a36e9fe6ebc60776c9e5adac14840264c2eaf4d829e8dc748d3053924431f4cf8177323e16fac1234097aa28e316e67dc4caaaf7258cfe4034becfe7d8bb316bdecff49582458b592383f064ed6757086cd25383c2428cc3c193f0c2e29c862bfb0404b4b536a6f6f360b4ccced9ae02ab6636bf8b95b21a3654070d8e4d48c4a13cf9adf13b647d4e3b8da536c780fb300e66180b3a00c3766f5070b03594142f60f3061a54be305728397e40d251f7f18f94c3d139918d4ebf443e1d5c73cf3f0e5b898ea787a51eb3caa79d1677ea15d0e12e0bcdaa65fd585695429856cdecc3380b1e7593d57aad421467afccc7fa6e6061ef7073d619a0d69eed6f18263092fb26348f98979de2d33a60fe853bdb98c1888f0772c91c4cea37e358850005882e842db0096030b460cc05cdd83e7d51fe730366f563870f73a41a10874722240286411fa6d8c88ab75746fb12b39296ea01d3fe80e12d0ffc1a2feb5336900a5bb09801e6c150244bc4c1ce058ed5a5fa36ce2eb5fbfa9586e6b30a2919d41aa91a663b88865f7629d887a201407012f36b4db792fc1d6691ea69f0aed1667680d561813262d3c302f4c64096c272b77d95a4a010a5dc3e0d108b9c4c21aaa496fd8a1fb3990785eff32fac57f07d70a0292346993c6f24e6dfd70ba5ec6730c423f24d1f6cea631e23a1dda7b707ca0432b01a9e0657a18e3aab8769099e29575b86b2556e797d52b0ef6f6ba17804c36b7fcf03b1983b21b880bc2b4494994115265ed26346e044e326fdf7c99c2cba03cd66215dfcb313713e54ea60caff1a923a341814022fd1385b85ce5e8119eb15d245a226b242902414776672b4f16ff05dcaec140ffc9f6bfc44235f0b2f050f0dc44edc7f3d7b7193804971416fb73e469166ee425d7436ec9846fc8de58d5e5dc0b584cb3a86bc13f140257280c44bfc91ea67e08d90fe0c459dce3415ea5dd630bd3da70ffb3dbebfde4e45bdba2a81f3401d5ee023029f3701cc37dd58fe5969b4a964d5870d34b51adc0baa22f62af18fc3e748db3285936be50a50ae5b9fc280df7feb5c41076e34ebc039766c3640558220a8d97ea3d2787cbc2bb9a4e03dd2b704e60a49005eb7d442a0afabc4d5a0d437218af72ab36e33b51e3048a79d617a49bf285a2942c6049d45d3da01cdfb3cf45bff924f1412ccdc352ede013f27d7d55ba1aca44378736ddc50b4da693828d6e50e28c2395bb07fc1c14f3e922a35f826523e43cb14594d2dad40b65104909acf01f3a997ff7d4d5d0625ef85ac3073d01bcb623b4b15c78fcb824f976043d148133c76cf8ce6a9b835cbe9f0335a73348b906a839e6464384dfb7a2f2f1ab8d55bbe2fc5255b88dab9434220653342441f124fb97554bdfc770f6c8c84091533b17626c0370b161ca36e62b646fee682d89a7510e3f6cabebdd9e74f9c55f75cf16f92473c8e3bfe7e8914460509767c7a2ac6361995d3985608ad46f537b5725ac2f4fe57313c5db92c05d36faf220d10295ef870400d00ddc2cbbc294c631bddc935b6b033a8169d41a4c64c7b4a3f28a9e366794c2ea248b231e85935a8dca6af37be9ed267a29341c4882111f97e8a0277d9f86e7b6a222529826457fcdcaf09d282b862c284451b46eabec40b502ddad8c683558977a5499e763c4c6a26b694d9c07efb877fca1653d76b7eb4af299cb327ed92ca36ddce46c4718ff96c15d585596bf76490a8918197d8130b9e83f91be1ced4c248d802aafb9aa8884ce333e98734995f1c4cb28cb768a73f7056598870d42951b8daff6d9a1d0811a585773ec14b324b81db32affde5bea0d171d1866c31cc1b8e6a64e399605225e0e37909b2d58065b6a6184c42e3fa79aa412133787e6ebe3ca4a03c01cbd91260250ab342322ce8bff263f10a5122b4f5143715cb448e1b7e4190b847beb859e6bc1b30c92ca156c9bdf633a9fbed4718879783905c39901ece61c4119a8e8c6c02217b8e1392f16a0a2cc7e81cd6b5a7cdd9fb9ef0e32c5074290d36d8be2f21b96da94e973d7171e50957d2fe871f774372cc811e263ba00bc7bbd82aaaa48f250943fa5c487f0aec43bba1439dd4b6ebd5bd6ade106c9436d24a503529d451a15601df91e47931fbe0f1ebdf75beb0686295a37d96891b46a15d5dee23b392254fed486df69eceabac974fd9e4781befad94def855ce64f12a1bc7572e2c6f6f6cacf91658255845effeeab8ffc4a84e392ab9089b64e9e59216b5d103265d9031ebef333e11f7224b39ee821619795e53af60c569083f6870719afd368e1a69cf514218c6710386c6cfef5660550ac8fbdb2582411f38f06afa0e81123d96d0f7e883db51be011281c69a11d6b6c7d4d9aea4748ad436530f2fd5c614b4255f329944061e2bb7db8919f3b9bb37a87dc55aa7a73c4c8e64bb3d3344951e3d28b91f929e2fcc296be6a4521ab271b311cff8259b9470c7d18e7e9fec018d831ec3d39462170893fef3762d3a6cb853753790a2266984fdb9931a7d0e176106995d91c838a449b1c3108e49f4878026d44a75803fb2003220bd19df66a7acf4188fd2cd45da3f15e8faa19dafabe6fc7ace38b4ae1414fd12366fd34fc302cce05f738a718327f5ecbbe36a3a536bdbe046d449fa60b8e8b18241c982714942f786fd568e9b0a804971bd4423dac74fb9e8b2850d4e8cda70116f5d4bccb45ad3dd5d8185fcdc406c2286d0f93182b557e425fafb3c950949172a539f07cd41a50c1ddeec64ea1f0e38ae3e62a2b11217d4c187f919c0d09456af02d3f70a88e025bc30eea3dfffe4ce5fa3617b067d09f00036e52dd2f0a7777bb4334727c684fe82e4d1d6e13ca4786d9951d1504dfac79d5a36acf94ba02fb90d76cf5e1a7704e0404d5d905c0f5888eeaa5d8d0116406c85d8a8550fe5cdb1d4182a6b992bc43f1f62e99726f5057872536bb4905ef78189b913228ed4fefb593b8d4beab0059e34724d5eaa1197e19897c22010c656587d99c5f1815c238cdee94ccf9f8d4cd8e7b55fe7346c473fc812a3b1d5d7cc0d9e13c8bce8c3357805ebd034b9aa158e88da2ba042ca04acc0f220dd892c29859a42b662cd6da240c4cc4bfe7af50a8ae1601710b8cd2458abdb7e3fe78f6d55325105aca908b24537ec1b3d690e66ade7d4217e864e5ef1a2a0b22712b5d039879234771fcd0415baadaea72517a113b40bce96fa4f7a0c320b8d9a8842c2bfdd2c86da14be667ce931d38eb99485fcd4304016a22d859b24162402bdc64b2db9c6a490cc6769f7bbd4d4ec5ccda0e5e3c334e156b9578763add6e1815b4f591a82eba19bb4fb6d3a98794587d7c7dfd1f5f62a0594c12858ef3aaa1fc3b21fd69533b62446eef6dabdbc64f36795a7fab3f8ab1823fadb6ef0ddb8cf8555e0744480c36d812dd824542742990dcccf9f62e33df6e81adc6263da9b205aefb17e5d22217acc451711c8c75bb97ae5f471af84238a5bb05d38b684980064fa59ab3d3743de76e483c762f8bad84e64989e12508bc85dca4e40ea3cc79617a1b804a7ba812a501bf0a4b156af8bf8d54a091c3acdff3b5a85ed0e869b1ef6418c1050382b4c740c2a3e5c7a16e3acdb6b5bcc1a10bd1d6949049c72a533b333ed39e3a76779aaa54f713a5f03213dfbcb326714d1c4729ac2905b2f81d0ecff736d97ca16044a06d97e7f5cc3b8e1ef4c8b9c563e2e21f13bce7051edf4f7030e83edd02aa0a3a093a060e24d65ab0e3e88a53b3a27e7b8f4308fdeb0035f3a6f1eca043456371243a8ad492212a7d0e4aee37de96fcf3919918155df9bc556bd96f548352d78a8c147358a591957818e99b606a68d14db5ff5daa39d780f6c52db01099a8b5e99beca552fd6d556e6e04e4e2d0bb5ea6059839c97abdd16e61feeec0fa5395b759077eb79950c7cfbc9ef354b8a21d0132ec4078656027221161d27b030fa809f54eedb9dbabc43bd7ff285b5227995f4169e6fc1e89dedcf7f08141a2d1dc6d3fd12ce24f40c9ba6f3178dbe8c638ee83ddb1dc4897471c2347d3b0923fd2099e42fd19b4a869e92183df8803efda0f40fd089d89fa04dae8888685213399b5e37677d02dcf198be30aecb832873f520ae28783c5b9b9f476d892f1263c47bca9e86c972572433fe11b4eb578674295ce87e9d830ed07900cdf8223511c592c083658dcc7a8ac522bd37dfb7edce5ee4f4c80705344df05474ce18b114be5e101a2dd9ebc562ee75b8f6f1c41252d164c763e768b7f1b43c54fb5b37f729eb49392db4642b9baeb8c74582e9bf9c65e7eac4ec59bf472a9251d0fb64cf1a57319100bfc79e1b39e89e8820236fe878f757c3c49580cb5d00b70a4ae725b2e99a64a30215e309294241733919f53b51d8fd4ac2b91c658c16c047dafa3f5eddf0313dbd48ddeda7c006f9b4dfa071f977189a6d0f3325b82d91baf0f9c3a61243e60b799d278661fe724e153929f0a450fd36ae3b6f76d14e1fa2b256459dd3b16cd6d88075df74bffad30a3d394ed5191cfddf58ccf7534ec6a9cbb3db572ab2c1614add34020b6cf45e2d590d2f7fb8afc7e748705597f26384dda71649f68779e2d727ba97af7016bae09463b6e9e7bbef1f049fe1dd121b52bab73b1d10d6beb3b3be7742d324662f2e90722d59bf5df15052cad59f9e136d294d59bba2c4427df90df50c30d8db1040e1bd1ea72b709b050ae1cee1ee895a4d95d5370a808a18680694051080ba5991dc4037288a34da253f5ea186da6aefc4d20c260412c4ab111201eed551dca376dbd6acc6fca9fb426d3c8d1e37de366f7e20114bd3e39bef2611374c83576bc04e32a65bcaa57ed5447fb78650999eea63bdebe53ad274dbf2c21a179683ef041125ceba560b1795742ddd55b02b97ae0c45ea54d6cf42e8289997331137f2b89ee8c5c09bf4e2676e85c658e7c303aa180354dfa5020e65480a5e5c25bd60ab6383cdf9032b1670e867af803906f20d7ff50806bff53b73ea3bff2d8efa8333eab5f6d0cdfc3f282e5cba209c9eb719b2d4c1f9e92d549b56238eeed859b2838d9de4e459e50e555bdfaf8b8df9e6082adfcc3fa9016d86088b229671c1b2eb8621764d666887e2f7b449f974984b89194e633585228f00567a6eb0ed9d63e35ed5940d3287f67d3c6fb272a311f9cb0e4c6a2e9b740c4b688dfb566b84010e8b26914485dac8b46b604429440f450a29a0bc5c2f9380baee6fddb8bf110275628ff68dc5c6e81a7d25a37a0750c1cde4e55b2db5810717500f469a810c1fb7a2b4aa9221182827bbb89bbc7e6742ed661fd97beb76997397a8a5a2a4f122f416c687d5ebb8ef4716c330a18fabda17f6c8d3b497708a66d44dc1d3b9e87ce3d42eff4cb5a9a81e0e78f550b107c842d36434d2c78596b20b1d96f312de5a8dfef6781b1b392c0794ee584b10dcbf610c1938a12cdea0ca545c67ef7f2bab28467cec0c617c56d003b1343c282c656f016a2b0997ceb477189b8619fe6d27a27031218bad76933f98e0b5d72610f7de75fcc3e87adb541538d1ddf9f20c3ae96439a1ddfb414029dbb5270265f4b0943751e09e3ba40e860683483731363af6898bed34fc144f98df883e95c1ea3bec892dc9ae1f8abe24272900694674c351d664ab30adcd9df10c8ca52693344f0fe00fd68c866b711bd9499040ccc5f051ffcff85d75d962ccd9e6af2daeedffd4493aad435254ca096a80a02193a3eb597f01211fd9aa39e558337b9a8992ae0ce9cc3fd764bf4a3437474c397bfd07f4764ac8f11950e66fbff1d817c785cc5d58f5965d5a15b4df28cbaf334e1c029d30468fd6f9745dcadcf979bb77cb5bd8fd2356006dad5a8dd0c931a9c0afff53940d7301c809dcce84438b00a03f477c0755059261ad8ee07cc0ce31e503eaa6500ffc51f26cf4cf38726ebba60df0df56059e4e9117d64be8a03b28efa75a30672d8d8a9a57525f16f997bee49bfe0bc3832a0ee5c03cc8847ad8c42f35ffa2dcece8f7b5992ca88e861629a4ce18571bb73e955a84c6566cc104f832bfbb757da42766bf007e41f8c5e90ebb416c35f91e65c13ed5f7e7a598a32d8870d1ad7d609a7095d1f66f05805554531339b6395092a9913e4938a3548a4edac9ae7d6dfebc6ae54043a782de21c2f75926a496b8f35cc80ab01f0d6d06b104970d55f5925cf7fb2477605071080cbeb901386d1df0b6a5f2543df497821771a9cfa16dbe8a7305a5c2761d3c3a0b2430d3b187c94a34af4e9c32673ecf4d3fff154a634d7928f251ba8da04bed9493fef94a46efbef27ef3140c7d0acc3e8d5885d01908d6523ff418a35feddbcf2bd9f401fbc9843d5745ab507648b7f17c23aadf76a1594668bed0e3cda8d61ab638a35944aa182109368e2e68231e528cf28b1c71d700b69a9232ff8084f03fa9da1bfe0b9812557e97f580c699a82c36e346fa3e813dce2a24c34d5ba39f03d06d90b70d4570b69956b1b9b82950d4d87855a590e66b4011bb4e02b1874c7bf4aacc44c01741c63dd19d28795470a303307389356462b7baa0b28fbd1bf071bd997be1907e1bc9ba41c875420a5c1bf3be8125d6e83daad9ee577cfaeeaedda7d9ab4c30fd60eab7329f9537ffd8734a71d41e6016349db803a901a555ca3640ebb14fe44440549bf9b7bd6ab6e537a66db77ae161da7c4e1e6eb7dba8ebc88fb83dcdc8d4d46eb24f066e2b26aa2cb4c1ef090215f5534652ab9c94d8e07565c7f851deec6dd4c8749195a533bb25200259b5f90c9423e302962b2277daa079ac001f1c7bcbf4950ee86b18d7c054b80f3660003701541ac6ca57e4c119228675bc858c9ec1ab8a0c85a95519c3a5d32d0923e3c5c25f2075f3e304f14304615eaf1689e497b29e2e6a625e05f322f26c713c2e60a47fefed11de974e389ccad0a65019a79bcbd01f824a6eb5c8662632609dfa6ea65093878328fcdef96e56bdb12d06659cc7196d706c6f77f4f7ba300412f96e2ee16f86bc1f09440ef75568343ae7a753d9458fb56e1ff893c69ceaecc2732c90aa501a64eeb95edc990c2abf2aa7690a9499b03e9ddf28bf8aced4aa51cfbeda8043589155737a54bfd77003c54d622e44aec31da85266fe1530f3260647d8e59b8ee5911b9502925a70ab3d71151d5fc4699eba1817e6f0e44bf8bf38d4260f8e32fbe95fde2cf8114bdfaa6a2180812939d3cb253a59ca69252bc8ada340d2717544477bd5701463be98d500fb04cf3116650a8f75f5887de3dee6a6d53b197fc76dac3cff7bc9d4f7e29eda36ee9937decfb0c07b7dc3ae91493e7e3315c27b8b3550b2ae012db659b11c4c2e25a4d7ce633a5856ab33ee89edc6647a293c8fd16ee3751daa8a401b08817a230ccf12b289252b7e73d9a48a041768b14d03d2b74c0f6dc233874ecd458014739a4ae0ce5d583a1c22dc5de97fdee09abfda3ee4c4bb0cf5e1065ed404e5f4fcef6be752d5f351a870cdebcb2902aafbffdcc43a2f410c59a92523cd6bbcf5c770eeefde1b781868fb43029a73b47c899246ad2d4822139a5b246cac6f5bd3256ebe9815905c2aa71d50c6ffc877ca560b906f7b1a3ef69957b38b936d47ed986bf65b221993e2e7c73ec8382bf7f82eb7bd2006a65c695d68a1a9d95357d58f1710c5495656fb4b165eaba6171f866eb193c6e73bdf697c9913960207a76d9e21a439b7e7eccada8d8880038f004f10fb95b324e03302675d6eae49e09c746ec8bbb4d9f9e2e42b9cbc7582ed5ce3b34722d4db1746830a2b18abef9c9c6b674c6d693c3a5bff6ec918b99ce7a2f5455d19b40ecaf55253012cb9bb5a835362681d7a3f7137bf13552539ba67e64ed0f585a2c2d39751d63f8513cbb17b8c3dba7e4b093903efc8d893f5a7344d447a7fa8f9aebf9a42e6cfba70b148c638effd6dbc714656aa9bf8768c1a373e27b23a15147efbc4b6a72c376bb6cff5ac958e1f3832400123cc6ef841a8077d49ae9a9ec6c49b21148f18e1777406d7ba6204f2fc5c474bc35e338e05b28ffc5574c62015f1eef287f57ae718a8858184ad6da9ed24ff6b4abc22ea1cee87dad2af8916d7e4ceb25906f092996ad46c8c9b1f27392e061ebc5497260c719a9701fcaef06d0d403688141971cab403e4188c638e3c1c1b36409f5f50e6bdcfe08c394a925c068f51190cbe834e7b34e4580dd03d756b68e3b50fe812cba8b3cb8e092defedca76892d7259b826de3079f50d0de717548b83091dc304e5ca6e44c01cc25cf916762bc3163e8acd3c0ff2d1bb60861a3cf9bcbd811f3f4e54abf76de7a04d52cd6d06fd1c717b05edc4e038983f2fe228ac60a16a60cb4921d582b3c9a7a1bba6901d259bc07eca8d8118e85d7c545a0f86aa49c1f94a7ad937d1ada1876147d522b16743aa8828b0eebd7828ed99199a6ddd67e44f63a222ec2326fd95d031398e5d5254e810665c87fd1585e3f342ead1bc92072723fef21fd35e18f8837881fabf969ad2b791785f7ae112d39d53c89407ba7e29b52764acb5d2ac1c316ea975e31ce55d39957a48054350dbca6fb500f4725cad994e1060a109fa7d0f71fb2c1fc1696bc8327b7ccd265caf56674f06ef0a5cfe8af19d15da38581e2cc1418fd432ce8bb9c96708ef35eb9c1328ed7e8457c08572d06f2ab3332dc229e7b4e1e80d085b9d320dc01d6aa0e33288f6f295173460a1d12b4a08618c22ed4b80b9373e4b0352f4710629b9d5712d93fc18617c53bb90b2fda2b00864e9552ba95b272393ebfab3b0d71236ad1588d1af072eaf8b16f49d0eefea6f50d5c62c867313c34107e6abad8f4d86142b45530920a480bd30b809833123930be7c6c99b8ae61c2d4ab2f6a31358eb1a909eead778a4b814ec299b3972050aa75618432782940648814315e657f692d92ed6f2a28d6ad49f69bf716202896d2f56cc25e0485884df69a3493f0a4e1fd142bd52937f2558d49f2f7219aee0942f0726ec7210a58deabb3fe81897aca3fa1414a7d948a79d145f5cc5846785300533cfaf6bee6e0f69be910212b5971e96de3506b286b4d0dc12aa3336692284e4405ccd0a5a7a2e7fc58b8ef7c9fc9861376b2c95e08469581e7173c3d4ac1a752ffd84787c23200c2346ce4b22ca99e2b954273bff6e7fd42d9fff222745cf181ce0f5ebc1095fe6f417c58a0e614d3fb9071c355702858d97e7d38b826d4ff4a0b93b6ae4c24e1f1590f4b42369d0e23e8ae0174d35d69aeaa6730303d42ef56c2c3441a960add81ea7195768aca50f7d59be65223c0c0e60600dde1d7b4f9bbf41be240f3497bb075b4eaeed199ebc2c00da5288579cc968cf9e904d7f2bfc516d9d4b7ca541e12109abcaf02094458c9e02096c34650920dcf6191655036df917691ae68367221e5d65f9495b36783429a3db4cba7df8aab6947b76b93a70840f8406d7d4b8973b19e0963087f09b931db6e9e30a03d645f174e4819e87f60f404d6509d8aa770468380f45b57b702d2a2f412a807c4df74d129bb61e5d1a9f3d0bab9c15cfe6209a39ad494fb5a9013616da48c6a34020ad331257ba1c76775d86139c305dbd27427e3893dda578717d9a7035b7a94e1947f4fa463d67119266a43cae59c09d695130164e1fdd79fb4d3de1b370ef8da5a9973385616a75da70112054b956e2e8e62b94992091ae1f4a1c81666b35a8af8c70bf95910e54a0d722f157cd618d21376a6806645d255986f24e1d2cdea40dd6e32e8b2e4651360e0aca5e5644ebdefd4fed1f5baf0e19065af738a486820cdd392626d89db211e8e5f1f569a55bd7f3905c1dd615e7b849cabf73fd6787460953b50d83e8337b573d45782eefc3835f0fbc03e5c83e74edf62d9c8c1135d8071d9c7071483b80cab2c40844f23da1686b5793f43a8c77e3d4ffe9e4e675fef5b14cb517bc33ffba92c3a550ac3613dc71c338783842ed56dd39f60a9d9fcbfe40820d0eeb6c7ce4c0879574341de560d4e71c4c98b31ca00adbe51680702d8ee1711e5a4c131c6b0b53acdfe03f223de1ba4287fcce808638abed59be1d975b68609b35433ba98ded0b560b990d6fbd9188ee6557118eeaf6e7cf76e4dd3a727a99a9f0a05f3ec445a4f9c90b54e46fa80b0bae5374f0e54cd1de657e7f1d1849072d60ccd33df02da0a70fb7ec802209c9a5e586e9dae7f87e974d8cb942a5d7832c7cf9a098102b22eb212fc8541f2737416264a284a6935b796ce87f83ed36be0a5faac1558e3a8c5996913c2a90cf77d25e2a9c5106065e4e654925b6d33dde4e67b33f6dcb4f7fd4176ea6cf27de3845617947c62aeba4a2433f2566bda2922c6ad8f48f88064652a8aa1496c9612857434053f584c1665b1def0cebe6b44b9c58ac49090a633a9b95a66ed760600c0d188de713b6233ad120bfdb94458ff7b25f208d6f503facfb6191f5e084da699c35008e00b9b613e73ca1edeaab4b1e26dfcad1072f199dacd1d30d52a760a7222d21886fa4647f5213e9f8ff55f3098e95fcb19c30bf5580d1b1e797a291184cc88123cef4dd5970fd7c56dfd79555427e563a999ce1cc66ceb0eb7ab08778b22630ba304f2d60b5226cd14ed2990ca7bebf31317ff0b6f40e76a43005e0695880ecfe40962c745a53d71bec5b436e77cfd9be458e6323ec7cd20afd51a64e5e853cec3fe1bd764e69fb9d4d8e3947385755925e75b6005a03d4eed17260e543084ed319d1f4b6497c1e08c4ebbf07d3532ff2244a0d1c650bd4e1bc6fa64d1cff40325cdf09fe55e197bbaa380ff8fef5ae0be6607730dbf53735b7a96da0f3c8c1ea8306a1ada85c03f2d261185d35b345fec34739b9bb8b0e498dcb7a0716f5ed738965fb03d7aa314167b8817c2e304d2cc0b9ecc966ce57199286d706d66595458881073a8504240221a3741e2370970f83b3542def0ac4dd8b1f24496a201bfd7be6ae5363d01e335cde87a61c97838e78ac35969ba44fc425de12353a73e47d0a91ce82c1a091af1367bb80f529a0519af6b1d6228d5f31725ad4c1d7f370367ea7725c2e6b76d7547c4815e4be83d90d8727b2ff969b1d4977369cc383f3e75d92327ba43a16d33c8c8d18a7545d56e259bf4c9d17a4457541a9b1161d108eeff9f7fc5f81e9ce2d4423606524190092a4ecb84ba03931592bd7ac3919e1b629c96b12c6d710b285c78e988a96cbb917197fdec9e2dd8929a6e6a06e1a85f5322ffbef032704edaa261e0f306bec889f6ee937ece861f0a4b42cfad6d70ad21b7108a6078ca9e43c01f074f37068595a9d30eb87ecbbe9a96af0e6cd62f953ab704721d96d75a3d1fc325bdd074d7daef35fd82463e1022003e6988c22842de30a9d5ac85f73c8200622734a82c3d1422b20500a290ef5323840cdb5b00cb3b65c365ff6583ee1ef77ebd255ae872aa0c9bec83735bbb912c76f6c0cc2b81df4c4271caf64dd87a6abf9909c5aefea670d460fa7d27dd755f048492c86c116e1041952a20b4520d16f2b7e78c978b15817d99f2e7051a088f09c5e8035e876f8fd97aca6b3d97758b657296979f4976696b0e51beb82d15a689efa6b60f867ddcc68cb387cc1556ab8e5a5d908dc337c473d500716b723223408c4e1fb44780bed7ce01c65f0f062fff0f1367e6dcca22876e0656fb968c977e369eff5b36c6303141ef9d6198e622ac8f99cff1e9c7889b080524d0a5be275b09dc1ac32faadf60790e278964ea6384b5d1bece13c8ef66899e7744de940d2f1476ba2cc62caf3f5b17a24afea92857eabbf1977a0ac4e9e115509e22cd176570d42d50105d37a41b5cefd74b30760a38816698c7b867c979429297fc9c2698d2514255daad40e5f6d716b18385aa213e8ddf8f21a3ac7abb3286767a03b101b150d0e0495c492c45ccc0c4f2e0f393c0b66607b5975d3c0bd358b666b33f38594c303147dd0698d60bbb203654d5f2cab1c4b5420eb5e1b28d973f9cb0f03d8f96be4a3ddfdd2ec1677a32cab4a7e0a1ab08f465bce66c8c1fb9307991f5de8f2b5b3403ce67a10a2c9397118316d7fcfd064285cb947975cc9536b2b3146090a7ee4300eff5dcd73d3f7e3590a03d425cd5da9ed55977d5b5e774089a257d15f2de7add1b096e0c38dd95812e1ad0bfba505963823fb4c054cffea31697b7bba49af255dad8b283d66f8f1dca2b551975966c509a4937820052df14dcecf44a8c1159f80fcfdd4d1b1b2e46e2cea467e68b9cbda9ea6a96f9d8b13c8d386d2fe43a7debd80bc89adcabe7677dd4fec1ba551e0dda8b9760a8accaa26aa6e9b1158eeb0719df933cd50d15bd5c60b12bbfdfb8727b0a2e259e7feff449f35289d5899ad836521fece4d5b25166690f20da59b902d636e2126ee69fb69af18f9f732ca754109e46b9e8b6b18ef63bb73624b6f7fa3c549564a3d7ed60d906b423127e2164a1b2f650770dd7ae0cf6289acd2ceb770b9d10e6f030e674f8aa7d434206e98104b10f03d8562dbf8f0dad4a9ab8ce0726bd8f6535308942f5ec24263653990c6e7117b2beb4040d3cc98a674497d5cdd8561bdc17fc526604ee79025175861883fdbb16b26d832323c48ef800ce6f276e7bb356cd1c543f8065536a5f81c9d4f4142601856cc6ba0a6ee1f1b8a49e05a6354aea11fbd9df091a4d252b105dd599a71b82f6be913a618c2d6c4522596c4a028e3c7d6aa73a1b6bd6346fc049d4565ff225601591b2f0b3164b239a00ca7951846b221dbd8e9fca90db69b2e2bb081452ab5448286af3d1ffcb9f1de518e407f45dda2cb253053dfec16b0a120c4a57c7df34d1d369afa521b77403dafc23fc9fc6ae949c28a3dd7f92cc73b5ec5de9258c0b4d19a04842f12c2867da4e917f51649bb489873757a4a69e980a7fc342bb9a740008840b90d64949a9bdc866ceb24842d0863fc16ec69f54ac2b40f40b51e1ee4f49570ccb321ad0eafbc2d89ff92f3f9239f7ec76fb044de39b8e98a4ff38bb43c1699902b7987c938236c79a61337d84083adadb5140e1f7e3a40d9fd0cd560dbf00a9990ab10dce987409dd76605196d3d108985f9526a43e9b704331d0b17cbdc31dc8c1808e0bd446ee7730ff239e3c6fd5c020eb082b5542820a35f27e88b3d07619a450c57d1c696fedda9021d37fe20af92583c8d30be99f23a85a5bcbf4d942ee4200059bc18fc3b7d2d1c352dc66b3fc12f82c635e5fbdf0f1f71903a2ef77f8dfdd3e9f9e6b6ec40e48029a8cc283176d1df1aa4cc8c489c75c3092a9d6a3c1a324380a4f5eaaf27a28a10f4f3df0abb99a04f8d60c0138ae901efe570fc324249b331e73d00b97229d647a7eaf39adec5b41a20a0240fb4d7eae7178ed6ecf3a0c3563045c8afb2ab6e587ba2b872927311c811e94290694e912390564fdc82b944122ba3cb0db9d8f654520056fbbc537a9739f88e13ea517414968661fe51bfca4ed7db88ce8037642aa12342814bfe605d9aca969bea0925bb74b018552d79d5115f0712a46cf13a20d935bfb7b52d8db18456c625632b3a73cfa8c100fe889e532fcd6b60d96f17aaa29f1704906ab3818a263b807f5d952b74f9b2c70fce9bca07d1d3ccc1cd366225e49286cf69368c8a5138588a5823faa3983ea9b9dd9befcf37fcb0131bb8ef8bf8a39e5727cda9856f4e9c4249b2dbbc7aba90d362f3faa47ac39a253a090157fc9824aeec455fd6bb8f45a4ac8d435ccf8291668ef64529e961b97331c764494cd46443c07f3f0ea28ac1c8782f2850cfb1558b464025f3f22863df89fb2b77945121220725a6fd2273d905734e1bd01c6434c7015b17f88522fe45bf7a6807367f2052b98c3fbd7abdf7286c40814298d25bc0c125126f2f5f352962457196843a602ebcb131934c773303f365c63e46a254aac55c00a24fd703f17dfd6dd48479a03696341d17e0b076df04823a9eaf2f1e80933bca819f053d7103f708c0ab82b96f77cd3329cdc6a7efe4182894872135eaf0764be5633423bd25fafcb2d21e85c511fefccb884c4f0454a8dc7f0fe7bc87bafc1cf2b0fbb00f2024da1d7fc3a8b07cfe334561b88006e0938cfdcb826157a7211a20aab24ae487e69fc7916426d40f3928367919f210b691d2ebdde4489076740c3ea6e4842bb7ea82a0c6a4fdfc5a35ed87d74977a91a9ee163a98e93b4a823d01be7cdfacd5698560d381f5d363ba85d1043b8b65173354dfc3979f98f7d046eef43374523568a737bb9459ce9641f4168f2b33f2e7cb2d80f3f5d5de6a92516313f1c98bc36213293ee7ec6a8a9a98cf3231e661e51e6b1a7be89ba20b3009f9547b3025c07cd918de309dd567f43e28f62e9aacbbbb286ea636b54b044ba69061d2a4e09bd442c82c080251f4eecdd44ba4edfbe2fa58616b8dab94485a0ccc114e65f1a295936064970bb27f8280879fb40d2d726f037f0a15230eec9231934342ab8077a42cee8f1b3de32287627bf2e3db56c1d010763fea629bc814d290be98902a5c7037e043f08b614e75e6ec871a0f3bdc85ac96015db4f47495d4b32813c47f4eb30d8be62992bea839e49ca1c12bd8c43c8058d416f6258b0394af0a279385f12a3ea78800e2203d36b2504c0b17da853771d4a78a820c3fdc767be4a5fc33489466d04d8dedbff9ca52503cb7b92615391249495053dd442ddad251a3f3f73f741a07659c246a7effe1ebb9e69e50063cb099634d1da0077d5bb33e4bb6310b77b5309195a0033b2888f19dd1bb250d5dbbca0fcefbb22f13fae12b9a20b64b70479241bdf4fedda037375e6e952150a35086f5ee2240795b5d6383292f4d0d46bf5a3a507fe612f664172a5fc9f98a90d49bfbfafbcfda5ccb05fd817a3590501918cd3be6d99018baed16b6971301a3e17d889e00b7fb7effd612a64f9de3f89c3fa174400779737e9b5c626b09403349bf5212a4a3fa171fa985c62e2b50a024a90c2ecb3605000f05a258872ab257889ec19f9b12847c7e94f152e576921a0212fc73f04186b04a9659c8eef900b8dd76dd20e2d9388cc67372d82c8ce54451986be9d294b2cc48ba2df056ac477a204ad05de49f64f44f665860b46ddd8371426fad88b2441908627d6371ae15b49340f6695e6004a3364eec40be8d1132ee75cba8adb0e9e40683e8d2251d410935237e6294eb1c24bd5444920856974955801dc6fbb77f54dd97eca9624d896270e09930bb6461e3146328b98aa44cd25a1294d62585a488041a9113044309e6b5093f3198c2298c85a906baae47f2de2ebe372548ec9376ee0e2438f13a7a9b2a5577e49852b9013b1af845118416231b7ec3fadf52568e737806c6f72246668f1e4106e632d5a9b6edd4b37f95cf6b542d0d9461303f8864e088171e1c6a3f85e1ffb23fd7aa03fe1d5957df2446856b0cfe4c3294bbf3bfd5d7871cff28d988c17c79c28806c525e958e8e5d40f57f03e1b02039e7061a467f8c86ed68d165b05777c0fe0d9f7c55405ec0eb85941a94b9eea4406aa4299abd44cf660be000f96c405b45012d238a5405206dae20438a11d6db99518d8313b5813778f1d24a182022d179abf4143e802b9d4b6c6bf240ec5b0eba7e0c95eb39c6f50093e7fcf7cd573a6578a67eb6cce0776bc17c90e471eedb8b0f842fc352696b3aaa46de459ba7974727a79ce44345527d14975326569baeab3d7a94be62f0642005b384a946629ffab0dc83cc66848a5ce6c0d8a6385e44ccc7350116f08206ece513608cbb8015d169edfbf0ee868c80037838fa1688296a890b5ff7c7e7a308993a6bd3f395ca3991800747c2a0e69a6dfab0b642954f4085e31f3405dc9a4de46ae49582ad3f1710365cb3269e13877c90b6f5396a90042662742f0f866e92a8124131f292931add417e79772234c19fd7ce7fc5e537bc0cc170f43cbd22c00e915cec35d543eb29846aed68e2861ab733ac54dcc60227edc291bf91fb72ca7282ab0153c8fecb5e858326074bc903c311ac91b09aca290e6091151d1478a9a3055400bd4900344313dbb664c60f6512f00a59efa76b59a7034a190140c40064a7e5140b24e21be48a80c5fc7940b6317d44ef3a89a2656b30812815665354ff906437250ea30d65541128841a2e55fcd83c599370bad12693c17f02765648bb05b550316acfa1406f4255ff7904124cadc8ef46db2352fec8add2e3ac4460552f8bb79e82d2b5414e390284a434e08464684cecfe27ea3a5b938906b0c47bc828a19ff4b1712441fb5bc6814e4705433a67bd145e5a878cb4bcbf0e347c3e1cc1b3ee2130d43eacf35c86c0e1bd4c308fbf80e5663ae4b6f7fd02a41c7c65d926d5214a3b6351d5085d7c342b96e075c745c79ecaf8dcddc6deaa0d3d00048cff016abbcfafb07115085c092cf52444c14f06ab3304a464869f7b7ea4aa673ac038063e4d527a9e1c84ff94a618293bc23cf1dfc69d30dcdf17a5831b3dcdfe15ec4184f6c0457555fb9cbc7243b815e03e133376f4d11bcdb97701af50444e9dce54e633958387a6c1ad32904a78d8c23082ffdb92c533a81f2705df1bc8b0005d8a9c97e00c7df4fce761a5023adf42c35faa6a915692f1913cd82c8b654fc03ab750d55d855edb67b5aa0d6dcc912a44560762d76fd838d0981803a9571eafc8c1fcdff87848808b5eb0350533f7b9174914e5b5e4cb06a258866add46984db06b97a670bcd0b2f13d7c3d3725ef5f8aaa1fcf432a89ac28d641bad68f67112957aacdaf8fb8c3a3a92994756eb65292d07101e73f7c51c669a28f61d875bef9f3cfd78d3ae7395ecd38dfa719f892ff92243c4f031d0cdf633975d01bfcc6ee2fd7ce9feda5fc56e151dded9a67ff5a9af737c89e54050003cdc2704f4e6b9815eb13e3c4560f202176c0f932124d9d9542bd6a3b5a778fa46d5a0d6b1e3b77227262af20c79ae305c8ca264a53ac3ce19b86773d50a9f81e6d4067a34675d4ec18de1e41e7ab7e2acd0e167ba6809b1ead4144c90a5179d36bf1a5bf1a2a360ba71576cbf25ad21913173ac5e00a5ad16e2511bc3f694db5336e7de0d4851914573a9a907a7f557dbc115a17f9a882bd3ad6574601f4d7bddd6902be349ffc0b71be6b661584a981d33e99584811eabb7cceb7aed90fcf47a84419f837003580b3d8c4e0cdaa6552d6a7199c5eb39fe4082195d020c204a52c680d72ebb2a105fe265f29d789458a823c8250e0605464e3987fdcfeeff6794338b63db926d7575d0a02b7be30b836ba8ae8f21ceb58ba48c80e293d366caf0ef7a3cb5cc073533964618623367211b9271ed30bd13d86adf1c7f267f1d4a1c3853e69b7c9e15232d761ce1401e1c9f9fd03767421865ae85a270701f86ac50fe40ad9f975d5ef4290138dc4a475ba0995cbb600d34e4de7cf658efd9f01ac996a2ca88663786f77c4e330aed15121047fd8cac2803db4fb41a9536aa83214974a85d50c8af3fa2c2a4907866d275a071919851e479c7bae5fc2c6890cf3695f4a00ba644dd5811243ef10430039948fada0c4790d413b9fd1700c10f6d16f63c41cc6cee897280c7c767e3e2c2c0c3fd285cfa06d4e14f14aa600dfd396ab9267dde3a169e44d2d02e041b6f7c8f100972c5cb07115c5df580052f9d1257af3bc022d9cc3e010df2dcbe09a287cdf25dd05d8f61708b2e399f789c132083aec2991fca354a6bdc8bc6cbddfc5f6d714792de0eed01a6ecec3befdd2016150ddc2dc6bda91b600c5eec471adb6fa6577e50108557d46b28cbdec51131fafc2caefda31aa9c1e70fc8322617e9a9a6b49dbc8725bd876d56049bb168ba4d90eaa1d88f7b9e0f5a7c99b03a80ea6a685ba7198d9213a9074e97aa15a9ebb5242daf0808307135ca8c72d745d5d05daf6398907364642075cd39ecd2adaa7add5eb90b68b9e7c6b59fb417ebe9215c0ca60dd359a9d73b9af2d00555e1e27651eafb6bd450da5ce7b502e29064ae840d45f8bd49618e2111c1792d97c8235408c286893b5d353a98f65128424298026d2262eef0014db28fa321db58778f2b0fdcca6612ffcb9e1f2b8ac0cb52a93e2664427ab8f1f526f6e4aee4c01819e60daf36ca848afab1e942b64a7ab8f974d6f7613fd60ed4f23434b9c63b6713f657bbe246a803192f03cdc47c0f6ce6e8b209507a0e28b5b4bf27d21b78380f446cff4dfee1a6bd3d4283d8f5bfb95731ac8e66974085d44072b55d8402ef096939812a2d1761cf1ff8be28fb4cbe57570bbdde6f865c950da4bafa802806ec8f44ca39d57056689f22fc71c097f0f8c0f292f564a15b0d8da5777b01788b579882673916735d8866475ff61d5e968c22b24a200bad225f3d0a0f6eaa679fc6544c69df07e97f97aa7e2d0ed62a4c29f0c9e9505793c6e479f10b351372f8f9fd57e6e626ae7cb8d5b55048cce5818109d0b74a808a4f2a57f7d7af7e345fb7350b762ca7ae46eb17ded61ad0daf9099a24be0606f93ab813964273d0ef33d832cab6da3c9084ff098e7223dd7f4b70678b4e289178f7ade7870292c020e5a7f021c8a62e551057cc98f9f7f2bd6361084b7a819c546c2c3d282ef58fc27a927bccd11cc3f379784b40e786e60102a0bd6899a71ace70909beac244bf350c23b5977afc5a4c827194f3d807cfe4396be7f4c59789a1517dcfbc1e608ab24952292870a5ca20a10963fd0f7cf0cdf23451215f6b26c94fb7199187662aa5f224cf6ae593c4af81c45322f2be458a67a8cd07891c33391ece6e5ca54f20505e9ace490ced665f80b463f18b260c78a900dd9caa5a80606897118c04140a97f4eaa5e1a01b3e72321da87409b4f28e1aaf5747ee6ead8b497912559365c4e2b41648055e7c4e1adce567033dd4ce3ff35157fbc430d0e5d1847d4727f8daa5afc30e59861af75dfadb00321eb0f8e0bffad7835e0a77b58660413ef95989268a6c99ad5e7cbf2ab9c5423f450db11edec4cbdb340d37a1df02191c245cced900dff38caf7f62a27d442aea71be32b103bc9a148116383bca3c02c5280b54c95d0a9e1d4646a8265d87254e05a4516cb712494dc50371cf26140b6b6a372e34031e4f987432e1e8a2cd4c3f853cc996d3a8bdaa41f785744aee7f94b18db1d8e9f78d8e8ff313ca4cb938a31dc59c590ae2e2167eac7aab7d8ac438ab3fe51b17e378296fa230298d71606e1aea2a025dcc9bc9c6dcaa6e7bcc61f0663c51912ba65659f1eddad44b9529416e07d7c3a496c743a9b3ba6cf656127cd7f82a3cd7e1caa778579db6a2fd131b30f969a00c57cd717a53715013f6d7d556c8224160bfc7ff677f97f56050ab3d1a7c8c2094216a20d069af62e9d9639620c553a621ef9647a881f93e88622824091efd8f8f6ebbcb06d4f38706a15bb8d448182d06f7931a2862de9ad06aec6781be638325d1bf15ba532097e93245aaf7f4c44711d17149588957b422044085279fe487d1fdc7de5153704b896a232f704b8cabd9d92509ae50bbc31e0000b74504d5fee420920f72bad39fcc900dc50cd70c05060fd2e1229f885a9709228b49653352018509a287d21f3611a74b28fbe34be4d69d4880b195712812173b65462dc5e09f89e45a3f3bc888a781c11051c81e0b9cc10286de4b5f714aad71df710bfc3a8ae99af30fef110a53b2b27686bc44e73bf2a4542c9c8054aef185dda5d3048c63516e29ac57f2ffce422983f743b327af626a9ba500b634e18cd930e0eea1541b467f4392720ce0453f89cf6225d70a84cf111e567fec8a3a5da1dfc45bb3ef7c5b282780057e2bd7101bbf6ef3cb395d9d25c6d0a6392b42f9aa7c173f8eb2a0ba19fffae26e4e1ba8968c2125ccc26f47b990a99aca8d38026080430486dd77f8eecec63e94d39777f91c68be5b0b031ef653f92ff8fc9046f13ed60d49fb463c390a6f121a504a3e31c89288ef60f75411a9de1912a26fb4d3ea03f6f2bf23b6376bc591a4c823a2650fd5da12253e628580f825b34a311cf90d205ff6f27a65b8d25baf5bf4879aeaa7c8f24d705baca807ed88b068e4c26e07265440718b2fdbef08b132afcfaa2559e7dc4e6dea88fb8fe63af63ecac44b66343937dfe945b1cb67d4dd20c7ecefea13ed169c188bc7191064e265db47196e0c4c7734fcdcf2195703289a31eb3ec90fc72ea32622eafc1dd9f1d1407e1eac95b46ee58032455d7b989aee404c1e1104f72253e987e4ebc0a7cf4fd9783a4857253b1104e4ca82ba33a91c1d4c4472fe19cb064dff8a3635b319f9b8c935a7020c6bc46c95f895c09ed36a6607cbaf6c961d99cd62edc2b6606c7da4f6b507e751841370e7e7927cc16fbcaa95d891a4e491bffd0253ac0754873b97bb3cfe7dac728a1bbea22aa0a60dc5eef33fc95c6753b601d563d9eb3b9d0e411ddd17de7d3f304cd720822490a7ed2bbf649d32d4c6d113f1d823acae2064824b90764745b52838b1f191c41b1033cdbeeb3b262c24b700614edd9716a0a6f45354ed9b9fd0cfe6c0ccd17d775001363f02291b4427b4ab3e10967dae824a5ea47efde1d72005b1f8814814a6e813393c469e59dd18ec8922fd0b348eb8d1425dec19c2077a3fca9e04ee8fd323af9f5b999d0e4eb2d624e2d71014c7afeb5074fabf0cc89aebb4738a8ab9b9f21aa5b7681cc8b99ddb999ea2087b90206ff1a66f493171a78ac628f9e2a214fe237c7933f3fcd994ab1923dd594984824bbd3cc2d5c8eb9cffad261c101d27e38bc8435a2c835660566b93c0ca65eb3cb8059a634c0b111d7de7a35c53414fccbd226d81e418ae3903696ad24f361ae4d74aa2fb44589b368f480bf698e9aad7d0960a102edbae519f7ec868412add15bec3eabd95b1a60acf79b2e01c34ccfddd25ca9550d17e7dcc2f12fa4632f5c646dcbc42633bc171e874e0ec54057e6af3449d214c61344cd88fde518844a41376b1e88dd0c38b02bc0a24c8578498797b5c33d3bfd8fe068ac93505ded849e52797672dd934ea1b925dfae6759be5c9c148443132e6de5d24991fc0cb6c0fffae94ce997222c4d48566c58c9e7915185ddaaa0e411fefc20dd381460800a543a3e29042cd4255f38870126c7813c3d3a8564f086e7c3cb630db4e42389b0d46877012f070ef0d4ea49b3099ca9e88a025f4e1e513d72e844b2c04394ac47b771d618a65fba70338625a17c9ef1624358c6265679072813815d2784293093e843d8ab56c7b8cf1daa2f59c1693bbab4a9a418949d571cbc753effb5a657cbbb1baf858b5bde4c8a07408fdc7e28fd28d25a3d48a625b98b1bd39c36a5930804f74689432649ad10eed02afcebad93cc4cc94a03b239d109dc77aa95cf0c0598df9ce04e04bba5ab468a78cfb05a4e497b38ee262c50732b24c0f3dde7fc9834842cfb61898f8fa0e0b8f4821ba418eba1102c7c1ec4c98b1566a1ea3986ce4a1de46e9e9b52a6186d1a4349f60c14c5302d61b800f87d50c2991ae4535cd586fa7c29f0bcdcab4e10ea8580e127b16e8ece28a0be3b15a81189c0d1f0a9611da690705695f7586d8aeadd80a298c69351572a4b3fe2cf0f7a63a69b03f74ffbb40899d624b6e50a1339bab53b55200a65bc7b9ccc03bbeaad12d9b77ba994f8e4ef44934001b879ff9ada1bae5f0955cfc9687639287e5d37dc91749d439f8fa52a6192977873993eff4ba9e34ceba012787b0cb5c9ca76676792c89140d55632733ed866fdf41ec9bd3cdea1f16b9c79db7079363691f957b3a8ede05d3d3ed85e1e85b7ef50523fa817dd29a3889562636aba3bcc489247b1f3838c1cbb0ec9e29b797bec0c738758a80c73466d6917b8aee9e4fe41dd226cb9940273cc3afe83c9b1a51da85c1064e37612619136b9b2b15bb9ce5754ac4fa15980aed5913467c53a467016c194c819230128a9d31c005ddad8a47877540f8d070beac275e18fecbcc4896d3a735a949ba4c3af41211f9d86d226f2b194628cf6596cb3f40110fa1709621d451cea36111ec6bfabc195b9bd46e253814567e63a7e59d2205a2ac713b23cb637e7b1f03ccb4a44c546575b06bad1528b4a505eed6f4fed94ab508023acfe2074e001fa14c3730a5302d0369ee9c4e53e7d55bea2b37c925d0f80a2e9e365815e8807c6f9915a05011e8b6744afdc6b74d6c304ebcc05fb82b5dccab1e794581ffbc61293c7745b2bbaab14c2944d3516a55cb3702a126837e991d9e9c036141f1bace27e425b7d835b70f6e4c20b304779d85ecf84d0813737100f7f8108b3c1e2716c8c4aa50220f4c5b6446a505139dfb4b276bbdf0fc1b342baa438a44cb62bd6122ea09b2f168c116a45ae04e2794c120b74c23515a836a89afae0934c8cd2c2b10fe653d72b14534358e2676ece93f996d398d9e55fdf4b9d5ee06a430f907c38237ec996c42189f2d33a3483674b55f5d73bcd3c68fe68c64f49e0355a67ecd296ee5332b56f4b3fb788df5b9af6eb068fab0ebdf00468a8f25fc62997fcfc1698caeb76e047bc080cbf292560dd0df1f975167e95e7c6eb8841ff7c5219b69a2d9a79b7239cf8cfb0a3395ed6fa4d0eff27dcd0e13a1a6816cae9ee7ce8367c5d6df9501d942cec2e6225ccb5c2f7da017a1273bd103d4b0cb7353c06ccfad3ca75b1f9a7fe8b4cfe447a69fa0307323f08b8005f74c4fe10a77b9c7b01302214064faa293195e18e0c817066b3d55b2a4f86bad2b4da30606e696bb9b4e84c0d72ca7af988460ba077db99e2291583dec987c27531d0cbfc39255c0a62f21754f7cf0d4f62344f5a8fa76b673bec629adfacc392680ff75d470821144c01ccb91c05d0da89106f54da69f7f5b777b6087df79a8018fa25683515242950c8ff71e18c0ad7d88966cfb8968da31f96bac21dd2372be9b4f0e4319180e79e7e39e416baae9ef075900972b69adf3871a69543d711ca5d9155f00ccd1b8526759eba5a3f367a97ba980c0b01ece4fca22818b1e8a10cecf3782441999ff2c4384f34c6e36e7407c50f4a75d687938c6b1bcf9c59d0781cfab5a518434991acacd7016b952f2d23a1173aae30b5cfbb3086077ee598765a99b77a1df8646f6c8eec55a4aeaa46d6d20d0bf032e2b22dcfd1926a0756e96a4e8e675961b73e45477554f66e67f809ea41403c0decc9d3a7a4234c62991ea4aa2d75b2aa065381b4d282f73f04dc2153ccadfb68a10feaffc685949b36504f6910cd45d67009f8926e461f2f8173f2d7715ae4988f7b71f1433e6eed4c0fa28af1e86c0e811b1db0e121bf2b12980c95aa0c7df8f8dbcf8e98a819d50a2acaaac8fa9b43a354fdde4b42b50112600d8df545fee3b51e24bb51dedf17211120569ac8e909e4269fbdd2f00c4d52b5d2b70e7a56c8d2ce3c1442a6b3f85091c867d3f7132f54f130f017d04abfa09fbc87031050368fdf078789f9f305c76f51eb313ff3745410a29a9b3e8ff458407c0b25b7c9315ae2210c78a063fcb40b7868a463c0e38e9098608df7fbabda712ee00d966b0c0dd3bedbbd659202b6be1d5b46aaf399cb996be9e2433132b2fada995303836f81891177159801ada3d2b68977aff89e4031d37c63a43caa1f7be27a398f68333a20ad91b33e0e7b9837c32cf9a6d67a5c987cf2a2f52a0f0848794cf607ebd48ca87b47e7c2e77acd621e3aaacd40b1a1db1d3497defa230967a45b02cd819f3d824277445165b1efc8d12aab01844a1114e38f87420cd3cca6a1d53fe2b7f548525186ce3502f7a513a8307f92f4a3c3c3842def01ec13354b438ba101b9570fe85d1e58f0992b34878ef2b2c306311c436d0f65cc80df9bf593b58828a05af8374d9f656a691bdf4452c34170930ea02a9a1110d7787b3c6442796cf28db5c8d350bc955509811a677787550d70ab6b5b41e51e33fb94f331d75521d38cc288534dc1c49d5ef2d97c8a7f5a9f85d06bdd958b046ce58fad667465b5367c7a80e43d0bf6bbcf112a9a479ee734c9d916d0d35776958f4a78ddfebf606c447d2df48be18a5a8d8c42fbdd34f8f496db070bff2c7df65c78f523aa75c350fcc8429e6aca20762f1cecebac83b50d48ee2346a8d138662c0ab64cc8339cefe4cfd8fcabc699f209bbb659e4b8830fe594aee90c8a4b737463c7bbb5d2f0e36b562b3c2cc8f90f21f9e0ca330415219ed2c274d1014d5653a440ab4b351a9fe2c3b48be41cb8557ef8b20b3a424d2c9b874e0cdbad31a58090a9752aba8c50c83f3bf50a3e56e6b2e1b60c29425eafebc2e426aa1a6c7ec579a1cb3c4b2c5d71a5b816e8b3b8f3ae2ec179f96e9e3fd9d0fdc297a22936b024380d815dee2519027b168be40dc18321f5f0cc54cdbe8b3eb75e4d4357464ae1716de8a119808b06f8a691ef7ab1661d96337a9dc506b5a3c705b219eb730266e35259424dcf7793047f3937cb3ec26c2c7d9bb5b8c7611a2b4eead7066101263ddf0df632c9aa4c99823f37b55f901890c9b4040cf37735d36cf2093fc1d68556921390f67ff7c7eb0bd5bb74029f55d10833e3757b29ed502d187436f921968550269dd75f40ff9d73c90855ee5e5759a8f209d30a77913e23ebd8f83131902135c0676c8853fc49971464e1160778af7be1905d9b4174587518adb7406d34eed3b70f59e66c7d0796b8211c3dbd158a621c0b5b1d8a73e512ca25eeb2096bcfd23cf6c24073af03db1a2dec3c43d2114c5722942bc84f39a814aa542b2377f3095db5f5963af5fc609e35c78b8db296989068f4a7867ff9b40490e205f740e59255546ced435367657c144d8d30b3b6534e64aa6b74720d9ee784e59492ba3569389102e7114f72b48dee33ce347224c534a70fe6327b7248f37ec2ade96bf488b079b98bf9505cadba99c7f4d4d31e2bd6d4c4c46e34c2f38bec3bec413a4d30c9d3dcdce60294f036a6468d474bc78ccabdc2b452508a8bc518402a7dbd974a50d3e25f65d0f7fdaef446c84ff9d0a934553fe2ac03aed062732cece56aae7f0805b5ecbc3c61a3e9edbbb6df1b068b32399dc1d10d34c0ac8a45ad14ca69911864535173044a9c03ad9a100cc5676984ac6593376e9d46bc00608c3491f2f13ad20d0d29fe0cf3f608531271bf6752cdfaa15caa838b4445b5874ad02ad17692305f977b0d63a9c503845765177655c8a491f935d9c2aa045eee14161ab32fb7480282ed4c7155651e0cc0fe1c86afac1572775c5980997fbeeed0124b983728f12609e09361410b57e6c10d85950d1fdc082b36dd2c42a00d59658ad38f7b769b0d477370c0a3b32a86aa2889f11fb2723fd025d94124202f2925db1d136d73d4269ef8214146c2d08ef0fee9377cca7517b76ae4d1c693beaf63cefef8db71725f9c3d780501f2cdb906e9134c5e73ed36d6d7f0e3f3787322c7d0840de5c97aa72915f6227e9ba7235bea9007448906213eec00e5c7cec98379dd538a4a22994c17cd5342358b0b43e95147f005a916d8b156027b99793bb4fc54c8d0ba3a69e89827a515909dc9a09b48db9c66b5596b8874456719a6f8ec3832cbc133c39f3b0f2ed7962b1dfb2bc193dbaee139c35f308d73e751732d930d02183c464afb4bae25451e31b269e66744c1569534bd38bab1da61bc37bb80acf0d657244d776f1a00ae0a463aa926c06b65efb8c86b11d3bfef641449e1a700f6529133e59c161728b143de587d9485be8af5ca1633fb1cfe2befcd8ad43523d5f5ba2619392a4256a3b47ae194f99652b2462c257a5aeb2cf30d8b0134aeb81d3ca95f556d97944e88a2c6bc6e87de0ec5f3bcf553da0fff4a1a81e4c9c840c2b08620a0dfc32ee379a7c157429470e3b04bf4b4016c5aae90ceb03fe778d7dc8ed0e4ab353eda485e5d5e404aa742ebe3ec744c17373d7088fb5172370012ea015dc7556a99c97a74e5e442d9a034572399eb3d24a4ba8ddeb37eb8aee1e8d825df5432cc1e532b796cbce683a0d0d3ca57a3242c638f32408cccd9cac6d0ec76a378f32cfc802e9e8fb92d261b530353a0c1443c64683af6f96f2de3b15629b22040b46fb1b2fae4e1e232bf66820352e1830b25b41d25aceb679737d83f1373027edf6e2d51c8a396b30657a6c23adc025f7064e28646978083f6e2b63da9f84ca3ffe1428fe0dfd6cb5a77cba7b67b13a9f0d97712ebfe27290a051e2e15fd17acd1a97695b1b52d8f0d22232b71ac6a77b6ee71bb5e927ca2d3acd481af50e3cd94862d1dee5d4f4b23ba615880b48e5d1b61f91c766853f3469d3de3421f6ad14bce300ed2b8495bf7ed7d8be28837fbd0fd7580750de61d7f46b23ba77884086bf7a5ed4c446a14604943f3f264a13f50fd89aa26c38ae09a9f152a2dc877851a3fc3f9df2612bb50955cc0a1d715a821da271ecad3db0764b953d0882fa43932c31e5c4dc021c61cea27eba1f5248bfa4e70cbd46bcb270bcd96df02fad5ec48f55426d38b968d1cd99e1010449362a020ea4c3e02600b4d8169f5e46afc653da9b9acb69f9dca4c86c6a155b3820e35cb13834ee12b321abf78333f7d2406bd4a5eadf599c7259bbe1260e3404f1e3d71f297bb9b916d47ffbdc8caa2fed0fd00d23bfd25e3a76c8d0bba4cc15df4570db92e09f7a972e74f7dea15d9feb108fe032fa735dd4d989a9b3ddc5dad825971b8545d75743cb3192e95511421076651ee2eb37a0782f33eb1c81cb4301fa154903653a77da679cc88dfb0afca760023b7cf7118c8fcc6dae7877de453c6a1486d742daa26f345d68e401bff34c90d5a14a026570da78dc1af9659b5acbfd262235b27ec8982560963486ba13cbfddb2cdfb1f0fb2be3c3ee0f24e8fef92f26252b1ed37a2f2c8a49ea03c68a143ebaac2e395bc0b0c46afa4ce46b33dabd2dcae6fdb76fa17429cedc9cc84c469f6f677bbeacb9c7f462a58c2a17fe103f8cfec59e1401d10fe343e5b3a890bc3199940fa4e8c16aef126776e9c9e7b25b9be5392e90ae85a72b1dc5d38350372f30e0c73d7019279085504b61d77d30317156792dcc976c20aba35c1c1dcd0e72ebed6dbd01e4a503bc80049ac0d052b81b5a03b91504a94b457031b04e0a78eeefcfe25ff5aac4317cadc192fff5473e9fb1f14d06ddf409e4f544dc9f4cd95f488d1925d2d93d22dca087802686bf42414c1bf73733518289f43af4dea02e9cb0a6e19c723fe11d99b84eb6e71f174dc1d4060c04b5464ea306d01cc3557e3f9d898192b9925c8e9f656110d4e2968a0122adeb3e3bb6bd1116a07e277d5da10c1b21a145e893de06ae0afdbef4bd4749c50b5d063f3994d8e43c9b667184469a3504fba93f8add2aac947cc0fe9e96bb7f877f035f12e2f88494beb94a7340822495ed71f6d9657a0c97b2bead4cb4d4c81e75f4ddadda85dca7c64569262dbe283fec9b52bd4b099195e2413256ffc04a6c30ed1fb2caa02991bbabefdac829f5182c48faa6d3f190eef116c2539128637910822fa08faa7adaf18845e343a9345f1a0e7c6a33187319c9ed1783cd9aa66034fa3b0433a33424b14f968bce9f03bf37cbc6f4dff037352eb2ed73761d5ac0b0ba16368b628c1b9946500e0da1717022c5ad94a980ede6f2d686c41c83f9fc1057b6a9030f10c13e4aa798652c0321d9a769d3e8eb3c888f2c27eef814b353ce16b4cfeef91fffbb21125f5a6d32ae804017dd3d90dda58525982182cce9bca64acf8503d36c902bd4ccc16170ebaf36d43679a4d21ece239ca83354d1b29efd7f6917e8f67f364b725481eef70dd3ba992b93de8160af8446a7993630594fb07b08ceec763340be34ed029a21ee03f92bbd5277eb9986e306eb7556c8dc6708e9d611585a3960aaa41fa5a257d768bec299c4e087d3dd9f2f4bb4053c6fe6b5d4221ae68394d3a8c13424309f832c239ecf126e70ab9a8aa3a736914af720fb5edd2d5e981cd845bdbc0e1030a4187358534d2ca8d35c56745e1100599087748b1e745f3dfb7288f10a4adc665e009fc17dc2db9e902c4542d6d7cd17083726b89f54c70932873c2db4a6bd8ecafa807e89e78b3b3c796d29f7f8f123615bb9103d68538b153cf94d16853cb4756d7de518d19b2ac567307ab02bc639526213467bf960d7cbb31d65d089d1aedee64a79ad3b21212d71bbd371eb9d10c7fdb0ed0015ec36cf113e52446228d3fbc8eaf13124f8450851af78b004213e5df66e2f142a30a072d1bad21999464cb5c31cfb70f0fcf6014446df6431bb90e7cdaad3273b8cda566c7c83bb7a08ee671fd7ae9a2733af5596938f8dc5b228ec31e5564b9e8c5bf4500d37d809a66f63d78d59c3badae85682b65baa6bb837263e5063b54d3c2617298c4fe40332616d84524562ddb574e95e1adf41f101b7048ff3f33fc81f385f70308196f544db3e171720d66d01e6081e1efb5a23429429245070e9817b59c05a5b7f695f46dc02639d10dcede160411bbdb804bb0fceeb12ae4254e4c778000b6f9b1cea0583da77ddb41a0b474f363a1390cf598db8d4087ec645df74133c19e64932ab96da5bcdec1398b7873e1b55d6975196642b259e78ef28095f90636965d773799eb70e3db00442d2386e3bfb1e88a21866aa4e7865b58b4f98dab951c25469518b3beecce2a9675f0067747f1acddfc660b2773cb4239e3766fd561137e6e4c960eeed493b6b3d516746b656801faa010234fb5151e7baae97fca5963f2f77980f046fb2ba425ae0eb4a87c6e439a8f0d0eee7746058d76a94a6e595d889f825894ecc706d4c3c74d69182e3424b02df96ce8018c748","0xde2827416d22656a3cf87666640aae36792fecaf4370a1010edc714eaa24372ef203e6232ae2fa13f3db5aa7f65008e269d6810a57512906736b93fc932827fc5ad17e4030f83235d352dc29b62d233f325abd9356e91f50cff35cf92ac4d7c426476930e572bf3686a58dcf2e90c21c401e3157faf149b0b55bd7479d5f26a8bab1c91a75da4d50270d2ac34f01117b8fad1eb7fff6fe116c8dee37bfaedcf94eea85814e25ebedc8cdcfd7edeb2bb9309954b0a71288d46eb922578601e94c6d9d92d6a4bc41adee20733a4175c08fcaa6790f37bae9e5ea682fac8b24200276e1326aee90e3ad10f0d31565e53a94164f1f3a789a6a9b436092588dd12a0c1e1d24e0673e12641b5f80c8db9f4a2e628c355f368469bc90511c6eeeaf806cec3df05e8e41b7d9f126aef307acbc9f0ff9b9fbc46854741a5ff5a134e592c7bc3ee019a63b7e4de5bff4f8b0cdeefc143ebca17766d2e8e06dbf89893588503dfe48ab3747436c405c3274832d5dba78d111d927e572011648c03a3cb42c3773652cf28b5c47f5c0b225de90910cc2db0453c2b1c27386a18f3d763e04f7b435de68cb32c6dc75149986cbcb25d3d9ee63fbdd778f701c9d807409a62845d0b019f10b7ea57ded616ea72b8cd4c181f662c7fadeda0ccbd783d7aa2de532efe226c69608877e97c055e980102f30584d5da9d7cf8febac54917b69b3aeab5d20d9ad462907cfcbbd408d4cf5e52c7fe1e3ef763661851fc862dfb6b82b9afc907edfa882867ae4d9c9abcec2d15475b45b77798646b0492076762ee444576ab0e6203374eeda590adf5dca5d8b52525aec001a3408ea17f9dfa1817fc5ba16cdb80db5a985afd3363c60359394885d7ebe088a38dcb7dd26ee005af98b6fdf8d1a834189d489c1bbb5bb999310a8835d8ab5828f12ada32d9a4397644a6d0366a669b2c6994229ea523c77730c36464976bbd5bbd1eac9cbcbe808f5d6b97624b25736d1ce68be8738c121aa57415e27454cab41e32a0f6c6b92a7860cd4e167e5c50c62bcdc014b63af7094ecca71f1d46ee32a90a73cb344d95c173b6ae22220d0b2f41e091d62321113f2e8a2e936ed57c2828d72aff8b8ca9b49283e751eb1bc47465b6c68eec12c836716bc2b955d9ea8ddf80cb8c5417a67e19f58cb74dcc3dddbc2631182159b63fc02383c456c6419cd64525159c350e84b94ee2e17b2d1c07be86a1fa7122a879ca9ad0d9094d0b96df5080025af035c15cf990648343c7ab004412d5a4b130499aa6c9754956f46d98ca8c451f65dff6f31c77720cea77d4a6aa6868c98517a2514bf1e81cf59b4b3072be938cc448cb2847ca3091a94f8db0aa4ffa1841f24daba6bfe9df435d5a089f71ce738a209d6dad7fa45f84a333c0b8fc6f285e85e3322fb9d430573dec9d93ac1a27b1ff6fa7eeab266f52b4f06683aa64b09371a10f580389f9f53255bcf3e80603dd949df75d1f1d4008ef31aaa08aa6d4c6901360eec88f49da43a07ce924a4a9377666d8e2de94b73b1a71aabcfd98d083744cd101f70160539528252179d40d153d02e025db45a657c2ded69c0cfd3ec5199e090532ff042858b068f3e83542c9676cea5187be455fb2d3fefc43edce8aa75e0cb89df00bdf341d01714214c2d7563a1a9560ba320e0edfe41061c3947267a22f10665d6aecc04a09fddb024f300e91dea94d7a044798dde6b8c02ee97c8c85cfa233c9958cb373cc466c88a4524c25bd0ec08bc7adb8cd68d2a94f46aa6492c14ef22817dbaa6edea496a6177c52a9ac2921e2b9c37eaa104290fb7da20e7919661d15e32b287002dc8df3e1931a5bd24a366f4d896353e9d5f0c98e63870708d2ca810fcd08046540298ee7b38fec8e85e76723e776271d9b15d6c9d031f10d15d7c0c3e8a4794e7a451ee02ae2466af39aad68d02f540441f51fb1789b89eae5f6cdef8e358444759a4f146299466785ba0a262d96576d6d930824398daaa2015f9a1d83d1bb2d98d975e083d6639e377922fa9ac3c236b14b5317c5953a897147489937b73c1476754d0f1889876ff1c6e28651f6f19447b40aef7a94d715243325998ac7854c9ec28942a51b957addb8c0dc8aa06719e882c91ff89b4bf4653d8ed0c8b7ad481c1022eb985f7398eebf7b1977eed0557271fe6fb276fb499e584b21c6c00b0ecfc3fd4b5638620852c35bde49707f39e555fae4d52fe54a8539229977bbfd959f434f14c1a6030c7a7b52b11886a20c0b9625df9599306a0602868de5cc8427a070ea4911db6357cf21fcb26a69bb2f15a5a5d21b0ef17a755dc98258b5566fcc1c43e2011c91cef13dbc17da439953cf0588a50c83b36954a2c78ff12b5c138e4b7c8907475784ed17005b3c45bf86f77c9b594098bf93b9db8d83c7fc156ee24167bb97b7dfefc8098e1ee233ecd2506512169d8f1573fd9bc1f1b133f280fbeb345c1bc7b0972c7fd777bd9874cd706e3097103ea2d7e926fc6c2ab3bc19c16134b029e7517aadf2039abe194700154c318021d41b90af49edb15e340ae941b6161bcad37492751006f0f0fb37859e36def7e8bf322b305167fce4dc100ed19e694974d01e7813596b4fe7b2e6811f3dfa2815a26ee19ea1468edeeaacca02bf4a1f65b88da886f95796b365f862ceb8a3bd616e9895e976c60783a72accc89ac7b19c50831f2753d810a20a7dde3644d36453f88c555cc9cc488413a3ddb550dc90f26e79c9b938d63c93c74bd1a0a2b042e1400545244a905aae1f79fc1ab99657beb68f45abf9a0c95e9e839e33e2088f1cf8e507d6b392b88118ff84b0f96de229627b15e6d4d3a70b5c0a712c75a9d2c927cb4be15fc4deea4f2f1798643f7530f30721efc5602dad66524e6d9548dc287eee135fa361a15224037ebf2bb2616373279db9ec04a8477f00eb755cc9bb719021a42f5df534182aafb5b7c12152d16c02cb1e70f505a50f688bf05547bdb2c7c081b539c4eb2f7c773311e2325eb5d5f9635539f21d74fa6f9ee2b49d543bc0f36f9a48875e012805716aa0ce6d31f1be3a9777323ac44a98dcec04bc596589e95cee2b9c50be16864a7d1a8a00ee756e7bab9878cb7c6a5b2751bf45e2556dcfa8edbfe501adedadc2f0976cea89ddf98d1a847e84ad8129d8ef36422d6b3719c083687bbc6d3640476554f9ea8e79990f364ac97c1f939c36aef848bdf0408964c84bbc01e0092a59756fe72efddb88c33b03f4c67a9e66027301f8652e7b46ba72bc0ad511d268df6212c61ec521befb18d188fae8946f3e18de6f374d1d77c2923d3e4ce240c0b35bd75b61e0b49402d90bf3cb7a7eac0fc755b26ec3fd194bfcaf259b4e73575424c717068938ca7223acb02259caf4c739de069b78ef05ddb5c02178dd693a5774441c1309fd1747e11efe545808fe53ef9de78fa0695e8abbceebb5f921d78c336eb9056184399dc482abd88f10518cbaeb50398ebc52ae6a22cf70c219d4ee70208f7f24a1f2b5920bdb5439dbb397aee562f9c8e74791d6b4711fede8f8dc3858bc5ebd6dbe4f05f8eccca0ea4de39eade1677b93213ac031e612388f91eb41452fc55517ea4718db457d6b99564275a264207f266972bc2d9d642f276eefc57da54a8bf01ecfabfe87d397ba96944414e367466ef897d1ea1729652376f465612b7bd56bc610e33c3bae8095c503be486e5d889b3d3639686c9ba28c4142ac366c3a727fc4f30fbc35c501281c03324e039beabdb3fa93b3a87ed28a9d8cee2534b51a47c23187e5409fbf59425b7afc58d651445fed9ae92e79bbf1eb895948fd6f025eaf0709020378869df2ea5bbe533e36f50248c88183c4108d334d656841f4bdf63eb295b60b3f26a264d3836a5f00892572938735d6c9551ced2aa553d93c5e4cfef566aee1b274a663a1aa6f07b20ddee69a1770e6f0b89399bcdd613d64834e0faa0874f64eabd207188272d0176d595a5ce3d5fd59f277e9d8494663ef3e6daae46422454103f5aaf883949a4b2aba1809244a23df779d0679ed963569bf692d1ac46d60802244a782d4d71f706c8fb03a451a0dfcc5db6907e70775d224182cd7ee7b57094361794ea48b88425a0c51a479c8703b1ce85303ab73dc496b3a0315f7a26ce2ebeb78ef97118460d6212158574198817dc2764c46af5b426c7672e286aea3b41383134ce6d8d2fa43dae28f568135eb6e2a5cf2afb4986e2b96c1abc201a220b39011a9b4daca321575aeb142daf0c34232814e27af8484f2d1ff1652ad3c3b12e6e17e6d50afb48acfbda30c27a2b2610165d227b413fc91485cfc93437b1a600dcc52c74fb047476fad6dca4b8e85fedf9d75367525fb61d407765cbe4555ec5050599949f7d6dd376a2fc00ee86909aa2338b31d1d588fbc3cfa0f3ad6956082b79c549169d1bbf06665c2e43da31a3bf2716627d7e914168626e0af37d6c5ad4099278998afaa76830d9f7e0cdc6eddceb17dc696da2b4ebdc7b85b2758426d05f08faafe26628f56f196f83de69a434bd35e9aa69813e1292f27910087f046e6a50653736b8aea176d54e119dab30475d535e746c2aed41f7c70ad3438004ccdfb473ec8a2b1e15ffaf2d2531c1648a915feb8b25e2a766289e20130586ac3eb3b73045d79db2a6a59e031cd3022ccaa230e8a3771884ef62340d2b814ea279a23668e48a16b11e68e2c36a51ba5c06de7030abf81ae46b8667fcbebe8e3b24ac9f04aa0222afb72d900db38c4185b2149be05e7397c9299bc254951a796ef292354f6815fc7a2e3ca9344dfa70ce3d1b07067366ee053a4c9f69d7c393dc2f5d6444928b8aeea5c0c325c4255e4db24b0694778555326a66d6203d3ddff1e7d8256ecba22737c34b43e60d296a5e0c0110303735ca99175c006e98df4c527b1176f61d893c5cae4f21b3213aa0e3a320fea6ad12d47e39c345c52f55850f80dcd7e3bfe5ab0e92a54500eb1c6480a28b591ddc691767a4d6bfe7581fff603f50e9b1bc4e0c0bcd0a6fda7ea9702c0bacb64cb1beb75653f368abcf1165d8004708b88cd3b298469dab6de74f26b848f02160f4488a25771b9da056d14c4c98e20610a0728def3e6361b2cf8f291c92499c41a170185827762ab7495d3df35804f0ee26a1cd8e83c3e682d77f51aeb4aba76a6d567226d3cdf144ed820569a5d2dba1edc862ce260bab9b5e49e695fd8fe3893c4cd19afc0e17106e656298d139d4a0f6c44435b9e9ee4723aa2f190d72b98f24580af25accc13eb9fef5c2f068c96999668e5e8af20cbd2774539e575719f440b6d0a73cbd6d4e8d988d217751961551f26777a61e5266ef0c8479f9414647fd54c8d8e43acb746753b8d64b2d15d911a1c19f1c4a66a34bec7ee24bbab25faf5568e4aac22f0c3ba2ad2d05f543e4f01fdeb799b544bb9d225bab5a50edb6518fad78d67796ed32ce835f8ee97851260dad648a83c405aad0a792f3129dc7ee0d9d718d9f30da1670b658630da716f580f554c63db18dd6aada4a89178e7ed68d9636ac24865651fbfc38e4a7b22ad18050113e4f73adf57b0e918df7cd100702777f0c152699fc307187ffc3d550308af3e0438948688ba011ed3650d8c84a138bab9123e76ecfa7055597af143cce0f4b8dcf9f0c82d28bc4f4df42d39c6c9b51144d25b8363d4d4cc7927fc2fcd0f3640e8ca99197a441c82c4ff3db9f8d270e06309400579ee08cc5828a15ea260e2b6a95a388b9cedd7ce03f0d63a0157b2b480c0f91cec0752bc21debcb79abae6d508ceef94b4a0b508b753b9985f10d6e5f17d923c3d2f35eda9b01e0b71c14be3d0ccd4d2c488d5bad7cafeb3dd288f6f3bf566d2f339637c629ef4c50aff2182fa0e9e45ffaba5325fd9f9050e74b14056891bc12576cf5523e1de35c1bf3603009ce40cd8efac5692bc3236420e8e7d481b92bc49bdbae619bb52c695033a94f096cbcc1db4ba73b77d9524c59a5d5b5a0a0604b911947a42826625e9bc34fbfec96d445d5bf32ac0f229a70f4fec7234a3bdde001b3b492a3a56e49ed27e830ba86008200fc179035e2109e4f2142d3b625e0f7bd07985255a7042d1ed7f5b24a571ab6c0baf9b99ee345962f7042a03e1bd573fec9218b9c69c2517bc1769b888a578587493c965df32bedb603f586dd8155eb0082495f1e6866c6acc53d49bc82d198a8082402da611608bd2336101bdbb81a5c0c5408dfe9130202381dc61c089edaceef43786984c54f62d0e4dba05535e86c17aaca5772a7da8162e193d1c777cbd7063cecfd3483e78e3c0533f83c909b26a8fe3edd4f1b41ae001b2e32d1f6b427ebc7ef334f4f7ba14eb3cb39835e2b8395c5294e0efc75c8c2b90a571859ba5f511dfbc1361cf7f321e528f63fd5c1ca0afa5a1003eda786ce7623fff6da09bd7b9af2eb4d1b390482fd3f402b2adbeb063550d6c53c2e983b0f5264a69fb04ec5c443277e1911ff752e4e8f25849f27df139385af89d109974e09d8c829d39d1c97338db6eb1e24b0ab0720af7b5a68baee0ddb6076d49762e934e9e1634c5a8020381267eb61f91ead8a986f2b32b214dfd0173b6eae3f91274a63d838f51b897277ba05838b8d5d41c0f5afd07f403c160116e879aaef0c5fd3ad7bbc164fdfdfc52c89ca661841f01434ddfb6b0cd683eca2d123dc062f3e00f3f8e3c8f0c18abd16f133e7204f2db3b80c51b0ab59cc7be0a66c1c744de604fb64ce3fd67f43c9cdbe47b0f0429aa93b72d8a0b0928f7cbddacf00a728d651d9379d49d800b73c7a747128858a19a7d6e8dedef61fff7d492358fe317ba4ee5fcedc7e623dedd3e21ddc685ec8b036e76d665792f5c439c6fdc32af1708a81cce87ce793c41734a0c75e9c84543ba5a6a3266f68db39c3dd28ba4dc52abecd492a59165536b0471901799fdcb7ecfab4511d7ed5ecebf651260e34773d9db2af9b51fd85c9e68f2a625ff36c31a3b257dfaefc221975e4cebe14772331a7f56228f3fbabc660c5c302185684340a19d8dd5604fda5a12c477c082aa30248615521b0ea560c476218ffa691cbe78c7d407ce80588a7e68d662e7e1fc2a37202eebaa824ca8ba4ef38fa4a542ca4189fb2135fd7318b28193468e9b8b7760b8f108b03d254ca14300c97c9231f7aaffeb49b3e7bdb91d1c8f201317243d5223f9211d6f42a63c281a801ccbd62abca0120348443834d3874ac94539b028dffa2292b9dfa7e81b511ff634b77572f8d0ec79e26322925565998001cf2105ef93f4e9d45d4116872baa3700d6d3930c60b95c126b941d7cdb6bbe9e50dca7c23fe8b90c4d66dede7a73ddc30973c8cc3ee9625303cadf04130b83472cf8d11c7b0851040e686faad1ad6e0c9111e56f4405a7ac9f5d455fbf6b88fcb46beb8ad43418dc7ad880c94e4cbba8e2c16555bc71812152240bedff0d4e73ac1c9043c575f5b9ce531b57f78ab2a94133784d1b565622191ae36b85709ef4bf1f7f75b558f320aea391a9ba78cf719232c9018187485c902889dc78a25a0e162dd8b3749e8aecf24e475d365e0686738fe5dbd5a99b925ee3926b10c9eb35aadcc2dc303ced0160b1394a72fcaccb791f982ca1d62df8b96efd9aee74129c615593c1857b17bfdb1e25846eb39f2360f12c84abb6aff1f90ea1218f23ac42793028f9f7249f8ad3b1138fd5efcb10de72aae9b2b30c2f415a40038ad968bcc666fec0baadb72079f41bbf696e1627e1e77e88f3139f6bbd3c92774b8d24aafba2b922431c67bd68b730149d4e961115ac0dc61f84a0e07051bdec2128d0fedf7c3b05f96c9859d6de13b54df228fd1d6c124768dd7a0170c25d271a485ae49c732eb4c067c6aedced32f71d780d3989eed0eeedf77e53fe2e0813ccb933ec4ed07dccfa1e8e54d9fdfb5efd986946c49e21f0a300e3cd3033dc0b2e20f9a3b7761902a719c17b61d733c651a0541eadd8f8b5c1821a7a6b9b136ef0276e222e1cc06d8bd490395698b454b468bc9c3a28abfcb9a1a4c21e217df9d6fb4f745376ab436ddb9116afceae7ed4d6f234cf352d864db59f5dc9b1c895271ad029e54370303b6fc8fed8d2f4aaaec71c813696929fe727191d673d65a2f93f1ed35ba3dcea18aa42bc924b42c7d8a1b3495ecdeb9a9837fb12ef93248db7e9ce81eae79e73ad2637ae055425fe150e568f17eb0c2f7f8470b7ad82d9fc8f08be67494b593a32a927529f43349fe8c236bbccea634099e9cfba1e0047fcb7edd1d73b4400919adf4f714b3cc6226b96fc4d9e9a12f72f3a9fd5493e65c002bbd8a98db5cf6ca2fa540877d41b9a5c70102699e318deceef2340723eb7c02fd136bdc907afb353e1b7560831970e0880134c25c1b56da0e21e68200827c721b93c3f2c9df2e4ed2281d953f533bc1465a7182acf649986b51fe085ae0cccc1fedd9a0542195791834a5d6f8fde677ef0352a886595aa0b03289012e672e909eccb92166ebae5ac816ddcb7ec6cc87690673c026262e7c271b393cd3693bb41d3cb19a02f2ea6adcd279d9254c6026ebb4f621256ca1873e39e5c01838de6ff3c0d59f2e862d65b2bb927a43f1a8e96ec0ff3aecf64083352407305fd1d74fc75f7dc81c395080dec92229ad40bcc69fc939edda13cff6d95d3cb34d30399daf1ec253c92a9f793b8f8bd6fbef4c60d60b4ffaa552c5637dc9c87d04b1ec13255e04ddb51d5c6f01a811f495fc18a501947480ca02cb478fb710ddeead2ce9468f6620b72d3a8bed945b0bc25f75be9437dc8623f941ef84e81dd996110822296350cf0614e27cc4a1f6e6435ccf4ed428409af4b8b917f9d420651c46e439278ced740b3771c4b9dad24a467621001d975e79fb737a622d9ce81f329df718758fab6a8860f8cc851ac33c93bc7e62fd4277d15a75fe9657356da4c105ce5a68f2bddc27d9fbd634ea01dd5c288c1a3d4fd00a707374b564e3496a99a6c7e433449cde90d4f3b2f842a8ce187f04602be13125e6f43fd91b763a36c6bf97cc0f22828f7b8dcc4b87413930305034ccce5369a4976d74ebca96a21a7a06c58e0759ed4e752d6701d0811824865e7d78d0dac78c11f86025e7390708a3892c95e8b5220147a019d311290be91604d46c3c73a36fc99801634b5293ed920f7d0d0be9a8632fbf2b5a9c9bc18231e4455e71e9d38758c88845fe0d94695bc7ba0fef20c97163d45894c57a49f20d8f6bbdd98c36e64d9add25aa37fd09bf1abc14e8a314d98653527edece97fec18ffa1448e32dae69361ad730d3e41cda67afbc50bede7d0ec83c7e3030028dd6bb36b8104f1c6253820f3905af0211e56b91e500d0bc0fbf66319e4d59c989ff8179c13a24ee3f1dcabd9a346f3666b232b61100210aaeb963bc963dcc8960b863b160621a8fad26eedbec498a022eca70461eae6a679cc82a5ea9511bc804c7bbdf7926626fb52f1d55c474cb0c1c4548be49dcaf3707dedb0c4ba9f56e8ae77199933be60593af69c72c9e309f26c99a6b8a901320d8f6f9ae9eb14e474e224288157e694a4fc099064b556628b74935f2346ddb8d9ad30ea1bf29d782ae8eccebd69d443a6d316997cfbdb6b96a6d54cbf2f6af2e70392236dc7585355384b813fd3c7f57a693153639eafb8962bb3ac108337a7615ad4731204b1ad6067dd4e5299ce126b74f7451e74b097124f2d374ed57f31cf6d9314a6ffe65c31e29425bfa2d65af3b1a038bfc220b700b2aabd72f8a189a5117afafefff91bb73786c03d5ab1b019c565b3911188e2948a5cbb2addf39b16fbd2e81644dd963ea99bb7e08863dac083b31e8b5693c60716f7e201a2349e3e43cf35258e5e9c38b33b9023ac9914587c78fd5c557e181a42e3912d41162f8e62961ad1785a0c62d559dd923d3cae50ee2527389b6ee1936c87ccb0c0e437ab1adef8e7b3befbdabe70ae0a370c4aab429f9e9a8d3935af2bad4633e7f9238fa0f9be6839a86ddae9a18091a3fc935e852c791ee16709ced50a244f25a5ac7754a5e19c29148bc0693a1d9166b262bc01edf7bd9080fd6e40ae1b0d78f18fc6bd8247f933ba3d8915b3fea59265eb4563f5ce8ffa8a6292ee79b382a4d20735c34dae62b27b110b6da3c6a206f3aff35bbc1cf413e045639665d466860cd0cb3b5b80e70e96329694e489bc302dbbcd4a1025bcb0a2f42a06e7e95592338688cc0bd2ca0fe0c4ac990a851a7959aa02223396ae78d0b79c772dab365b4ad708a793568d24650804527407778aa50e5245caf10a23d35a90e7a19863a732dcfb86fa45e3da7ea3b56deb68abba206c7a26a35123be2572291ef72c4c2fb917381eef1a1529abecfc5f3b81cabe2af08e299e06c68fd8c5d765886796c19d910b1e99933a9b847f4881159526622d66c73ba37cc68e7a472d253a985bf6c339c8bb5d90fb884ed47279b48676f46743e0ff78014e68bcea01686d41b44bd21d4f0fc3ea06003adc7b30fc8277a596bca81b85ddba7f0c3c911522b44b931ebb690a7bc4749eb37585582e7758a8116e1a76a21ed15f07cf38081f45a9be8240530a26dd80775f7435f6bedc5620a84587b3458c78ad16cc82f3fbc8dfaaad8c9fcba791d1c1658b4f95380a242dfc2882ff5c21c76a97a16a9044261a1b315ccf2032552bab0623b5a1e7e2af50d85d05d18a6524fab3751775dc72e8bc45b1d506deea76502ef4c8cec418d2f2d110f4213a90558d7510cf5a14e9faa045e91198ac6c25a5baabfc9e777913fc01d2a079dac842eaee484ad0b5b340060103dafb0d33acae8c450636a84110af2ba8c23f4ed4f30d414154dc5cdc00064cffd70e9ec1de31b5720394ef2795941e0a1c5c2859facce56c221d88deb4bd2b7f1725df16badf77732c361524c7cf88c5a5074d1dee644dcb12b19c3b1b263f0fa41376698b44f8cefa945749e338aabace70d9e2ae96ee6adbd778ee18d75bd42b827510e82418ea3ee34e79bf12d11100ddcfbd7269c27a3ad4f549e649bb3b1e1001aa8e772ebfda3793ffe675504054c877aeaeefbf02515a1dfe2e24e4378f0185a391adf1f933690b39a66d5ad8af6612d9eae11a5eaa14fdff61f38258a4167e4039c3c625c453b42d509dcb9a4f10040e3037fca4c76cb80fc34c8e31e718dfd40f7458e340a0ab928390e37de917113da9f0d26c899c535652320dc2f7f3eaf9d486ff85b5213a1a0756673c4879ed45af9227682f9d1047b0b7e95fc03b65eba99d2fdf606e74d60f8ae2f67dcb53c6ecf07c5bef8181fd8b2aa3b88743152ab0b5df28d45f8081d21b103dcfda1b4d57badca68917ad7ed5a215e1b779d9d7ad186868b08029aa0347436bddbe7648115db818d04c5817de7ebd2bf47e902a2fa1fddc25f283b486b259fa6137cd31963ece7e01ae1321f556dc1c32cb2ae950dfc50e438d85d854f835cb92d6191769d8cd936f515d5bf7f94663cfb385e387286590bb8a7835e6ce6511be92022290217220a6dc6851d3931197fabd36762ac89143120b9d4ec4b4162749872b7f435871efa044abc4caf6572a9fd4c536066b3bab94b620bddc5b152738ea0934d7723c84769c34b35236e43172ee42b744b9fabe4b41ac3f29d7d17489a7ee5dea04a96598016ec12ef382feeb9de7951b272cd5d0ef2368172940f289403b907fc0f6a390b6098f3dc88539433dedda11753b3ae6b1102f3faf05bcdf9d7275be38ea116d690bb3ccd9b6a35276c9c7f68415dc8f9088347967311f39a6b4d1e352084c1780ed625ad8f333f0f6e04fe1c246b7f47ec188e29107ddc5564a2ce95db7330a77b0139bdffbce658737fa0220a4c0c1e7f8f6d4e6913cde3774b97820eb4fe110a7ad7279462a1780f47df96f04989e9f4b59ed132ee8fb50298dd33931fe9d6f71eb4e77debab0eb22ea751955178b1044a6f81f5eaefdfed64b64f31dd53811aae57fe183d831bafadda3f20fd3da15317414c0e983e18b6586d6c72fbc39a99589cfa2e826c446959cb8dadb79f2078690aaf021ed1c0a5f5016394e061cb3a3132cf937cee27d04bc3a102c74b7c17b5d473843c8205944fa37183a67d8ae1de1df916f453c2a48680e6f7a7511ee0aa3cc0be432d08bbca3c2e06ce085f24f034f602db2ae23540b1656171a55662bdf373c6ab341d77a9e448852f19b01927a40ba5cdc8ac862a7b3280e09fb3098140d7478dfc1701576c1e19b36925be166b5c9707c2321132f7a346497ceab8337d99cbc76ea7754dd51ac724d7979675de4fc7c6751497e5b15ff9e3da4fca27961f2d1377c2bb2dd7eb186de6916f9b234872597e36b2b42b34f7d840e076c48d221c9388241c205b8377913a605cbab8a892c14286177758c3b1fa94d8e54bf89dc3c416da9bdc01eaf3221fb25785ea2c77ed67cebd3a21fd2055a3de669d810ef0c71bdd6bca9be1672d02ca27215f8e7e02599b5a2be3693b999cb998b865004f1693c1ff7db057184cf53d686e8d7b311cc62fe781ef443df2959a7edcf6eda1b400729d7dfaa743442f48dbf540de342f22891fcf0967c80105f5c5bb196efecae7fb779ce8ae45698aa764021872ce7424742da0ea00279748e7be65c9b2755a516ca76c1dac3b19041050be08abf5e047b1f170be253b351f33c9319257bd774bbc8f40eff451d43e2bc57bd8eb2aaa4a299d1ba725e5a12dc637311680b30b66cd88f4e97625cc00298baaa40c8fd7b1318c7938b8ea887bd2ec698c46d89b3776d941490ae34bb3df7d5f5c31f51e41e195b5faf6a8b3f47630623c7a1606d89e57ac83940e05e57c56bc42f0e819887441e4ea271b76eaf7835404ae756c656d3f34bcfa1b20c9c5a9f86ec8e2fd53c293d2f95700b98f8773b8d6968fc6818213d64fe443ebb4e73d474de8249135c066a08bc529787d9ea8ab38bae2afce45988a4c4d3e25a1d819551e44fa0a07177da7f91a3ca32fe4be2cc26c5c1378423ce9f4e8cc2cae47f0a974fc51eb62c7c3640f796d0e85a79d07a320b445ab937fc73e543fd19d1dc8c3b714f19a27de73958e510a8844e757c91d0472f918612c3056185b1b548d0462a379b4d2f838067eab11cb3694ead40f05f0ba38756b72d5187d51295db42e16c6579d5dbc5a2b5d8e9c441c8069c30f44a63b3afaa837b1992bad2367cb22db06c2a1c61f503961d495fdf5794599395860cd77e4f12fdf9fa06164c3e682251aa87be80fa4c1120e7cf2bed4d1a17cd3adade6f5bc8ddc246f6624e746919a0c1df0224064410b409392c247ac5cc5dba26392f2eb5d41d7528867ef38d45cbded482ea9351dfb639f7f897025affaa956ac2424a8e0b79a125a69178725a86187fa2205795b76e36e9ae74e39aaeb0ab20816d84e716e05336f8142790f49ff2db050537fcebb2135261ac617e755e18dc65bdf6dcf80e2784a5076659955f28238ed57cea0aef2b40c341f3dbc6aa3219f690ed0daddaf3baa095ed0e56f6a5b0c79167575861e3b8d0d861acdffd9c14446bf9914ff1f881cdcc71d44c5ece669f45e708e4ee268e08b8b4eb6e5a2ee79434f75775f991205c923d197eece253ea53c1fab286ece9a5ca26dd8b52eb28ba39ecf78ffb7f97ebb095e37d1bcaf563b83c7906c6855d82fa45a83c6444f49179224456cc958c44fb288a4a136ca95954c2a6f29687b7a134b2f04dbbd3fd388945b89b050aa05887e56c0330fcf2248702893427a5c03d1b9b457930683db1811345b4d83fada9e6d8e5cd6f0e2d0481077195d9f8dd716f26b8395a23c318dfac112dacde9b842a7c94c12d3fb35d40e6493184cc7f0c45d26d7e8a6a2b1b044fa26324c7f13c9f51359c788372cb391aacf98e95f4bec472e99013c3cf84d694f5f2854cb1853451cb44b3382b7858557393b529698ef5fffde892070687fe65dec8eea592d7129f5d664cc8c899d18be7e6e5aacffba3b8f940a26636a08bba839044a75948d5965e42a9d139e3f3f7c720744d1f737d225f435b226f54cee658a5c6238ee492cc8f529c874a9d92f8f581a48dc84f901c6f0ba3e37c045085bb3b054717506237ef35ebf9653d5e477115414d7609c06265537d84ab68096c98312f85327fd5feddaffca1e79389d6fd50a4858dc7d08389914a16f83d6a96bafa757fc3eb62612945984f7ec2e5dac71c2f9ad7f3b8d42b0d94f7a58ff57804b7431c1ae1e629fb86f5e2774ef6cb539ac2fd8b6e4018951c2abc43d9a37e8306e7856813421afee741bf7f52ad5c71ebf665312e736847d3a143c8f8be951d58ad3bf4c101603b9a452681a5ae64a9f6011b3e684dfaa4133fbbf7bd08c766d591c13210e16d5de81f0fbd0cab254803b120c551513cafc2365d0a10646666a63e20a9dfb9d37cdfeb3c87944923e83cd442f0664d0eda5f16c8c23f0c0e4a3fde868127c4706949fb0e1aa76a0498969f2b3224676d9d7e3be00cc2da7d5c16ca428e44657666037cd0ccc2b3a53d7e75cd251e14810a3451cc61f422cb9b63fc181887f33d7967d48c9026685996b02390ec930ef6d684edcef72b185385d8b9dbad829e5d2ee582ea62822e88f976730b1b60bf64e3e75684a5ebc6ac28a42ccca98a89cfe3169e4e8c5798dc34fe15d15914f4f49a25fbde92dc39837293e93cd604729eb800aa2834a42e3cfe38bd3bf14d8cc747932ed0723da52a729a96e44520c83653fc7f45bff141e6310fb144bfb9da743a12a9d33a377db1b626c8a29437143570af037e169e0b5529d589b21b5acfaea920888ceae6efd76a8e64bd2482f283759db22f31bc1e4bff9fb5208b09e485bdb08fadb3899855ebcb5c8a1ccfa9509ad203a182ae5284c88b61c79f4f6f3c869d9551f3aafc438d2944a8b94e90ef16efd5c04c2aac55d8d144ccd23fec3c4f639908a99c81039d15dd164693fbf4ee0f3376f9bff4374f11e2c3821c065e405bcb3fc43f1417c960a8f094589f572be9ecf3a3d44ed8c49be7891ef66e9fa43655c500d083435cf2b6a4c3242a2dd7ba6fce9509b5197d7bbe0ef8d7644e143cd3dba34da4ce93bab7eba48b8dd0e31bfe9667e9ac2f974818913dd5ccccedbad9b77a60eecbc6ed7992d6e8b60e7a69895198ac7d92599258da0d75fbf41a5c3d1cc54fdfecf56a7be2ec8ea08991cb4554eaf29f03cee047629a733bc77614acb5342006faa2adca32807a95927ab2550ec707ca6c42527c7096069477644578b9a1725b0b88328326af55af8776861027c5a3e5e6bfff073106e764aa368d1a8115e6737d8bccb0bf9f3f62ff3ab56b97d6bebbfdcb33164fafb4b8fedecceca4abac4fcf3e52001344fd76cb416461b10273035a6356ef5bcdf5447857fab2f87bf8dfcb0de7899459594c24a41f19ee681c76f2bfa6879a0d537862457432996364fba2a6a378e6658e8660931fd0f902803dfaa3c49b22a14ebc4e7dc5b9e03f290b9bf4d9350f006ac33e8f6a20c0dd8b23d52ed705ad9827d5db688698796897003eecc89803fc31227f419148ab6c23c0463be049eac1d79123bb290711f97cfa53f148e75666570e44faf4a4f743b3ef46601669d814fe9866c58f5ff964e663047653dbaaf103b30c44157784321f98e744662ed3c4ddfc2a5212c658c8b8c3aac15e98df0067875e0eaa0f50cc5279b83efa817c5bbc5b24e16e5efe3adf4db47b31762aba36f41ab3ff608cc438ea6d1292b16cd2af4a614d8b678e5dfe43151df365f02a957c7e2f2bfca048fc57d56ff66dc6e2ebad2b25747f39a9fb4dc99b297dd79489e5dcd4e20a68a9d49b4487242ce952189ce4a4bede67ea57582dabc77ed8a91a3fc99e84cdc967ec921b2d4074339dbfa164de74bea7a82b84c0ff148d00530fac3502ffaff2e49156114ce480867e0328bf19b582d368f4e67e410a37e44a4bb7453b84278db21cb521dc1e9df1ddd7ef03fd9b0efb306c485326949212d5f17f66d6b0e01aed011976b835bfbf76d2a6ea81b240842660e598bf17797046c07d176f09f2a98a1441863991585a58431102cc3dc61b76c941ed6203bf3109200b57f0099d71189717f1168b71b37f1db481577a07602534611fc08eefb0b1887f3957c78bf0fc7efbb220fd34b38da5368401837db0718f6f2a48b1aac6593cc02136c4fef49822281e5dc481d9a2df82af48325b4d0f9808803badfb2566ddefc7c442c46d215b0c65f8e46866d5483294aa98f3b0976a41ab2b1b2f1c207781ef71c86f6fa0a144673cd71f66db31d6527b3433dcf6b8af69e88c6ffebab3e4b42afc3098df97600129f81cb5bc21ac3c448a69dd03831ed081aa8a7f3ac088a4d48d4da4ec824b882b38edb26c46e8bc72676d0b9ebd5d58bc6a2672e68d484560ab398da07cf74b5caaeefe869e2e8e9922360f4e56f063d7953f2450d3f079a2297c6c4610600a89e0342b0eaa86c336cc66ab5861eded78367b02b589e8594d485be1256fb6ada0542061a5a4489c1d9931f5cb9223dfa23e539dba65b95d27cf52901c1a386d33fdadfbc47931820da124620819f0971c383deec14d27151ed32881ae3d76ab59d566663f179d6313535b910dce5ac94458a20f886bc776fc544af9de5d6f3e1f839a71692d8e2a892e8e361978191b5f36136c6cf33a96ca71a443415e83fafa9a3a3f89767410fb7a9490cef95aa98da8c8c5459582d7b6df044f94c7b312cf042cfeecaa15a5f2922feba125aed03abf63fa7fb05cd5fc0ef7fcf4b40f1f400b0931cae1b7b2cc3de2c0aeaaed25a6fa7a16beb5b77a2b1441708ee2969172815cd2da686525bedbb9215b2d8d74aa8b7bb6aea75be4e3b0c05598537c907b42e4b71ae25746a8bba01574e60fc87a205c6cb236f5744c7bd9423c92b03a59a0c54c3a6a8d94ad78eded4660147991794b1265eaa9d1720f3e40a190e4f4d0aad2048843a5ec8af60a4a0ad5342b56baa9f666d660e826dbc68da0b70a902597b5bf6ee0d42821be35fa5e58e78ae1ac7667c0ed9cc621e0069bc84f64e9f03fba6f115dba973021f31c68462fbef253510e196651d4fe2c080c0c892431aaf6a16b5c4901c0c600bd04c0b5be189959d5de82108ecb2148620b24e2dcedb5df7b30d03f207d86f5306a86ab8c24d5e3e40e325b945813b8d0a3f4341fb214b2cfae4c9f83ab99679307a15ea3cfb3e885e129b60dc747bddd66dfb0c18751ea85cdb969d69af0adcc0f7921e6f7c66c592681eeb87e023d07164cf88392c69c4bdb2e812ac307bfebc95af758232f5126c1dba36c00fb423997e174bb501a0c8f688ee9aff113ce23c08a56d1c52ab67ad0f3ed82437fc3863b445dda7b7027653e2f3dcc3ffb424ef90d314eb4f569accf7512df6f43bacb65055cb6dcc2336158453073b861712979de662215dcf5a746aabca9c616016cdf70ae42d3f02faf01efb1910aa9dd888b67eddf2f39cd804ab111921b0c364b9fdbeb54b64e7e38fc9c96cce10d38e2dbdba55177489620d4e19dfb25e10e0dd0cac50f4c97a2a0c4b53e465b9aacd837a3a1d4ecfc0a2d8abc18821f729ad701cfcbc972cbe3f7835d24ea84463359c7d748ad745473bde225e39655f3d4dffb60d60677be32a59d05212d1cd7b521e4a7905f832db6e4d2a751718ba5a64e890abc1daec2e3026d360acfb523bfec2d67d1f7be993328a347fcdf8d63ad8df6e30bf2d235756cdefc182a7ad8c84d55bc7682ba0cf7ca961afed6633122b6d5cd13fdd6015152e2d072c381b318fba71d2d15a6e42e6f70130c2ea8a93d06c3288ea2fcdd77c9e11ffa577558b14657fcf655e5838ba71e87c16adf7831d8c6d5833a9c8c773659d52e70f3b854ee178ce150f6c5c634a8dc5b1fda2825cd254e852975196384015d7d81208520ccced331d4bed96ba6900818dcd05e6841470a8608778c037df9c5e0a721e0f88d66751417392d41de8ab9d4e32b9d00a7e4e03d5cde43d6468a11166895e854746193bcfebd0c85c96e6f62ae7d6df410f9d4f2e0069cbb0f2139bbc920f8d7574db34c49d39fd797656fa2fcae914d61c8d7e507ba743fb0b74b1432d58d68f507d50fe77e5bff63e23a7d25c6eddf0cd8ac07cddc6b7b733aac607df46183bda6117ace8f1c2e0d9f850cc45e359ba9b439a6b89363aed5fb2e8e08f6ae88da76e5973670d7f20e6d9d08ace694609d9fc232927838da277161db20bfbbc28634a7bf0ec13ab9736c20de666f6263e283a6dd0213b29add838c1998191dbff49ebdd4075bb5a77511907601e11997800b43e2827e346f1d26eb940067136d2ad753944835096d5f2f4caef2c26ed8f2e9eb470abfae8852aeb78a5125f7ae6736a05229a827df2872b023b6c66697a503e6b6666100edc9a782c97020ccfcd95254869c54047cdb236fc2cda37d8185bd2379dd1e681fc4d049294950b0c9aa0ac67d20fa6b0a1cae5640d193644ae16c7a7d9ada8fe2b63f846e9705d642b37cdd5430af6aca65be00d94efc203a69c3ec0fd7c2d90c9736697b39a85caf78f8bb13b4ca968efa2f875fac72676acdee6b772054e6b07040218f400358ff4f2e0b729ee89f19f114ef8b62d4114891f20a5b6d448ab3212eb94e7f281fc183cca1d960ce015bfd13fcd6056c9b69a76735adab736a79a90481fb3a4b0ef4661a62d2b47ae4ccf3b2f4737951e34514f59eb48428fd1cce0b243d9ae8bb344e5e4c1d846feb8005e12f5e9e7a8b781ea4f93274cbd53c65c6eb3068d4c9dd96204f751303d9a3e7dd6948a68c974fddb41f9f970c3d7f0d175ea8320142e0d06e1ae1633a8bb928e92ff04dc5a9764883c09fc8df0313cff549c002bf3bafe1253bf1301c9b459bb89791427c293c9ae76decf46a4dc6a1ad3f17cd782ddc95c1de6a54e020d8be5fd0f71d58e385bdda677b3832378b34c6de1cb300d2f72ce2bdc74532c94e81cd2eeda93ab23f6f7a92f6fee7cc02d31a12c89a64510dfe421222d4e41824028fdd7bcb41e7d30b5793493777dab1d5907cc648d917f8632396098001a300e04cc265aad5a192d22737667d1b4a013c93dd4549de03f84dc6f73f52d3a7bad5df408e0981e65451eedc926f289fd047aa21d967215d2801d0782ba1fad26051777d73cb5e6bc63dc1e35bb975f57f4d9dd38630dfe02fac051b11c24f2ca04c852b953e5ec11ba6456a436bec82d7d453d7af051dc0f35aad256d20cf926933b06fafd2eb9fe5a127f7eb02acdfe9a95dd258b877ea3604eabbe85ac2ee491efe2bd4e3a42ad1d15f8d305e23def4f8fa506b1dae72d33375ae1575d991f6c962ffeb8d79d301ff1ba2137b21979637210fa94dc8858a082c9a2a37d054a3d961af70a78413426fdd1e2c3a801d24d6dc83accff07991661ad74ebec4131fe8b7c71adb2d22228e61e6a7198bdfb88251174cf1d9a24149932767c916c444ec36a9238c08726312a71be5f99d0b0ec3302e891f1eac5c804fd6adbd34e655fc0991a3b0018a5fa9eec722c861d9f6ea49132b09c9557e81076238121cad842ba8f3f04743c198ee9bfb5287e9ba29c776e739f212de5c73f6b30c56a5428561ba7885b42c06b6c062b0f55651af26a23abe8d4e8d4b45da5fcfb16a58406d701e1595534212ed4c6d58aea6117707c0e3844153f69bbc26ddba1ce4baf88b5bf8716de39c058eb4c7645b65da191df172e46fad4373d6254d820f0d89247945ca10529e2a16ec38fc79871894d8d560de965443c489d1a2cc2bf344e143986123262ebe6be2869dbcf5f8ed83bc4a535f293bd70349d305b94bf8fb10b5582d04e412f9ee40a7350770da4802b970fc8ba5e494b918f1c59f5b42c8b2057b5b9ff3795892584cc626e8fc77e9f19197226043e0de73ee7360523976ab62fd2a3f2ea0ecad97ccd5764379d0f1355efd5e53949db398b02117c31545ee9f54199fdf177a52f7408cc8d24e1383e0e4904a1b6f23c220048a21898b87c9a6c9c5a71b9f5064c8f9b317be777406a3e6d08f2c5459d75e50db15e192e5d8c6c22d73b4bb2f9fa3b3b483f5ad631d6b21a5e2f714ace7e8c119ca5266d9f8fc50bb8da295933f0489faae5e6b45a2b8469770607be84c6db4bd676876863bf685ad81da7b8889795754239b68fcf01586337e60bead56b5ba3623c1ecacdcded8cc5b9600d7275bb7fcfda806ae7749efb7739dd8fbe0c44d55c3f24e98860c5fa41aaccc89117530b67a7fcabbdc73d458471919ea03e52dd70f676133f7daadcc464ff162595b686ef6e20aab1195e3f9de0decfbf96609a61a4d0dc25062504f7da1503969f638ea3fab7ade42a475778641358c2420a6c844606e86e462f0d3a4deddced225f71956302c9bf3082c9bde0668c3631d80b42d3a447d48e50651fed126e58763cd525b954da6cbab1608a8932c20bcabaf299c8872413e2bedbec4f159faa1caad48ef7fa785ba5d1acedfdd6b01537d2319c0a43d26cb1598e1eb1a169d814a6ad594ed157bf21d1b16d325b4f8c3cc7c3ef117ada26a98fefe10417577dbabbd6e8b64fde0fc7b838822b0e7e8ca136024b6a7ed1088d815198da78565736ed1cedda015685b8ce621888b5cb9628f1180081cff7e124f4da5b0fec67c87e2a3eef4aa50fa2d96ada11dc124d0e1812076ec355c50139e30a7450277755e8774ecc046850a8126d01c0dac9ccbb522efc8b0d737cbd9ec7f7e16d81c12b462618324a01ad1fa587c96e51f19049001ea6606842ccee54e247d67c874f959abe9124c79eb55190cf76d8f1d892cac522528c18a15a72b01e7838ca445d875783767b08e07acd054569afeccd4c318e6c9abffcdac7aa985d67229da607162fa90862425a81e7ed452e175ce830d6e23eb7403c145ffbd33b4464c9a538fe73a906da665e2e377c1c87287e2b73f5d338716845ca2f4d64a5ebff1120971b0a50e7348cfb9516d41bc670bf82102e718120251c06be8ff3c77eaa5b8b32f0e6668299a377d724bdfcdf709565e306d2da1a78f819d03150367750afecbd23222166857fb8e2c5676cd31a292c2665aedd70f7340422a8f94ec8900cbd70fe95a73b482a57969e41ff945ad15efa1787dfe04c8dd1efedbc37ad3c0ca60ff00f69c7848c57a31ddaf9818a5d8a6b4b5e4574b3ac9859fe60009bda5240320a111044b263be88efd6a178fb2f63eb17004552800ce99c5c63be6e26d33d96831e40119d887f4688f8081973284174f1da56f19722c7008cc4b3578ee0a93335a27cf1e4857e1c9e2e845daa5e3e563768daf6f2df8f1a96e4d22db41129d11d5bdb5c7c7e9bc7aebc40aeccac8232a924afc21f7f5dc3896f31ddf0f2620ade5d64c02d640634766ea9cffa0986cfe918c4dabfa2c7aef5593c4fcc88ff153fa541dc107e528979dc8d8fc8b4534002f2df2809c418156fedbec286a2e21ba83220d5173f04ca7fc03de1c02d1850dea9234344f1524c11e50ed491fc8e97a9be64f7856c93fd125a0a2dde018442cfbf09c650dc9d7cf799ef8e1433db1574f9159d72941b0101e3dff31365cdc00701e41c1e39f8d5c23ffec3698462985e5b9e2148d434a8e013e98bc39c5a3a1fe119f4336c46ce1931b9839f635b0c6285c75049efaecc87b86ea7463a5f179462a9f62a8918f8244c7411f9dabd8d9e31914806b528498f54658b6a25f6da458fac662fa1c1f30f5fccd86dbee3a2d3b3c557e9b7bd9fd8d75a57ef7682b9f780e59684619ad58da46bf026ae0c38e9096efdac53443b0663b6840a236137d1f99249ff01891d5250317d03e96fe5697c87cfe003d6ceff1b7ccfe373351be08c0f7f8a832805982b0ed915efc5f501cf9cb9680a9c546e12070f17545a5e9456fd4ca33e297b9b4128b925f473b6040125b6fb651a9244346b21366942cd414500edd9c1c49b1d9c17af2b22c3d5e79dc9dfa51873d5315271f046fed0b89ff1485055005fd7e30f4e49d8abcdf6c59df67946be5bd42f345fc33ebef5704b07722b4ed0ae413519fcc60daf0b2edcd5555a1173bf32f8bdfd848c3e1540443d729c94b907b562c804cc62e7a9cc0ef917ef0f0a473c8b238f61905908466edea44206149f8e3abed2c1a03014bc61282df89a9341c9ab2da7241e59bce012e22adf1c76e6c99238209a47d95dae7f13cfebe233a71c5f8e170b00f1bd475c94265a5e73552ac42e047909c5719337a9fee86b4930c6744562517209399fdcce9357eaaa3cf42c7ed6634d5f3416fa57d70c8de3ba38f61464a3a459370e06c1be5cf2257c6eac26bd72ad5d01605fded9f9f38878d2bb0529b63cd22753b2489be53c0637082997f42a78522f049fab90621d4e9e89d8fb1cc1d1d7f8e89cda7eafa084de860b0a2598310f83c019d02f73de3b914d295b0a40714d4f0ee5fafeec8e3f2e12c1f156730ed7bcb2d07d1208de05c971cebb98631c6fa4e79045f60c85d9f34c3b7558267a61a9bee81838b91811e324a8ae3dda467c54840607f23c9de7bbea6efca5c293ac60232cd822e55dca9f0be091d1275932e8c593648ad5fe2fbe5bd4cc2713ac9f9ca98bf5b90fd04cc49461753a9631172308e614676d6738a339e9b556c8cc7d5168966e111c69581a80590fdfe59e93a0ef95a8f265a824fd18afcd995e2e28f2d70455392272980860bcc0d348e5dd09f49762fe6228e58d442b3defc6bf300ad02faf76e40d3a7d92c1a9f3df3fb42e12c8a0d8445fb5b4b0e51c320aa4bc171695e88731abd2244b63ce57e559e78a9168d497ea5dea9c266c618f17b136cf5757d2d6d3969627cee14adeebd3b402f09c0a9c3842110840d0d7fbaef2d132c6bd33ba0768dfe6e73e98b31fc1f1dfd5ec04899dc35dcd4d2632bde026dc270aafea28d592027503c1e00f402d055a6bc3e13a96ac6868ac082458eb3fe073f63e9c8013d677c1fe76649a1e92b23288f354777f583e315b128f7559e3984b2e19f54150ce4fb300aced24cd63b431fd2e705d5a3bbd17e466bf9021eeb2ddf2187ae44b63faab227655b146822689a68efbd5065944fcc229b88031ee5f836db5e82342565d2cb42a18f34cc9c06c0d0d5e86ddccb1ff8404902e40a5b880178e2769bdba3a963ce4f9be6785e1651e0e16088141b164c9a3dd0af88bef7e53e5c6304777e7432404bb1a70f5672ee1d2c166347b5adc263934148d4a532ae8201191e1c951701bacdcded4d05e1c2e04b82603cf1f58b9fbaf809940219ece49ab41d8c057a9ea43751cd3bc7668142e30568da70cbbc5a0925cac002888b28ec5c621be6dc655f414b930d850d90341fb6a5800540472e8efaf4dd1392e95c2dba13bfc949d1f30baf2a333999dd311ccee1beb2ecd09126afd5b2d6fbf3fdb05aa2604a2f00928d6bdf652f15e6fd70f3c9f0f0b34a863fe2b8f44399b9472d8edea38d34ce254612f21aeaad74aad56cd6325098f69a6e12d9d7744785a46d5c0d44ab7d649eeff640a335175bb154ce1857bcb7f78a76cf6f4dd2a95cfb96bd66ec2633ceb77369d5bc305d2fe733f75f372944263b7189144c1f65c2e51898c177cfb473f32ae71d5b1a80e048e3cd85700b552272b8c6b072175295038bac7f12785ccd5a48965e347d4570513b458e02f4bbe4addb6242a31580dc6bdd902dcc711e7551ac939be40a71f9e12b4ce4c9c50c32ba9fe7269d629d012d152740a3333ce0d23bfb9494e5fd6517fb00495f9f88f68f17bf3712c0e862c8bf06adb97c2a9f71295f1fe95c32b66b2db40ca8b6040e21a46f4ee01566d0fa53e447ff4f62c8e7ddf00a02e5f238be80e71c2ac8a73670dd08ba657e1fbf6fc799e179bcbeca8c142fb26a58b850ac042bb884ab01184b7548f79e65146c51311a803b6b6acdd7b27895d7c4b771fbe97748566de1d4d89533a9e970d2b3c91b4ae29bfaf1b91107f3acfa6f442a6cbeec0cd97e4ac40f81c99b40a11ebeebef74f300786bbf62698bd540cab9b8bb3115d1185935b7bfe6e086411921a3e0a81edc33187ecbc29036c4a0cabe541a56b552b6e4bde9597215c093372134387ca4637b4755707c786dfa0f4634d0ab751ab70a3da837646e37e9d2a81534b6a725a085ccf2fa77424815a8c62b70e60db2a760cacc5438d059d64658f70678e1bf114c9630836e72c44b5890bd320fc4af32ca0453f6e78592c2687508c9cf0dd7394ee3a34d59b64ff331b26da714c0674e3ee16a779131c63a6e60d727a3447f03e93cbedd84f3816f76036c7bdf31ee0ee9897a2c5eff2efd90d29c8331eeb6b63d481be9387016458eea70c34fa6a5a7fd2b58f18a1f804d53a6effd81a84e911a195e0cb085b9b8a4dc816df4c2d5c67e7949d1743d907c7e036ea01b6a3c1e73c3195215f858b107a91226b3b4e186db49bce28f2fe786c265c250522f3307fbde7a8d25bdbfd3c664433f4f923dd122cd3bd744ecee34067f9bcd7b7033efd917ba0d48f561d9075d330f220cbb6a1d29441dffdf2e962b1feb6d26daf58bbf7f44734d1239ab3001d79712b0fd4a7428945d728bcbb8c46936de76309559482089e06be47fb0ad3f56d85fae26f0aa8f675cffb888fbb1d48e33e5bdea3ee9acd55fc3353d049af03ca4952694141475f960a2a45ea20611a7bdb3bc5ea37fac468d6d527b545c967c6d65b8db44ff36f9d2767f5cac0f145be978dbf5d28332f738f8bcc594649395b43202b6d96973ef082ed530bb0dfe719c8ff697cce28b3d40afe51006acdcf243012c8d6a5b1d85613f87c873ef170bed8e4bc14169054cf7f20c72251e3ddb75c86dbc2d0d12184e24aabde7823e80a7cb25cad3778ba1ea4a23d3328925b6e7832a7575c1d024ba2a804df5523fd2d61827ab93fbec5c1ce7cdea752d240f7b6b49fd1d0d0e4da285b76ee93d4eae6f5934438a79777f0e8690ec56e0f1033b00b65d91cb7869dcfb0a102c3cc299069c8e6a1c90a28780868a2d725aa3027ba1c4b70f3b21490c978d8f937d5f2dd02251b44de720cf8fb3c24d1407819123b2e72b50a399a3187892967ae6f91fadc554a70fdff0db8e6ed2678c5414bea686e6f05a8d4bf60273b7d232e4d86ea4b273c1da436f0134745ab9e74421bd28a6c853634a2d9c2c5ebc13562d479627b0c58de1a6dc7b467549410deac4d4a189c6cf368d3458e307b28e4ee9ffe78569b75521f50bf1249ed2b2c6322802d01d7ab76062e1bd230d070007dfd23de690e3d6c315f31f98527b756ed3f64be00d78028e78c2795195346c12071d8823dc21736f06d0b0793dc1abfd10eca521dbe58e1b45b3e66c371acba7a311cda95bbb0f303228665fe2d902058907a655d90d8d2791cd737731b7bc771a9031e281d05c32d7a2b2f02fc68779e3ae2184ab47559c5e4fba06c47ebf5acf5894290b4041f37452d41d170e4d91f748b740e779e3823df87dd186d33c9046a3380c26dc2e5a5a50b71837513e7f81b69e7e188720332c9b527bd0a3462fb0d80a0c5db34c44b928b606b39cd7d20fff0d8f37d0bb4bb73fe44b4203461eb1a2e763eb386290259fd69edb0b3ad2f6606533d4d55b3d144476000b4ad92057f4c2b3850f7232619d35ea41248140087b40e75d576d313b5608bd34f2ab9655e1d4fa0304bc9b1458712be580f185c10b96de153cafef7d4d4815e7e2f067f8fc8cd2074cc0c2325d3ebfec2c6b338a1de2aebee659d1ec20587ce523b14e11bde3b5d64db24ba5435f6c853a8c3744f27cb222c34f37d359c79e4e1d073dec2a81f1ce90ee2fb43c82dd853bf06e622c719e2799cf874f74576f8c3941dee7650229012e599ceb568ff22cc4c469097ee38d2a7bb6fa465c4a38e95795bb9decc52c8900387fa412c37730e3c553f1e651166692c38c3f04a02db79fcfaa7d4a7e4493908c150d427d7d82ca7d9609cf32ac8d65f23819f2d58b39471da64e78f14f988e92d3e2c86900d7d6b12e7eb9e37d2ec85cbf18cdf95778f602345daba1cc21be70e1a5eeed83c1bce0a3256b2db630b062fe762414b6a17f1c3b4231863e6340a0b12503ad6696730ee781e9a7cd57687121ae63f08cc5e67f9ca6d534b6d3936d92f3f7d9ad983d46df1f78d2053d6896bfc6bc2c2cd97b0fdf116a756fb35c9eb963b5a6a7dd6b16aff8b0ba9a2b68d55985ce99b177dff291db27e7b3d54ccbfc2a6aa07568c59550bf620f23708cd53ecb69c9e32cd78206186e9de296ab4b140b9743a2e14ebf5394887a0809e83e1cb8a6a519dc7efcee10ddd59926db2791aff3112d8a0188e24068da800b2c7926980b535b4b1b25cf2774774e8f793b1e8d865994da83b87dcaad0d72f5ef247564f338ee0546755f325f2bf9dc533064ff883f5b267791efa1ecbeb07259835ef46bb06b17df7a2f32e34bd3e3a7af675e5262d3d5df7c031452affd96911c3eac76417997d8d2859de74b341dded41f07c960e6ecb1f0af073fb5751f29281f2c6f53c15aaa010de327e2786d6d3685c6c9ef0ea3af695c8efa5e0806dd6bdfe4ea160dbdc1120005c9fd9ac75e0dffcb9b44771f47b191878b5d577ea526e76fc150990f157a097459f75c3ac77d9733b70491189247316bd7472215e0580ec82dc2e3249bcb2ab067f5e3a907dc6c91c4f18e44c5aa5b9e457a6221fc9c3b12506ce104aa71ec26e0c40bedbb6f0e75ecd31e8d412ed3604371d006b40fe58402b8fa6ddfcecd88044505a6db9d0ba53cb188c7c7366a3aa582416e14cdcb8bfb92129ef8862f0f1856a3bc76c0142234476b4e285f131584c36d30518ceeda59321f3f17b2b8cae936e878e1af3ed49542ab86bfc48d001953735c1ab0a5c86fda13059f7c9da54678dff0e0fc0cd169007e2be067d718f23aec0df1a3eb80dddb75f1faa9942b6d36d8fb4c9c4392daa3285453644285ea17d089039a4ab78479d47417dfaeb5bf7527e93bdddd9056a6096af72d44fbe8af263e8e591be176048023f507480fe7eaeb2e0a16c206bf26b0971fe3566741926a05fe0aed2d0868f959fc5e5be0cb8c85b76528795fd57ffe7408b42e739ff04515134629c9ed634626a1f10b5297368605340f297af874833985ec26b3af082e57f3033390df47260ad2b1267abb6a4241972c88b4a7df4273886598c96fdc4c98cef2037c02be5baf940a46d1d414a948e14f3c8e8c9ea68a41c378ce4bf4cb18170321fece0e4d9e44a279cbedb7ee21c9bd2fd7a6a83eaa29db89baa516e9a4a3fc1dbda4bb65a86e6d80f007d8c1a5270bb2442ee3035bd4a7397e7199b3b37ad402169881ebffd8ebe21093bfe706136289d59edd8bbc69f55848a664b527c99835689f43cdbe9d91995350e793f9f97c3732acf548f4dd7d2adf8d690bab1c9c257c1dec128f0c377049263fab808a7ab66f5e0d4ad2c7f4a378a969b4d52d2e5d5a984dc2f3b0dadff627f66afb8d090bd4dbc1f8afd1c1e260c67bc44408fd00171617a27f8a551859daf9036725a929f9bfde72b9fe22666407bad453e2cb7a959ccb1c7d62a8d826c4e278c1c74fa2a984ab277b5727d0e59212c4c75bdbaec37e7710a8c7146ccaf942d6f41d83b35d7a805c226b5c538803d2d5cf067502ff4dcd13f52250895783cedfc8dfcd2433924e0ce9ebb701153943647211a35090f70996c65732cbb8ef3893c55d2ec0076c5a9c30cb6a66361e5a6d65ad4ef7b18d9dc6288c7216beb9da0bd0d17f5289bd81f5f22f7cac7afd5f65b558124df36f5c5657e98da793e689c11cf346eb08683f2ffd908ccc736aa3cffad5e3996a2c4e4729144ba8b6aaaab72dbb2b4ab6cac0ea0ead0b1c062d27c2362f510d12a39a17c0efe9094059a7e9e113690545430ceef55c51b05944291df59a2da4faf54a8fac7c7787ddacc39c67811b4639a698829de30a1c8a19eb1d9daae3b60a7976e368f81a5c5688b4678bb6691d66d063d0b8b8745a85234e6ca10f952109bbf21a3c1047ac360f3ea93a7d61c24502f53a127cb7238e2c5ef8e8d2c59e2aad5a361ba5074c32aead3a9afc169d59dfda632c3ff2bdd83246eecc38adf21058d69ca5ac7c2a261dffaa768183d71fd415fab2fb06955d99a4f308b43ef5971f15578887994ab535f91520dbcf9abf19a45598582d2ce7d27d34ea25d8b51c865edd8ab8376698275dcd6fc6e88d74ddb9aa99fdc410b7b87a77b272f576278f279b7317a50e425df29b836551da1b7c0a1dd9c98ce1dd410f1111f6663f302e4fa910be6d130a70d4972e304fd442cfa59585fc94389fd5c4034f1a063607cb9f9c72fd1628d27f93170cc26a3827c7e253d108f3d165ec3c3c3eb96ce9b10639edc1563e952f7c2c360dfa6ecc5c932529499fb5b8bd5a33d2dbbd0aa687bd09c163b8df6d81e28c586af74272c0ce1c10f29073e8e30818911f6f0091f8fcfd5c1a1c72b0dd6c3905cf2d32946907e2ad7b5943658b6ebb9fe948c748cb13ac5374eddebe50e2217c7013dd3ba75c2a8787286ed959f3b19467293c8a75b77179dc9c8a808e8a1201f5bcd98372e0c9f375de25ebd971b977acf484c7e9b4400f4a0a060f43c28f98a2248ff6e039a1a79b306ea613fe36c4acfcbf7f592d92cbce5931bc114a2ef7d9ca6243f900f39fa79ee6292acc10236fb2f37bff7536bdaabf67c0d2e5753b6b338bb7c444c48d2f5855719e6b75f1dbf25a716927661eb8e5eb9037d0cd9bd76551849e3919aff320ffb8b6b63aebceb328ec5c1b7ec7528cf8377a8f691c3969b384c05fb486381966970a998a0f7337b1426f69f05ab9df6c3fe8a7cdea1eac1dba595415e9df376356887cdbb42af187cce36784082107a278fb0c90606ebf719eb52d52330dfee7038dd53d8905b04dcec9b48450b2b52e09ade3063fa38d6141051428bae62c4a5bcf7635dea988e1f4bd426d9bd9c3722df8b5e3e8714dfa5af79e7ed7edaf96c4e16f7033ba9674c69a0d4526b921f3117605bdbb9e38e2cbd05fd9ce86b9298efef712af23738511a56ae943544c8128fbc5e4924b1fcdd4e06ebfbb77a6621912a1f03c9cec9de9561e9e5986a5535213371efd3aa0a38d9dfef1ec234084b25e47927615ebf0d00bc224527c2fc9c820adff9cfa3267ae6c71628f608b8afc72d485a75baddd2fd7a3d0e0d8cc26ae1bd7a136c909a450f4a7edc772969262a8b8582051ce4830b40910dd80f46cec17aaf141f0c6dc7bbc9ee2b740dd6b4a1761d293e9ff4eef0c9685a43129eb4b5a3639218d4d10dfff5c0a4fdf0a4ffa2d97503dbc48cc6dc61d092fb6345c60350ab76834c2a6bb058140e44529cea3997c9546bee0d64676bb4526854178692cb4a0d3ff89508c1cc55a2e775e75a0c0453302ee6d522fbdc4f0089385ca37412092edb04130aae0116a4fde06a4dc46846e63357e7d5e6bdea47dcebe5d04358d26ecfbd2ee6d9fc2f4799de28b351809c251153221aadace8e01a483cb30f84aa87381646d389923f285100b6c550fdac9cb7cc0c87f95b277647b0d9b706b06f52e224566c3ef167cc4697bdc505029922f71c2b000310adcb368977e726ab6c1008a25cef20186ae3aa3b9655cbaa85b3c17ee8a80824a77b3cbd6a053578bbdfff6e48b7485a0b469647e6e1847fa6c98b920f3d0584b8e41937108ef0cd778af90a7ad3aee0cbea545a58caa20418dd09ddd2cfaa339823a66a4966fb95c119141cd4debf23ed4aedd75f3c8a2d8a141b46653337c6ff31e7c9084e346e8fd650ee5b789e75c8f1c3660df2bee2ba70e89b228bb7e6e9847d50ee67532c51a255ee69ff52797530b871f3460180c0fc1e0a48cadfd220c454faf367705462d1832f6a7557a7c02ffca81a55af5724cdb2a83c21b1da1c7585482a3bbaa24cf1a3e72ca728ca71da377d060c1c2dcdd7c7ee699bc8e532b334c1843a1083da244aefc6ffc781e2593ba9c9733bb9b9ee3436a46f55ec124f086cb63a5d9cf9ff214602a763c1e41ea3a52a8ef7298b67944223c5647d96ef76571e0b8d416d0d848f5ecdac51f9b05432d887bd9ddf39fdb60aef6639df0dd514c435b5fe5068128ea147be4cd6bda8d1ad2b57a97c9e4e9982609055c5e68037641292126b139daef7dbd7a33d236c4c08caf0d749796fd85fdbfe1d96bbf8d98c7ec9ef4ef8397ea4e29c9923ed9e2b2a0640231b1802c35c9b596d22fcf718cacc7cbc4fb84f2f431cf7452582fd40b03b1c7d4b10d48ee17ff9361d34f194e2bc93d342b94d1897df38134f78ed1c166e7d4a2745c1d15c7684ffc9d55bf4238fd2431218ef33ec009c4333cc5c974af4c2e42661d8092ca74d61fb3b565fbf843d4f1f6b319d0715c56950747f4c54525715f94b4e151427ba8a617d0d04365f84ec747e9b19a8f184ebc78a1c1a06f342a05d6735b9492f60bb28eb3592d5b03047ca730b8e968dac86648749a4c3b303b8cf9cfc1e0a1e95cae754a0c044101a3d55f0068446a269caf04307d255740b8700867150c3c1a4a1de6ba1c61f8133e26c4273ac06b14c99ddc4314ecf1c9ca9213a60bfccb0fabd84df91e2a4a31dfbfba8ae55c14dcbac3800990881cb53aeff89f2bfafaf1cb0670d27d5707d0983c3263ff74cd1cb0ef31ce6b3fe1ca09becb49f080068739f595ec5634bed5f2a6d8baeac4cd5899f77e4254533c07b697ae0d436c4f184c4efaa36d7031c52d16d9cb6b2a01bed9291606e7b85c84d8505dd7d4a6ef172ed5041607c5d7cef0fb88793ea66c33eefa2df1a520c707e4f0f013d27644c44fb5366ad250c2c9eaf3e0a2e5c8bed02122bd9868fd33b599b6825701618b6c064ee6be4a6c0c7da3047f4d1b1e8329f2a9d6c053930b420332c0c1842b1976ab2f2b605584504f5448cf550b7f88d60bb867410192523cc5289bc563d441472021f4ea599aa9e165130dbc4e1149a651c06684f41d70ac42a5e9d80799b2b52867bcce84a837542f37fa99fc5464aecfa908423821246165fa258abd08f3d270309d1f44f31dd2178843b5b9ca87984d30afadbf4dd04078ba1d13cfdf06fb454bf451e13428166626652e5c555f7b27c2b139272201798b805b83b21feb87be5db17a501db643fe99f3ed842ebefa29c3594f21b55379ce9b1810a3f6e904238803b170c36d4df76ff8cab3998d69d2efdc9e6d34f4730916cd5c4bf0889db64a014bc282e595f297a614b74be2f24033e0325bf11b100195ab0aeefcd541391419f91cedb044a55ce69f0e222dfab3e426e2dcdad5d955f47d0037daff52d7d08f1757c41a010fef591a514aedb3ad6d8941d2a3df4fa32c42cfdfed81c77fa17ee10330896286269e4a3c0bc6a4f179cf011c9e35284d70d89116b88fa066d3f4bf3f74ba7136d314090420045c921885182e3e4730b87c9684d9f760003517937295378bdb743caceb116ef46d168e1102371c7300dee8ef11ddacf5850b2b94630d2346b67bad5636b5fc58e0f326b4a5ab48a9537ae42831141bc13e4b30c78d98761eebbdd9d309d64152ada1cee9545aeeab586da4011e05b784d9b080571218623c5e96a6775170de8b468960efba1a6b436d87b57868495fdcecb7c7a48726801288955941af26a6d8c83627319a5a82bfdf10f91bd4fbf3aeb8b6d987a13cb0ffbe343965b702c3d7797193cbffb037db65404cfd9a48edc9a064b3ce0c5d02d08bb10b1ed122a27e590a6c767afc94429d74234067e18a6180f1da4c3aa9c51941c498d4c9ede932864c8ca5ca9522283f39e5fe9ef5a59808dfb6c6c9ed7e4a156b39a1626e5744bb294b673e7b95c14e4687655a1b52f324c95e1bc1f30317247c242a3a183c5618cf26ea13b5d972b29defefe936de2fc23aa98bab7d6dc174f23eb3c291d9b7bf11b51de9c629603d6b68a44aa2943508392631c9500772ced32c8a8bebcc59845218a14a52e13f50e9831510d7664fad2b58c37b96714fba5847fe66e910040aa67bd12d5eca05e77a2db23f6445231491266e6a4c7fbb1225f9a51ae6bb29bd325fbbc9c0ca1f4e9e35b4563675aeb51b92742ed62626da03dc88e0b423e3eafe506f6f2c1476bbae05a37f417e5c7d1511e4a817c382daa4df1eeb8b0e3eff309eefa7d82b0aceb1111e67a70dd0a2f9329d2b2e00508caf21832f7732f287c43ee2aea89020d3a65d1a6d2f3a96c3acc8a524659d62c564210d41fedfb141f1aac751257a52e95ba638d3304b5c0c75f0373e63a3686be88f84ce8a40151966cb9e90a2e8588a9662f22886a85b40441436b59d73e10c8c295ef7ac2f7abe0e66b1df39567c065b135c342d16629627ca792bf0ab333f323714f2d9544a67c8e036cb3d84f4bfc58dc39cf4ba2ea32ac48b9f3af2bb8e292cb58ef103e82c73a21416d86f305be0c884f04cb46c2f8855924df27541ff92a60840949fa0cc8168dec73f13eb74ef1066be8a9812eb74bd54734d9367b8ab8f6d063f9af80ae224db818b1e9ae201fcb80b321873989587e978cad9911f140c66c5affa6225db20b3b72211bf2d825f5df37d30a3626992c09578f6a5e8b79a73818ddb87e5feccd208ce11ea839812ea6c2444862f7116c225ef23b472a4c178f8a3a6162d04dfae3195229b9742954e4135c9bb3de566babed4ad191be5809f9445e5ef9d025af30dc1d2cd15405f1bd45e7a84cd50f3a61c991bbef24718aba16b9e1ad5d1669ec65adba387f72880d59141760167c574137c30531c81d3361a75c50ae7f99f91bd3b0fe352dc0b057a5f9d581a1ee90485961f16f71166abe2a7e933a1479cd21519abce71fb5fd16990cf8a87d4a30bff3f2c24706cb76f71ff8f81aa555830e0d2168cc3d09bbaa0eab1a644c8a7a6c867e9e6825de63951acaa3e21722d2fd39c248673de87672f9965e026b3c7e4b5011741a8aa7b1bec7948cdf4ba7bfb9663baeb5fc735ce0556ff0b21501329b6e3efc80dfafd804bd1d12da1800271e470f3566a93f5e8c164121ddbe0fe363c999c4b234369c6f21d01906831c8ff66a051b04aad430923ff60e3313b0f3cbe83c4cf592af2cb0ec3ac0c7623f515019a9a3884c2f15c480e0dc40f1c1e9d51f4330b04f3e1aa64b8e992d31810f7bacca8c049b40737c66317c7af134cd61b25068e9934117a0b4218242244c7b3158fa92535b6d4418a882040afa8ed68bbd07935c3bc48a0259edfe9848e16ba43811060c2b0d4e6432509ce0bf696dc2b293527f9d0bf33ded122eb2cfd44462e6ab6d1cddee2b874b7af1cb04f3762d2720b9040b0c183f335147225d8cac5490a53dc9bad02a3295c54192d86ef440925ec5b1caf20dc34e8fac94b6c4924ecaa49afc0de8f222c158f35621aef1945705ef94289c0739ae588a11dd0d87e4d38e2e1a675e02408340bdc9359ec35c214bc3f2ba1bf91b3e5a0827404a5f89180e0dc964cff7d9abed5fe261bb9617226f917958370aeeafe509d86d322e290f14a86560cbacdb5bb3ed2ac5974d544d32278e5bebd83fd9727e725cd189bc6c53d40d465820f3f34aa3da1757afa2f8599dc3b6e58b6d921942af2d07228ed2c2dd780b6d31fdb64f50438a36e60b9f2d34d00e07b5fb07198ebd1407a72cbe1cac0dad78293e17c14f5320004eacb2fa3f9186e903be2454f91bdbdaff428660f7e854d916314d84102ea1979248819325f02954c83196d008615adad0d09c518cc55364f7f725e12d1d71721ef831cc66baecc844b6ef3750552337527d24f6a0f8dfe3b2b6ee04185c7219d93ecbffbebe02f7d08c9c582201757576fe231b39f42292e562017d4c8057aa353002884fc1ee48cccaa3a4d18f98ec60ce47cf9a01faa17ad2bec01e80a85791754c49dc18065560a7bcb1802ab1472ca92fe4d225f3b61613b1a5109a19e6e151502718074f6d13cfd4bb822c1106018dba7349627b68525428e8ba9eb930b4fc568a011e90132ba7f51e4c5330fc7b36a15566c3e7c5c4eee3aa455feba27aeed6e14e441f7cdeaa68ddf2cb70d16453f4aa45effecddd5140ee704214bf2bf8841ceb2a7f15594c161e3f40fb80b4e5c0567c26edf490e2f11d2d42689b30409c30824522fc8c035eac4b451cdaeb90327fece818a4cf148c83c3d34162a37e36971d98ba82d5741174b6cdb702bacb0811aab022b9d349f3cf8e7c02cfdd129fcdd0eb55af69d9cf08618199f0f22f193aef7476033a3d5f9743158fb557cc84d4753c26be9e13ba1fc11ca3eed562e6ee20e739c7ec0ac3d2c8fd187ad580cfb179713e9cfa185b13c1391c1da44f0864e39b0e3fde17475ca0c30b97e6c9a7edb8b3bb6d169cab613024b1f186ae3f963e92131593670075dffca419b483f0146cf2cb0851204b2dc49b00b1c61194c5d2cacdec7c283842b759f2231fe70a392469c27651e163bba7a5f2f850f3c8f41ce123d72481654b8d2eb06a2f593f70d738f376593832f79ccf74378f7ccb68cbd864e025e872fba3f8c8b7d1498e53fd655ffc6769d3eeac86a2308d02782e22916683f7900724539f0469e6bbfd7ebbcd52ae2b02d3536863d27c6f703b956f90243088b75478d073ccf09f50b11322e4f566c534e9fbb78d7b073a1aa2af9019eccca7d455118831c75331f03b37784d7db35ad87f613d9a688fe6b1dad585bd0e3042058ae9048176abcc69a39398a4115778f9de2343833728cb58912017db48a9692eec6369bfeda6f1a47fd45d00c2ca442455823d9fb8ba50074cf188be857631a856c1770c30050c3e782b1f0ad4b682d24ae6dab65881f9c49e6960536f4e58798eab2ae1c11e62a824cd3cb78c7963a7f358a49c648db76a23f2379a43d7c26de9aeddb0805a532ffc74bcf71ca629633b072ee89e4093e91db4a354be30c691e1ba0557e1b8e67094dcf5ebb5849bb89fc4d7b652d3a14f1b202699816842dcefa479534c49a92be6474f73e88d456ee3851d94c8d04b05a76934414c048d11b7a24a176db2dc79b1fa09265cf08c75eae577ebc499e3fc66064b63797d2b29dfd12ce4efadf5d363be1e0c9a1092e199a2cca581e08bce8c32124bb8c05dc000b36f0058886a74135f2aa31f03e3e7491e6fd4662d6efa8e6c92a1a8ac7863a7a986414ea4d1f63c306a052f14fe5433e0b08ba05c41cb8af778b70a9710b8c07d212f06f74f4cf186c843d942a41e4510024f921c2093845b6c2380caf3d1c5dbd4401e8a575f0b38f94490bffbfdf9fea1b01271af3cf9e270266d00f53c8bd352f8adfcb500d626a6bb2571823b199bdf064c32956ad91c5d8867eb8585eb5933da0afef2f743afab057d74d016c9fee958198b3e9f135c5edec3af214a6fc54c872bd5fe507d3965065e952a74fce030e5b87df62648388d6d3e65871fad549c7876dc30410eac094ec7d9e4b9102055e3b7594cbe1e0c921b719ac4d15aa5be1f38ff953d75f71720d6f494076441a9630d49ca2efb78591fc4cd0fccf03cf86df2408f1c278ad32adbd31431c7e7416e74c7fb5b7bded863cbf472b14f02ce033635c05c61dbd0017b135527f25e96c33724c47a3ee5e2ce8ef745700fc32d8bbb884deb4be191adc987ffb88c13b1e0cb02056df2f90bde0f34795afeae26fe01766b03fd9c32e228b5e9d4f018f028c6da947b89c89e4b7bfaaf0cded931dccc513c01eb8b25af505a57b886a45557fa7885e8c7c6a0add90e2b2e9bbb0a907bfefe41393400ba52e20cb37e916899c97aba130eaae640be29835314b0178859788d6b169f575698f0316bb7dda4f5f8d4cf2b61ef38526777338e037962c3b44b2bb513dbac0cd4dc03cbd2297cdfb64e50a5395488f7ff19f472c5b920d5be19a40bf67869629f305802d73de61ad2043cf28b5c320b37a4e4a08779cca0fa19ba2a030cecf4052bef453c82815186e5de33d5cf559b2ba08613e0a4cc503f93e40536afa4398f3e9636f38643fbac36f7e0b237373fc30b88c9ed8cad4927655e1a177e417570911a1ac37cb97c930c2c9ab164b504dbd35d8aea63e91b188184842e1bebbb707f0b505ab9d89c31d5d3a68ce9cde7675faed484c340b6ee6c84f2262b910cb1154dac8e385fb4fdd00ad40c9c310688078c3f7027a35ac1c15acec1d746d9fa977aa19617c438269019b0121ae900ba977fd8596fa71717ac2139ae4caf8e6ffc18657718b8848a7d2b5c1d40093eecd16248d56094c86a70afb12d3b7aec736d99777f2136006752556eccb377fcd9e70ac9e622f9ddcde284803259f0407aca2b3a68bc230a4ba0eb9d7059bf6b3805c33585c0d57005eb0b434de08fd9de25617ca4988145994a2934bcdef4398ac596c0ceab53628a092630500db93a62449e2b75062c2c8507267b0930ab490cb86c16b2380e8a6bce0af007a06af0ec235e8e987c2b093be41ca57a04f88112e4f0fb7c1deb342f607621cb5f0e0a317044b5cb1695bca1bf02e66b4f88ea57414fad18f8827677f827e6ea9255936d0e000ce110fbeaefcd6cb94dcdc485393bbe8abbc8190f5b63b0104088259c1092fd33e24d6d7a2014c78e027d069b8f33d9db7e7227e81a8490cd291194a134c9e9928ed3097f2cf2da554822db62ddfecab3963d70691ad0a7e15303f469fe30043f8b4d1df9d294a5a58bc45947db644840e156ad28c7d0f2d783b6f1a5b07a4133c488d306a1807e77bf2d872af4a25a0d224dc5b56aa299b87d87bfe8e20e3ef5d1f6776bdf0c8eb0796dca642ae9f90785969485b7794e23ca5852c9a9870017b22e468e04e493f3a157716dfddd7749f40a463d4019fce6c80eae3ea6328c3ec46aca524c88fd747501455f5516baf562633be0ee5bc47004124289e293439dc807d26c21cb4ccb7f482ecb2da244b66ec385a2ffaf4eac2bd1553b1be01a019008ec111655cef56d4aea8ab581149ca02eee61f995662f713c853293849ae92894792a4422a0134ee9ce85dd284a72250b8e079c23eaca4f494d94d99eb14a98744e640f020885e34f9f99dcffa3cb0ca7f753c38208dbdd70a81ff97f58e79796e1c86d171a713465701903e3c854fdb2eed7ca71d0f0e92ebb656030036e678c0db90d59afe95a5a9d9454a46235d4bfb01b16c10eaf148590bb72eae3c0780e6170ea15ac27f122ccd7c288088ad4c8cd36fed77cf4fc7ae6f6199bfd13a373ff71226a969925f4015a91c6f940e3a9905a8c2d3fad5c960a48e16806cb933c11812dcb7cbea0cbc7875c0ca8e3caa0f71017d0b3e5a566c6c219251a41678ac406e2802c07ece75e9e7cfa1117aad43c320ee390f848fc5b6849df3ce4aea3dd071424b837f649050900a5eddc7ecbeed2ff1b53f24d6b92c4ad53ad4ead71d70bfa284e03a73a4a724515a3df37f198ac2642fc83544ed26feb7407483c029497ee4f5fdc30c472fb51c71653d418fcc2a0b5211f5f4252081ce836d8a3099d1d97301533f537ee4b5c2b4434e2f3d647c3e64a15076753744c8c39d6a45cf485f3b8189c5ca6da6aa927a8f119993effdeda9fd4d8e36d7f25ecb19c1c7474af5ba5a899f9689994c4927bc6ed0887a62eabe79ba05fed24e9cc49cef2f0c08cfa0b0001aa97737e4fbabd52a2a0bb1f9707d73f61883d1927a2e4537512c7bee8d30c3630944eba24df0e3aeda4a76357afaedb878f66648b18a2fee140cecea23776b7ea81702c4ab55ad325bd6e7cc4f92987b0aa991ff28fb077a084186a3948f3b4e5c554c53de65233cb76b50ab44fbd6bf990cda77b97ef679a0d13414468f1a97f8c90f17a8eb91b82c1591746ae24d372016bd7b478620133ac166c52d08a363f45c771b3bd7b99b470bb3355284209b43c091907ad72549a58b8774d0bcdb04522af8c1af99b5bacbd942af2624c2bfe873a658c64021b9caaa97a06794f28ff9b25cd4db9ec0c58c262c3f6174d3e9fab687d13ff4ee3946229d7eecd19d64deb53bedaeb9a3aeb025e5ae993ef267975c1f59895a3c4ebe0038ad090da327491e3571d6e88912fdf024f21389f5ca93733e0b971db074aab2329349c6d2d6ed1420c3799767cad212a8b5afcf5714f44792aad92b46dcdeeb1f304a1b23b3f31f9aa2ab3006dc975b1a4ace97acc59773801212af2fc9cf6c695eda3b33ff8fc0b89bd78665992ebb35b289cb02511ad2bcaf1204f829bb5aa81da7a1b7bddc272a19a9a26394578527734c773afd4466087108e402c6e42a5000950fc0a22d69b9f583e698a78720c4321b0a9f519a882b5164388ecb0575f5d0c27e6a523cf0006707b3a2a7a17a82e50af3ed74cbc3af7f5419789fdd2d2c93c514d96ee07cbe2e2df9409a906ab52bbb474309d6f981fea40c0895d34cbe215f6402b171f88c453e93b897bc362db9ebe81102133906d542a3a62da25f6f224917119a379eee08d90668672387d9c84657e94f37b870a6f9df29322ee835749738786d2bdb19f0cba3962702f314ff851a4c12142f11dd86c30a0a5fd57a8333fc9b8155567fbe4c6128ecad9f63cb9c0dcf84785fa07cc1e06ff1b65c985426c12a561f07a6a8f03a266f34ad05854049fddbbc44695866d94812b5bf32d16c719d5620233427536d567c9fa2109b0031fcaff85bc3dabc91ccabbba953b76ee0760c343c5c5d018920370451b2439b6cb2a06d161c0c4d3e3c3998085306fd55defd52c7b5363d640a515ecaee00eaa1d5b7cb548aee4e2e3443c4fadaddf452b0a7d7de661c18f26ac31921bbec182b5ddedc38bb62b814f43d7ed9d7a0758952013ba253f78da8f66944004a4f772ca09128e5ac58befe3486ec4aebe0cffac116da938c41d3dcb571ae218bd8dc6e887ff311648659d0b0e4262ae0dd67c9525ced5646e6eb7f352f3c84ece9e59003852c97d28b9b4d066c8fa222a0ae8fab5c90eaa90fa378b343526a90c2b1ec35a89f6ea50898d9feb58e21a9f80aed8fe9be7468f8722e544e19491b3fc9b5318055f9ecba936d907dc138d93f00e90d178374d5736d1608d9a8ec0ddca6943be132b1ccfb4f4355815ac4979359b4e24ac994684b41074aa0af5b5628ab5e14e708898490cbbf782956f7a7913bdc4b72debe8e539a185e4598cc1ba52c2d93b6d2774bdd3b8ecf3fa43b3c0ff302c4d76d3da57d8b797992e7c9b2b3b652166c7bec88095c84126ecb0920c13839e26fa35881db07bc2415fd08cbf1a8837bdc68505b2d6fe24662166f21cf79bbbcba9be0634ef8b7e98e1fa27c923a7b217e3ba9b7335213834e7b6a7ea512da04c3f5d0a4c1e76bfb4884c91f5e9561f1f9d1dbb40cd2bd3b4bd17d4c5eb472c7debc4e95d2241de19d380572f80b82e699c741e6d85cb16d51ca3c5bd8fc799e22bebb20986e5530b6131dcd3010935186d08e8219ee4ce0ff09767f46fe2624d2f8e4f3512ce43adaa5f4cfd0816f89c68268e69480c25fc0fd742bfa99f785934aab99a795dd6bb34ef28e349c0cd736ea0d71c560e2310db670eb85f5ac94eba044038df6863e3d1295f93c97d0af71249e8c21668054112f3cf1ec242171c32a2dad44bb56c037638f185ecd7bfa0d37d5db646ce5d6b49488c2f48da1e661a4f8f0abb8268e6bfae2ecde7ebca55b1967a218ea505ad8ed8874d4f7b0de5161be68844005c38a5fd7ce4f5ea32944a7865a36d89e01a673b17264fd1478aa0d96d810ad345c69bfeaf5f0e9bd79e300673b09ec76e7ce2a8ff2cd45a802861a0507002945850326ef2fcc5d76f00bcaa83ffdde32ff7528067147ceb1d982a4bf8b2614f05794a6c3edb6a0cd8ff15d16f96ce14d5d328c45622422af291bef9c29e7305d69a0cfd65d766bbb0df856d844724c343c78d9ac785831440ba498dc709e32b188f3d89ab5170fb4c0352710fb28c1068699ecc460d46791296892eaa770d2a57afd55beadd17f3f052ae59fc17de4dd7c38b4824e1757be26412c9805ccadda69b97244fa0cf636079429f809aeb80422282a1332301138e180f8ac7272d16be8fec78a0589f1cbdd4cb47d8affee5b88eed8c1c96f28c9ee5226765092d18e1507b4f175e5683b534405412e45d6abaa397643baeee06df25c995c0a2c91e9cfec586c70d331203c09f50ed3679321a9e25a711aec0f44287ad10e31538d34d509a5c986da5d7389b55c8c3a84c13b1d8b07746b0f79e1cc1fb18af24e0d9810947f5cc0509f4e12aa0ce88c84918e01b8f1a37c1eda0a34993ae235275421baf58da1c33f01df00afb76d454a1ffe26ae37b176af569cbc5601cb137441a4fc716775c73e11d7a15ee59004216bbf2383ba6a24fd4bd692ddc6a9d80e0db6e2e1a9cb56e3551ca12f61554b79bf337304f4f5bc62334adddcfe9783dbcf6824a1cfd6fbf1a2bbdec74ca41d5df828df4f94c5c7eaab9e3131aaca281d551b5278eb249baa2b06f7fb89eb2568df5128c9a17b9a8440b918a0f0add7c93c48bc79db75fb920fb3d61303b635f7e108f57634d6e387a3fd532831ef282209bf22c0f6da6ab13b8113cdc4c50095349a2c48931e220753c23443c4768b30a1717efb518f2ea47a90092d5033383de4bc923e62af5b3a33d471cd1a84633b9ed115d6b5e8f9add253b0799960dd2a5752f4c5640a281f553bda972a9e92a50c5617c14ce6b1066944a8b5cbdc7873b5951f720a32f5b4be1575a3174e7f9f1bc356caa57ce0a59f49ffb5036db009c3d6ffeaa24ef5b651e36c8a9790453e8e287f73ecd9fb4b8577219274210fbcd9dcfe30aba8e1954960a9fd4ea373224bd0760a66743bad963edec90254a97f3a7d1516afff85d34a9b173ea40c0deafc5d4abc643fff0ead0afefc1a96318a8bdcf79b0b1c50cc70b1888e9b4476b22e608008ce1f45206ee9998219b1bf1fef7d17ca3313a16494271b550c71866e00113d228a4a9514b1cec227d4d11f3b89e10488a07da99c92cbef60fba62abf96ae1f997551fc1c052b5aa0613d1b04cb2468f5b5c879a1e76a34d84178e8bc06bdcee4d9f7cdd829891f858c6f0642f65d4ceb17e33e6822590fb9126a1b7cac0b0b9a594452d108db89688443cf0639eb17f0f601f13da1134499578b4a5e81aea64dd2624425ee15b0904edf1c0b57830e77917acb491654656ef60775fc49c5df664af409abdda5544a6280fb52dc08f2c145ebb2919219cab6975c4ec4461643bda6a2a247ad327b8e7dcac493f7a5d9e2f13a0a6f3988e89881246cc87f4e5f14af74f2794b948908bf76ba9e45ca95139b79e5c7af2b12c29d62a2c3ed632183edb0793e38dc3fc7febf16b6051078508f2fde07eabdb827625ead47ffbae6d94fd28f675e425a1e92c7518a4f76171540ea7352012790a54a418f8b14d4c6e872b33a1fd6abe827bb359bd6a229d72837756154fcb35d6dbc14c55f428d552ed9307b5b65a2b104e7edd2eef5708b298415c65b04ef2ee71281367a3dc06e06f4a31203d08391c610dd5bec551a1bcc0a2eceec6660a8e3c4ff389e22f7c0e93c9bdcc6c5710e6d5e7777fc98026afe07300c28fb2ebe985eb834fcdd867d53f6aa5808b43b588b7133d633d85f9e196b3c5e30627fc8ea9798f6fe3051fa206efc332aa59d56bd99fc7cb39b8d13e4f04a02a5c8cd07eb4b648097fd6734674fc60d6613ae68fec1de3593fa23eaa682cb969fafcb28fcc278f26a9dfdf67a39848dfcd1c94cf6d2190105083fa2aec96214ee56879c6c89243b36caa7eb9abb07300ed48807078c4201d40cd0cb901ce808f5c13aca42183ac5adc33d88aaf9440e75e9d4f9dd92465d607a6bcde210956562514fca485c8eafc5b6a7b750f783bf5cb0c09a3fae2e7c4c06b5395fe9ac8f954d70960ebf67dae62b46833bbf5763a221ac40b59a23ac69f28af07417e0877fa9c7b13f0e2d873d66b4ce8ad8574323961a7f04c8e529dae20a52485d13e448ef76385ae28062b57598967630a9d055c0f371dcfd4f4813f4b342b6f570e61a24ef87dffa75c554a4113417b474951b065f3ddc923338115d3879a52f4a3c6e65e9751420244b33d57199fcd655ab86d3947944032f8c00496c92fa534579938b71f35612109e442c2803eed7062be6074c669433aa4f85da7c4db63c4dabd1c3b9656c2aec27b3a212f0c71d85caf4195bcbc3577b9b0d0cd57daa2f7fcb3b8a31cf43b994541a103253167f1f695fe2d0b2067aa981b9003b855bd42f8d816fa37ebee952986566d68970273688235615808609a4d996ef6823ffcc053734520677a2098ddcafe59bf31ebfadba3c26b8d808c8e6b38548aa14917ae532aaa48092fc95fcc201a313a90988767f67319a57f20d4f9c5ec56fa28a6f0f9cab57a943994e790fca1588e8bc5fd9487aa4dcab92a3e703eaa23f48b738b967cfe121ca277f53a6a06a140115ba57a93ef7bc606cca0c3b14070c86ea629e8c6a83f2717e38fa3d5aed69f5a27aa63fc492ec0b7725382ec90f1a5b7e198cc0bf285d750c081d1d8b6328f18569e08df6e834976cab500788f0ca344cd4b8156a13b5f4225da6dc27be7205ee5f35745beabbe86caa795c3155a80d5f6d773a21d0ec893a56c48c6b39a00544283ce395b6ef487ed0ee788b32c3b7b9c77a2fbea7c091ea64fec0934e2adfecf0960bd94a3360a275246bd86047077bd898c1a5a5a6f63f25e44ff3ecc86a159a6ef6143b996979ce11ca2d8178db5c10fb35d484f503e19b84fbf305aa288595d588bb5328a0781ad68c6bed2d447232fa942e8561440c340e656a3ff7a438c9605994222d937b2aa480b47523092c8b3b4c0ac408b7a4a1e8d37b124699a7f9f1b7aa3b4dc84e25199fdc5ead10c298afe269c3093ad583c5b3ed0a7edc8ab26306ebda50d9b2820a116b7a1a7c8e9455360811d0f1336caed02dc57ccc62cc092f4a1c7e27bc918cdb53eb19d1f5a9b73beac532d43c0bb6c604a79f6a96066252c2580ffcff13e7de5c50ab13a1ce5f4ae37f2fdeab5469f6a3146456b87f3c4259248b2e0dc1ae13c58ccd15750a3b1fb086e594f21651041ba6a0498ffa741ebb22fc3d2983be47064d195f9ccf5c978290d17d630594372d8874cbae2a7e73c985492fc30b02a664021bb6a49223442536c930fba24f8e0a1b02d82937a97474b6f867188901dd6597b7a3fe315ddea07fb86faf80d805d6feea9f9468d6ed5d948cb1c987407d94cd3a9be12da583fe47c2c7cda20226502bf7f4db1b0ffbafb3d600515f840e731ceae5cf526237e5a88b74646ac8fb94892c4f4c5981b83e6c07695bc3d6d23554741b2d0cd6f27760a1ba869c368c2fa4c4f41ea5b299bc2d720ffa56ac6ff30cefd98d3498bc6cec11ffbf9bdd0ea3dc6f2a210f60e829b9b4f1801267a90f624c857663acb5659c2cab4c2b5126da84c8827f2caa9bb92b921489c20161d26c1fd08cee10e265af51348980a563e801fca01031bd78a93f4815f648804c3ba4e78a482a3cf565393ec59f6e0620cd3f4fd20ce900cb4c3a11577d293183b342b60575a8cc1636eae95ff249d767f11746f231bb680ca73297b2ce5fa2a145aeace1398c9034789a94601be6c28322cbaba2da17de3c95f8ad8d8d37bc6f4ebd24182fe2de126c2bc235bd0bd5d11cdd8e67010b9a6fea6d7b99a2357e4b5925ddcbe43ad20aa16718476adc34e162c525069eba2d67e00b33f4d27d2b8684eba7a8ca5e4e5556e2a8ad5a0f49a8c2aa06320005482b557da9dc63cb78f994d4c94e7e89021973198062b708d6d56d4b127fb5050b4c22a99e9f74ad2b8619228ee22c31392596145b218870cb2e0226398dfe3fafab1ba5138c81d73841a0a9b1df885f2534efd0cb30d1fb458b9e10cd1ba3d1981c95bf80dc53df14fc3c4a2da35eb5a0244699b72ff880cabf9e0f406b24759b673fa971b02cb25a26cc97122f6079667326cf8c4f6fb60b0f635d85388facc878537cd4dc2b3eb573a9ded2986c29abddb55f95eabf03fa2e926695003746528e3544a2bc458a5e0cef231206aa17b7e25d2ca9ca71ffb708282cb7e58097c69c58955834b52b78a31200dc1266df5c48af36b98aeac2c5896901785ed804da3213c476c42920ce081e982b7bae9e43c4a0830905ee72d835c7dd937f5dc782df60a0e920b918f120ae747d0f1dfcba331e03f9d494e9ec1ea1c9274b30782677d8babd4df8bb378824d47fcfbc950d9284315bafe2ee04be42837cc714153518919b436d11cec1998272123f2b9bd7fde7a0219bd529c978ca6b0fd6e67b7b38921d31bcd9d344b0820a7c5327c812c38fca8cacba43c3cb0f75a40530addd8fed844d737d9875be3d35f70c08aad28686f80b4afa471e71535865ef3d1dbd45a705b8afb836750c84405fe0b2278c1ca8f55d7b9c3ab6169d5f79f6cdb275e9367fc5224de58b22b6b07aad4aabc28ed9ec6e5a782a4a2d24f6884e3951f36e6d421ca63a06569fb1808f307b876e55f70c82a5141d6f5aa5d044e6f218321921b58d2150e9aa931555d4dcb0a49d4366622c09937002f02bbec5bfc5af57086c642b6a09c87ef281993a5196afcb75810f01426fca5eee5c9b5542f8f80194bf915974a22c30cc3e0e7b29e9ef859008321c488528cf69c48e72093450e5da32f1b2bdee76744b5cecc19ba8ecb3a11e3f9bae4b7418e485f7fb59bb4f102add231ccb8498f778b3e695ed449a7d221198faf3d4a93f79da56dae47365b207e8049d61bcedd61347e18a76fcde3615d1650e7f03314f3a96517b96a84e57083c1e855dbb7f6e52811e94e9e7179519f987a4d10ba9c54d04cd4ceea9a0c3f214da906c425026a804f1d48c93587236ae5a2d99969c6a779f0723f7addafdc58edb8a152c03044846bab4ef099cef39b852f46c5a472e42008b18b988593ab7487577c96d0303794e8beeacd4b368802a6dc16e2fe4133b302c60fe46cdfb5fccd5c76595cb7fe6d56344389b248f130633aef7f6a1cc273a9d97d06ffa0d675a6b138e78cffeb29b421c0df4eb2ba38f12b39db3aaea8d5d68728c67d4672ad5bd3c30d3744927e364a7df0f8c7ab2842691bc85ee5dcfde3601d06c925bf934b544e31d448831d4dab8c1340fc177388fdbf95087537df536a0fbf8bf59de6dd5a738d9dcf1b3babf10867946cbf9db4c8eaa32b5588226f9c113b0653022f371db1fdc3246093c701f8fb6c553fddd7fddfa4d53fbb4cf864211ead3eebd2496c37e7ef93e87dc06ffdcc5099127e27a59ac56e340cd5db2281057c9aeb3d9d29061e4eecdde2d008dde8833e223d371a533659f74b1dc4abe2c729b0426261c85bdf6f0706238b49cd7a1defe5f1e28c55cd3d8d347ec5c661a063ac84142bd4733b2d3ae044dfe5999a7678142c4a7f28be90c3cdd9eab24eced31ed303046b95888ae4d1f88942960e354de4a6324b039f7ea8e165479fc873ff7aa5504fbd71b95ae66246eafc5f69b004dcb3209b94367f0e81a0563028bdf69821046290d2b0f9258af46361712d13d632ff76ee18cc400d98a0dfff399b693404ea94bf98ec020a0aff64f483e06422c14ff919c1f37b8192344519499af26f198f03b60a225a01ddaadcebc2389deb802420c4681185871081287ef99f504c456622f872a534fdb10b73b1cdcdfb559e51c5e89c0b1e04ab1188a2f299d7341c56d49a0eb713f3780c18648af7222b18ffd357f2e81f1ec88d11ef596797730b31aec54b0fc95aff4c9158c8c4df5cf0aad034ac5111c07f8330411d8797b811daa4375844b0b19c668692b2331c7aec104077b22fa41b90fa80680d550d99071879c3ffe240f9ee692b4d12163439e6192e6ad8e6612062c1b0aac8dfa10d7859d2ccda54fe37a7a71179614bc8f6ab34582e73df82061ea6863e75a1b3f008eb1fcecced93f46516d737ad3a372e71bac837405d0bcacf0dbbd14ba5ff82736206d6d2ba9cbda7e7645e48b61402cf4003cc9bdcccaa9b9b8905f2e344e80c40550422ec2fa3c11d2ef94db356ba54fb3b880770d8a902da67eea4e043aade083f1096f4cbbbed3467c7f37e6f3ea88e76dc00d8430f3718199333d1f3334f5bd4c36fb8a39e673180baac5b399f36f7d28a274fe0e680ed6b73c9dae5555ac090796365a2eb98a442781bb06a8c7465c12bb444a77eb2144afd882d96c2593b1ea6f7cdb3c1557bd5ddd43145ddae3150ab3e7f2ee9ac916716f608da945dda524e3362004529a79077f2b5550c6b4949c8d4616a80f452ca9730f3b0c514c9d18a9c1fd522b2f4fa09759165b757b85e96604d625c55c197cdfeac7eb845a8a70a8712e1040fa1840977b33120cd2e38fd5e5840dd97ef11f8a7ac1aafd62bb08eb2424b1c5b8091212fe316addda7cd39e6d65227455c72cc9e2931526641916c3925e59f3ac72db1c2cba568f6901d5afc6c2ba07b775cf2fb02292e74419e0ecfed664777c9584be8bffc7f0f15f7c23da50474d35ef688c80a213319ed03704e5934d0ac3f29365a5fd8c56c6d43a9d345fc115381529d18809e36503a34a698cba17c05e62eed18888730ee59f39cbadd7dab731db9b6f5c1356dce30a754c3da129006865d9d7d3d5259f02278fa58446eb935cb8c4c1985cdf66b59ac3497a194d56cbd7daa1c6f6effbcc67976650546764584f94c77161c501c8236945e73c7181914982a78c950848b344e981df34d612fdc59959874a5df76d841d503cb04aa0c330f6882fa026e11b78f3ccc589ebda45a427dc549d06ccf9cb2ed7f8fafe0754e2663f0132ce7a2f01211a0875612d0296f4d00119fa3deef50e698078694cc14814c5cf5a23ee30a671ad2b7bfaab98a64c0cfef3994fa7cd45df0169ea2feb4c20c38e8b56405fcfc311c78b315bcc16e88d90ebd33df02c904629e6d6caccdd1bb8fd7cd709c030d7f7f25aba5086dd2c94c7baed806fd7220b219e25775576f2a9ccdb61cfcc053065b2553f33b776a9c1cdb15c092efc10b8cd4134c54dcbe5a25a1a2452985ca17d2db59580218a58e0a7e6f8ac317ccb3d05092370c8e1603b5fced6e5ac290dc82987775cc94cd1e81959bba0183451935b8a08ca40dee0e9929cb3e08bb56cf8cf359ac93b3d4423e9d793976cee2d43073fabdf5f50a1bb64839fd8dd2bb41e75432a4ae1156e3cd3e17d332119e8b3c3fe1c5457b1afc29e3191b5a213dd407a024c8b5d06c5cd43939b7eab2627e605e47a0f4b1bf38befcc9aaae2e8301d93db8c9774b06ff281b8cfb3a31bbfe12bae1d0384ebe892a125fdff1f1179400ffba18fec4c590c0ccf9168315baf16613cfdaebee515e27ad8b958e7dd02a7690ba6da14338c8674878644d9d7d4f8a9a4ac76645f25a50783ac964f57fba697c56432e0a0cd34df724a647d75ba7948791a46eacbcd3d6fc211fcab2db097af1315919613bd25e88a77fcb36fb9ba58ebc0231007c540474ee5c1ab8d2343bca3932c4a19e5a6e47a6f8f6df595f5349cf7650c9cf1b8d5622e9d7d5fc2a0d8f4896d1b525f4313f8dfc542e0c3e69efa81a010d449cb29379575c233030426cef0f8a7c0d9b0bb008dd1538c915f6f8d20a355443fc359a6ed518adbd5b9556506d50c8c141a4a55acdd74fb2d6aa8363e8d8bbac961a9d7bbc667a5019f1d7824226e6c04a56b52266ffc6a00789954a592020807a38bed504e84ceca9853ef26740e1c10e682f4623a0722b40e1966a86e2b482e99e08abcc77bb139e2f288175abf4925b164d66e4f4b403b1a19dcd9c069df6dac6645fd6aa8aaf602ea4034d00dda1f26e25b96e680dc099f463224c0053807995f0df08e064ebaa2a65ce9128fce306fb7229e92d7128d02e046d4c5cf41ca22e65e7ece053de0d8dbdae283381e0c03974586069ee9e3e0ed480d35cc29c6a9774f930129e7f6c24609cbe3806f3bdea707c44e85b4d6148f96921a6696d972849ee2734e91a7e1c1fdb415056798e28ae1dea691757cc689166f5fae29f23d1902247b3c4305044231065934d833653db620878146ca2ff86701509fffdbd28bec3a988fd72c0a45503213305c8b0ca41f53ccfbdc01f206ea2ca45efb34752693b8caa5d560367f562309cbd176779418485576b9c0f2f02f361da5d8a59aefa6fd30cb9851f0b94e492ab383ebc2ee496c8ac6e6655011fdcaba0e6edbd5d096c82316a5c72eef18b08f3754d84c991a94c37f857664a4f837d2f0309f19317014449a070292275b59b0d039587322f8d3ed456bfcb5a4ae331f7bb05a8b99625e8e32020ca9134bf1504521e0227329c2e0e540fa32efb46246eb024495f5d21e0305f04ab79d1d086c1c76226d373a190e5aecb1eccea1f364d48b76efff816c0cf0a2d782d994fc1977414973ccc3b3d29f7c103f227e34ddc1f336791851bc5307802b12ea901dcd3a83eed7cc020ef5e4be42b160621d24e0185b5ebf4d94c8584bb29930fc0b462d7b736cccddfc83bbb8903b44d7d3230fd818ff6efb15640d76488bb21dd668578da725b1bafccac50ce0eebb7865ee073d560aebb5d0a27a391ca598311d795debe16ff9c59626f014b616dcfad4b20221346f6cb6d33f148f0bec797d72edb2ebc8aa9f09dd7390b6426be90c473ae82a4953aee53be797d2789ad579a546ef0caabb5802cdb737cfa19c0638153f3162152e3354b3e7fd59220f8c4017b2ee37f4901b5fa017feb630e944879ebbd6841b996142568f4d8afd11f77f494c510baaad73cd0438f9e2969c751e64110d704b84b48e797e0ff4ebbbef99ad7bc49cb06acbbca7d13a636a4d2c558defb7fd2712c893149d03ae65177f7ce3fa180d608a46213edadabcacde781224f8ed955bc4821959fd5e8b4da2a6be50b38b55b53f24029babc77bd051178e5a5cdcb97a218d863e1185dc3f47f51b03fc3616dfb0055f26a726f5d029f622ff5c45d5de3cedbfef8f8552a0db994e921569cd7086ca83c697e8d798ee70676d9a04725717b9259f3bb0779e9da2cf6bc395e95f7cb0078894597f50554a118eedbfb35f3fd7c3783cf9c821f23ae156061a34c3850ef377daa909ddbbf5444547bf90d43c895a77e994d569ccebf9f20ef532eb129497d5c66b0cb1427b7ba315b7930f070d5625fd871a71e3035e652c8298339c552dd25f156dacaa4d5822e8bc8b8bd15c7fec4932d75b916c3af133a04631ed6275c35fac949abc1497ef8bae156208e5658ef9c9b5356848b04c1ad5b90a0302a37d270b6f779123ab5c0b61758c46d4236469f97522fb4f9327f6dc735737481eba41cbbc4882660edbcf3e22607d7dbe5d4c089205571a888b478c74f4187f57b36c67d8a42c66dc9a42c243d7d1dfe7fc5d2d5b12abd4c388c6844e126dfad587aef0c53a6816b3f350e6edc6b386897ee11d067e7c5de4a756477ad329d9f52421c9058c58eeaadb2f327004d05e24c4277596c172d7b47a4262c16eb77b4b3c8aa887245f823395eb39be5505ad7285e9885b91a9eb6728e108fe9c875f4eb273c253cde1b5f62037b4036d8e852a5fe17ec0ea3b45d236f4ff95eb7773c43dfac696ddf7839fd6ebcd458fcef820685a687e83b33dbafc6106d3e98934ba6559d2d97a9cea9bff02919ae05bf31fb7a924465bc89bee4d7c6b332bf3e31f5508a33b0338bd8aadec23e86f307dc8105e9a0edd6ab1cca287d5092764866307d75daa78589277412f0596cf8014fba762600558d37c5ba043db87f78a41a81ed1d2c813d2003e769b06cfdfa5bf89ebf769422b9eb8575fb81821d7805826092c8494f0d8056f143d5d9e015ff511cf585ffa8846ef6dd60be83b798472911c59879ca3a62bdad064f53a017a113a0d2e00c96f0638697c9ef032ef2aa9e34c378561b1f07cd479b89950d0327140536e527ae4fd4c782934383a413def6862b92e4e7a8840e08f0d8819c8fd704b4a2426f79c9e22f6a5ccbbe717ad8f8b081568ca4d864842e74f56998a55d70ecbb0a88c2d9d3c7d88741e7921e85fab0af173ea94394d5839d889e63e59aa76ccd5192e9d063882abbdd3b70e53cb8917f30409194a077b265c99200224a861a455fe137516d596364397b952e11b10522bd69fa0947728ac92827fce17139e2366e5993d3dfef3e3144dc1c48e6d104ace3cbcef252964b490eed70dda671bbd5fd942a23060439944881eff85d79b995ac0be235cc41f36ca47543861eaba8fdb133f5df1c9a02450097aaf7911ee1396beed1cd750b5439b5fde77c91758facc3f42dfb3857f6c0b891ec729e244459b6dac7469cef6ebe9608fa19eee5fb84017f3e407e1ca3c2873a0a89fca40f98f04fef4334d81e8c27bcaee5da9b3c4b60f8eec8a56271d08f7eafd0ac3aab00619633f9489aa839db0fb31f0905c86b1bcf0d84d40fbdb05432bcd031181c7adb291db1bac22addd620573b57c8867365562eb6c1c17aed1f3bc1875af22559f9a075494dcc39951d3d005ec3827294a8188f772dc6a45775d0dee4dc8921d0e112afb406992e04cd77bbe42d40f3245701b332a73b398197c7684cc0ddef77a23dea75dd48cecd69d872dbeb59891f4cc0ba27a41488421c1ba218985088ca17efdc28b7c7fb1a3c77b78529a59ca1bb0816e9e5f6ec34912015158e4a5faa6572c8fab6ac1418bc184bda1c1bbd6db38db6e03031d638301e8a023d224adaff03262cdc4474780e1a940408653c692bde88c8524127f0a33262155b569483428ead94f0e258f090c0eee10bf6ca20a682993079a49a44dcc028773462b1b09a30e11bc7ce10b8763e5f84ca9cae3e61fef6fcd7ebc3def2d181c3f5b655d33e535640ca6de50e75fe7fb3d9b63b18169613e49f4fb8ad1f1f388bc6a3c83e77498b93da7eb4b27f08a86b057075224afe23f3443a3166bdb511d3b336f0ab76c4363b7d83886a95912d5862b71c762f53ba08158631fe5d673e946a60efb5c298a4715ab0ca809c08595e30d4005415fca6581e67d331ef77a73ac2e42d5c2c98e1030cffd93f4f3215138dc4179c685cfbea653beaffee3b242717e2488558822ed23b3bec793826a942f6cfbf564474e41a6ebb9029b0989b2e75f9b978d84d705412251f04c03ed1699cf78e2a92d2f5160d4591b8ae9866189261fa60d24b1a12f5028938474e5c3b852e40e8ba7a6764933ad377f485dc22986e86cf39e85c2b953ce97355ab0a207e83a102e79fbb5a42b09d748d3ccd7dc0586d3798083ad04dd95295d4e5ccb0dea6e10dcf573ba512e28c830ca7d2cdbd4b0871654b7ec6d2fbcb845d37a83c1b763e441ca7bbc3ca2b8dbb1f97ceabf6080b3af0a984e72eb566a9940077452777e10559892688657d0bf7346c9e2390a65fb1d63e18a112c9c87296e57302a86daa5171d6559dc885d0562e3a0a37483526db0e33be75723d71ce735bfedff673c350c327e8fcca0da9bb2662395a2057c0207f13307975cf4bb4beb84ff9f3411dcbbf1eda768b3d134d46cf82f5d71008cb2611d5d7b3a74b9c261be8a2a88b5db01aafd82d17c6a5f8a64943e53660b08dd6ed964cc5e7d70425b452e3b9a15c928b4e731a6029cbeb489180fb276155fa789785a91febcdecb94e81f5aabd0a271e2c8f88839ab8181733847ba30bf10aebb35a564555be5a382067c7efa378c812d1be9760303db8fb49459d69d4409a649f14ca4347d3d72236ab7ccf85caf44ecd6bba7e6423c4049e6c108dba27e9709f8e1482567ff1171343ea164d0fcd5d5112394418647d98d3fa72cd8b3f1b774c3255df1eaeb7ce4c861b9bbb519900d828b07c9a57e4b99c1cd9c1699bb9d2739c43218ab040233dd4cf8b08bc424f41b08e2f6766425d1e854dd3d9342f7cf455a8b2268824331835f995e551d76801d397c69b78a2ccfbba4b07ea9b4d41588fe1b12786018af9773ed6159809b4446c63845988521cba20449a344ac78d2b24604fe86bf75dba2f799b007cafaf2bcadc4a904866af6d251b6acc67b5c355092b7c0c5c2ddca2983af9e9f042538080c4b1ebc635cce3f6ab305ce81424f4af5ae898f44a8548e1422abb0361ff86ab2d6ddc4cda40ba423f8e02a6424779d49c519cdbfc992b8908c384994ffecc94ff03f888b417171018e4b486862513a8b32144e17597e58737b424a87094164675d62837e65bf27febfe32c886af9940f35c769be8c3fab72e1dba7bd0a0ce38a0746813d8ed234e6091d545cef687c1c7e04a0811cba0907eeed0869ccd99fae344fedfb467a741947ec1ea50e6c1be2df2fd55aa6a0c92705c6f4ea650ef51757a7cadea11c85698f4498adf8a28f0351c3668f72e18e87d216f3ee53bd927e25bf55face72652ef568b07b2eb3e6b855eb7133b3f56afd390cc95f35d3e3e8ad922a272abcc9714f9880ce872613ed8abdd52403adff8d778d5258db2578421747a14780bba95f2a85790fee551777ab878e6d42270219dd56152176333ad2d73678b3bd6a7cd6a091f135aee1955ce18e3ef465ca9507253809c155767868c6b259d003fe98dd0bcfbc5c43186a3c8af6e12edb680fd53a14004b354556feb15f5944d32a2b56e5f0ccce7fabb04746d8093a18c3825739385b93eb1a23b4f75a51e6ebac37400523361d571ab3b6d5df5c140ed6d7ab91509e7a991c5bd904daba2f17380d4375457fa806460606605aba62bdb0f323feefbdd09bbc930d9e940582a122bf936ef2c62429f7345a51345a1c697513cd44feb8b19f3aeba2a334888b0f3b07a18b0d26c56d51e3c835d8a1dfbffe9a77b3cd6efb7f0024bd616e958dec622e56832ca1b5c19b5d2ed2df3feb8f831a6eab79c3665dc982b053d26bf533efd6ea7fa17f3d9e5811fe6e342b96cebf3260cca3242c96080b3330fe2e072d52337c92094cfb4b550a803e1464e8e52fe4a805141a22d4b9eaeaf0e0e47e3a4bfe8b8cab5c5bb2c1ffdedc714921656cbfc17a61e7000bc88361d7bfebc10477477d076636f1cd0bbaae30a62280278cfd6590b491353e788ebf5481c9fa9cc9cc261169296ec4e534035cacea6d350411f01f3ccae5c65e4b601686fa821c1825231f8bc59a45a2ec1ca023e290d5c6c097d0f41dbf612d081e359bb032e3fc10ef78280be9e0f22029b0c956ebad4e09c6f36425c1f82ae968d1828824d1546c1e1bfe1259ced742035697c45e8a1129b2e1399b37afa7bb4c74cb15e3bfaa2750fb50c3d42603a763be2fba92653397c46a973cfcb098a36acd4d5e27dd1a048159093d497d7662ee2f70b760b2d8324f4a65c947da4ec142d9a4196d9ff46087da0787f88701ee1749f76f0b045ed42aa87daae1fd63aec8cb96b60dbcfc81843228dfa652d006fce51a1d630b152639186e0ebe20185ade3f7622851e60a6f57d8ee2362be6fa8e1691ab72fbe849d02617b521db3a2119b89420ccfc6b2151f77aeb918da1f2c34d3039450427e730ce9635ccafd396df528093f2c68f29df2dee82d01265f4e6008b5cdbef603e1f26761f6066f220d857cccf803d981119e26dd9dffaee9c893612e47a4e443d7aad0a564948d05d5b1cd82aa33f47877e275c960d5f140690eb3378fb5e1455f5ec28dc25bea5e74360fddd36025fbc1f5af98b2ac73ccf1a73b449aa51c3f66ef5a6e98e4c03d28a433eb6e703de706fdedaab590ea44e848e37542adb91ac76dd95aeddd276aaaddd384e20e57fd3999c94266f1f52b1a6ec959540b7fc97ca0100c4e98d1cfa09a25b0d12acb2c3b5877612123675236aa23386880912a0983a9537d8c5c509ae64181eb7635fcef40b11b10de19aff8236c1129d0409f04c335c5e5d3335f68a0bb2b14eb883d4b4871b11fbe5c080c13e0a2f345e49b7a44127f6fabff086ffe8540dd4234809add7bf22dc4e931f3464e0ce92dc7c72f9c193d10f5a54857052b52487c56f32c61bab9b8d36ee1019e35f1a957257e2e96261f47b9dacb691252793c5b03aa6ba76589ae34a65bab91332ff09a37c2feb166cdb8a04089ba549673ece69773c7790092f512ff7b33a9c283264f50f8be9f7ce44b7819ca374fad56a8e91eba741222aeddffd5d81c0349bbeed207f6eac672d378b48689a15add113b72c518caa4101df96d3d0685d176434004793bffc27d95fbea594b6822c43701555f9c3ad42b06c7365639fed8f43a6acc8d674ee18ef1b85375cc74256dca5baafbdf5039270f321538ce5bf36258cd915b394fa5b629744ebc2ee438b803ff4a8977c4e0148f242b6a72558ea64293c28fb061465744e5dd9382d6021054e2558b5abfcb3f285b7bebf5da2b8934024eec1e8a2e2759db26f3cf877e701144aedd40ad6dd6d22d6dcb0471e1a6054d2cd43ce97b038c59f303010e7dbd90487d89237b3065a23e4f524bf5d7acf2e8d5e792c880929f08335350402269a339aca95301ef20d0dccfb9c6b6cee7be83c5b1caea44b649ea77911c7f646ab3506b5fd96e7c01d471827544e5952209aefd62b86f01cfb3f675e3434d8f83f742add60cf11bac967d610b52f992d4ed2e849f2f04a6cdd02f89c268eec3d8797ca85a9b7e052e067e477c1fdc40a050bfe15af545561673c12f6dc28773d6ea13597a6aa1e786979d743c1645ab21679ca3c4603ce7324cf88ae75a93e8677a06fe3c0b5760037f2b0dbc26f9f60c5ffad9447d8664554035e18bdccfbc7d31389a66afa38667a9af997f0e56d59c39e19a88bf678caab7851c2b51395fe4850a74ccd23f62e9bfe385c818da135136677f9e9f2c507cd7344bbd7401966a221898b90add6ffbc0f9a1cd1b270efd668d2423aa785824cd7c1fa27df0f7571dca5463adda1fe7f75fa283b4553626473cab7ddaef7fce947a6f717c116d331708bd6d43e756375da19ef5024c91b270ff382c5055530be6a9b55bb50fbad9fb392880f5f7edf2a918932d69313ae7c7287620b1a99632307a8f1a9534f0e35f2fb1e9673330a7a7ebe0ac0e07ddb6b8f4102ccb0bc095d0003e712388f75db445b755b6e96042872bc9742ae33d605f22397d461e7a82ec672a3d15300bcdca535e90817732be4806f79e554baf5cb633252b7b7d2415997c5b16e0cb3b8663760b5b41fe4f9a7dacf68568b09c9e23338dd2bb6050db3aaa02807136eb54c0d6ec504c30d226f0edb67da41c0320ff6c2f42a7da444647c4eea86bc8537175e96edb470bcd9ef9960b1c2cbbf4c0ec044c37534c7cedd13a18bc09f0fdc6f270c536f23fc41291472d110cfe167623b0292a628727a18fb918c10db64b8b7fc46786783230235dd4399056ce22c7fb268e2a56cba54c39bcac0c5a91ee23a27991f9caf2fd8a5241ad471360659d5f114accb2420fa97856384118bd705d2e93c1ffa0480c7aa90cf0e905fa4262f54aad23c0e4afbfc84841df8f1facf173c63a8d1ff3b2bf33d0c8458d3fae6d205d0cd200a9833cf47ef1650eb2505e473c836f538837c55d36e1ee1c51b2c430f64022adc9bf901b4097038344620bdf70e8b1f1f4585864df4d761366ed275cf62735c56a48e56cab23d6af69b8c1be7af7111079c645891aff32ef5810725a64223e8c5b39ddf797aebb12537e712b0e0584c722a5c350464f9a23fd5f46bf3c96cf7ed062284791f0b2e765b448e107a7c7f2330eac1142792811fc370f6b986b3716e4c4e5a975c8cbe65cae190627390c7b948d87629a1dd9e164824cad1790ebea6416d6562eb8a79fdc921192e35aa5e46ea3672d01c02f4c114432f2d8740608f8435ed314678a947addbea8fb6ecf0d59459174314ad07e7f129715838fd381deea5948dc1dfa7659df679c671b8451f75bf7119687a7b6c79632b514d76ba1bdddbdae404af027a73ab195e1cc5e80dc4285fbe9a6a341e20d2c1c3b4b6237a1a20afe50ff995d7b67941913319161854b39d68fbdfcef88c8f8a1ec6c80e70ff58ec6e473a810d030a6e7c7bde7adb2390fe28d420d369dae8a96e3bf927f71447ae1b07f31138f37adea3a27deb610c7ba88f293ba8022b9ce15604c45ab3731bf207a232073fa6e8835afeac32b10203219e5706d7e8a757b5c482210973114c62818ff348a079d65460cc4f0ae0f65087acd7c9a5e47842f7858d133543377efdd55da96dd9ee0470a223a092d7a2b98dcccbfda49561ce06c93eec50fc298e60f401ff32e1526de5a8e1353284afafdba38269494ba8797299192cd6ec6eac34c1e5b2e619cb3a9f0fad9196a76cfe2aae802326eb0a283e695db6fa15e94ff0525c1a412dd9e7403905b23cc289a16cfee85ed0eb45e54c6986a2cffc9f03371eba6fa0e64541813052e340c44c1faf1c14826a65843ead480e4293e100db0ced2047dfa10139492ae27a4dba99cbc92f7c84a8b50e854bde8729297762edaffd7fb11d93d70736f44e2029de6f75f6f6be45073f67c21d1aa40006b0d496297bb4cb952e9d284afe23fcc81649399551961beac1d40f93a5001fa32a18944cd07dc9cd7c7f4df9ef2df2cfa0ba47944fd6641a4ed0b90763f697fdc21cd9b003f37b105c2673c4840abd6a84354e6280500d93313c5e2672fb2a5d3232644b1680be6f1100d98317d4ee54c963fe6be7e9f8d7ea0ecc5abf5184457765d4d1b46a8e636db9f2d97d6b6d253e1f5ba617397b95a8a12c4fb3f5db0e5ea6a3ddeb2876aebef29bb9e12977b05d37ccbd412a1e18cd05c4cbf29468bd451fe225a19c015e2fe89183ddde8337cabcc5e4fa5571d5504053124e81b9d6560fa77ac6d92e9d477f31dc88a63ebdaa75026557cbb0f110fd97558f82bc2eaacf6d376d5df445e0c6fda6e9b0962733b6b982501b06ff4d0ba6ebf5446e7ca2dbb6ed9fdad74e1aa5a1a12b89c6cce3ef11acc4e7f201a6e1f2e3c3741167ab0c9724b24a6d4c4aae13d37b62449c888aafd1abd54da6fe69043ebd77692b68dd21f3b02997f9fcc895f0f6e6b0333fad2441b61bf623ee32bcae56841059d783dbd9f1ef78f3ca3aacaccd281e9b0e09c43bbce3455507b22c7e74884ba65a6a45ce78356f095f4efc1c0ca3810b9b9aa06c6568b7bf90c3bd8f30723eddcb4566cea7bf2bb28a4d795fbb9a8e7f7ca978e6d9380b680334e324e628923e8a5d619cfbe272f45c2370b698faddf7db96ddaf1543476ae4bcbef68c7229caafe5a840675f8273c6eb611a369641c6e452fc22ee7aac281f131af9b5bdfc91a994dbfcd878b368c5350caf495b23a1f9451a11a384bd44d5f9881c0a4b5e01affcda4dcfeab3d70acd4dd47c1bd24e0fe3ad17f9e633cc29c2829103b1e7266362d782c9545a371de6623f6af70f6d230c9f37adfa19d9ffaa0a7d7e89619e7bc74580042eb10e0f7fd96b9b6fbf18f7acd0d88989bf41a6ed01ce19c1f394215dd82992e54c4508fe69f347c518482a68c712863487031fd1ff5a974bdc5b1ab55654174da6f87c83fa7cc3fa95932453d796bde84da6e930668c0ecfb237a0b01819309faaa6a8c7dfed0fffe81ea5c8e11e4498f90e8449246e2f665148f55b51c3179d8f2e553e715285e8fa570a41e14d5848e0b6f3be619b74e0cb039a97dc74857b83adb3f1803fd0f5f49bef404729e1309f93748b7913fe70575d1b718ab9bee860c869a815727fab623ee69462eb5446be3825ace4254b4ea62da0c78aeea484f39f248e44647d99e80cfbf6328b0ad866afae98ab5cd6457271aac4368f589c6196825da1dd07967b6d1d2cab633000c0cd4b95bc42fdb6e5a768755e1748fc05ef0b54e087b1123aa39d26011c6a5177cf037484af25354cbadf63c27bcebb87151340028dc402a64d39cff8bd6a8a28d7e216a21c131b1dc3ecbbaaee89b4c65286704fb13a198b491f5f1a081300dabe2046f714d5934f10cd34786cc4dbd75ff5d4012d786cae7cdb979cbdb3b9ddee4ae184e8adf0de8969c8d58fca4731984bcf11746d1e58a19074a32cd58f96a678fbba56e8e72a9d017ea3eabb177a13ee3262650304f40d44a0e22c8c9aef327a8c17f966d1ac3f13ef1633eb7f8696dee446d994b34a4f789e057e4ecac354da6298b5d0dc514cb4ae975c273c79ae535802a20980241cbcbd21b29bec84fc35d03fd4cccb28c75164ce9ac54da771bb368ee1978ed937276682b10fe389ba8fbf6bef6af26f46b3e4a0b9368cc41b4745b33c3756c2187981b748bdc1a144debbced97b3eccb613744e4c0685ba643110c441b07ba99308fd89d1708ed518697a0a71ca0d038691151ead9e8e9c016dd0372c64d560d6d347e65a5a715105ae8062b5f9a23003adcbc83ed95fdaa2e811c9c90b383317bc564c763155b46419be444bc953a94aba98359a971bf9ccc7305054a19c9b498fdd0f9b4276bd1855a410f57c2ef30b4fbda7993217f9d31bdc479f88a72a386758037d87455ab7cc6bdffa5df1e087f03a64a76bd2ec4736530c896110edc8534255a12450db49e7909462315297e6b77034c6803e3078be27385dc47ef93bd83e4445fd6eb09c26e6a7a3a94757607eebfaa197b57a0f7df8e24c8ccaeeb3d81d31ef62b2cf2f5163a9ccdcfebaf569cdca251dd69f6a3c3d55ce58ba49310a4825d2ae36f51c3da6760eb867831f90d12b2c5079c24e4656fe089187280095f6f9f736e38b4d3b8f3cf90398dc602ee4a9ab4e09407b58cd762820679af49549056a6a670e74032723690df9f8b953f2434efd09dde9cdc5eefe93f63fba517ce42a7d9e3200fbb8f60f7e2a88a9175721139e6247ccf1ba68f25d59800645284bc235dc0b79373872a8f70a467ebb0bbef2a433b0678d628423ea9ca11ff3604cf18331d6dca05ac5e4e2a151d7c0db9fa003d19474aadaf4013aa6a3ce7971223337d7144db1fe3e3d92880c85b4ddbdefe6a988dbdd9db961ef9305d6ca067b9515318ec522b263c6c02ee861963c4ab53f6b61d93bda008c686964447232f75b510d3b5cf8e0453be3e6c616253ca86a7ac14318aa5c44872275eeb72ae8b76a752451f25fe1c9ccb388b49e9a6782dbdb27a876341647fe61608b747181045a0b277ea371ba5818bf0e025a22d0c48d137518796b56f2092335dce0a0647ca39bd54c614f0e922fab785eea124f98ba13527ee59952912d7f8e77d63002b1c76c62e870399c6620af897d935e866ae451c2f11e285aa237e6476ac6806ae17250337ef98cb2c465b83b697033cae264444beadf6c55dd3d3809c5f383434cb72be090709c6a1a2ca0d88a044dbdfc08c24cf4942578265274232504bfe15b1e8991f063c98c01c3f69358f6e733b0043958024fd10ac4aa6c3d18ef6b620ba6b8559cb67a6b5764319ec8eda63b95182db93b6d57543d6cdb45a38cd8f132801847ce52fbbc32e4da85dd73d9d840e86d5eec238c10245edf56f3ad40c24386461b02b8efdbe6dc8ea3e3905c47b4edf611bf75a427a1372f7f727baeb7b9db63300e605a591454305c7bae548b08aa207c91ba6c58ea4f86c9e1d85d5b5cbd5e3de85e354ba3f529c35443483e90fb7f849d56b7ff5375b4a52b668cd63111ffe9cee8a9dc93b080e4a5cd6f82241b2c211f4ffa4bc3039cec70fb6338982acbcf34d1641e59d1bf6cbf4dde709aae8653d559ca3c1abb092f4de17601fb354938084c77e46cd1287014722d681e19e150953b0ae3966443a94948c4a9341f784421e0ed7bc02127439c06763203c849758c57d312af42754a691d0764631e0301edb23702767244044fee8dab04ee1133092258af2466c80ee6b2a5a0a154cd65bc78181fc811ac9f7db5209b140242b3cce8556be83c6b17242cbbfaa09578326e4aff2c7f757cdac8d85acd6eeb450496d8b85142aeba7fd2135446280e0430f6031a8a3982afdc0cdac6a84dd3abec982d9514a8ab7629f7959dc63d92d6c8b5f8fcfc4be84e11319819e56fbbecd5312e8440c8ca35b2a9f618151ce550a7055c4d9edfc34838bfbc36e9b33532c2170fc63dac435c8b7635386c4acbe207beb89b9fa1cf546916c4997d6d0292290319db287de73051fb803d1ca60398bcd7a4b69586eeae3923b20023daf4620a3ad6348bb4d89918361092c634f83576a14bfb2886471b37f8cabcf3c3f34df810d4d5272581ea6c5bda12b040139e9b91967b0a0854eda4d64bfb4ef57669df3ecec797b6c199b0c98b9ab159c837807657e87c9a89ef4764512a6abd93477e78a2357fac5c4b6440d8cc1732f0b5a04021167c28420ff77dc95a075209865ef8939c3e76592f59c808917efccf705437643ef5b8eb13150bc88fe8946112cc340831e8d58f8a006a0780ecc730b03be990ac2fb261860072b5331d5366861bb9aeddb0b4c1f42ba7803ab45cb1eb251ffd5241b1b753f25fe80e87b8f29ca558816f0d6765d9ab39b224b05ad8a753bedee48c970f69f37876aa653540e6fb5ffd21335ceb7d03052185bad7f48d7a0e58d062686a5434e905e836671b734208d4424c48ce3f035e2edc55161d31f09bfe894e87f6a7c80685f68740d673d8073e04cf208822d07e3a4a9fb211447e14cbb0fd9079f246500c55a6faca108e35c0a1283db9014b4a18eeb270ee247fa970c69565bcad69a16568afe21e117fc9a24c50e56480a89957ba54589e2a507a732bcd0a960824174aab3fb53c3daa1f737657f49e2eb99e4b4083b78d1641fd756d54fc39f9c7f39e810f5cc5ec84b159571971c03b13df8f13fe07b7cc741c4fc26ea16e335fd392e83af1ea7d6995f11be6732bf3f8f21bc0d82fbfaebcac14d555001092d68693dd79f140bf4cd8bc1ead9a0766ced4df26061ffecc100e32af5426bc393f257330870b6b6c24da953bb2737014c7ccb5edd32dbcae68b93471b16b8ed17cebe672b801a239823c26a2c62d4e493a31d91629ca88fabf6bfcedd360442efb71cbf406308deae7e0b9ecfec0d90c18ce16defbe9148e6338e54f99fb307546a62047b5e6bb38b2fa6fda8fe25d326a6c226dda7eb523914a616606350951a27af1bb4ec94a2d22def3e83235211c7257f8c50dd205329d309cd9827b9bf48341d20a93d4f492b1160f271bb51e42581fcececd76b2eb28b7e8d78a59f90e15a9ebe4ab2bfae5f9bff640379542cc5f36bef478361910abc8483f12b57de4866e85fe6621998932b620f76e630c615fb7e205ac14bcdeccbe07e661bf39ebba971f32c991fd14d483ab41fdcea610bdcab202ce553160b7fb39a3169b5105b797d6d24537812101d7990160b8a33591e82a64c397d6c4c85227fd220cd1132ae384ae1c5ce6f65f7fe3e177740789a0c0fc72f786fb90eee90ff86dd64416d25e6a77dd5c577a2c8db3194f7e0094f345236745511edf1ac6717e75201c4b7411bca239dba6f0da71fe3d5b8a57aa1eac1712ff2f2229f186e877bc52fc54f650c182aec5655c84e3b1f15b9467361c4df06ce69881a966fb2952c8e8410ef7be9e72ec4f38fa19bf00a834d604d7a1fdd67c947348c4a5002b2d49ce95b15704aa9daddcb7be30fd3c6449c292473994f00710c2225c23ff30039f13c1d9bb5ab406f21fe38565258d282217bd53295f57b48acf03373267b0f28223f05b5c0faa5932e6068eaad7890ce2d25ad57ba8a7109112d505bcf183185d8d179b9893218dbd720c0ee8edf8f4a6396b4ef74ace32a969c86246b8c4a955186a90a0d08785fa33aa24508ac78343ad2e04372ce49ed8d57d4b60e200bf8df7b1281cfa69b664db61ecb50c1c1a97eb798b5263f134ebbb3fac23080d656688e9693527dad7242bd0bff41a78fc2d0964d63483cd6f1d7fef5aa2d24e1f8e4d47643a019e84d267c1d12d9fa5e682119206653179d080e09a1abc646411ae36fd083c615419a4fd527a8ba6e5ca03b76cbff076a036c827f4f529f6ef61904a8746d5514d52d48e3f3fcaa5b8c5b38fb50fde55a15bbc6166918bf8629517f5c3611e3cc260d504b539c13e1234109e11de8b6f1220464854f76128727ac9cc1062488288324d95f5b898395b551f072a55c057cf9a0574e19deeaacd8eb3a6f7b11626e1cfa0913f2832dc713b40685a902a0013546915bebd57a43b6cc49bf973a1180ae723cb91617674c0a77b63aab301bc99bea7668fbd85afc802e507cf3473b26be6a809b903d2ae45195401d3e394cecb5175f3c85bd06d839bee8df987f096dc556175aedb595265f13378237bed0fc126919b53c1d5f9e1f923ee13300a810df54f91ef9916b05efa00342f42a85b8ef7b63a106a528e7b29d95d36c9ccaf9c21a4fa01a2990dc72c260be2ea40ece2d55736b02408ab202e2c25488d222ca25f3f9f23c588f12be28dd381f5153b1cf4f72932ec99091c3c4ae8ba605eb78cd8d092d31e5174997875e79e0defe7f6afafbf9314eac5ef306d8b63baf62ffecbd46d8b1ee791d0fee9bc45284fef53fe6a0fa13f530860b6ad00a9cb847159962aa34728d2c79be5d9f22f7990872f24e6556ed45d6de0331bde0b48d61fd679de44ae32d4a724e2049f57c0e110a05ae43eedbf03912a850d8344dc3f7618e2bd7ce98b510bceb24cedefb9dd5af99c1a64dc32759950151ef74675c57410b2e19d2773a62a7878135f813b754651f4af004a44a1b31d897e39e9ed352eab4ed754619ed44b3080ed9576e664f81e2c6f4d393f4c71a8b122aaf980ebe0839306a500adb62adccf1ebe75776cf03b1c57ba4a06e889cc4fb4e5fe84af3c16183a969d45889621ee6ee8c702d9ffa04eec354282df04dcac76b34f8e44fe1317c9a53f7362bdf80e2399ca8bccdf566ccfa516f4371dc6b18b5ddd892b214aa47d8d93e60e03ff2e179a2067a2d8cfa86c70280a8e563d2f7f0e20c4e02394913b0641e23df1188722c7aef7ad6ef6610c2019dbf0657b27ff6a2abb0a9b699c3a75bfc32894307cb26b2eafda2928d22f727d0d5f6f7a18035a275fb12ee5d27f1579761dfa4593410441d59b2dac0466867602db96096b32e29b4532fb42d56fa26ef2b07f802afe49af4cfe8e66c75887538bfb71bc97df732fe08f6de9631e19c5b79cb91f7de73e9bbc76c636463c04588113b4c8855baab3cdcdfe11210f836bb56198a7672dfd01550286e4367ed532b62f666b36434ff8752687a6371468ee30a847cc96a215794d94c8b9afde0be9dea7c7ae61b37f7b817916c283c059abd9cc1d80be8842de941caa9d356dd328a32c507960728eac655614fc06c24c2b7c62bc35b5b28476812db3703061da43a3dae6a9d5e81394daf5f69c64dc5c1775e4085164d80bfd6ea784717dc4cd975dd76d201705020d23c199dbf4ac059f66a228e0237d410c097e1c216370bc693a241caeb4bb7d1a885a065c82d1fd36e7e1703894cc09acb401ab162916fb5d2a0985119c26ae788ee0ae35521a051cc6c0ae0606db378cc70698a2be9804437cee7844a1634203581eff65b1f36f67e2207a84de971a88576da9c8cacbb2c81ccfed56a99726ecb41ed706a8f88d1e232c3a5d32d92805cc2bb80ff3291defebf91d478ac9656987f254b93b571a6a2b011bc03f100777372209d1971e6eb4942b8866e90a59d87b0bbf62b3c7e7cc0056ec6c0ee7d37e73360bcc57f924236977051acccba478c6f59b8bb9273022ecc768920d81b0a28fd96b06bc4e3367e091771a8e381e69927ac14a914c7c01e1b6c33caa6c289a9ea2108b803195ef5bbf401e583bc3709cee64c78ea231c7e58b76c7420adaa62b424d2f56ce9384c4bad986e61c21382d03bebac60e62733615ff8e4f8ed10d8c706732cb8fbadae53ce6a656afbabc403645fa0ffa4481cc694e413abe5b6aa0ff48873c56c54c74c490753176519ecf11fabdf07a2a6ecee274b54d4cce3e4d65ae02ec84d8ef135f19e4e2e123b0460ac1ee2165c70552f0fa2a4962e727f036e7824ed2173a43bfddc316ea8e40c4451252ba000ed243ee69b88496b66d918a5979e96638a60d68c4f603ddf5cc4add8212997f05e45096a980e8b37d51b103cf00bbefe55aae21b60e3a5072cd3550c5b631e44b6c594fca4e294181ac419b0d4cfc6d3acdbd810dcdc9e7f3a33a040f8c8504613566e240d9193eb5dcec8467c341237e5d59a330d92e13f3fecdfc70d3342f418e2410b7b5aa0606d3afd8457b1f072cfde442f62914e4f7e7f937db96b24810f3347ffa73be879dfe420b674f7204180320e16a7b4354dd79c223c4f4c16d4d6c393f39c0a7d0f8ceeee6af475e954eb138ddacd01aaec23fb5e6895c48207a930d7fc82cb474d522c0bf48d48fdd14d66a1d546ac686fe66dab6411dd1de9acecabd5039f95332f5924eb23c2c9cf6819e042e9b8c0324892351b64067e7d5827715c3aecc214a40439aa68057edc8bf298c16b06572268ad1f78b6470879a30b961333a89a186d77dcd0925d1a786f7c77d76cbc983ff995d1ed351e66c809c3599ffcdc19bb870806c021491997df274f6b0b632c2131c3e8f0a01f04085ee6464d48d2694c899c0a22b268d02336e7d94b0f25b87006db687ae3b1280d6c461c889a790d6f4549dd60e2c37b78a5ce0fa5a1fee16bbf59df86c3690a5c6b3668640b00719cc457992a471602e75283458e95da8462d02c26989de2edb141c2d61797a7449d8a1ea5f26f16e53341836e7f40e0b33c0a5b52333121bb79957a167afe494e142d6e7271fbe87c160b90b7d2e2734bf2181425627dd3aa59b0c0428c3727a7f3398afe20bc3192bd6dc62c49a0ab7d1252c10630adffa3a531bcf5ef6de1ad016ee8b8c0ec74a648a32c4688083bfe3dd3f12c3014f4a2e990647f6993c84e5c3b3065d374babe4c8dc104962f1730a9f03b0df53a8a0a647048426580d7a6f29f34e2203da55050af56c1605655fd9ff36da89bfb0e1188bffce16fa40470064ce27c3394700653f9beed362306d0fe28a88a3dae61927cad5dc2bc46c817b2185c9bdaa2856a44621cd04c6a0f79b63f3a967c651c719a6b0b52a056fada5fcebf19a9f09a2f895256af3b8646b04ef75dd0ff3ad758f1bfccbd15cc69c44e3b4da777f88fb679de02ff7d404d3f601e2970edabd823c367c1f53b98cff5129ae9cfdfcc76a7e2d04cd8f449f3d617e150617405c55e084a8e60d225ff3414483923c0cc7def8385a07463431e05b767984546e11e65ea79ed33c16976510eccc917be67ab399393296ef3557abf16c504c117b2aa5947094c2d9383af98912c06debef29d0439486b41b05b757d1b353086206007ce33ab5f50f5edd5397f96ef536e8cc1cb11f17dea0a9846ea46ab56299ff50d457326de643a3fc12b9153d4afba11ae56adf6ba7f550005ce28b1f539555bcadb0298c027d77957e2d2107f4558229f2512c7e15a49140eebe694198406251f4d9085bc87e7ecb8e2217598fe3e35381e3790ffb882463f33bae7b1a3fd6d6634febfdccfa7a4d70fb40735bc26bd061089caa3b801f5c3e6724c874585c5a1ebe3156456fb6a5c5b9066c9dc115d74646a932b45a9f179e4ef95ac8a712b0ba20ad66321e857fb6011cdfe8ec12c1b52add72dcdc39a2eb2a8358504951c1950f221b0f518f2995469ea216f3d0dae371c4e52997a83368924fabaa84aaf47fe4c101c7059dfe8951908262a510de756f3411d3860ac2102831dbdedeebf386c819f271c1e25532e798076860bde2d04622d7abae84b8ed0f6a3a2f9622dfd852a7889f6fcf86478368510403f57e8830e240f6ce9265c5e430a8a6e8a25993d967f3e6d2e210c32ce359f9a040ca73a900da3492179c2fb4244d0e8d081154f473a09ba12e553451606946935ef9f89f4af20b7b06d0ac8620bb9b4a233b02d75fe8a67aa8d7ea5b5747593f20729ad3c8a00de9927f06c257d629af0c0fdd889f660ec1c769eb8a611dec21c362537db7e23ac445aec449f091ee0afd00da1a3f3ee8a33ac10e8bad4e50cdc06954b3b4e68a2ff71e88afbb188cc58c7e4f01610c20fdb207b1c13c4efd11c99bd9937e18581784c1fc0f696fc026973dc0ee621b59ba868301cabea15030c929728a163f46a44812c8b62d7350ee3c9bd6251fd4062500c1bfdcb9ead439f217871bd2eef3a5c3a8cf1a5be444ecab2a5394387a2272c69921d94189e130b1726f0c483d9b79b9c0df337432748a9e50630e097c055bc21bb617958834c4d05cd43631690b241c0f93c27d5a3060bd65a62feacfbb1201e55c5c35dd7c0a37780383967715a7339f1e0977c3fd503b05345a86c51199f1c19ac0cad9bb90f3641955cee26d7b830c2b93b48691fa564a18e9cf77d2b24d207bdc4263d64db99b656d51579b17d0bb96edf0b35a78ac69be7ce0b0579bc9a4c7fb02dacff10f20d131f04b8b393a42dd4de6e3f9850b6633be3f64c9b19ba9561651de3bcfdf7b19fac3683b1ac144fbeab4a9534185f4d52b7583599122c044fd11055d4b653ccb560ecf915e10a70394c59b8fa0683a514d7b5d31d21051577b3f8fe469230c33e14609e2e2fb55581d9331b2dc5d7233f08da3f52e36226781e02151fade1242614d375e8f5384bff02a1ae9400739c8bbe0a9a9e9cec79aefa4c86c96496b30aa2672f1c77bbfb0c87335a31ea46c250a609b531b0e3d60383f2d04edb1e83ec71cb5b955efa5438bd387a4cb7ae0c641ce70df22bc42d3ec85be0c67ac05a022ab2ffb73674f44a10f7bc0a210b1299b5a4fb653a75df752de8ef606c1acd34ea1f0b07ef20e1657b3cf92be46ee991b7a74034b0098a0eeae3abbd1f1ab859c2837fd55dba9318113dd820415b65b49cfb671982107d4789ce0a27c6ff1e2f36a24e1bb8948f7878c16cff7f8c3900936498914b75373b6bf19866da729040bf4f3cbe1d070ee569a5112966d65d32ff41c701c9f090ef4446309895a68a5649fb4c9e0a647e5032a629a5c210401af64075de5e0971ea9bad565c758e8fcbb5088b5ce681dc9f34819a4de6139745c3de5e2990a335994b75bc3abf22db2658fb2c2277d31fee64621deb26c5e82f64bbcaa289222bbb052f95dafab4eda87a7066a569104548cea2be485b3315f30cbc5f369718b8e9ccd6c4f370545c0ad9e96d48ce6db4c40dd7261763c3780ea2fdac7ead871e4b77491b81b042998923688176996606afd52d87319f6c773a4197cdb5e1b1f476320b18c90e78a6887fd5f351221469df6a1e437774058366b62cd20cec79b795fd5df0472238e46705408d5da516283b2667b1f6ca9feeef0551da2ead5318cf2ca8d16245b66dff41e4c70ac20d19caf75b8e9690f520d8e5b807a8a6c4e82ce52a9a1117cab514b407b4fdfea0eec2de84f9c436e5f7403f3db5037d74c532a5088259fcb3556e53a38c664118b46e718c18f431fe6ebeb2ad9bb87ccde28cbb9b6e889af13fb406de46085784f3c9597eb9d57a1ddb1c1273ce64122d9d62cc1cea9d5c22c91e2a57a6626f774858d5558e58101a4d13e501ba6e50a4ae0b4d99f933f2fb38131041a0fd9f4d61b536dcdb627181edf9e51c8edb6d482c210c3a4b87cf4ed5307c4b17035d05b10c61d7b5272564630480e7bd0e4313ad25a8d976f3aa1a99fd265e3a2b07a853c7508822bd333298b05bc87f31cf533c4a14eb4a55fdb209563c23107f5d42e76d9179bf4aaaa76a12cb1b7734b4aef92718b05f4a89f3dbffde61f99b026d5bf2c59dc1c11ac922655ab6f1b8b9ae88a0d0bf6a32d0845b43a12834f2fe64f95322be6a9018f0b8d3483763b247e5b1792bdd0c2c9a30c63b0dc8a9ef3eb426d6f2384e2cbee741b9082b083cec9ad7b26d1d140471460da31f9d9127136aa4d01210ff9f281912b3befddaf1da0f2005ad5e6c332410af39c8abb24eafe34c7674470182f8c769bec8bd4417684c7779580e389548569a8f6b094e53ab2492cd9d9318dcd25ebc4332ae33f99081ca81ac3fcb73b2f44ddf6317fcee84bf3e7c27584e93e1cbe46140a9814470f91e8d3e1283e8fe7ea6e07b8d06d0194e3bf640f648d250edd803e852d47cc99766a07568b34f0bf50bf5745409df2f7a5a152a6bced0d20dae4b551b615b83ea33180cee24bf7d87f1d28230e434ed956d1eb93e8c141b7100a665113fa027caaf59946edd023a6cd9e2cf3b470c60c423bed8c17ef065f00f692c8530cc638a72e3ef7b2ca1eec24ed4f7306459f8b17596049d9199eca6233b6f7a0e4c8aba22e1d66436cc8789878d8b858eb909dd9f8bcfae53a072ae069c2aeb3fda1176fb1e557b77f4b9a0a07c8e54d41b4c6eed1d5f3ad800bcebafd50bdae63d13459cfc4aabf9e47ae0a57dfb18dada5ba1d5c3ec651f4312eb6648f434ad1ace8cc4c8e96036ef873cd8fc3c3883ff38bd2d664509a057c3ccf77e7d875b372490dcc13abfdeb1def8e3b8b45c310bc69c71d64cccccf49f41c8b76f7da37c1b006ed19926047342eef88c37a0a4f74fc764557595ae3b7b97df974a35c8f05e1ceefa360b5bdbbbdef6f68d86c611fc188e064b48ee52b1d5338dc0620e20b9637b60931b921d13da1fa2f3c7e9f360fb4f7becd3e7789de9cdfd38411eb5a0d470b209b7f73959b2021b99eb482bee2d9f568891a0c621e396c14c56c17fa9bdf0d843b4e71b62808ff524b2cd037e1e9a68e5f2ba7e2241e08c4b04a6cb0d1ec9a8c077bbc34338881a2e506b8cccd18287de80c14c084ef9e1b8ec12b42b96537f555a368dd84dbfa5c1789525f95bddd9df29634a428c63d8c822b41406e832b3a95fa8e74169d6bae0379ed208e9b43b6be07af9c0327888e82decd2c20710e2b83c41825f2b6ffaff9c0416625549e79789fca277b9903236dc527e2abcb84551ae4d045b0200ce8635fe575356a78f8c3b21b4e175044903e54bb22dcf4165981f59e6200ebf945157c5b58a32eda908cc6cc47a478d5c575bdf355dce0ea984a06de6dc1455d8323b769f9d0a3eb8ddae66e84454e58a6df03d926f5be192622cecde83874a146ee784d983b1a507712420d644d5af7732069bbbbd0c529d5040b77c4c9660473cea154e18156f783db8e12902f3fe07ca914673c7dd5410c3c1a96e3255487a4ae4c3999c36af964e0f9aca0db208110cce303dad2fab6a0235942d74f069a337e39b6634b3067fc706e80675efdcea01be411eb759655aa8433a6915f1add31a8c5a7768dcdbc95d22da844f6d2e60687f2edccec9d5a026930a7c5d917a64fa1534bca3608ffdd94abd8735ef80c4356db62200b597a83eeb8a04562157f35314b1e9b7836dd69adc9460c3664e120e1272c5ff578b0689acb2e84f7be75397116ad156e75d09100616171b30f5d2cdea9d50a3c7e998f296ad945d883145abf9ab2b9ae393044276407a625e813a01f98a3e6351d27939e0c03bd5d45ea366544f987e6fc197495beed04118a3516c259f72e06bf384729a4c3fd4346c0315504c5c62998e5bd3b0f5536504644086720f0e5b3731c2836a23a5b7787922fa9bd5c88b8f5726a1deb474fec56dccf8febd4d3a8e6ba1a98eb2b3a331ab56c8120448a03873da09a724b44489f3e523d8e5e387a5c595f334b45ffe85d03b29355dc22e5c84607465c977ee9f90ae979c7e2b703d1149c6216634f3153f2a3874be6f255b97aee19c1ddbb92daebd9cee81a6c8613f5257a67ec4f3ef96a2074c772d5a780e5361d64ff5e7e44186acb67c7385baf81334e7597f2f9560bd1b2e9c2203b19e1899cf6d6cbdd2f7a9f63516ca406cbf2abc7219fb1f0eb7d9eb3bdcd23e25dffe43f95678033c19b6dde87619b8883c9ca227b061fe0e703a64d163bf8a102df1ad4510a98889c23e7739b9164f0f9bcb6e6b14b44b2c74fd68df955c4b52e65b384753dd9c443a8d0f02cee48b7d1211fbb01204491f39dd4a16a6724a863cfeda9e72d794237b1ea4df7e8297ef02b5fa4e7a9a7f1a907853e05df633ad221d9dbaedc74a2643ff685478d6bfd044f96ea69e3c3a2e3a71412c96061665178a1ee44df69bc239ab41ba8504f71b8ecd2f99666906bdf48dc3073002e7b1cdc60e9f266ae720ff744b056932552c0fc6675064733900f030fe099699fe55f6ecb5575317936836a55356f885931da9ed1753afd2689ce1df0b8e105698baabe76a61cc998a1cdd6e5e5d6bf18ebc5f1793ec7ae6f045254f76bd7650546842fa1c45adfeb887818f208c0256c907e96402e3a2a36e759d5dc06a06b8b60f8086cc5f46718e392af2861872a0eb3f7cd2df7da85a472c46b3dfbb6c59a7217b8210d153e4819200f42dcfbac53c8842ba7bdcd9d421c9ab40b9a4498df3f7a41492b9b3f88b6010fae8b55af22c170b6c789c9d8568ecb7b1ac31b8d4c98dc05a8fc93574a98baedf3d7effd0cdf624284fd01c72ca6c860209a2a5f13fc8c776591f5e945bd25865e9c7248954558006cb45c5bebb5b34c994520178cc4e019bd575356a26962030583348f99c6579958c1c5e87f219db7306780facccf3c8f4fea2803515b8f2192d449dbba2cfee4586aca8c3ea7b29ae8ba9680100adcc036066f96634854e8bc0136bb70ab1850c7fbcc77f62fe4c5e453b70b50b1cc0219d87628a14b33d579bd37d5c992d3dfa9408e79cde0a1d2dc7684bcff6a6c8bcec4491da4b6c9f1afd1f5629b88fb3f0b418dda3234cba599a4fa346ac20240d9511c6aaf06c1870572200c8f8f8be002367c1f0bf1214adbbb9bb317f01ccdc76a4ee21232f3a62d183bce088a23b74f9d6b0a37ec905be1bb8a8a2a12f174e8156abfd8327b365c62fe5bcc1ad31fea17a3a50f679fe5a1e0dad4aac579c6c3cd13134b6119acd43e6b7f79b84b40e5aaa2e5afd6064da1d670b121bd5d6b93f0d6755e54c261c8c9ef0c535ca1dd2b96aca4b2d932647e46ad491ce2a50d5baa0ca7c3d4867ca98b95dd051db85f52523793667b12edb348e7bc48a0b50d6ec5d0d7f6fffcc219004d838d5de9be45aa4a65c4cada4fd42c23c5177f254ebad416dbf3087938a548b48244b663fd7e77e5bf8c69d360736ee9c8da04bd759e5b130c2baa96342f53aa60f619e7dafb0a99def7da3d662ad398faf772c1907120cdb224993bac63c5415496a0fd45a6c78cfac63dda03d382709b24e9c0449c683f40d9f8eea5e22ae9221dcedda2328e2861e296ddbdcdb7e0f1dde6c5adc27517fbf81d1c61956c8d4ced0fab823c2179717c78b42dd8e088639c4a2b3836e2f74d038594c43baad4c8086f402cd6e6a46e5f8ad1213c0164c38ff6d1701682be04e11d7d9cee6a670ddde96e85b3582eaf6bbb8827ecfe06f7b74b227d2f8c17db5ddacc872a4bcbafedf2bd1d171e464dfd445a0cc90ad827f6a202655934ee3d872f9783a720a05f633acc90453ca39ce48f8bf28cecd57da0edd53c3c2c9a0c928b5222403e12d26a96f66355d473bdbe5e0f3b6c366b863f0ba6dbba4d7e67b5cdefdf7beb82dfdb36dfa8fe8bf0225b7f239eca00cd6e3850247ed692691bef0b593e63ef4081fe50d46f8a0afb2cf9487541d0b2d8692a3cac4d5d81caeacc90b4ba4d07247b37c88ff8002c0ba6692f47e099c49904907e1bb60cad8dd4d509b81a8f8f2db51d5d6d6fae52e98018b2e70da5f02998bd24273b4ac7d228bf277c4eeec44a5fff133d718ee84ccd0a07e5d0f55f073680825cd6001d3fbf6a089f918174df3c5f82c48c21a9c8465b346ef0cf24fe6d6108d58aade32e82850198c1998d6b9b3b241704c38f6a91bebd55998a07b24533779cdaf6dc8a4957a6dee9cc0355b820f15db806c63588b344d0c583b3694702d99b5b66a1ec7de9b76024298ba34aba12d0587aef8f1cbbc93a79094c59d9485964302a9fd898db58b3b5158f356761d468f0249564ba0785b2fb9eedc953f3aed9a358e9be70dcd368b0af1be136ede2d5bf95c3eaa589d35a72d84570a2025540a6993185b886c116bd2852f4cae6239345f5c7b905427b78d3b01c3fbab88b5fac7c64ee3e91fb1957ee93ca8b9cb42e57690168d9355ade7ff06bacd2286b794c348f02003f7a340c32a4722da5e3ade9294de8db12a62cd12a70ef8a9a8d45ea4cff5a9280a7de949056990950747cb21d73d6b00eef0abc8eec4c2ad5904568b245dec27f0f0074b6d9a156ad476bf5d1d61a82dacaaace557dd96ce6bf342c1a6373ab54602379c08a3a4d976ffd466fdada108b28af4fb53efad6a91cc4d89c608d9b02f3ea704b3dcfec6c30e650c6389a38a13bbad51c5932a43e290128a89742ec2ce08ec51fac5d849362b390a106ea33728290d18879fe3d25d00b846093e64d1cdf97517a1640e6b6d2458091553954b0a2ac6f0e62d6cac5f12cb0ff4951dd9d9484c3b1e7811adaa9350465c6297ed1a2f9e3b227b229c2efee0490bb91763234ad7721b7cfbdf53ec22591fff6dcf7a8a126af08e4f5a72d341e6a5decfc3e0facd9af97aed83731c2d3d6f1c0a35924342a3f8b6a150b6a21d70297788d2ca9d986548b0a7e736bdb961aee3135d8bfb8d5656d18b55ec350e1f97ba476c9e67ba3350fb824471d3143e15abb3a8d7e19ff71d675347e658e7f50087a9899c3b140a8c2136541720489e2f3c13aea7b8cd02cf96d71fdeb11713098f9e100a7812822ae11040c500e19f5c6a519673e90695e6ce5a71ef291cfe6dd872d4b1d217408cd3965437e061204ff9e1c476a9c0564f58d93b99e5c7eb788ab5675e45b7f4c91fa497d036413190d393cb302e9235eab0b6b141cd62a98c0cdc7c620a8f2d2cfd853a171b98fffb90b71be2f1726c0bb6cbd1aea5e01ca074ba9313a9d642b405b1e43462e27f404d20ba1508cda6fc9e1fb48db8b20ebc452b9b4912f27e9358fffe7750721861cef8781482d59e79c7d505ef0cf63f7e7e80ffe2cc9b35b08ca07ad2d9797736fba6df6de3dc73324a1a78c62f00a698f797573e3278e02573250a5a72cbbbeca137f673a689194c6b17d56b8c8c024f12ad83c3ba237fc1a95166ca6eb419828e0c9fbfd02eade0d23d051b550cf6feb6419a5a5a0e6986fd9c03fff4922f4bf1c606ab97b0327b97698e75fbda1791a3b870f0ecb5772c9d8e907d7c09506e15a8f7d614a9369d18aefdfd3859960a0a7be6f6b211f09d1b5cb0e8def1216967e28aa30abf173aa9d23b9da7305f007fc35ae2dd40da774276a88cf871188acb94c7b9b860453c0aca031fea41d61b3868deac2cce868db4ed22d6d8d36f75446a3c84c05496feb4ae91b464ffaf999a3ec452981ad96660d9bad982038ea1e91786b219d3f5d2f50d287085369acc19f22b5410c18ebcc228c3cb3dd4dfda2d3302b816180a7dd68b38cb9c89fc9a65680438470524fff88b9b85756f8ec0751aa34b79a323b6d829d421461c40fce80ccc078f9f25d0a35bf2052b8fb247fee9f6e79695b8aa80ba86336034bc7f989d06cec577b88699aa85eff465fd3613b7f84c8ddceb7baf4be8a595d19bc61053f91f5221e0ac68eb5008905629a8958b30fb862324bccd91fe7e757dce05057ebf8d2f2a9581aad397baffdce68dd2dbfbbd0fb682f7c59dffaa1bd65c88fdf332330b8f0c762567ea943e4b642aa970951d79c91e27cf67267b6995472a66e5742e70e6a9b4bf5411c77e3b0195010099e94ede453e07f91024ce166edfecf61c1e0415f694410fcda9fad9383a93ed4bb4db2ba6a0dd3d8f3d9f9dd72a30b835a9d39c9c24e84b753655685059fbede957bd4734a64dcbe04201de20a7bdd136f8aed9e1a9c7d0d18a8a9ce1852386916c897bd11de9201f14608abd8360841e3996bc3c17febcf86870bdea26f8a031d2817a34c4b231f97677e733febf53a51b36d8be9bb5b499b6c69ea8f86eb5062c59695ad1c83df491eba876f04df6475574d0bd12f79ae0ffd7de208add36cb61076ad26ddf461d707198074285e48c1f0c7fc18f4cc305f0a907edc09f49bc1dae1d8a338ba9758587c99b7078217cb63a5f12d933c5b4dbbd7589520ef6f84f8dce5db55ba56c22be5b900eb016b9dd7b1264ea605bae376126254bc5538fa9073493f7c5dd6601900d9d40599d0f5756100071d0f86c1d8ecfb18a3a67c024b70292f2de1dacbdca21d840c48e8e6e38d38451aafd1ecd5be3bd44a4aba07991baa113e6e8125687594ddb32767b6f6414c620f4b5fc27ff6074802f8340a81c6530b99fa168b1b20420f4f63d842cede89aa9138cdb335b95f8998607f575b3352aba7f52e416266b6e00e1f19478c2d16e6a2119e399212d36c0a7f42ee6d93d36dea360e9b04f10f389fef0a0aecd103b170bfd7329833a28780ba88ac7a1a740639eb3fe116b93aeaca828802b1ed5251586a8a35570108c181b6e69261f289778101c26ab492ebb9ae232bad025106500d2822bb26915ef4df79771d7ec9b00c21403af58ab14c91a0872ba8105062b254b154d7be0ef08958e13c8f0c0ffa4d979ac36d22636a906cc8371a8e9ea5208cd26f80e27ae5dc40380b34e11374fcccc95c73ca224bac986a5d9b2761f3ce0e4f0726cf1cb358364f89d0fc8528e9933bcf0975b2101e8d4e32c9145dec216d4d8dfbd653714ccaf0e1816084a80b617d33c4e81923776852fdd38706c8dca62563fcabcb7f4702cb1948b01579c8ba0b5a8ab5a631b9dd8b187222e1ff54e82f2f7827257c7910ff41258d669a7f5fd9c975f0011df1c0efa2dcc80c8aaa8bf87817506b4cf2873f9cfad8e6319c582e54afea465acc443def837f05cd614862e8c5c4c55c9809c71687c1d0b9e3f8f6c12806d24cbfaa329aa6757e4d980317fde8f4c6ef4b9926d86fd74ee089c4bd141c2d9272339e471abe6c007100ff113328db4a97846057e552caba1078832227603bdb47f8d13ae594153ced69779748878d7e3dd6f82587c462e0e1aa46bc1de67c6033018b968c68a4d5bf72388d5cd963ef4b4d0fd7c485009c4dc05f6890b7799435f9042a7a8d413bf0371345622d1c9e8ecd8a6950d90387f7db3a27f399f7695c4bfc2e0a0bb4b2d947413a5cd386054bb4b0f8b77120e53462bdf9336af73c61902009e44d9082a65d32937b47c309370c1a186b324a62d88de4f49bc5b44c71dcbd29c9f5209803869ae7a207481260b24685de1da6ba5d1b03a4090bb9224c620d490f949021203c39cafd599128adf36221d348bad424b79c1f5d0cce701a9195cdbb868fcd861a51750ad8a0c253409acb5855141b74687ec3f94ec23599765d0d42b5dc0a188859b32738a81384385b4f8e68d39b68a1a855064628780d5c64281db57535bdd0e01d04ffd7dedaee5c369e262a95da9e7bf4837d44a395e905fcacb8d83083b9f4f57d3efa8e4153a9298bd357964bb96b7a734cec7c8222eac98b6b784a667ca5f799f8d74e920e6adff01334b7e2e44b71dfb4231de489d1566e0939c9aa0d54d16c1a9deaa142372a1fbcb6fa7f102558e2003dc46fdefce239e61df78413cbc36063ac19bac7a4ddda830ea4a2e545c4b554817b390ca7f8d0568fc35712de6faffdab25cc64c5837ccd88474e9b288d2ea30950d3ae7c2438a6f1a16720a8269eb4677512f4d3b0c6efff5805c0a10987d3863270893f4477b44c4eaa8eb73486fe2ff43b803666b212514fe903cfda728c672ba423151b36d39e571b0195069f832fc368d4b9591cc8c1aadcf9d5a28f9a2b104b9b563c3a2a2d5e7d594ad138162fac9b1d5a9bd8abbfdd8be752c064f77b27d422ac4956058771e2c8e4877bbbf17d16ca3ce597afdcf72a0813b577757e568042e262d063962abfaeef44fea3c4102608eefb2efe335a6fc71af3a14346046e571b7995ca520ffaecf60252eee03da02c17fb891beead7296b7942d5683764f53ace5e48037c779dfea6d0b090ed193a3c907e5b2655408f868eaf9a2e66127ae1e76f873ad9bed07fb131e4007d82cf52367c5a762b943350f20a5d26473bb756f75e9938a50ade086c3efcc0a2aa9f2b42c0464d286d254991e519d59c6289990396486fd10a3584c6d5e776d1166e434596bf0ecf648f66ebc895232a4d604016b68c53609caa9187004f6c9ef171e9e8550c614013d68e8ea2fadbdad230f47975a7dd01910d02ef898811f207d8c19456beb01e64f2206134392e7c9d82f348976e0bc01d6d5f281a0c76c8eaa843654176ab82f3566cbc539b3005d6d4904bd6ae5dbbc258608d3ca1d18158bc39723b5cc4ff6413355701245a6f0233af26dd745af7bdc976b8fb6efdc24fa54565a28fb4b8e6943600a431061f96f94adaa5d209375b964267fd1af9e56dcc596055f0f48352579928f055f6dbf677ee8fda6878e9b2471c2d485a65fa7a403c34c42845209f16813e467ece59f8533eb911953926aaea8df51cb10856451f0ce73ecd2979939482d79156955010516f7effa6e0b945fdd5568ea24cb52edbb78a3fba67fbedd223abf3473825c563cb7cf6e78642a2e966b4bf3bc0eb0c0c8063a8988af971b6635dc093072219c82ed55191495c23986631f6b9952440ec805e309463208d6331199ed2363ff4278c8aa207caddab823173e50522b3201d23d877dd83fb8649f3faca8e5e7bcebc6930bad1ad24f15ad633e2e1617326d0a7b27f86c2896cbd004bd6c7f9c31cbe5fe9eccb1c723bc695a4e4f36fba6bfca0bc7ca5bbe1293a268856ede96d425c9cb52409455725e967a084470fd76dda7767416f4de683d725426645f13d09fe6111a0acd7312c7e76ae597f28222d7ae6cdb7271b0be44d31c4f1c23a01e27484e375c889b823faa0d468b0439f0eea7d0a265c0d2928e9748f1f07d0b56f62efbb38f69497ded1f8398acd0e2d210f21de36d8cd62e82089a55da823431f181e6253f0331d9e4c4599f09bdb45a80188a6002c4b19e52803a3dde087c2cdcfa5b3f8eb2af61a6f82833c6521500e7bbea484663af08eb0e4a98975b457bf3aa8d2c0d43dfa38735c72c5fefa7ea0a4a29360dd90e2da34261cbcfd4699680a62a44dd4b408b8f0b7aa0249a442b660698eac770a67d4bb362644b33e89cc449e9f90c1ddf473532aef3dfd004926fa1b473ff7a6a49f8d731981997f1d71ec41eb8b2c8a82057c7e02fa7a160e2b00118dd22826b7dd82b4969e1952582cc2becca8bc8f72d66f32fab6498ffc18f77d23c2b89403a5ccbf883b29e2f04bada066fd80459ffacdfa60fe2e3a1e8870e2e75ea7b89c7faed3ee05b0c18bd9a404c71ba30a2960563c29e10b875cd30f984810fda4b7217f1f7715286283fdca1c4644a6bfb22831916f51300f510ffa4a0bbe6b2930ca6848e90e649c40c2c9ad3415fe48ae3dcc4a0d02760aa6da3277633c005f1d7fcee7605afd2d23ba6691da115110b97115e9fab53fd706aa71f458b4e3217698ef0958f62b35fa49b137c59a2c8208c18fa382296d78a0710d687e42728ec54a5fad81b1b0b70c9a251e66314991e68242e542ff6e1332ceb6cef745998aef232a4974d5091bb26f9c5d0121bf313e9ec9cc005be972ad0fdbf7d019853b05ac0f46248c61af7a71e61eece6b4db3713deab4a14bf8467c7b405a432238c299c0a7f2e8a8421e8977f1e1bf4210de66b8689eaaaf2dad8bb40f18fdae2ad855d7ec6f2c7b606b6ccdd2f01a239c801e6bea02867852aee6388077f056c904dc2c4607e536b57b2fa7bb7bd74f310b767d1e0dd4f60d0e84bf565bdf7b86ed42a83834685bbef2510e92f9b04ef708191c56956e05d48cf05ab7fdfb81c41b18822dfb221f90ecdb5d0a4dd28a373187f491504a8beb56d87379ef88c4547f3f101127831ded95fbc2938e13d612c6c0934eb003eae5ee617445c21ee378566b67f32c29aacd7aa8274a288a036afb19b49ad6132012bd22e53294ec09342e828c1482fc5067537d639aafbb81f957fed3c4b58e7ff2cf1e601ca75b93287cb8e35cf99d269848410c9aeb52e517dfa33fd6e267ce5126be6b5d4073854a64de72c39b336f9b6ce728a21e41f9585119c43eedf33b5b49fde1a35b30118b01a7d7f6a6eb7ba24690219061576dbd5ca1ffa5cfd012c8c870555ac7ca4fefde1732f3b3a2079cba567bd7935b22514a0088679be26df38a42a584c257483a8fac321f80b32430a4e91d126e0c9e7f1eab038bd5c050cf9804965fde05da911185688e3399ae325ab1e0bd0fbefd09b615629d10d9e3837c3bb4afb5c0c81590e315baf25fabdc51ed2a8cca962b049a30f8315d65587fbca6ca555161644e9a6eb4a05b74934764b8e05838498d3b4d436e21b2bf68b73e3b00b6f00309eeb84d4ea02a61e1728cd9f21f42d67cc984cdbb42a660e837103a2bc807b9e22cf19826db795a2aaaf8155492f2efd0637500cb2bc062108ed1d2429159b5eb9c8a9bc32a8fe41794361291edb21c9f8d5df0e6400c546ca7f02f36d8cbcc1044d60f4914ee95d8401e7fbedb038a8fa3d93d0715974314ae5cd5ba09a6d755d9874b5c095788a6267092472fe03f6113a8629ccdcb5b85f83ea83a1c6a231082a5ecc705e442482dcc255c6259557051f55bf23d67a5a20dea05f06eb3d87b545190cc6fe834616262aa1a51bec5b1b40299b14445759c32038ba84bae48831717be88fbe086c2bf11a0cc2e9b54bca77d5c4445aa4624b98a6f13f36274866f7975647590845004f6e88592e5bc271a002754bfd72e61037d2474236f660796934a52d80b78b0633c348019a5eeaef1d6cb096484e8bc31361eb69e6690dda184d3f0d59b4e1def5d6b5fe740b7785522c5ead0bce671ce7191a1346d87b8a9ca98a89fc40003ad16d866b1574b5042a192b1c47f9eb4591d4fed2a93b61cc5181549ff54dc5c867cbbbd06bc04eb99030cc13b378a4f193fa2ca938e9019ed42f7ef3c554e74b3dbb84da77cc95cff714723f3a99412f9497db276d972a2289f9dbd161025a6338294945cf167a43d3997fa27b1e8c5bdcf9413598b4d32218e0774ab1b1adf4274a602a1dff79881e60d55c48e531e9dbe2b7325e0d695bec86aaaf12b6f3de385433619e542e2dd482440d27569458a2477b8834c3ef1cb327bcd3d575f13981c7cebfa33449b67753fa29d4a7026f68a13dcfe892842be196ffc8be54ac8d784624a4133922ce8b26f70ebdf109a106ceda12196bec692c589993856e98467bfe7e55e7f629af1b30e2b2850ec5ae7c80dbf3ba52310511c364305821f4294aa0ec7badccde603270ccea814e56a46a41a5bf939f85574e37a99057681ab588e89c2107011df863afb4e53efaf4cb97ff79f1c07ce7a6666191ae1706d6213db879702931e48c428bde10f9a438a26e30a9f030c13e39208f96aa207fff4056bd79a45d0fec00e9924ee6254f8c887c80944a2716eff4081452f66fe4ef7b24ab6f798271a2037473fd3ee958f3c4f4136a19bc6d18eaedbd66edf56d9214d90258b189af6cf9853494a29f448a592b57b6c25cc9ffad615974e115e51e2b0e6c672ef751468dc184c3b657496d611c5f2fbb45505a673d46478a2adfc627409d5b82671017bd5016886052b5eeebe4d95b870cb674c71a1cb6ffffc7dfe54ed4d0c205205a22610bee61872047c2478ff7c218f170f1d85edfde55bc5365fdde9de813d2f011a472253f216f291f2a7137932441147e1b43b900613463d674b378fe68823aefced3f9fdfea3e422163c4f8ac185df5fc98225344a7e018bc09865e9ebd5cbb718ccfee23283fdb9bca7daacd1e46b688d41fbc1af0856b851dfb2a31d495f5ec1ba03a882046abf6c270cfc0dc145955701b91d207d2cfa7b2983598d0ed904877da0c7ea95d85e9c3ac3a18100c017daa6d009a0aa5d39f74328f4613d7886323ded61172ead1e674dec9d0ba379400d8ebfa22a407bed5f8ed047d34f8f0c0a4ab7eeee2e9e840b29cc9edfa88f14abae6438295748b1b5f34845b2f15d995b08c56903181bfb6af418800549b557b3d04699fecdc8c8dc72d547dd1ee68df8ecfae52309e7788ac402c7d977ac43e8d0bc777d72f1861e3762d5cc91d630b589737ccb14916f15bd8d538bbdd8fa51f529dd70fc4278a4408fed0782e425eca9dc5cae62b4b0dac0df699d5ce600ba51c03313d8d9d6019d5852acb22e96f97eab5c32222a4d4ab2632868c8bfa9323c7b4b96c0bc13a82f5d0bedd08383bedcf9c2f34c97ecfb43e479976b4b7c8bd143e39f2a7430710a06c39022a66120861e373f3900bf29590095a9beabfbde8971abc57e343b185610836d84e699888952a899fc4bf530f69a2473aefb2604dd186b1624257fbeca3bc4f4b8b00e62adf5bc379ee1a013c128479c52c1441df7d9ed915a8ee166b81fbba406e30da1ec43d88419c9f5f811fdac20f4903c0d7d21a4ade5f773799f684a95260b6239038e0d9e30fa2daa93f83fce639ad6fa600d6cd186827a43590009ef82e25ba40a4768d90ec3b716743be9caa01ab6d0c667cdd947060573d0e25871c5a3be5e2679c83abb70ecce24bd3b0bcfebc8bdf8690f9895bfc09f49a1a1ebb5137369407333fc5aa34789abeb04de7dad33b56b39f3502a95d7be3bd65fc46857c6cad5c1e00f44f8faa182b406613e3f77efd3508a3bc84089acb80be174bdf1c20ad3c47b94dff3c493099968098a87a96649479406c4e4a9a965d6310b2d82e3b580740a625c55258385b0bf1cf9c020597ca70b515fd858da0327faa9e81ef8de7f27aa84313e64b5b1b9e738c9c7ddcbf9c80d30f3b411c78814c2044864989ad66bdbb970d76415e09d49cab321570380dd15adeaedb0dbc6a05fe58793e5800c4566f3e85ee7b0a907969814ba030d63a497438d7d24e8a5391caad85ab1305761f8d818c6b1392fef6c38608c293801766264997048a0ebf876c6bc2057c9d6177f44f14c1185e93de596eab601974799d9f5ae5ade1d94e4463db7ecb670e241e7c567c24a0f0aec6972fdaf38804615fbcd89fda55abab166294a47cad064415d1ed954da756b39ece03e972e0fd67062390cad5cb710cc013745ab3c9548c65fc53b1cd7f911e4fcc667dd20a44a12f17b193ad079e9a3102a64624af0f424f86422c869003c7ef8614abc936139318a46406e4147cf8490573de7e916da4f335b8e1b0996024615c02839e7ad4c8c5c44356209aead7689288026edc10dc6863c92201ae98920cb475bab00b3285588901d39d49e89eb029a833959adf708254ec43da5cac19ac02e470157e45f048c3ca90acbecc93b9ebe2474ac1c0e6b650c81970c2fb6112200a53d7d717707c7cdfd05b6ce0f33ac3bf5df2b53a2494ba3fd6613b36f640a1d17e77bd1fb7a8dba701777629f2f39cab97e9a1bbd03e9772a31111564d16e381064e741a562bcf0119b3c275896b9b938eeed400b40d39e6507dfb576e1d1d9097da63f8c117a5106e672813d9db6695847ad15da531963fd3be81a8982dbdb0a7fc90f6eb4d230b2b0ca398fae19d08d52a8ef23dd3fc58234cb6e9bb3d6ef7db8a73601302dd6b3aba1fb71e67af89a6b9ea6ace18af5eb4322007d64ff18584ab6015ac52801aec9b9d7276d257e9dae3d172e057ddc86b65fc10c6b7d2d8f8730ff5e2e5060e20773c1d8af5a146d489ca494a8d192bb7923c809b0e35be05cb7834d2433189cbfaa11ebb9bbff4904efb24b0460e89e0914ce73f50ca0e67a82234e82e3426acafa04ec30a699db70c9299a8f45df548e0fb37bd83951813c9b3c1976876a2a03523908b5c0d07e36a5f80e476e2f43537df703f165958a83de6bab70ae12e3edc63414a8e8a5e478c78ffda311c11302a341b130e4e7dd0530150ac95a2d6e9014de249d31af005edc640a570335874b24dc8ae37498aec45ee017433ea4f3c56803b8f2ac964714ca6fc717c75d17e83e352bf4314a2ea8b73879ec7bd433970ad36c593e983df24dad601b2fc0691ae85e8055e076837928cb88015e0ea261e6614c49d8075589efa05804ed18921dac8e1cb46fe70fb5220d5cccd2164fd73c27a2a719c81cc6b6cd545de5d42429139f16d1b33d07ef22b5d7af2fa5a3218980641f6cd5be77db3dfaf0459719f55a8f7a28ad6c55c4de3ed4d0ade7eab0312d2dee70bcced855fcd99057b77de786ff49c5083ad591a067520f50feac82bed1c127c01f68f3d09e6d1dc4bff65524b70c65d9c4d66b45b3bf41667dd9e81e752cb2bc329dfa00b523e191ed1485a320f14ceef9f50fa7ea4ae4adedc11b0004647c854035f3c85c7c9065b5754fd1c87c72961d41cbf89648ae244be42055d084b1da27bb45ecaf3581b43cb69ed0e2ccd91048af8ec387a7bffd8885d0f70b99ea23d7db13425088ea70dd3520eec3664b65e5e6abba507558ce081c04ba4ff1a0a2d6146b81e4734062a8a8dfcb6698c3e23354f497c7724cf3248a3755170d6342bfb2aec6941bfccbde79b1ade9683d0bc78f348b89b8a464a828276643138e66be1fd3e38d32633d76fe96220e19bb460815468e736b21a955a1340998da8d8b16824466807820659c7786e2bb33ae51b248311c2a818d5f60999cbb3e82e58f9baa92fe2246bf8b2ce5407b7a2e21fd54cf195f949416e0f12bc7dc409a82ff38533c9fad295ce83ba81f52fa994481d233efe55dca1acca5343d8a10dc1cca6bad33395e931c5b8ff503948ce24155e3dd1b5874c51eff0d6a0c980073a463c440f675f5913f392218d2e7a7a075399358ac6a8babdd372d48a416c9d4006c6a195230389fd9bea383221b647973e3c3e8a88f9a39a5fcfeca752e082aa2a1954632b6707c8d6af4b6128c028f7585a4739b755ce86fb2ecf8df18bc46a71015a90c0fe91ed4ffadee5fc66381193d40b57b72d0206f9a583d33a5ca329a26c911cb9b77aca52c98a735a58efe8c4ff1c67b62b980f76d1793d5077942059129b04966ec8795d733f1594e2be38bfbe8f56e581f2f019df17ed1a8f6be6293bed0c45fa36db3eb3190a1860aebd193a7e9c4bacc40aec723da5946d11e29cfa4ebcf9ef89fc30ff9f0d5329cf1e186871a530dd02c89e7dd6c0c077fcef54e0e03b066ce23a01625ea765378c244f3339866b5fe506dc1c558fd06d6881804c2513363070dd51e054f026dd879a1692b20d87a6c864ba57353d581933f01cc9949600d0fdbc9471a52ab191975518843841c66f7c53c35f3b08cfbd793528101e2959e52e5099b9bb7ab743fd3512e21618be0bddc94e9463e8db0a6de9a927b36f750c2d77d48f3d7982a6e85b41dc22456a9a130e74be0eb442567c9f5161d753ced523fa89c4072663d72eff207f564e946ca942f6f2b4873e46776185f101d43cf7d263728d64e01f63818c428de85b219242e91ff03cabb5a56398a8f138df79bbfc17c68bab1ab10536a58c675b0831add675d6039eb4645c8df0be7f6e171dc1b2ca1e0289d85ec78041d280519109ce9f754b311137c58b5896ff22025609394339ffb0ee4ea69029a68d7ad953a1c7ff35450c3501e9bf91163150acb17abb3355e3f8e0c912e6ee3b347e284304f9bf3e128fde55571d506ef7dc281e8cb070c7b5180028f39e09e3f56eb038b137a4943cf5fa1707a6c32acce694f8ac3a108920eed99b80c9d204a6b6475f0eb2043205dfe08633347b3f189b500c12794021c7d95e1f7338f733669bc57f0efd57fd141e15454c7d1a47d8e70e78e477b7230b56a458e9ec4094700b66b13e3a354d8148739bf96dc575ac4f7e890cff39ebeee13816711effccd6fec2a5a46da402ee56082f1c41b1b026fbbdc5dbf1cd90fc86a62e8f4e6def437478ea3c58d725e224f7cf48aa6930378c33a036f1cc9a47efe5be3e3221a7ec18824b657135b9b282f30282679a5a86b291af96c9ccabf4492e79cac42e2218bc378e5c4865342ad4a6d1bf8f4eb61cf987f27ee49592e169cb809e888b468fedfc88d0d47517fc5e3a36ad45cc2f8efd5fbd662548d236fc7beb0e65a6825a8170ce05678aa0205ae8faf8859dcc943339aa684f3a7351071f8da75c2cff0327b49b89980eafa3e53b2cb61766e8a031d1fe1dadeafd08a2e15fbeaefe7482c703e784c8bb6c4c7ee9d17d1a5e659aa9096cb43d21db0a943e876f6b299354f2c5520a608c202b2920f415bb83422a49e32c78a119931e92cab3cfa020a95c93beb20e629d30f66c1d9e1a9e9a2888fec796074e0c3921b1610ce03787a71b3fde79d4166d7fc1ef69e19f0533ef11e34c6a5f208186c056524ab14d4b902ba25a31eb4fa078d4c1b5cb4d176cf56d2c4125f6557d3fa363003471776243dd23b1be4f6651ee29513c3a7a3b762f979fe1a01e31cf40ba7c057f0b9e53410a11b7c5f4fe898ca3c3165f12bdd6025b0d6c87588ad459a9c15b0576c4ca4b62975f582ba0c0fe4edbfad1ffe9537953e57f313b7e47c7144619f9de7f81aba3c4be1e6371b96039e79ac0f31f0912fb21e6d60f99e6468e88ab012fcdb708c14753afd9ca53596f10fb0a971e0202436dd6272003b1a041eac2813db0c7ed8862063cd65fd6bebcea6b0a665bef3a82dda0915cd215a966a9599a8b6457bec334b3bf26dbac29b28588aa8e8c760dae96d9e00a139dc28cb4844db5b64f2df274887d45936737dc1af072fed9a7d7f4785b2c4c570c0c7467b4bdd5fea3e577341a65bbd121bd9a72ebc33b2bc27b5f624cc3d90380bfd3118b679937f9e065cb1988ebab080d069c8ae768d149dc1acde53b04804328f12bf4171b36cd156e7e756dfe7b867299167d4c5c16fa492865ed3e2c8cfb7d4224305afb71f4bcdab87771acb9475eec8665ac9b7fd45a870e283d1b296d92e4c29e37eb6abf219080826351bf325982b18c11e77d2136e7fba2cd51bd94a7d102ccc2f0c4573ec18366973484acfaf9c3fc6cc6c660245c1cc5157691e029d42bbd1cb5ac81cf308b1b9a07f4eb71ebd951f5a6315d1bf3913b26de56e15449e7908d0003254a5a06de8547a7b379bfd46051110a002d4631c16f742d7a6cc47bd3a0ed92594bb4d31557ff390f1e58e748c39c0ab6501cf876e13e2e8e0c0fc106b227167fd76341875b2841114c973b2d154803d2db2298c42112737033a46b126266762771a3f12a9e905c4ae0bc58af3a28e42995551736e2a9fdf7e644e14a88b4aa460378a6464c3463417cb4bf7dc7d090c2ff7ce1b32aafffa22bb125ec94a2f60cfaffe24a3691d315decf2ebdf5291ce81547d748f56452c59cb8cebc6c91dec619064beb0a2544ecf9734cb1f4505208bb3f305f9365b18729413c9d12bad419f23bc723ec4f7628ff094eecbc2987e93fbb6665012b9e801d4a73a72ef607ee7e034d3c982d808377a6f212a973fc9aad220c7343e5bc94cd11536ba06d666f418ac4953d7ef1f8cded8257143d5c4b0c16268a1994e6cc379d7e747d366dde98137906475684a45051b3073a87398eda0091fdccccc878fe0692a18b0b06ef604e237678bb670deaf5d68184b24503acfebd5b3288e523073591529f350c8836f6b224bc71d3d7d0b626ba9bd765eb9f57a090fbf870b2775a06bec90423cf7e98d097dd96ba0e5ead3cae9f78d141f5a084bca8ec572b394132a8acb8041025606f62cf07a4b7e9a978902a8e52c8a01a9c2e6dc714da0aa80fef297f6f182f65ecbe4e444366580a7a13cc66741ec250da7081564e51ff7d3cbc2a24d89f40246ba6e16ed1d94fa887f8bf5695402c0ccc845cbc288b86d1027f31ee3ed6f080ccb0b292cfd142d1c82e77ad147dd27610644b95d0541e227dc5dc803213c3ac059fa26f69b46b28e8078d5eb65fa0d42d7a7d06533ed28c86b0fc493d1ee1343954cbb08fd305f8542904181d8eb4e62c4d2bc126a6a7b0284694872ca1cef91020f814ceee98d250375b04532916397ecf16d96070cb54a9015373c7e9a6e80f7bea0997e09a082f5fbfe13e5df6f4c805c8778ed0738ac27c7128c854ce10e2011367d802eab18bcf3744ecb3b32404542cb14ffc28d3a9acefa781788fe8efe0738120b938169f05ed7569e5f55f315aadd80a72d14b46a7b96e192039ed2625addddfab08885a07e974f81d5e6da5ec0f88e52304a05ce4e1a03fa564db2f629b7e46cf60f46caace83e75fff360a1756cfcf2278ddb32fed0f7740ce553b409fcda448a1943e406c73be5af8f3bf46c031c7b7259beb345d2fbca407fbb6c54bd67aa20c71a56e838841b52c2a8813aa775660b6036a38ad1c1ead3715b43d300f088dfdc74fd34553bc8a226ac05f2dde5303803620b4e2eb567292e8a2fb4f8430d530c49aa73d81480f834815205fbc0dc440cf7246fb0c1f67828ff7cd0d3d52e72f952a1b852633b1c7f13cd721d5f6d50ac19dd3d9a1cf3ae28ba4a43e0d620b32b4b1b6038d5d6b15e74f043553f6d291aa1595dfa95dadca6020c50fab4df2f5d70c4985fac9030d8f3c95b8aa16a3a5f5a6e76672ccd39157f0a9981f7abdad9283dbeb4628d6bb4b87995fe0f7386259a26ba8ff815b339bee0a54e6886c2e0079b832f7e57aa1272b73285d29fb598f641344609990cf9eefdb962cab767394fe6ed52cd5751f5024b9ac9ae8631ac52b2edf773689135ed25fb4b1d49206f199b1ec264601a8bd693663faac651587c1edfb2b03654a33cf0e777918d8c64b52beeb37d25dd36e201c495bb7f98a07f60b32854d6ffb304481eeede931b31607a564fc4bee797389a1fc87ad7fe7478085a575dc537fca2ef712da5b59f7a7660ad3abc28e71477782526e87851c01dd769c1979f88b4f3f75225d80df3bc6a2bafe7a0c15fab454a0fed530d9d357844536006a7e8370247848503faab314a1c59668ed0b50597cf424c49c8aaae37fa62bae644c8a16d1d22de5a9fe1495ee593c8cefbc519555f40ef20df8c2de25894c69e7eb2ed6f87f849226400ec8431ae60dfce0dd2ac62e166880a3bd3a7ef3388d3857d3a20e8299df873aee72d1ca764203b648339d6e60bdd073f5dff08528cf92b0b133b7a2552f13cc05188b748c028154231e7cdd734b21771fc4e1c05b3eb6599de75c6edae39f13cba4e86122067939ae280ec2fd93b7ec496cd597cee77cda2da242dafdc390b736ecd01f47e10d4438986eeddfb9f0624c67824e2e15c234f40c563a6ebbfc31c393216d7c05b55ef3d141f1277627d5e2674910e8ae6c77377cfee56fdc79a9452f1a5fa23b17cb2d25ae25c03383223c466ed095a334124790fab110fe2d119730f031d93c3111ffe672c1d948e7c0ebf73355f752ebad2c3a34acb1e0bf224396d78762281bfeba0c2063f630233c6703b9c3ef276800083adcd42a40c45cc55c4c1834167982ce8ad0e4a46c83526abea09704dbf867eccae0d78981a5c3831e38ea06b0e8e1b4ebcf6bf26cfe37cdfbd96157aabe13d158e357285758828f9d7057261b0fb70bbb904cbb7fba1d74086123e37d74cb03f384556584b61874b283d2135031a4c4bda913cc36a595f33af80479579a5b8e5e490cdefee410fefe6c465b3028bab73898adba717f8c49afa9611d50d6e2bc0123ebca0c3c9fe4b751a60f328d375942bf202e39df0bdd9aa3f000b854ddf4d6ccb472be75cdd960234441726da112fa25e90bf0db59094191ace2fc78c4d1ce7862ddab99f4fdf66fad3875e6b8f4869772284f540b188caf82e89b599c2539a1369c6e100fc74ccc8a93456b75fb8b27ca7bad18f6d0be261429473871e69fbea2a794b2b7f54b6f152a3b6d29d65fabd3b6b1023aa018710d6db768c25176ad51e66f796708e56373ad7cc35e7b42c215864b480ae6220737864c1816001377602f818f676dad355625c333ac4a89ea150ea6eb001988e2c5b98b5658da29abe8b2929c86cc81176f0fedba3a076c5cb2268b7c1564c799205dd25da9f6864779fe413ca9441cbba86f9d3145492d14094fb0142897b8a31d73c9da6512084bcd7a1947ede4b53b86ea4ec943a720f36a1f6b6caa9d5f7455ace61344312f27c5a022cae3a411cf793efe910dd8d36f63ab0f6711ac70b4366c35c11ac73e4faff5dd5e2ffec39734e31f7d829599d5f563e8655bbb77751124ae76f9b0cb34fc97fc8ec5e416f1ffd13ea203d3e9f614af37a17275319c977a976a5c83544e7a60a215de796fc5d70ac4a81b9d75f837eb85b5bffeb84ba444445acf38f60008f403a0d1ca84f8724032f75b0ed7c5e69a0784c494c17671e6b61a4d516d52ee425eb9717bbea6a4c9ab7de1af72e20df492a15da8489c6d328fe4da171ddda2b3b94da40ab54c6abba617fe121ce0ab0ee8369d38d010160727d8e13a3eabe14471d790fc5a7cf419173817523b0f29637c4fb2fca62f9bc646ef2137b7c6acdea965ce0a561afc3677df0f853d9c2772f7a0760c031be857aa526e56b6ec3aafa302dda916a01e7814a3cf7d509f7edefe4c8f599b61869e3a77de5a4ca7e1ed59bdce1f1e6587c69a3b9adcc45232be18dff613c2a026c67de6cdf94f0a9fd31b81c9feb49b659b3f21fe4e2156b25a77e73c00ca229fc7f670eea359e231724aee390454c151587340a55a463091616bd6bb4b01e71d290eba0d9c4351f1a4721ee3109dfe28e73987ba66b03cb47c8e836555e9a70a56a890640c66ba5cc533d3a2d95ed7c4c5ae455f2e6b392352fefa32a8d33f1ab81cc45fd7a63119294c38ca211c7baa27bf6e1de7499d4f839cc89391a9973ef81a1076026229241f416ea7a785362b0edbb4a47dc011b08eb36412031ada86e2b691ad6c72bac4ca18120cda3ccb32808902274208b844577ea27438cecf60fa09cf12c2a0eb7357f943d521490dced8e40dce3739e415dc8f51c09de87f9638df121626a995d56e08d13ea61c2827ba5e14fa38b8e17747c1c07287545ff37dc8fe503588720f6412aba2f88e93e21d5333936d58ee125bddd4f016e318af8cfb59b21515dd2b0041f0d1e81571d0db09dba0f51270bd48726620e03dbd2e3bf1a45cc7b661a2d5bc42bc4df3a1e26dba1d59a13bf1744410e325dce5d410cd47b09277fbef622e920f8095d6fb8b68849f2d2ae551c8eae3db31c0ebef52a7001b2071e8734b2cc9e998488b451e7ad325f6c068a425badc95f393e2f414236972c27558df7080c2ffc5a0fc5c7087dd0ca8c509b4774455cb20999b42c10cbe30be2ded4385aa1854e3a4be5ebaeeef3c9134527fd9fed7fad0a512bf050c64805893ebb43249f65825a0be4029b63e15273bd06c9d11dc257ac95367cd178367341b5a536c726aad192c9344376a90f431847d026a8882b372eb5b5f351722ad575c277856b2bd6347ebdbe5b5cec2bdb626a36203b963ddc8bed642b38f1e24bd6116279383b7aecaf7f38eb355f253f2fa8adda3afa3d5579be092f12a6ac1ce9f8f3acdac8acfbf72e6c09e3a4d2f6ed6f84085e7f1ab96fce13bee87433332be6bb8e5aaf26a8b7498cbb35443a6d4c90dd75206298a1c9b4ebc9611eea9dc0632de342ea52ff45add57fbcb0a6756de4cb7fd1d4d3a9ef3a41f8b2faef0cb58ff54317bcc54f646d17c65cb275c0b13f2496f2864df294e68a2664305757cc2b61991abd1caac2755d74bd35026710da78c1e549e5a303df90e1e110d1f8e2a6f9a5658c3e689427e76281cf1e67ffbe1718ec2c2a63797f4debdf84118cdec1087a4d1d4ea43465c7dd517c561fec00d44b74aa59e19328a6bc8bb2ad572eb244001adb6abddabd0724b96790d343b3d719b9c0404dcd227ffd8e47d5bddbe380730c1d84d75eabecedccc3c22c0cedbadaaf0ff3dc08a4750ee21009ca2abde1e2b5a41b580e1405e0a8fb17b60b56a2f64656f5472f4a1b816ecadcabca05bcb19d20d06b9082031bb9ca48618200366cf4e8094cdb9ce69c8150e53396d3fa1738eded80dac5fbacd402f5017291d74c94fb462c16682cdb0e9d2f57e41ea1a12c8e11ca34eb831a280b74ce76f99c3d97d87f2c24025e6dc23a00b26860beadec991cbf4ec463ddef61ede52f403bf8805f531461ce78b2e3172602a4daf7f099115b9c636bf2e102ab88c437243bcab66463b32c8f0bc307e3dea9e4709af13c5fbcdf6e77fd082d152cd2ac9187169ecc5158e75876ea935b262dd72d038b4b7470cb70d219a459208fd54931a4d10a7c215afe37122510404db8a6db0e6f7fc20ee7c2638a018e0e5f790e92a005fe77829208dcbda749c4df98ad4f2ba0fc08aa7f7c007dd9b389d1d077af2a4eb4ce61dcf2d9e45845b936c0b54b97f5c72fd922e7533ade334849cd48d6f9600424cf9a3c57775002d18946c916589a8dabca2203b2093360ba9fc8e229297f0dfbea30443070600ca8fce3922f6e8fb723ed171c06f6f3ae0a3efd2d4cff0536171a89a3eb7789de7eeb764ebadc27d454955c6d4f55a9c4fa6e0c12ea0edf798e2b919c0ceb8215cdaf81498c298b4c694e91d65df0d64e673a7b7e2e9211096778b895960a36721830aaf3f615356b422f17a0c0ec6fae7caa2f035e612e36da4475a6d36544acb9d13c7fb47275b26ba4974f19275c72e691f7f81cebe0b496d4c133b09c7e1479cea311981bef82b29b7c8c4480fba183c9013a222366289cb4989c3d726a072d83f383e3591b129ce374140bbc9ad76963636a587211028ab67cf62dc7c42fc40762b36426c4b033def2bf4cf4002b418093d0af51c6af7bfaf1d95a7cfa986544ca61bc068a61eb5baf96d74fe5eb424befbd225f7f1acc2d023fa96dae9190c228a6708b60bf889025f45ca0752c65203787ae6aca745ad6bb69dcad385e66ac20edacc60e34589913bc36c7d11b7d070e0d432f48592a1bace629ec22bb87c77689d16db07e20f9fc9eee448d30627e7cd4ea292f3979fc6d97a074aa2f30bc96d434ba358a90c3a76eb92333235c036eafad47c91aa35614cfb48c433079a40ddfb787e19321efa0825881bfb865f035f5eff0f3a7705cc07e83051411efb20db110a2cba1a769b62c1359225d0eff034b504f9f8ca86e12729ebd77c8e1baed1aecab60490a197b3dbad2c08d043c71fc45895225fe57af9b73747b811b88a715498ddec5dfe6c798e747f1139348fce30115a67db7fdbf71a1c163fee63e59b3afe0da5ee45236daeb64830f9b8783e35332c99ea486715aca3a25cb8f70c49f2569ba1e88cda5091c4736d1d43acbec9611fd2d42d37528b9d2ec3fc62bd03002353cd90c49b95f713e3f8561a4fb99e52b165b21e380a7e84497539113060704b4ee81ee04581aade4c6adf7f7205619d7ff1eef6ccc38c0f0373eb872143e4ab1b3d28f942d617290686d3446aa15562e35cab47f957f17e095ebcd544d2d13d444426587283a08c7b5a1db93ed9e24fe4ae32b7d9d1dd3d4a93d48e926b86204ac4a18e6fc8db533b3cd10fea2625d8163553f1ea87fac21241f4dd8bb2ef2d2cbff5ceda03ce9d759d4d22363e46562bbee137c01ba76c2e7651fbc47be0bced5f5730ccf41a09b1583440c32b382a21e2f3249f47472a08a8555a5af71337fd077923287e9bb2147ec8b68f2f13fbf6f66ab7f52e9822fd611446bf8c1bfa7190eabe38e143ac8c391525fed6f32ac222354caf0ec55994b11468dcdb6c334e0545062e88c8108535f30074c5193fdc2f06dd8270fd17b9b1fcd94fa96ec4ca722ac79626a340033758b54a24778ee6c665a9c56c555d82d60633bf32835cdc7fec4170b873ac793c2b686625aaac35285312f5ba7ae319b4009134e839083eae78bf5b503f65b1970590f643f5d6a3a6755b41ebcb7fe340b9912446dee78926a6cff79dcd35a5c1a698664434918fd3c5d2107d613887b491a33354f3ba69107590e308daa6a6adc407c83c2e920089df13f83ff80ffa6f62e3e21b33d828fea8dc6fac59843432a9fe2c430e229de21749882f79d1f208204092f5573f088f0831ebb2f567a5b7b945490b2cb6693588c35fcbd32eb07a2729a29c44f3b4bfecd25994028c61cc5acbc3345ed8a53fff35967304e33aef53126fe917eeefca6da208020ed4b62c5ddb75c77a0add9931c5343b6ca631c78545a40140b989222d4f39e9dee94fd1c049ba1b16474f831888c8ffd0bb68cc26937a4b48fb15a941824e7306f3c323af92ff90ee37316c2efe850c70752eb1ef98e84d1ce3472a1046d9212230b3a138c1640c564dfac77902f11c4eb155d6a3b4f602e57a94f570a02995e072cc2b0e634b61d7e4cc79f3a0d5e80f2b4b9c73ef658f415cb37624e1d3d4949626a882aca80fdef868abffbc14861399e0822dee1b442f843c893456781632fac46a74d8526fe012faa027e15e4b0a9a40a7f36b55d4ffe546fb90c19aaef368b60ac82791316d722f0f97695ccba46b1b12184b7611762b5f2c27478c545d73d3393b5e819d17e81bba9bf729cf872e1a37c91e3729fb360e738fd7121489d93324ee7a3ea18c56c7be8ef8a764efe52bcf4215a68c40c873a0337a2d0e790a83f317230a08d028d370d974d7f570f888a73020dbb9bbe54ab7f49152bb916c1342c81f8366e6fc008ee6b355fc239bdcfc9a9c309641ad14de893604b98bfb35ed5438c0c11bb4d9c2e0e7fc5bd53c403e2920d960538a6090aa57f915db8cafc43a96067ece967b4de32a0e174dcf6d0c2ba51c722dc3d194b030b1ea2cbcac4baab87ee2ebccfa66856c3e89b059b9461eceda6b8df418d017ff45b9427da5f2277952ee81ee5dbcf4d35940cb2a6e244c443614fbb38c91909f273dc5955e953f44417c16989523f5143a172fb2301f795a4cbba17a9050d4825d490333d723383757e446bc91ce859815108119b6b489d48da6a86e9cc27655bb23a87cc7f9aedca99b78564de2fedd1e96281cd506225e1274cc3837e20cc7584eaf2f08912dd8f86825eec522fafd1324f41bf11a98fe0713822ddcefdd629855c28d67c5f5d7ac428e266c680567af9bd0182c56e64461af709a8444da04a342d656f3ada3599b7d19e129b5edbe98fc0a677b775d798a8cd9e7cbba9753dd41d0def169b23002861b72bc711fc3b4995f1c8e5426ab846a0fed8e491a40eed6898685a743ec0c31ff15554b0704d01c4af9d8340966540a2b0b3c28e9bd9c926486dc1bc125998f39d9ede2b6811934a013c76b0a8a38a962abd2caa99dcf8c15250fde939169b2865df19b028db61d98794da6e3a9f3aa08d674f35669dcc7b7ae332fb7bbc24c92ca94951ed9ed01f91e97d84ed610aa3fccd29dfcaf9de0040e979b3c3807086a5c4c90a5bb6c9288e2f61895a68d7332e9f0f1bcadb870d232e5ea46f821e313bc4850d272639c7697d3ed7572224191c4128d7cb8e6822a3366308cae9b2c16b197f5ec8bb91129063fd8b0481985bf27def823a60e348f2b37b6db15a15f1c69d4dc54e9b46f3b8483e5c41f97be69f2cb4654a4b9fe78b7d8f2fbca213611886990ab9fe52bfc7fbd33581cc3db8aa711c45e5ec08a721a2fdc26069dc547e44a08664f9b1e6518243b21bfdf0a229679d5bf4e1cc65903e13cfec2f83f96ef4b4ff6f0be5af9ecb48598b0ec99c0535039f82ff5f3dcf2d9818551e823eee89bad82b327304325851b34195a3a0e4e4ee56718978960a51443c28f1343e7623ad8ff1eb644d3416012cfba47b1e60875103b9a9924d5d2344392edc5a36548c198cfc56c55f49abaec4bc5ff5fb6892f59270ef6ce7d988b7cb7e5c97107c33a03d1e2c2779a824e396e542d624fbbaf4e9148a89d5d54c339718c4f47a1499798a67d71f4c878ede26fe5288ab82ee3eb8ca4ab1caa88f402143c05c903d7bec8d215ac71c2a4412862ff29979947a17a094326e1f5278db9b453b2111d4d8d7a6aff23bed2ae2a6458c003c90dce397acb7799046b6daf57f3cc1752b33372cd634c01dbac9a4f53895e0c6d863672918c889aa516627f2f717fff2d33676706d16b912c757a40c08a41d32858fa30c631859928523e62b1a0d0a13ae00e43e0db65443fb0fd2309225bd9e007c70d5b984f3e5fe90306cf303ddb9844130c2f3fc39dd4deecf5520ceb6cc6f9581ebabd4c18066c51e7661cce0a65209553f9b921d914258bea76731aba2c18f040a322d4e08b6aedb7ebd236305db5f898aa8d8bb1576a8e2055c68b3aa4f2014c1044dd9630c7a23ac56d597e0d127d88c290684a03aef9981d2ae0f920e1b7ff4428d113d9271429ebc7f1ea9940e04c323fc1a72447a63e1f3228ead4ed5165a68e0a1846e0247e2d9c80eb2728af7c172ad554a66f5ee217f10be710cf071ff93491cedcadcfd7fde0a3cb485291eacf633acee5d3602efdb7167f7d0ebd2c41e86f86de85f7b6dfac3b84c1ab3aabd12ed6fa7b005bb2efd90497f2228acda81e3fcc043c46918e852a179a8ddfbc17b3740c29776297413f2d6e984300d4b8d7b6ce5c9b50fe146cadc205c9b079b56ac5210fd9f7f8b0ff27f3c0a791f71ee50c39f1c50079dc5e4d1882d3ff3c0a6ed246687c81bf3f4c2202373ecba7d06069ef6e6aee9141d6405de89fcc4b90c64171eb757825ffcaf526adfed04f11028a8b44184c783da6436b38b8369a4d4854195121ef53486d3b3860eb0fe269a4811e92767231bfa70d479c3bb1eb4548189ab62c6b50ddda8b30b3004e2c7455f1668fbcb467f515b9a0990dfb2ad9b64aa46ff812939c823163344022e54e52da24719d9364aca2db01f077aed696f1c5dcf2b42043bee372a5e0c2d4fa1dea0e4637e8942876cb4f5dc6d09e6559be449b383105a4907faa38c8bf3e054e26506d97bcf1f37396ffe44414802f48e03c1e37658f5cedfc425e516b2a06af232cb8e7ba9d1cfd4f4d6bece5ed45b4ceb7a54d63399e92a0cc731f6944cb2b8770aa9d45a1db70110e3975c7f17b3a619c980700ce7ec24c7526094fed2502d736314b03a29ccea21037fe2ae97bbd051b2e4bd2477dd059d8a044053693c8de776fefccafbde3d93b60a52bce7443b096e809dd953f8433d77d27b4c5bc1a0e63d5b7509f633165e20306fa866b3c321945a21af6f2ba68db125df35a6fe5170ca62b22c1002b7faa9cd38003c82324b1ffb6a7ade9826989b7b86b5bd6893dddb0e513f94f915398022e1eba0be09a611f0973a9217a562b3f613022a469651369e264b4eb835d14c5256f4018aa381244abe721cb1691a85db3fa8093451ab99168506ae5450b45ee65ac1439ca04f6d1ef9167d26773d4516f941e3a156b189bc8f3522d5d168ea492e52bbbba6264b06855e5868adabc6b515c19d50fb71d69b9f310ab722fb2a4dc57238476f6e419fec0c051ebcc95369932fe8dbcc11f903b848f66d424df3a5926fd7b1258f9d094504c522e51fed086807d42b5882e6070be793d931cfae69df492dfe15bee66a7a3222038f1e930de283e70140dbeefd8dbc8ed62deae795b3eec748ab41206bac2bda84a7f28b16998e7771a34f9d029e50e4afb9a829894e32ea3dbec6d7b99a03fb1bd6930965ee29ab62d4f95174b4b5a3a47965798a2f92e19e33a1d2852138d4737e762f611d7b240f5ef77b762b4fd76cdd8ab440aeff51c1ea11ee05c6be26ea928b3a12dcd5ed885b8fef6f12db62ae9aadd53623355a10fceb6ff152878f14377879a88b6bf3321e5dd18b1232f487f78b835ea05781884733960685058036322fd6f4f87f044324b9f438636fc107e5bb538a39e7f43b538ead87c79338cb3156edecac4511475fda58abce72b3b3e911daf4dc3fbcce79a557b700c12003dc20132ccdc31c9eca69a559c6eec705dc0af5b7bb2c2dfc68c9f3606edb893fb28b30708c6724fb5182247e8774eae76cc2c65342501b11f07a4d4f924a6096c320171b2b2311e60757bd994f30403c8240712da162f26f1eaecdd52e8a90542fb0c4b4873ca03bacf9dfeea047e6586127fc0ce588290cb2e26c4853d8ec7577a613633f2d14a982fb2703970b6f82a90cc19d9f4644f2d56b8d8078e8302ea3ea7f785e36683579e2b8234b71fe791e075bf11fcce3bf3081b65aad2d5965316efbe5a089b3b49eacfcde4882c2ec423b5dfa3aa3412243f3e138d38de334dbd848bf422a6354e9db798712b7a801c3700311a4fcca64169daf80ea8fb76a26faf5c160e7f3134dc4ebb5b56d9dcfaefaa673d51f7adc3aed5a196f576409c8eadac8e811e0462216a5c26fee56e3847c01bf88bff97a1620c0f1c4fe1ac9d607f6581ad08614dcde894f62b0a9bf0c562e7abf34943d83051879b4224c94cd3198159730edf90e7a9bbe57d0a75601c0ea8b5be26ebdbd6b5227f7b017085ef9174b035f5b44c72c26b797eb59928be3cbbf474398a2a38920f3d34bcef812a4ad68369c02982f651da3cbd0b3cf8c7601463065fd2a4202d2dacbd49bebc232ad7cfbdb0a6f87d81834f3b8835db9a6c234cbd171a7b45b205f56f0129cd2d30ec0612aa19269f9b1db68fa7e01835db201b12893ff5203e605ae94b978476b190c9d3ae2a26280b651f6673b74d3265f09c5eb772b303987d6acf5e623aa1a0e5e76c1c693d700c20ff9cdd8e39644820d2e40c7b8e87c84dfb85f3bf3b8f2e65a4c7d892b3cc455d5963f5a6d16b9c8b1dea50d49c15547b1c0d3ba73ea3896c5a30d598899657327022633a82252c0fcade7e0121590bbe247761be2bfeab60948fc899764e713cbce43581d0efff9daffc5ab5f144ab08a832329b2e7684ab5fb99e79ea43d924c561e39c777fb919dfd1dc80bd3694dc686ba37093074f2fab89034b36986457a2c7f6298e59815785e8fe409a75623397ff17d4349e6112f824d6642936a14e8a3ff2ef52eb12d03c0e290dfd60f7c8601c5da6e58d0614dc2a3a88ae660c06d62d0d635b70b8cba8eb2322698fa9dd765d4f7cc59e9d3733d4cc12175cd04a4052f6425783f597e7e18920b5e01a259343df35553760e639121fd6c53376b6bd73b8e87dcdbc7129361a4d177de57bea1c7bb3257166903463c6b289f0ee3679221408e6ae2809fb80a394dffab74b91b761243561c15de6d50cce4d5bcc07f36c19e633edb5430ec87b3691713f185e5c9b49ac26007a1d6ee46847bf9c45ded53b3a4540efc37f4970aa17ab40d5fc44e8bfe01b54c9ec98ba3c0109d32f1feb47de0a4abb706a926dc8959a4ed07bc3fd869b062ad4c5c6d8da2596cc6edd545151c0cec5457cdff824589131844db564a8ab260e7c450e3170cf4959949149eab5107756ac576d4c10f02807b5d181a884418285246866a91303edc94c0b779b8eb3d89a7510655c5b4ad06bea03d37402dcf5272b2f99d80168da51f524e97524bdccfb3ddb061f51786b0bfdee5c00b10256ede1056178119b36c23c13a78bd46bebc6db497934bad03d534ed885e776c1aabd90815a1986ad64b5114093580a569e34c0071a0ab00dceb272598c158f28456346a2f5c878c979bd416d3d7eda3d8be4c53c05a082d106803e4aaf12d0a024355a85dbb87d687e042d7b4eee37214b80b1f9f50f6654b767d0abb41a44fb98eca57e875edf4ef80a62a5148a8b69f75b93e154bab6f91b8607d71008d0eef6e63b208d41467e6fcf626660c3b08b1bd066a013050243d59b6a6823576cc66eb9f17d9f61d00b6a22ea671a226743d7588c69108f9f24e0f47f31afed5bd95b33687d5fd016994f972c96518d3fbd285e6534c2e8d5a0beec1535b5a374da5778c2aec2baa9ca85c72726dfba61243b4be7ca7e06773e91919bde57d1f9b456f3bc91d6ed36961802ec8c0d4cb211db25a8b32c57f64d1bccda979f572f94ff83453aee5b2f51bdce8b789bc4006f9f337314e1472edaad3f595a033fa6e39779a58e55782361a32cb6ed8b4018f9116e7027574e4df3bafbf816a56453455e325915ea55578c9af33e0a7be6e03afdcf7f613c64e9f564218733a38973ae7a8dd56eaaadcda58604143f2dac99ae10f7eeaf26164a75897e2f5a21db0a206cbda26fe2dffd29feb5a93d56997000cce3a1d2d8c0205f906e09252924844506f1b23b5b692a554dbee10c899e8d6bd0d9db3b91dc0db660a025c1047cd2a693db7936079c4f092e099bbdcd81b315e639b3684a6f8ddb7c25f69c8027512513c4e60a8b13322b2d334dd177a6b192651e00f158a73d6a68f7251a8f819ef841736993b1123ff6b680981d300b70bebabe111cad89523a24f8eb24b155868f1f5bcef10249a1e53d091f533c44f78b9de42ef9ee763362a23c3acf8145258b54cd43937ccc96c99c5b44dacdc35443f1751c185e8751480cd7766ec74274cb45799f0353789a826b864e0928d1e4806a57f844f0569d8a30c1587b7919508f9217cb4fdee4ae4fe16e6c9c59cd1d07e158a9624bf442ea3820bbdaa847603e84739c568e87b0af9efc5675f4ae71ddad6483e8d94c2d8370a573a5392d0e641dd758a4bb1d855c55fb7dd7adab4e4b46b54220a30642db6906331073cf110f620900e1520e7d4438c239308e341cd91794ace3ca1ca954bcfe05e82469f15c5e8227eff266dea2a2335b3b2cf74f5233ce734a062cf0e8d7da37c9247c73ab3eeccacd0ac6fd1fd968dadd14d416c69272d27d12d76aa55d72bccd38c26fb4a6a088f2a8dfe1253949fb3709287b895c283df66e0ec0ff58fca947d6d6086af9f42c16b22d50e6b69df3e62ac7f50cc050e785bf374f5ad8ca69e3e599a3d7f4eeeff1ffba078165a978764540022abc47772044740ac840017b529363338862affad009d92d9ec19330e56edac0ea5ef20329b4501935dc3de2bb2df6ac140c8174f8577b60bd3e642177aa61a692cb6dc80559e2ca26bfed656b8d8d6d62da7b611046876bfd1fd4b28cdf1487badd371070e1bb1e1ee87800ea68251aaf143da4162718ef73b64b98d69c05d015991a8d97c5238ef4288c4319b6ba924485ce7cf5489b18c253fe5d4fb3672abbe46fae8ff38d97c3d42e620aa85b65ec7ce17d3309d15a92933405147cc609f3763e58ef3d183cfdc18493f2459a32772c05b074c30204e8186119bba03f2f5204a80069b835340462c3778f68328821af26149ed3577ce69ff270d14367938e68b24f098cf63bf142846b915183125946f6f1bcd08cc51dbb81846161aefebdb45f3d1f771b94cf71c5171fbaadefbb602ca2326a2d0538f6756aa4cffdb02eab28291c228507c9f7f3f1732282ca23114bcab5572e92357c980dedfecef6506373cfb2ca663fbffa6faa3f1b87eee2be4a3220c7d5865c238c94f7a16fb717f6fd1404c6f9804db630413cc524c64b94413990d9bd090159f2eac3c5915761612b6745fa9bfeba08b1ae869bf9fc01b40c04682039a71903ea068c2b2273aeaa4bb10a8178f939e9034a6562faa6fd554ea04d77eb3a7040fcc3936e4b6743159c36ed2cbccf87b81f158dda9c2168c31e3d22de5a524bca67a9c76b3c252c592f950ee4a1ca70a0a3e09f5eb2b09bb1a9d505eca11b2afe9df4e4a7cc9f37be6355af728d141644f934b3d88b9d435647c458679596c0df934d4a40384ee5299e993ed5ce9fc58c1b0b40a5af5b67aa82c1b2aa22b400f1d45f4fabeb9ca69ea7de87dcf97212e3b1c5d839db621d5a7e561e5581d7421a3543aa701a284ccb122a93ae6958fac0d0562cb3e343c50f95e48ab4df41e59eaed745ec2a20c0e1ed50a640dc9377fcc5f6441327c6179f7ac279759bcab3a18ae36b4eae1c7b29ad5a44082a79ee1f8310acbe7e19ff29264f84cc64559d02f2057af620a0e6b29dbf105e02d5e9ee30d7b312b6638d5f4aed8e9f033bc108512726e4adaae1db811d3503125a55d60b0e58d035324e41a698a842a563d95c69767dc138c67c23d580d2e88efb443248bfac563468d8ed706f53df89e96a01712d7746ef06d0ca842c9b25e0f61dfe9c76e18beae51c2dfb3a2e114b05775f43bab18371beae4e31a102542249568b4f97ab9cc4c848ed0183f16d69b65fcda1f8df2ddd97ab58a7b55b48a25cf4ecc425c7f21a6eb95563d1e1ed72e75bbf1546d6bf4c5ad82fe25ebc1213aa0174f2fd59e4e748151e13bb6270bcf951b27a4fd2ed5aa88d6fe648ab998aa2d8d6ce5a977ba04f6228cde212e99bfa4ff826e36409821047b00a4ce791211b03cab952271702d2b3727c89d692363d5aaa4cad11dc5ba8e04d2e2b84cc118f744ce468ee680f3b7388a7f0c505ce830f7a654cff674c9862c57542b70fbd4e4743632bd23c23f65d29a8e73250ba711dce418f2eed6e7c0fb64c6702e28f6ebb9d8e683710407b401b1e97e1ce255a74458d74173489905c50868b28607e997de23523c320b1b553943fffb06c82b76368d1a889e730293efc3228365163b05996f9f430edd71b15304235a9677f1d6476342d5ad258c99918602566d117567e9ce9779303d116155dd82342c9602716617b0fd84cf69bcda7217024fd8fa82c85fcdc5925ff4b4ff6c77c13aa43fc9ed4fb61543e268954eb3d345b23366302672668e5a2a322c33f7cc603569fcb00d25cdf9e6792231cfed263fae3f40df3720ce434596620122ee941311bd08cd805fcfc80308a58f771d80f3d17cf3111732e9d32400c29c527f2b0055d10b1e9367b36585f0ef2646dd6dc9bcc94edaaf66af356c7dd91d72ce5ff1ba5b8c71789e47f8844a275c976dcc0f47c7f765ff7b32e2cb8583d6f6c718d55f442ae9f21bf76b2d373a1070fe4f733a69b96fa2902d56de83fcce92b5633d84b9c07f490a81eeaf80d2119808c18b9ab5b1cab3b83092e41e4f4076fe94e0dcca617f8e1ada744873c8a484bf6f4d7df4ffdcfadf5d9d924fd41962bd061773ee5e0736cb24345222020213e63a9773d2ba1d6a5375feeb91af7d8a160c611511dc8bfc7aca286c8b99d7129005a88137a49ded8ba14430c627424977e3e05714bd541d824491ad4961c5a09a9ea5a7d4467b89140b7fd7927d73a029cddb24dc17fcd8cb1171eaca63df50e5eb15faa9e76fc8a5bec49e5968ce8ce5ee3add4db7f34baaaa0f0839c52e2996a2654a07fc417ad0d8aca411b347284a580d09e3a5fd94de0177618984306cf2f4665fc9a24fc2d13bd595988a839c684f0698b128b24b0f47f73b64f453339665cabdd5f50b766a4d60e94cef5ee5ca07f9b10b0efd46272ca44bd6687fd9145faa0017e77bcbd35b712d03646563a009631719b59eb356e4d347fe8289354c4603c27bc2b8572b52b363a8645d3efad9e1110cbea87ab070a08f28b8c1a4f47c3413ba5c6f5df055d16d2367ba9741e8b4f4d3e403f89d936ade0a2e65e537318185d96c636b6cc0fe894729298d5160442d6f22eb00a3f1551012ca2bc158e693c2c58ce94a21a86edfe9d6060bdf439ae33ed36f3a2c7bc7f6f35dbb87b559f6b46be36a3e96d7db1a6c23e66e1819e42afe4af3bf6138eb3cf72f3359afc69a402389e48f1ea0011b4eca0ffaa68ff4c13ef1ae1938f5315ca3b9a1404093538b674d6a6f737021ad980afb137cb8c2638dbb2d833919cca0ca5b8c1e4a1e59d51fa39f213b7882593399d95c14d0e6a79f9cce81c12b323e20f36c63e8bfc9e1fa1e3f7ed7eaeb3f77360c901a261e732d4a46cba422a073ccac2d9a4e0b21ef9e2197be15a52b04918baa369460cef7578d1c7c7f9e94c0b036b1c2fd08c83fb0fd089c991292ca8334fe2902347b46c02b2b9e23a551294e6b4b7c5a6f8432f02788be1d317544dfe306e61ead4f6eaf5924ffe13f5e8b7fe54400eed601ebf6c5207be378adcc7a5df5ab2454992df28f0957a7a007027a7c59ecdb86518a493e6fe2eb421894c79db274c5c44a324a92b4be2716db5ac5843bdd56bd67f7ce42251fd4fe17de8be358b33ed178ea966d4e7692242c9a1ed70ed91d479b37e52c89246f2b0f4d197ab4e732eadee41737d8fb878d928f760aea894cd029579968f4ac768ee83e5012ca0033505ac16a60a5714cef687a7e025d480898b1e1c31a5488ed9891390231518f21876fb12686de5470e84dbe74f0e8f5d317b9ea0b24aa3a0d3f7a6785b932c8d99ec18837b9fd83695aa5a723287da794be26a612218cead8cb18248be30c57c4279b5d5a655295d67a164044b708209116c790490ea49faf6164988bfbb30044156cb95d21817d66e00b33b781e31af68cca2835c42ed177ea5c675825ad152463455907e802869e9d34c245c15f66a99845361e977e443e33816aa8f8b4b4720e5d7ec172a093f8c804cadc2b42ce752daea37303783b62d0587eae3736dd70d58dce71b1fbbc138732d673af44d6d93f63e65e7616f3a830e95e0d10d851823dd5c41ba50631f1c8394612a79144039d24f74cf0e671d2f64394ba4eef4a4791d5b13035896d7775d781a4a84a7cc18194da6d7589a6894af66ea2af05f949e4554caff1a0c5b5a2923d938f04a8782abbb96cfe36d6c95297141ffa5ad7e9acbdd174163a38a2d82ecf4e3447b45f0d868ae2e1345b13753f9c94eb61ce6e309db6618e9b964b1438924055101a938f4648457d63b309460d3bc4093e266ed027e73327dafab9677f5cd4914f79c6cc2dbc553ab4de54519f80a8564f49eb43b09738a1648ef79f95028cfc6a039f78d4d54decac0de0ff9da3ec87a056dee933a537c877a0fb4f52ec4eb5b8b500f8b89351e6e69fcfec2fde50d475840aaecd853a4da80c72fc51b967310764d88fb87be41a8e72c8ea81da8da1c4524e6c42c910ab5df198e972f5e15217932cee99a3650ae67e62d4462f895db88dd7597729b4f954b6ae3956dd39351d237f618249d444c4c8e00332ecec952f20e5bef62aee361a63aa9fe63290a141cac9c980fc5ec9129d88f77f3674f13db600376d4de134954538e7cd21d470205f9fad03557f9c4d20323969f57e06a72fdac02fcc57117be834f8f93395be4af33be55f3da483072dec18b28ebe2a69e22e22b1eef9d2d85920c91e566fb3c5bd8dfc4dcaacf36682cd2b1fb30d4031ad66870ee9cd8b8cc143e933ec42da88d580c467a3b5e5a2424dc9f83ac532e1d9d0d1844ca32acb4783e8f2f5aa6701bc178baffbfa738ac1bcf28c12205611d0aabaf5074cf79b4b16e85c43639790b71a19091ad1d600a3bc29ab36800b8a975acc67f8c48f59e99f0c33b9904709fe67e3bc71f5977849c7bb2ac1a629cc2a87368409b01e34d1615f7fa51d4636af2ed5f44aba987d942af2630531698999f8ac1be6c16db16d83e90a249c58539f9eb743fbced52def0a67b2bcecb328fb69d49d380569255aa779e49260e390f1d6821caea6a9b8ae4979f942d5944331b73ba07b15a23e294991df16c63893821dd357bdbface4c0687a1ce3cb2e297a1083605ab3647b7b9d6c1330cf05f322a954b0994d398caac5ba86335d105cd31d1e39a154f8af65eef45c5e9405bea18837484307061cd6c509a38225f3142c3c112ebe91bc8227aeb2d7d53221f4a670a422521c421732ce986453a6f5bb673e2566d192e8f031ba8169432d66095e7abaa78e921a921f2071bee99e2670305c50a94dded7c87d88df38a170c967f01cd5231a8e97b6b0f5d52be739498499387ee7282bf92e3239282f1b6f81eacfebb84527464e413777fd27f7a191ff912a74b19c18a6199bc6fc7f0303de62d1e3cca342a87a06236484b48bcfb91c27314abe76ed64d66fcd5918d70be9141751b5342becb1683089e1d7a9a136c8963dd468f9c0578369a79b3452f7c63acb977cd43a9a85e3e65de718c693852732bd622c4cafe69529d2c9cd94a8c27eaa69f5c35ec61c8467631306b1a2830f108d742e7cfb045270dc0822576f2c835e322926a081ff6c8b1e04b193327e8c8fc14fb20c41cb58a353ff362e01b85ca8c474853cc40e5052c7ef2efc07375aaaebf9a417178314a46b4f51e0a6d1135b926c4b4e52e9fca0075f17faa5646e17c6b311fec6aa4cf65a047dc90f772426f9c04a055dcccb4f63c0084ba3506e3d74efaca8f8e99636a5f70a507d7cff2f6e22346fe254318923a22397c81534f5bcb34a58766adee0cdbf0a6938cb8980929423d00d653278df818dbd09a84f1ceb8166066a8ae4662dafd62c83129b3b7ab6128b1ad7e846fc29ef30ac4081f73d1f9e55b667bb96e2c6877b789882abb045619a7b95006dbe86f5632c014265131634124d564c511a477db18b547d1bc388559849263d4ec6b5d245b49f3be0355e8d42a5edd19027b3dc6b9a4143825c5d955739b6f42812d4bbce34b8cd51f85eb5c7b2fb5abf25b50a5dc2e17afc3b5dae0b9d358f54dfb7679c74ed88b40969da8d01564b5d1f4a33316d42411790ec910132280ad00455969ea55db4862ad9cd4cd633dcf7f204c582446ba7ea800b10e8bc5e7920a10387d3530ecb0c2e5084d87676986f7003f4deff063104f37364a8b6ef807f35427f14bfdbfc63f1cf9b01fc06de8e686637da3e415821cde3aace8b6ad95988d549f2f127aa643218ce054f3b63f0a8bac934e14808ba4a736182306fd21de959b1a127feeb54705180903406ae351ec6290f8fa2235b257eed0e0b8acc59af7208f8529f0a6b40ef374b87909b8d96999a2e637bfcd09ef517fc7672bd2a0fc6a377d8740620c0b61dfe03bcd98ade9ca451e977dd21b6e88cb66290affa9cdc5c6ccd3611520f01814049fa6c4a32889194e20f815811af59c8c9fb3f8f1acd0f184eab1137fca454b9ecd42bea3ce3f1e581639a1e666a75a10dff1f6867561eefbcc4221f4b6eadefc77d434f20af168b129b4c276b8138f06e83946daeaaeee4fc0c110744ac45abdec0b23c3f5699b43a4eb0699c4edc8929b5f8ee2ab868c8f83be3fa6f2cfce480bbcdb9c3d9d3224c24522b5c7c03e3f49a39f11e2d79b009904c48b0e952478acebac81b7a65da54dbb4da3a6f3018eb5258cdd4cd92780eff398119d3ee3ee15bf76ce6c4b0e8e127c9b96fae4c861825ec1ec6f4284d469f474e3c511b9b9701d1010b085e38a66b7a58cc7123f335a29c02423e354840b74911c69b46be4e2feee0f4a6d775771525dfb45be5454f93a8a42c72b51d72bcc557a384815ec124c4582db4cd0353991929e7eca5cf5895611fb2b72ad84728781d0e1903d694a21ff3cd7eb1ff5c531baf1a6fdd23f5d9ada9060019a5be73cede315ca603d4d89f0b85783b560b55e341c3eae880edac84158e5e8bb1dcb96a7b4f6a68bbb56837b626f6e6e7ee0fa094803b87c81e0c759e04b68d169879a4e88a86eac690a1b0f503d271bdcc0d7097047e5d08ddd5220883bbb0d5feaf06b4ccf0f4751f7b244282e45f4cf969e9a17ae173920fd0bf0c78d189e5b10bce5561e4efbe7431835fad9c78cb278c936db95db5a58710971bf1a5324e054b705340cb69ef44d11184bdbf46971fb96ce0c9ee72a6531d8767ccd0c85557ee1132258595ec6375e6cecb7b99a6096a62a78cbde0e610728145aee7ebbc70480d39e49cc8039b706d0e2f87030f48ffdca0880c95ff7df50bdbd39e410b009f7104a569fd4a3821e5d63afb5d99095032172cd70fb8cf50bd1c1d97f2eb817d81e7ec645291f9b5e3e85af640660bcc30cb0ad12e7f8a08c71ce86a2d9a2895341fa37189df34becee7c4d68da23a6197cee2d9b473e2ac68a99764a25d9484b3d4786b888860f962603a0ce64b281b9c2e720accfce375783bdf0a07176faadeef5e19d9c95c7c2e1f95143205817e686e673580f2e625df342e5894dc3cb6c6b9f3882bfc20ed16d717341dfbfaf696d1f61642560e1b1b6fd40386a6f302344f12eccf53ae47d117bddf95d86b4ab776de74649bd60ebf19babc9f0b2ce721e3ed4c3c316a596b94fe9c4ecbf8e7d141e31f9f7ff420eee8c496a40dfd0e3cd162d08b0142e2c5b9ce4f3f989216dc96101f90730671e4934435def5d4a3678067c9fbae3a151095be8c23c02f7a44e4444c3693dab86ea3006e9a41e17e3a15c7936ea14d04560a8a8af9b376236afdd450762e4b0f6c90c139a99ed7e27ff48f07eb4eb55df15a84bb8519ca612345504097e1f33956326fc8e1f73142b415e0591a5c0bc312fc9eeccd1fe9db37a8af06c73d41bab47d1e7899912f678c25f96acb4cdaec3bbd04059ce39507e367797e94019d10a592a83f31362deb6e78c6d46fc484bfc53e832602e4f3f458b4a34a73e1b886591ba5d68872264bf5cc3e889d56a4705bb83cfcd18690863917407f3ce0393097fae18584e2710f6ede4b6b8fe741de7d0f5c7a22ad479b21ae39bbab3746b7384ab2148e8d0a6d5dc72134a29c8943fe3dc52ecf5776631b35b094e1d0b7f8aaa9aeb81353f87ef83330b2da5cdc888708fc87f65b2d1728e1b920e24cf5696ddcc0460467a9b6aa6417d05be160871205bb247c275687bd0a96ee159db3c099b8942557de4e6a92004bddf15576ba6ff1f4538795fb8f42a89a05c72b225b5765c8aa834b8e7801b84c198989aa03c2593a6a03d3284694986654a894437563e9759d086b1ad100b7a80db6ae1558038fbd761f5310d883bd22874ced744e9109f091e5df0452c7e71dff2dac3d687ded6e2fcdd36c7a55e6db69ab9d65004577ccb32000dbd147059ca149fde2954f73eba045724e6a418a3fd3a1c801eff94e955c42b1df5ea27d0146872259d5eea6374c82cfc5fef55245936f441167bbe6bb86d854f4b3ad24c3eb0ba24c6aa1cd80e1c3441f0211778f0838238d37aceca6c5f3c402a475b6e7fb1a9818ca04725eb40c28a00eaae48bce85cbedcf82d5f5eca960fac4b72901f69ed70d50863a4e5ba320f876c83ba06dc2a0f3b3079b53fa9228b2f366d20d03a59a4ddaea0f64a9938bd856e898ea15be3bace397ca72264beb416228546b35e2c219d8ca9368562cf063c47a2f61342f33b62ca6e30c3bf681a4c2da6445382baabccc0fe7df36818467bf64b45a212c7405383806ff6cb81cb5c7085f2a54f9826acc7ac0b2dae8c190677d98c93eb12aaa8d67f1dd023a9fd9a675a4aff9eb48be021fd373c67e0911371313b49b1e3a5cb6e1519b01290dec7c99d04f764341b4e4e4847b40a158617b66fcb299b845cd18686016f2b70635791ebbec12670b444a07f553d8740d180a2a7881202749032f50d0b19317558979634a9f9e6141fc4d95522f645ebb023c0970e7a2f6c03d36040e49f90487dc52f915bf5360a8417bf482622d8b0ff68c1fde88971763278a81cd1e1f3b9dda5928d94b1835f113865a181e6a69c505db7ce7630f5c675672d8e89e81fcc65adf6bb52256d7087a815398dfef2dab1624a6c607c3ff5f5d47b18e0d9e8d2ebd3cf044a90adff8f74b3f12553f4cb6fccc1486ce461ba2ee7ac3c07d8fb7d585bc197dd8380d58b0b3d105ada7022897f1b48aa315303ed43c5d22a92b4782c623fd60d19bc14a13a691998c44cec19cf965ee20c9a388be2ce016831c8eba29e1e783655382133d995b212607f4090ab27eaa0d253b322bc74330a174e2d1b0eed65b3d477b33663fdef429d0f99f637745928693a6f0e6018eedd2251b057743fc638628f91a077f1e968bdd2ba13e91791d5c4ef2b6ebda5fc9829216a70b4b400f534dee69919cf3275574171dc1bbc9026fb9147e9d726898ba2b365d3538bc8a161c71c0e07c883403bc119a0c005ba21561649da7a8ee37e5aede6b30313f50e6603c1fc5e9dcc32236afa9c4684640d4a61fb3fc184c8ca71ff812ba43cb886bb12dd848cc44c22b1a4e8d23d4180ff265e41cbbc46ecf6a0b71fa7ac7183faef7c50e9462e7b6d1228cea4e21500ab5c03800f8a8572f72fdbaaea25510622457acc88f9141ca4407cc8fde3ae5a04ed602e3b2039bbc954b492dc6c45197aee22b8eaa94a11c1df0b548c70cbd2fc3580fd4730de5a8fc8c168153a8aedd6c05b09a6078aa6ceab4b3c21b48374c56d98f23567c73d5701d1e6f2cabaeff94134e9d69fed60da294758155f3a2de452996ab813b95b12509e4323abd0bd6b4333a09aec4ee2e65686de3172ac30cde5b9ca8546031690c9eeb4a0c74355a0ab44ff665ca9370590553369f1b53f42fcefd21c08c42630fa93d55d42ecd88dbea8b9103b9b9cb8d9fa3db4d4b7f35f5177ae2989c5410cf16e7fb50862a14f8f3901dcba826c825851a7d0953664d6af0b700dfb10a09ba487af17951d7e6cef824833a73f80245763c515aeb9fc029e1bbf73d72997c9af08cfdfe0f1376c133b171a2071c057533d16f7ec9b0155218734f478e4aeff2ad3519ecdb4fe49e8ac50f93a0d8697f996436e3f7989f80ca2ed52979fb48c4f9939b041cb4f3706f933bfe2a4155f6c6c3bcb6a946186b5c2264e78d9f3397264676a7109bc804b2715b31aac63ae5548259832e1f0b22fbe63d4bbdb9c9e25bf4814efd127cd90f58be08e6a3f363a1783607977c0f4661f6f22246e5942a7dc6dafa205e7e5e9b688cfe3a6f2506883ff5b9d029d3b94633db7be750dc6ddee94c20e873c9ab866147f7f58ff860a9b863b279e8f49a5f601ee7723b43c2800fd1e1c27ee31d792adbed3fc01e21908540de72ecae8bdea64c06a37cb73353eb18b1d25cb17f5a4d3ee13f91296b978e0fbe425e5197251087e2a0fcaf439db92ba3322019ac6979a2a5c3e63080737dfe16afdc8c3bb01038d0b03abba149b3120cf69174d187ff347b7277c9e0a241d94c90f58c6048f85be115c65df7409d953319a9d3c0dc566f8c464e4b68db8f0e56c5aee2494782592859c740e1653a073588170ff35b98f7b5cc4d681abc5cc47b5b003fcafa496a4dc876b06f0cd4215c10beaa2d3d02113a74a6129da964fc577157fd43464e93382da16ac8f8b8f390883488f12e789c410a61b398c0a7c8c318147e403e742dd27629bdc309b7dba4bd44691de4fea84c57d9b07836e68fa77f0c51a8cc03fe1b4984f49eb5a79592b76c426ea14094f4b63f4546562a62dff30830e66229df24313b1a1e68e05603bd605dc79a0bbba16c16a597843e5da5ea43c97e5e74f898876d03b7a2c0faaa12854b6c43d2b9166ab575cd5a30213410ef59e70b5987f0e24baf9f78273f4dd477a8962f2a3df336c89318f7d4549388b018a522b1377f589af5d9a1fc107e6d83ac11c94e6290aacf290214413ac0f61f70ff2c360ce6b1348596e9a6e86e282d8fc5e39ba7d8339e1670575253a4934809cf8c0bd7a92a8732892d93365b01acb95c32156dfd7cdca35f8e25168c9a2ca633b63142f03f1496087db4df656d69c96cb6e1042c53848cd037a0b10f9540cc3ac81368a59af1fa1228ffc9f90b8462cd8ac953a4dc66539ad6e7e19f9ced3ec1e2fbfb8b22489d92b7ec78ff494fd206d2bb01d351a7e925ffe7d4287c0e4a19789a02fad6d6387bd9f9b979d6d08102264a3a51a03ca545fbcf1e7db875dc3f60841a44206ce79a4426615b68433867a12bfdeb987487a52b91be7aea6572aaa2b15419eb724f38797a15a8bd962d4b7ebafe148c6bd38d0366321c8219d0f7c2fe9c51055f22d80c7c2d32ececec255173185f8298f4f198479ce7fd3c8c0ddcaab2f0e142ebc3e0ba9b87141b072c1a7949e89040b5054874f66dde6f6a6cfcd9b05f203c2d2c3c46ebdf472e957ec21247d32300c5d2d6f157cc21c785c50515271ff104d2ff43334c1dfae38ad81d289d327b478f88da044961df4d4b1ac9c8c173b861e8d2b31db032a92dd9a334ca5e0701d96180ddb92728b07c44f137c282cf1db3b26e0c9ef6807bb360a06da96635914de32fea5e9c6cecc5b1694ab989f90c6b05e5a5da29fd764fb486299b278f4690d983ac071ec86b0ef537a9c46c360c8ff54034f4ca319b91ab50861c0d5be260405d500b879b602fccd441e020f3b037d72e57962e6d983ac5114bc86bf46dd2af2aa185b9761c745b69aa6b72b4ea128c35be6ee9ae16c1598970e2016a48cd12d8b3d45320071e0842a2ac0d4d52e2215b44ab4c267fd19dd855d1073c6c8dad8e911b752fd6e222d20a49179ca9fbc04e2784f25303c97406749dd09b5b2174ffeec291691f6862926cce54563ec8ea7127b15a202d3b133b4e76facecbecb031f9f35756b4cd2d447a2de59bf047085beff096799b6d71dd6f2e2f98da27fb0fa61da4bbd121b7630c39895c348848ab9a81074aafdb8dfc84ba74c7525e7d2dc47585f311eae5d2bd2a7ccc8231cf5195ab27dad4b37faefcb40d5447ef8b7d3a70524e3da01107aa1cdc6b57fd329655356aefc557594f30dce9a1168e8bf7854bcdf2872f8c43cc8fa26202384c84a4ed253a99dfdac9bd92a6d4b9c42761888358ee8878fcaa26e82c3350455393412592e4b394f4539e5e1f521e6bd9b8285d3b673acf883127ef540545184fa2af30d354ba76194986698ed62934bdfa1a5ff6229f7ed1b9b750190cf0bdd3a3e2ea16746db7610c46013dbcf321ba3962d5a7d23d41bbe6051ad6c7a9cf1093562ec10cfa3e7d1c3719c458b00bf846c54d80d77ec9096c56420d27e601308cd15da811a02576c33bc6dc91c51da6617b1b47711d39cae72621bfc721990322b4dd61e0bf3c430c7bc3c00b825711a9cbd6ee8849ac8d8e78f252db57f0044b44989ed04b842ae8cdee1a93fa0c0b4b37d93989cbad73345d550f6fdcf3a27fd07997a254b4f3adc5c987a4a3649fa80bc36ef777bc047dc7cf221b6da5e0e3e1f3899ee7b6ea5c4ffaa53357db1bebe6f71cbe84d0dc3b2e483c5ac89b4396f5794477bd2bb24d3acbb61399c065c3ce1df15bded02550ca8bb30b227e127e5e07c34149e3e53a54aacea316b7a04df69f99686f19e28415c941e2598de3320298db138f678dcb5faa95a090372553352dbb2169fb0640b8164ac1ee187bd79cadfa1bca6f5e09e601983d980dc764803af5f1ff3c670a43ebb14a4806fa0119ccef43526ccf6cc68826e8cad76b87667cf623bb936d3ae8a2491f16505c0b52ffc9b061fff968743ec755828af16cb66fa1336b2ea74be9fec493328347604851c4b152804da104c535c040ed6473f2d3406f162d1ead92a043dcac4229ad685542f0ae78113387e3f3707b1c88e4272accdaaf248410709269f05cc2a5ff079fdcf2f027b8bcaf036afec705a92f133b3c87389d2c84dac107aaa94d5637a0487d4529ff000d77b297dcdaeec7173892efcfff94d7e1207b54e0f7c0d75fa96e8cd8d026eba33522542338ed0d10bafd1e3013f94b5c52f5b3818f0c29ce25b12c69f2f8776fb1aa1eacf16f93404e1062a29231c23522c710eea1b8591b18b887047d833d6ebc437fe94fb276ed95a243bc8a961ee9726dc413835d885623aa2af8010ac9214d0df719cd4a423a8d4ee6f729f2fb4fd6c80f111529310887b672c15883d1fa6cc880b85ca0a3837ff3b8dda208868fb79b235cdc5dcce0818b09cea3193a29f45ca14c936e71c91f353b00d10b24d6f210b9b330cfbc2ce7e0711ff9aae479cd5108fce44402e3f8f9d1fbc225f33356303a5a85698e675ceda3238249542c6857c07fdb06d37766edabec9ff21018e66e7a5dd1a8848845f0b9543ebd1fea10c0ef5ed66c7df6acfeb50cfb02b63cc71dffecb61d79e2dfaaac71b401344a26012991a281fe0394df9f6b8c5a200c5ff5d70027f009b16cdf1f62c6c2e68980354beaf8254d1d1c89f0f271f34dc8929207d3e45818ad95da3e178ce4d865ef99f2f1bc8b406585b52a28903a87ff0cf57bed7a24974267e6a8fb91fea83c64117908a8bbc6d8e264015f668fb917180197cee935a94155d66dc417d975e539a286fbe6116b63e2589c4daec6a1faebff466696011025c07e1ab5f4f430e40ef6316c12bc2c8e4798ec346ba9c62c441bafedc412ea475a37d5a89603c1e5d1dbb0a8d440a5c2d3f0100fa17343d9b2e45fdb3a85c1a49d5f8a72296cf4adf3c498db81f57e5cfc6eca75c856629c6cd01ff6788ceaf73bd7286654c843e12c46afb2e1853b03dce6003338f7061738b543c85cec315f1483ee1c24686454e99c4adf6b724a06426f57ad29ede894c35197f5de80dbd0c2cec4c6a6ceaacb35244212438d6fb59fe4d0a2b1459e4fe2c4d53512b4f0034f23ad9a792f3d5400e06e554c8079efd86584e3020176181a11b2f57c0adfa3d9753d3806f815a196f6bbe4da464861aad361fe9494227379a06fe0659966e967b82c0c7746d6159131c7e88aad232f6d5706125567346be5bf0ad4b189d8f21665ef097a6c6869c47d11b50fdb61027ddba033db5864aeed1cf1018098a57511fa634cc171720a676ebf6becc65db56a8fe61dbb36aeb5bc4d4a3ec7983ca39b788f6fd18f98af52bae92848bbbd177366171a6b463b07e948d0bfd5ee385b6ae369b515b68fbd2dba7d1751d8098566961255e8c11cdbc3eb37d2ba15e10444c6ba476206006d53eead11ec9192474b1c7b123453d6ac4075293d5019f5a99aac0529055837da8476f2aec02ea7018a36ec6f019eb883b80bc961cf1dcd2c68a886a646b6ab68c89999e10b4c1c9760e73daa6fb50bfc9a34cf509cd5c7b316ce3e5dc2df4d246042e88505582251ad76d91679a1095b965e315b370c09a4a8b7102452c4ab0a6b7eca840f176c36e1ef1d43d3e0a837df575adf132088c5a401ed6c5c0ee36598ff136c5721a5d10da0d4eb58e1368207d4f25469816e6a84cd0eef379563a34f9c509e0d6138e08f9db5beba89c2f443ed39d9f135c6b3824048acfeea8150d2cf247cd79766a3cd3efc1720b15636169fedbdef57784db5025fa39aced92629353e29acd6accddc9c0b2e95a5043b1149c3dcc1939b3b48c278c10eb980522012d4cedd067b46a917235da0a6beaad42f70b1c4ac12938faf97e4fe54085c32cab77dab633a3e63d222851c6902596bfa417c3cf77a376300270142ff50600469f5115afca34c903560ab82975317f03647ef8add6af8e16e97bcd94c2c80011c04ba7c356793186b8a52214b866cbbd30728015d00a84ab50b0f0382cfb1b6b68603c845201f0ee29e3a5c97d9fa63a5cdf73487bf04131715be331b165ecb2c9c8f84b99e00bacded7af3ffe19e8ae47cbcde02c190c5d87fc2c0469473d619c0d078ef7bd8afa52e287dfb4391c2adfc4beb8730b078c32feb996579d9da3b3b74eb9c01cf45a4a4f8b07a3e15e57e2fb49b631ba9e2a30c4fff90426ce9f4235932476032d4485398e15a057ec7be7bd142f98e5e27cbfe5f55113dee41caee361ccb35358dd6429f03f1eb949933e4fd6e3e07e17d8ffbb044e6d8954fe78e5565d9638792d5d45bee875faa298ab05a143b2d2eb5c921c12243cb23099926f9517336c32b8f28e316d9b1dbead2a5769a8fe5b97055e65d390d01ab8fd347637b72dae8a5938f19e298b357e101cf5286ebae9aae94506ee25f617462abc48bd6022462713612a5cee81eac876ed507d8945073caed4639960960a821da0ff3fd21a548890d04fc23e1d1655755e98d19e4d873b948eb78fa0c60a8a43f2d30d22314e80b74a8018812d98dde563a698ac8eb0bad9107cdb81fe6411c5c321c973102b7310ae7e2d8f949cd32f7ff3cca436128a33b8a5e632d9b2514d756bdcdc5e13f7d331025ed8ced41221d1287e2ea3316acba12c6f6d51e4c6afb94532d2f5db41395b11868b3ba4db99711069667bf64d7088e8798e9a932be34da284813fd24ab9b7a22a5cb20eb9393208c6af74e61ca21e3b409ef80196d97c7069be91e9760f5308cd8242250f8272b40f8ebfb05fc86af89e5a336aeeb570274007c3b731516b5cfe8843eeae7c9bf8fa72adc7573be13122c73becb3051141bc36c7d05a9b5168e2fa32dfd2ad777532dae8060afd18f2ec9024f3af081dcfcd4aca70a804cb9a445ad696eda11f0e7c203c4e60dcbef86c0a51499978b8f5003044c83519c88123ac38987121a513d4ecbe8daa53f483e67e9b3db5a334833599051471d273d9f177a6cb948fa671f6c3c087603c1027a9c0b9c0521e52789453fcb1386b5b076695a32aa359f4e3895a0d0dca36bfa0d427e290dcd2e07b282541e0d86d0422a836008186457a48f64d4930d5c59a8df4e6998103240b6f330e978ef99474dcaac7cc25a3c5756885cc9a511112d60d2b426c746fd72cdbb0e6798670cafa809f814468ed337f89e65070b8c488b9c4efcc5c85503be0d1b3c10e04d00dd409d6f7fc4afdc74ac6aa82577ff219e5bb6e78747f9a942511c8176bfbd356db949868bc537d9ed9ca252529b653a928b58a963b7229abf0bd9a00069434b3f225127f801fb0d67032a4dcfc4f1d41787b5368458fd811d5b6ddd6cd89969f4bb328efb0d5cd009c264e773cb1865e5a1260cc8098071e5a72d734729b3dd75ccee17bcd31777e08b56022650383f32c53a4443eb7647c5d5bf7b773d05226d834094d8dd36995c9d4e54664b77c63d1c5a3ebad02eb81004fa5bb2b3543dcaee7f39df71ed4cd10422f4c5ebb9e7c7d0823029842cb23cdea899042e782a40ff1d42d77a74c7f87a367968c4c21295d730e83dd89948627c9fb84de8cd31c59cec66b74325166bcbdfa38a4bdb2bf0ccc2aedb8a52d6c1d3b288c19e5dba16cba4dded0162a82ccdd1aff7a89d2124e1edbd97f7babf3ab7822066c4e01d31de5c3fd92f15091feba82891d4b9eb04d512f13e9aca14d567329b99092b78d9bee0be50b7d1758b3ccb56cf04d0b8640686684d61f4573cb572918932ad3f163f1e6319ecddf89d2d2421396dbafa9e8c1ca477d0d6d93bae7f30bb3d0cb2b27e178e7356b34ae4b77c8eed4ce0d10e65903222f3dd6c46e1f3c384da06c5bc5f0df58e4dbd06d62a72e71d4d6c1196af8d73ea1e41aff32c9381922f2359090bd4520d6260ae4a844dd88f2f80b71bfb7a121d8606cd7b206f6864f1dee0ae8483898a98948cfc583dd81bcdbf3d05a24ed03e9af6663eec060fcdc85b8c8750f69c12749ccb0d4db4893164cd97c33603eb833ea93e3ce2444e7509c24eb426c8eba5d0a2f5801ceebd5137910e45007df157ca16639c867bd158b8d3bf17b8c650b78d49a8be33dd43907b66688086f21ad8db56dc2930c4b545e269f1d7820663b208737a13d802b1199787f7ee2e2a495afa7640cf38618d6042d6cddfb60ddf7267d0f22ee0f3e0aaaf53390be91eb5e208932e23be054ea03863795f2ac75fc7b2fef4a5fc8bfe138947aad9eadde5ab889968d9f124eb51106c7e4a5e2ff2f7c03c3a6f901188bbb3c3535d7daff9a5ab65274bfaaa9f9496c740d792edba39f003426819cce51b0bfa6120d9dc79f1361950f962c134da007f5201ec4ad93ab10da6d028cfd840849cc1ae12a5e96635e064031d81e56d230bc907a639ef9ce18fe4ccebfb3d4d4c275e1a1733010f7a8866b10fb4d9e8f7919fec595e3a72f6b982e4437b5ff736e01a78b8a60dabf2965fec380894b973de87f8514df6c6f6bce0846f3255077de50962ca823f2ccac4fcc25d561aa6ae0c4935ee6dd41446e8377b42f4c2dccae5b5744e12c9385b0e6ae54ade10455924f0f21836b2cc3ea5027eee7099e69e5b8cd0b0968eabf2bda62da59a7b82831ba444cbaf5ad39c5b7da65b265d2cf865979b1451d213621ca6124a0e5b1db3fbe380a17a0c02b88806ee10d3dcc75498bf7eb0b8b63362b1dd32402de4294a2353c37fbbb1a68e93e3b6ac2d2f65005cbf263b70a980c53d55d13743a58f3dddfc6a46ac33fe9f275743ede245c7b2bccac467ccc9a77ad9e7549bf983891bc9259a96bd17c19620053c491c62437ebaaf8d72fd25055fdf28c52fdf222762cd56b9a67ca095c350572e18113d420e7bdc3bbd2d3a2de1904a524513e7cd258e4af326af009967acf50a4b64c5c335f4498a7b277566739b77ce77f688b307a2cbb63557cbdccea36ba2b450e8d6cde9c2bc6f53a62bcee94b2fff02d5647cff5e366491afe33ab6c32fe2e5fb22e4586016b72221a9026b7c0e902e043f625ccbeaca7ebb279d8739ce83d7056139aa5d60a63512445db9482acc77ddf9e7792b0d2eadd595210322fe64a148de0f469869b6d1fa1218cb04e54281a419c3963e1e32afd80c8954d023f50137fe496327818078875edd16e4c5015cb37bb6811760a0d6c0e253c28d07600d2cb4d82b7afecab1fe271ad632f5b4e37fce6806205bbb42a860bcb2b154365b0c0a7a9053b7a55a559e204f55c1574eb7168baea359a3b4e1418165861aa610439fc765cc8c960b8eac1a51381e75d10c2a4f11baeacadb5e37802cee4f43c9632495a43ddcd5676969cc4b591ff87e52372e2b76607b0cb366202dac4b60a018de9ee7950d9b6795a626ad2f818cbb753bff77b55369926fe78cf4ca48f6dce9278880260779ef7964a96e8c208ff0028b5dc9c61f59114b47bf68dae81d02dbed29be65b9ca46795b96fc777f8e5be64d5f136661d3a581055ae0a5ae1746cf32313e7d932f3ffb74f3e031455b1d3aff9ba9377ee9b71f17536b9283e4b1258a0d64bc0b181fe24f5ddc38baa8ea13ee82a6021c0ab275666e960c336e6b03a02f4f301862a118bea956ad4e3d006fc0017767a7e50dc74d88334cee3fec50b197eab3ba059cc0485a51f313b33c81eb7ac4b4cd6269631eb0f03bc7ce26850fb4efc370d11f2aa7de45343ec881043b0c37ca02a395bc9d12c8813852dcf79f8ff643c03623234aa79944aa3fbf3f5025caadfd16d2b883b4927c9c2ca59a5c50ed2ab2260a60d407927b545149e51d6ead9539a3a574fcfc478ab4e36da6d20591be55fe9cb59be9f13fe0aa5c2e6bfdebad75d407e42910b41123a96a01a3c7c19e3983409d2a4eab661300f2f554df53ce3524cc469ff9ae99f272c3df0624cc62f4ef8004bfa14e04572b43f7c8eb57aa3f4d8130e7a61eaf0da47a6743de01f49e1042b9cedd21fd3adea3be0bede5c11eb036f8fcb14d7ac34450ee38fd3b22546f26dc7c7b0973efe18f4d35166b7fa2c7d9c0d0fb60ab4acba3bed7292028b890ffa22436ad2bcbe710edb0c9807c5dad1defc616f6d43874962ea55d43f66f40595dd69d822cc9e9dd2bbeaffbdb28ae1ece398134630b2bf03a3de18325a2ed711dd379a715071bd68ff11c57059cee3358f4afdb1ca30289c5cb9a34627e1732a012fbb5374768b914b1c8b6d29a1fa195b9e81783c23d390d92acf3fab4c9f40ebfbefcfb6f88402cbad3f86fc4421ac7bbec277493e791f3666346fff92833feb6a0c4f9099df6959b1e92be017f4b9e23731d2c20fcdf2a33755403870f659c0c5e8efec462760f37f02e0ffd04d71a8e73421edb203c75748f5c2f9ab9a85c87077262f1f1ec8f48ec5167a6037b3e8d40ed2816eda8b3bc35bcbaf581038921440a3d060f047cd7596b56b0ac51af2372cd548ac281a231f0a4535bae4d10896395721e0b9601c5b9229312495d8b4ba0fba7d435bcc60bcad83d154c1b94a140361c7834cd9446adcc36875dd22470ed5594f306be3d1a200824721c343301f47e81f4d6905a612c47720edfd11af360f32fcca9c9d73ebfaab042916ccd7356afb499cc6126710cb6046b778546a911b8b5a65e4323ec526e045bd9f185755351e6129e0894a7d6d991a3d9cf405a2054c3afda50d5b023940915fd5a19ba0b1db02b33b7af85eefa32842603d9438237697580954aa525d874cd0a1135a9c74eea591380916408a3421b614fb1959b44686d280db1ff56bbfd6553e05ddcb9d8193036454befef9e703bf3da59f4a94be86f7947ca816e4bf9c2b6c41ba3911a29ea63808aa69e02a1fd41b7aff8fe988937d1851b07dac10b4d0043117fdd08e8e72587595ca229f63a5223f9af0a20f3e6bc7dcffe0c94167353e15ca73deec327472c7ebad3edaa137dce3419360de68001c283e71ecfe125a8902386663042d2e4e00dba5c8e0f6a340d56ab8dc86e6c3414bad8b9d8405957196b3af3c20cb00eb7f12c0f011166d731b4cd3bb302f7e320acfa58ef9b87b7dc7b170832cab2f7e73e340ba82ff3967bc75cd32939d14f68ce0cd703d92cc97dd922c56e8e67b6bf7acab5a5af406a4d6a286a95558eb15565de4cc6974af342829788c76c8795101b38ff481a3f139f39778395072615c72dd73f0096e6cf428d6401b6966cf48fd6a0f94bdd2833da5b81ca8c9d75c18740702096da8908ae6fab116d7e94b7bea274bfdef1f66e95e9f19c1a65bc307f06b718caf6c042c829448150a721493f8ffca9b8fae8a3df6f6a654b1c1e999649cd2a9a469d1c625c3880c0295929bb08d4d7a935022c0d8800c689252405972c689f539a3339e6cf47f9e272260fba6f6a0367f28932394dbb929aa73afc811a52c4b51c1d5d4b4663b4547496980c5a84a989fd8b18ed8b189c2de22fbb268ce8fa3d9af79a7d893349ec4a5c8bac47b97ffe9355e99fe48749cdc6b9fcf5d89b167787e48f108891e1f85e4da5340ef33a5c00fadeffbdee033755ef515626730b664507b04cfa0ccca623e4fc51c0f3a5dcf8d3f637d024706651cd0afbee87ec6d2c0aa3e97967de73e6bff1d060cd07f231fa95a3467779dda8b3aeff89863a45d79ab0072f18a8dd9220ad274367dab25ecd3da2f1272cf343e604ca8f3182d600e83c3a35ca74b3e96e32a095ffd0950571507dc6e85f330f0eadf4f8de4a26092955b5a3db1eb66eb1ff8333a22e38254de591f7643219c0b647c459f75498de174cf0b3dfb16f3a193eeb87b66c28a28bad3043b751ae37d02ee9aa79282e9a6f664fda1bdd6cf1778211fc7131efdb9ae8e5b3f116d96c2ebe8fa676f398967197a6c40b36425dc11d52265f96d094ae681bf1987063770a2c01df93b8382b634da71adc4a078793fd2db1e0beff8c3ea7466b239d04ac7ff1565a8acd627d0e4e8b8cf28431bea91cfdbba7be3ecf86e9142380b5f7b80dc302ada9a9890b3fa38e3464dbf8a967832d493cd024b2037547878e07e95919192d43520420af48970a907b55b05e51d831287bdb84fef9d331e9a44044896a482cc7794351d37cc1435d375dbc73938081ab134cae80f0290c5409682d0cae2a9659293ae987b6223d7bcae1104279504c650838828733988b2779a9aed5f356ae9dff3605e9d35122811a4a61c6f8cbc31732d6967950b272b2a6efe4042eea3273ad62680d33b81a2343376c1d24f71b00bc44e3b59a020c2eb54e3531b7dfc994796e8d4e3cde97a213170d34b8b6a5a5a59fad6aaa9ec0e7bd3ed54ecbf99038bb92cf46d7c770788d86fd0f91c0a4604267b5eadacb3c1a4ca62fb5093a923e62dd4453f1605c1f67847009331cc3deba36d44dc9b3d4f3e1b4f0b7f6e91e6f70d023c0fcf99c658b73f1684233440589ca8ed7da281b8c738dc2d2793353c97a50ce076bd4eef499ed30200a7259b3fe5650b3b47adc16e8c0049f5f4944e829e3dbb539bf0bd06465a9bff9773a11bc2e4a13c35aef769f9808aad81f9b13bb3dbd9063c3555d7199455e1fd8e24a3db931a4b6d08d6fe7309cc9f8b49da68223d3a569e07a367bd672e3b56997cf4ab95695ff3e28178563eebb37e9e816649412b5d1d8235df10949079328957184e3cb295677e4da328215b7f1e75c0a594b9042a40e00a576a4b267b8a58b0bdfc49be436df3a561be1c20be71ffe99f18c8d45ef6fc01b614cbe44c507c5a321f943e75fa4637e6031ed25bdcbcc15cb45e0054473d3f73b6084d1829b1d5f68b1f0065201862595ab7b057a0ad55b1f79d0393624f41e43494a8a58f42cf8a18a3272d891dba5430a3cc00b88f91a35ffc4dfe03fdea5ed9dcdabd69c42d911b4287e7cb739996854adbdbfb53a28ec9359a05f61b9c25e14e1ba2d57186ad06559570c0eb3ddf3776924cc927c633435b8be533e0d8cf244c506b4ed5b9c49a7b2df1cf042cc49b43760c9040d8794d14fbe63f35086b73ce73364937244bc656df8820bb572c3d411bf32c06ca3a54642eeb6606772efdfee275cd41756bddaccd3db053bd62d3ba6e2e8c01cf794af23fc7a969a07921c47235e16baaeb242f4af053162c049ba202bae527248a403e5886051e843c9ec896f50a9b6b158e34c89a34f5b5c4a40444fada9b3e5aa04047c1e87b1c574297acdbd67d79c3e6236e89d69c6f65a511f0df00afff58f7d5a7aec021f32a62c75b852e7b325486bfbea9db074861452e53de984bed3d2d026770812cd03234486a86139d8a22da744129274d2400aa2b69eea37aabf03d727cf3240903de9f385b7613bd3bdfa0184233128eb604086614fad2e9b59490de6be30246565a408ef706b778e6d8e4112aa6f753974afe3655fcdc6b0f2dd13844e4b3cdddb387a531fbf9491c21cecf83c0862b5f4c3c9c5c04ba98afa8d7cb0fed0da9a1c3b1e9b9d3d5813e1ab7ea2b4fb83d2b3decc6c9f0a53997f3ae9929b9122aeb4772a768ded34fa5e99f3eae80c46609ed330386b522dc7f85a7ace9b6113e5c36d87add7776c2e1e14994a65413c7ead6be3e9d95136fc54778df35a9ca660aecdf23a86acbfdfa5a03715be6688166de34690c595393e9badcbfa4f9cfb003c00f2525bfbaea0ef948807d7894e905c6ccc2c1393986f3c3088a31945947ac39e94ca03fc4a79979cfc9c787e39ac92aa5ea3bc24a3ee95c46ecfdb7aa12627f8068366e994536038d2e7065c0fbd79369c3cb00280970a438235f2a55fe0598ff4c45d206f63083c7ce509fd55ae2d1ce2447750a5ea851b6b066e338381da9abab51aa31d6c7b4e58897c82078b015d26927c0fe15933cd155c2d16b5cf14856a508e9756058b6cb5f784cd5676f66ea2fa5aaaf1fdb16fa18e9c411fedde6c9c8c76c8e24177632aab4d0684487ab84d06d36bae36132b9ec85a30099e5aa4119d1924ce59bc593c7e3417c14198162865e603c0f780be9b740c5d84f5593327704c3c283acc4355d369302685e25a54f41e06e9c37efa075e9fcc283b075318dc1cc6541c956f0a556743b64dbfc8025c366cde9856445d9f2580e11bf8f310215b1dec86f8fcb2085b88730f71982b902a12b04d6916a1b73503c977043610ab49bf2b5aa05d4eadc0fb83f6247819be4a37c125c87e32616fe2155f31f19a3dedcef6c9f1dbbaa0e8d965768f09c470efff509ab39ee8035e2f1710c1313ef3d290666738103cc5182734db225efaf55ff4929c592a81dc72fe400801b3e1baa4efea9b856c5121492bfb0eb8805d4ede8057d273ed5e333ae8487abf6bea3c90fafa372bb3dc333bf11c0596ec2a32f273448f3444983c408b52bb69fe2c52576255f7297c9836d0c7c57d2012d7f4d2839d8c47a1557b53072c79b547b076dcfed01c67b4dec80fc170131bd877513fc79ca1890980c2f3829acb5ed63fe22047bd87fe19bfbc45367cc45916ff69293c5bfe8097bf2cc6a6b672f56cce30f5ddd2e490c06500fb41ce6aec1845835c4049ab8df7c9a5d71e59d4eb80a8c41000b4dcff90d1dd524189d34e1fe347a91a374f40eb00df501c978a1abd764cdf17fd61a4c5da0a8359d068ebe0dd9b3470ed7d43ca60c9ffd64e95b3821017172de580ad6d8943b2f09b9f4a03204b3cce5511cafcbeeec304c48030601e1f166f6e5200eebb6886339e9b9da5c41c0426334f837f58447c644c131fa08cf816af26f5a37e1d5d108e37bbeed63115a54b6addab65b0508e370c54d0bbcd098ae477ad7eaa6c1a91377bfd261c03f12775dac6f054bebe7fc1c2fcd5dfecba42a8888febd011b9c8a3437443efc322abc0c51280046db864cca6a8ea717084b3b8ac547aa405641d0f57348a3b7add53acc9b0d0c568a21625535259850c082778653efdaf0773edf89b754ae100f6709e67bb61f63d13401ec3f23868259dbf6df228e3cb2425cda35dd5b73532a5855e1d53ef8fc71f4c0b5f53d91722fb09c0712fbea88db54596a0ecbc81e274e9980d946198ed5630c518658ec58eeb1ac29083c14bbdc4e81d87ac3581aae1495b386808afb306da2a98ae9f590f2e8362cc5af38aef4f30c6c532dee6817ba19c43388d8797a4c09a77a381ed21f8dfb94113ca91e7b0b0e5270867d3298f27b4d3bc61633f73c07c90f6a650b1ba717f0ef2ed5f0660971124fb8b6367a252de7372599f78bfe9b7573928857717ee92411de34ab1724ea58008bf210e4d47ba0e728928864e62394a5a38423030b5765bb37177081062400804f58eda38f4cdf6af80febed7cf7469d4dc729bb9add05e22bc63ed5572454ef3659e1c52abff7ee368b97ca303dcc7a1a8b44f7c4eea7020165d5968115c834c9f3b32733f1b2399a6015aa9c86a254349d95c2dc7330ae8d80904a5eaef598b1ac1d1148d5240311d15c1c7c61c9c6e8d69bec8cdbcb699a3de593575aefacda68024cddbb85dcd5145caee66725c372d1f9ed750bb66e5b0a9c278c10b096c583eb1a7b5c6046e46786a5885f379c00369664c320c4f5d2d083801a6bfb7b95db216a0a8d629c30ca7f12788a6c7cc9ae9a4de39ab5914c4f02b1cae43ed680c0a96c9e5ab2471be60d90a2299c4bde0f6bc10a13b266ae928bf21b158783ab7666dedd8e638ccbe44e3b4a15e98d3a11c6a49f6829a26c6cc4704e78054f15f5a02aaa291ae4ce889875130891fc0e59712ab97ea024707ca27daa382feb92570dc5cd6997a3d8e78b344ca3308dfa2dce992b102c31e4168f35ba1ead87764a46f61fc4c776709f0d7d40e7afea45011e3e97ffb95ad06bce790e286a0aad5e6b66e20df2cbbdce147983cffe817c39073b18c2c5f4d5032b123cbeaf0dda79c9e1d23ea293b5dd2e6bfd166356261682576c98f8a194f0b8219f9edd8d46d1d3fe29ce9eba82e5d279950d934d339dcf991ac41fdb154d878e5cc2a7fe3fa36e701e0bd57b6d4ad59e1998688deade29b68ee06963b090257125180d628bea9f64f0e29c2bd0e064ac4271c9eec70a462071ec23dc0c34687fc5f92629af2aa88bb46578842b23e2fa035523c0e5d0324d3070188507b3174567b480c140660eef7a55038bc3e3ce9e889611fe5300fd72dd470e38871a82e71c64c06deed6af9c93487496e73808fc42885a553a290063ed7615a5c69636483f98ec15abb5716c4e54f654ec69b4f3baf7f8bc551801342464be346f76da668f1c1f1cea72c377b73603f3bb9b29b147816b923128f47196a4841493aa6ff92b4dba175fae38d7e4756fe05b1ffa8bbf4911dc5a99eb7ec719674501741db2863995852a0e6169c9132341020503ec5d53e9ceea844f621bc17bbeae2463b898df94c730998f33b5ed766808c86d2f0b7ef08b4324c960147d0206c3f113fb0d9beaa95e3cc94dcc98e284f3818fbbe0b78344c9d357dbbfd6da0e4d7d1f935b5efe65d964cb5f96683c0aef78d2af7d632092a9fb105b3c1bcd3898a0a99e10e582496f95324e88a45638f1005bfb6c07bb76c5626f23c632d34768714db0ab807a8249a1360707d4afb41d4b160e39134f278d8302f393859ebdfe299d5431bd05dac063100327668817b0257b01af5413bcd1f1d6632a27833291c1b0c056bca6c090944f019ea5de53aebcf4579ca0d40631e6f5feda0e9476c256bd65548d0db1b66597a75ea498653b388fed2d4034630735e359281aee564893317ab26014692b972216c3e2f3b9e15049c36df16a796c15456d9d5ed5bd9676e42765f419fa647024cea6e78eb127957b2d6ba3a5edaf16f57e621702ce522eab31efdb608ff2a73be46346fb74c3aace6b19ee8a3eab10297ba1a263cc7c1cd555fc24bb52419a0e52c94c5b03a95c07d94839e9a126614af69e2a09315400d9742d830de42145bf195850f23ffb1653a4d105d0b6359dfb7796a95af783af6b136da58c71fc5e8beda1f436c3ff6018c2f8b2a32e765525a19085e6150aca842f4acf9d381e4809328313f6566e20c0d3d0f8d9af67c90b215517a3fe4bb972d31aa10ab720fcfa6e297425a9b70955190f4140c36706f02ba8b0ba601e509d65930da6b129e777dbae171936f21be05e3f4d186191cfa3303575847292c9ca4ca925cf2ec988b138982536d84a03c5c4916d84ff99cf02bd1b3494cae66bddd43bcdd2b03b514d7326c5601ac31d8cc7ccfc30d0c8842ecff42ee04690e31c89192677bfa52907220f0485e46e5f022502a2ef5d7399886925ff928df899023a34f492e24da6e67169ade50dde8f6db26e23a05ed2bcdde59b73fa8034cc5ee879197004f6c9378752330bc4027f0d5899d0e54faeb6f3dc1273a0bf0b0907e12d8a8b194dbd8e42db53b82a5d1f64d336b516b90be40b2aaef8a63390704e4148497a895ff8971ef6d5efc8859b82e2c9cb2b42230b74685ba6fccc2c709a37431c4a8d403e7446089dd035bd9f6aed4ed61f619d7800007a4517b2f98dbb88e725096240da7906494618a30e80540f2b793df0952f8b334173960565689f2a588a44a5aa0720cc1d176c2005b51cc1c7c01a55b1db2a6a15655565915779355b2ea78b4886340a2510cd82e84d54525c569adff33f401118f77e441a7dc4b420e92a2ab988c9fd245f7386218a4844fbe0c4ef88e3a15e390978d4508457f83ddcf1b1c847172a9cb6f6deffd6475794b2e97cf7fb268f8af4db113c310db7e261820fc3e8b91fcbb918053f2ce9789b49a304a92bf9ff4d458fcce2ff23c3056a7f60fc0c6ef9e10dbf8831f30cdbe271b46e919772b0b7e1969944172e91783fd264ec303f53516b4601571eb76bb6f04840dd025cdbf4818d0b1706b1249625cbde52b97a86ff0e25e7ab7f4e4653ba923cdefc7e844a17e08ee318ead52d44c9f18f2caabe3ed125fdd6d5714f83ee407cf0c90a7615f9a988455dd9afc2c17f05b1d590429c853ca5645b0bdd84691e9bc7a68ea096c5df6b69a311b13fe4c857027f5b6ea339bcf816eb0b3170e12941e7b670c1206dd5715bfb696ba3a3f6b6549c231051441bcb1f89e91a74bcb31b08f5e75a8dfd513e1526ab305fe8879b69fd986f63981e44984d3b9aef2a7a8853f4efc7e1924922aa6a1bbc71c80f7f8c6c6762bddfc1bfaf33da4891391068d55ee19ce134acc8c348454ddefc750c88e0a4bf3d935bee1bedd7c5824fcfd411f29eb9b28ee5da80f8d846571c1d9e4a49a8024581447db03491232b95c72a47a9e03f1a55a25c0ea0c0aa5dc14a4b6a65e42bcb0677b72842a1456ddab14c4921f10e5c9fd731994a5018e7d2b63a6dbb3b302495c21473cbfa1f84fe50f73023249ad15e8ce01dbd0dc2542b660fef6ea0afea00949de5f592881e08cc5f1b493b51608523f9c1b58a843ed288145a4c67b3e02e524242cdd915607249aa544b03c16331433d8ebdda2607f3858464d02f24c134b72201645c392a1b8d12cc82b8958ab2eed33af52237587604d347dc99b4613fe719f981f6b3767547c61f65cbbfb0340862c297fcf1b9361d0a0803c446fa8a070d1130c20be4c88721d4acdebdc63127d7d807f2275e2bd9d3266f07dc4fb39df22f142cf1d82eb61d156bc7d23c50cd79187434385d93c1351506d9ddb52b7fbce830b7b9f2a96e940cf9c41f41abed0c8880e2b06666894351cb08394786809efec44491c3aa5c6f5d7946776ec5a1e7047f81be8b510ff14bfa9386b0c811908a0dfe17e1dba103c1ffe4194ef35bc95606b67fa27c82f535ebe55723f9a635903611da2f57a86b9dce9d721514a4f13b9a98476556896f2134740409d302e6d0d6403e7340deaf14a984753a3b61575304377677089dab1841034593e2247aeaf16191c61a26d4a6501f9acde3d679e62a38527f80b9089e9da1de028350c0454b9ff8f94e92f5eb54fa0d77cc4c54ddc843f6ef292fb7bf2d94598b39003b7b12163691a97c8b5c261100278d57de2c874d4a86c04e7e8f437ca8176400420c439389e2be6e4334848ddbae41ed705ca59ba96060c86d72b90e99ab3b5eee3bb7e4b246312f4c8aacdce6beff2d4195ce9a364ac9b6ae86c741d902944f5bd59821f35f9dde33f4de822e141c6868fe430c7bf736189e198e90465f1a3741a406b1bbf360bed35454aa08638b5e886490e749bc4584e063be61e605f6f5c046f71095edbe76f8fa5d47844dafd535abcb7faa2933ac1ad3ed954c3dea927274c63e57461bde0fb0a1efc2539807ff73231e2917906bac85e22551b673565e74e23fb42255dc45a57f11934bd441028e6d96eecdf7f254af796bd2f795ad0d3a625550e759fbc1391cdb42ddef3b92b0dde78d250ad59a32cfd15de8845f9f0f8f47abd79d9a4b3ab64c407fc5cef45f9c592e6345a7ac6f1939a6958857da19eae7f7ab86abe60971d485f59f02221a6e37f83ef95ed60518bd6091190d02ca7836039a733edf754920947b6469729cee6fab95633e03f83870ec2d33d94263b39b33b6f1904e5f4122f1bad97bf41944dccd0f949da10c3227bcb14488138e7aba4eb8185210857209e44be423072deeb304186b363f09166531c53d2df10c24547a815e31b3a3af22d16eb491f778f689069e091b8780856a7d5a4de8f77578a315df926fe41aaf3a92ddbd3744de7c0837032c48d4223660aa220d5a1cbc08f6cff6e43944d2341a402cba86b2175c22b124975e50980fd0d4f63037f6b597db249e6b1073fd22f188dedb8c1402f91d751138ff3e8d5fa8b2b5018a2c90b12fd5182ef8b6131c4dc2d7e9478f27727fb49ff40125b8f2cc1f4b1a7df2f4a2064d24dfe1a57e13be7427bf3255610cd75943b7cc6f950d9375c91aa3e73640d4c3fe3e3415106815d11e52fd4ac3ca528059a7ad425e4388270edfc601a1252e4041727fde6a1ba78ef67c572ada720ddb0ed35640ef1f7c47201dd7bb8b6fcf585e357a5195abd37d88bd9d6c6e4887b7a43ec35c82fb511e36a72e07e1c2e02b66f83eb5ade93e1d2deaf4b71cb7791a041a2e6663c8991cd514314471f9db0688ac3e5a5a3fc57d81233b3f1475e2805509e444a06797fa22cbc799708138eb05dad2bfd00ea3920b3723630a800ec29e8edb311e704f322d8ac88642bec1ae76ee102e0cd03d6ffe71f8684ddf4a01a91dba2e7c9997a2c83c89690a49c2938397e9b888423edc4bb0fab99a626ebbf987e0e17701d866d5d29306c03268dcad1a95c0592d8443676bd66cb16566454912b171dcc69a14c0fcaffb803a617e00d0d417feee409a4efc7239f7a9702f6f6fea4a8a0ca7e8cc00b48f170c9e8869456433f50bf02b22f6f763a2bd2ce8d26571c3a0d80d176da31ebd5c0500cb61eb5da444c139245471a2df97c41eb87fc582255763ff897c1e30385f19168efe95f877f7f3e894118d5f08497f4e9150768717643b177557aae0d9bbdf5fcc00a0e6ffd6bd3caf9a8cb7510b04f73f534b2bd3f41f144e98a839d20477b70bfdd7e09a10d19bd88b4d03b98d08a3cf54ea7a98b1211e08b7434aa46f034f0d34ef1dc2f4a8a8c7064d9de4a11304eb25778ca5bff953ed7ccfa643337c55df70fac4acc48563e328382f77aeba09a47229dbcd29cf685ac57f2a16110e8cdb421786b2c6dde92c402878bbc178fe4e90d5048ac3d219626819bd05469eb560d4122fc1f2b39b814654b0e103b84f5a9d91296e5d6f563633e5984a3332f2f97e7fb593727b2ccfa6f54f13c815b24d7f026738708c8232eabf68c9a96aa1bf28b588f9d2147314c99ccc4bd24c32bbc6511a6c446e343d4b11c9ffaab662eebb9137077f82cacf5c202e8dfcec050b00d2153deb30137afa9db8c927a00d5e96a08c659a7465b4732e7c9f8ac29d9b6d6e2708017d40e2d20290eb8b7293780c0998da889b176dc2892b9d2112bd2267caa4c888480e661ef5e19e13629e538e42b42f14d3be3c828bc46b37cc42615350e1f67aa1e1d6c5cb4cbdfd457d6fb58a73a92f8e694f6b845329de949067bd46bb092833b603537cde1821aa2b7a47bf915410c6ac1dc71adeeaf60e09a52185e0db60e56865adc2cc09cc80b8aa4499437426fb0e2fa359bb0c6d4071024924c4b940465394489ba0bb3fd2891c8c5ed5363ec5889c1bc5a0fb9830be9bca8db5ccf085171baa943d2d8aba391807cfc0c0b3f34ffd2015735df3492a70bb077f604a875be7ca5f74275a3b95f3ebabe9eef71cbb9c5bda4a0bbe412c259f9ce82f3912364a93be9f6f88dbcbdc8ffb59b46f8d79cd2c87973eca657ea5d0b542799e21f43fda893c9c3d1918a9b2166b97f51c70c192bad54c6c901a4e0e6c0d87ef9229436ad5041bd7e3340af48daacdc373ed162a941e03a91032bed598d7fa15258722403e18761112ec241bc1e17785292c791d0d6a7ec3025aac8e87a2cab10e2352d06e9f24410257c7af5c3818d234d6521dd31c3920783c129c10b5d6e6c559e550f711c50464cd003ff5e6b1474b00a665fbef00d800d5d6a810550d5093acd128b658b36a2eed5f38b096400ce2b2574280a46d16605dbad5af669b7468c1071e814ece991e8679e82e039b8aee621d9de487080f48482353aaaa946f43d7d5949b4d80b072c832af1853596fb3c309095cd84e548f4495d33b72c0790b159004bdb31a02f40f504839d6683ea3ad4dce29561a09397edfa58f2c382fd4058c65407078254bc5a8a97510000012549f53fbb9d31b2ff551992f8972af6b9a1169b180f5d3dd06d820bcec52a04f1b3a6ed040a439d944e4abba7dd18e1daaf0b6bd1b02df0bba446a0c58699b4ca255d3555c14f99128c0893a19aa488d9f7e4625a9b89a05520aeacebab14f98f6e39a139c90dc10803e484d079f92fde6497f2c0ee322986ea186d7ad387ab52bf1eb15c423b2a598e7264dcaf25df86a202df74f4b778cc8434d9af7db993d91ce2a51229b197bfe53e8eb7ef4f5862379589c86721f0b9c6535f4ac99b3b20a20537d1a5dd6543e42fb2126f070d766f696d754ef1d0730c744611404831d592a96ab2ed0721c61e22c0e5fadf96ba16259a1861f47d33b549c14db3f8fadb3d9d52f4b2fffe7ccaad0ceb1bccaa9c0326f4b003a880c6f1eded4b288f79c8afb92479251a486cf352c9234be73a7c71c5a822ce36fb0fe30717dcd47eb66635f0ff48839e95f10286585036a27e2f2bbc94b5a44d6d83088b8cd52b282235aeb6b2093904ae3c9656db7a1483e57d85f15197604b78abfe645390f9f917e8aebb028c92a4b1cfa4aa936b0aec8ca3293f4156088d9da68db4bc6a90e915e4730c4942fbc13c03f7475b339f99add2aff32b6798d8c7a40764ae43051475c4a316b1c2ce061e83ec257da540cb99ae091e08a25b28cf6cf74008017c9a99d7e12f0c46b9dd42cf92c1b3d8d74751cfbceb01c3d3580cd71eeb190d840b80a0308df62ba84585ba0b6eeca66db06443eda32beb317b8052c5348fd384eb465524d4fd754a0319ed43dbb430dfd2dd0a38091d1e5fce096056ce91473a2ed361e5af944821527062f94ce558a2ee26995d2c5ac394a09e165057205b41b3f6e30214e270207792e9113c2f459a1d7758bcf99027859b8c9e812ec48ab417902d1517e6daded608a6415cb5e3fb521e249b0b9cfa133d49b4999be051d86ef345308f01195771b9910140b76042a227ce438bc0d09e7e762c052ccfb0d7b38b6726daa8e237e53ff4d514a8b033c02c99ed2acca1d5ec5c6a1d5ddead90060d819a7bed90c45c98f1e431bd0bf5efe1c077828f4923b242e8a6ed10d17005c0b5e27a95a045063afadc721e6a2fced5eef358b009a655b5b49f702da961d666dabaaaaa3609fa10572b99670d44ac1cc400a5f604b83012ef5dfb4646c5b0fcfcc644c797f3af21a3822d17f7906d2356f44d06c307dd574ffe0869bd82fa18d8e582e8ad9f66024fb19bdc70c518b2aed6f7eeb2401d919d22ed79a8224a0f6153203b860f1ec11ec8827482468f3a482c641aa04302f8380070b8a4fbdffd3e9bec28d5ec073fa79073e77da31cec949031e943ef4e4691be6d72d16e68dc495bdae970598f84d753978c741ad0a8782004bdb2785c86ad2593b35534194511d633fed04f5a136cf0f826be2cd2e5cbb46046e953011ea69c91b4d9b77b225955df429493e6c57b416ad1754328b4dbecc4ab48ac3cbb2a7864c40a8576a4975cddc3fe31a45eead43f32fa6398abe808c686146da840fa98813e19c467df76ab6a0c7492af82f7f15c9d6ff49e35a69440c3f5d9f3cd6d5a0fe23cc662405410707700178d7eafef49603b90a8c2bfe1e22376b7e886ead079872ba2e291c40a2aeed14c88dd78db4e718aec01c84f529c8e8903bdc9715801c3a3e083a40e3e3296b8ac988e886fcc1fcbcc2f016673bb4a003eb31b13731c7ce73897cfaab3542bacebed0b6b594d313007a1538ae7c40915414b3175f7c6e23a5d9f65c9edda2446db85bc80d0090c3199ecdf32214debe3a9851d528f187566d70be9ccc9365146da6d917d7cd72c09cc0d404ced5eabead0fbe1f685bcf838f5c245ca3237460cd591b2e7abbf2b386950aeb8cd38d28f52ce4fc3e6246501c54c940fa430df1fd63ae99bdab5fffffeded4ca236b0b9927ac67b0eb92bc1622b1f3977bc305aa269f5848882807e7342552cc2aa1c1b64d742dc5bb4ebb51d15ad7971c2a2dfafe25fff25e66983a30789279c29ebbf4ff3332a079a8158fad91bef5e1383b01c7406d71a911828808b77b84093dbe487f83edf3a19cb630e45dabcbe07915d6e6fb18f0191cf1244cd58b0fc86f260a6b835d03ba35129a41e6d6e87a0eac3327a9b76ee004a7a594817734aa9d0577a9fc4a2b4e0528b68d9b114ec14027f6a1451140115348662b5a0a804ad5892ee064fd57404e4372f8c2f5b5a6eecfa0427dd38d5b86d005be6106730ca962b47cc9208966badf3d96319307023966d9d66d04d10ff8e5e722a60401c7bb62f04ce31d5879b55a8dec4a83e26020ddeaae8bd75a7666ddb32d4be5133f48d5afa7d42a6c52c7425c8e946419aaf9dc41ce49d1ce7524bad3936b3107722dde212554e9037b8727a7c870953390e401f1ab6758a389275df6e081ed2cb049c25ae7457d6f0a04c6ee5ed2a5ebd3ad862f83060ea6086e62917b4bbf47872e25d27205a596d4b54eb757fb5fae56c7efd633e88775bb77e159b957f6127d7720e516e28271e85b4b0cd9987820fd3f55e4b2795205c3ca62ca03b5fab7994d9854e68f758d5e585cf814ceee9761e51dfb0a8b721ccfbee1a30c6ee159c2e157c33f8f938d77689e0d4600e59e56f958e1ecd6f8d7a4089f6812c96a8be3e74f39e6cc1ba60ad20ae1bb75437439256700d0bb9b26f5bfdddf347b7ad6eb5cc8a3a9fc732144608d8cf719c68b14954ee7a2c8b54b83d96193d9412e38962176509f701bdcb3c9dc2bd8f82e099264e9c70bff795f9b4fac55209413a004342c76ea6e4fcaab595b61d742374abec718f638eda8cdd8727eb5675ea1732a924fac1448fc6eeef666d155ec805c9a994a6f410194d53c1d238de1f9060a070f4c6ef6affc64ade188a5f7393b817e3aea5115b8c60a95c1597737d29532b0a4079d2f1b97d9d7c2e60a11cc64b14ce8c85cfe893fd5319184523f6b87aa2c0db9fc2f239f0eb9e62fb122fb951573fa2477b0b6bcf0ec31e8c1bfb8a5a81eac95b4cf329fd8e6bc02506697068dbeabba2cea5243eb7fbe60ab44fa67553e1382d077fdf42380f76f1f6b5d122bfd5b342aa539b1aa2a0bedbc038d6a4ca4ab4fc2da82d96abbe3d15cc2b1d7b6707363c2d6c2dce4a968d6e3d065c41fe44d19dd3ca1e341c5d5a7c7bb75ac281152e66bc0617fa67d5f08d22225a1d2f6d2ffd84c78b2cceec1862632070d309ff4423fd08ceacf7f1d618227f7b25ef5e7de518c1e13452c5d79c267bd59b18639097b11915091ca8f60ace8b1832fa3ae9148486b2379e35e5be9f2742f4191ef42032d333df6ee62a15080e368a7c8f405a021d7a94b0abed46abafc67ab681853dbf93fb4597b63f4325dc2e2995d0caca125b5183095039b1c0276d76de90869af9d6e4ee9d1f8cb5897317ace838ec879764679b2350c885787f9ab3b4551d74c3d3697294fb4e28d544bc6835193ccb6836ac9ee68d3e679ad13ed7af596f1253d79e073c02eade23c231ee96b2820cdd2ed2c15d6211062bae9f8c67dca8fcf1128bb702aae3428ffb29fa47110ba9757b9b1eefc3812f8221a056cfe62f885a03d46a1df4d6d76e522a14d351577ce5c644c5334d6a7a4e7a999f19689bea42fb78fdae6a2f7a979e055f0c7766295fcea20aff82634d40091b489985e1430e76955c1b11683df39356d8f534108ed288b21878a88d277dbb7c4a088c22c4ee1d78d542372b3fb5c4fb49dc5937941440a8ceedc2cca84e577f355f34c8bc8ca664360e6528125a7ee51834921e2db49e5d30ed4fede732af143fa0d5b8c8c139a760a14858a474e27061e93776d6c862d16a6d35f0ac2ffc6e7962960022daf32ee4a2a7bac90eeecf43ff9d3c188e0134a879d981f71c115c963f5e180606556166b525e90f58e57e62a60918527b164ff168017c1869eb3b15091cad081b220528df77085abb5d49317f4783b262c76a2ced4d5d48a750ea87f70fa140c383f6d23adbd23af8cb68db5b37f41c4584bebbbce7e570bc13812c80b445924bd7b2d76654cb63e16d380a2cabae4259aed53ff9831071894f7ef35643ba10fbf555e1ff857595d712528f4bb944cd3c73e3050c5f8dfc8a6e3048455830fb7910d1391f83d0e522ea302b35c8d7638d6c547780a51cdb372ef1ba8b882692b10c3458ddc22c428b3b7f95c9e0e9b240f38a0d4525945775fe4a54856ab0e1cdd896cab72847930b017816029201b4ddac07dd61a86bb34ffa8d43fa9bc7560339517d8a834287ba4de5ca2c70386ca154a7c841ff2f9115b62fd1a71ac657346dd2dd2a2762260722827fd9e045d98fe460bf65ca679b54fc27b9d141f6bf132e0e7ae2038e5fc0399e2bc3b03fb15a9c383db5c73c3cef914893ed4997e1d7f603a5335a128adff8363206b886c8809bb86f5d435bc8e32df79a9ccd86a5e2b43fdfd4c7425978ca61ddee56814978cf54f9895a080281c209d3ac9f245bc52efbcba83f89a1f27a5f09eca43b0ce3ff22f2fc8e51d58be878886e6343b675bd1cef04b681e7285bfe17de865af1f8a9c6db77dd905d8b234f5d204e0f631b7e3f3d5641ea2ff8b6c4d8cd9dbd55d74d066438d6796ece1ca709a0a32400f345f8ef620fbeff951d0ff4eedbcd4c081efe476c2766dd74ef50e0cf764b19bdcf431b1fcbb07d6353ecf3ee3f8d7641808410c5c938b63f4a4f78ac48d0895683320ba843fefd20139c847753209c979512151dafa785eb19e262c1b853f5d3dfa149a8cef876d20a3b64ab270ae544bfe4fa81de3b917452af13cd343747bfe1ba12bb5cb69e9e010dc9c28b1dacdaea76905d516e0e55bf4eeb8475dae18ae92331d43ce99cdcb6eef85e0a49de0ead2e7733c4171a0ab75b3d37881b9825de7db7545a52e64076e16c126223f9ca3535a902b83aa2620715d74fe30a0ac6dafc2090cfa9b3fcc68650327155af6a28c780c742be3d8175b62b5ca0ccdab5f414f05eec069afe9b0966e56f9994731d1112e90acf11ab0bb2365bc6b7c3a3503f468604b924c5a7a161aae2575cafd68ca4fa1297fd621decc870120f33761f4a4885c169f71e8d33495b5757d1f97f8005cbe34a7fa2d5fafd14996e22448550e8a168fe1bde25f4b5f5d19c8cb73502e5892989af5996cd52ec9b87da7508ebbeb0348d293e0bee86ca9957cb68ae48fd84a473d3ebcc7c83c0a40050a84b880fa3158b69b96de9fa62b40d2ab7b6ef385d6c8e0cd18dd9dcf905bfdbbbe69a35becde273fbb9eed694ebfa2db477c089d73c24da00d832a6c4cdcd1cd70a67185b3e5032ffb7dc3056f593f5a9aedb2738e7148388f31f0cfda4a6976ee1a3045831a8dddfd40aa40c81c66a1a0a177ebef339d19f5c4a9659a930a8f50fe8a39691c48027ac51bd12c2a0b0a73d742ff3b778b4dd61d9dd28c320417e540ff566b5433175a73a7e691ac29580d03763cc0a916e2f52fc96d0909b7b02fe80363be9481ddf0fdb09f6947f72cd718614592065e673f52c9bf3f4702207aba157b4cf8ebd53d671d90cd05a491bc91094ffe569d73d3e1ce088a1391d2f49b298f8bbc04c941770e4379144871d6a967a44503e21e248a62ba8fd93553673f74e2a30fb2416319e1b494d0bf1da39b1020ad0cd18621c4b6fc376b52d5700ce88be60c1d0fe351ffd34ef5fdc9ced99ab7dbca134c765e35286c5d47af585d44f69361eec460bdba0648f2ca0d8c89e7ed88862214d4209a4daa4a08da6e761363f253a7386fcc50a4ccb4ff657cbfe25c7b4b2d0950dc5cad67e53d76fcd87e66b4264306392d6e7bdf6d09b228413a32d78bd456cf7a65404304d243c4d37365af12120d3515034a141febb809cd00b0bc6e3cae83df043008125d2913732c1ee250ecf0ea5cfe483af8009e202b32ac36e4c6c577aaf55b808bafb06032d31ecbee7097c79f919bd6cf80701f88921079d869d42b31b8d516759d887f11a24a0f6701ac01d2f4e26e4012a021dd71586f202819423ef5634af244035eef8f5a7038901f8efe3baca334e081f46572189bf9ac553b6ab300f0684496564c595913f525a3241fb6ff1aec34cbef678f7442376b4c431f135c45dab75c10d673271784352e544078d23ac3081a5ecb47a7ee76ea480d9af558d35b6092ef5e46f77a8f757da7632c92b347eb6f7549fe7d3af61d97c0796b8b20da0b1c1623d1d15458fa8dd9d1f7a1da6355addf3057d8f0e3b908f5b007c0338f2efff37ccc11586bb8231acf50d2d4aac21dd3029a2e7b467d72bfe93b76e6d6a2e5676b26e6abef6d4662e3e7ef900fe7ebba6ae309a0d14f2eceaeb35e074baf9c6f8bb1d4118a2dbfd8285d339290f5a66f5242869145e49895eb3be14c51c6976867ca325c0e6ba0465256d18aa233c4ff14b1d74b3149918c9524981785ed6be03db2ad347977ba9b5bae6bc663041b08123ac143327300799032d204a75e54f5a160c332ecce258316e49b64e22d699c237d1e650b554ccc1f281151fcbead4697974942a678bc0705a16d63ff59cebfb8395d612d8be40f77a28d0a483d7b750b18e65932fe9e48342ee379b8bb4d6d9677fd4d8af9b7613b8baf13c801e334cfee9681462caf3d09f170c2e2504f3081661593cefbbc0008a597f5df9eb0ea70f427290de5148c31967e35a06f1f4d5113cf2959f16ce947ca97825b9ccedf9ac4bfced2c8bb6a2a65e8f3192e6e79339fe92a8dff4382f64db64873cad100d7a354f5515fd1960f53806149bad12418bc33ad56de4258198e2fd4fcc46f2eda04326b17b94958a4cf8a0fdae63e5193cf13f4fc6370eb0430efc170f2021eb9a079e0b8355c96c8f33f776e0993fbae4304ee9b4e548bbeae1aa2b05507caa85f9dcdd73804fccbac4c84d1c50f14723b1203df7a7d430ddc86aab6bca1722ca2e4a92a1d7f2c51bc50efde88d7061e175f33d750fad70bb53e399931162ed3d4eb7106a2d207b3e861682c4572d464f2a28506b1e2d14d7300278c165109e79a227e226544ff1d868891bd7a4eba198da3c5fa14ce9be913c0e9c9005fb8af464ba990b7de79cf9440c94cb2396b1eddc09211e85aaef9a523878e39f2d62ac8ffc62342f2482d0dfbc4f25be8d78ede6cbe3f56a8cc669205578ec7e1b85bb5296abe7a912ca7969dfb367073876d15aafaf5efdc500db7f3959206a6ca949189fb43e1136894d2ffdfd249d77f529a96d87c8ba1888f9fb2c7251ede815c033220265893667f986debb1ed73bede79dc1662bda221675eb6e9791bcdddcf3a0c70c8b1716f91fd2978f85d8b40f6a43f40d11a12a60789ab75f20dd777a464537c34b9ce6a10c5e66b1ba4c89b02ae149af139250924a2f033fc4808242ca81626d89113b620e44db252f5b626c015c462a30d944369cd17de1cd98d21fcd8b94448476a083d177b87f0b345b157f84e6036cb1d0040006791644d39db19b7739c41cb436716248192671749cdc681c2bef301015867035a11ab310138cf52d124626dd12ace46e3cf09f4faa6d8aec73e95ed859f7a811fda42f9807b88eb319f540d8b12bc751a4cca72756d318616b403567142b40e19030ca574b65d6b487d68e5ab69329b12ae8b88394b2e23fcd3f67f94b07f8e5ef110233fc729739c17d0d0b23bf2a0ac91c5a3aaee9ba2dc5350cb3e5aac9b38da164167ea50c50b34ff5de298412d3db28a5691a2853fab574c9dc4bc53a0a815cc0e16db98bf43dce3d2c2ead53d0de539ba9af69eb47230e11dff7ec41ade407eb79a83b47e4784f3859e580461dae363e9d4f70945d06ae820cd9d0425c230822ee63d6538f0804694053cea2952e7af3335f97ba5752deb4c8fa8bcb46fb4b78410a453536ace3b0a49a57fa09c11c99e14ec025da8e7ab32aa0d9e31b227d360d1f001c6b3265f0902f0c5dad0a89edead48ed1ac24fc791067796f08fd556df08f079501f688b538c6784a07a21812ea18696edb1b10678923662dabd2a6612377f9836d64b83e884fb44f71bf9e55b73251a3c768d3d42bdc24f0425b8dc74049e183b556c7a104e0483b8a860dce20b452fe3a785ccc6ff42464a660553e7ba0ec0bde99b484392173ee009b77c3337ceaedbee9d231b4e2c61095433fb38c5864f09378b41d9bbec62169bd3dc16252b865f88c9dd76a9edb2f2756e7fd13a6f1810b7bfea577751bc11af2053b1eb8f1898c6c94fb091ac008e83314ccc4c355a1034da097a3a2e5ed7098612cf00d3507f8f5ca4af8b11896cec57f0b8d82ac9db4d2dc5c7ba9abc85612369ffbfd5e5c2dcbadffe9f24283c55007d3fdaf6e0c7f8a3d0b07402e14ee5da2b82eb7c93273b67644edc396ae3133f0f1bf695e49efaf7e09f26596f81b5ab183226394a204e4cd35ed2ed5f8fb0a0ed37f0eaad436f38df6b535f6d0466dc3966781f970b492b6142163245246c7ce34534dfae1c48a096e0c2f6fd7580f5933bcf91c6cf765afb50c1694dd2b916c4ba4f13c6c4c8bcd6d5ff868231008ca8d77977835cb4d3d57bf19526a8be933f14731fc9f207e44371d971d4ddd7db97fbab05f5eef4923ce6479205ddd6b97323f763e6026ffb4fbce29788c86832ebaefe179dd3bb44c2ca68614d340e84e24fd569400f428e15adf3ec6e3f0e2952e0ec1879c7a44426bd7d89234daa84b80a2bd3640f11340f1ea51cc04d94afdc99577a2708dbeb8b4ab28083e8a0178d1ebadb80084647e5f5d83eabbebbe67bcd03be1399a22fddd2ba29a3301b6506236a6975f29cebcbed309c350bb7cad3cd170eeb41d08f72374960bad4f9330b1fc4ac2c98a1642bfa93829ee5b2ada73ea065db504c555aa499957f5c4e8c6c4f7651d3633bbc8c56ac29b96848826ba70e495f399720d94ae67ceb6edf29311bd33ed7b920b9049b6ba7ee8d0af6c3d9b60e98be40c8fd5cf2c715e8a8beec7951e8cd3f5c25970e83f4d970fb5bff0c4eb778766d8762fb82f33c825705cd73092ea42ecf644c9feb00b0131667d1e673564319587c750fde234b86cea346ee3acdb999ac5bf3855ed8e5cbc5b4dba8260b1b3fd076e23d55116a70a5dd8babc660ca66fca4c9a0dbd6c63a6b27cd614b88ace3b416f835b70478b5a516373eb3f1c58c191984fd25edecb9dc102250292d2f467c3a22a4d9e36fde4e25d3b5ab17fb1133a471e043f5cc6fe02ccf9bedad4082b0bdd3f6154e16ff52752bf47ca9342cce6cb2d30117c9d4b46b612b264c5d8c6e8779f6c7c87d2518fa8dee99fdacd7424abdee6e3c7b4d888c5ca04a9ff612e8e850ead1fb33c03af1689998baf8333a8bad935c9629a30188e27530ed6a23e44b3ba517fe29210775eedfb2374bf8360c1355e430978fb9caedd394125f583a31e95e04b2a93301dfa7d4476db65a099e3e94df97a245ba3fa8e897fb3cc55a7ff6ae0432ea3360fa223b577548d85bbc44ad6d8b64dc072ba9803cacd8c8c320d258084d15b78e0623a6099c28662894303372c4c0c614d42326ecd87d6f8df28ad80513d09aa989ffa8280016b63e5a21d414c99a0d48005146f30ee812e002dcc97471988305f31a06a0c3e962c3f14bfa3fd120d7823d9dbb016de7747b1f1254d4df8969a70d9b5706ccfe0baee21a2421bbdee191fc65a2a9ebb3a72eb4a4be241c5b53cb42cd6a0e13a1a049a0e63aae0f8bfebb7b4f8de53531b560f99b3369f7a6c75eace0691287e65eb61f00e51d17c03f37817d059011a51c89721e7e2e32d2ac84f7dffa927b935366be07ed68fd128bb3e538c2ea57a2ecb9bcbf44ff682048131715aeaea9ec7aa378ca5dd0063b73ceeecb2a187e2a7510ad6ad8ed10cacc17c64071aec098fc07701fdf58d43ac79f799f84a2ad474c44bf00320d8425744cda4f407b86f35e03c27f3545b8bd0e2cf5e2a6f46ca1a51ed40822f91d3568a76678f7238874f85aae5283a41a1b40f42c492cddd7cdcbfc3f07074d682ce2ceade8fd585a0b58a30d2810c4edb15866e3a3e2126861e0512959982b57bebe9be4717bf26993d7ca175be7b8328e24683c68a7ac4dffe52137ad74b89546729dc4d8ee695cc10d8f7ad794d68d8a6ed1f765f7a657ec7d868f732c9ce21fb796eeb5455b002c5f05c0faa33aeb5f06ee7b3b37606ce6b02d26df71867cb988fe1c100a0cce52801405cc494433558601b050211f924291d95a52f1a69e3dfe7e261ad5e1f7c354f9ff03d1150f8186bda662d58a879382dfe75016310ddb5f77d0bef9e40ac439c1569ff317bdcff7cc18eabc2eec5a79a92051aae1b103627971e444441f1975d145f54a72f53eb549afe6d6fcf88693348006cc724832cacc6392c4d198db3261968c6497de01f6461ed904c6c8be009187ff36261b09e1ea4762c284776e37fce428d7b9117f2f470ff6a1c530bf4f67ecb03442cfdbfd0217e780f537012d0138cae84faf5a22c5dbdb0416294adc6f1748d98f41f6277705f4d6e3433d3e25e698f39483fe41ad17558b38c56a47f7f2de5fda7232425f35ed76b0f20082efccf7bc073b5262deebf1768fbc0f9a6009eb927484af7505398c8be2194a963bd7365feba6959baf408230e5823ef0a0f3012fb2c4bb986865c256a42db2aab8d39f3bc8118fa066b8ba7fe4f06051c1174d176ecb431fbaf4a2aa42f11d256a9bd7a7e8a37f57c2798ee39d7c6fa860b7460484a658bae1f87e67b1b782fd2888cdaedbd78f6272ca077f0302faa42f4e9a0e56169f2cf91d9da50434e3e71f3bb34af4fea5689b79a9fd711b51ac7340421949dab901cf3c37d4f8d9e5654db3b6f2c9d5d85b561aa369200a52e886d93ca7460d01c768bda7e269cea6e306b47834b628f0ae2f0e622db22e97ef569a721a3a92181c78c9f07bdb67a715737b79565b88a567a75f4961aa110f79e4d7a7b296903772ec4e0778f23efde70ec9f5ad1a0e973fb36c9a15f1fb3b0bc7a993e4cf00339961d28be9face22712834ee679a301e923c61d87f531f9e9da72876cadf489d49aa11db9960a60b8564d2520247a87ca99d8130d2004f0ab1c2fcc780c2e88cb34d76a05836275eb7392e8d97cf63111a2845b10a0b48ef796a3cdd3afa36dcb90658543fb3d7f4d5738de26ba68c873ea1405a37ee89cb55849a95bc0c2df4e9440f50ecb1420927b28768e1839b3194c1e04e8305bf55eb0ae573af01447470a7d761c42d68aa00e9ec8514e17c02abb4f4b5e00eb519038ad3b6fae660494388820a7dcbbd60a1e0fb39e87fc5d6989c08104aafe58b5ca6254ddf4cd1057a71f9ce8c50bf218cb3e8a336e0f6ff630c900e65f08ed5819211bf19c8578c55a09047a2260ff50b52b3842fccd343a58de035c8bd5bdbe2990267b5744860c88929d7eddb26ededff4db5abcdc4c1b51cfcd343659c404e99a7938d6db52c69512534dda29755f2d213cb61b34c7019aa2b16561e0f693582516db253ab549954272de3d0da38f0388f6475118d247b9b6947617e38bb06daa1b808cc7d9e519fa7530960b29f287090d8cfbdda557b489c8152034ca54f3c89d08400244c777655765470192cd10d94410e54620fc77da05b268da42646d49571521ea532d4d0491578c2c4f16f77791f96b3dcc168fb235e20dfccdfcfe5913014d694a2ccd6093af03c33ae3c6989098f7f53e708f74f49992118eb1a4372b626de9f33b668595d5c684ec25d74cc2a159ef5aae0994375ff60caff62d9941b7d6e28c54297dd44e1f59a8f817bb182f5bcfb06757e5ed7030dd1a18b254ffc3cc3f245cb2c8f026b34f91a07360424aac89c0acd375b76f57a0b60ceb7cc20ba9fe1146620fd7fe39bf516a3af33ec1974123abac83957fc612363dab63dd2d2c7c20c9d225f3fd546a9b730c7e86cd4b8ad3af629fa2c3c5cf5ce685a5537f7842b8d4714783c7d712af227b2ec01204ffb3c4dc82655e66d89b87773185257236512858e481702ff8c0905775f4d3538f8d6c8062febe9789bb213e1fb78cc75692e155a91f261f6728bc7713e9470365640d3b591fc3fc4b332d6195365144feff451f625b0ab012d1e91d03ab51651d02297a1d727c97fcf5005a70e31dd0b872ce2150f7543ec6ac25619e0b388538f7074045e30513799a38fa6caddf206c7d6d01e7d9f452c7c6a89a20a12664c9ef23e0ff1509461313bf5492d3f982088e117ac8a98965520099517ae712b0f6f811f68365711d586fc8c569562b63f3213d40ccf2bd1a1e77917f8eb3850b26e195da6e7d10a503fdf7ba618ce16cc188448c2c04e107023e5ba187a32c312aa3d07d7dcdb58f02fd021a7d2304e34e7369004e88184c26681b1205964eb4d825a77fce64d94bc653ab6da825e56681da25c3de135e0bf96d4ea09db96ff46711ae3877a61b31abe784c557bb0175d9c3c688c2fdee9308bd63ca6f9459c24dedec5e3290e67570fb27e41df254b8d425f5442df9bed033f97e518fdf6fcd301cfbbecefab6723e1e18b5d31dd2f75980d8268f8a95bca904afc57722c2381db2e85734aa46612b50fcc7932c187158d771536c1f59b3c93dba2b07172822235f04cbb243c8a1cdff6fbfc0f8330734246bc9dd08c02b36d690b42353d7eedb7aff9ff91c02f1deea0075fe23b7718ea05ffbff0cadbadcc4faf80ff9323dd109044ea57a02f56a4b4a9b07b4ff691b13ede71d171ba4ce29c67b251c20d3225a58d1d493c06ea7f7b6b10866a66efbe0e3cc08a148dd6f6167173728952ed56e1e9ac6f781362d3df4f35f2b54c483d571b69ef8083358933c834448ca757d9b6b2a107589a2a6ee5b9e9b599d93479ce0d5faf107877ffa1b3b86befaf7a15dff378492e4911d55eed89daa89c500d8942484a0c644fe74bc696c66786a61efa6fa1042edacd0ae1de86db90ebbe1ecc8601d2896192c6ec1bbb313125ee36f898020a62cb75e837e6e75426fba3a93a33167d71e0bc7ba315e59fa742a9637fc5726658440506dd4cc601e9b2a8ddaf6f4a0992ff692e1f6629807c96f111bf203f6d0affdd3233a0cf0a99347a8a587015eeee6ddccf49cf6d74c24027cb634ea992cb70427e8825c4a4b7ea4b9cdd4e215fb2d37b2b928dee5749396df99c806516497fdccf20ccfbfe0cb24ea8b1eacd1e6d855087370fbc9504432abc66ca1a7ee4c43610cb7fde818d5b3e89d3cbaa208e2f8ad4384039cf75dc8acc89cce7dff2c642e1c2cc6a5d3855d80b985b00fc3b3bfa6fc9659ed2550bfc710378dcfcaa87d2e6e05bb167c9c15cab4ce74a2efae897726d3e77e1f5aeb286c7847c2bcc8c209f5bec584b58a8105ec5c8b52dc480fa911fde2147133a248c0e68411248cb47cb9a1619063f2ebd7127c1a64b8882e2902288533f17528dcfa109183279e7c767df5142b7e1fe3078830a31672c75b23f609a922cfdd66c9ed733e140b0e00535c26c35be311eba4310e5a26f86cdee0c7878bb1e5944058b31bef053228ec8cfcae6e6280664b1f3186df8b6f269c225df467da93831dec0cebe8fda814abe59a15f6072a3c7ed10f0566514724a7b26b430dc0ad8f1426924a37a68cccaf5b19c9e40910c744bba79c6d0d679800b5b28e5b0a16503c11faeec61501764623daf8b3856f7562ee11ed85387dfcc898fa0f324b44df7ae768872690e65f35d3ff4d08e1a7e7df9953b99bc7b8a05af70efaf3786c808a08b2775ab82cd3123c25fc29abee81a96645a1e1039d5275a7c4b523ec0a464f1ab9b85b4fb827e530f53974bf82687f2c0ce1d04a6c8ef0e82e218602588704209163e04117e0f72b817f8a3f1d5db7e8380f5830d9be770b32c4b189a200cf57d9f0d8f4dda08672f835f3637eb17b075fa4a2bf11c26c9446121b77affdbb26133e53faa2d32ffee44d7aff65edb80ee0d85cfabfd5d8a9daebce041192be36db0686fd864e06a33a1234c8d6fddeb7e9d36f6e31173c218188f0a7f23d537b25162715cee31bc429a895d66583974ae60325ace0586aa551bcc021d4bf92299a19b0a783eea6d45caf8c829968e9ec7b2676b40254a1a187fbd66f8fce95cfc18ebf1e4f510daae6f88883a12bb73b4bed8ca92238411b9ed212bc6baeb5e49dc39535f35f8c1356ee52a85cfa600eb99f2ce530dc430273d0d174a36dae8b548815200e874c95c46854e9ef231d669205002cacdc73f77861c47dd2cb87e84434481680ee3f88a45302c313fd78bc4a378a546f276a8046f32ab44bd83e6587dd46aba54073bb470bb0cbe64fe3740bf7b28489513f721455a85d73166ab9c1bc808657dfee191eb98cda8b44af8ffe263b46c9b0f6059d2e2eef5787b9df379604dbe6a32206bde3b5f971b6c6e416859a234acf0393d053c51cfc5fa4fc0f5469d6dd1bb8f6d1c2b492078193fa940f8009590d07bc8d4a4ee78137f98b8f5f051a6ddaeaa950c0424c9a8e4949f92ca135ae152454fff405854848b138a9f30363255905227979d1d55eb899abcd412cf592f5c59ff86c0f8c5d72c9e8eedf30b4c00984ab619f17763673503453a1061760f729df00d5d873b70c6df9016f8064a6374bbbea36d075efefa82b682b0a670b46e9cc573939882a3aebaa07943501813fbb0cdfddfb6b7ba6552647e32b18a001e03dc56aa0c6f4f3bdcf77f8c84832e909b393d28037b7895b023da9449fa386d240d5bc89bd1ec4434ee26503453c616cf6ae68b7e28a1da5c0804cd682bc51176fe571752be9af374fe233f64343eeb03b4df914ee514211d313baabdd2a3ee1202d1330f23dcde94dad4d40d74f0bfd5bab6fbacf99ac43aa41cf92bd07f0b388758f207ae012650906d5f9c899e334570fa9d669f739a013c3ff448e18ea3c81ac15641047a2ca5bd167d707178a03699ab8f5d20e51443a3b04edf23a4adcaf73d731948821258d5ed155fd7c4f1f0e605670745de66d661652d6e682042e727d5c7beeff0d76f73192731117445a19f2300ed12087712f9ed34a954aa6eed33c5a4b3eb1454b5c1634724e927bed7d63d982edbe04255100369f555d85a4e64c004521de3d23aec0caa66387a3107368bdefb98ba0b7fb1bafbed63361ca1911f4e441dec34d1a5c7889e518c4d0a55fff919a0b64876957852e192513b20856e6c0a52d4e491bc114a643b29689ba26c69629b18e2a480eb765276b3b629e9f3bd785648d255be5a6dc5ba0469dadcca1144db8aab74afa9e27853f743bec9166334b0a7e73cadaa42c02de127cb19a4c440f42d6cd8523e14bc2363aa04a5c3973bd6df1c29c4bab7cb35a626d85fea066cad8d04c61cbaa43e67ae55c70b33e15d87315f444bb2104e32b2c64bceb7e6f23ed56bb6dc18a550c7e0aaf5d1b304bc70da02777cf936268bf0f7d555bb3c8fe0dc4e262c0ee3f888723c1fcf5aee5124dd58f177d46424cb7ee70a0154cc15a8ea14162b0b5572cf18b6fb2ebae8675f6150a748b8588c8aea62e2cc9c53e9b740ef8d4c8f55acaee73be45102c91ea166c0cef88be79729527c3a11ebc285bdd26112331686c90db403583d2efde910c31362b647b9f15af27a51798181f7bfbc64339d342a9f59df22799c1dbc10b5a896a307a4373b7eea4a4b8c79db603e55d70162b68b3907f7e58d50bef12ff92a92930fcb3a8aca416eb2c52573779ef47e927dcf8055e6d18a7e91a7e3b5847eb779e23dcce64877e8f03d6ed604ebcb347e2db27de64315e15b9ec8f46661ed1960ea5f6ccc9e26bdd5e2e92665e26437631d1cb393dc4b28d5fd0c61da71b91b985b5aa3ada88b611740b6190c55a5cd62a3ac9b369ff87dc34e1844fc37673f34b9494a6de4eeefcdd74f72fed36f8a9f0c16025f3f4f519ea87bc08beb2ac48b69e7e5e4ab4403f40aed8155af3b89c4f97bfacf977c9d068c06a79ce07151b85a21a0603f89e0eb911d23c0443eed7ecb9081fddca81e3b631590163ec2ba1ab751ea21a0a3faf684b01ffe9dffc5ff1e4474949f1d51a492fff234046b12d4a90896dc3ad9ecbef422ed675f743d7b5a145bf39e39cd4c19076a0763bed64e339a3e39621cbfce1219326306f79cab495514ac6b1c7e60c16bfbf260d002b20de2315599bfa618eaa395f077ba474dcafdc005da3344b2e083f22cd1f33070a1efa241ae577d6fa755ef20df8f42a188ce777a4415d039a9fc8d419a6fcaba098cd581a4d6d60b72660d98db1942edcbe32a399e4ce58f09a48a924c26750929cc1d8d6f29f708d46bec1300c781fb5204dca4550bc0711d5e5cd0082a8d96cd2003537de2e6e6b2646adda02dd796403fb4d306e10b432e28b985b6767de2e59692b310bb8d0ad81b3559f2a28e1018abd30ffee7b48a434bf48b8a4c382ec539f0026cf5083c0923f27c77279fbfc957b6588a0fe06f43208a92dde4e40478c98388cbe96a28b1e8644fc002ad7ccfc5dbe01f6e8243a307279f527b15ac2837b1023048b0dd17aaa57078a823225974f68e4ac562f5a77666874de57db79399e920f9d8fe502b445291c5c068158958497c70a1cb9e363c8178b93130798c8b050850c630dad72400f8f56dcbb8c04f017a64bfd7f6345f24711f0bda86912646d161b846b6f0de1cfe7e295cf6fcde4888c8a10ddb7938b4c50cd65a3c710b0e096a4e9a84a822d9904bd24aba42d18c604080f2d14daa519dc9c54f39fe2a60308dbe91c9991cb0b15ac6c1761b87e8e973fa577d7b9711725f61e0e1d340763b83a6246d5f7d9bf6ad2176a02109f9c5e1386b29f0fbf897ef322bd92a324d111257b93bbdab0a08887c4e319d2f66c48165f744ec487aad599b2f8fbdc2d9115824c16458e34126fbc292243071496f37a6e0dfc3e6622c3204f7afbc51b48be68401fcff41dca0c7ff10fd922a3a7e140398302ffe61e108ea0cafd3906e42ac09a77c8505ca5d8a34843f61712f626be22b132beb936aff780a443d6772f1af78163f257c4a563b9953f5f5c397bcb104a48469fbc7bcafb517ebe7723dc29a94ef057f690f19fcdc712a5828ffe4322a8b26525a889e626cc961aad908d8125bdc721ee2ed473642bd71378c5c6392cce3bf924c462b9660b02b885c71c7e5c3969093df3e160ab0c25df877a7791e9648b93f1d6f54d476430f06df7f16034b06491b0f58cf0c132f0ad166a798f280a4a3845e985cd9d28b998ed486c446cf75eed79c535157a78b93f55506e6e9c7c1aee45f645a0a241f98e645a5c01390a9b399fdb38ce4051b99d45c90bf6113ea310bfc39ba3b9a819eb1606470be530c3037f94e07400fcec363603231cc8bf5262c206dbcc73cfe8306c3d02bc70042e17577515b840d51387c33ba7f12bc71aaf4aefff4f49d61e213f5a4bfe4332da782d11bb6a9a7222647b6929fc76dfc810ba1b4c8ac24c89ad4c296ecde9cdc46faa92c5924807f3fbac6b6bc2ae9898f2185c9f58166de4ed4679de6382ce4e5818d4e1ad398ae372414deb4f942116092c14c0b074c87e603bf12d7ab5b5d90efddc2e33dd6e347c927779a13a204a19439b1ec74f9d80c9ee8e55a711b29b902ca3231243c7fad8f345a35eba60ea4fa37f251a1b5c6b01b18b2015e2e15b3ac53c5965bbde82abc7f4080c95ec9e082c1544545499b85387c70d1cbfe3536e9a6d737feb8a982be74f428e06c866fb8b095a893909c810773a8c154361dde26437b4ee97eae000eb6de112c53cb8f633d1ead1f39ce61177c753f5da294ac3fb90ba98b75cbef15bd0cd22705d8228ad1aa5c13e6ce22a79a76aa6e2f2c830100e42904bbba2232db0d344e2e692d004eaa11b6343889ea19bfd8610539ac46a17944905bc86dbbad0bb66cd6ea5c88207efb425bbf9c5ee52c92590edb539e41ea844a774c292457530cc64d7b7d84cdad9e0f5c91272ee71c148d723d078544560639f1e3b4240f1d9c048b710136cf125102070b39a61e528ee2d28d3e2d8f39fcab8111eff7dbbffffc64957e8eecfbc15843faa4ba6008a5594c15ced7ab512bec4592bea786a7864052db2f9069496cbe5b0b809af497f2458e7576bccf866e39273a8b691c53b37f9840723eb38d27b346e2a8547ec382598d4b538285bb3119b39dc40a8f5abbbc1558491e6950994125a53b8ce9c5547f9d606b48fe5cf6f43e28596d46fa0b4e0d33da46e6abbd05726a1c3d467ade85fc21263e4b0cd408717e3f14b5ebc0b0a294ef01ac9f64839a127390c9838999174ecfcb01bff3a18836efbf41622d2becc977fc4f9cb1ccfc912bc16430308f15a6174b0c4411adff00e71a18dc593fc7130307d0ff9b7883957110a4eca5fe6ff9934fa92f00955f552876b2167eedd84a4a666d736ee959b93bcac7832c2da510397fdbcf25716398b6952edf8cc66349a5b3715e4ae3723ebf594913fec74cd3e7facbf0fb83c1791c8dbfa6a3ceddb1934d7feba372db48f76d3e8dc86e1985dc56e1e68e0936f9e5abcebb9c2f70dc37584f70bf221436242e4ce1290e911c3d238d8a0156a91b247a9dc881bbca10d54dff613b84ea87487e1c68370a86859104129008448bdaedc47ac0113ff5b4581f506287038d35aa5387f9fb389b18465cc4eb6ef3bd40d9badcb43da408c5cfe4785c650fd3f15619e229f0ac5cb02a8187c191d7a9f98618f223aee4f9baec1d6f1a6e8ff31a9b242787884fb78bf28789b4e11555d015657c323ccce0088482c6358daa23958b39e752a74bd99cb69b7f4a653498bdaa3e05eb788b646b11638ac981ddd7c67e1f37222648c5fa73e6e47b3518ca2df0b6c00c231a38a53399b2d46061a14a8f450b01517222eb8809fe7801547d1792bfae2cb569d0a72a0816cf0fe2e1af1d77b3326a5813613926a32188c62856c3a6cdebd767bec85eadfc8cca84cfd04ca0686d24941ddd307612ac2289d57cb7a36fcde9d05666d840b32fa23e83d982a21e7b28456c51f6734d7d372e2cfe287305c97dd29149c665c28bfa7a0b19ea380c7e935bf70c7e93c243c64f7b18d203f00ada7d4c26fb6aab1f0a12bd1af4ec9ab376b259b79b8a45fbdf6d916df6322b787a0a56d66c9b4c705c8f3c53d31ab17455fa5f168529989f291d848fdb98e3708ce8f24eb41e4f6252c8f9e1fd05885ea9739aad59c305f95d85be14486549fe72a3bfdb916940f29ec21785affd7f035e797b479626d31cc82ff1f60c4c321044941ddd643e397fc7eafae26791a43f55dbcc1ea02585f1cd25bd1977815caf4c649323b53d34b6ab9af7b968d5d250e30886ae40af3f45615f34d7dec66411885fcb04ad06760ef8efda5b39b7b31e510b4d252277bfca8e8189591a87c14b2c9719729be7a8b1b1f247182662fcb25a502c19552eb09ff0ec885a090355fb1dd4b3ab701e8e9caf0b23debeb3a6beaf44475fcf4b61d53b1cb59a0c8e6896765905a742a966bf1dcb856953c0132d76be97dae7641bd3b352200388da22470777c8e1cca675e7fbfef4c87d674a32c737feabd915984fb29a5dee6556cb1cd1ebcf26ed463e459d19d3e197f8c3f52ed92e6d467a5e0d2514238692976c1a8b18aabc254b5f7529e848e141e778f72c544507b135067c1093777c7fd8a729200288911b172e0c1c991e34dc8f1f91b68d0945020ca3de068e85a8a184cb402f24123b195173c6c6123fb5110ccf81b4182f78070adb9db15c6d38f1d47e1b8a13150c8e12ebabc999df3f4a17784683801968ee3d69fa50c6b03a6d7c94bdb7f02f158ba86aa29ec785b73803e61d7463ef47cdff0e6b34e0113b9664d69772aaeea047e4cd2a10d165e54bbc39fb4b5d06a11bca358f423cff8ff179dc8e2910fa9e9bfb0d43be1cd33f3dde1056c0c1f1f534a2c3c57467e7be868840547fb4477d87f923b39d29bdcd88d8cabb0127be61d810e42558b80d0f6428c17ac99f7321abbe985c75c572ddeb229e412ec0239eacaac7cd8f6dbafb1bba256e94d2ad0fcf91e47e5f932533e9816f7bdc87b9aab7289c394f1ce0b74073f5ff1d98e54f5b4000454de2e7a8495b9d67933a73c6e7103f9be26e905eed7a538ad7a81c4ddfcec95a82d31ef7971a31d45021f48b8aee6cf92533dabc3e1692c2e91c0cbe8db91ebb16d1a281a2a5281e04ac80c8d51a6f330ab9eadad5e44e35ad2e85a1bac4cd6173540893fce0c9cf12dc981461158ae416818c8b562d2a0e33cd377c615dc20edbfcca647d44328fd57e854ca86cae88e33a5d52ec396b3dbbfec8509f890bd2dff554b0c17f9402183862c68c362e329f1355e2c2c423463f13633e3869a0aae9ad1c4aa52ed6cb9c5c6e8ad11879968c54794f8b74a4ffe7a6294d1146041cb3dc5275cd9d7f81959caee19ee120367e51d4cffb68545d92743bb3b4342c41ced9da33219f2f972d7e294600b0a8ea60a70c914cd73de054f82bc8cf44488d1d4387d34c6e057c00a8481f68ace032afca35b9bab6e1adf2e11ef0b541521d57f3d45e3ca5b2d19ffb28bc2851d02cfde5b322077d24686857ef02db02843788489e64a54027830d80e3acf942714a6f084dc4f8ea65ca63070d175c4c175890ba80bf7eb409ae451c19f377b9bc7440a4c1ffd5e815c0c80bf922763ff1f4a2c1eea282106dc6b2214b81a377cd7e3c5d8642ed7258212b9c8c9b0b5b1bf4c70c2839af347718b4a6ca27615418814627797d10968a8259907310210c2cab5908928acb15e9cf22b1485df852fdf2d2b4abf9137cba8bceb284cb62ce002088b42a3cda11bbf9c3305148954b331f6b359df95088641d3fe3e1a29ddc6b2dd8cb0ff0a9543f88d4c93a0ec723d0dd2e647d672384072012090a814371b720a13954b8474c7c3e856f55b30497ef544de6528a6edb613ce1d546a1eb96205f8ee09d19862db18b7cce61c7238f3adf8ef91e5d16e969e2fb572022ce88aba41fb145907e8836cc50879bb0e10cd11dca7258ac835353f5e35cc05a4ba3f3772710f4670bed2c190f39e0a65ca058a96e0c588f2479332bcfa36f5364e4d8804e8df3fa4a9fabccb85bbd579a7131ccfd04902ce9ec16af2ae096dc40fc2c8a8fe9b31b205c6124c2ea6ebb03d9132e8b0da9f8c7029adc128ced02a7edc118bb6d3780b32dd9f894df18dae387985f4488dec9386c56fcdb8ac00a893e7cacf5906484ee4fd5530a7cc51fea406dc2e316342ab8e4b7c08a9b7aaf77b84af235ef757d022572ccf764f264ab2038613b795e4c49ee09e35a9bd81f28b92568c58f0226e03903f49d8cb60020766be8b2bb79e8f09dd0a83b987312f6127836c77b585fbf5adcca36edca10242b8c17c1b5e60e3578be494eb38a595e7d934caca423a29cb778286f1300a3f8bcacb075d8e9b0a75dd9266ad3369084951220be1a9bfdb518b23ee878ea92bfc41e22f14ce5375687a0839a2772d6ac6e4ac99793ae710d23fae3b5aecfbd01109de4ea624805579345fa9d799d14c2b22d99a840eec5ecacc71ce0571ea62c4970ce294f8e1e44a14a3465506dead35243afb3f526bc5c22aa70e4f3fabe0e30506a0d3ae699b97e178998e2684092c79288529feca2adf9b4f33379ab5f5c6203b7069e5e99d8e3570412d9646ed4e1a7fa6e098dd9f1373591b2bfebcd2fb4ff921bf6adc3c6bf34fe61e1a30c142b1090c8f524cc8105e31038bb74e582188d7d65bcf2322c95badf481087d0f0d5f3c57382d14b76520184128640a2b5192d4592b804c3b6e6fee53c14f848aa3eac3c57e037ec308b1d44823b553a0de248b1639e318297b3d6b6ea37f7e9a8fb7987b059dd3cd35c61713ba2208331d467332efc7ec804043062af34f799f47dbce98ea8094ac589a8eae7a6ae15afb370325c79cb22b48560fb1ed5f0debc414dfa539d2dce32cecc0da1a64404755db790ec6469d06738fb4d7e6758dcd38ee0d7381508e288d4d92a7b892bfb5810d9a3ef930c0b5c2aff514a005f8e2ec98d53c74003c7fb391b79faacb2559045a9f30a9025b2d94471ebaf8c29126951e138623a849c02a33689959eb5073a19b1bbf715043ca628b33111b5e75540f519a5bbec266ed8dfc3a339a62e3bd542035904e45a00921a29f3868ff43e16f073315a49200efc201540c820a028c59d668492d8fe08edff006a59226b2f717ba38e1bcf409cb13b21c395aa5e00d44119779760fb960c6b2c1f89b6d8d77befe011ad60516f7ffec102e91906b2ac2baede1d365673c9b7dfc847faf66c8373289e146bc453b095b89d8249a3fe5e75c7d2c06e1cf40138288a7cf397ac7a3e8f46275cf5b7d4ff29150fb35c89de1eafd534da925714706b5940c22d987767d0001269706b3d9285b8b5d9a38984661047bdb0a3b86763e17b6433986e334673c1d6a4fc0b848d07e18d8439598cb15396b691e368e5f05bf4e922223a8e632d65c466621802c249ae23c98e5797045ff00bd2c7ed7a3fed7b87aed83a08fa61dd060128e658449471f9e54c83280cbd1abe1ae837973a3f1b2738a6904806e12f16c7be64e831e03902ed0dba28b56cac655765ecb11eaec36938dbcb99e747fc4564daad5985be7e273e90c56355dbdaaaf4cfc1c21578571fe10e766890a5633682ecdf16fb94bcc5d1ee3c0964cb9fca6e2703c7e39368d08f8138c846446160bffea4d005e3f02d53a8c72dc229131730cd4440a3009636106b00eef4badd8ff56415f8d28049230b7f7f4993137276bf8438b291a0d7c0aede64b409a80763d0015b465f0a06609a7b05b9a58e72e23edb5628ecf038111b2f9d1ae9b7c7cfb31797359be87e10849c5d3b6bb631e73990c5aedb307b7f1afc89c1ecd8779bf2df11849faa815588fccb75815f4027c4d97bd571c9d7950a54ae6ef4be5fe35462a8b6f1a0b6c2ce79bd6fca7310d9e79d2633b508a4913393798d8618db97ee46c293d8ec8fe0e0273d1515894b4564fbb7dfbd81e7e7eaeaedab801778f9459cd6a5c07556ac741697b655746949bcbbdef9e1a30ebc85ba82fb572fcf21cacbabbcb0764517073790886edb33d79488db20f25ac36b1b241dd3e92a4f7c99360c6bce954985466b0a218807c27463fe4afa85ca9d0418871c2cdcfbba4998349e88f2b7e44f4d0603fff979debb6cf684b05876cfc89ecac3258ee5a01bd76febaf4d02ec41ac4a9902c305b6d812a2226fb56923aebca1bb7f98e5a45a49d668c01cbc511c45af31ed916f260e745116e8f32faee26a330522de7b12c1cb9b7d5d6d02f115f5f4d9e85dd6003259ff80d004b0504061d077982c34cce17a061d6df27f5d540f57c9018f661a2d74fc1a610e3dc1ddb8a0cf8d6c93599d59ff839ce89a0d76a76037a6b619147dee5396d7186e267f5e736655624a86ac47a110d80acbd10cac30cb2cd88458b447c3daf4ca8e6f205519eb66fecfbf1b4840f7d59609701ad136944c41f7ecf8835f5c7d36bb7e6fc8f6ced93dc520c817a3cd8a618d66994ab3d4a0f26b5982aa4117bbb4f8e84eefb3aced9ac4e3e8136982b2fb444df55683e52a980f191f94d4ebfbd2dd8855be379e840d7fc98170d65b4de6c0098f990422ce115dbbb2099e300e4f9b604e6a5653a59b48d8f1be80061cd77f0d3c45191ad38b121cb0329d4fca237850b7baddbdf87976bd65c49591280dcf22c416973f672781dea253982e87a512f7432ce9524dbc300363a0b6733bb5b0e0641fabe31833f9a6a6dcf3f2a2aef8a859e3a7341596993f4143a158655e7aba4c5ffc9f5bf35463efc7ec6afddb68cd936efe12e72a6c5cab342285797e1dc42230973608fbe351414850077dd94e164159ae34fdee741821aa08148d064cb07e7feb8adc13395c76c70ada8bbeccf9e48dede5b49785ee76ed162c7e07eb416cd96795f5b69cc9fb34287f947ae38bb388977c109cc69f5213299469668566ed427b1a5a15264353a41f2f89510c57195a623d354588b9b1010cb833a1b07375e4077d71b0bca1933b847a6068d51a3479c1b0ef4ef59063c6be4503a3958d6e84903b87828404e47175589161d367586660612b1849598a3d1808c2a80f11b4d1aa864cb7763c059e684299097ae88a1d5f917c636b2b1e080b89a23513f8187e80e654f428b0c7d425117a13aec60659ba2e97a713106cd2015394174f93de286914973105798f17123039e52106baa38932d7efd55f93ea0d5ed07b39a03e19e704f12174a1d7d220855f74cfdbc83bfda1ba4cbb160627e2525113fbb6e6c8909da32bbc19acac061d7932210308c5459b61d4470b0d1dd4d25647ea47763eb1b9d0f0962f31a3874498099cd183cbcf331433105343a75de1e37d88e40238a9ef0168bf121c7bfa38d2681c52f9157d70bccb408119bcd8e03e6e335c94255b00a284fa36347e5b03bf60f8005cc8c54b6868b8d552946f517285fc48a8f32bf9826f5c32d9898862fccf98da5356eb90c87a98e585217ba6cf5a5805afa562d8574fcc0c7c6d80e2ac9f5b4eb845a74eb5ec6cc09fd4c913683498a78cc0f0f238a108d42299bf5ff20fd14f1ac1ffc6a7804d175eb48829939b5f8c1a85ed712121aeade51b143f7814a6303cfa2b0d3dc29a75d6c3c8726d01882da3fa4dfd7242038f73f28293ebc0cd25945cb2f5b986382df0b8da0f5473247f6ac9a31070388a388da518457cc5bb5acd8f2a9881fd6732e602fb726b5f97d023e5ec85c38e9b118938bf0c60fbc13d454a4d65a050a3c5c92008fb1969ec3b7607be99f7518b06d16773c25101e34090f33bbf42d51c74fb473d258a4de8017ffa510bfbc71a9a6237730c0ce8aba2f3162a153bccc3a9b55a2b742cd880cd51b34702a4b838f14ed13ff7d1eee6f2eaa5d2be81b2f0c9822e6af734e7aebd6e3c19132b4652be3ab48c5fe64f39efa20a6337ae211b86c222bc941780cc4050709512ab55b697e1317660141dfe037f0ac6e27f403bf429079ed011f4f040e483e667a487cd728f3d9929282cf0359878783b57c3b8b83d527dd9a114fddc0a61ef337bc028b4a68ae6b97313757936b85122bd7c0972dba70e060b7849ee16d109f4f740a8821cfb4afd4b369b84590fea0cd97d6176b2af7eccd5cd28e752776f3dc64e3dd2fb5d87b488e11cf933c988fafbc616dec63b77754a43b02a7a9bd7cdf66c08e9e17dd15f0878fa5baa28c46a14889ac7efbe3273faf777da3ec413757c24d6f77e7f181e2baf7db0da2a3d0c3cf129bc571318523882453bc321b54ab05c3cbd1890061457dbb7b49119217d2a93981e009198ad9b83d23d23c8043acf43da1009e41977754ccdadd2ed5a42bf4fd6973c744a717d4d216de8b9d82d78c77ca240056fca72ba9f6a53829e0d7bda1287339479f37f95118095c20f0d309d292fbc711634bfc1a9a3fe95b78506c9a0956069a823033a27101d21be47deda52ec158a0f13d26f1d27739ec607a933fab01464bb1cb016b5836a0255ec4f1fb5eff3cf4227a3df9750856a5543d2e588d7f292c8e7f2e8dd0dd7cb4e1bb34aa2e8947415ae30e6fb23b9946d26941e14577199c52178441dc3b6352a371ec7ba954a3770cff9ce4503cac51a4a24e1f5555ef68d83b4974a25cc35be5d08615700fb93539884286a5f27c702f35dd579c2579afb005e404836d0b9308fceaf25ada0415389daa091f47365fdc43db8070e50ce0b51f2afd014ef311a662e0eb99fc600937008f2431a0523d67b665cfb6b126a4a362da013634beb9f6bcf22124510ba1ee0a0de537066baa1569e3a4ca6b75afdcb9457153b773a8fe1b7f85e17b2ecb712353e9eb9d57051664f9266fc3079ca71edfd0141fd75c353d3a77513f86c727ae219ee05c6386e9b081ad8eabfb0d1acc300e777d8c06061728dcbe6bd72ba85c4d897645ea42542fa3fb22c7d75757ae68784d9faa4adf5ca14eb12f4f79d607b7c9d39f9a712977bfac3c1d58a4b1ee9f92856c77d9597720faa2123677399aded6df7a52c6c4286280d47071af069a390c8cd98b21d8ee69da26be39937998358916fa47283d23a820d79a618b5daaefdc2c73ac1575707a8b0e061273dd12b99d424ee43bcc15719d1491aff67aeeb1e092b6c189a5698e575b8e002075954b8c509acf6682fc469dc8e1fcfa73dfcc294fc65c209aec27626ef356a6878b57793debe3f34360bfa59ed456a857fc97d64364bdfbeee910c20f94a24444386eea1f137d502b6db8b2b556e386897fc8c6d1dbcef0daa74a10d269b0f85fd0436665edbe0767a86dcc00d521e71b385cc351949efbff5c1c199c2bc002a77f2255b06a8427fe280f5d511fec3d54e16bb07f4f63e43a42e64f125d1f07ef1132121684aa39c90e60c7b39502bee20a78ef296bc5f1f495952997e147cdd67b1f11a29a556c636f4f5077c7d96ee9ef35808c9087d35214221586052b08e4719b6199e4f0e19448e21dd658cbe87fbfa3b8c3539c7979dccb936cb6e2ba8bb1ddde9df125cb915b82e14b8d959e7fc7dae0201259e019f3f71d9a1dd89feb29032d3006f04944f1e0b820a93f2d2d685d05581948b3a67c9b1b34b292587afcdfb5dc81621e62c8da3ac323d0dd773ddcf7f41c40deee4f832d88d6f22c33f3124eff27013b7eb78249624319fc43d935c6d55e431c24541c2677be0d00dbc9d790d531547aef174ca7ffc18d5f6827b2d0a2799feb6a97d9be0bc4358e882f5f8615a56c4eeebbc4206e373291b0bac94a9517bae186a6751d05371b79c78a32ac580b492e2f6ad9b398716cb754b01243dd599ba8ea51f46aa6ed812d2ff148febb766eb1fce4bc592fca753dcef99610be7f1b411aaa9b3c4d6f952ecf93a1b839ad83bd21fbba1e8e423cee01a578cd8e9f9f2d1646f44be00eb12519f08c5d34d26f85062c7a5c6f05a0de7d46270b3a319085937bb3bcecdd5deeb28f91f351da53dcef55d09c7ea6e521e9fa64bd89b2e1070703e2ec19a77c28b558a09ebae5b4547ef1088d2b45843990452c25ba709ca942e8c4aa44fa227f4cebc653b5282a620a596b167d86331fe5058e38f0fee8107a19d3161c1bb04bb5393ebce4e096918f948ca4b8dafaf8949f13c556916ccbb734e5fccdc3d5b4e549901af4d13e87766a53b4764af795de21601ca282d0fb6b1de22e8c03406bb625baa72ec7584af0ecf94cf15aba9556f083a0939d4de9f9072275e24c2d80e6eeb806c4b3c27c6590c1bc14e3f3fdebcc80eec6320269d67918c71209d0c70435cc5ebef2594464346ea89b7daf582d29f17ff211922ac8aa88eebc18f0044384a79e2a3248c94178ca568dc406b33de98c21d7f3c2c1ae387bfc48ef546ff314f8c8214debfd3388fb7a00f099675ec01c8651cfa54d7e4e1ce8c85410479798f18a4d12e92ca7d2523c6d8208c009feeae74fc37ceb2efd0e2d2f9789ddbe82daf06f8a4aa6ae0cae3820644997908b66121b3cb25ca4250801017b5b68c0cd3b4bf400158e97c1ade77028aa54d3174d223c60450b567c003d9c1a481a6c02fce6768bcc2915558601b99d9ebe08e87af5c882382396264a94f05085cdcad705cd9e080efbaeaeb32b7016c008fe31228af7ddadc8c00e525263935bee4c9cd099288ab918b79db38e894542735937dc09e61d4e6745fcfcea5929679c2a8fe6509b3d1ad759f58a0414af4fa4075f236233f2dd7c914115385e1284787fdc1928e25380c943334a3f5c783627d92e17764a4f6af287a81038dcffda5692256007fcc597b536264d7a5898dd8170a7ca250e1b328de4056ab4b18bb0948e1043ae8d465e2117b820fbd657301988e3b1d3e6cdc6854cfacf85dd41a59f3fe92c2e686be239d6a4ecbf482e691c3885aba0bfc5f928de703750a226abcda3cce0054b579cfbb902938e8a17085a8f356ec70a31c1c75bdc00d342b0abcf29d0a3c95d7e3a5297a98c1d678eba44772740a703d68fc11f3ab2ce5c6f2aef1bc9aa89deaf9e9b10bc731f8c1075d99f43aa51cc78ba3e3e77060f5ba2a793beb57847506ee8351d603620487c9e4e67ef4ea27d742c6f3671e958bf0519a16a11f43d82da9f38a9f3f7bd02606b4b14b301ce53f3df8660eabdc7ec4178c048152cbbb3d441356a490c6238cec49a38d4210b80ca216969e6dc7d7fac37057d157c2d20a8ea955c0b10d260f7a433f8cc1c91f788882fa2da24cf4c2ad115fd815e95bab8acc3c6e808b098503c251b3081bcf2b7d2b7738e94210a8c52dc7f87a88d0a3ee138e897f6cd213b0215472b65a8518016ac89fc76834400b1801c5f8ed432da59b1ed554df5d7afaff41762e28997709aa242624fdcde914a6d28103f885144ed6068d49b50a9f339298dd184067147de5572bcbe770ee8c6e64b994b25ac1ba2febb5cc92a561fe4b7a83de6017d0b9eee352ed7186efae576991a90359cd717fc66ef0af7adfd3d53064303f696e108bef409e8eea97ce753990c26742322e4ba045eb28af927d53876a818a7b1e445d0ecb57b3b92bd039fa5d66bee57f5fd9d87296de43f89bfab6aa8701bfde10a02bd17340d1b5adef2dd89c26dfb9a613f5e9f0e663b222f9df2cbf9687cf9eb02172b279c440f58c447f72ebc6755a3914629b8de06ed9ab48eee6a4edc31169c876b80e48bf48cf07df7a80a192076279d35ee4fc33db24ddad8133f1e4fd4a849d8f335606dcaafc13488ea26ae9cfd26aa1e3ea171902a96d564b1107ea79a0e721498d81fa0814f9f50e95b07512299ef41a9cd1d6934550f15ac966d485fd28bf158b1881d644da9f7a7a42d1f89fe288f1c7032953769e20aba6dcae05dfe19d8d46126262e9c1e703331b5754737db476499d7ea86d4e77e3e73dda01e2d9532baaa1220cfa9771e44035168bd90d71c2362c1502745bcd9ed88ab22e660a5dd8f02c5b427f5367b9f8a051fab5b8dfe5538b823aeb99bd0f5bc003f7f3259c65874f3bd1d46ff7efb048fe284552be6bc3e32b4fe87826b5519e8d566971d493740c038198b0d041c2dd47ca2c7df6681697cd66dd4fac1edb788484f7b22cac89a589045e00a9416b310d9099790f1d1e48f8270e6c35c19136126e3bb2b1a8dd11b63782dfbbf7e8cc60cd544ab92221e38e5fc80e6cdb41f2d200fb23d2ec541c09aeb769418e56f408e9fbe84630563848f79af2416ac752574551e3e58d37c913912672ff0d2660ff9fc37d2b68c675313c05bb662d0690a3495309a12b18c0f9ce3997b82a44e1f51771f28339f98f297558e7d4bb2d48b0db77cba2588d1df5987378b71f39d4cbc172c38cd00b7363c9c57e44a8bbbceb134c08e9927f3ed531e369479cd8bf180c43a5271716a8e776d2b0b7b5edcab3af3e1159cc0dcd7b0c161a3bc052bca7e57e6f5c45fff41159ac12ef1b96f7df3b8c8f3b834a955b3a9ea06728b847f70f5ac2d401245f10bf18f7f3db8332350f9659bb6a536e002a8854240b43fdba415b065d1270e36892f79b8f24f189f4142ead68a385d287b5599bd064f73c56198ab96a9ccd2870cd948dd1c6a9e24b67a18ab883d0972281749a4c346c3167df787890f50b6cd54142ad8ebadbeddfb98bdb82f0689796a9f5557cc7cfc93b19d4d40b04a0e615aff3bddbb2c3014994bda782455ffabdc26c51cb17792e54eb61d6372fe0fb0529d73694c2a72e965cbfd9d8cdd94e05260438a43698eeea4b9bf616e09d8a4cce2361d810d2e5c531bbfb89ccf57ff090f46afac9d7a567054982d1913edbe5ce98738a9d7dcc4c96d7e4fd14914892135e96c1980121e988ce8f2f72b6c4a1c26673d215e7e094ea4c867f337ebf164fe0957227f818c3900c241f9206cda34f7d1f9ab8f3eb78b7bfe6c025e52939048c038b649773fc9205b334a6203ce2207710124b2056cac8a9e155a3d256cdf107c50d654e9ace03aee424575252aa2c9e842d1daadacf17dc6f34f63765380303ccfc3084de2868926949229a151b4bc204221e2440be8563153b63ddfbf2ce4d08e39f19142d383db620ca8773a91cdc2beb00ea3144665a90a92209a90b65353b4d459a82b39186afcc568ac79a40b660c970239202da700ba3e8dc55a26df9f44d6dee0dc5ba37ad93a6cd2f8bdb163ebe5549200ef935e6b0fdab776f977786f728a0ff2274acbb608e097dec6d23bb11295f1c6ecd6b9c3ee7cbef3a56661ae46a052abb1b5cb0408ae4f37ffaf8e2ce5952a3a01df0741ba0a15861f1b87ab233e136389f7478e5fdcb88dd7cb20f43c131dd15070468fc60edd456e2064082ce4dd3743ef103260564b9f1af572a85272fbab168fc1bf9f896541f83104a791d0213fd1dd7527dd4f0a87a246e66e9d79ce74d1da5ee0fb67ca8d50cbb693ff643d595a9817587a95baf8da7264d8b4559da3506e1c09ddd06ad25e61d16838e192eb3c628c4884bb51c12f960b1cabf5a48abe550a1e7b48149d2417bdf74f88bd603d70a2de41b588d42d2ff52ca364d2f62090b8297198000310d3e1449af0c6fe28ae43ba7b60bcd2f3c478df00f749203c5addc37aac853ab2e57b5bb3350efe383a068fe22ccf13c363f696a0a426eabbc5687b77e8f4c3e14946886b82ff74cc7684ebc931609a1ac54d2a53359fc6bff4804ed70fe0efd91c890ecde63d4990084a7d6b7dd6ce8beb278d5ebe446c7f14b4510f54d7e8b10e61431832af9f893a84de79a879773560e2270fa7f3638080d333d82f09ca40b5aa820992950cc80af09ad159718f40cdec6b3b218baaa510e48f38a928295e04d98841821522b14d1b08acee21df26238df1c288564fed1eb359605f177bfeca13ab0f93d02606bd5e804ca7bdf4b46d2afee72b9df89ac01dbef84c80618fcbd1cf84120fe69c6e2ef458ba51eace8d73cb004d2e1941ebdc5aae05e92a90791f93620e69e79aad3ef9bc481d21be699c5ae0c64e4da492222d66d695b11445a4f4619cec078d43eb8f997510f6ebb485176ecc5ba0dcf503569c751a8008015278a4442277efb9a3575676e2fd18c38e25dbc41485038117aba261b29bdd2a44066985e9b5b63289fc8355c47443c675af8df6303be33b508054c6a94a19a1160c54644d3133f8a20d19697f81bd03ef9a3aad7a7e29dd433ebf671e99acb7ee99229cce85ae339b7123001c97c29ce9ffd1384743d5cb12aefeec5b8a98da652403f6aa61cc93d1731c9083fe40af2b56a7cda97c4074c01f99b5654642bfd3143375439f85fcead79ecf924a36e28a0908189f85f6773b5d72e17cd7550d3dc950e3de8bfb0d24356170c805b2d0833dae2055d6bba58a7b75910331898119732bc3746facf5e55dd7a18fa85f49676f8759b1039d37283af98e1a2a16b67509ced92f962209eee414c17b7ec8cf7585d2bf8888d01baca360af349f43007cc57d3bf966665d3c15fa5c6d12f712aa5c022633b1fcd86fda8d7d9b00bc949d96efd953fa8a5583533f51c0543b4daaf9ccf11c51d809decc52db149745ed3f4ec4786af80ddc85b6100695aef3771b1af2d4dc6a88130db32c56976d083134364d78e1d7881bd23ad71410e4f33e8b17e0559545280e3ebf6fa51f956a23a566a2502e5ced0c98f83faa54052091940d0404fb2a66c19caff7858084db8fe9a181d7336f5f79d727003f46e3c6f7eeb2f4f6115a04317a09b6ecb099567c9988a47582a14037cfea6ec902825e3a49c6a9a319531a9c531ff5896571f54296b6208386f85a068727cde6be97772c375160b370dbd521b63c45b404470d2a0fb44ea6f7557b3c152ec29b98773d036da089d5ca09c417a8864292d0323e62b8c5bfbe86acdb524e61439892cadbcd898dc034fc49ccd899ec17be20364901714d3394b91ddebce22b60f1d618cb96dfa725f2a367d7f57ee9f1c54c6756e04ca5d108279b265e1d3b75b1a55cb12a3a26b007afe74bbc8b1257e782c2ca82ef7aee2a3772bd23281a3150124fb3357c7b03cbcb6a93ba70361e3a7d3732e55d9ffa98e325921998f28b1848aff4e263fec53dc96b85ad2c5c118880ec749dae98fa1cb8a05f7d42296ddaa2e8e52754d0d64546d342e5f2f9abc86aeba78f7591c038c3427ed888566d6d157b43075dfc76de9882071b163a41724ea729e1ef56ed3d04870a6e63eb04300b65175d822116933c7743ed7ca7b8590532781e2e3cdbe0fc2c1b0fb88b3aa20a2982c35fca569636f9e9bb1e2206d5e01a89800fb8505e750b237c88d516e0a1392194de884d3f93cfed2b3e777c94ac1d72c665b6978b2350c8789ac905f7a5d993cb640709f5e02689e4303c7415e6b28c44a294d8513d44f5de20b1ade5cb7dda99db171af8d97a62104a53dd2e83127e2b9098b53be852d0ecbe8bd880b61e2af9eeb5133495df4b4954b68041a19ef1526e77ff01dca0d757365ec7d6049004ee841201d8479827f9448beb73797b358df360b8ca15089b780163d2cc1fbe2fa2af2b0a5f615f6e1dffa167ab5bc38bc869a14c5c483f0d75030e9b282a908bb084919e10e56e7b074912d70ae295969d9410306252bc5172e0150d2492a458701b33763af6d633f64a821ce838482ee6ce244f135733e2a9c58726c48e14103160f27f46d3e6a39b2f8f8dfa11b36de3674cadd6629c536299776957a8ff7839a45ce544425704e23e31aa2adda8abdf9228963cb437bab6c652734453d3866f43a5213e52edfab46d5d3e99cc1a742f10dfbf798dbb0df1d7c7232189027b53bb39e6f26bd92474467d31d7b9a4be357809c9a0b9a6c866c7ae93df612bc20fba0e24f35c45cfa3998ad7edcc049b39f466e918337eaf0048343180433414488a61145822a7f6a31be5bff416c049378a57635ee1417216a3bd97781f3d73cae46629f9a8235c6f895b8adef14f8adfd403dcfcb2717ac8fd42b78cda6f28fa45ed0925f4a2b4e685e05abf7383249a4f34f836469c16cddf6599a584cd9618c089a6b4d1701b0de1165b47bfdd3e1c52dbf4efeb91e0607c7ab55a68d27fcedf2c3d2c49bcb30fe9f603b67e6909bdff7a21326b1ee3561bc0a38c0b64da4f08e9322883d93a7f480640e242535ffe01a8fb55d2422f79eac8496bc700dc2463414cbde09d447d81a3f910bcd1d0924432646c14563742044cccd3a770056087f96c61030013ce338a6859692bc87e82b8641751c8aca3d1db712f7fb12c0f5b82b1e2ccffc0f9843b2638d9816ca6c02d4daefc0269b37ccc0d2d7ed01d6dc142b7e46d09feb18005e42bb34459efd38bb586f37f96eb78084a416e3e1491ae0b2daacba379d3b5c0a50e583f69f97f3e7812ffb7be8095147c866f89a6071931d24b3eb03742434fbda081becd6f3108919304d56c67cde6e383b9168f8b3d9910b1660b9ea710dd8e921227ca51994d66b9e21e8b58ac5034a8e875bdff43774d720490222437b2f64fcaa1007d0db88ea3317c4f5be3735ddcc03d5793e00f24709fcf92aa33deecad124a41e88a65bd91b3c31c87a30d41dc7e70eb9079d798b3366b1212336ea80b5634c159b5a910a3284a9b506f1d9d3c8719361e1103d435015ac17adfa5ba311d1ac48f56b6fabacbc5c9f99d3dc433b7fc3a115bbb597860e64ced9265e72b6007ec98801be208379aba13f109c9f72a051f8330f1c5d1c24c541538b72493e14102a212e4af323f1adc6cac17b068901c56ac3f2f1474e35b1020e02fb27c80cc39c722966cc4bfbad883754ff156906fb0b95e177314ac87b6163fdc3c94a698d627ef767820f70a9242f89530a6a5aa2d270ce366c7dba6c6856df744f02367889a6d524356bf4d5bc916ac36e1f1ebdbf16f37828a95742a68dc51f77baff21fb0a967d7ae8d9164b32d6445e3ed02655ce67cde86e04acc8cbbdb864f7f33adb09cbd19a2d1788632ec9e953ba88065cfe67870647cdcf06f14597fa3ed50836fd4586dd8787f9c68b346f8b7b1f5ffb869e3f461397c45bcf91f8c10451e5fe8ff584e5c28f6bc505f0b2f150e2821ed8b14e7cbf6217915b507c63fab2bf5e44a1ba1ddffe9670345336a5ff8f992bfe8c5541a2114a190591a6afc6e79752055998357981639e77189f0692681e0a1f90b5b68f5c50ba3ef95f37653f049addb094adf44672bb4f7039594845627921e8185bd03b120882b17374b065adf52d0aa573bb87956d0e9771f3ccd407b778cae6ee6dd2edae57501282d895d2b5fc3ccb8f2474530609d259ff8d4a86754e37d168880b328e2e914f65c823c49838ed85e0d3b366c5b67428cb5e0aab2285314afaa47ca5a20bd4a4e5bb1469f908b959e7a4053deb6471b8a9c21b147e4c11092429ccffc05c3a6df587a6b94d853650a572c07b9b6a040763837ab57f42b389da73cf6d2078b468aa575343f56d6876874eed768f063cb63475ac568e5acb89ba46d00eb5927a3bc6df15a957c0ea5e63f873b898507a8d628a5e130605908c4d71ed785a373beece4a701f5340999d83a95a82f3e891f556982ddb0e51475a5ef05633ce88c06db75ffef0fa50db4bc4846a44694fc97c537029f3c202fd7d5df3393c7ad8ec0718a529f9a5b61185bf3da226430ce455b12d1370a5d7cdc5d5798d840f5cb6f2f682ec2c4d1cdced09c9c0830c154cd5b1dbd1c06873c1c4f07a946ff00b39c420a56f0f3a760d287f27da68251799f7ded41a2205af21530bc9d6566bf40cfb1020b33a059c2f5f9e9e581a2592fed9fb7dd5291f449b0b5a238605c583ce776a1a63dde4b367bff6ef048d0cec9c3d853e543dbe0e39cd9d27c13d139f2dfbfffc6d374b4966f9a361b0ed48e94c09c2d81619535f783be815ea33e787e7af6c6bf020d528cfc2daa9e319863240c763836c4e0e174a3c7098530fc8dcc6a13c879180885b2e54850f862351d2bc26b766f6bf8688d17c7601da6f7d3e243fa53f78d562db20ecef51c8d18ad44c77645fbd23b05617e939b19be1296469decdaf98b237dbd04a8529bf1faa71f630c028488721ccb337fc95e76c35a8c737a8cd363adfbb46349b7301bbce6f746dab50e1c9ab64a95d16f8a4080858aae458eb21a9b40859f34e5b4e88a3a3f16a0497061e408345161d04ec2194506ce72fcd5acc641537d37111b81c11bb7d0aa79acd8c268ee26115c54218b1b17f2431568c830c17a3a885e50f41c0bb4c53fdf5e37184ebd302b980f6c245b285e32c0dfd46a7d2f144c9d158776cdfd5f01f2db3fa329899ffcaa755e742dfcb4f68fc659dcd3acf0255ccd57106b811ae860f1bade552b6237ccc22c46d4f43f9d5ad69a7c396983e476fe194a6c56aff486f27e0a095287edf507589fa954d55de453c94d70cd6da00ca1c7b4fe86e7aee4f203f80d793e26ebf60dcf67daa3bb8fe6b2b10aafebb716dab758057f358cfee554acdd09c689fff275584d8686851869f452b413b4a75052305980928f9044714d465bbd8e985d87500e3e7fbfbc6008e50ecba4df43e118d6106b50a5deaf23b8572c9f4868b7310de4b317ef86db16accbab11baad68c59f44fd5c4ac2c8d18596d4c682132d1c1649bbfb9c86b8c7cd190729c62a59d69dddf5dc3af6bf32e20784619e1e861bbfacb20c5b7de32a08839bd13941194696eaa04c2546a0ce8fc0260d8b2f0348f7d40a8e375961b01aedfdd93bd2bd489ad9f4e972dcff32ee5c27b7ec3506ff5bddebfde965cea6c14ecf9bae06a7746d6edc749f174ad5328f862c306dbfcf800fa513d12cd37422134aa800079b955d61312dafa4ac2c5e404449ab340add27d0d9695c5be4b224e783cb2a60f8205d2c3b138c6c568848c53fdfdc5362faee246cab4f03b8c3ba932366d61e49d489e95c61177df1a74688d6e9c7baa9bd0cfe0a37fb60aa33853b5f28042a578744789167453a8bb2313214abdd905831c594d803da0c59b9e029976215c056a388a5917dc4467aeedfe1821162484aebb8830a1771a847caa807bd2be4ad9e7a75a9edfd6584a81cbec41a3fa6a9607cbd82afdb4f3121b8d290eaf25a9432f495ebf294442a70da574a14d7df8575741bc736f22e1bc303a7174dc4699f136fa70b6d239d7cb2f5e833c01a2e212d0ed164450a6fba2eedd5cf2fe244067fc251fa27eae935e7868d72d3cb97ed49257c110c0f53da5947204ebb270475c7e342e284d5c124f7928840cef57e911a37b08952f0107dbccdd172fc24c5b28f65713a8c7bf9756901073a22825805cfae22badee749e9bcd73579b448dad3f22da793d73b2880851eddef211e46826ae4ee100cc19aa1684bc1807c68573bfb3d4be92b0e3ef72f081d690f4b508975944d17d0f99b77c49ddc582cb23650a31d07583d35dfb4e543dbd45458d8a6f3d1918a25986b4b7e4175be651a44075df1ce68e9c587dc1a782cc07ed2f5dffc7b6c696319976b3da65ebaf1fac460386d9891a7ed56cab97ba8e404af4b5287737601a4caf36364f551d3204ecbc321b848f8457e5618a98246363a4990a7546a7603bd5870f49f8f2a8125ec36bd9afa0590690021be9d729fed30b3a95391ba7b0e246278130e6badb1883842011297bfe66bb9dfd5fbbc5e81ce058d6cbe06e332e967af1f42140174ce3172d349b48ca7d32d68b250f72fb75767e11c646ae3d9bc11f267b6479536201bce5e957f5b984495bf12e46e7e79a9aa6cb5b531815010a31ce2c6867977e9a89234301bd003b0e9e7ce06debb0f1e30452be3bfa7a5b608ff7309717813f9734c4e6334285d7b7ce1e4eb75c2e0119473391341a1b65d26f963418dcc31da03b284e9a3b62cb329cee0bb89e8b371b8bc26e2c3f1e0200df03c37bf0a21a6f59b5117bf46654724fa68ec493c90015b3957ca22e9a7ae3847b2e8ca879be3894544514cf93df71a7231c06563a2de49f09100ba21c8576329d0802b53467c6b8f2e455afa13b10cee94b2ef606a8fa1ebc6274b12621fea9ee2a1f00d6e61b680151cdb47a9b2ed99d17ea9fa87d2f0611575d75ab4107a2554f7222f371c21ff4dad3f2bc68bd8e897b76a671323a0daf4cf02d95475e3a9f38457636de12cec66152e63ae6a08d1ba7f8250469d27102051412404c8bf9fc6a775edd30199574feab407ba2979065bd7b18d8d8ad58b9970405fc3b9df08074c76b387deb577ec0a13f3aba8c3b9f25b6f7ba94d62a467766d58ec04dd2a3c5cca92d138e8f6a7a4132e4eaffc6a16bf84648a113e461850555affbc7a1c2192483b7fdbead419e31fb1d756de86ab0e7aa76db5d648537b28c8c119c1c9b6f905a62d14205102aec583bcfdf899caae5860d2f9b5b72cbee8b4483a92ad591122dd1ca8cc869a4ba7cc927153efc364872271d1a54a98b5ed86d590a6e762f394f393ddc30df28850106b8e2e1f778c239b59287b5f323294d901e49846b842b9ee35029498e84c6a364e6bf86188ba18bf90e5957db05c44ea8a96ba90392304bad117b29906237340939a39593bfbedf0c1ae55e2fddd393a7b89c3474e7b4be8acd80a88888021f51189b14be7049a6590ba4b283141868f25a7ed555fa10eefec288aa1c2394894a61cc1c9261ca4a20205341ad69923ae02b6f90220f92e5a21f2e3e7322567936c8c0d92eae0223f4e1f3b84a925c7c3e5d4c37bcb18736a64e58a8bba6ebad0d0b2fde544c88f33ddde10e38f0dd51ce917a83e6bd576f4a97655aa57cbdd9f8f3a635eb1b424eb7a778671a56535cc3873f05c9f7dac1640b9b8ee7a9e9abd72bcb5d7b8725b1f1360481d8dbdaed4693b6d371348482ddc533f0b909e8aebcdc023db4b4d7f5d086f5c21cc3754ef5e8e9474d1214393479a94559f975576e24cd3fe744145509909577d56bb2545eb8da14b341db91f94d108d87149bbfe75620018ba5fbfaaa8eb083b858f078891682bd595dcd9c5311a05b0902d971d6107f45baf0aaeb9198f324ba4370b66bb814c1dd52e66d7bb3c49a2850d8581e1aad9bb15dbfc1f383f6dc9742a201747d13d53f5ba4603f1650ee3261246055182ea95341a7a2d71d2cb44ffb63d702caf22b628398f6802ba728f667c8924611f803a79ee29e99b0326da3e8206debb162168ec44f87b46304334b74df8c6fbd037e5647959667da3e169cae0656f8f28144f1ac16be646c29b9898f69e584aaa4f22e8c0ca5c7b39aa3057fbf0564bf858b19985930af3e1ab90de9f7cdea2dd3f8a17d1a080f4673e3ec8d64756158a05b7b77a32dc67dbbd0ba1202863d27d25846bc6872ec516e2825969a5393783001f02a7d486e256ec4734df667ca92dac657d924badc65c27dc76d0a95938e83633369affd81880243a2e5564616ecb62f3247a8dfb444cb14acaaa7ee6dc7b4326438a94d6d9f9c5cb49f7687556078d7d9d9fd791a9c54e1f55677bf22e9725d87f60c12b3a6637b9b34a6eef3d0afa571d766b10b0b150785b5c83327fdb63606f2a557690d17ee4bdee4490fa6d43dc6984112577813d0811612f8e4cab5ea2b92480bb9b3e23d3df4654bfb70c3edc6b9f3ac20b9f060d6bbe3a5372296c1a70f5fd660790c9aee977daebe5e7e0f02dab9295f874f45b3cda231eef5b5350ebd241e2f1c559d6171c667927a993630ed7eb15fc8d43b0a5ffe035046881259dfd1b68e662692997b920866c0fc64ab1b1dcf40237a5e1482501695db55a862163a02f4ade82320e1f8ad5cffe58df132aab675e72ce1ca6c5d5d69d06aa06b559fdf70a1191d84e812cc4c8c54e124a6b1b24643f3256cad220a6dec7a24986bbb082368fe6ad4f039e640c448b58a1e7ed14fca11d3fe6ea8acb6ce46db701c4236c40f0b21277e58cdf65e81650e9cd44eff4bebecc6cd06114ce8cbb360c85dac1a4b599f1556a04d6191a02dbc25c3a01afa94b2d03b11c3ac46899738a5e89d8680c8503cac374d2800e3d4480a658038df58216af55981472ea3e3ab86642b7628a1aebc5eaf3d2682d2fd88b0bec144a5a090a8857f8c0185eff7d336f3a0f37bd558bb42546ae8b29e0ff5f71250fdab02cde15af6abb30c3542ac5ed1fc1473391be380ad1d325505fa2f29542e786f6b76306bc0f5a96d27eb95fe15b688134ca9df01bad07a85f487767692ed9c3e9d2af4e8c4e22411eab1d276b831110f6cb3e1eabe966cbc5090310c8aa5a44180325007bafdd8cb23920c201f5203b291b91f2ab9c064a188176bb1b21da1d0fcfdacced2867058ed87cf73b813c921e8a85113c443f7ace05f51f8727ff6195ab73201a3ba06a224240ac5603761ebdfe2350c07c66a9ba0f9b5fe589cda185b9c510feb06abdeeeaa93889691dbe194c50c49fc5539af8c1f8ebe7a8dd9db93983e1c3e5ce5797325a12dbfb3dd4ca12e1a9922b892c3540f76ee5f33531bb1d16e12b4f72bcf19275086fe4a2267b8ba29436ce7d72ee3982b7217e8fc1fac731ec819746bb4d30520c062bef62ca2b507f2fcdc2075b5d20e5b5a875af92410cb3351ae85d43eec76ec664cbc7a72c703b108f4b7caa8bca778deca4b045d51bab0d30cced9a67b1a190e26687b156d74f8e5469a66e49d1f793adb7cc18b96715388068e6832abb8f818cc06678b3332caa432fca4cb15c499fddff2fb874c3c4e605982e9c4305f1b184131916d7e1bdebcc6c4f9212b88e7dc4b853fff7aa9656b3d5a245f0705b75c799cc7965b8fdea4460cb3ca1f830f189c609fb50b0c7556053caa089600000ad08d000987f5b4640ba38bce726dbf774483cc87c6fc0286093f108c918e11c92e5d596a4b34e674038c0d91452596878b417c29dad4e53e6ff1f98ff24e66e103f964b35c3aff7cc77dc45f4c2ca4ed2cc21eda0e33f88e59d2f3d640c5e0b71864cae8237911c3ba6140c58d2a7c01b282e5896d7cdde755d71db003db63f6d83333fa33653f5ef6d6e7497768d30493d019293b57d69d62e8a5e25e5bfbdda00f8a20c9f7587eceb09a8c3955b29f5d50c31ba52ea5bcc162129ec276948537378955452d885a997424ddf00235824f7a9e0b61b182e4e6955c391c404607b0fb98be95880d99ffde7ec2daa5db4d0e196392cf5222213346dbca24322ade8a42fe244e8c0c42865be416bc1a6b2868cc5a76e6cac6ecdd2ffde241a7c4f6160559d51043688f328fb2a3a65d5d9a52884773449266d15e7bd3f3eb5ffd33c0d172808abbaf2b20d11c678011e29aaf149ac9556be059e74a6c2fb5fea76a2f495df7e2831ab2a2aaaeed09fc6eebba8bf80d5ed73f450133fde6da8e9c15dea2e0dc04329581135a9e69a488e02464de14f3909d112e31bdddb4c2f95f4406263aa687e0dd34bd53ef71c3442a184450d3072149c81792e451fbe3905c86a5b22a8558abb0516ebc6493c96297644ef8c0a350a93094ba9b24826587aad49f375515783404011def431d0a369b65da42da7b1e51f672e044123d267668bced3cede6431f56e2adfbe6d3cdbd31da206ea1991c18382d1c390385ffd9a34b275ab540cc97074c60221f738313d0e7d51085ae5d992c7fe147164ece91d182abbf4db3a7c7c98a9a5c672ab8fce45a198e96fd29b3d6e13e2e7b243862d64c1aacd2578f621af2d0d3e67c0f5ce94691a590555a0acad639221dfa2f739f3fd5f7cad3cf1bd0cf0a65432f35bf006825e52dd5cc83ff37aa4d1d0ff6d14aa7c18a667c442eb7941826442dafd229e87b30cf7364ccb9fd4a4b1d7fadebdf9d94e20c3323d63dc4e6db439188e7fe690a3f728869d1792c53ac593da917983188903bd558d4307d797f73370a76067b481df8c8ee4803ddcd759489410cb7db76bcb45997ef87ad04c2ec86189693cf52aabb7b13277190149fcf275a66f3c9009dfdf47f6e42434585945a598836ea181978d598285a424397d7e4c0266fbc8c022ddf84a053ecb75fcd33f82dbd1001727fbd454c05eb39bc9d31332f407aaccc099537549f378a1bfa20ba8ac3b0c81141720155ae63c3e562df28ca881eab7179aeb96106292b38d001164bd495492520c8624adadec5d8b146792320c0d17b3ea4ef20839230677a13313e1993b6329afcaef7bb66f5d429638fc9ca353d07071fe6ec55c4de118beef2d49b82d48fbd57e86aa8135d0819ae283203f9f547cba993a9416600cfbe60dfa315bcaee9ef159a779bec3719e7c18935526959007ce1c13bd88be4f08ecc07e6506548be04548435cca3fea04f10ab8e37f2c90d017c720ad75549f693f830fb183ed6e3a3f7277f51a143aa6c351f5da2d509da87c0858493b2b119b8783de4bac91effffcd7775d60df33691b15ba7f99c9ae9214bc19b770f25c2391b08c715f8b80ddd5aa1f85ecfd0bbf3139cd4b472f951b33597438e0da0117e031d6e3bb003dee611f5311caa9a9f28e0ce2f84e6963a310037f61f8b8d58b35c2bc8a0deda9557f4720a51f708c16cb8da6909def66230d282305f94779e43ce9c66dee84029eecc65b346a404f0bf96111720b47b9bc3ef7cf2240dc01e171c7bff00a96de63484c41f516bcd71cf1ed72fb6c8fd4aaa7ba243bd2599c5a69cafec6952f6ec1747c684e378777db052568f340377eacee071aac3eca5b7de6eb3ac3fe20bafcb7933dfb4ee1bc06a34a2767709b887157d0cb60f90a3cad099fa626efd1f7503b1826ef4f653dc521ec409572d53447a677c76b11e3c093780bf52385e9adb772bbe348e591ae434dc09cfbf52a7d57f6ba801feddab32c65157675633ab51bd8583787fc5fbe14ecf5c365b503b05ee9369f0ab8332395064e3b0a812b1996aa22c463b4092501ba78a0cc88c6832e0de86dfffe661c3b69e06df76611b4c8f0056ec1e6da4a2eb782f0663daa9cc23f594ef08fb3bacad5f41c940542c557afa837ef69ee5bb5240603c9fd3c1d9e6fed847ed23ba814d8ab9e81ee87f73d0a69d5491e53f745f124cabee395274b6ef568e4639c80776a27fdcb277c7bbf25551876689c51aa78dc9b23a196c4acde324738ec7f5b20023d5e5a7cdbb14b5e53b7749a7e3ec1f512d95ecb1161bb268f6269b62202ec377936bc3d6e1ba6465d9472ede33a0cb83d5fe856bc93f26cb93dc2b1b22da61459677855560bc1ec4da5ffe4057de31b78d77c9515b1e64c49a4e85691f48f2e8f6375939cf7e768379ea7cfe98c4aaae4df072def8b7ad20773a1e1f68bf6d59fa7e557b9b386ca8c7563b71b36079d5dc3f8011471a2b39fbe15b31ffb9f3d4cd418da25474b364c7d69d89f639b66d939b091af9ee185b61885e6fc565dc03921bf051fb9449324be3efc33ac709c2c921aa11c4ec4676c8f7dd74f3269b7bbfcaba8132495c5b3cb7881c80f636e48450788cca61e6ac6ffd156c071271cba2af7746071d8028ebd0ffb3d4a875c2978c8eff4fb0a89e0de9c2708b73ef7c89528f47ddeb362f7973711523309d9dbe9e2340c2ce2d89a1122ea6214a4ab23cdc6847f061c67a4327d350d4d71e2a3232339dedc4c29705514a5213c77a4c919c1a5fc5855e896f36585bc65ad0e5ce57b6557e3170fc5a82e08f38d231c32883aacfd82d9057632fe667f36a866c34036c6dc8c658ac2107cc696e869a18f9a7de8acf8513f4fd6799294b2b7fd52f8d31222dc867d96e444771f9b0ec92d5c49dd5758dde55db735932abb59c635b31eb835b914f833e2448212354cf25fdb6dfa5de998b6ecbaf7ddf97966f121d90fcf0170ed8b94d93eca018298bb5a6002e9e09cf0fb3e9ba8186534f11ca142d51792c427d6a4401f7b691180d9e9e48b4c88facc1946ff8c9d335d2ce439af1f469a2c25dd336e55a000fc0b8274cd8e073f980afa4710f788db10ba3e921a73c836b3879f5af38d9bb8ef50ad4e01f95d289ed455b346a4f2c4b54813a3f817e9b2fe13ea087f6acbc6f3d0cac062ee6417f6c46beaab9a9fcdefe6f7d82915ab0090e6cf0bfa14756da5293fa1d3c6d5601c80d5ffe6f7bb9f9cf72cd9e5193a89da73a5c87bd1d536fa2571cfe23281338a02a6bb54368d3b27f45c81c1c764816a3dfa6455583482dd2d34f38e0e9eb51e943c928afe7d56b3ae6695db2d31a499159554b7598d97437f8ae0e165b75906a4f7c8174799c1421f0ded7b8885074128f7e54ad45bbd45badbcac8c8ae4cd3f18c76114ea4918c8c5574c3596d8c85cbd109195488bce7e2630b2aa0dc04f5715cab357a733e3ba8b261d17ca3239b936e64d4350cc151204e8cb00b16425f68f95d4c7243306f0f2b11eacf7bed3067143abd62999e23e462feac0b83fc3331aea7733500f585ed306f629c08a4534649806effce0d15d0fbe9e3fb1e0057b55212e3016f0196796128d27ebdf00cb389fde33983e757c36205078cf444a0c09f96a93f60d106371d03a204f15e962463202cacdbc24dfa96b3b88e1fdd27b883a49f8a80fb42070f3fcf6496453286273cbe3df19dd7ca170b033cf16442f6a780c3ed1c7225e4fd7876dc9c4a25e7d1e022efd5bf57ea1cd8f5eaad799e38d5c8f09c4442b5227c200ace311c3db9321c160cdc83ec34c91d5934fcba0287340623f5b64f124e6c0edc1fff84d87ead364b30d92b25f0754e68096a89fe0df095b8cda5dea719aa8451a8e7532e09d6618633dc9281769f36778120196c5d685bcdee3f395c98d06920c51db4d78806812325a6cb4e77f59aaf062d72ce0ddbbe8e97b403b322f09c44f35b183744977f1e4ac9d287de2f90703147f381295f3c6a31e4d1ca3cdabb47fbade870f1378f3c4a558fbbb92ee30ef0e68758e9c66a3c9e3e8078a22af479debedbc1529f1f21ec9353239b0de06969ab7fb5dcbd85359b36eed47ac28d08de7633e68275f2fc3ab0f46c0fa188bfeebd0bfd9b590d9168a6d1aaed8b2a496f9716d7f689fe688ff9af2d0248c63d1462f5832846a8e08ce641689ff87c8e541811ce2c3c9aec6af43b71bf686a6dead332bec18ff27f9b206a5142d122e09ee5ac4af9c1351dc0de166083e6af09623c8195f871981f8aeb2537fbcb95e7801ef031840969fa80d13843196b641907afab536daf426dafe191b70c2fc4209aefb09e393126112925a50e5f41fc705b6f016f029fc1cb43a400a7e47195d793c176ee9140cf782c93e64a60f917854fad8656203072762fa49a4b752d407e684de6c9725d5d3659a115fac8d486f7f0db751341e4c2f048acb961bc4273257f7497170ac662fab1f25bd610a7aeead6731b25f63840a7bae89b21effe09f31346b5388021dab4c35842be3e71c5da6d3bfc3b543f8f1f079de9c2a657aeec33415bb0a32b4bdbe1480c086f1d2da5a9fdd91595e71884e3034841ba0b97cbc0331a3b4841dd28101a5584fce10ad5a5c215642774a24c33b483ec1bcdcdaaf05c110566208fd9305e8f77943f27c5d305ccdbdbd17664331289b6115609896d1d4ae577f380efcbd1f77f4466441bdb522c6e862a1d805e51a64350ca71b4c99ef26305b038c44371af6e1e18ebcf76b617638802a74048fe771e79511af1222a3bbee0e8fd8f8d9e18217e3a8a62fb8de77f44d3e647fff2c821a9448160b4d61e1b46bac5929670327a2619ffbaa75cca5b7a97d5c79e3baf7e1ffcacdbf2fc64f376966fdec04e7133e0f3b645116cb77f2ec261e3a191f7e46e4058e9cbcdc4b40e4a0dedb5a8ef7e05aad5e345300e16713528dcc14d99cc52881ca70fb1fba2ead601e92be499b2e63af9d056d232caf311bda7e54e5a2ce2bebacf0d13add71e6963f337036ce02b99c1099fca0c7b63b35cf65e592f7462d0d7b355cc88410b38974e3e69745ebf1332a6b533877391b9f4cd6f7d4c90689f26d3ad596d5243534564a2d5e8dab0ae746196cb4ea4f167552ee83824b5bc1ccbf5f0f2fc35bdc376f174e6b5bba99e586e56aa24bdd8518c50afe352284595e1de97ca2c8760439dd7ad06998c1d14a0b35ae27ee20dc27414f1bbf7b3880f6b67fc8e16ccbe3c00ca844463920541949136f59f328fb00eb23a658401d8a47e4affd1da5c3c9fe3c5be09d946ad3ee0fadf1b75557dbc722b2621431523ca2ad6741f6355dad020a4f2bb437e48599f5d645af8ae5812b6b6a032f5de6e65f947c1a74caa90b4bb5c6bbc15e0968f91283973f9e5f47639e7f2d3e3d5e4f85a3264a18964e16c0450503ae1c084fd761500f2f70246e1ec2688d6aef336be82882347afd063276e1d52986ee44cb9b96f9426784e708606860fb278451ea62760fd93bef1cc5d1f403fd42efd3da0f04e13560aa30318190e6af1d079a91dbb1315b544df555e6d3e0e9af20006c91f28ee9ba99db8dd3683d8830f46165300ab21af30484f92a84c10a8546caaf65d72a7e6d8497299e26ec5ae114f0a34b9e3c5c7d39d311de45804306a1623c130404e3228967996e67405c71560290ed02e0816835815cb245f96db96cb1ffedb80d17b0e22573f833c5927e05490bf59a92d3f2a93f519f988e96056dd0013f015cf9c0abfa13fdc9d15b0a00e90031e5aad7fc2452d0ee44a448cdef8df7b162aaa91e10e8b6f5c7f9ff1bdbfb9f047a643b858a1421e2a424eb55a8eda4f234d77831cf40db79329a5771ad0b6668b2614b89cd734088e0fb2c0e78a40fa4696369a0052cfb9b10517fef2c9bf911d924fc4b1a717f9f959a8105bc9f811ba8f63f304e2692b609839cc5109ed4cc5596824522a2719c0576ad26fe7b5b89e3d823446c7f736384d6b17336fdbe4d7a837c3d40b12b304b896287f90bb779fd79cfa1dcd9709743b68327dc16190b771ba951b9dbd1e729cfec5eb9d5d9d699eb505bdbad501c64d18c215f38f6e3857231eb757276bf03caee753a9577d704635a00a8c614e3e99b0214512807a087ff80e42b5b48c261ff2d215fbac482eebb227913c490e8c1cbe9ad639e54922821ae611991111246776f1936e458b4caf3d52cad9b50a63adc3ac49dc9c9e81f95721d1ea005f02e3f64c28c6ce1c9d7ac95553711cf497a8d16cb89c78e724401b42c372ae0a04be8a5b285dca36429ab09a46443fc2b67620a91912e33e7006d9c7a1f665346e507c38e7472d0e8975c809443201443cc20656e8786a8f828c5427f1d9cc60767b65b8990a2a4a4204d9f1726edc48840559b5a71cd0cba4f58e3f2d4aa6424c2114e1a27915dc915aea37046bfa58e7dcdbb9906f14425875ca87f49827ac823baf2bed89bfa9f78d8326be404fdba5e1ef4f3f45967c9df6702b41da925c0135669d511cdcfa3fbc3ba4a18fbd6e7b71e25a9ee5df6eb16f790b77fba52611c0ef5e4616be86c758e621523376c5e8f678792b6c9eaa6a0ec9a8423e10b470d0f69e58b6c399400fa8a1c9620d8680cda5f24dc5e8ecda20917a8206117b8c30aa5572af9a3fb9fefdee445711ff49819c4419d5126a2847644ca870ee6d224b521418af2c72302f7f3cf9ebb86fc490b6f1470cb6da66e41d3810ad4d1d89e478d5cf068a679e9be7a299ce138be9f5ba55a0b67e01075d89c331e2eac3218007811d42414c6d298ff79549a3de413fa29dd5fb6d4b02e90ec0099af9c08ac9f1005bc1ffc28aefb3a41c8f3bf2fb99942ffd9be664b29225806e67d4f87f5eaf0555008724ae200f27962caa4516530cc9a6e7732bb0328286d94d0732cf42afad4e6c194ab5ce66689645471f07a7a5f9a6a4dde5cf5a5501133788ab4c4ac41cd45e24041258f597c499781146f768503b9a17592317af9bd2055048483410d2d9a3593c2c60298b306f18e7492e8fb6257489367e5f2964237dcb0a5aebedf21a6383b55e0e71e62f28f865c7cd509cdfc0a5ca0843792e2fd997cb8467d9579fd9e9d81600eca7e02f7af28b20be4e38b2449bdbada81e15da77f66bfdb905abdcec6983ce8940b097f238fcb972196c4c7c2bd9b4ff22daa3a5c3f89b8f6248d632df6f20c6bd48cd39031614c4087ce968aab9f6ebe6c2915ed0fa0fafa8edeaa44c7c9b48807e073553188433954a12cf6388bf4f7e637144411120a3d4e5327df42873d6b492032e3bf7a5525260494f9fba600601c85a4f888e55534e0e610617a53ab5126deb876e552a3f144dacf01108e966ffce646c6b41bccac43fbd0c22e8f224d0344011ef8690f249cb6529f286c1ff007bb107b1bd16453b5af866353ae6ee1f0b6dc0e7d04c0af633c85005fbae723ddd32b369da49752c1f883ab28907c3501166e4d6e6fa2d95ea7453c44699e7ef07f56f6dc9fe2fe3bc9d07e1862dfd303efaca21e99e32c63f2626c02eed8ed734c6178ddd44593f33ba57fbed54cfbc839e4e2357d787f1977229896d78db1aec5b365ebc5c6fd2c16f320c6551e7f4e6d35847f7096062b8ebc6e6d6899c4479cc5d22e76eebb3d2bdc8888f0d337780c11858576397b4cabded1ec2f3dd54445a50d7eb24ac7d421354394e28c03361ac2a23150a04ed9ac2830b4c69ccdbf6074bc4bbbeb91c4db0bc488069156393fe3dfeedfceeef09aafaf9d9f3fec94f1e84bcaf9e61260491bbaeff2cb5b9ccde35a05d50b1b48de7b28ca56926c8bb6cbad9ed3d5e2bcc15831fe3949a51c3986742a4d6248200b09ef410764bfbac37a67bc0155686c1168856712bb6ccb0c63467f40211617b9c96ef4f66b532ed166f0440886147e512824acabfa6355e1666977195bd2bf84a1942058beed09929760848e8eafdc4024208e937e154459500c62cf690e3944680970f65992b0cd246f655f16b5584a1f9395dde6d4dab2325a8f37654330ac6c3c4f659cfcafe2bcc0f6cbcbc0f19991d0ce30743f7111f6304c06ad86051fed3d4caccca772d12086db02de0a31a424682c7b8e4c6d3ad6272e26664e01249f69867d9167faeaa66ac1b085f4a64a37f836cd3fee3e24e3e569a1f745ce102ce178b9779025c6b8d235e778a4dd585bd0f4cbb341ff5f7fc82d568932a9c3b0d6a9626db0402c536a74d874b3526dd863333abe4f9518e3d93a148ee7f8e83ba7082b48d7e64389030970bce84982298c9c55565d821c9a17368f374b402b52c50474416f725fffc45e3193068b327b9b412715ccb72904096cc6fc6a9cd86f73a7f173a5807a6fa8960ec3a65c86333f8672b88a187dd4a5002018a040fd7c4e3a205e6249a027493f1b19274e8d653295a0a2158879938cc57a0bc4a2ae5ca8446367d2cd2a8902c817e6a5a2495dc0c8e15a07a9141b8930e71675494763b2e9f3557e1f09895ec9d3800e6f7a1a17b1c10839ad991c6b2c8dc26a6e9fd877f1bbd6f3410132d47c4ebf35bda1ce69a295fc72d93c9a2cbe815adae6e27aa806daf8fd683021d6fd4d8006463c60e3f48028ad9eec6c68b8f46ceb0381f832f3d2b06d95e208312edf25be9480e9686045a1df6ac7bf20f72b4b3c5dd778afe5625672d2382dba57d11439a5233a2c1eb92163939f92d5dd369076b7a4119a0979278295fbe84de5c9344f4f91550eba8788e1fa0038eb112295f37805505dfc26c2d20265291ecdfd734011bff0d1bdd556d6543ed960abb8f9705eb7b72ce934ac6118a5ef5086f742310b40f61da07a339f2826f0d6558d1fd561a639af559acc8c0160d2eea31117b73d890550a1c7681cf621cee51b1bae030551c079e952ef3a156d7a216f77ea745d65f01e803d63e11dac16c4d64a12c27266a859bae5459440ab25c21a8eb8c7cd6f3e0d302637f56e3b3f3d7c8ffaab271d416fe77ce24ae0d525386aa20383940ea9abfbc219237cfd15f8c418d837152550188d9a3e734ae360a7e59751bd58cba1abbca2e4da1afb390de55064cb70c48eaa5b4fb6ec8a9cce6ef51fa9acbe1bc7c113bf96a1ad8c9ced50f719e0a0a228fe5a56085a14ccfff67eb01993b2a17258ca32d1111c560899c8afb737fa003dc8a4a0dba9679792d0dc0a32bb74ac2d12c8b65b6c9a5c972423cabf203fa564c51fab352ff455bf224ca58a84784b371c46969eb8a22a3a91945cfaca128623b4856f034ab27dce6929b23980689401512a762975c16033f26787f3abd25d791f3ee1949f3a0c9e8596d15c9de1d5b42ab41e2dd817849be367de78f387a455f9d7ad1ee35b291f1864b39665b750a885e57100a0b555dd506f811d10e3151c052c68382e719ed83358108a49d3b9ee3251dc9e732c80398bdc62b84373d42712725c5ee9fa23625a2c6b62fd0037c85a39d923d3fef242b0e097e6478c6f4206d30a71443c75eacadcfa4be539c12baf27965298ccd56060e55385028c8d2fb841ad343fdf8fb32023f9f79141d7446e695d11075f974fc5825d384a72c0219aa43cd041e18392413651194da533f0341932eb6df63e9ee8bf60e6bafc1641349a2051454abe709c2954ecb570c942a1a0f38c567bd0315a977f3b9ab8502d6f6214268c70c7ccb785a9ad6d29a301c5db7149467546c026fae626ccbc3774aeb6d2a5eaca033610f42b1cd4e35f27684816950ee95e561ecbfb59d7fd861bbb9ac9849f9324d54618c3ffd382f2631beb298dad803ad26a8ce8cdf96df01b7e706e61bcbd9be29ff094a0bf74f7981ad44a6dbe9e976976b9f13b4d5b4ae08ad8c93c1eff942bd1571a4a3d7f6d5cff6d57197a3f45222207fca3fbbda7cb79297af8f5f0ab912082bbcf436cde7a4300f19547c943594c041dc9836823b11288badde088d58ad28f9a0527aa0c70930fba8ddc2eec3ca7d4e3b30d4c725b47eaf319916cb9a0e88e1b44b4300bf2f085a0ceed046051dfff442dcf42e504fe8efc3a06e205ef2f868aea5e3d3d65a5ccd6cb6f6d77ee118fb94580125fdeabb471b5555e1fab9f63f9d77cb81b6404429a1967fa5bc093f22ecfdf98e78dbf98866303f5ea9807e810f19255c63ffeb488f348ea0145076adae14754f1aadb093bffe92959900eea18a1b1c0567782d011b6eb5fbb51c3e8df5852ba1a41e1162ba9b3e7c401818aed55e16aa444b2a084660778338d89b001528d0e3153caa41066e29c306cef33f0fc9ec7a70fe39b5428465e39f38c1c3bb23fab7e5554f59e9d68c1e9e79c7f448d680df4f870d974c6e4c3e554c8563ea03deefab07a68979bd146219cbd59d28059cbce516160132ee359cfd2a4f14906cd3bc63fc102d610fab4954805ff9753d7e54420d5b791f3c4303566f09fb0149ac978d34e829b9058f581bd85adcf064ecc3ca14b2353cbe11f405b2485babcbb232fb2d70c8a14d60ea260dd224e9ffcf9edc2b434dc0f4696bed1fbd73c36c89deb1458c0a076365445abb54148a8d11356a6539eca3e2377083b5ad1617ef921d8a59eb001f810c713ac91785fac57353c23716e5f7ad0e30ae18121a0d161103006a71b75be58b16285ecc36dbdb13e1343de1eb1095b15d65f9a65ce3430201e4cc4de6b4f75b7b2eaa7650bf1a73594c746221ed5a6a76924875794ed0475a67f9b76ba18ebe437a6caab31e0c30b3a9f53d943ed1ef8e5f40db23808565ac91dee1365e993751a168f60af287d5be0739d199102f679bb674d03f0d3e3566794348f9c75675d75acc1bd5ce975eea61d6fb086ebf621eb6783e75d623d8a13cb08457bd7d3d0f56d6ffd1d4ac71ee42d588bdb21e54bedb62366ef0c5586ed9a60252808a64f6574e4e1ccf25d6560648f7005436dbb5e663e6b12eb2417d04d987fc56a82f4556dface128f66a74d3925711a94a59a255f3697136063aa9e254d55f840ed0a9f1ab74e1653ca146d57067f9a781e985adcc7de988e47493fd7073ee433e32d56d23a1ba071bba99e1dced073fa8286e4ee5eb544da5d56db0bb7252fcf017177fdfe0705a551a5a51d69fd7f49c91f5ff8bdbb0a716c8155def96fff0340567d996464b3a93687459d87f9ca37f3cd9731f42c24c267a37f603a4aeea53692bfb892b1bbc16266fb19e06030b95e9ba525a4835f0077747f17983697ecf8e08d00a5c50d30e9b27fbf41b53e69a6ac63349a11bca1084efd7ba219c5f47c6da2292ab66cc1d4b4ecf1767ddb0712e6df12b383dfe1f66a2c77e3543c3d948db583f2234d3f145adec7f76dd6f4969e2145128cf840bc5778ef39b8c82c74d4b26d2ec2eafc7625208a6c0575b5688286aba82c0f00b884a73404548589cebd4ddfdc32e34eb950863a004703761907d6f10a5c98a8822c8f911a764b007a737ae189928d0da1735f09837ca1844a13161c98fe5f84520009c2995bd5a0aa6f9d115d4d17172a4284de5c2adad2ecbb1d04f06d8122704cb7787d61685fbafd1a22781728cdc2336bd34f9f06751139ddd4b90834d6ba8648d60abec99381db4d57a52270939825ceb80aca2b284a74548cba84a6373d7957f70a0dd87a3f7dd20c56eb0c53f449608d8b3ec4c999d23b7f3bfd00a0d17ab966d53863b312b6822ef13622fba6f6ca0c5295dfdaf41b75d5c0f7eab0d66708a32a8ac3c301c773bd711d5efa8524a81c628e1a0152a2740a10d99fcaf34c7aa5dee83f929316c751553860c7f7b1795f16a236884a0af56d8684b196edf5a45353978aebf7122493da50255a90baaca5c2e982dd4a5772a2bf1f167e8ad29f0ac3f27affbf0040bf8f27aab1bd959077268adb13531d1b218c34033287e3121a5b02b2e326b8ee28312ff14d844ec98daf09c06047fa20b437ab65249ba1254926df060dea92d5b4d75478b24ba62d588c3ce49dd0b893fd1f577b0d8d10ed4ec73e6fdbb10c005c772ff5eabaf430798eb0aac9ccbe3cee9a0f30665770ec5703ab970c0ad843aead30df03a576f148ddc22a864fa9424f2d8f65f05c3e78841c308644ea69984be0b0e88c05dec34e78c9bf9b3238b73b11933a2dad784f69fc8b718dce3d4469abf0081c0d359dcb89faa17036eb93a30cf5bae458558b902e286ed15f540851a06922cc3d660c3189fbb495b2f213c997b91fa1d6df19f5aa68b161acae40e25308a2b897fb8ca62d428b3bd655ccc7534ceb32772e54887019f371f0c7460dbd29ad81d5e6dc8630b198b978705d06d164bb2bea21e5aeef04e499ee4f4157e37595cdb864a7dfdf1ab2087a2a1bc7a54d9f63d2e021c144fdc755d8a7f25addf152c6664d47f480934248b38a939ed4871e756a81298b42e20086c6e305431fe3b597d4639bbb82bd123977876df18204e14039939dcf4c6ebff0c152d056195edbf34376e75f807919c3a236b47dff6e1767d67a89c002d41dba5bcf7b66269a308ecf6185be13a4906e3dbf44d2184157d2bed11a88b9769ff1d55a145dca64faa1074bb9eb77cb73eaa9aebfd2c39b9b2b393c21c3c6477004dcc401ba404ee76a9e9d54adfb06a28966931036121e81624a67e8019b92c549cb610c0e5b69acaa24a5f3ff435a17c05dff58097934a02aba20e347ac4171778b112a7eafb80d25d6d0898e5e4e15aac653ce2a679a1e7927bbca8e30e60f2af718f74417a3fc2576f4a03ea4aa9d8595f8e3cf2b082e0c2d304a43a80c3963d48fec2e7d09a8f83b1828a66b7755327ce1edfd2c4733e195b208c638a8c0055d651c1dfcd7726dcfa9ee8f8bb4c1b97a8241116e26bebaa1a2ebebd69e6759573d79884d2cc75b5520f178ad6dd2c3ff95bd3a660950a15916b47c41c0508bbea776f6876ba51b8c656c157016dc1e99568bfc260b2c5ff467b0b4cbb12e2afb741c872de19f09f89545cc5958723d340edeaed2ef10034b7c16c5f79866acab287e6c8ac1ac0620eab3369bbc12b6ee1c70fd625eca615db3bf53e18e52e8fccce56b63a9d9f9d9da42a4a1db30c276d97e67bf1cfc90e6b46bf87726669a92a8e75cf4f47449a7d2329879fc00c0fbec10c12348676b018b63be898f36e2ff9802ae3e88b26521fef647014e51b2ae0c65b2d6c32e11ddbc52a89d204fc5cf1367e3a7e22a3c760d0f1eeb23ddbed232813530584d66815b70299e514aab1d10fd0fe897d4c5f4f8c33a90e1c8ae5db9fc1bf03b8590a3329eaa5371dedfbd5ac75d48884179a91a5fee927c607028f84987e4018e7a8a8ff809af9f6c12f616518a3172fad40a2f4b4151c1c598af48f670e0242b5403506d15e4d627d9c56de8680ab7ccd7b50e2f6d27c3f6d96391912202ac2211662b5513540d192abfad075d666dbf893a337a61822278908aba30bd49a1c0e7a967b63c48ba1ce36e5d74e1831a2e71f8580b40c212fa39aeaec8b47f54b1d3896ccc3c7c47754355024a031bad381e0bd091e0ec4982f79ec8f1506ba48112b9e6abb57839b56f6e9e5ce57b9351a0464e0a4c3044001003d1fd2b59c801a9276d5fbabd1893ef4a261d3cfd06340c445440433585b46f77edacb5f1531cdf56daa454bd65b02eb87170d1bae6f5fb7d778db641c17e21402338b35f6f70bdbdcb8701a6217cfdf868b702a4bb390b7d23284e2b18fad8884fdabac67d23953df97130fdb520108e709d41dabfbe5d14a433e319cc496b35b77ab809aceb78a656eec60945dc7f8e5520945f03ae15ae8a6b061a1e9c5442909e6ce1214abe4b31489b0ead3947903cab1415080ddea7c0b4787f3ab430b52651e942cf4882a8bb63fe54c85fc720550c6e096faf63bfd816b1175f3f431d7f44171610d52414b9a92d07b41343cd5383651791dad78e71a05a2ca554f2a39806323ca0fdc5863ba4deda271a65bbf4244dd41c8f6e19bb81d355194246adb0c949e699efce6da5f6b98b285bb7d1085692ce1316e2677138ae1d0bb570082ae8c03b788b699061afdc259f8a2970cf2e2f1cc1ffef34de003271be5e3fb0f9fecf5058d00604038e56209f1f91b89e2d3739833cd6a9b3dfd9e3e871ab1bbb33006df228d830bfbcac47651326671cbe50368358de2ad280d2c1a4b84e1ecefdb5a105db56e673a856785938053b89c03337b32cce334bd77ff2c38de65820949fb02f77ba7fab1643299df8adeee06a2e41ae88754433e3f8aaacb7d53984f348426b2c8518515551c6f0f282c0d093a259537223dd144287f029fea18db74b8b6cae4ff9d00664d6daf93b4d8bc6b584f435992d8b16372aebd957749f7b831689633d9e2250431a0c3401ba6e9abee0b23d856c0526a8150824b79ce9606eef5bb6f7bd44022adae316ead807950e52710fd9be58ba252dece0d10c562841ec89ef89e8a0ac3dc76a3adb9d39d4df8ba619ba8424ff728d361ebada0edccb395f58467057eb8e059384ae608550add2115e1123e77a2c0513a8c1bfde0103d6e56069edd3d586ac72a90a5df3041780b952e1835a821b969c42ed9a21896b174c028abb71fba64b4e88c3358bfb2e8339745e93e00a7df70fbd2fed44560f229b97847730a07960732f146b5c4011dc6163d1c3ffad0213ce48c05ed88dba74bda63a85782bd4e1e29092e816fd262125a88a88efef9c892ebe22382e01645dd553978deffa19b6cb31f477333f7bfbd67359db341b2e2b22b9e3e88b5ecd7fe378c5fa5c0b023cd55e9a4aac2a16a9bafc07ba4e431d7fa5b79d80ea069a53bd9b697a9e297ec339af6373459b697ce14c59a67240614103a4973747ab55a3533cff81ac9dc611b1e06f6c65767859599ee52459b603dfe67430e68313261149352ec5ae8139de2a565a907d2f883aab9efb3c1a784cfc3ecd568cd7b02d8fd8280ac32037b15659c3ee9f0241daada9335efd19dbbdedefc57eccceddf6e50b34b33906ac319a0bcf823ef59b21538f9b4ff704cbca3f564be36adced992f4262bcaa2f62503f58b6ee74fa4f26626d02dcbfdcb0b72f99b863d2796eb25c069b11dd8e6a87cd973a962f04ee4f24eae6be6e147f6730cd9af991d73ba2b03504d45e9bc6b7412f6412bd89679d764fe88f23bd74ee69e6c595d91d4b13427612c9fcc6e17b8b2ae4d353506ce74ae9d71c7cc269a4347b252f023d4c237ffdc1854902158f11a71e858ac3882825b427f82137b618a156f3f0034e8526a5a6b1741e51667b2a0e280adcdd86eca15b104c3ab106baf0da3dc1fd82897949591a33146ff6f2a41f3fbc2ba1d3f6ec8808f4f3b6af3c1b34e8cbb1a7ad6bd2bfdc850b84ceb63fcc8de53b1feba5488167b7ff3a52ca4a5a8e5904325ce6fb4d1f55a7e8ffb030e03a9133120d9889144d411229e3cd5ce4f6fc82e2aa17559736b2cefa47f49f7d167b2105bc9b9adb281b660268bf65aafc0cd9f4d310c2f5d1e82b02aaa729676b49730cc904f8c67a80378afaaa2a381a7459e074fbfb7fa601ae24b1805e1abf427e0eee1435fda65b4782e54ea70f011a7ba8b4420c5012ea0a6b4c5344ba8a60fa9b38457709f71c5b77ec9489bbe68e57bdb3cfd31972a936d5766ad2c936f78358c7e3f6592266bb9d10dbb5b1712b2c6ce742841123aaed7e1dd176b6e32a1af39ba7810ef8b5b6bd64f8bf05708bdcdf42e627226b212ed4f56e9032c90fa3ae8392fa1604591c30c22a74ebc1246db14fee1974c10ebcd535e1f55f36a4657a58b7d5a149e5c2ea7022500922bf89089882874331209e6d60436cca7cc98d9a1c419dda6c70029d1431089bb5bcfe4b04f0f606d106a0d397b034325000abe0b26570f8e58038dc703902648e7640620e5abee5876bd10128227c2665f4327435c57e9c17744660d65dd871886be281ec398a7e9bc104393b74ea6f58d2fc2a2d158d8062b410504b93d9ae2da3219215fdd9fdbfa94f95eac5154b29fac5712bdd787590a3019ec02f88448971591bc11e8084a4758eb21c1e0b73d0dfabc48878abb1308f8574e6411bce14bc8dc7442a26de35a1e160e43accfbbdd2b5b74987a96fbf5d8db27101fd5a29fbe372712ec78711c4296951b5ccfc47f4488f6c7687dcb2e40e78e4ee4c419e7626cc514c3206e3928f61e52f750b54dcb36821ce6e56c70082c22b4a5cc07fa74385ec358b8ca505fe911e1aa385c54aa5f2ae821cfb249b6519a45f3273073ccc13eca3c9f2039da4e8caaf26ac7acbb1b5059b638638bfb94a57cb099340f678014e0339fc500e75fe143f438de261d1ec431ea98059c68337853ad1090281a1cc7bdef9edd152a82b7d6c34bf7528e0edab5f67bd97674bb0c963ab542862c4586fcf7e75553438ac3020a3ea9b4f1f22cf6eab294a2ba06171e66e36396404efc41a0fdf50f664d470043325c80eb18eefa795ea385b92d0cf81253adb2ca8cedc6d479cfda72f55fc00f71bd6e91eedd91eddcb7c093667a89d8f05cb38994d6e9c971a3101e090acebf90df223d453bae44cfe6d312691fc6c9e7b3821e5882ea4c1e9e86883ffb8bab5969558a16eadf73e263c47fee7d00cf8aeb5e13fa56caf5e32c5e967a352e19b4863fa3a47100127ba09c4e06fbbe079a421d17c9fc549597ceb659f8d89239017ebe6b89dd0e50ab1a45df1e34c17afe5382317ad517c72c50b518172ae1a6d93a15516d13f92038136a2da12a7b05de3b513ae2ced10"]}} \ No newline at end of file diff --git a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/tekuv1/beacon/GetAllBlocksAtSlotTest.java b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/tekuv1/beacon/GetAllBlocksAtSlotTest.java index 205696a02f2..657302bc2d7 100644 --- a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/tekuv1/beacon/GetAllBlocksAtSlotTest.java +++ b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/tekuv1/beacon/GetAllBlocksAtSlotTest.java @@ -33,7 +33,6 @@ import java.io.IOException; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tech.pegasys.teku.api.migrated.AllBlocksAtSlotData; import tech.pegasys.teku.beaconrestapi.AbstractMigratedBeaconHandlerTest; @@ -89,7 +88,6 @@ void metadata_shouldHandle503() throws JsonProcessingException { } @Test - @Disabled("TODO: Fix fixtures, random was changed") void metadata_shouldHandle200() throws IOException { final String data = getResponseStringFromMetadata(handler, SC_OK, responseData); final String expected = diff --git a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeaderTest.java b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeaderTest.java index ba6d9b93350..86276eddf10 100644 --- a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeaderTest.java +++ b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeaderTest.java @@ -30,7 +30,6 @@ import java.util.Optional; import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tech.pegasys.teku.beaconrestapi.AbstractMigratedBeaconHandlerWithChainDataProviderTest; import tech.pegasys.teku.bls.BLSSignature; @@ -80,7 +79,6 @@ void metadata_shouldHandle500() throws JsonProcessingException { } @Test - @Disabled("TODO: Fix fixtures, random was changed") void metadata_shouldHandle200() throws IOException { final String data = getResponseStringFromMetadata(handler, SC_OK, responseData); final String expected = diff --git a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeadersTest.java b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeadersTest.java index 0d36b059740..dd1673decde 100644 --- a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeadersTest.java +++ b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/beacon/GetBlockHeadersTest.java @@ -31,7 +31,6 @@ import java.util.Optional; import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tech.pegasys.teku.api.migrated.BlockHeadersResponse; import tech.pegasys.teku.beaconrestapi.AbstractMigratedBeaconHandlerWithChainDataProviderTest; @@ -70,7 +69,6 @@ void metadata_shouldHandle500() throws JsonProcessingException { } @Test - @Disabled("TODO: Fix fixtures, random was changed") void metadata_shouldHandle200() throws IOException { final List headers = List.of(generateBlockHeaderData(), generateBlockHeaderData()); diff --git a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/builder/GetExpectedWithdrawalsTest.java b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/builder/GetExpectedWithdrawalsTest.java index 8b009b38710..b4a63c8b753 100644 --- a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/builder/GetExpectedWithdrawalsTest.java +++ b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/builder/GetExpectedWithdrawalsTest.java @@ -30,7 +30,6 @@ import com.google.common.io.Resources; import java.io.IOException; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tech.pegasys.teku.beaconrestapi.AbstractMigratedBeaconHandlerWithChainDataProviderTest; import tech.pegasys.teku.infrastructure.ssz.SszList; @@ -71,7 +70,6 @@ void metadata_shouldHandle501() throws JsonProcessingException { } @Test - @Disabled("TODO: Fix fixtures, random was changed") void metadata_shouldHandle200() throws IOException { final BeaconBlockBodyCapella beaconBlock = BeaconBlockBodyCapella.required(dataStructureUtil.randomBeaconBlock(1).getBody()); diff --git a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v2/beacon/GetBlockTest.java b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v2/beacon/GetBlockTest.java index d433e9702f3..2afa215cbf6 100644 --- a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v2/beacon/GetBlockTest.java +++ b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v2/beacon/GetBlockTest.java @@ -30,7 +30,6 @@ import java.io.IOException; import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tech.pegasys.teku.beaconrestapi.AbstractMigratedBeaconHandlerWithChainDataProviderTest; import tech.pegasys.teku.spec.SpecMilestone; @@ -76,7 +75,6 @@ void metadata_shouldHandle500() throws JsonProcessingException { } @Test - @Disabled("TODO: Fix fixtures, random was changed") void metadata_shouldHandle200() throws IOException { final SignedBeaconBlock beaconBlock = dataStructureUtil.randomSignedBeaconBlock(1); final ObjectAndMetaData responseData = withMetaData(beaconBlock); diff --git a/data/provider/src/main/java/tech/pegasys/teku/api/blobselector/BlobSidecarSelectorFactory.java b/data/provider/src/main/java/tech/pegasys/teku/api/blobselector/BlobSidecarSelectorFactory.java index a4511aae8e7..4f36633b9d6 100644 --- a/data/provider/src/main/java/tech/pegasys/teku/api/blobselector/BlobSidecarSelectorFactory.java +++ b/data/provider/src/main/java/tech/pegasys/teku/api/blobselector/BlobSidecarSelectorFactory.java @@ -23,7 +23,7 @@ import tech.pegasys.teku.infrastructure.async.SafeFuture; import tech.pegasys.teku.infrastructure.unsigned.UInt64; import tech.pegasys.teku.spec.Spec; -import tech.pegasys.teku.spec.SpecMilestone; +import tech.pegasys.teku.spec.SpecFeature; import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecar; import tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock; import tech.pegasys.teku.spec.datastructures.blocks.SlotAndBlockRoot; @@ -184,9 +184,8 @@ private SafeFuture>> getBlobSidecarsForBlock( private SafeFuture>> getBlobSidecars( final SlotAndBlockRoot slotAndBlockRoot, final List indices) { - if (spec.atSlot(slotAndBlockRoot.getSlot()) - .getMilestone() - .isGreaterThanOrEqualTo(SpecMilestone.ELECTRA)) { + if (spec.isFeatureActivatedAtEpoch( + SpecFeature.EIP7594, spec.computeEpochAtSlot(slotAndBlockRoot.getSlot()))) { return blobSidecarReconstructionProvider .reconstructBlobSidecars(slotAndBlockRoot, indices) .thenApply(Optional::of); @@ -196,7 +195,7 @@ private SafeFuture>> getBlobSidecars( private SafeFuture>> getBlobSidecars( final UInt64 slot, final List indices) { - if (spec.atSlot(slot).getMilestone().isGreaterThanOrEqualTo(SpecMilestone.ELECTRA)) { + if (spec.isFeatureActivatedAtEpoch(SpecFeature.EIP7594, spec.computeEpochAtSlot(slot))) { return blobSidecarReconstructionProvider .reconstructBlobSidecars(slot, indices) .thenApply(Optional::of); diff --git a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/Version.java b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/Version.java index 30d19f39b92..85ac4b86670 100644 --- a/data/serializer/src/main/java/tech/pegasys/teku/api/schema/Version.java +++ b/data/serializer/src/main/java/tech/pegasys/teku/api/schema/Version.java @@ -22,7 +22,7 @@ public enum Version { bellatrix, capella, deneb, - eip7594; + electra; public static Version fromMilestone(final SpecMilestone milestone) { return switch (milestone) { @@ -31,8 +31,7 @@ public static Version fromMilestone(final SpecMilestone milestone) { case BELLATRIX -> bellatrix; case CAPELLA -> capella; case DENEB -> deneb; - // FIXME: hack for devnet - case ELECTRA -> deneb; + case ELECTRA -> electra; }; } } diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochOperation.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochOperation.java index b5f226a03f9..10fbd73a09e 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochOperation.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochOperation.java @@ -26,7 +26,7 @@ public enum EpochOperation { PROCESS_HISTORICAL_ROOTS_UPDATE, SYNC_COMMITTEE_UPDATES, PROCESS_HISTORICAL_SUMMARIES_UPDATE, - PENDING_BALANCE_DEPOSITS, + PENDING_DEPOSITS, PENDING_CONSOLIDATIONS, INACTIVITY_UPDATES } diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingExecutor.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingExecutor.java index 1995f2dd11e..258d9a1f36a 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingExecutor.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingExecutor.java @@ -45,7 +45,7 @@ public void executeOperation(final EpochOperation operation, final MutableBeacon epochProcessor.processHistoricalSummariesUpdate(state); case SYNC_COMMITTEE_UPDATES -> epochProcessor.processSyncCommitteeUpdates(state); case INACTIVITY_UPDATES -> processInactivityUpdates(state); - case PENDING_BALANCE_DEPOSITS -> processPendingBalanceDeposits(state); + case PENDING_DEPOSITS -> processPendingDeposits(state); case PENDING_CONSOLIDATIONS -> processPendingConsolidations(state); default -> throw new UnsupportedOperationException( @@ -58,8 +58,8 @@ private void processInactivityUpdates(final MutableBeaconState state) { state, validatorStatusFactory.createValidatorStatuses(state)); } - private void processPendingBalanceDeposits(final MutableBeaconState state) { - epochProcessor.processPendingBalanceDeposits(state); + private void processPendingDeposits(final MutableBeaconState state) { + epochProcessor.processPendingDeposits(state); } private void processPendingConsolidations(final MutableBeaconState state) { diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingTestExecutor.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingTestExecutor.java index 6364d3c6d18..c6d0996219f 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingTestExecutor.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/epoch_processing/EpochProcessingTestExecutor.java @@ -34,8 +34,7 @@ public class EpochProcessingTestExecutor implements TestExecutor { ImmutableMap.builder() .put( "epoch_processing/slashings", - // TODO: Re-enable these tests as part of https://github.com/Consensys/teku/pull/8612 - TestExecutor.IGNORE_TESTS) + new EpochProcessingTestExecutor(EpochOperation.PROCESS_SLASHINGS)) .put( "epoch_processing/registry_updates", new EpochProcessingTestExecutor(EpochOperation.PROCESS_REGISTRY_UPDATES)) @@ -83,8 +82,8 @@ public class EpochProcessingTestExecutor implements TestExecutor { "epoch_processing/pending_consolidations", new EpochProcessingTestExecutor(EpochOperation.PENDING_CONSOLIDATIONS)) .put( - "epoch_processing/pending_balance_deposits", - new EpochProcessingTestExecutor(EpochOperation.PENDING_BALANCE_DEPOSITS)) + "epoch_processing/pending_deposits", + new EpochProcessingTestExecutor(EpochOperation.PENDING_DEPOSITS)) .build(); private final EpochOperation operation; diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/DefaultOperationProcessor.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/DefaultOperationProcessor.java index 77a387a2d15..c861fbbab61 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/DefaultOperationProcessor.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/common/operations/DefaultOperationProcessor.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Optional; +import java.util.function.Supplier; import tech.pegasys.teku.bls.BLSSignatureVerifier; import tech.pegasys.teku.spec.Spec; import tech.pegasys.teku.spec.datastructures.blocks.BeaconBlockSummary; @@ -33,6 +34,7 @@ import tech.pegasys.teku.spec.datastructures.operations.SignedBlsToExecutionChange; import tech.pegasys.teku.spec.datastructures.operations.SignedVoluntaryExit; import tech.pegasys.teku.spec.datastructures.state.beaconstate.MutableBeaconState; +import tech.pegasys.teku.spec.logic.common.helpers.BeaconStateMutators.ValidatorExitContext; import tech.pegasys.teku.spec.logic.common.statetransition.exceptions.BlockProcessingException; import tech.pegasys.teku.spec.logic.versions.bellatrix.block.OptimisticExecutionPayloadExecutor; diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/deneb/merkle_proof/SingleMerkleProofTestExecutor.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/deneb/merkle_proof/SingleMerkleProofTestExecutor.java index 7814df4d9db..98320630d74 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/deneb/merkle_proof/SingleMerkleProofTestExecutor.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/deneb/merkle_proof/SingleMerkleProofTestExecutor.java @@ -32,12 +32,13 @@ import tech.pegasys.teku.reference.TestDataUtils; import tech.pegasys.teku.reference.TestExecutor; import tech.pegasys.teku.spec.config.SpecConfigDeneb; -import tech.pegasys.teku.spec.config.SpecConfigEip7594; +import tech.pegasys.teku.spec.config.features.Eip7594; import tech.pegasys.teku.spec.datastructures.blocks.blockbody.BeaconBlockBody; import tech.pegasys.teku.spec.datastructures.type.SszKZGCommitment; import tech.pegasys.teku.spec.logic.common.helpers.Predicates; import tech.pegasys.teku.spec.logic.versions.deneb.helpers.MiscHelpersDeneb; import tech.pegasys.teku.spec.logic.versions.feature.eip7594.helpers.MiscHelpersEip7594; +import tech.pegasys.teku.spec.schemas.SchemaDefinitionsEip7594; public class SingleMerkleProofTestExecutor implements TestExecutor { private static final Pattern TEST_NAME_PATTERN = Pattern.compile("(.+)/(.+)"); @@ -186,11 +187,7 @@ private int getKzgCommitmentInclusionProofDepth(final TestDefinition testDefinit private SszBytes32Vector createKzgCommitmentsMerkleProofBranchFromData( final TestDefinition testDefinition, final List branch) { final SszBytes32VectorSchema kzgCommitmentsInclusionProofSchema = - testDefinition - .getSpec() - .getGenesisSchemaDefinitions() - .toVersionEip7594() - .orElseThrow() + SchemaDefinitionsEip7594.required(testDefinition.getSpec().getGenesisSchemaDefinitions()) .getDataColumnSidecarSchema() .getKzgCommitmentsInclusionProofSchema(); return kzgCommitmentsInclusionProofSchema.createFromElements( @@ -198,7 +195,7 @@ private SszBytes32Vector createKzgCommitmentsMerkleProofBranchFromData( } private int getKzgCommitmentsInclusionProofDepth(final TestDefinition testDefinition) { - return SpecConfigEip7594.required(testDefinition.getSpec().getGenesisSpecConfig()) + return Eip7594.required(testDefinition.getSpec().getGenesisSpecConfig()) .getKzgCommitmentsInclusionProofDepth() .intValue(); } diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/sanity/SanityBlocksTestExecutor.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/sanity/SanityBlocksTestExecutor.java index aa81f5b312c..b3879d84cae 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/sanity/SanityBlocksTestExecutor.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/sanity/SanityBlocksTestExecutor.java @@ -41,8 +41,19 @@ public class SanityBlocksTestExecutor implements TestExecutor { private static final String STATE_ROOT_MISMATCH_ERROR_MESSAGE = "Block state root does NOT match the calculated state root"; + // TODO re-enable tests as part of https://github.com/Consensys/teku/issues/8680 + private static final List IGNORED_TEST_NAMES = + List.of( + "basic_el_withdrawal_request", + "basic_btec_and_el_withdrawal_request_in_same_block", + "cl_exit_and_el_withdrawal_request_in_same_block"); + @Override public void runTest(final TestDefinition testDefinition) throws Exception { + if (IGNORED_TEST_NAMES.contains(testDefinition.getTestName())) { + return; + } + final SanityBlocksMetaData metaData = loadYaml(testDefinition, "meta.yaml", SanityBlocksMetaData.class); final BeaconState preState = loadStateFromSsz(testDefinition, "pre.ssz_snappy"); diff --git a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/ssz_static/SszTestExecutor.java b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/ssz_static/SszTestExecutor.java index 092fc855c36..affcc9c802e 100644 --- a/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/ssz_static/SszTestExecutor.java +++ b/eth-reference-tests/src/referenceTest/java/tech/pegasys/teku/reference/phase0/ssz_static/SszTestExecutor.java @@ -48,6 +48,7 @@ import tech.pegasys.teku.spec.schemas.SchemaDefinitionsBellatrix; import tech.pegasys.teku.spec.schemas.SchemaDefinitionsCapella; import tech.pegasys.teku.spec.schemas.SchemaDefinitionsDeneb; +import tech.pegasys.teku.spec.schemas.SchemaDefinitionsEip7594; import tech.pegasys.teku.spec.schemas.SchemaDefinitionsElectra; public class SszTestExecutor implements TestExecutor { @@ -207,10 +208,9 @@ public class SszTestExecutor implements TestExecutor { schemas -> SchemaDefinitionsElectra.required(schemas).getConsolidationRequestSchema())) .put( - "ssz_static/PendingBalanceDeposit", + "ssz_static/PendingDeposit", new SszTestExecutor<>( - schemas -> - SchemaDefinitionsElectra.required(schemas).getPendingBalanceDepositSchema())) + schemas -> SchemaDefinitionsElectra.required(schemas).getPendingDepositSchema())) .put( "ssz_static/PendingConsolidation", new SszTestExecutor<>( @@ -231,11 +231,11 @@ public class SszTestExecutor implements TestExecutor { "ssz_static/DataColumnSidecar", new SszTestExecutor<>( schemas -> - SchemaDefinitionsElectra.required(schemas).getDataColumnSidecarSchema())) + SchemaDefinitionsEip7594.required(schemas).getDataColumnSidecarSchema())) .put( "ssz_static/MatrixEntry", new SszTestExecutor<>( - schemas -> SchemaDefinitionsElectra.required(schemas).getMatrixEntrySchema())) + schemas -> SchemaDefinitionsEip7594.required(schemas).getMatrixEntrySchema())) // Legacy Schemas (Not yet migrated to SchemaDefinitions) .put( diff --git a/eth-tests/src/main/java/tech/pegasys/teku/ethtests/TestFork.java b/eth-tests/src/main/java/tech/pegasys/teku/ethtests/TestFork.java index 7204446920d..824216c1806 100644 --- a/eth-tests/src/main/java/tech/pegasys/teku/ethtests/TestFork.java +++ b/eth-tests/src/main/java/tech/pegasys/teku/ethtests/TestFork.java @@ -19,5 +19,6 @@ public class TestFork { public static final String BELLATRIX = "bellatrix"; public static final String CAPELLA = "capella"; public static final String DENEB = "deneb"; + public static final String ELECTRA = "electra"; public static final String EIP7594 = "eip7594"; } diff --git a/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/ReferenceTestFinder.java b/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/ReferenceTestFinder.java index 5ed4a4db066..cd802da99f7 100644 --- a/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/ReferenceTestFinder.java +++ b/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/ReferenceTestFinder.java @@ -36,6 +36,7 @@ public class ReferenceTestFinder { TestFork.BELLATRIX, TestFork.CAPELLA, TestFork.DENEB, + TestFork.ELECTRA, TestFork.EIP7594); @MustBeClosed diff --git a/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/TestDefinition.java b/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/TestDefinition.java index 963bcf30c7e..304ba32f35d 100644 --- a/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/TestDefinition.java +++ b/eth-tests/src/main/java/tech/pegasys/teku/ethtests/finder/TestDefinition.java @@ -72,10 +72,20 @@ private void createSpec() { case TestFork.BELLATRIX -> SpecMilestone.BELLATRIX; case TestFork.CAPELLA -> SpecMilestone.CAPELLA; case TestFork.DENEB -> SpecMilestone.DENEB; + case TestFork.ELECTRA -> SpecMilestone.ELECTRA; case TestFork.EIP7594 -> SpecMilestone.ELECTRA; default -> throw new IllegalArgumentException("Unknown fork: " + fork); }; - spec = TestSpecFactory.create(milestone, network); + // TODO: refactor + if (fork.equals(TestFork.EIP7594)) { + if (configName.equals(TestSpecConfig.MAINNET)) { + spec = TestSpecFactory.createMainnetElectraEip7594(); + } else { + spec = TestSpecFactory.createMinimalElectraEip7594(); + } + } else { + spec = TestSpecFactory.create(milestone, network); + } } public String getTestType() { diff --git a/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV2Response.java b/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV2Response.java index 600783c2fd8..1bdbdad99f7 100644 --- a/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV2Response.java +++ b/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV2Response.java @@ -21,6 +21,8 @@ import org.apache.tuweni.units.bigints.UInt256; import tech.pegasys.teku.ethereum.executionclient.serialization.UInt256AsHexDeserializer; import tech.pegasys.teku.ethereum.executionclient.serialization.UInt256AsHexSerializer; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadSchema; +import tech.pegasys.teku.spec.datastructures.execution.GetPayloadResponse; public class GetPayloadV2Response { public final ExecutionPayloadV2 executionPayload; @@ -37,4 +39,10 @@ public GetPayloadV2Response( this.executionPayload = executionPayload; this.blockValue = blockValue; } + + public GetPayloadResponse asInternalGetPayloadResponse( + final ExecutionPayloadSchema executionPayloadSchema) { + return new GetPayloadResponse( + executionPayload.asInternalExecutionPayload(executionPayloadSchema), blockValue); + } } diff --git a/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV3Response.java b/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV3Response.java index 4869aa33478..3e7dbd3b4ee 100644 --- a/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV3Response.java +++ b/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV3Response.java @@ -21,6 +21,9 @@ import org.apache.tuweni.units.bigints.UInt256; import tech.pegasys.teku.ethereum.executionclient.serialization.UInt256AsHexDeserializer; import tech.pegasys.teku.ethereum.executionclient.serialization.UInt256AsHexSerializer; +import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSchema; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadSchema; +import tech.pegasys.teku.spec.datastructures.execution.GetPayloadResponse; public class GetPayloadV3Response { public final ExecutionPayloadV3 executionPayload; @@ -46,4 +49,13 @@ public GetPayloadV3Response( this.blobsBundle = blobsBundle; this.shouldOverrideBuilder = shouldOverrideBuilder; } + + public GetPayloadResponse asInternalGetPayloadResponse( + final ExecutionPayloadSchema executionPayloadSchema, final BlobSchema blobSchema) { + return new GetPayloadResponse( + executionPayload.asInternalExecutionPayload(executionPayloadSchema), + blockValue, + blobsBundle.asInternalBlobsBundle(blobSchema), + shouldOverrideBuilder); + } } diff --git a/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV4Response.java b/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV4Response.java index e9bb45ed743..e414321626b 100644 --- a/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV4Response.java +++ b/ethereum/executionclient/src/main/java/tech/pegasys/teku/ethereum/executionclient/schema/GetPayloadV4Response.java @@ -21,6 +21,9 @@ import org.apache.tuweni.units.bigints.UInt256; import tech.pegasys.teku.ethereum.executionclient.serialization.UInt256AsHexDeserializer; import tech.pegasys.teku.ethereum.executionclient.serialization.UInt256AsHexSerializer; +import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSchema; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadSchema; +import tech.pegasys.teku.spec.datastructures.execution.GetPayloadResponse; public class GetPayloadV4Response { public final ExecutionPayloadV3 executionPayload; @@ -46,4 +49,13 @@ public GetPayloadV4Response( this.blobsBundle = blobsBundle; this.shouldOverrideBuilder = shouldOverrideBuilder; } + + public GetPayloadResponse asInternalGetPayloadResponse( + final ExecutionPayloadSchema executionPayloadSchema, final BlobSchema blobSchema) { + return new GetPayloadResponse( + executionPayload.asInternalExecutionPayload(executionPayloadSchema), + blockValue, + blobsBundle.asInternalBlobsBundle(blobSchema), + shouldOverrideBuilder); + } } diff --git a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/BellatrixExecutionClientHandlerTest.java b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/BellatrixExecutionClientHandlerTest.java index 8685323e91f..b97c46c29d5 100644 --- a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/BellatrixExecutionClientHandlerTest.java +++ b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/BellatrixExecutionClientHandlerTest.java @@ -13,6 +13,7 @@ package tech.pegasys.teku.ethereum.executionlayer; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -30,10 +31,12 @@ import tech.pegasys.teku.spec.TestSpecFactory; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayload; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadContext; +import tech.pegasys.teku.spec.datastructures.execution.GetPayloadResponse; import tech.pegasys.teku.spec.datastructures.execution.NewPayloadRequest; import tech.pegasys.teku.spec.executionlayer.ExecutionPayloadStatus; import tech.pegasys.teku.spec.executionlayer.ForkChoiceState; import tech.pegasys.teku.spec.executionlayer.PayloadBuildingAttributes; +import tech.pegasys.teku.spec.executionlayer.PayloadStatus; import tech.pegasys.teku.spec.util.DataStructureUtil; class BellatrixExecutionClientHandlerTest extends ExecutionHandlerClientTest { @@ -43,7 +46,6 @@ void setup() { dataStructureUtil = new DataStructureUtil(spec); } - @SuppressWarnings("FutureReturnValueIgnored") @Test void engineGetPayload_shouldCallGetPayloadV1() { final ExecutionClientHandler handler = getHandler(); @@ -54,35 +56,36 @@ void engineGetPayload_shouldCallGetPayloadV1() { dataStructureUtil.randomForkChoiceState(false), dataStructureUtil.randomPayloadBuildingAttributes(false)); + final ExecutionPayload executionPayload = dataStructureUtil.randomExecutionPayload(); + final ExecutionPayloadV1 responseData = + ExecutionPayloadV1.fromInternalExecutionPayload(executionPayload); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - ExecutionPayloadV1.fromInternalExecutionPayload( - dataStructureUtil.randomExecutionPayload()))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.getPayloadV1(context.getPayloadId())).thenReturn(dummyResponse); - handler.engineGetPayload(context, slot); + final SafeFuture future = handler.engineGetPayload(context, slot); verify(executionEngineClient).getPayloadV1(context.getPayloadId()); + assertThat(future).isCompletedWithValue(new GetPayloadResponse(executionPayload)); } - @SuppressWarnings("FutureReturnValueIgnored") @Test void engineNewPayload_shouldCallNewPayloadV1() { final ExecutionClientHandler handler = getHandler(); final ExecutionPayload payload = dataStructureUtil.randomExecutionPayload(); final NewPayloadRequest newPayloadRequest = new NewPayloadRequest(payload); final ExecutionPayloadV1 payloadV1 = ExecutionPayloadV1.fromInternalExecutionPayload(payload); + final PayloadStatusV1 responseData = + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.newPayloadV1(payloadV1)).thenReturn(dummyResponse); - handler.engineNewPayload(newPayloadRequest, UInt64.ZERO); + final SafeFuture future = + handler.engineNewPayload(newPayloadRequest, UInt64.ZERO); verify(executionEngineClient).newPayloadV1(payloadV1); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } - @SuppressWarnings("FutureReturnValueIgnored") @Test void engineForkChoiceUpdated_shouldCallEngineForkChoiceUpdatedV1() { final ExecutionClientHandler handler = getHandler(); @@ -101,16 +104,18 @@ void engineForkChoiceUpdated_shouldCallEngineForkChoiceUpdatedV1() { dataStructureUtil.randomBytes32()); final Optional payloadAttributes = PayloadAttributesV1.fromInternalPayloadBuildingAttributes(Optional.of(attributes)); + final ForkChoiceUpdatedResult responseData = + new ForkChoiceUpdatedResult( + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), + dataStructureUtil.randomBytes8()); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new ForkChoiceUpdatedResult( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), - dataStructureUtil.randomBytes8()))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.forkChoiceUpdatedV1(forkChoiceStateV1, payloadAttributes)) .thenReturn(dummyResponse); - handler.engineForkChoiceUpdated(forkChoiceState, Optional.of(attributes)); + final SafeFuture future = + handler.engineForkChoiceUpdated(forkChoiceState, Optional.of(attributes)); verify(executionEngineClient).forkChoiceUpdatedV1(forkChoiceStateV1, payloadAttributes); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } } diff --git a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/CapellaExecutionClientHandlerTest.java b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/CapellaExecutionClientHandlerTest.java index 7ff06867007..a8ef2d41953 100644 --- a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/CapellaExecutionClientHandlerTest.java +++ b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/CapellaExecutionClientHandlerTest.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Optional; -import java.util.concurrent.ExecutionException; import org.apache.tuweni.units.bigints.UInt256; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -35,13 +34,14 @@ import tech.pegasys.teku.spec.TestSpecFactory; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayload; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadContext; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadSchema; import tech.pegasys.teku.spec.datastructures.execution.GetPayloadResponse; import tech.pegasys.teku.spec.datastructures.execution.NewPayloadRequest; -import tech.pegasys.teku.spec.datastructures.execution.versions.capella.ExecutionPayloadCapella; import tech.pegasys.teku.spec.executionlayer.ExecutionPayloadStatus; import tech.pegasys.teku.spec.executionlayer.ForkChoiceState; import tech.pegasys.teku.spec.executionlayer.PayloadBuildingAttributes; import tech.pegasys.teku.spec.executionlayer.PayloadStatus; +import tech.pegasys.teku.spec.schemas.SchemaDefinitionsCapella; import tech.pegasys.teku.spec.util.DataStructureUtil; public class CapellaExecutionClientHandlerTest extends ExecutionHandlerClientTest { @@ -53,7 +53,7 @@ void setup() { } @Test - void engineGetPayload_shouldCallGetPayloadV2() throws ExecutionException, InterruptedException { + void engineGetPayload_shouldCallGetPayloadV2() { final ExecutionClientHandler handler = getHandler(); final UInt64 slot = dataStructureUtil.randomUInt64(1_000_000); final ExecutionPayloadContext context = @@ -62,19 +62,23 @@ void engineGetPayload_shouldCallGetPayloadV2() throws ExecutionException, Interr dataStructureUtil.randomForkChoiceState(false), dataStructureUtil.randomPayloadBuildingAttributes(false)); + final GetPayloadV2Response responseData = + new GetPayloadV2Response( + ExecutionPayloadV2.fromInternalExecutionPayload( + dataStructureUtil.randomExecutionPayload()), + UInt256.MAX_VALUE); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new GetPayloadV2Response( - ExecutionPayloadV2.fromInternalExecutionPayload( - dataStructureUtil.randomExecutionPayload()), - UInt256.MAX_VALUE))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.getPayloadV2(context.getPayloadId())).thenReturn(dummyResponse); final SafeFuture future = handler.engineGetPayload(context, slot); verify(executionEngineClient).getPayloadV2(context.getPayloadId()); - assertThat(future).isCompleted(); - assertThat(future.get().getExecutionPayload()).isInstanceOf(ExecutionPayloadCapella.class); + final SchemaDefinitionsCapella schemaDefinitionCapella = + spec.atSlot(slot).getSchemaDefinitions().toVersionCapella().orElseThrow(); + final ExecutionPayloadSchema executionPayloadSchema = + schemaDefinitionCapella.getExecutionPayloadSchema(); + assertThat(future) + .isCompletedWithValue(responseData.asInternalGetPayloadResponse(executionPayloadSchema)); } @Test @@ -83,16 +87,16 @@ void engineNewPayload_shouldCallNewPayloadV2() { final ExecutionPayload payload = dataStructureUtil.randomExecutionPayload(); final NewPayloadRequest newPayloadRequest = new NewPayloadRequest(payload); final ExecutionPayloadV2 payloadV2 = ExecutionPayloadV2.fromInternalExecutionPayload(payload); + final PayloadStatusV1 responseData = + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.newPayloadV2(payloadV2)).thenReturn(dummyResponse); final SafeFuture future = handler.engineNewPayload(newPayloadRequest, UInt64.ZERO); verify(executionEngineClient).newPayloadV2(payloadV2); - assertThat(future).isCompleted(); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } @Test @@ -101,19 +105,19 @@ void engineForkChoiceUpdated_shouldCallEngineForkChoiceUpdatedV2() { final ForkChoiceState forkChoiceState = dataStructureUtil.randomForkChoiceState(false); final ForkChoiceStateV1 forkChoiceStateV1 = ForkChoiceStateV1.fromInternalForkChoiceState(forkChoiceState); + final ForkChoiceUpdatedResult responseData = + new ForkChoiceUpdatedResult( + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), + dataStructureUtil.randomBytes8()); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new ForkChoiceUpdatedResult( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), - dataStructureUtil.randomBytes8()))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.forkChoiceUpdatedV2(forkChoiceStateV1, Optional.empty())) .thenReturn(dummyResponse); final SafeFuture future = handler.engineForkChoiceUpdated(forkChoiceState, Optional.empty()); verify(executionEngineClient).forkChoiceUpdatedV2(forkChoiceStateV1, Optional.empty()); - assertThat(future).isCompleted(); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } @Test @@ -141,18 +145,18 @@ void engineForkChoiceUpdatedBuildingBlockOnForkTransition_shouldCallEngineForkCh capellaStartSlot.minusMinZero(1), dataStructureUtil.randomBytes32(), false); final ForkChoiceStateV1 forkChoiceStateV1 = ForkChoiceStateV1.fromInternalForkChoiceState(forkChoiceState); + final ForkChoiceUpdatedResult responseData = + new ForkChoiceUpdatedResult( + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), + dataStructureUtil.randomBytes8()); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new ForkChoiceUpdatedResult( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), - dataStructureUtil.randomBytes8()))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.forkChoiceUpdatedV2(forkChoiceStateV1, payloadAttributes)) .thenReturn(dummyResponse); final SafeFuture future = handler.engineForkChoiceUpdated(forkChoiceState, Optional.of(attributes)); verify(executionEngineClient).forkChoiceUpdatedV2(forkChoiceStateV1, payloadAttributes); - assertThat(future).isCompleted(); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } } diff --git a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/DenebExecutionClientHandlerTest.java b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/DenebExecutionClientHandlerTest.java index af480670b49..df49c8a7d42 100644 --- a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/DenebExecutionClientHandlerTest.java +++ b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/DenebExecutionClientHandlerTest.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Optional; -import java.util.concurrent.ExecutionException; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; import org.junit.jupiter.api.BeforeEach; @@ -36,18 +35,20 @@ import tech.pegasys.teku.infrastructure.async.SafeFuture; import tech.pegasys.teku.infrastructure.unsigned.UInt64; import tech.pegasys.teku.spec.TestSpecFactory; +import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSchema; import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecar; import tech.pegasys.teku.spec.datastructures.execution.BlobAndProof; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayload; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadContext; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadSchema; import tech.pegasys.teku.spec.datastructures.execution.GetPayloadResponse; import tech.pegasys.teku.spec.datastructures.execution.NewPayloadRequest; -import tech.pegasys.teku.spec.datastructures.execution.versions.deneb.ExecutionPayloadDeneb; import tech.pegasys.teku.spec.executionlayer.ExecutionPayloadStatus; import tech.pegasys.teku.spec.executionlayer.ForkChoiceState; import tech.pegasys.teku.spec.executionlayer.PayloadBuildingAttributes; import tech.pegasys.teku.spec.executionlayer.PayloadStatus; import tech.pegasys.teku.spec.logic.versions.deneb.types.VersionedHash; +import tech.pegasys.teku.spec.schemas.SchemaDefinitionsDeneb; import tech.pegasys.teku.spec.util.DataStructureUtil; public class DenebExecutionClientHandlerTest extends ExecutionHandlerClientTest { @@ -59,28 +60,31 @@ void setup() { } @Test - void engineGetPayload_shouldCallGetPayloadV3() throws ExecutionException, InterruptedException { + void engineGetPayload_shouldCallGetPayloadV3() { final ExecutionClientHandler handler = getHandler(); final ExecutionPayloadContext context = randomContext(); + final GetPayloadV3Response responseData = + new GetPayloadV3Response( + ExecutionPayloadV3.fromInternalExecutionPayload( + dataStructureUtil.randomExecutionPayload()), + UInt256.MAX_VALUE, + BlobsBundleV1.fromInternalBlobsBundle(dataStructureUtil.randomBlobsBundle()), + true); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new GetPayloadV3Response( - ExecutionPayloadV3.fromInternalExecutionPayload( - dataStructureUtil.randomExecutionPayload()), - UInt256.MAX_VALUE, - BlobsBundleV1.fromInternalBlobsBundle(dataStructureUtil.randomBlobsBundle()), - true))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.getPayloadV3(context.getPayloadId())).thenReturn(dummyResponse); final UInt64 slot = dataStructureUtil.randomUInt64(1_000_000); final SafeFuture future = handler.engineGetPayload(context, slot); verify(executionEngineClient).getPayloadV3(context.getPayloadId()); - assertThat(future).isCompleted(); - assertThat(future.get().getExecutionPayload()).isInstanceOf(ExecutionPayloadDeneb.class); - assertThat(future.get().getExecutionPayloadValue()).isEqualTo(UInt256.MAX_VALUE); - assertThat(future.get().getBlobsBundle()).isPresent(); - assertThat(future.get().getShouldOverrideBuilder()).isTrue(); + final SchemaDefinitionsDeneb schemaDefinitionDeneb = + spec.atSlot(slot).getSchemaDefinitions().toVersionDeneb().orElseThrow(); + final ExecutionPayloadSchema executionPayloadSchema = + schemaDefinitionDeneb.getExecutionPayloadSchema(); + final BlobSchema blobSchema = schemaDefinitionDeneb.getBlobSchema(); + assertThat(future) + .isCompletedWithValue( + responseData.asInternalGetPayloadResponse(executionPayloadSchema, blobSchema)); } @Test @@ -92,17 +96,17 @@ void engineNewPayload_shouldCallNewPayloadV3() { final NewPayloadRequest newPayloadRequest = new NewPayloadRequest(payload, versionedHashes, parentBeaconBlockRoot); final ExecutionPayloadV3 payloadV3 = ExecutionPayloadV3.fromInternalExecutionPayload(payload); + final PayloadStatusV1 responseData = + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.newPayloadV3(payloadV3, versionedHashes, parentBeaconBlockRoot)) .thenReturn(dummyResponse); final SafeFuture future = handler.engineNewPayload(newPayloadRequest, UInt64.ZERO); verify(executionEngineClient).newPayloadV3(payloadV3, versionedHashes, parentBeaconBlockRoot); - assertThat(future).isCompleted(); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } @Test @@ -123,19 +127,19 @@ void engineForkChoiceUpdated_shouldCallEngineForkChoiceUpdatedV3() { dataStructureUtil.randomBytes32()); final Optional payloadAttributes = PayloadAttributesV3.fromInternalPayloadBuildingAttributesV3(Optional.of(attributes)); + final ForkChoiceUpdatedResult responseData = + new ForkChoiceUpdatedResult( + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), + dataStructureUtil.randomBytes8()); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new ForkChoiceUpdatedResult( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), - dataStructureUtil.randomBytes8()))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.forkChoiceUpdatedV3(forkChoiceStateV1, payloadAttributes)) .thenReturn(dummyResponse); final SafeFuture future = handler.engineForkChoiceUpdated(forkChoiceState, Optional.of(attributes)); verify(executionEngineClient).forkChoiceUpdatedV3(forkChoiceStateV1, payloadAttributes); - assertThat(future).isCompleted(); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } @Test @@ -143,23 +147,29 @@ void engineGetBlobs_shouldCallGetBlobsV1() { final ExecutionClientHandler handler = getHandler(); final int maxBlobsPerBlock = spec.getMaxBlobsPerBlock().orElseThrow(); final List versionedHashes = - dataStructureUtil.randomVersionedHashes(maxBlobsPerBlock); + dataStructureUtil.randomVersionedHashes(maxBlobsPerBlock - 1); final List blobSidecars = dataStructureUtil.randomBlobSidecars(maxBlobsPerBlock); final UInt64 slot = dataStructureUtil.randomUInt64(1_000_000); + final List responseData = + blobSidecars.stream() + .map( + blobSidecar -> + new BlobAndProofV1( + blobSidecar.getBlob().getBytes(), + blobSidecar.getKZGProof().getBytesCompressed())) + .toList(); final SafeFuture>> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - blobSidecars.stream() - .map( - blobSidecar -> - new BlobAndProofV1( - blobSidecar.getBlob().getBytes(), - blobSidecar.getKZGProof().getBytesCompressed())) - .toList())); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.getBlobsV1(versionedHashes)).thenReturn(dummyResponse); final SafeFuture> future = handler.engineGetBlobs(versionedHashes, slot); verify(executionEngineClient).getBlobsV1(versionedHashes); - assertThat(future).isCompleted(); + final BlobSchema blobSchema = + spec.atSlot(slot).getSchemaDefinitions().toVersionDeneb().orElseThrow().getBlobSchema(); + assertThat(future) + .isCompletedWithValue( + responseData.stream() + .map(blobAndProofV1 -> blobAndProofV1.asInternalBlobsAndProofs(blobSchema)) + .toList()); } private ExecutionPayloadContext randomContext() { diff --git a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/ElectraExecutionClientHandlerTest.java b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/ElectraExecutionClientHandlerTest.java index c4d85f558b0..a0b10002bd7 100644 --- a/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/ElectraExecutionClientHandlerTest.java +++ b/ethereum/executionlayer/src/test/java/tech/pegasys/teku/ethereum/executionlayer/ElectraExecutionClientHandlerTest.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Optional; -import java.util.concurrent.ExecutionException; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; import org.junit.jupiter.api.BeforeEach; @@ -37,18 +36,20 @@ import tech.pegasys.teku.infrastructure.async.SafeFuture; import tech.pegasys.teku.infrastructure.unsigned.UInt64; import tech.pegasys.teku.spec.TestSpecFactory; +import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSchema; import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecar; import tech.pegasys.teku.spec.datastructures.execution.BlobAndProof; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayload; import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadContext; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionPayloadSchema; import tech.pegasys.teku.spec.datastructures.execution.GetPayloadResponse; import tech.pegasys.teku.spec.datastructures.execution.NewPayloadRequest; -import tech.pegasys.teku.spec.datastructures.execution.versions.deneb.ExecutionPayloadDeneb; import tech.pegasys.teku.spec.executionlayer.ExecutionPayloadStatus; import tech.pegasys.teku.spec.executionlayer.ForkChoiceState; import tech.pegasys.teku.spec.executionlayer.PayloadBuildingAttributes; import tech.pegasys.teku.spec.executionlayer.PayloadStatus; import tech.pegasys.teku.spec.logic.versions.deneb.types.VersionedHash; +import tech.pegasys.teku.spec.schemas.SchemaDefinitionsElectra; import tech.pegasys.teku.spec.util.DataStructureUtil; public class ElectraExecutionClientHandlerTest extends ExecutionHandlerClientTest { @@ -60,28 +61,31 @@ void setup() { } @Test - void engineGetPayload_shouldCallGetPayloadV4() throws ExecutionException, InterruptedException { + void engineGetPayload_shouldCallGetPayloadV4() { final ExecutionClientHandler handler = getHandler(); final ExecutionPayloadContext context = randomContext(); + final GetPayloadV4Response responseData = + new GetPayloadV4Response( + ExecutionPayloadV3.fromInternalExecutionPayload( + dataStructureUtil.randomExecutionPayload()), + UInt256.MAX_VALUE, + BlobsBundleV1.fromInternalBlobsBundle(dataStructureUtil.randomBlobsBundle()), + true); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new GetPayloadV4Response( - ExecutionPayloadV3.fromInternalExecutionPayload( - dataStructureUtil.randomExecutionPayload()), - UInt256.MAX_VALUE, - BlobsBundleV1.fromInternalBlobsBundle(dataStructureUtil.randomBlobsBundle()), - true))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.getPayloadV4(context.getPayloadId())).thenReturn(dummyResponse); final UInt64 slot = dataStructureUtil.randomUInt64(1_000_000); final SafeFuture future = handler.engineGetPayload(context, slot); verify(executionEngineClient).getPayloadV4(context.getPayloadId()); - assertThat(future).isCompleted(); - assertThat(future.get().getExecutionPayload()).isInstanceOf(ExecutionPayloadDeneb.class); - assertThat(future.get().getExecutionPayloadValue()).isEqualTo(UInt256.MAX_VALUE); - assertThat(future.get().getBlobsBundle()).isPresent(); - assertThat(future.get().getShouldOverrideBuilder()).isTrue(); + final SchemaDefinitionsElectra schemaDefinitionElectra = + spec.atSlot(slot).getSchemaDefinitions().toVersionElectra().orElseThrow(); + final ExecutionPayloadSchema executionPayloadSchema = + schemaDefinitionElectra.getExecutionPayloadSchema(); + final BlobSchema blobSchema = schemaDefinitionElectra.getBlobSchema(); + assertThat(future) + .isCompletedWithValue( + responseData.asInternalGetPayloadResponse(executionPayloadSchema, blobSchema)); } @Test @@ -95,11 +99,11 @@ void engineNewPayload_shouldCallNewPayloadV4() { new NewPayloadRequest( payload, versionedHashes, parentBeaconBlockRoot, executionRequestsHash); final ExecutionPayloadV3 payloadV3 = ExecutionPayloadV3.fromInternalExecutionPayload(payload); + final PayloadStatusV1 responseData = + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), null))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.newPayloadV4( eq(payloadV3), eq(versionedHashes), @@ -114,7 +118,7 @@ void engineNewPayload_shouldCallNewPayloadV4() { eq(versionedHashes), eq(parentBeaconBlockRoot), eq(executionRequestsHash)); - assertThat(future).isCompleted(); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } @Test @@ -135,19 +139,19 @@ void engineForkChoiceUpdated_shouldCallEngineForkChoiceUpdatedV3() { dataStructureUtil.randomBytes32()); final Optional payloadAttributes = PayloadAttributesV3.fromInternalPayloadBuildingAttributesV3(Optional.of(attributes)); + final ForkChoiceUpdatedResult responseData = + new ForkChoiceUpdatedResult( + new PayloadStatusV1( + ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), + dataStructureUtil.randomBytes8()); final SafeFuture> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - new ForkChoiceUpdatedResult( - new PayloadStatusV1( - ExecutionPayloadStatus.ACCEPTED, dataStructureUtil.randomBytes32(), ""), - dataStructureUtil.randomBytes8()))); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.forkChoiceUpdatedV3(forkChoiceStateV1, payloadAttributes)) .thenReturn(dummyResponse); final SafeFuture future = handler.engineForkChoiceUpdated(forkChoiceState, Optional.of(attributes)); verify(executionEngineClient).forkChoiceUpdatedV3(forkChoiceStateV1, payloadAttributes); - assertThat(future).isCompleted(); + assertThat(future).isCompletedWithValue(responseData.asInternalExecutionPayload()); } @Test @@ -158,20 +162,26 @@ void engineGetBlobs_shouldCallGetBlobsV1() { dataStructureUtil.randomVersionedHashes(maxBlobsPerBlock); final List blobSidecars = dataStructureUtil.randomBlobSidecars(maxBlobsPerBlock); final UInt64 slot = dataStructureUtil.randomUInt64(1_000_000); + final List responseData = + blobSidecars.stream() + .map( + blobSidecar -> + new BlobAndProofV1( + blobSidecar.getBlob().getBytes(), + blobSidecar.getKZGProof().getBytesCompressed())) + .toList(); final SafeFuture>> dummyResponse = - SafeFuture.completedFuture( - new Response<>( - blobSidecars.stream() - .map( - blobSidecar -> - new BlobAndProofV1( - blobSidecar.getBlob().getBytes(), - blobSidecar.getKZGProof().getBytesCompressed())) - .toList())); + SafeFuture.completedFuture(new Response<>(responseData)); when(executionEngineClient.getBlobsV1(versionedHashes)).thenReturn(dummyResponse); final SafeFuture> future = handler.engineGetBlobs(versionedHashes, slot); verify(executionEngineClient).getBlobsV1(versionedHashes); - assertThat(future).isCompleted(); + final BlobSchema blobSchema = + spec.atSlot(slot).getSchemaDefinitions().toVersionDeneb().orElseThrow().getBlobSchema(); + assertThat(future) + .isCompletedWithValue( + responseData.stream() + .map(blobAndProofV1 -> blobAndProofV1.asInternalBlobsAndProofs(blobSchema)) + .toList()); } private ExecutionPayloadContext randomContext() { diff --git a/ethereum/json-types/src/main/java/tech/pegasys/teku/ethereum/json/types/EthereumTypes.java b/ethereum/json-types/src/main/java/tech/pegasys/teku/ethereum/json/types/EthereumTypes.java index e89d982bba0..a2db56f96aa 100644 --- a/ethereum/json-types/src/main/java/tech/pegasys/teku/ethereum/json/types/EthereumTypes.java +++ b/ethereum/json-types/src/main/java/tech/pegasys/teku/ethereum/json/types/EthereumTypes.java @@ -95,15 +95,7 @@ public class EthereumTypes { public static final StringValueTypeDefinition MILESTONE_TYPE = new EnumTypeDefinition<>( - SpecMilestone.class, - milestone -> { - // FIXME: remove me, bad hack to make Kurtosis working - if (milestone.equals(SpecMilestone.ELECTRA)) { - return "deneb"; - } - return milestone.name().toLowerCase(Locale.ROOT); - }, - Set.of()); + SpecMilestone.class, milestone -> milestone.name().toLowerCase(Locale.ROOT), Set.of()); public static final EnumHeaderTypeDefinition ETH_CONSENSUS_HEADER_TYPE = new EnumHeaderTypeDefinition.EnumTypeHeaderDefinitionBuilder<>( diff --git a/ethereum/networks/src/main/resources/tech/pegasys/teku/networks/minimal-trusted-setup.txt b/ethereum/networks/src/main/resources/tech/pegasys/teku/networks/minimal-trusted-setup.txt index 5ecccf5e5e5..47d17784051 100644 --- a/ethereum/networks/src/main/resources/tech/pegasys/teku/networks/minimal-trusted-setup.txt +++ b/ethereum/networks/src/main/resources/tech/pegasys/teku/networks/minimal-trusted-setup.txt @@ -8256,4 +8256,4 @@ b417fdaf719caf38854e89ce52031b30ce61a632e6c3135adec9002280e022d82ab0ea4ac5ebdb21 9367a6feb5e23ea2eab8ddd5e7bdf32b4d2419fad1c71a1ed327b77362d8942dad971a1c2e6f7073885149cdf0a0c339 a71c5c08d50c57d094d6a4f02e97d3799bada92f238ffc07bd223bbe8379507b7310d20b28f5bbbf331e5e153515e491 9630a9a3bcb044b51299c4d3d3388a4ff47308dd27be3229601985478c0f6b55faa7e20815d8694f910611396a9d0d45 -b0bfaf56a5aa59b48960aa7c1617e832e65c823523fb2a5cd44ba606800501cf873e8db1d0dda64065285743dc40786e \ No newline at end of file +b0bfaf56a5aa59b48960aa7c1617e832e65c823523fb2a5cd44ba606800501cf873e8db1d0dda64065285743dc40786e diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/builder/ValidatorRegistration.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/builder/ValidatorRegistration.java index 4a7b0802196..56784b04f91 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/builder/ValidatorRegistration.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/builder/ValidatorRegistration.java @@ -24,6 +24,7 @@ public class ValidatorRegistration extends Container4 { + public static final ValidatorRegistrationSchema SSZ_SCHEMA = new ValidatorRegistrationSchema(); protected ValidatorRegistration( final ValidatorRegistrationSchema schema, final TreeNode backingNode) { diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/ExpectedWithdrawals.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/ExpectedWithdrawals.java index 0d70afb7eff..9d290a8ded7 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/ExpectedWithdrawals.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/ExpectedWithdrawals.java @@ -130,10 +130,12 @@ private static ExpectedWithdrawals createFromElectraState( final MiscHelpersElectra miscHelpers, final SpecConfigElectra specConfig, final PredicatesElectra predicates) { - final List partialPendingWithdrawals = + final WithdrawalSummary expectedPendingPartialWithdrawals = getPendingPartialWithdrawals(preState, schemaDefinitions, miscHelpers, specConfig); - final int partialWithdrawalsCount = partialPendingWithdrawals.size(); - final List capellaWithdrawals = + final List partialPendingWithdrawals = + expectedPendingPartialWithdrawals.withdrawalList(); + final int partialWithdrawalsCount = expectedPendingPartialWithdrawals.partialWithdrawalCount(); + final List withdrawals = getExpectedWithdrawals( preState, schemaDefinitions, @@ -141,7 +143,7 @@ private static ExpectedWithdrawals createFromElectraState( specConfig, predicates, partialPendingWithdrawals); - return new ExpectedWithdrawals(capellaWithdrawals, partialWithdrawalsCount, schemaDefinitions); + return new ExpectedWithdrawals(withdrawals, partialWithdrawalsCount, schemaDefinitions); } public List getWithdrawalList() { @@ -152,7 +154,7 @@ public int getPartialWithdrawalCount() { return partialWithdrawalCount; } - private static List getPendingPartialWithdrawals( + private static WithdrawalSummary getPendingPartialWithdrawals( final BeaconStateElectra preState, final SchemaDefinitionsElectra schemaDefinitions, final MiscHelpersElectra miscHelpers, @@ -162,6 +164,7 @@ private static List getPendingPartialWithdrawals( final List partialWithdrawals = new ArrayList<>(); final SszList pendingPartialWithdrawals = preState.getPendingPartialWithdrawals(); + int partialWithdrawalsCount = 0; UInt64 withdrawalIndex = preState.getNextWithdrawalIndex(); for (int i = 0; i < pendingPartialWithdrawals.size() && i < maxPendingPartialWithdrawals; i++) { @@ -195,8 +198,9 @@ private static List getPendingPartialWithdrawals( withdrawableBalance)); withdrawalIndex = withdrawalIndex.increment(); } + partialWithdrawalsCount++; } - return partialWithdrawals; + return new WithdrawalSummary(partialWithdrawals, partialWithdrawalsCount); } // get_expected_withdrawals @@ -371,4 +375,6 @@ private static void assertWithdrawalsInExecutionPayloadMatchExpected( private static UInt64 nextWithdrawalAfter(final List partialWithdrawals) { return partialWithdrawals.getLast().getIndex().increment(); } + + public record WithdrawalSummary(List withdrawalList, int partialWithdrawalCount) {} } diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ConsolidationRequest.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ConsolidationRequest.java index e54220c4807..5d0420fb9fb 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ConsolidationRequest.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ConsolidationRequest.java @@ -20,9 +20,12 @@ import tech.pegasys.teku.infrastructure.ssz.tree.TreeNode; import tech.pegasys.teku.spec.datastructures.type.SszPublicKey; +// https://eips.ethereum.org/EIPS/eip-7251 public class ConsolidationRequest extends Container3 { + public static final byte REQUEST_TYPE = 0x2; + public static final ConsolidationRequestSchema SSZ_SCHEMA = new ConsolidationRequestSchema(); protected ConsolidationRequest( diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/DepositRequest.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/DepositRequest.java index fc67724a394..56a12d1c71f 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/DepositRequest.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/DepositRequest.java @@ -24,10 +24,13 @@ import tech.pegasys.teku.spec.datastructures.type.SszPublicKey; import tech.pegasys.teku.spec.datastructures.type.SszSignature; +// https://eips.ethereum.org/EIPS/eip-6110 public class DepositRequest extends Container5< DepositRequest, SszPublicKey, SszBytes32, SszUInt64, SszSignature, SszUInt64> { + public static final byte REQUEST_TYPE = 0x0; + DepositRequest( final DepositRequestSchema schema, final BLSPublicKey pubkey, diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodec.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodec.java new file mode 100644 index 00000000000..a31930f38c7 --- /dev/null +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodec.java @@ -0,0 +1,111 @@ +/* + * Copyright Consensys Software Inc., 2024 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package tech.pegasys.teku.spec.datastructures.execution.versions.electra; + +import com.google.common.annotations.VisibleForTesting; +import java.util.List; +import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.bytes.Bytes32; +import tech.pegasys.teku.infrastructure.crypto.Hash; +import tech.pegasys.teku.infrastructure.ssz.SszList; +import tech.pegasys.teku.spec.datastructures.execution.ExecutionRequestsBuilder; + +/* + Implement the rules for decoding and hashing execution requests according to https://eips.ethereum.org/EIPS/eip-7685 +*/ +public class ExecutionRequestsDataCodec { + + private static final int EXPECTED_REQUEST_DATA_ELEMENTS = 3; + private static final Bytes DEPOSIT_REQUEST_PREFIX = Bytes.of(DepositRequest.REQUEST_TYPE); + private static final Bytes WITHDRAWAL_REQUEST_PREFIX = Bytes.of(WithdrawalRequest.REQUEST_TYPE); + private static final Bytes CONSOLIDATION_REQUEST_PREFIX = + Bytes.of(ConsolidationRequest.REQUEST_TYPE); + + private final ExecutionRequestsSchema executionRequestsSchema; + + public ExecutionRequestsDataCodec(final ExecutionRequestsSchema executionRequestsSchema) { + this.executionRequestsSchema = executionRequestsSchema; + } + + public ExecutionRequests decode(final List executionRequestData) { + if (executionRequestData.size() != EXPECTED_REQUEST_DATA_ELEMENTS) { + throw new IllegalArgumentException( + "Invalid number of execution request data elements: expected " + + EXPECTED_REQUEST_DATA_ELEMENTS + + ", received " + + executionRequestData.size()); + } + + final ExecutionRequestsBuilder executionRequestsBuilder = + new ExecutionRequestsBuilderElectra(executionRequestsSchema); + + for (int index = 0; index < executionRequestData.size(); index++) { + // The request type is implicitly defined as the index of the element in executionRequestData + switch ((byte) index) { + case DepositRequest.REQUEST_TYPE -> + executionRequestsBuilder.deposits( + executionRequestsSchema + .getDepositRequestsSchema() + .sszDeserialize(executionRequestData.get(index)) + .asList()); + case WithdrawalRequest.REQUEST_TYPE -> + executionRequestsBuilder.withdrawals( + executionRequestsSchema + .getWithdrawalRequestsSchema() + .sszDeserialize(executionRequestData.get(index)) + .asList()); + case ConsolidationRequest.REQUEST_TYPE -> + executionRequestsBuilder.consolidations( + executionRequestsSchema + .getConsolidationRequestsSchema() + .sszDeserialize(executionRequestData.get(index)) + .asList()); + default -> throw new IllegalArgumentException("Invalid execution request type: " + index); + } + } + + return executionRequestsBuilder.build(); + } + + @VisibleForTesting + List encodeWithTypePrefix(final ExecutionRequests executionRequests) { + final SszList depositRequestsSszList = + executionRequestsSchema + .getDepositRequestsSchema() + .createFromElements(executionRequests.getDeposits()); + final SszList withdrawalRequestsSszList = + executionRequestsSchema + .getWithdrawalRequestsSchema() + .createFromElements(executionRequests.getWithdrawals()); + final SszList consolidationRequestsSszList = + executionRequestsSchema + .getConsolidationRequestsSchema() + .createFromElements(executionRequests.getConsolidations()); + + return List.of( + Bytes.concatenate(DEPOSIT_REQUEST_PREFIX, depositRequestsSszList.sszSerialize()), + Bytes.concatenate(WITHDRAWAL_REQUEST_PREFIX, withdrawalRequestsSszList.sszSerialize()), + Bytes.concatenate( + CONSOLIDATION_REQUEST_PREFIX, consolidationRequestsSszList.sszSerialize())); + } + + public Bytes32 hash(final ExecutionRequests executionRequests) { + final Bytes sortedEncodedRequests = + encodeWithTypePrefix(executionRequests).stream() + .map(Hash::sha256) + .map(Bytes.class::cast) + .reduce(Bytes.EMPTY, Bytes::concatenate); + return Hash.sha256(sortedEncodedRequests); + } +} diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/WithdrawalRequest.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/WithdrawalRequest.java index f07a9e0de68..1f7d270fe8c 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/WithdrawalRequest.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/WithdrawalRequest.java @@ -22,9 +22,12 @@ import tech.pegasys.teku.infrastructure.unsigned.UInt64; import tech.pegasys.teku.spec.datastructures.type.SszPublicKey; +// https://eips.ethereum.org/EIPS/eip-7002 public class WithdrawalRequest extends Container3 { + public static final byte REQUEST_TYPE = 0x1; + public static final WithdrawalRequestSchema SSZ_SCHEMA = new WithdrawalRequestSchema(); protected WithdrawalRequest( diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/state/ForkInfo.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/state/ForkInfo.java index ae625209707..797f52da6c1 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/state/ForkInfo.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/datastructures/state/ForkInfo.java @@ -13,10 +13,13 @@ package tech.pegasys.teku.spec.datastructures.state; +import static tech.pegasys.teku.infrastructure.json.types.CoreTypes.BYTES32_TYPE; + import com.google.common.base.MoreObjects; import java.util.Objects; import org.apache.tuweni.bytes.Bytes32; import tech.pegasys.teku.infrastructure.bytes.Bytes4; +import tech.pegasys.teku.infrastructure.json.types.SerializableTypeDefinition; import tech.pegasys.teku.spec.Spec; public class ForkInfo { @@ -63,6 +66,13 @@ public boolean equals(final Object o) { && Objects.equals(genesisValidatorsRoot, forkInfo.genesisValidatorsRoot); } + public static SerializableTypeDefinition getJsonTypeDefinition() { + return SerializableTypeDefinition.object(ForkInfo.class) + .withField("fork", Fork.SSZ_SCHEMA.getJsonTypeDefinition(), ForkInfo::getFork) + .withField("genesis_validators_root", BYTES32_TYPE, ForkInfo::getGenesisValidatorsRoot) + .build(); + } + @Override public int hashCode() { return Objects.hash(fork, genesisValidatorsRoot); diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/AbstractSchemaDefinitions.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/AbstractSchemaDefinitions.java index 086f6587cc1..91145d621d4 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/AbstractSchemaDefinitions.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/AbstractSchemaDefinitions.java @@ -20,6 +20,7 @@ import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.BeaconBlocksByRootRequestMessage; import tech.pegasys.teku.spec.datastructures.state.HistoricalBatch.HistoricalBatchSchema; import tech.pegasys.teku.spec.schemas.registry.SchemaRegistry; +import tech.pegasys.teku.spec.schemas.registry.SchemaTypes; public abstract class AbstractSchemaDefinitions implements SchemaDefinitions { protected SchemaRegistry schemaRegistry; @@ -39,8 +40,7 @@ public AbstractSchemaDefinitions(final SchemaRegistry schemaRegistry) { this.beaconBlocksByRootRequestMessageSchema = new BeaconBlocksByRootRequestMessage.BeaconBlocksByRootRequestMessageSchema( schemaRegistry.getSpecConfig()); - this.attnetsENRFieldSchema = - SszBitvectorSchema.create(schemaRegistry.getSpecConfig().getAttestationSubnetCount()); + this.attnetsENRFieldSchema = schemaRegistry.get(SchemaTypes.ATTNETS_ENR_FIELD_SCHEMA); } abstract long getMaxValidatorPerAttestation(SpecConfig specConfig); diff --git a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java index 868a01bcd4b..1ce804d3923 100644 --- a/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java +++ b/ethereum/spec/src/main/java/tech/pegasys/teku/spec/schemas/SchemaDefinitionsPhase0.java @@ -35,12 +35,12 @@ import tech.pegasys.teku.spec.datastructures.operations.IndexedAttestation; import tech.pegasys.teku.spec.datastructures.operations.IndexedAttestationSchema; import tech.pegasys.teku.spec.datastructures.operations.SignedAggregateAndProof.SignedAggregateAndProofSchema; -import tech.pegasys.teku.spec.datastructures.operations.versions.phase0.AttestationPhase0Schema; import tech.pegasys.teku.spec.datastructures.operations.versions.phase0.AttesterSlashingPhase0Schema; import tech.pegasys.teku.spec.datastructures.operations.versions.phase0.IndexedAttestationPhase0Schema; import tech.pegasys.teku.spec.datastructures.state.beaconstate.BeaconStateSchema; import tech.pegasys.teku.spec.datastructures.state.beaconstate.versions.phase0.BeaconStateSchemaPhase0; import tech.pegasys.teku.spec.schemas.registry.SchemaRegistry; +import tech.pegasys.teku.spec.schemas.registry.SchemaTypes; public class SchemaDefinitionsPhase0 extends AbstractSchemaDefinitions { private final IndexedAttestationSchema indexedAttestationSchema; @@ -64,10 +64,8 @@ public SchemaDefinitionsPhase0(final SchemaRegistry schemaRegistry) { new AttesterSlashingPhase0Schema(indexedAttestationSchema) .castTypeToAttesterSlashingSchema(); - this.aggregateAndProofSchema = - new AggregateAndProofSchema( - new AttestationPhase0Schema(getMaxValidatorPerAttestation(specConfig))); - this.attestationSchema = this.aggregateAndProofSchema.getAttestationSchema(); + this.attestationSchema = schemaRegistry.get(SchemaTypes.ATTESTATION_SCHEMA); + this.aggregateAndProofSchema = new AggregateAndProofSchema(attestationSchema); this.signedAggregateAndProofSchema = new SignedAggregateAndProofSchema(aggregateAndProofSchema); this.beaconStateSchema = BeaconStateSchemaPhase0.create(specConfig); this.beaconBlockBodySchema = diff --git a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodecTest.java b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodecTest.java new file mode 100644 index 00000000000..520565983b2 --- /dev/null +++ b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/datastructures/execution/versions/electra/ExecutionRequestsDataCodecTest.java @@ -0,0 +1,282 @@ +/* + * Copyright Consensys Software Inc., 2024 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package tech.pegasys.teku.spec.datastructures.execution.versions.electra; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.bytes.Bytes32; +import org.junit.jupiter.api.Test; +import tech.pegasys.teku.bls.BLSPublicKey; +import tech.pegasys.teku.bls.BLSSignature; +import tech.pegasys.teku.infrastructure.bytes.Bytes20; +import tech.pegasys.teku.infrastructure.unsigned.UInt64; +import tech.pegasys.teku.spec.Spec; +import tech.pegasys.teku.spec.SpecMilestone; +import tech.pegasys.teku.spec.TestSpecFactory; +import tech.pegasys.teku.spec.config.SpecConfigElectra; + +class ExecutionRequestsDataCodecTest { + + private final Spec spec = TestSpecFactory.createMinimalElectra(); + private final SpecConfigElectra specConfigElectra = + SpecConfigElectra.required(spec.forMilestone(SpecMilestone.ELECTRA).getConfig()); + private final ExecutionRequestsSchema executionRequestsSchema = + new ExecutionRequestsSchema(specConfigElectra); + private final ExecutionRequestsDataCodec codec = + new ExecutionRequestsDataCodec(executionRequestsSchema); + + @Test + public void decodeExecutionRequestData() { + final List executionRequestsData = + List.of( + depositRequestListEncoded, + withdrawalRequestsListEncoded, + consolidationRequestsListEncoded); + + final ExecutionRequests executionRequests = codec.decode(executionRequestsData); + + assertThat(executionRequests.getDeposits()).containsExactly(depositRequest1, depositRequest2); + assertThat(executionRequests.getWithdrawals()) + .containsExactly(withdrawalRequest1, withdrawalRequest2); + assertThat(executionRequests.getConsolidations()).containsExactly(consolidationRequest1); + } + + @Test + public void decodeExecutionRequestDataWithAllRequestTypesEmpty() { + final List executionRequestsData = List.of(Bytes.EMPTY, Bytes.EMPTY, Bytes.EMPTY); + + final ExecutionRequests executionRequests = codec.decode(executionRequestsData); + + assertThat(executionRequests.getDeposits()).isEmpty(); + assertThat(executionRequests.getWithdrawals()).isEmpty(); + assertThat(executionRequests.getConsolidations()).isEmpty(); + } + + @Test + public void decodeExecutionRequestDataWithOneRequestTypeEmpty() { + final List executionRequestsData = + List.of(depositRequestListEncoded, Bytes.EMPTY, consolidationRequestsListEncoded); + + final ExecutionRequests executionRequests = codec.decode(executionRequestsData); + + assertThat(executionRequests.getDeposits()).containsExactly(depositRequest1, depositRequest2); + assertThat(executionRequests.getWithdrawals()).isEmpty(); + assertThat(executionRequests.getConsolidations()).containsExactly(consolidationRequest1); + } + + @Test + public void decodeExecutionRequestDataWithMoreElementsThanExpected() { + final List invalidExecutionRequestsData = + List.of( + depositRequestListEncoded, + withdrawalRequestsListEncoded, + consolidationRequestsListEncoded, + Bytes.random(10)); + + assertThatThrownBy(() -> codec.decode(invalidExecutionRequestsData)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void decodeExecutionRequestDataWithLessThanExpectedElements() { + final List invalidExecutionRequestsData = + List.of(depositRequestListEncoded, withdrawalRequestsListEncoded); + + assertThatThrownBy(() -> codec.decode(invalidExecutionRequestsData)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void decodeExecutionRequestDataWithMoreThanExpectedElements() { + final List invalidExecutionRequestsData = + List.of( + depositRequestListEncoded, + withdrawalRequestsListEncoded, + consolidationRequestsListEncoded, + depositRequestListEncoded); + + assertThatThrownBy(() -> codec.decode(invalidExecutionRequestsData)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void decodeExecutionRequestDataWithZeroElements() { + final List invalidExecutionRequestsData = List.of(); + + assertThatThrownBy(() -> codec.decode(invalidExecutionRequestsData)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void encodeWithTypePrefixExecutionRequests() { + final ExecutionRequests executionRequests = + new ExecutionRequestsBuilderElectra(executionRequestsSchema) + .deposits(List.of(depositRequest1, depositRequest2)) + .withdrawals(List.of(withdrawalRequest1, withdrawalRequest2)) + .consolidations(List.of(consolidationRequest1)) + .build(); + + final List encodedRequests = codec.encodeWithTypePrefix(executionRequests); + + assertThat(encodedRequests) + .containsExactly( + Bytes.concatenate(Bytes.of(DepositRequest.REQUEST_TYPE), depositRequestListEncoded), + Bytes.concatenate( + Bytes.of(WithdrawalRequest.REQUEST_TYPE), withdrawalRequestsListEncoded), + Bytes.concatenate( + Bytes.of(ConsolidationRequest.REQUEST_TYPE), consolidationRequestsListEncoded)); + } + + @Test + public void encodeWithTypePrefixExecutionRequestsWithOneEmptyRequestList() { + final ExecutionRequests executionRequests = + new ExecutionRequestsBuilderElectra(executionRequestsSchema) + .deposits(List.of(depositRequest1, depositRequest2)) + .withdrawals(List.of()) + .consolidations(List.of(consolidationRequest1)) + .build(); + + final List encodedRequests = codec.encodeWithTypePrefix(executionRequests); + + assertThat(encodedRequests) + .containsExactly( + Bytes.concatenate(Bytes.of(DepositRequest.REQUEST_TYPE), depositRequestListEncoded), + Bytes.of(WithdrawalRequest.REQUEST_TYPE), + Bytes.concatenate( + Bytes.of(ConsolidationRequest.REQUEST_TYPE), consolidationRequestsListEncoded)); + } + + @Test + public void encodeWithTypePrefixExecutionRequestsWithAllEmptyRequestLists() { + final ExecutionRequests executionRequests = + new ExecutionRequestsBuilderElectra(executionRequestsSchema) + .deposits(List.of()) + .withdrawals(List.of()) + .consolidations(List.of()) + .build(); + + final List encodedRequests = codec.encodeWithTypePrefix(executionRequests); + + assertThat(encodedRequests) + .containsExactly( + Bytes.of(DepositRequest.REQUEST_TYPE), + Bytes.of(WithdrawalRequest.REQUEST_TYPE), + Bytes.of(ConsolidationRequest.REQUEST_TYPE)); + } + + @Test + public void hashExecutionRequests() { + // Previously known hash of the encoded execution requests + final Bytes expectedHash = + Bytes.fromHexString("0xc0ff01be6ca468a08f1f5fb1dc83b3d92cc782b47ee567bcf17f925e73ff9c00"); + final ExecutionRequests executionRequests = + new ExecutionRequestsBuilderElectra(executionRequestsSchema) + .deposits(List.of(depositRequest1, depositRequest2)) + .withdrawals(List.of(withdrawalRequest1, withdrawalRequest2)) + .consolidations(List.of(consolidationRequest1)) + .build(); + + // Hash will only match if elements and order are correct + assertThat(codec.hash(executionRequests)).isEqualTo(expectedHash); + } + + @Test + public void hashExecutionRequestsWithAllEmptyRequestLists() { + // Previously known hash of the encoded execution requests + final Bytes expectedHash = + Bytes.fromHexString("0x6036c41849da9c076ed79654d434017387a88fb833c2856b32e18218b3341c5f"); + final ExecutionRequests executionRequests = + new ExecutionRequestsBuilderElectra(executionRequestsSchema) + .deposits(List.of()) + .withdrawals(List.of()) + .consolidations(List.of()) + .build(); + + // Hash will only match if elements and order are correct + assertThat(codec.hash(executionRequests)).isEqualTo(expectedHash); + } + + // Examples taken from + // https://github.com/ethereum/execution-apis/blob/main/src/engine/openrpc/methods/payload.yaml + private final Bytes depositRequestListEncoded = + Bytes.fromHexString( + "0x96a96086cff07df17668f35f7418ef8798079167e3f4f9b72ecde17b28226137cf454ab1dd20ef5d924786ab3483c2f9003f5102dabe0a27b1746098d1dc17a5d3fbd478759fea9287e4e419b3c3cef20100000000000000b1acdb2c4d3df3f1b8d3bfd33421660df358d84d78d16c4603551935f4b67643373e7eb63dcb16ec359be0ec41fee33b03a16e80745f2374ff1d3c352508ac5d857c6476d3c3bcf7e6ca37427c9209f17be3af5264c0e2132b3dd1156c28b4e9f000000000000000a5c85a60ba2905c215f6a12872e62b1ee037051364244043a5f639aa81b04a204c55e7cc851f29c7c183be253ea1510b001db70c485b6264692f26b8aeaab5b0c384180df8e2184a21a808a3ec8e86ca01000000000000009561731785b48cf1886412234531e4940064584463e96ac63a1a154320227e333fb51addc4a89b7e0d3f862d7c1fd4ea03bd8eb3d8806f1e7daf591cbbbb92b0beb74d13c01617f22c5026b4f9f9f294a8a7c32db895de3b01bee0132c9209e1f100000000000000"); + + private final DepositRequest depositRequest1 = + new DepositRequest( + (DepositRequestSchema) + executionRequestsSchema.getDepositRequestsSchema().getElementSchema(), + BLSPublicKey.fromHexString( + "0x96a96086cff07df17668f35f7418ef8798079167e3f4f9b72ecde17b28226137cf454ab1dd20ef5d924786ab3483c2f9"), + Bytes32.fromHexString( + "0x003f5102dabe0a27b1746098d1dc17a5d3fbd478759fea9287e4e419b3c3cef2"), + UInt64.valueOf(1L), + BLSSignature.fromBytesCompressed( + Bytes.fromHexString( + "0xb1acdb2c4d3df3f1b8d3bfd33421660df358d84d78d16c4603551935f4b67643373e7eb63dcb16ec359be0ec41fee33b03a16e80745f2374ff1d3c352508ac5d857c6476d3c3bcf7e6ca37427c9209f17be3af5264c0e2132b3dd1156c28b4e9")), + UInt64.valueOf(240L)); + + private final DepositRequest depositRequest2 = + new DepositRequest( + (DepositRequestSchema) + executionRequestsSchema.getDepositRequestsSchema().getElementSchema(), + BLSPublicKey.fromHexString( + "0xa5c85a60ba2905c215f6a12872e62b1ee037051364244043a5f639aa81b04a204c55e7cc851f29c7c183be253ea1510b"), + Bytes32.fromHexString( + "0x001db70c485b6264692f26b8aeaab5b0c384180df8e2184a21a808a3ec8e86ca"), + UInt64.valueOf(1L), + BLSSignature.fromBytesCompressed( + Bytes.fromHexString( + "0x9561731785b48cf1886412234531e4940064584463e96ac63a1a154320227e333fb51addc4a89b7e0d3f862d7c1fd4ea03bd8eb3d8806f1e7daf591cbbbb92b0beb74d13c01617f22c5026b4f9f9f294a8a7c32db895de3b01bee0132c9209e1")), + UInt64.valueOf(241L)); + + private final Bytes withdrawalRequestsListEncoded = + Bytes.fromHexString( + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d0000000000000000000000000000000000000000000000000000010f698daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a75530100000000000000"); + + private final WithdrawalRequest withdrawalRequest1 = + new WithdrawalRequest( + (WithdrawalRequestSchema) + executionRequestsSchema.getWithdrawalRequestsSchema().getElementSchema(), + Bytes20.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), + BLSPublicKey.fromHexString( + "0x85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d0"), + UInt64.valueOf(0L)); + + private final WithdrawalRequest withdrawalRequest2 = + new WithdrawalRequest( + (WithdrawalRequestSchema) + executionRequestsSchema.getWithdrawalRequestsSchema().getElementSchema(), + Bytes20.fromHexString("0x00000000000000000000000000000000000010f6"), + BLSPublicKey.fromHexString( + "0x98daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a7553"), + UInt64.valueOf(1L)); + + private final Bytes consolidationRequestsListEncoded = + Bytes.fromHexString( + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d098daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a7553"); + + private final ConsolidationRequest consolidationRequest1 = + new ConsolidationRequest( + (ConsolidationRequestSchema) + executionRequestsSchema.getConsolidationRequestsSchema().getElementSchema(), + Bytes20.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), + BLSPublicKey.fromHexString( + "0x85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d0"), + BLSPublicKey.fromHexString( + "0x98daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a7553")); +} diff --git a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/signatures/LocalSignerTest.java b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/signatures/LocalSignerTest.java index 195e1d1f462..3ed9e55604a 100644 --- a/ethereum/spec/src/test/java/tech/pegasys/teku/spec/signatures/LocalSignerTest.java +++ b/ethereum/spec/src/test/java/tech/pegasys/teku/spec/signatures/LocalSignerTest.java @@ -54,7 +54,7 @@ public void shouldSignBlock() { final BLSSignature expectedSignature = BLSSignature.fromBytesCompressed( Bytes.fromBase64String( - "tzy2fjURj5j6JeLMY9fkxM0c2tgckaaes7bg/9domU1M8AihZQ8scauaSiho5sSpA+39ACF5TRzp9P9wUW2X94Gqn/RfyGJCKgJu6L6Iwe1SQfVV4ProlvI+t2cyc8Cl")); + "pbSSuf7h70JkzI/U157flTWPZDuaBXgRLj1HLMoCwjA4Xd0hMdGewn7G2HLZiQcNC9G6FSd1+0BT5PwknYez4ya6TccwpaGnsvWYLPf3SNIX5Ug7Yi1CF1fvEr3x9sZ0")); final SafeFuture result = signer.signBlock(block, fork); asyncRunner.executeQueuedActions(); diff --git a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlobSidecarManager.java b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlobSidecarManager.java index 28acadd8854..bbef20f067c 100644 --- a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlobSidecarManager.java +++ b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlobSidecarManager.java @@ -69,6 +69,8 @@ SafeFuture validateAndPrepareForBlockImport( boolean isAvailabilityRequiredAtSlot(UInt64 slot); + AvailabilityChecker createAvailabilityChecker(SignedBeaconBlock block); + DataAndValidationResult createAvailabilityCheckerAndValidateImmediately( SignedBeaconBlock block, List blobSidecars); @@ -78,6 +80,7 @@ interface ReceivedBlobSidecarListener { enum RemoteOrigin { RPC, - GOSSIP + GOSSIP, + LOCAL_EL } } diff --git a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlockBlobSidecarsTracker.java b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlockBlobSidecarsTracker.java index 78e1fd5db92..721211524f3 100644 --- a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlockBlobSidecarsTracker.java +++ b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/BlockBlobSidecarsTracker.java @@ -42,7 +42,8 @@ public class BlockBlobSidecarsTracker { private static final Logger LOG = LogManager.getLogger(); private static final UInt64 CREATION_TIMING_IDX = UInt64.MAX_VALUE; private static final UInt64 BLOCK_ARRIVAL_TIMING_IDX = CREATION_TIMING_IDX.decrement(); - private static final UInt64 FETCH_TIMING_IDX = BLOCK_ARRIVAL_TIMING_IDX.decrement(); + private static final UInt64 RPC_FETCH_TIMING_IDX = BLOCK_ARRIVAL_TIMING_IDX.decrement(); + private static final UInt64 LOCAL_EL_FETCH_TIMING_IDX = RPC_FETCH_TIMING_IDX.decrement(); private final SlotAndBlockRoot slotAndBlockRoot; private final UInt64 maxBlobsPerBlock; @@ -55,7 +56,8 @@ public class BlockBlobSidecarsTracker { private final NavigableMap blobSidecars = new ConcurrentSkipListMap<>(); private final SafeFuture blobSidecarsComplete = new SafeFuture<>(); - private volatile boolean fetchTriggered = false; + private volatile boolean rpcFetchTriggered = false; + private volatile boolean localElFetchTriggered = false; private final Optional> maybeDebugTimings; @@ -245,14 +247,24 @@ public boolean isCompleted() { return blobSidecarsComplete.isDone(); } - public boolean isFetchTriggered() { - return fetchTriggered; + public boolean isRpcFetchTriggered() { + return rpcFetchTriggered; } - public void setFetchTriggered() { - this.fetchTriggered = true; + public void setRpcFetchTriggered() { + this.rpcFetchTriggered = true; maybeDebugTimings.ifPresent( - debugTimings -> debugTimings.put(FETCH_TIMING_IDX, System.currentTimeMillis())); + debugTimings -> debugTimings.put(RPC_FETCH_TIMING_IDX, System.currentTimeMillis())); + } + + public boolean isLocalElFetchTriggered() { + return localElFetchTriggered; + } + + public void setLocalElFetchTriggered() { + this.localElFetchTriggered = true; + maybeDebugTimings.ifPresent( + debugTimings -> debugTimings.put(LOCAL_EL_FETCH_TIMING_IDX, System.currentTimeMillis())); } private boolean areBlobsComplete() { @@ -303,13 +315,22 @@ private void printDebugTimings(final Map debugTimings) { .append(debugTimings.getOrDefault(BLOCK_ARRIVAL_TIMING_IDX, 0L) - creationTime) .append("ms - "); - if (debugTimings.containsKey(FETCH_TIMING_IDX)) { + if (debugTimings.containsKey(LOCAL_EL_FETCH_TIMING_IDX)) { + timingsReport + .append("Local EL fetch delay ") + .append(debugTimings.get(LOCAL_EL_FETCH_TIMING_IDX) - creationTime) + .append("ms - "); + } else { + timingsReport.append("Local EL fetch wasn't required - "); + } + + if (debugTimings.containsKey(RPC_FETCH_TIMING_IDX)) { timingsReport - .append("Fetch delay ") - .append(debugTimings.get(FETCH_TIMING_IDX) - creationTime) + .append("RPC fetch delay ") + .append(debugTimings.get(RPC_FETCH_TIMING_IDX) - creationTime) .append("ms"); } else { - timingsReport.append("Fetch wasn't required"); + timingsReport.append("RPC fetch wasn't required"); } LOG.debug(timingsReport.toString()); @@ -321,7 +342,8 @@ public String toString() { .add("slotAndBlockRoot", slotAndBlockRoot) .add("isBlockPresent", block.get().isPresent()) .add("isCompleted", isCompleted()) - .add("fetchTriggered", fetchTriggered) + .add("rpcFetchTriggered", rpcFetchTriggered) + .add("localElFetchTriggered", localElFetchTriggered) .add("blockImportOnCompletionEnabled", blockImportOnCompletionEnabled.get()) .add( "blobSidecars", diff --git a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImpl.java b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImpl.java index f04cce344bb..1fce18dd2aa 100644 --- a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImpl.java +++ b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImpl.java @@ -13,7 +13,9 @@ package tech.pegasys.teku.statetransition.util; +import static com.google.common.base.Preconditions.checkArgument; import static tech.pegasys.teku.infrastructure.time.TimeUtilities.secondsToMillis; +import static tech.pegasys.teku.statetransition.blobs.BlobSidecarManager.RemoteOrigin.LOCAL_EL; import com.google.common.annotations.VisibleForTesting; import java.time.Duration; @@ -26,29 +28,43 @@ import java.util.Set; import java.util.TreeSet; import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.tuweni.bytes.Bytes32; import org.hyperledger.besu.plugin.services.metrics.Counter; import org.hyperledger.besu.plugin.services.metrics.LabelledMetric; import tech.pegasys.teku.infrastructure.async.AsyncRunner; +import tech.pegasys.teku.infrastructure.async.SafeFuture; import tech.pegasys.teku.infrastructure.metrics.SettableLabelledGauge; +import tech.pegasys.teku.infrastructure.ssz.SszList; import tech.pegasys.teku.infrastructure.subscribers.Subscribers; import tech.pegasys.teku.infrastructure.time.TimeProvider; import tech.pegasys.teku.infrastructure.unsigned.UInt64; import tech.pegasys.teku.spec.Spec; -import tech.pegasys.teku.spec.SpecMilestone; +import tech.pegasys.teku.spec.SpecVersion; import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecar; +import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecarSchema; import tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock; +import tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlockHeader; import tech.pegasys.teku.spec.datastructures.blocks.SlotAndBlockRoot; +import tech.pegasys.teku.spec.datastructures.blocks.blockbody.versions.deneb.BeaconBlockBodyDeneb; +import tech.pegasys.teku.spec.datastructures.execution.BlobAndProof; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.BlobIdentifier; +import tech.pegasys.teku.spec.datastructures.type.SszKZGCommitment; +import tech.pegasys.teku.spec.datastructures.type.SszKZGProof; +import tech.pegasys.teku.spec.executionlayer.ExecutionLayerChannel; +import tech.pegasys.teku.spec.logic.versions.deneb.helpers.MiscHelpersDeneb; +import tech.pegasys.teku.spec.logic.versions.deneb.types.VersionedHash; import tech.pegasys.teku.statetransition.blobs.BlobSidecarManager.RemoteOrigin; import tech.pegasys.teku.statetransition.blobs.BlockBlobSidecarsTracker; import tech.pegasys.teku.statetransition.blobs.BlockBlobSidecarsTrackerFactory; import tech.pegasys.teku.statetransition.blobs.BlockBlobSidecarsTrackersPool; import tech.pegasys.teku.statetransition.block.BlockImportChannel; +import tech.pegasys.teku.statetransition.validation.BlobSidecarGossipValidator; import tech.pegasys.teku.storage.client.RecentChainData; public class BlockBlobSidecarsTrackersPoolImpl extends AbstractIgnoringFutureHistoricalSlot @@ -59,11 +75,14 @@ public class BlockBlobSidecarsTrackersPoolImpl extends AbstractIgnoringFutureHis static final String COUNTER_SIDECAR_TYPE = "blob_sidecar"; static final String COUNTER_GOSSIP_SUBTYPE = "gossip"; + static final String COUNTER_LOCAL_EL_SUBTYPE = "local_el"; static final String COUNTER_RPC_SUBTYPE = "rpc"; static final String COUNTER_GOSSIP_DUPLICATE_SUBTYPE = "gossip_duplicate"; static final String COUNTER_RPC_DUPLICATE_SUBTYPE = "rpc_duplicate"; + static final String COUNTER_LOCAL_EL_DUPLICATE_SUBTYPE = "local_el_duplicate"; static final String COUNTER_RPC_FETCH_SUBTYPE = "rpc_fetch"; + static final String COUNTER_LOCAL_EL_FETCH_SUBTYPE = "local_el_fetch"; static final String GAUGE_BLOB_SIDECARS_LABEL = "blob_sidecars"; static final String GAUGE_BLOB_SIDECARS_TRACKERS_LABEL = "blob_sidecars_trackers"; @@ -80,6 +99,9 @@ public class BlockBlobSidecarsTrackersPoolImpl extends AbstractIgnoringFutureHis private final TimeProvider timeProvider; private final AsyncRunner asyncRunner; private final RecentChainData recentChainData; + private final ExecutionLayerChannel executionLayer; + private final Supplier gossipValidatorSupplier; + private final Consumer blobSidecarGossipPublisher; private final int maxTrackers; private final BlockBlobSidecarsTrackerFactory trackerFactory; @@ -109,6 +131,9 @@ public class BlockBlobSidecarsTrackersPoolImpl extends AbstractIgnoringFutureHis final TimeProvider timeProvider, final AsyncRunner asyncRunner, final RecentChainData recentChainData, + final ExecutionLayerChannel executionLayer, + final Supplier gossipValidatorSupplier, + final Consumer blobSidecarGossipPublisher, final UInt64 historicalSlotTolerance, final UInt64 futureSlotTolerance, final int maxTrackers) { @@ -118,6 +143,9 @@ public class BlockBlobSidecarsTrackersPoolImpl extends AbstractIgnoringFutureHis this.timeProvider = timeProvider; this.asyncRunner = asyncRunner; this.recentChainData = recentChainData; + this.executionLayer = executionLayer; + this.gossipValidatorSupplier = gossipValidatorSupplier; + this.blobSidecarGossipPublisher = blobSidecarGossipPublisher; this.maxTrackers = maxTrackers; this.sizeGauge = sizeGauge; this.poolStatsCounters = poolStatsCounters; @@ -135,6 +163,9 @@ public class BlockBlobSidecarsTrackersPoolImpl extends AbstractIgnoringFutureHis final TimeProvider timeProvider, final AsyncRunner asyncRunner, final RecentChainData recentChainData, + final ExecutionLayerChannel executionLayer, + final Supplier gossipValidatorSupplier, + final Consumer blobSidecarGossipPublisher, final UInt64 historicalSlotTolerance, final UInt64 futureSlotTolerance, final int maxTrackers, @@ -145,6 +176,9 @@ public class BlockBlobSidecarsTrackersPoolImpl extends AbstractIgnoringFutureHis this.timeProvider = timeProvider; this.asyncRunner = asyncRunner; this.recentChainData = recentChainData; + this.executionLayer = executionLayer; + this.gossipValidatorSupplier = gossipValidatorSupplier; + this.blobSidecarGossipPublisher = blobSidecarGossipPublisher; this.maxTrackers = maxTrackers; this.sizeGauge = sizeGauge; this.poolStatsCounters = poolStatsCounters; @@ -197,6 +231,9 @@ public synchronized void onNewBlobSidecar( sizeGauge.set(++totalBlobSidecars, GAUGE_BLOB_SIDECARS_LABEL); countBlobSidecar(remoteOrigin); newBlobSidecarSubscribers.deliver(NewBlobSidecarSubscriber::onNewBlobSidecar, blobSidecar); + if (remoteOrigin.equals(LOCAL_EL) && slotAndBlockRoot.getSlot().equals(getCurrentSlot())) { + publishRecoveredBlobSidecar(blobSidecar); + } } else { countDuplicateBlobSidecar(remoteOrigin); } @@ -206,10 +243,18 @@ public synchronized void onNewBlobSidecar( } } + private void publishRecoveredBlobSidecar(final BlobSidecar blobSidecar) { + LOG.debug("Publishing recovered blob sidecar {}", blobSidecar::toLogString); + gossipValidatorSupplier.get().markForEquivocation(blobSidecar); + blobSidecarGossipPublisher.accept(blobSidecar); + } + private void countBlobSidecar(final RemoteOrigin origin) { switch (origin) { case RPC -> poolStatsCounters.labels(COUNTER_SIDECAR_TYPE, COUNTER_RPC_SUBTYPE).inc(); case GOSSIP -> poolStatsCounters.labels(COUNTER_SIDECAR_TYPE, COUNTER_GOSSIP_SUBTYPE).inc(); + case LOCAL_EL -> + poolStatsCounters.labels(COUNTER_SIDECAR_TYPE, COUNTER_LOCAL_EL_SUBTYPE).inc(); } } @@ -219,6 +264,8 @@ private void countDuplicateBlobSidecar(final RemoteOrigin origin) { poolStatsCounters.labels(COUNTER_SIDECAR_TYPE, COUNTER_RPC_DUPLICATE_SUBTYPE).inc(); case GOSSIP -> poolStatsCounters.labels(COUNTER_SIDECAR_TYPE, COUNTER_GOSSIP_DUPLICATE_SUBTYPE).inc(); + case LOCAL_EL -> + poolStatsCounters.labels(COUNTER_SIDECAR_TYPE, COUNTER_LOCAL_EL_DUPLICATE_SUBTYPE).inc(); } } @@ -228,9 +275,6 @@ public synchronized void onNewBlock( if (block.getMessage().getBody().toVersionDeneb().isEmpty()) { return; } - if (spec.atSlot(block.getSlot()).getMilestone().isGreaterThanOrEqualTo(SpecMilestone.ELECTRA)) { - return; - } if (recentChainData.containsBlock(block.getRoot())) { return; } @@ -435,7 +479,7 @@ private BlockBlobSidecarsTracker internalOnNewBlock( countBlock(remoteOrigin); - if (existingTracker.isFetchTriggered()) { + if (existingTracker.isRpcFetchTriggered()) { // block has been set for the first time and we previously triggered fetching of // missing blobSidecars. So we may have requested to fetch more sidecars // than the block actually requires. Let's drop them. @@ -446,6 +490,17 @@ private BlockBlobSidecarsTracker internalOnNewBlock( requiredBlobSidecarDroppedSubscribers.deliver( RequiredBlobSidecarDroppedSubscriber::onRequiredBlobSidecarDropped, blobIdentifier)); + + // if we attempted to fetch via RPC, we missed the opportunity to complete the + // tracker via local EL (local El fetch requires the block to be known) + // Let's try now + if (!existingTracker.isLocalElFetchTriggered() && !existingTracker.isCompleted()) { + fetchMissingContentFromLocalEL(slotAndBlockRoot) + .finish( + error -> + LOG.error( + "An occurred while attempting to fetch blobs via local EL")); + } } }); @@ -463,6 +518,7 @@ private void countBlock(final Optional maybeRemoteOrigin) { case RPC -> poolStatsCounters.labels(COUNTER_BLOCK_TYPE, COUNTER_RPC_SUBTYPE).inc(); case GOSSIP -> poolStatsCounters.labels(COUNTER_BLOCK_TYPE, COUNTER_GOSSIP_SUBTYPE).inc(); + case LOCAL_EL -> {} // only possible for blobs } }); } @@ -477,6 +533,7 @@ private void countDuplicateBlock(final Optional maybeRemoteOrigin) poolStatsCounters .labels(COUNTER_BLOCK_TYPE, COUNTER_GOSSIP_DUPLICATE_SUBTYPE) .inc(); + case LOCAL_EL -> {} // only possible for blobs } }); } @@ -512,8 +569,19 @@ private void onFirstSeen(final SlotAndBlockRoot slotAndBlockRoot) { final Duration fetchDelay = calculateFetchDelay(slotAndBlockRoot); asyncRunner - .runAfterDelay(() -> this.fetchMissingContent(slotAndBlockRoot), fetchDelay) - .ifExceptionGetsHereRaiseABug(); + .runAfterDelay( + () -> + this.fetchMissingContentFromLocalEL(slotAndBlockRoot) + .handleException( + error -> + LOG.warn( + "Local EL blobs lookup failed: {}", + ExceptionUtils.getMessage(error))) + .thenRun(() -> this.fetchMissingContentFromRemotePeers(slotAndBlockRoot)), + fetchDelay) + .finish( + error -> + LOG.error("An error occurred while attempting to fetch missing blobs.", error)); } @VisibleForTesting @@ -547,7 +615,115 @@ Duration calculateFetchDelay(final SlotAndBlockRoot slotAndBlockRoot) { return Duration.ofMillis(finalTime.minus(nowMillis).intValue()); } - private synchronized void fetchMissingContent(final SlotAndBlockRoot slotAndBlockRoot) { + private synchronized SafeFuture fetchMissingContentFromLocalEL( + final SlotAndBlockRoot slotAndBlockRoot) { + final BlockBlobSidecarsTracker blockBlobSidecarsTracker = + blockBlobSidecarsTrackers.get(slotAndBlockRoot.getBlockRoot()); + + if (blockBlobSidecarsTracker == null) { + return SafeFuture.COMPLETE; + } + + if (blockBlobSidecarsTracker.isCompleted()) { + return SafeFuture.COMPLETE; + } + + if (blockBlobSidecarsTracker.getBlock().isEmpty()) { + return SafeFuture.COMPLETE; + } + + blockBlobSidecarsTracker.setLocalElFetchTriggered(); + + final SpecVersion specVersion = spec.atSlot(slotAndBlockRoot.getSlot()); + final BlobSidecarSchema blobSidecarSchema = + specVersion.getSchemaDefinitions().toVersionDeneb().orElseThrow().getBlobSidecarSchema(); + final MiscHelpersDeneb miscHelpersDeneb = + specVersion.miscHelpers().toVersionDeneb().orElseThrow(); + final SignedBeaconBlockHeader signedBeaconBlockHeader = + blockBlobSidecarsTracker.getBlock().get().asHeader(); + final BeaconBlockBodyDeneb beaconBlockBodyDeneb = + blockBlobSidecarsTracker + .getBlock() + .get() + .getMessage() + .getBody() + .toVersionDeneb() + .orElseThrow(); + + final SszList sszKZGCommitments = + beaconBlockBodyDeneb.getBlobKzgCommitments(); + + final List missingBlobsIdentifiers = + blockBlobSidecarsTracker.getMissingBlobSidecars().toList(); + + final List versionedHashes = + missingBlobsIdentifiers.stream() + .map( + blobIdentifier -> + miscHelpersDeneb.kzgCommitmentToVersionedHash( + sszKZGCommitments + .get(blobIdentifier.getIndex().intValue()) + .getKZGCommitment())) + .toList(); + + poolStatsCounters + .labels(COUNTER_SIDECAR_TYPE, COUNTER_LOCAL_EL_FETCH_SUBTYPE) + .inc(versionedHashes.size()); + + return executionLayer + .engineGetBlobs(versionedHashes, slotAndBlockRoot.getSlot()) + .thenAccept( + blobAndProofs -> { + checkArgument( + blobAndProofs.size() == versionedHashes.size(), + "Queried %s versionedHashed but got %s blobAndProofs", + versionedHashes.size(), + blobAndProofs.size()); + + for (int index = 0; index < blobAndProofs.size(); index++) { + final Optional blobAndProof = blobAndProofs.get(index); + if (blobAndProof.isEmpty()) { + LOG.trace("Blob not found on local EL: {}", missingBlobsIdentifiers.get(index)); + continue; + } + + final BlobSidecar blobSidecar = + createBlobSidecarFromBlobAndProof( + blobSidecarSchema, + miscHelpersDeneb, + missingBlobsIdentifiers.get(index), + blobAndProof.get(), + beaconBlockBodyDeneb, + signedBeaconBlockHeader); + + onNewBlobSidecar(blobSidecar, LOCAL_EL); + } + }); + } + + private BlobSidecar createBlobSidecarFromBlobAndProof( + final BlobSidecarSchema blobSidecarSchema, + final MiscHelpersDeneb miscHelpersDeneb, + final BlobIdentifier blobIdentifier, + final BlobAndProof blobAndProof, + final BeaconBlockBodyDeneb beaconBlockBodyDeneb, + final SignedBeaconBlockHeader signedBeaconBlockHeader) { + + final SszKZGCommitment sszKZGCommitment = + beaconBlockBodyDeneb.getBlobKzgCommitments().get(blobIdentifier.getIndex().intValue()); + + return blobSidecarSchema.create( + blobIdentifier.getIndex(), + blobAndProof.blob(), + sszKZGCommitment, + new SszKZGProof(blobAndProof.proof()), + signedBeaconBlockHeader, + miscHelpersDeneb.computeKzgCommitmentInclusionProof( + blobIdentifier.getIndex(), beaconBlockBodyDeneb)); + } + + private synchronized void fetchMissingContentFromRemotePeers( + final SlotAndBlockRoot slotAndBlockRoot) { final BlockBlobSidecarsTracker blockBlobSidecarsTracker = blockBlobSidecarsTrackers.get(slotAndBlockRoot.getBlockRoot()); @@ -559,7 +735,7 @@ private synchronized void fetchMissingContent(final SlotAndBlockRoot slotAndBloc return; } - blockBlobSidecarsTracker.setFetchTriggered(); + blockBlobSidecarsTracker.setRpcFetchTriggered(); if (blockBlobSidecarsTracker.getBlock().isEmpty()) { poolStatsCounters.labels(COUNTER_BLOCK_TYPE, COUNTER_RPC_FETCH_SUBTYPE).inc(); @@ -580,7 +756,7 @@ private synchronized void fetchMissingContent(final SlotAndBlockRoot slotAndBloc private void dropMissingContent(final BlockBlobSidecarsTracker blockBlobSidecarsTracker) { - if (!blockBlobSidecarsTracker.isFetchTriggered()) { + if (!blockBlobSidecarsTracker.isRpcFetchTriggered()) { return; } diff --git a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/PoolFactory.java b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/PoolFactory.java index 2978ddce72c..b97236c4c39 100644 --- a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/PoolFactory.java +++ b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/util/PoolFactory.java @@ -15,6 +15,8 @@ import com.google.common.annotations.VisibleForTesting; import java.util.Collections; +import java.util.function.Consumer; +import java.util.function.Supplier; import org.hyperledger.besu.plugin.services.MetricsSystem; import org.hyperledger.besu.plugin.services.metrics.Counter; import org.hyperledger.besu.plugin.services.metrics.LabelledMetric; @@ -25,9 +27,12 @@ import tech.pegasys.teku.infrastructure.unsigned.UInt64; import tech.pegasys.teku.spec.Spec; import tech.pegasys.teku.spec.datastructures.attestation.ValidatableAttestation; +import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecar; import tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock; +import tech.pegasys.teku.spec.executionlayer.ExecutionLayerChannel; import tech.pegasys.teku.statetransition.blobs.BlockBlobSidecarsTrackerFactory; import tech.pegasys.teku.statetransition.block.BlockImportChannel; +import tech.pegasys.teku.statetransition.validation.BlobSidecarGossipValidator; import tech.pegasys.teku.storage.client.RecentChainData; public class PoolFactory { @@ -112,13 +117,19 @@ public BlockBlobSidecarsTrackersPoolImpl createPoolForBlockBlobSidecarsTrackers( final Spec spec, final TimeProvider timeProvider, final AsyncRunner asyncRunner, - final RecentChainData recentChainData) { + final RecentChainData recentChainData, + final ExecutionLayerChannel executionLayer, + final Supplier gossipValidatorSupplier, + final Consumer blobSidecarGossipPublisher) { return createPoolForBlockBlobSidecarsTrackers( blockImportChannel, spec, timeProvider, asyncRunner, recentChainData, + executionLayer, + gossipValidatorSupplier, + blobSidecarGossipPublisher, DEFAULT_HISTORICAL_SLOT_TOLERANCE, FutureItems.DEFAULT_FUTURE_SLOT_TOLERANCE, DEFAULT_MAX_BLOCKS); @@ -130,6 +141,9 @@ public BlockBlobSidecarsTrackersPoolImpl createPoolForBlockBlobSidecarsTrackers( final TimeProvider timeProvider, final AsyncRunner asyncRunner, final RecentChainData recentChainData, + final ExecutionLayerChannel executionLayer, + final Supplier gossipValidatorSupplier, + final Consumer blobSidecarGossipPublisher, final UInt64 historicalBlockTolerance, final UInt64 futureBlockTolerance, final int maxTrackers) { @@ -141,6 +155,9 @@ public BlockBlobSidecarsTrackersPoolImpl createPoolForBlockBlobSidecarsTrackers( timeProvider, asyncRunner, recentChainData, + executionLayer, + gossipValidatorSupplier, + blobSidecarGossipPublisher, historicalBlockTolerance, futureBlockTolerance, maxTrackers); @@ -153,6 +170,9 @@ BlockBlobSidecarsTrackersPoolImpl createPoolForBlockBlobSidecarsTrackers( final TimeProvider timeProvider, final AsyncRunner asyncRunner, final RecentChainData recentChainData, + final ExecutionLayerChannel executionLayer, + final Supplier gossipValidatorSupplier, + final Consumer blobSidecarGossipPublisher, final UInt64 historicalBlockTolerance, final UInt64 futureBlockTolerance, final int maxItems, @@ -165,6 +185,9 @@ BlockBlobSidecarsTrackersPoolImpl createPoolForBlockBlobSidecarsTrackers( timeProvider, asyncRunner, recentChainData, + executionLayer, + gossipValidatorSupplier, + blobSidecarGossipPublisher, historicalBlockTolerance, futureBlockTolerance, maxItems, diff --git a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidator.java b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidator.java index e64df5a44f9..685dc1bfc9a 100644 --- a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidator.java +++ b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidator.java @@ -262,11 +262,7 @@ public SafeFuture validate(final BlobSidecar blobSidec * [IGNORE] The sidecar is the first sidecar for the tuple (block_header.slot, block_header.proposer_index, blob_sidecar.index) * with valid header signature, sidecar inclusion proof, and kzg proof. */ - if (!receivedValidBlobSidecarInfoSet.add( - new SlotProposerIndexAndBlobIndex( - blockHeader.getSlot(), - blockHeader.getProposerIndex(), - blobSidecar.getIndex()))) { + if (!markForEquivocation(blockHeader, blobSidecar.getIndex())) { return ignore( "BlobSidecar is not the first valid for its slot and index. It will be dropped."); } @@ -277,6 +273,17 @@ public SafeFuture validate(final BlobSidecar blobSidec }); } + private boolean markForEquivocation(final BeaconBlockHeader blockHeader, final UInt64 index) { + return receivedValidBlobSidecarInfoSet.add( + new SlotProposerIndexAndBlobIndex( + blockHeader.getSlot(), blockHeader.getProposerIndex(), index)); + } + + public boolean markForEquivocation(final BlobSidecar blobSidecar) { + return markForEquivocation( + blobSidecar.getSignedBeaconBlockHeader().getMessage(), blobSidecar.getIndex()); + } + private SafeFuture validateBlobSidecarWithKnownValidHeader( final BlobSidecar blobSidecar, final BeaconBlockHeader blockHeader) { @@ -310,9 +317,7 @@ private SafeFuture validateBlobSidecarWithKnownValidHe * [IGNORE] The sidecar is the first sidecar for the tuple (block_header.slot, block_header.proposer_index, blob_sidecar.index) * with valid header signature, sidecar inclusion proof, and kzg proof. */ - if (!receivedValidBlobSidecarInfoSet.add( - new SlotProposerIndexAndBlobIndex( - blockHeader.getSlot(), blockHeader.getProposerIndex(), blobSidecar.getIndex()))) { + if (!markForEquivocation(blockHeader, blobSidecar.getIndex())) { return SafeFuture.completedFuture( ignore("BlobSidecar is not the first valid for its slot and index. It will be dropped.")); } diff --git a/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImplTest.java b/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImplTest.java index 84d671f0b16..c5417bb9efe 100644 --- a/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImplTest.java +++ b/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/util/BlockBlobSidecarsTrackersPoolImplTest.java @@ -16,6 +16,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static tech.pegasys.teku.infrastructure.async.SafeFutureAssert.assertThatSafeFuture; @@ -31,8 +33,10 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes32; import org.hyperledger.besu.metrics.ObservableMetricsSystem; @@ -41,6 +45,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import tech.pegasys.infrastructure.logging.LogCaptor; +import tech.pegasys.teku.infrastructure.async.SafeFuture; import tech.pegasys.teku.infrastructure.async.StubAsyncRunner; import tech.pegasys.teku.infrastructure.metrics.TekuMetricCategory; import tech.pegasys.teku.infrastructure.time.StubTimeProvider; @@ -50,12 +55,17 @@ import tech.pegasys.teku.spec.datastructures.blobs.versions.deneb.BlobSidecar; import tech.pegasys.teku.spec.datastructures.blocks.SignedBeaconBlock; import tech.pegasys.teku.spec.datastructures.blocks.SlotAndBlockRoot; +import tech.pegasys.teku.spec.datastructures.execution.BlobAndProof; import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.BlobIdentifier; import tech.pegasys.teku.spec.datastructures.state.Checkpoint; +import tech.pegasys.teku.spec.executionlayer.ExecutionLayerChannel; +import tech.pegasys.teku.spec.logic.versions.deneb.helpers.MiscHelpersDeneb; +import tech.pegasys.teku.spec.logic.versions.deneb.types.VersionedHash; import tech.pegasys.teku.spec.util.DataStructureUtil; import tech.pegasys.teku.statetransition.blobs.BlobSidecarManager.RemoteOrigin; import tech.pegasys.teku.statetransition.blobs.BlockBlobSidecarsTracker; import tech.pegasys.teku.statetransition.block.BlockImportChannel; +import tech.pegasys.teku.statetransition.validation.BlobSidecarGossipValidator; import tech.pegasys.teku.storage.client.RecentChainData; public class BlockBlobSidecarsTrackersPoolImplTest { @@ -68,6 +78,14 @@ public class BlockBlobSidecarsTrackersPoolImplTest { private final StubTimeProvider timeProvider = StubTimeProvider.withTimeInSeconds(0); private final StubAsyncRunner asyncRunner = new StubAsyncRunner(); private final RecentChainData recentChainData = mock(RecentChainData.class); + private final ExecutionLayerChannel executionLayer = mock(ExecutionLayerChannel.class); + + @SuppressWarnings("unchecked") + private final Consumer blobSidecarPublisher = mock(Consumer.class); + + private final BlobSidecarGossipValidator blobSidecarGossipValidator = + mock(BlobSidecarGossipValidator.class); + private final BlockImportChannel blockImportChannel = mock(BlockImportChannel.class); private final int maxItems = 15; private final BlockBlobSidecarsTrackersPoolImpl blockBlobSidecarsTrackersPool = @@ -78,6 +96,9 @@ public class BlockBlobSidecarsTrackersPoolImplTest { timeProvider, asyncRunner, recentChainData, + executionLayer, + () -> blobSidecarGossipValidator, + blobSidecarPublisher, historicalTolerance, futureTolerance, maxItems, @@ -186,6 +207,76 @@ public void onNewBlobSidecar_shouldIgnoreDuplicates() { assertBlobSidecarsTrackersCount(1); } + @Test + public void onNewBlobSidecar_shouldMarkForEquivocationAndPublishWhenOriginIsLocalEL() { + final BlobSidecar blobSidecar1 = + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader(dataStructureUtil.randomSignedBeaconBlockHeader(currentSlot)) + .build(); + final BlobSidecar blobSidecar2 = + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader(dataStructureUtil.randomSignedBeaconBlockHeader(currentSlot)) + .build(); + final BlobSidecar blobSidecar3 = + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader(dataStructureUtil.randomSignedBeaconBlockHeader(currentSlot)) + .build(); + + when(blobSidecarGossipValidator.markForEquivocation(blobSidecar1)).thenReturn(true); + + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar1, RemoteOrigin.LOCAL_EL); + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar2, RemoteOrigin.GOSSIP); + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar3, RemoteOrigin.RPC); + + assertBlobSidecarsCount(3); + assertBlobSidecarsTrackersCount(3); + + verify(blobSidecarGossipValidator).markForEquivocation(blobSidecar1); + verify(blobSidecarPublisher, times(1)).accept(blobSidecar1); + } + + @Test + public void onNewBlobSidecar_shouldPublishWhenOriginIsLocalELAndEquivocating() { + final BlobSidecar blobSidecar1 = + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader(dataStructureUtil.randomSignedBeaconBlockHeader(currentSlot)) + .build(); + + when(blobSidecarGossipValidator.markForEquivocation(blobSidecar1)).thenReturn(false); + + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar1, RemoteOrigin.LOCAL_EL); + + assertBlobSidecarsCount(1); + assertBlobSidecarsTrackersCount(1); + + verify(blobSidecarGossipValidator).markForEquivocation(blobSidecar1); + verify(blobSidecarPublisher, times(1)).accept(blobSidecar1); + } + + @Test + public void onNewBlobSidecar_shouldNotPublishWhenOriginIsLocalELIsNotCurrentSlot() { + final BlobSidecar blobSidecar1 = + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader(dataStructureUtil.randomSignedBeaconBlockHeader(currentSlot)) + .build(); + + when(blobSidecarGossipValidator.markForEquivocation(blobSidecar1)).thenReturn(false); + blockBlobSidecarsTrackersPool.onSlot(currentSlot.plus(1)); + + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar1, RemoteOrigin.LOCAL_EL); + + assertBlobSidecarsCount(1); + assertBlobSidecarsTrackersCount(1); + + verify(blobSidecarGossipValidator, never()).markForEquivocation(blobSidecar1); + verify(blobSidecarPublisher, never()).accept(blobSidecar1); + } + @Test public void onNewBlock_shouldIgnorePreDenebBlocks() { final Spec spec = TestSpecFactory.createMainnetCapella(); @@ -215,6 +306,9 @@ public void onNewBlock_shouldIgnoreEip7594Blocks() { timeProvider, asyncRunner, recentChainData, + executionLayer, + () -> blobSidecarGossipValidator, + blobSidecarPublisher, historicalTolerance, futureTolerance, maxItems, @@ -402,7 +496,7 @@ public void onCompletedBlockAndBlobSidecars_shouldCreateTrackerIgnoringHistorica assertThat(blockBlobSidecarsTracker.getBlobSidecars().values()) .containsExactlyInAnyOrderElementsOf(blobSidecars); assertThat(blockBlobSidecarsTracker.getBlock()).isPresent(); - assertThat(blockBlobSidecarsTracker.isFetchTriggered()).isFalse(); + assertThat(blockBlobSidecarsTracker.isRpcFetchTriggered()).isFalse(); assertThatSafeFuture(blockBlobSidecarsTracker.getCompletionFuture()).isCompleted(); assertBlobSidecarsCount(blobSidecars.size()); @@ -432,7 +526,7 @@ public void onCompletedBlockAndBlobSidecars_shouldNotTriggerFetch() { assertThat(blockBlobSidecarsTracker.getBlobSidecars().values()) .containsExactlyInAnyOrderElementsOf(blobSidecars); assertThat(blockBlobSidecarsTracker.getBlock()).isPresent(); - assertThat(blockBlobSidecarsTracker.isFetchTriggered()).isFalse(); + assertThat(blockBlobSidecarsTracker.isRpcFetchTriggered()).isFalse(); assertThatSafeFuture(blockBlobSidecarsTracker.getCompletionFuture()).isNotCompleted(); assertBlobSidecarsCount(0); @@ -450,7 +544,7 @@ public void onCompletedBlockAndBlobSidecars_shouldNotTriggerFetch() { blockBlobSidecarsTrackersPool.getOrCreateBlockBlobSidecarsTracker(block); assertThat(blockBlobSidecarsTracker.getBlock()).isPresent(); - assertThat(blockBlobSidecarsTracker.isFetchTriggered()).isFalse(); + assertThat(blockBlobSidecarsTracker.isRpcFetchTriggered()).isFalse(); assertThatSafeFuture(blockBlobSidecarsTracker.getCompletionFuture()).isNotCompleted(); assertBlobSidecarsCount(0); @@ -559,7 +653,109 @@ public void prune_finalizedBlocks() { } @Test - void shouldFetchMissingBlobSidecars() { + void shouldFetchMissingBlobSidecarsFromLocalELFirst() { + final SignedBeaconBlock block = + dataStructureUtil.randomSignedBeaconBlockWithCommitments(currentSlot, 4); + final MiscHelpersDeneb miscHelpersDeneb = + spec.getGenesisSpec().miscHelpers().toVersionDeneb().orElseThrow(); + + // lets prepare 3 missing blobs (blob index 0 present) + + final List missingBlobSidecars = + UInt64.range(UInt64.ONE, UInt64.valueOf(4)) + .map( + index -> + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader(block.asHeader()) + .index(index) + .kzgCommitment( + block + .getMessage() + .getBody() + .getOptionalBlobKzgCommitments() + .orElseThrow() + .get(index.intValue()) + .getKZGCommitment() + .getBytesCompressed()) + .kzgCommitmentInclusionProof( + miscHelpersDeneb.computeBlobKzgCommitmentInclusionProof( + index, block.getMessage().getBody())) + .build()) + .toList(); + + final Set missingBlobIdentifiers = + UInt64.range(UInt64.ONE, UInt64.valueOf(4)) + .map(index -> new BlobIdentifier(block.getRoot(), index)) + .collect(Collectors.toSet()); + + final List versionedHashes = + IntStream.range(1, 4) + .mapToObj( + index -> + miscHelpersDeneb.kzgCommitmentToVersionedHash( + missingBlobSidecars.get(index - 1).getKZGCommitment())) + .toList(); + + final BlockBlobSidecarsTracker tracker = mock(BlockBlobSidecarsTracker.class); + + mockedTrackersFactory = + Optional.of( + (slotAndRoot) -> { + when(tracker.add(any())).thenReturn(true); + when(tracker.getMissingBlobSidecars()) + .thenAnswer(__ -> missingBlobIdentifiers.stream()); + when(tracker.getBlock()).thenReturn(Optional.of(block)); + return tracker; + }); + + final SafeFuture>> engineGetBlobsResponse = new SafeFuture<>(); + + when(executionLayer.engineGetBlobs(versionedHashes, currentSlot)) + .thenReturn(engineGetBlobsResponse); + + blockBlobSidecarsTrackersPool.onNewBlock(block, Optional.empty()); + + assertThat(asyncRunner.hasDelayedActions()).isTrue(); + + asyncRunner.executeQueuedActions(); + + // no RPC requests, local el query is in flight + assertThat(requiredBlockRootEvents).isEmpty(); + assertThat(requiredBlockRootDroppedEvents).isEmpty(); + assertThat(requiredBlobSidecarEvents).isEmpty(); + assertThat(requiredBlobSidecarDroppedEvents).isEmpty(); + + // local el fetch triggered + verify(tracker).setLocalElFetchTriggered(); + + // prepare partial response of 3 blobAndProofs + final List> blobAndProofsFromEL = + IntStream.range(0, 3) + .>mapToObj( + index -> { + if (index == 1) { + // missing index 1 from EL (blob index 2) + return Optional.empty(); + } + return Optional.of( + new BlobAndProof( + missingBlobSidecars.get(index).getBlob(), + missingBlobSidecars.get(index).getKZGProof())); + }) + .toList(); + + engineGetBlobsResponse.complete(blobAndProofsFromEL); + + verify(tracker).add(missingBlobSidecars.getFirst()); // 0 + verify(tracker).add(missingBlobSidecars.getLast()); // 2 + verify(tracker, times(2)).add(any()); + + assertStats("blob_sidecar", "local_el_fetch", 3); + } + + @Test + void shouldFetchMissingBlobSidecarsViaRPCAfterLocalEL() { final SignedBeaconBlock block = dataStructureUtil.randomSignedBeaconBlock(currentSlot); final Set missingBlobs = @@ -571,17 +767,59 @@ void shouldFetchMissingBlobSidecars() { Optional.of( (slotAndRoot) -> { BlockBlobSidecarsTracker tracker = mock(BlockBlobSidecarsTracker.class); - when(tracker.getMissingBlobSidecars()).thenReturn(missingBlobs.stream()); + when(tracker.getMissingBlobSidecars()).thenAnswer(__ -> missingBlobs.stream()); when(tracker.getBlock()).thenReturn(Optional.of(block)); return tracker; }); + // prepare empty result from EL + when(executionLayer.engineGetBlobs(any(), any())) + .thenReturn(SafeFuture.completedFuture(List.of(Optional.empty(), Optional.empty()))); + blockBlobSidecarsTrackersPool.onNewBlock(block, Optional.empty()); assertThat(asyncRunner.hasDelayedActions()).isTrue(); asyncRunner.executeQueuedActions(); + verify(executionLayer).engineGetBlobs(any(), any()); + + assertThat(requiredBlockRootEvents).isEmpty(); + assertThat(requiredBlockRootDroppedEvents).isEmpty(); + assertThat(requiredBlobSidecarEvents).containsExactlyElementsOf(missingBlobs); + assertThat(requiredBlobSidecarDroppedEvents).isEmpty(); + } + + @Test + void shouldFetchMissingBlobSidecarsViaRPCWhenELLookupFails() { + final SignedBeaconBlock block = dataStructureUtil.randomSignedBeaconBlock(currentSlot); + + final Set missingBlobs = + Set.of( + new BlobIdentifier(block.getRoot(), UInt64.ONE), + new BlobIdentifier(block.getRoot(), UInt64.ZERO)); + + mockedTrackersFactory = + Optional.of( + (slotAndRoot) -> { + BlockBlobSidecarsTracker tracker = mock(BlockBlobSidecarsTracker.class); + when(tracker.getMissingBlobSidecars()).thenAnswer(__ -> missingBlobs.stream()); + when(tracker.getBlock()).thenReturn(Optional.of(block)); + return tracker; + }); + + // prepare failure from EL + when(executionLayer.engineGetBlobs(any(), any())) + .thenReturn(SafeFuture.failedFuture(new RuntimeException("oops"))); + + blockBlobSidecarsTrackersPool.onNewBlock(block, Optional.empty()); + + assertThat(asyncRunner.hasDelayedActions()).isTrue(); + + asyncRunner.executeQueuedActions(); + + verify(executionLayer).engineGetBlobs(any(), any()); + assertThat(requiredBlockRootEvents).isEmpty(); assertThat(requiredBlockRootDroppedEvents).isEmpty(); assertThat(requiredBlobSidecarEvents).containsExactlyElementsOf(missingBlobs); @@ -616,7 +854,8 @@ void shouldFetchMissingBlockAndBlobSidecars() { asyncRunner.executeQueuedActions(); - verify(mockedTracker).setFetchTriggered(); + verify(mockedTracker).setRpcFetchTriggered(); + verify(mockedTracker, never()).setLocalElFetchTriggered(); assertThat(requiredBlockRootEvents).containsExactly(block.getRoot()); assertThat(requiredBlobSidecarEvents).containsExactlyElementsOf(missingBlobs); @@ -640,7 +879,7 @@ void shouldDropBlobSidecarsThatHasBeenFetchedButNotPresentInBlock() { .index(UInt64.valueOf(2)) .build(); - final Set blobsNotUserInBlock = + final Set blobsNotPresentInBlock = Set.of( new BlobIdentifier(slotAndBlockRoot.getBlockRoot(), UInt64.valueOf(2)), new BlobIdentifier(slotAndBlockRoot.getBlockRoot(), UInt64.valueOf(3))); @@ -652,9 +891,9 @@ void shouldDropBlobSidecarsThatHasBeenFetchedButNotPresentInBlock() { when(tracker.getBlock()).thenReturn(Optional.empty()); when(tracker.getSlotAndBlockRoot()).thenReturn(slotAndBlockRoot); when(tracker.setBlock(block)).thenReturn(true); - when(tracker.isFetchTriggered()).thenReturn(true); + when(tracker.isRpcFetchTriggered()).thenReturn(true); when(tracker.getUnusedBlobSidecarsForBlock()) - .thenReturn(blobsNotUserInBlock.stream()); + .thenReturn(blobsNotPresentInBlock.stream()); return tracker; }); @@ -662,7 +901,7 @@ void shouldDropBlobSidecarsThatHasBeenFetchedButNotPresentInBlock() { blockBlobSidecarsTrackersPool.onNewBlock(block, Optional.empty()); - assertThat(requiredBlobSidecarDroppedEvents).containsExactlyElementsOf(blobsNotUserInBlock); + assertThat(requiredBlobSidecarDroppedEvents).containsExactlyElementsOf(blobsNotPresentInBlock); } @Test @@ -689,7 +928,7 @@ void shouldNotDropUnusedBlobSidecarsIfFetchingHasNotOccurred() { when(tracker.getBlock()).thenReturn(Optional.empty()); when(tracker.getSlotAndBlockRoot()).thenReturn(slotAndBlockRoot); when(tracker.setBlock(block)).thenReturn(true); - when(tracker.isFetchTriggered()).thenReturn(false); + when(tracker.isRpcFetchTriggered()).thenReturn(false); when(tracker.getUnusedBlobSidecarsForBlock()) .thenReturn(blobsNotUserInBlock.stream()); return tracker; @@ -742,7 +981,7 @@ void shouldDropPossiblyFetchedBlobSidecars() { when(tracker.getMissingBlobSidecars()).thenReturn(missingBlobs.stream()); when(tracker.getBlock()).thenReturn(Optional.of(block)); when(tracker.getSlotAndBlockRoot()).thenReturn(block.getSlotAndBlockRoot()); - when(tracker.isFetchTriggered()).thenReturn(true); + when(tracker.isRpcFetchTriggered()).thenReturn(true); return tracker; }); @@ -760,6 +999,55 @@ void shouldDropPossiblyFetchedBlobSidecars() { assertThat(requiredBlobSidecarEvents).isEmpty(); } + @Test + void shouldTryToFetchFromLocalELWhenBlockArrivesAfterRPCFetch() { + final SignedBeaconBlock block = dataStructureUtil.randomSignedBeaconBlock(currentSlot); + + final Set missingBlobs = + Set.of( + new BlobIdentifier(block.getRoot(), UInt64.ONE), + new BlobIdentifier(block.getRoot(), UInt64.ZERO)); + + final BlobSidecar blobSidecar = + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader(block.asHeader()) + .index(UInt64.valueOf(2)) + .build(); + + final BlockBlobSidecarsTracker tracker = mock(BlockBlobSidecarsTracker.class); + + mockedTrackersFactory = + Optional.of( + (slotAndRoot) -> { + when(tracker.getMissingBlobSidecars()).thenAnswer(__ -> missingBlobs.stream()); + when(tracker.getBlock()).thenReturn(Optional.empty()); + when(tracker.setBlock(any())).thenReturn(true); + when(tracker.getSlotAndBlockRoot()).thenReturn(block.getSlotAndBlockRoot()); + when(tracker.isRpcFetchTriggered()).thenReturn(true); + when(tracker.isLocalElFetchTriggered()).thenReturn(false); + return tracker; + }); + + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar, RemoteOrigin.RPC); + + assertThat(asyncRunner.hasDelayedActions()).isTrue(); + asyncRunner.executeQueuedActions(); + + verify(tracker, never()).setLocalElFetchTriggered(); + + when(tracker.getBlock()).thenReturn(Optional.of(block)); + + // prepare empty result from EL + when(executionLayer.engineGetBlobs(any(), any())) + .thenReturn(SafeFuture.completedFuture(List.of(Optional.empty(), Optional.empty()))); + + blockBlobSidecarsTrackersPool.onNewBlock(block, Optional.empty()); + + verify(tracker).setLocalElFetchTriggered(); + verify(executionLayer).engineGetBlobs(any(), any()); + } + @Test void shouldDropPossiblyFetchedBlock() { final SignedBeaconBlock signedBeaconBlock = @@ -777,7 +1065,7 @@ void shouldDropPossiblyFetchedBlock() { when(tracker.getBlock()).thenReturn(Optional.empty()); when(tracker.getSlotAndBlockRoot()) .thenReturn(signedBeaconBlock.getSlotAndBlockRoot()); - when(tracker.isFetchTriggered()).thenReturn(true); + when(tracker.isRpcFetchTriggered()).thenReturn(true); return tracker; }); @@ -812,7 +1100,7 @@ void shouldNotDropPossiblyFetchedBlockIfFetchHasNotOccurred() { when(tracker.getBlock()).thenReturn(Optional.empty()); when(tracker.getSlotAndBlockRoot()) .thenReturn(signedBeaconBlock.getSlotAndBlockRoot()); - when(tracker.isFetchTriggered()).thenReturn(false); + when(tracker.isRpcFetchTriggered()).thenReturn(false); return tracker; }); @@ -1022,6 +1310,23 @@ void stats_onNewBlobSidecar() { assertStats("blob_sidecar", "rpc", 1); assertStats("blob_sidecar", "gossip_duplicate", 1); assertStats("blob_sidecar", "rpc_duplicate", 1); + + final BlobSidecar blobSidecar3 = + dataStructureUtil + .createRandomBlobSidecarBuilder() + .signedBeaconBlockHeader( + dataStructureUtil.randomSignedBeaconBlockHeader(currentSlot.increment())) + .build(); + + // new from LOCAL_EL + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar3, RemoteOrigin.LOCAL_EL); + assertStats("blob_sidecar", "local_el", 1); + + // duplicate from LOCAL_EL + + blockBlobSidecarsTrackersPool.onNewBlobSidecar(blobSidecar3, RemoteOrigin.LOCAL_EL); + assertStats("blob_sidecar", "local_el", 1); + assertStats("blob_sidecar", "local_el_duplicate", 1); } @Test diff --git a/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidatorTest.java b/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidatorTest.java index 38f9ddc81aa..88986b5ec53 100644 --- a/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidatorTest.java +++ b/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/validation/BlobSidecarGossipValidatorTest.java @@ -13,6 +13,7 @@ package tech.pegasys.teku.statetransition.validation; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; @@ -277,6 +278,16 @@ void shouldTrackValidInfoSet() { .isCompletedWithValueMatching(InternalValidationResult::isIgnore); } + @TestTemplate + void shouldMarkForEquivocation() { + assertThat(blobSidecarValidator.markForEquivocation(blobSidecar)).isTrue(); + + assertThat(blobSidecarValidator.markForEquivocation(blobSidecar)).isFalse(); + + SafeFutureAssert.assertThatSafeFuture(blobSidecarValidator.validate(blobSidecar)) + .isCompletedWithValueMatching(InternalValidationResult::isIgnore); + } + @TestTemplate void shouldIgnoreImmediatelyWhenBlobFromValidInfoSet() { SafeFutureAssert.assertThatSafeFuture(blobSidecarValidator.validate(blobSidecar))