From c6e82e1b8f0d0a7c986ea4c2eacb23774d1ccb9f Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 15:50:42 +0200 Subject: [PATCH 01/22] unstuck snowbridge --- Cargo.lock | 4 +- Cargo.toml | 2 +- .../src/bridge_to_ethereum_unstuck.rs | 101 ++++++++++++++++++ 3 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs diff --git a/Cargo.lock b/Cargo.lock index 4cd32aa1d8..dd21d581a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13051,9 +13051,9 @@ dependencies = [ [[package]] name = "snowbridge-pallet-ethereum-client" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb89a9f375672031669fef4b2f4037cdf84dc1624ebd204c5cea839a0844bcdd" +checksum = "e41b74c0509a263bec0b86a5892d3a5fbac0084fc7f7b2e5cc523119ed91c7e3" dependencies = [ "bp-runtime", "byte-slice-cast", diff --git a/Cargo.toml b/Cargo.toml index e8b5a48b0f..d0b1797cfe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -154,7 +154,7 @@ smallvec = { version = "1.13.1" } snowbridge-beacon-primitives = { version = "0.1.0", default-features = false } snowbridge-core = { version = "0.1.1", default-features = false } snowbridge-outbound-queue-runtime-api = { version = "0.1.1", default-features = false } -snowbridge-pallet-ethereum-client = { version = "0.1.1", default-features = false } +snowbridge-pallet-ethereum-client = { version = "0.1.2", default-features = false } snowbridge-pallet-inbound-queue = { version = "0.1.1", default-features = false } snowbridge-pallet-inbound-queue-fixtures = { version = "0.9.0" } snowbridge-pallet-outbound-queue = { version = "0.1.1", default-features = false } diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs new file mode 100644 index 0000000000..7390753677 --- /dev/null +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -0,0 +1,101 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use crate::{ + weights::RocksDbWeight, Runtime, +}; +use codec::Decode; +use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; +use sp_core::H256; +use snowbridge_pallet_ethereum_client::{CurrentSyncCommittee, NextSyncCommittee, InitialCheckpointRoot, + LatestExecutionState, types::FinalizedBeaconStateBuffer, LatestFinalizedBlockRoot}; +use snowbridge_core::RingBufferMap; + +#[cfg(feature = "try-runtime")] +use sp_runtime::TryRuntimeError; +#[cfg(feature = "try-runtime")] +use sp_std::prelude::*; + +const LOG_TARGET: &str = "runtime::bridge::migration"; + +/// Last successful imported beacon header +const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); +const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = hex_literal::hex!("8866b2286167938628be9eee938d21321837025f93725f9516b30dce5f8c11fa"); + +const NEW_CHECKPOINT: [u8; 25122] = hex_literal::hex!("0x520080708a000000000001f2140000000000940aea29cc27e4c0d49ef156e437e8a11c30c80c55c04c08af82a139e1e4153110fab24f024fab4709b5c44d8e2f9b645dabe743b0fb535b9771e856b12ce3a13227d1f3b67e33bdddd0789f7eb0062f5915ac2c47150c767e5fff56552b6107b9095fea6f875454778517648e9e387aaf15cec76acf45e082f7f2fa33fedbb51a7cd7a5a2a85f97028006c832797782803fe2edbe2a3c5e2da51b1359de062de8ea7fa96f24bff84fefd7017d1e1b015b61251ba0f11007c35d6fcbead0b36ab85b4671136af19ceab86204acf823a1a6aacaddd4f9e103df36e00fd61f13baaf4bf467970f36b99c246cd546c11d61a81546818e798e438c59757cfb672f65174b8e7c5bdda7708fd74f385e1a0b14da3a9d19f1976013dd274ecd334876a58da521cf0dc61ab4f0f4efe0729f58fb40875cc752654c38c5731a3c47f255567990a768170e7ef7241593f6ece8ecf999a33c7cb7c5965d7919d6604cb4d757b71509ab9a7d44b740153f96e9ce177641e75e3977f19570e22cf79a7b5ebcf1ade0bd29448068331d4d2821dbeba946558f385a71c7834fde97379a416c1fbd74e858bf53d331b6dd09c20eae6da6f58238add7f888ff9d14e3bab0d76587d6a3263bd7087f862926cbc5d92794e7d74433d4ebd26834f3158f93b676dac18491b58a008c83086d5a313a808bc2ea87cd36093492e74a40037fe038766c6b3feaf98ee84a5fff6c1118ed6cbf98d99ab056ec1874444387337977711324e43cb9dbbf84d328876c5873bc712a83f62de509414565615ce87eb35b720607324a903708b46625788eddd9f83ba177bdefbb23fb35af2e1dbc4c3c70daa3d5d2c732ccb89aa0ca8962d9ced1ea35276b98b2af95aaf853e13b66425de03007cca28a32a948ec463498de1157e76dd6d5dd8356363c171036564cb53dea2c0c2ef4b62f872c577a6a29a8b446e2f145b00b71384b4e1d32a350e57028526c0e4031de67c3739fc815c3cfaed641b8e063608569163dd68aa8ce01e48c36314525016e04668b9df1d741cee60240701418d35992b88fe84fd018580f1d4dccdd58d280512ed0ceaba36480c84259aa3e8f7d602ca9b8f7695b1cd160796d2c1f230ff40fe69dace0e03554b2d496a787bac2a0ba72126973575be2895dc3df5a8fa3873a8a94ab9e92f37a50d9a9573a4b0e24ff55821f674f2fab99c4ece573d635b415f68237827439663ccd7157bd889b2a1af63ed81071ebdfaea91200e5602e4d8759935a333068d46c117d8e7518c0922ec8b3b04408b08d6af43909c3e1823af2ec579b5d860a790f5d21c234a3e13d64d244ed00f46af133c14ba69e113cb1945348ec8263e8fb5481c6768a38b29c75fc6635781ce2949bc08982d4b92bb9816154527903ee9968f27f0e7383fc83a3fba2e1eca9c79194cfffe6e57cdd84ac6094ff45f44e14091ea8d769b8f0f25c60b719c97ee7635835ec401dcaebb060a4eb891594add14fa0be6861f6eafe684618bb55147deff21dcf65c1c8e155e25a84a2a15f1a8e1b9ed26c58dc069028366d2a5fbe8d4d8ec6ea90f0735970b633f371bfcb3cdf700060d1e3a4ae8af0ee14e528dc175931a18020463b5794e9d266ddd356a6d377827a5d5bba702d1a4a9c33be33785175beb893c20d54631a5aa120cfd4fda9b5de8b0ac86e8f86c0fc6598ff80f5f2cb02dce934d17912428f722c0b68c99ca11802fb085e1ffad76cdd15e849095388428851b43a95983bf9c2675bc87cac621f68552533fcbeb19e06b1498d3df4f6e0359b19ec30e6ffc18d27c663a76ad106224e856d40925fc70ef05f8cb888992e3edd3c20b73a8f0648d5d58e04de317de82c4d32144df7b9511d20b44da626ec6588d8158cad2db14ad6940a5af0dd128d6b151acbed1571fa7439f56a73c58e889be548c5bc5b63d85150a3ab4cd859719c384d2994e891cb90ed7378a04e2d36278429b272ca81c55865a364aafa3d5240346989c4db46c50a09ecd2b135c2fcf2a274e58c14bc8ed9f787392879009b2bdc92dc596910012755bbd900ee46c594c8c6e593f6df9baae8787ca17fd44974504c6c94812defe94a878b37c8c9f0d6a188a446a000ab1cccfc0983b476ed8f4d178fa1cea06023cd2e8600c539842877c6ac94f0eec917a2232f88e1bc7069591b40e6a4fe8f604349a33aa6992f5ff11ff73bb9fa676f9d6ab1e08dcb246df59534a2793fe461d8562982022bbafce8b37f1d98d10e151be8b4b95b97fdec144bc2940b1ff407a9da5a5a1a0a8492e572ff9944d0e21abbad71f2b8c5509e7b64bd3123ee3f283959eb4e1b752a3873e827ad6f2d9199d1330dca7a9889f0884cee8ceb61f112a2f4569d73e403409f561d12a85d47f32b50142d3394cbe9997aba834ffbced35a67c0d602eb9933a3eca08d657d0c550b5fa64d4e8d9df44560dad489ea9a822e916e4dc613ad6e8071759cdead340fae99a23318842242285c4eb6a1976e10c527650186dff573b3b02db2697049b708fcc67bab8477480c26f0e6ac4d6089433d3799f34df757fd09e7a6605aecd79aece1aa9a101ff61f2fa9f03fd573a188b18560de6b148327d13dc097f8f4e77ff7f04b58c743294fca2f89f30fb125d449ef3929a811d122e15810f074ccaf290446b0f77698ea3e5c663c2c9539a1637cf167316ffd0b0941e480b05cd88ea11467cb7bbd61458c8d12fa2d1816007dc74f007b17541816689b890ca51e83293647dd7c4ef14a5612dfac38416bb4860c4179e6d76fd5a4afb1ae7f78f88ca43c1731dfd42f3e5b20ddf920ad098b5b5d5832a0e6a599ab1aaeb2294e404ab79b5a7fb1a022b612661712739a32a9d0fdf13179029f3d39c46ea029972a39fe622fb9ae82d8e5959c54a1984e67cd4f60cf36032092f39d6d62728f34220081735c6c064682af870883504b8d9676d7409477d251728b6aee3eaa3467eb491b74dcca7c9c0067e4a36917c7bd8a8c9439892c26d7980b67dbdd334538c95f05438838da906ab327dc99998881c2f1663ebecc8ef1535918169ecc3a64971ef905eec8bfe998837abad2f65e0196168c7b928fee34b0e499bdbd97f8a4c57d1efa1dce03b405900dbf0109b315266c5cf3d0fa2b626cf02217b9621fd8884f03a836bae647acdfe49485ae299894ce11339f6aeb078f28055c730a18097ee708681bb015bbfaf5094fb3d2ec98a1590fc9391742f0e2ed05f33996a49e6ef5687db8be0c7d7de3b700a54b727e5741049f683a008ffa5f2e2f1f83d281ffeed756a7a477207b6f3360168b13f75d39256afa2d357914519ce104af23ccce1f03b91df63584c5acc2c9f67dd20f2913abe56fc4b011d11a9ff1de83497bb4b001a6ace5739088c6e17a356a14f97ce878311745cec46b058d0adeaf7dd0004846a73a6b79efb05139d85594a31078712b6c11983136d50e5895b08e06913477b6443de60c85ca5cab6e2a7ae799161791d78674305082262d010fb84fe9441c6fc66456f4fdf722d1f889fac449cc1563071098d039d2904ff1fe46aa3392109c1f2eb8477ac6fd8f7a71b7335500fe720bb23aa864e2b094a51ed369cd2615ea3b17de97c52b4ace914126ff9ea5b2c7c30d413b6186dbbbe7afb2a102c22d1bf616d7afa20fa9eed6802ce5a165ed6f1d9f1779ab7dcb6dcfe874ff1cf812b71f1b54ad288d53ea16668bb5c9123ecd53f6cd05ca0fae2118939bcf43d4b0de098e72018735b70a2b74f82afa890abb133da2ea87d18d547e29b5e4ec4ec8fd286b503d50cbae947699165d5529a2912efea5a07dbe19240a271aa9a4f161bb024f5aa112c0409d3b919735d50cf00fc5b3c9d1f5a7ed09ac05045c1b23f5e02a82277a792b921ef675e3e318b27bd27ee869dafd25f2690aa8b3fd5040d2985d4b9476ed0b8a6eecf9b0852270ea7288ec92e24184d845d608b81c52dfc0ec242711d443924c3c84148383a862e41ed8ab22fc85ec678edee00f61ac92a28728a2bfe3da566fb5f9dbff2edae13d1edbd3d5fed7dfab1ff85daf789a5c449f17e5c22102d269b648ae75a8a3a9a1bb57b419ccb5331ac7a7deb308d64c1dfe606f120269c7fedfd6f3a3b2d260119903d4269b63543a9349d89e4e20afa050fb87cc91585628456f8ba5dd056f9bc34a81f82d374adf278f3b925dbe0f22e4092984a022109127e694b14368fc2aae1feb00c67cf42b91e2e0501e6b2bee9a8699753ea4f58ca4eb0fb11bd32173fadf098eed0d0348d7fa0a881200faa25f3af847de7a42254214389db4565712c0720e2a5321b56dedd70785ecd3c18071df550a595b460539a153bb414143a7f46c2c78aa766bf2a88e32fb463a51ba8ac7dff808fac5ffd1a9698d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826a4911842526a32087692c3c45960f370b10052c4a8caa3d8872d8821c8f2387b701e0319f913cd0bfcb5a6d38eeef1d2b1c7aeb71e4c6ca0e3e1614795ed746c2dd5bd07de082baf478a8c7fec59e2060ba8c015f289545a25b9f278cb29324782a7b7df647af67dc5ac5f82e144b3162f757fed2150f42c59c1c8644ef7e9efab902907247cf63a1751974f0954274285111345b4e0d0e8553b7fbf0007d614e9a67f5563195b98cb77a3d08ed519c047e8b0660456d512dc1af58ee4a7f12380fd420f44a41c865ef2ee576488b08cb803b4a41cc878304e3434267aafe1668a62ef22c74c6298799dec09bb68dffe920ece825fcf710ca6ed805be2d947319646b850ee40e6f1aadc4aaaed89da8e7585c3a0687ecf2bf2d27a59d67f5db5b8555047a55d7aa87cf2244ccbd82f9f287d4c6fc61aeca969f0c17fc377444feab3b55aa7280ad4debaf8cdaae972a3a60b602b2f0fafea0d2afb55b06e884e02d86d90b433e5f7781fb3d182f792f81b9747f528b1dcde994ac72fdedf066f931ff4a5b05b57775632ec5ea6dc3560a6919ca82348903e5245a4da54aad05aaa9970043fbeeea3250e2e63d4ab0643b6c279e718c44a5dd283e4b1bb6ff876ddd0868b80da00bf872c522bb1e9835c1d8c9861ef5a455ac5c816adf43b5916951235de7ec61c200616a83af6f1cb18665688fcc957a2dd28ad911f1b5b82c96f89fec7f64d17dc115dab08d3878d50a1672feaf6dee4b9bd7101eb26cd67d1a136e9c18c97151730829be4211798241ce7ca15349a23bb0bf10996561e6dfdaec3571a80dbb6b7981a56abcb0abffb110137efdf5d9258f6b35d703312465ae947576be7f8dfef0cfee97b4666e1d8a2f326ddf32ccce7c114a827e65348461e7c2a66ded66fb89c0d95506033f5e9d6cb8a235f7beb2d49c7729d7c536f618ff95801359d44b1dc4fb14dc215e850aa20df734701a21ad89315f25ac620ec7f7a1aaca2deb1beebbcbbacf7c54df5b9ef38e4893e77bd5e285f02ce7b5b0c4477fe46d6b0187a768eb0a33d91b49a331632b28a9e164487e4838f24dba0528f1a722ce5210e343cd531bfcdbcd2936326e0b9881a555ad97bc19eeeb308e8aff73cc2fa8c11b96ae1b8c83fbaf7c5a49554ea71624fdd5ccc377b6af318375f33bf344af84d0240acd68584251e032bc143dd0c2796ae25c48151295c82c7a17d2e5aab9b7ef2d50c9eec62365ca71679a4f5045f5390d96e9018bc88a758c1dd2b4397e617dbd9dfd7cd632f84c1a7eec6ad2d20cc851eda9b3253d96befdc4ef45206ba7b9dbdb2b8a6e69c689c48aea9b126e620db0c588fd5c7e405c4b72d5c03c253a4ac150f7ffdc9cd69e7e606c5eaa8590c7a389ff1ed3de21201f664f01d20992f4747339d3a48524f3686356397881935be9afcc5e16850bb8a40b869c9f03ac7cc49cc02f190cec7b8ff8464d64eb3f374d04dbe8b3d3e0727a2a1850e5c2f7b5a16cdc5ed55592947c8d1dec392e56632946f386bc56d4fa3a09400824508125b48785436c5693f4e99e62e2ec62fcae44a9af8080c0063a6e9bc7e1ba9e377c36b329e77c0abbdcd03df5dbbc069badb9f517fbe06519f90ad6b3f82a4e63d206cb6fbc4f5fa15062be4808a3924269ed1784926abfeb82bfcb8f5f4a305a8a1a99a96d9f68ab8c38e70b5d3ea4ed706ecd7604acd52c60e854469132493e8bc14ec3a1668f974ebb5f2ab65630fb07a8f0a3c8745b122088884c0abba4885f963ea29cfb142f0f0385cc8420bdb1eac2c1a70549883fef1204989e667a710c07f37cebc8e2fd7ddb1a6ae98282bd4e82002857fa92d4458a6c6fb856ec13f83c31a3c6e57552aec15d30017eacd01fa3bcbc90dfcc756eda50c7019bb6f22052e36b64431886143b0636d47d15c69e1f4a40e392abb6d50d0288f34e963e9625fbb416836587d7b8171425e6472442f78941457c76ff131b432dc83cee60245c482f6eaa48812a6345344855dd2916468f9908c6857bc7eb05219fceb609ffa3c4acfc23907fd8185645b614a80f5bed03ee1c723bf9c7324f376f88536a78091de87df89c251c382efc893feb41afd17d02f17891e84defef493806f959e6b7bbf19f44c032a3ab3d79e6cfd4d602a2e00901f46ae10ef8d838495449118e8132dfc420c02be5f37ff72ee95601bccead77901176bc7ba0e2b8ff0e7eb66adccdfd7e123dafc93ac2aa0bd38e21b92fc609ddaf17b6ef8c02f26fdc8122a4c2a4b906e29429260c69800fe6b0b2193ad49f851c7130c9aac7196b9122df4024578f5cf8ec999a22f5569b254abfbdf552341c4b35c1a9955284d77d1d561b9a407e4ba227b760e88ddd4a93dfd6a5df8f3178931bec5690e826509e20725c79dcfb9d134bb8159b98bf1c976cf0e708a5da90fff176dd889d75f559f59bac3a07229c2fcd87b52a8c29a5e471d48c30a8e662c88a867fdbb26f57f88e428522391c5ab960a698c9357613c4efaa3c8c902eca73073f943434ba236135f38d8da35af0edfc90c09e7179ad38ef18b73365e38df872a3c2b8fbc6800f1dfbe8f3a2bafe36ec315777bb74c145844696cf877317ca4fd9ced86098dff5d5a0d9925b718e256ce2a63a7e450c7abc7da24a9d2e2ac169a3825129f84cb4b9dd5f42d5ff05f63ceb0142be4ffa432b6ea8d80006fd6a2f2e0b0b186f9a9eedc64d6ab1942252514fbaa6346d9180d6691494f37f4b6aeea118666f9c784b8cea8ef906e394ad4733f3bb2449504438740fa8fd10a97cd287bf86ddaf050bfef118c3da4dda7b0d16555378cc34c306608bb502844c2673ed4808c2d751dc21da4a48d48c095510d5a1330e48043cb1486f14af2b4f8659384219c6983d8254655079b991b185a01178eb81c29da857c604d4fff201ac94f13e4b9081bd9838eabc7e2dd078dbe84dc14ea767b32d96c9c9ebc0a6bd21ebc32b483ddec6cb85671acfa9f5487ebb7e6c589f3af4063244a785cefd3ae8584c50aba91c6fa1721f02b6ee230b17795c5c998431f8e088d2fffe1c5ea154403b82268b5df336a7f1823e96eb56b88314ee100f719d842760a0bc1ea47394ef4b1dea737a583a913b68aee961890e157471e0b39a0b1828ca4fef21af330c3c57e00b135075e845feb34589acd63ab1f6cada1252c9e0594180f0bd9b9a3465191758a151b7ec9091901d3d80136ca72ad88aaa3dbe110e7078efcb9c165408c4a73a11bcc80ae53a80b035d4018640a8e53b8e374b3f746df77a7398f00ffe98384146ad2e81fa85e1bc22c0b093d3c1c35b46c12777617d4c152ce73928af98592e66831f03604f003b621ad0e070704967ea91bb668631249ed97475c1eda6a42a8f6f8ae6476e165e25a72460680d0ed56bfcb3161885fbc770308790d39e1a6ccaf3057ae01de336fcd4bbde72c32b4a74a1b7ff0a0b76f32e88fe7a66b6f0fa360e144288656610552e564d8fa27c624ca3b71afac49945b4397235c20ceafaed87cdae23d1d859b7047f12db145c56a52433c90ef4555f1af0092d1eb32bf5b96eb11d4de6f81b430cc3665669d2789840c7276ba346a4b0708c9da56ca72cd549b85221c622ad5aa405305316559a8278ace913f689c06d68c63529b1ab8843a0378c2f6bd40ea6851c76ffe6ace0e9d2ebd39bcc8f878f8b72f68abc296e465db3a3f7b8892bea7291f92e82faea385c793ed013babb68d39f57074dc651d3f083eae28b26806d993f88dfe21bcde991da3efaf833329a3352422b5affcb652c618cbb8d154ffcbd69343f3516a02c626c61563c2a29bdd4b197027016eb7f60fd69396ad2a258ed63acdaa86c1a0bbd50ff1624e47dbc820bbc2169c17ccaddda93d93ab900971b1606341d9b2da21685fad153b9c711917834199b2608a5c1879f88d53e93cfd56747d3591c525cc506c5adb880c1767400ebaf0d6c68c5cd4ad81e9af454b565def6221625d8395a5c490715844bfc618c23a3e59c42909a12c2f18de4281ec6dc3ef1779b16de3664e56e130a0f99e64bc6c1330eca257a6dcc611e781d3d00b68bca10e8c67f33de54041f5238f154f849cb864744c4a71a803d0d5683d022a4ca80c5db7a25399b315f6cc5d10df07ce536c35f48e1c736a7cc2bfa839383f04cabd65ba6c5ad1de7a4e84a9051f11013650a96bb56189c36f14cf162795efedbf61b0a24f15986bd5ede461242573144a8d6d76c2d1532549f63c066e88556a74e05199a517a91ab689a2252a645ba457c8a13752950c07ada64a9264548f7e2a92aeab53b5d4161a1670defe510bfbcda516d7b5cef76ff8662b0dd046bba591f7d46c9405d7d05989d627438e02479c23f704c7a0ba4b597963ac0a3f523313d5f920b8ac61e24de79aec534b7e643ff4df321b64217e20128c88e83411a0eaeb6e6c264db61819ffcb0c0fe269d5aa6e7d648141e64163d2a0e5ccb44a2492e735ff839fc0911acded26b178713f1bb6c845a00416ec6e5f72eb9a1095fa70c91fb4b1a9928f39a055b339882904c9df5c3d4d4e2947eb1cb3ea56296654df6c77aaacd68500dbc45513f1cc41434c3cf485abd4e8b226fc479f22f40d3dba59086ddb9c7a2e0c813e8f1dd58504569ac9b60781ed0d4eb209575cbce5b31096745aa5e84e08f5ea02e543fcac4d37730d5b1475248ae0f78a63b0a48cffcaf802d8db5bb644327a775dce7bc28658bf8160ab4ddc4926dfab69e1925fd3a4234dbf817cc5c44dc25592722b7a75bc116ba94c32f82b36704baf2809fef5afdd894ca660ff2fba1fabecaaa54b3572369516ce608b2b27bef586ce90675834bcf07e5182ce2eb11bf3f19d94e24c2d229bc8a638c2c5af50f5ef770567b612e372ec730e9df6ab3b1c7aa6aec2f3ed5d0abf01b16a9d1feb7c6e913d13f977b828d08aacf510e97882b1a87bea91795a2b5d12069f7978174301cf64fa05ee524a568d9faa42d1446a65cabb1cf1d06a271d8a1a8b30d876845383433af1d31fee583e2d1112be3167dba6242fc0af1a5545da24b0eb3f7cd50e2fc21b9233c85373ab9ef14139a2938155438d0560cc9d3f16b6cd4b1bf8e932b147be879912a2bf957ebd98241d1937316475f15462b865b84501a80d0003f9258375437c50bb25aa9ee37c22a6a6c6ea067123844e56b79cb18bb58d2975f28698e47d0871180a99baa125bd3c864ffdd370dcdc4d9d235e5bc2dcfb4ba551e7b1f85ccde552d5e1c2ac63761ff4ce1dfb0ea052684f6c888644d00ff83569dbd285573eec71f8a8672916c82a470814f777dc27713b905eb06416d76c12bf81fe493aec8c6d7a89459afddc6d949ff95356de103c56cc144591a68255cb28a2eed3e624ddee61694c5561925040a37aa96ec4a27652f5a55deee5b486f861e05a347234e465410cee7d09bee7a1ea6fba484883735339a522c4be592564ac66f96d918d0e497f89f3540a7f8c8bb5e38d46f4f30fe9a0aa57f3b6b78ef32b1902dfd188a47e12efd47291ee774392e3c9b0e58f52be2e8671d17618d76629d4681270bc4052f4d20fbe45edba9909973ac9aefcbf972821bfe3d1afcb533e8de08654c1a01bd681c37ad1daac4493e31855687d8340199fac45f771bdecd7c85b21564e4f2b0aee0d70ea1182cc9da5e939b488f8ca2297da1583347c959b2248f3d61769aba21a9e6407a83699258f7df385f14917efd46e4208c81fa84e93d0bb9ddbfb68aa9417e45eb0fa4786b2c3e5b1c41fcc175fc719e588288dac7556d30caa72a027d733a3d41f4d19a9fc385a249ee2f6ccb817746b45b1122738028f34e71272c7a16093743e00786b36f32f28899bb81e63217bf4bdc70ec23e748b83f925843fae57081669fb804c53733fa999ab6e87cc4c1fffb83898ea5237e3ec8a561a3d02cf71a076c8a102ce1f9f61a5275f8d90df010ee4e093b96cb53753589472cffbd24c1128d7a9e85811fcad66d219deecaeb6f01b4fab9ff8b6c75ed1213d73b97b31a32390737ddd99cb2076d79c860be03d6e35f78b8fb59363f3a44503662dcb6ee7a634a087e18d451a2ac6e19a9179b020877c236368a1d1e2fa127ab932da6ad9fe8c2f61da8a356fbb37f2e6c86a147013720e294b960bf8ad6604448a44cfc9c00966b0020f6d2eff691fbbff9505d6fd3e48ffdb54928795d1fa831b95b67f7805fa6a19e4eb0dcd7b1c49b4530f4be07193c7e8bd271f7694968f16349f7532f4d2d697740d4fcb949c97d03128d274bbc52b5f28063fc735ca7f9403d51137390e7c0de3cb1ad83a2afa680f4fe2dd40ce4cb9add58d38a20eedfebd7fbe6a2dc59231feeda3fb523bb1869cc13c9e3c0028be94bcbe06c918140c8d71638580b8b5e06cb9cb8f24d32c225f53bd7909a9473bc03170485384e48f55b9ca1261fd8f6e6f3e44dc113205442fe8fde7610f1c67263df2150f7d31a71ca0b6c1b95d30f56f70b912249d86ab9615471711ce3805d1ede785e678e1039bcaa22d6de39092b7eedd716ad738cb313947e8ac39663221038b5711a76da558fe6f4dd4d59b78de9482a39a6bf4453c948f0237fa68fa83566ad294266e88ed2ac8ddbde41567c8854095c42e5aa943045f30f0c619011fcd87bd19b7302c5ae572b3e69a4610fc90e496d55285b652ff723b72ad55b6afe0f90598450caeb0bf0fb42a689c942a5cab1ce0547bad1e575bf29a1c063c8087dd5a8e9791f67f6789926ee2e2dbc853de026f37e3b584fed0fae0974cb5897597011a9b7b967001f4bdf712d804b814c901e27c9b33ffbc02690e1d25e1db8ebb1d437fe4aa2501952911b187d0f84470c359fe1e0900a96c25af8e291e71cf48fa14afca0ec0398657bb0119565ceef78f1baeb382d58e480492437a49f9ed0be97a43b5bdf416b82ef3d3f25e3b4010cfd494be23b0b942086c781cc59602353c0820a3884ae091bf72136303b1d4ad231963d378e17386992cd6044e96d3f1b44036f09577f5b7b2dfa5b523e380a7bc90cfd391576609d3e7bc2d8fb9a2eb84fa4b5881474a3647e6a51fb7c5919e1dede1b479bc157a3b3fe9d556f4b8c378dc23d082e0df126fa74ffb10baa4169c78065d9cd0e422d8718f006510248227f9dceb1756120e42813df5de46c3e0683b685b8405bdc363a10d989a565bf46aa3fe1576de2580747053ca840e5374a0bc1ad01c896fb90a5a1133a20e581b27d4e271aeb0ef7a713c605fe0b8e1d821b6b96797c199b09b412f480fa5162ce5295f4cbaa2c74be1a4b312c961d5048b35509cb0006be505b56b129719bd2c8a66d76922f8ca54aba66e4f311230373c72aca00dd63f8bd8befede5203ac4812193f478691b1e23de1edfdcc5b7c42fd784700d3b52120d70dbd7f130e7517795f5451e06ee746ba2a90809747169f24498b4ca64331fc0f4f5b0dea6568292b773caa8d01f76e3a0bd4426d0fa8e8459d3f4f2f4d4e391c86f629b408ee7ce13163f0a823810c62eed089e179d4a8737f7218b5dac38b79cfad5198a637eb0493ed81933fca9adaf046ab27eb018a1b58d28bb3a6dac4459b1587071304910f2f9ea91f65cb0a3dbc7cc4357ec2bab469649631e3cda618ed9f6c3e2751d4694806858660ce2f5406dce9a6d451773827d53b67264f38bc49c5c06e11406c2c34f26c0d362b314890e33d3588e40ec939c8a4acd117495001b184530fca9daa18174d28211f64d46b366f45157cba6683d54e028d9caed95963f0e9c4135760dc3f0d837292a38d00bacef4cda7b0ed7c52b0daebc5bc55dd7da4381b601cff3aea5a5c8c5daf74c11671f9044bf6f316b761aadaffb8523cba0963f8af1272732c65d07fd7d972586a85e739daa5d368f946712a3b6cb2f5fe908e58e57a25c69a518e25db751601701e185fc1383d582bff621c9e31b0e0016b9a54630ae51b863288dc448c332e17102cb79f2b2402ed1498838660e0a4a08f4eacfd363f81cf3275cd93a1f7a87fe6a9d2f0ff2f8b422cc7f09b19d99587d8d0011f002ca017b48e89c27bf4199683dbb95d6026a742cffcc9db1798eeb6edcef6f191e0fcf01e4e3d0e049ee8406d068ba6ae7baf0927b734e563e48f2d42bf6d5f9ebe6cdd95d65b473298e9633c86e2a134fd9ff8034be8836a4b4de46b1170487d5504130a979e2a4ef477e0b09e5ed13a556e813db0ef15f82f68769b800f93c6dbea2755c1416dcfedab1e2cbc6c4b2e5dd3391591dbcd268fc63802e492b344302f8fdce7834b80dd64e74a6d7e1da763b8b35a6c33964ca7742abb5454586dc60a54418df564a436fd34f011ea5f2371d2bb7230ec17507fb052eff41bb5cb07f7203cd43ee2e9218697efa8da41d21d10d922b6b773e148cc8758ab9d9196a220a1a37608d107e5c86d8740142d71ab6d83d82ca52bbe9656ecc3e53e210ba390fdada90eff88696c52c2fd76f1eac6c1dcd75cf57019c9b62a5d51490b565ae9354f2e70d38a84f546696ffa263383736b99951e37acce9be25e7f0f73b9dc37fab5bcf974bbb652bc373d781dc26bdfa04cec38d41eae85c93c15c483934473e931a2b8dcda808e6737b27ee05f537608f2bf991b9665290f8ce718fe2a625789843cd35512b5614ea3da1561320212a64d898862385d6ea27c09e4f6bc8f89c7b678c50b769453331d37cf8bb53d4d827de7799aab0af57dddb751b144950c5445b8b07374c22d840c9c23fc958f4948f1db9176ea845c657043396e417a664b3618e0b688caa828a95262d5204a682cba8ce8d6cfaa03010f8606b3251cc78fbe2240ab6b745a49b81c4eb25c3f5522a54cbf3758b2240409baea45b5c850f381a5c8e3c5e82aa74b9405d0c0409bc27d9949584c7f09b64c5d16db3636a7318e9baa871eb30ceb122dfda4e3038f66ddb811f804934e6ac7d59938784f3c9b1198d0fc6b0eedf65179feadebe8b60b43de33abfac8c241d7c2a69ec461b67f1ab8b11c599faa81a58281f9d9882a9b03f307e333baa5d10abe158b35307e2f63166d674676d1a2eb37802ee804d57a4e946d4a7853970561efd0c4d06bf427354fb8dbccdbd57c3ddd50ff01b331e8549fbc5a47b4d5a002efa0c4649cb3f0dfb66495573dbfbd7b4cef37613040560530197e3c210d303f32a4ab3b83af08d5101d54cce5596faca914dd06a5d08bcbaf2bb8bd737e2de76fe96327699428881f5e32e7c94873949d9fd2cb32cbbcfa640fa9404f344e824cf6b663834e08b6add8f2f2d111f39f07c4f01446fb69d7f12f6a3dd53788939c9d19bdf2519a8e4d20883570b3acba5e2755270ee99a5d93f56c2b9e2328857ef082c413d7e7410b1351f4177ee5cd9f95f6ccd094a920ea44e11c274754cc257c8a8a3a87ec1ea3e5a1e4e63211e41241a045ecef0dd349f4a81f0521aa615e262ee0e4576f915cae0eaec114dca45250186292d88afc9722dd5352ca439da267db8824e27a5489f074eb3465a0c70302fe8d9c717e7603732fcfb26083b86550d69f6e6ee78b902e8e375fab5b26d2d8ad47331ab7827ee9d557e0b25b5492119642a6dd2d5b606c16b06541243f60afd360f7902ad683808dc887290c0235bf4eb0e80e0a35c6f3cad89bb1b5c5085254dbcdc7bbb31e51f854c4e7c50da9b73d79e1225734a99e2afd2ca07e8e0fcaa9b8e458fceb38d5e9ed7d118aafc2918ad84aa118b05bad0101d37c6c7d54bd0446ea41caff863facf77d2d254199ea20669cb02a30ef5d29636ea28798c118555e3a54b9af3879aeef01277c405cb29ed04fc783c09475d37a177dd5e5c95c0080c2401bd8bb00f55db9a4e09fda2da986c6c008528a9e18001521866ac2ea9a7535eb12f4ac2df73467dab54449f86c52ec44ee26fb84b11d3ff54d97702642b13f2438844c8f946019437bee664f331d7b4411b1a0c7b04d942a35e6740610f40dfdc7af96ee46b3c2c6d3d9fe7cc0300a672964897a04f3501a648e97775d185d51f763a36fc5228fbcd62d6c14809cccf260af52928dd2cb92274e2c8d4002685fcf8351c54299e7e3d340753590d2530621f6913395e4c4e6817f16a0ff6c36c7c6a4a54f08c103fed66e5ee7272721c4d5491a413ca4e980c3ba35595703e3bae1a4b2e020a97ad0031fe44e219a99dfde70a7d6a8d0b488fb119cca89e2088b230c700e1e151c9a30fbc1fa1b52261e7317971930cc16996dadb3ff17ab9ae8b3dc11349ca0f8831a646f3ad75fc7c43d7bf54764f975a443d801ed1d69d6e502d69447c5fd2e90e2b895e384eb12a09cb2d52f7e99ef7e2c61239ebf23ac6c8949b384e01ce65d15ebe54eb4d488443885adbf12b281e92e50027f81e1d7ed0896fdd6fda8b9b26f903f1fa0fb2ebe67c32285f05c9d5862cc5cd809176dcf8e0bb282e94acfa5a3d9c59c2aa9fd6f8c01909d08336c0be5c2b641f590a0c8e238410789050076e7f79c48f6ef3605d30e8f6916cc5146f86a08b0fa3fe9b8d5d69f6881fe06577caf5c191ef65438451c0535650f3707147aecee1501a1c3ccc68c1a218eb0c7628c8939145340a7313415b991f3810448663ad269848214be3aa625c00e801adbe1512eed43f043abd2a4992c17147f356d0081009b1821741f0545616a5557c6d867490e77a24940381770832508a043bfcca6364ae6ff573f922b472b84ce26581196ae29d777c231305a8909d46a70ac28a737e27dce20cd34289272755e326273cea4e4a9cb0387923c67fef39a9eef474818aee3297cd689c736c2491d2d9f587b4f9c90f4537eeb68e1c3ccd6ef2d9c5a3acd9b27aaddb671cc2b2811aa8c436808b3a3b50721e93b5aaa4d70cfaeb19614466478673d249cd30796197ce380d5a6198eb2d51e88bc58333de530828cc2be887f0451c1a52bfbf075171fc74df10ab9500e535ceb40ea64694a0c4e9aeb7fb32c0559af90bc13644cba2b02570de0c0bd55d0de73818927337b818b778bb9a4aaa491fb2ef5a5b397491611d05e8d3d2ef0505991b818b28e85f9ae105c6b66ab6eda8726b11387c5cd4abfeaea8fc910101fe168532e601f6490112feb284ee90dae1892131a348ac070f59f22fb3ff3b07b5f269c9426302bc4a2922f229ddf8ac58f914ebb3dbaf3349a3ca36ae02bcb2e74969e5aae5b1eaafecbfe19985b219490263970aa5eb876bdfa4fa5ab5a856c4841733b4a886e89e048230f634402dbc796496e10aff7be1222777e93a416523ac6c36114c953648316885f4409a31f92c1bcf1ec60ae8d2f7414ed8077523c198fbd285e9a3163d50d4e972c301d400b5eb73b5cf03c8dfeddcc9e0781671d8a093f0e45a40d7f5dff7984decc15fb298805b105276a4fb0eb75e36dc20fca75e5f10152f1458cd77ccdcc7605d7bb3c85453723137cc5321830e1a2646a2b7595687f11f64f0227c9f2fc8937e8a218ac0db55da223fa0df40872000d72e6f27be9ccc92e8889c33cde8daddc1864d395eafb200bfa54451e18913eb6306d2d1da4fc4ebfde6bc6941556ce28134a737f46652fc673115bafdf4317bd94bc4aa4938ae234d177a36d3c5eb0e4f2b683ebe4d59358264056270cf6548dac3e1bec19d536d87c041ee9ea2110ef6ec21392a5d32e417a0b12c11563c6bab02ce83264a95aeb4736bdadf130997009cb7faadde51a9d9d48aa10c727c46f7e5b07b96b83d9d93342dbaa8be52b5b3a4ac1e73dbdfb02519a8ce5934c40c57741c8c66b0a2c0024e7520858410c4a5558268af3066e5507918a01fcfc495bcad91b8244d80c381c86af510c6a50c0c20092506fa397999ca074518a42987d67cacbaa2b4e0e40ae1522b9de3cd9d02f7e73999d9ec3e2ac9e6c5a3b0346db6301d3c30d6c8492e1c50c611a263c91a7dfd1a61b7cb1e307fa478a2c3b45518eaab9f6c91407e9d7f41fb76ddc73e8cfc87f9bfefd2773be7b96d6d5b81e7b85a884800b162555081eb6bf2f03bcacdab6e5250ca5eac19134afebc7bdf3bfbdd7294c830046ca55fc91f2f68eeef9ef1ccdb3a365cfefe66ecf597b1efeebec83942155f9ed8f35c1f91ebbbaa9eafe4308be905f1fb19cdaeb76e1b61e93fa5202b2d30a51435c2236c65caf447e982db873651565fcac7ecccbcd2d6e5fd3d6615bcfe19f5c919c7da38bfea1ca2d5f1db0674c330696bbbfd4be4fbc69beef6f3c2aa00e803b2b1d881d989a00b3187909bf6599258cc86be287c5d271581f5e8fac6de11381e55e6401a5ecf53e1973abfcae291b92ae2fdc3919569c9780a640909262b41cc33dc62585bb16ac60b0a9aa57a9ff05858eaa28d8a500e3268ecb8bf79fc8bfd33ca2a4982b61cc9244269100f4412f541ec3c40c2105d3fb68a302f6c8f4aebb40f8c869e0ff8afd53ae14bd5f74174eea2d797aaa84b91e39a0095ee38adf7dd2931b51310071f605ae657d155176bfaed310ce9f8b8931ad5dce2d41f1978263b3803a94d47d7f9ad25739a6fd3f52bc861afb6d5762e92db317f7b08a0fb193ca1c515cdf2f83a6b3d007bb86b11ee91b12a6421763be3c774dfe7ec9f042e62cfb9d4fcd6da52894289b8f1897a2cf08d5d8b53e7457a04f0894d1de6d05a4531ea3625da7bdbd9251a71e6b7314a16163ffb62004b72eb8322d55ad8a3a9b91a5c780017729f6a89943b952cd232837c683b3c1c020b342ea6921f5aab4f87a5a6ffcf1541d81879599a0c0e3dbe98d4dce8564df2910dcd5d491dd12687166de1a43565c79b4278226ab6c61169267302df9a4d7b18d8f8ebdd910f2ed56fbef8b8895c7990991653f72eca3e2f505c975cc0d77a53723bb51a4c3bab093839b061e4e88973c853d1249ca694e75b4d327320a135ea17fb51a110affdd0505ff93e7a2aced341a5cc1d3c04fcdb6bc13e7e59b9985e7a3919a21fef0ca2706b832013bb627782f0cb3cba7791a1c8b03572ef4982cd89d7c8d35fb8147b82ba4af88d0d53e19957ae5fa41347396e55ca80aa4e4dbed40c82f1b5d755cdcb1f4dc6de1f308443ff9f1269439548f4865ec7d762e4963961f6c5a17cb83069e3970cc8cc8c6cf0dad76efc661d79b42b23d82609e227cfb278ad0110ca536bc5f3665d76ebcc5a0f10161058f7a172306baf62a71c0a6fa1a2d8e89e6cf8a8e6da96aea0c121f9a3c90845b71bec1aafeab7dd34928f193744f03f5b883b800dd2a0ca79385ee02e73111159172a510206181ddc313270db4cd90188245a6cfbd4573c165eea1ad64206c38c95b285f2f5e806388b0e1f1ba64320261f1a09afb753bbd74838a54cc8572757cd5b86ae843159bd89db4b0474f8ff6713cc4d65d917be3ea6f357b497a19e3b67b8e9914cc53f50917433c1a08f2e060034b00f407367aea56bbab122da6994ab44585c446d58f5b8e11d8d845ded46b43f288c34978b09255cce1ba9441d1e02de432e2ba46e7799dd4897c3f5fbf06793d4adf1b74dbb711cf2099495e2aa382ed29b1da8528d38521b7de8a6835e991cbb60911b89568c1b0a6efdbe0a5871b9e73fcf90e1980c9a7fa31d9f41b52897fda9b96d9ec5f3592864089a52d473d5726fb9a39ba408626a42ee3695774907e1a004823f0d7e7e45f82c7e1e9d4b1c9372462018455cae340b5b45c76a817b8e2307261a140a2e492e99003d02abbb4d06d22d3e6a3d770fbb1a9330221de5800868b2086d030feb7e530b025d17f5df7c931443998f2eb99d10ae9d60bbc4bacad5e1b875af1797bd572fb5a7a87c7fcedf96514c82ee6d0421a7992185f3d4564d71ba3b15e04b4abdbd14e60eb5be63d8f146c09820193fd2d03822a504e51c05107133632839d2d14587d919f28362efad61f1a95efa9859be6f3367ba4ff469c2e0583012c97f18b7d55bb64067a8d46136806cd76c43294e406255627ad7dc1c377e8c9628378334f6dd60241b9462baedc5cc571042303cb82205df0a072dd9fbcde460151a009b46feeea6e5fa33a2f32aeab78859a5e6776e2ec6338f1ec25e948fbb6a979f72fe68b567a99b1d417ffd15b395390affea3facc8902e63383cc8324619185b27c40d41463e3ae7921fa1895af2e3575054e2695508a661035b1c14de6ee2a1f5e960d41579d7211501712974a8416809520432fe09f7efc26d38dcb2d4572bae78888d55aa54d93e947c7d52bf0d0d14815991086c8cbbe03e1b9a79992a81bfb0279887f0601df93494639f3b2436f55b2080185de13c5481c1f73e3b166df76e9386e22cfe8a06fef536260b31effeea3bb6e9b4060c1d543f18cf7810196e77cb066ad324c7c22c0fb8be056e4de1b2693fc9346c1d2bd6c774aa2803ce9f25f6db6384a6c09c3f95a7ad087bea14eea1ec59b5641c3add4ff8fbc034234f426cc2ed1132a4ebd7125c92092bf05e0182d1e7e129b1b619c173dc272b5672e56d1a7b4f3ae47948ad38a9255563f7dff4b87a1d9fcb52a6bd7eaa9ab716d74da66516f67825fd6b1b5daa8131db746548059d7c9659748f8b121a736e8b418a7ebd3bcc4f12c11157a127b92bbed927bdc30c9ab6213b1960f6cf09430f8f888a5ef00ea4296c2440ef051dfdd668477a20cc3913fe1e6e3373324ac11e20ad2a1b8ce4883a544dcf59d3d6d0c2a73333523a9f57263919fab62ae3281547762157e1f709d6d3d6fc019258fce3759fc28ad7222d0352130ded97e494c52988d2d6eb59f28cc604e059d3ca10171dd3086291b465d79275597896382ab0c771b98ed35aa280beb4d32878e938b54553e47f51ed86f22eeded670f8474a5dff10a96facefcd1914a44061bc9613f3167298f5c0efaf7a3a8196f5ce8f160f27775b83dc304aac97a0072ef9eaa0fe8db70c02f2d78921b07acd49958f6a8b71bd391f8300d81079eb982f8f229614a860dd776e5bbcca3242cea3c5e52d10a87cc5097f9a26bb9c81b27ce6b6fbdd583b919c9ee89c031139f119be807fa34be8aedef6eb101dc62d3b526bb510195b8b457a4c6987b47159d179d588fbc2a1a8bb984066eddc2fc94f2c53f4cfbb483fcbbf7cf777c80a23d1f30c24e10dd9fcb8401ae6e1494e5fa18b90939e6a90aa8c3e618350889bb0b9b907da82e4beb109f30eb8c94e328c5ade1a658172c693ab4888a5470c59f22f953482ba2fd07adb5a46df8f91910cba34dc1fdadc1271edd8827af5e6090d63f958216d48570d4b4cc12ddf5d1200cb24e3a449f4b1c38dcc8105c83c8433179e979d7ac6c59134170b37c42593838513c5c05254d9127105840cb749c39a22b3e5b0080acbf5e2c5b81e80744336f4dcc4aebbedd5274b90ebbe3396fb3113897949b8bd3ea17b74d30a458fe147cbe53b87740c49ecace13cc3a679f21479fb2d136487a619fc438741f186ae496948a88e861076d581625554d5fb4dddff9269811bcd58b1b92644ef97e83a61b8a48f79a14b435a51fcd44b39ae3fe94f9f8fc706fe7960c3f96d55971f3e35d3bd9f86f7f811b47a73b5d1904e03249fbe99f762be1679807bf507e9e1b8e57a1d56c7322ebce97ce8e2e938c042d261b454a498156ba0442ad80d00bb5e514e30ba50da063793acf5299e9a7ebadcd40573bbb1bd68c54851c5192c8e67efc992cb85b451b5a520725da699828f0ae21f6b197a09621c12bca34be9a8e3933dbadc589306564b22bc2e867487bfd840b188b2c2b1eaf600a67f5beaff2d1b83eb798e4db8d1fe57ded3554365f52010816948eec7a61ed7a47a39f3db46ec0cbbf49214fa101a877c039598ea0f1c2940313ffe92cb78e1546a68877f6be960d4ff08c114b9ae1cf7e565ccac103094e58b85cffc7455eab53015e809f2d3ad95b0cde27b0952e766a62f99edd0d069f16ce05ceb3921b32886e2c55949c9e0a4e68aed79ebc883579d3172ee32858c73365bfd9bfea2907180471162bedd4dbe82bdb42b5c90814c1734e42cb4a683ebd094852ec0bface78999ae44611e18c15e6c349910f753c1eb078ff16f5e2a65bb4bc924200b621f7b877169df30003dc4a20788cae6221f50b6b4167752234c9ef64ee7c2490e9521f9248b28f2effbb806f8b1c4f83801593225f3fabba095e18472eb72b04ea9da9a6e262d25c76061503ef7db222538d0fa84e9caee1a005cf4fc6b4b26614c81249ffde3955be3108cbad3acbff358c4f76682635dd4284055d7cd74c506570f94a9efc2d090dee520171b225b98b39f3b20c992c8df9e4ba5b5c834b530815520becc61d6fa83658978087f0b26858208555ad9f268e48daf8fb463f215ca9c49a68c9612db7156b08b07eccb4a907468adeed4ffc006217ffa50630cbf9c4d9a3897e6864e3e99997407f1a57d9de8228ede138b29d2958e17e18471e7138ddff3a2b86c21e69dd45cdc94414a2dab30cb2703b8556fd6f3e70ba851c8acc622f0deebde5d087b895f64007c152d7987d2eeba49a044d4849aed1c756d59c736c0c3a096384354c9effab943020cf535a7889d5911811ca16fe26d602ad5a9185436ceca847627e19495144f9c040df87cfd758457b44951e2e0e640f032d323024acab208e2f3a6fa5400e390ee6eac23c5437203ab501ff17aabcadb329f55ac1de86457cb567a10efc265e43b8ff10b0799ff045fcdb7a42572cddd8ab4a9c7827472cee65e99066824b52b42df6708c13628d65bf19b17ce2fd620420c5fab5a028c7510e5b052619d1ae376117c3823b158af66106879c6b9b6ab121fad7a212bcb96a644a4f3d9e646c38e56f5a9cfda294aca518d91a7000aa5312ddf86078e2fe88cd36003d460f0aad718d46dd76afb1a712d2c6d347ffc77d248be336440ab10be5180d951ee9b21c658b83c00af18d6304acb780fd48cc56d7a0732ec9da7277100fd7d86db8154b63a3b5dbfbfd9784f9d8fbfa26c3efc5ae8ff66ad0f65e5cbe1902a16f48e707cc9a072bde8a1412cc9b5b834c8d08bf69bc6c61e3fd74d3b9ba1be524c364f3ba9dcc3d14d764d415f80e94defdec67460e2237e09d3654a4348912d8c3ea99aeed2e3af50a090ac86851eb3641ac983d28641417fa756fa496437fdcd7d04717d899f0e49c68f4913f68614ab57618813d82722bacba2a0b2a3349dd8e14d3d1ebb6a566071d8556b1319e25e814cb739e5c03682666d4c20553f038645e4812542cf3079413a88fbb5a9ec5d3009b30e56d0664590eb52942f00aad556b6411f42593eb5f59a9c2177f3d28431cd1136395da074a0aff7b98aaa5a804268c9eb17373a8a81b4cc45f6d0a35eb7c1d21ba09c31a6b7280bb5f612f5596540ebe58fe0231d0d77c142804d59422b836104f7e0a56bbc47258bcdc6ac2c394cf9286ea07a2e9b2c10e050d8badaebdab38344ca4a687f25146aa9f58923b359205a403d503b1b2d07690cfd6cf5b671b0880179e4ea3f2794fa05e2a44a500dc574b1ae0462048e1860968ffc10886394e1ec3673ffffbb3273f9401629be4f476abaec54a0e9904ffd1b3f5f7fb79de2ba3e821a5c9223257fa89050f82ba6ae807a714ab7aa24ee86819a3d173e0a901566054b9b8519a68cff2763b9a5599b98153d8f4416f1d9daa938836cd232dac659815dbc67f7faed3ef8f123102359e3e586ac95a8bed1684d1cb24a2b83b4af35433d0b1c0a438d9137e0047e14e636c7743c81c00c7a9a2a60674159fa5fded2af3948cfd5b5c4e701798af03b346ff60921eccc6a2f29a9f17d1829ae02b34c911825b91e8026d08a3706e3e829ea6604018e8031ad32f36ebea10558d3ec0875be3ac90b667baa48f390ca42fba1dff05fc80e88c4dc1f2282f91f41a58089a1920e6fd60751aca2a214deaa1d1774822b8011658ff282fda630a8f486f94d31b201aa779d97c8e43b8c58768de4d1b5803254749db9a35e9553355ff5a2a37cf2f8fe61a46b941f30f9456d2ad64793cecd9009223f8fd0a66940cee1045c835c4c5868ee5da5a9d4c13b45f657be97542ea7f4ab39b408d4d51a2ad2fa583ad94cc2f6e2b1a8cfc27e824e403273929b53d62acf20d10df16dac8b4859d8861f9d3d87eddb85d356c98914a116d910fea39e00fa46f0c29fffd32646b956d64e48a317486373abc1ca1a73496c1bb6f54a269e999883ed5b6d68130039d3972fab0c245fd5de9dcfb2c4138fd850c3825b6d3c4a0c8bc3c9f3e74df9113f7bc611a2f22d0794711f272fd42cf6d9bba9c92574822d4b8eddea2d05b36070e451aad887efdba63dafb47e68930e27cc6432e9a9fc5aaa87de3ccbad9cf88677df4d40a66b72e37208a982867251cee4f4bbc73a24eeba30d31674420359d657626b8674f5e7b5c516a6af51a70bcd91f7d0e148ec8a94f561ea77471a3ab7e7415be788fd58524137b518c9df4c1fb9f9d528ade33eb6d00cfce4b07a1860a70f170e468c92c9864cb855720f7d73b6fda28fd9f8ac1c93da7c5faff8c9ca3ed396433deffba6c5593c0178ff859e7a928a657cca9460f6d62478c80ef8bea67c4e427fceec253dbd518569327ca1b95b2839075b4792520441c7b6934e5e05766ce61209672482fe1e41ee51291ee7b35f0dd1c4b3a3f270856fb5ffa9bf230b069413850b810ca53f2bd77897049115b1b091a61d2c2e07fdb771729895ba7c874b43122769f46340ebcbf61574327e5be6335d66b273da02e3969085a75f09f75b5c79dbc5d41d7914adc3da4c840444edda24a287adc3934fb3b1de927eade5bd4940dea180e3720f8a1cfb70a8b07429a27b59e9bc6c415f31ca6664f664be5a05e93c3b205633d659c1bb64daccbabfaee67f8adef7bf0d6f40320193897a1d3782442d5f8aa99680af63f2a43081c8ba23dae5f86e07a2d10643cf8e7fc549c82e17a4c427a683cf21d44c74b508efc6151f17e36d67f0cd734466bda0ae27f70ccc2a66e7501719f9a8adf21eeb2bd0126c9122af1f178e9d7bd943c012efc01fcf6bae57a0ed1d9cf5bfab8de5e2a895f17d22edc567ffa70d5ac0f9e28577f8e78599d9dc9c5c761428ac2fa0a3d7965c41d1d816ed2e69e4caa2f159baac300c614fd09eaf2c84fc09ababf6c4834c5c9122b337628320e3dfdf38906c61561c51935b2ae8f625220beeb5bdb77b5db2a7950b73499c2b32b638b72214276b28b3ce6f7b47b7434a5c6d63c0264c14351b2216d295458e93e617de5852a6404afb6a3e670f75cc8557e90a2ec988843eb865d00d9686001abb408c2b87953d0ade9a742b20e92a74e08efa88ef1cd50d73aa0d5fc834ea3013c8b0902e5f8bb0b4cbaef70f4439acecdcbf00cbe8b1ffa5279e65835de38d6384968180c6aea36c955deac073c512c803ab064155512fb8ace0a218d9c08205a125fc3e602f1db3138665abe0814bd44a1dc7c096ae8fdfa85e276c712384df7c6fc2f9293dde8f437fa12bcdb53e017046b729eb4922b7aad6b5e7eb03bd548396e289ca14feab394f900c698297a3e2111a550be73aa2a2711880854bc35e061d653340c3788d7748c213fb213caca527bff0e40d9094f24267c95bfd560210096440407dc7b8f1cfdbbb9f3d45921c2c0820c48a8c3a784eb394d68f42406d424febe72aa891cc89020097a6cb3de72c6da76625e4b9087e855810e300362b90328d21a01dfb245f158e4245f038882f198f7cd460fec3374df8b9c9951b5eebe907e75846a2e696d9bab9cdaebfa571e769f5c052c8582f42356496e0fe30679b2f520220dd96413bbc37ddea441ac2483ca9fc279944bd398dedf4d1492c1463841aaff5dae0c4cae78a2552acc35f3e449fedbec8f31b20250bacb1fc2e9437c3ec1606b30b6cf5d4daf08a8d8b555d68c9665d49198cbebaf1b3c6fc6d040684b2fa64a1584eb02d2cd5a8bedda87e6b6edf82a8a8133645d740dee7db4ea26c31427093fcaf3e6b97ddb38652c3380674a34ed90874fae1af92bc2eb93e7715903300a291045f4cca31f082ed3c059f95f3f1393affdaf441a90a3fddca9cc6b5473941b1f97e13ff413e434ff570f865724d816f042ebb1a62092a01f579c33d9b8db2e141611988dc7c7a6e82c4c9beb5e507cc5cd9e775ab6b7f1b3b921825a8908b16cc250e932972f4e4cbffc79c36ebb1b7469718003ca6f94717fe91fd0bfe4b1687855c70d1308241a5f61c71c6ca864f8349530a344204af378b63a3f5e431cc5d79960adc0dd7e7ac3f341f80c76debf738a2cb40516bdac919b8ad5dfc901854de4a28ac5cebe90dcd4460581829ec1e678aa13819c72bd03781588e598ddb7e9b0d5e743f9f93f3ce4ffef0ffb2483d46840bc9a63838c63d3d50590424efc1cafefc2bf1a8764f3ba2f87037a93c87e477f282eea4c406105ee7fa97b3c2395211239c0d6b66c0acfd3fd9aea0dc9a2143ba8ca13c6a7fec059a5604c101f9b010fd7422aa06c3685ebfe3e5b3b64e4aa097a64c30bcf10ed1484991fe1c88a7a50e62a1eaf06a2b1e1033db9c9fc5796c9d06b9538719633a76bad093a7c2636725d3a15bcdaf0fdd44bd1596effb2b599463e8fc5820ff54c0364a2e5db470724b373104f301c2d6bf6586b097196ec08c1a839904b265d0dba4f6925d7a7b1b2b11caa0709d6f57cce1ef9194f4f395efc3a9fdb9309eb50b0a0ab3afcc6b8a22bb1da5c3de00dbb453fe76910dc36a108673e872bc862f56c0be4d2e93f3d68aeeea19a4baeeb6f7ea9c868dda7d6b28c4c29765a434e8c9c312243a86fd41583208c39dd33945eb427d23e0f2dcc4a68429c86cc627796800bbb61f45f4d64e6a0fb9beec8e58ee7caee8ad232d3a438dd6370e3f3a8d398660172e8498da7586ca0471be727106a9eda2d8802d611917789cb3922467485d5d07b9ce2abdd5dc653bc9adeb723ab97e051974106868b3597ec584b38ab44ba98f0a957006b99ffae394b9d971cfed6d081498583a94967e1561ef4af8a90736ecad65de54049113d1e4537056003a47988662559907fd85e77e3ca4e52446ca6365fc354ddccd6be274aceeba71d73841c7212558c5424fc946c8e008594e26a540bcc32d4c7b5e7b2975d3843e1020b8ff44ef08d12e4dcc13e8a43e914b5e16e4effd2a10594b1f4a96d55c89178baaeda3d4582d6b3bc0ca4ae1da25d4f1b908c98a6e5e685e3772798be2b0b640fa1859f3b7741f2a25fa379fdbb3955db5376644c3bdef45ec52316080ecc2d866af966ab183685df83d4722f5d8a1edc39054d58670b04de95177d76becf90db92cddc8dc6b00f1f9d6944895f04dd6c0beef6a0ba4dbef1cd71876cf0695931ac955a7d2ce8d747d6cdb7e74493cb780fa65605a6ddf096a6b404f6b6242f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e42f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e746bedc1463cbdb2c1b151027d107888a93bccf4cde8b0ded8da4e956bf73bb583aa1fe8318a2e0c5e7514c38dd2a4ab27dacb12ff26d474d0884ec53c5ce2c522787c5044b273fd68e862eb33d56d662533e6a41d219445d9168354d71582a40e243274cb946c875b60ef27885b72cf0bd5791497f82eff21e902fecca2fe56ecb13535a09f1fd8ae298511a96a14a2ca896ded75c973e09605227ca1ec038acb1aba127ac820b5a7ef26fca6e34de58d4ef24ade9c413aa6a73ca06d26cc8bc0c26598b382e0c914f624253d20ee0b45f845b79ea8f47d1dcb18876898e98b15638986e30c0975af6ab2ff62575dad258ab14f75c3f7068c2117863e67b1832fdc1506968b7fdac79bb838f911dee5c20be68ae274d9f83d8d4c8e7493d6aadf6b7de41058bebc10f0ad0b5adf429625ebdac77a649b8a1aff6e92ee0976aa4c0d654eaa6ce0021883ebc2d8064eb0286c3a55e0ac5bee5540134aa8ec38323d6261da50d586bbafb457b85b8b141b7ec5e19133ac1d0aecef686574e2d292a17e00bd9d2b3ee7653bc55b6893ee86239fc25173bf138995b960a8d5e478a8e4d2d5de2dbe8f4e9f890c7ba78a3382b9b9f8b845551d3b1e2810d5c70021b9e78b75089f83408baab2e1927f8e2c6c311ccc84f32d61ed001d2f4fceb883a2b785f0781490b69011f769663e63e90f9bdebafab81133e3ae7d2a88983f8aa9b040c13b9e54acb907e6aaa668119d8b86b880af40c722358cc6ecf9e545d7b0a67d2c626e3c46e8505cb07ac740c6c38fb55964cf9f37194c91649812ed22a4ac1dc2b3210ef58b3ff49459edbf98e469d24ad4d893fd9f762e48c66bce2557fbf06c1ea07735d49672809e074afcb998a65fb579371de9c5e286e0263d00b9abc68675747b61157a92abaa6e5110169fb30f0ea3bd9118e34c58cebcb784ac0efbde1ec9ae5422776b3eee9031ce6a695f43e701e549a6f04e6c6ab2745c788434abdc1659cedb7fe597959b096ca23b6811ec8588af99572e9d9dfd04d8c2f8d5ebb2dc9b246f80db36624357472a0c8edff9fe0ac45e3eb88b4b4769818d7dd614385bf90c52dc5dbad475c6c0a70b9b6b152889ce08ae88423f2833009f0563ecf3612587092cbdc753f340a5851d22137e908bc9ade1e9081cac13f8dc18ac7e0eb86b20c129246ce490dfb7d97ae066cffd68f5e32c012dae93e39e9761513d8f64d558d1b904ee2ee198cb5a31d0faeecf1797d615d63befeee7643dece90d562f50fdd808c104bb79773e93271213770e145a56b653093c5c72ea41bcf2e73418b0ae9099f1048a20d9a541130691c8af3969e5686d90f4eaa1108ff7f5461acedf87f8cd0dde50a33330f390178c8b000f1a84ecedef4dfc6f806eaf75adf2968ac615df010aa027f1ca967479bef7137d68bdfa28c80701449393496653a9b60008b93fa31a33bccecc69bf2c9eee72b80d7f078c2ef629a39bb4520ad0420beb681f956e5551d3e0a5dcd75dd5e16ad9c0f4b56f3e9e9779b2f6cb43e9130d160a6ce8b66bb3fbe7b6b330f1085ed2578aa4dfcd8c665d4ea9a8231188c63163942a1630e55a2751159250f4ea9454779eb3d46a3b52850dc299414d9c1624a5403980e43c3d30f772bd6d78bf00ee7cdde5d1784780a1828cc32e38831607820ad5a89a29a87ca2ab99d6cd2fc61be74394a76df647ec0385c047b00fed469ecf9f8971bdbd2dcdec585cf85e18f118f6025b0258da6fc21db0b53ad4a15c5e1340daec9c9649a2ce7a6e2aa3d202307be6a1da7b6c7404a434866bf24225f99d0842b51cf5e0b6f08d5a03aaece376e16f387479a88019cbe1747da2f300a1be882f3111b6d1fb9cbdfae5b2d9ef8429b31378eeed06bdd5b9afcf7c2fac79d48cdfd5e9dd6cbf284e55cf3ef8e22b5f63b0d2bad664026aacac41ed8f1c9e6ce02f96bfe496117eabc1190b38ca980d7cdd20c5277e14b40eb30027f548b9d0ffb7e0778eea5a1f9766bcf85c00bd8ff669ea7a616cd0f4aa5113822935bf845be423e819403c9cb27be889f11f2a1297d7efbfa4bd021824c8dfd9ac2806c478e59e5c9a7dc7948de39862e62eae3874ba478c57c269a5278b2eed9278d2de68443ef44fba7d8ae68cfd66f52a42b7e444365e37dc57ef98f613daa942a5a9ea4e2480380168c27f7a96babdfa7f039764a259c4769a3f5560d0f8aa825354feead38ff1c376388cba5fe6f4860be9e44cb40392ec6d88da655f33373e60c97d9fc44b968492b603edd7392dda35d6d18b7589da78112e820c7dab3b1e208de2614d058546de4526dea593bfe70dc3bd15b3fdd4d897793902116e88e9b9a56e48d1f8bf57b9cdb109fb015592de63bec01423aa1a52b7f967836272b275b0c411896f88323720513bfef363281293be99b87859ae78d6843ded2160823ba4647653ad54ffe1015f1e012224a6d9143d360b918949e4c879d42413d361186e5c1fc838aee61d6a8876e0515b4e7be69adbe290e6087a1d55f2b27e418d43a4e0dda48be2b0fe79ef605c1991d78693ece080080be68922b15870413a7d27dad591deb4bdd64feb66ff9ea9c8fd454048310b57db36a3e60f2cd8c1e7ff4b277861bf75c0dbd7a58975a8958f80958fb96c126a430ad29242c5009b704f71bdfe4a26103ebea98a7377a77c93e8e8bb8c1799d8b97ec69dae82fa5427101c86f02e8987666d128e59a6228d6aad804c1df1d00cba5abb1c86c26bf7ffff06ee387cb1589eda22468bf56af7208f185e89a86039f2a776271098d94ad4eaebc82a10b1ac86e1a866ea74abb4349081462ea8d551f4834fbcaf347abaffe3af50a3827f6894dd3297a95adbdd4404f74bea25bc1c8a5495a680625196d8088a0a03d702cfcf9d7819aac7e85f9a7e61b99085203c4cdce282bac2d488faeb29b2cb274c86c0bf0fc770e8c85ba17330a67382363fb3152e6cb9b18831dd4bce2b80c67c7af3caed97a05c9d868017dfa1659b01e60f908029da4d3120d875dd907e2ddf07d6137754b165ddb063169c8d3e65ccbdb6719b6bdbca62f2e5746d2c1e040ed84d739aee242726b817e3e8b8b4ea9ecf35a8bb2da38287da1ec4f1d312ca5767fcf9102b23cee037f715aa442237b4d7e43bcd93b7b80a47d7489a8dfe8fedfae19380f5823686c750b47e938991e64233bfbf051a3ee0490f16740f8bbb89cd19fa83975326d236a067563a78ce707d0f4f5ee8a9dfbdc660295669dedcccc275fbc2cafe08190d90c3188cd82f22367c3e7c7bc393031279f39a826020cc62e8e5e2e9b5527b61d7cc30b594a9dd87342fe0e22e5f9ba165d7c5d13310d1fbde6f2165ccac898771b87c64f7572fa43718d10b95b25ebe946c4ea87a427676b21c7eb9ce7b766b22e6c7344de5254b1dc3d8cf87624a21138fb8ea04109f4a18f55dd1aab315f0a1066297a2e2faf54de860e8bf28f15d6f09ea6d23668ff7fcbec43fa8c225dc3ab2eee481df1688048852c8a011da21c750dd3c6c1c4359a2fbbbe02b647ba88ea8e11908f59cc8d71ca843131ee9a1f3f870b2a85506d36d233cac88696bdaba3e806f9a90973f10c0e5c58fcef79f07e612fbade1c56035695ded17d5bb7df8eec9a0938967eeb5c9f94faed4dffd5fe7df1bc19a52daabe2428f7831f8663be421b8897b68fcc1cd6664b09448136b73dceaf95d0bf7c0878384a1e2c882b104c0583eb211de6441b362f062981baf12e9758fe045d8c26cf2bd7c595b4e95300d9220e0d9b8ee6463bbafb730d3704d8a4e3ffb0edbcf8da5e5a89a6cc19f3d926d8d13f79986c80f2f34c03eb6f042bd2a46c731c65f09bb23a7e1e37b4dcaf7e1095805b5927796413544b48c2e9ec105ab123dba2a31625ca3747a2342924b8e85fd9d6e047fa0178ef77b0869ef7f988a2f6b457a6ab53cec0972b6d990a8f9809b2bae33efd6e20c199cec82f8b7b31ca6c508078d2d81993b1b48c3c15ce9843c5c961bfd5bbef07f64d28b450302fa4ae4377bada1593797bae251ea9f47ef3ae31ba99e3109810d4e1705fe68121151e8df4152536f9b64cabe937e1bf7f7e89243ee7ccfad9451802782dc5b58293e85f970aadf978c485537899dcf45120441b5a4a9e5ab1cc3400aeef1a10da996ba96bbef8d7eeb0c42da89a37bf5002702a0f8dedd53a13cbd97d22bb1f375f9731f5ec45384093baf7c78266bb941648a60680edb1f87522b5a5d9b13288f22663dbd804de58f5cdcfddec98b85d73da99a9a612e8243cb56dda4753874ddb23fee1d72b6e65ad4dfc7ad5d60cbef195126cdee3f00b31b5db8d2fbf90358cab8ed097756ce72df48a7deb2d1cd70d6254cedd36867be36c82a2796a8961d155cb4c5b7fb0fb38657a54e326001a4d762cb5ebdb1c0149065c0ba20d1417d76e71757e6535223244f0919c324ae34791b29ccc0da50a375015124bc18b4bab11cbe89be3d7a81d07998a084f3a4d9b3d25e1a19b996f3cce665a3bbbdfbb7bd601ea7de5050b4340786f5401a692d3ca636c14aca51fae9a26aff6cecc08a6be677bf77b3a93ef805afc79e8c525996e5e0e7c80acfa8923d4c6cbbfe6cbfed769ab28ecd6603a3e097631fdb0acaa4f9dbbca5f3eeb0f354343c3e1c96abb36e169ec4641a993e0388c7db025d7103d388a110bee886a704a0a38b4069e75c45fce5c7e7fa71a599ff488612d2445617d86c7e01468e9e80ce207a27dbbb23c899263eb2f4fa02d3fbf8b2652bde5da7d8b665e0acd81d137887275328d85c5bae0d04e90dae9630760e2bed828fb9e164b430911a60f5394fa9330422511c5df0d6fd65a42746fdb5b82218912fed75910e00a6f0b1975c6a0c1eb458f77b43e29936e533a91e1965ad60ff7947b7e6370a6eadc1897d68e933804d35d2a73b4e4179429fb387b1d5ebe7400a3c5913ca75d8dc5d370184d90500332703825e297ac1f192e164522da47b566cb4135cb1782416e08518e07a2f41e4d98f33f00337b59b3dfa3fe62b38668681e0c05e9eefead43e347e59e2364b0c92e74685493191a84a88cc421467de66b2b48d396e37e77df20bdf73e06d9a3d7b966d913dce9d6e9b24c10e95384518b64ade2d339cf74030a30633d221c047e80fa90be54763f5195d32e837996d05e0649a4dc2397a98b068d7613bb13b34fa12c5e1e093e4d9b1af72e087525e2ccf1350cbd02c0a781c41d13bbc2bc4bfe1f25757e210909a1de258d95ae47f775f9350522bf429c14690059b160b41695b6e8d257f9f4c67cf30365d07f55e5f9d99c41785dafcb79310ba10ce76e589487e1443ab521ba11fa11a837b9dc138350d402762bdfe034caafccee774c64ad441ee014040455cdd5de5ea20a244fcd6178a7ce55d0a0bc4ae06c36c2b356b8a714ebfc84306ef572dd10e50a32d0f64080e23922339503a0f8924c960408060e713b00b4e423e0b98e17b5f035b192ad818ef34704b47f596a2495568b3764f077263fd61d64dfdefac5235271999f2139ff21a028c2c6fb582f1b5b69ad78d9045f6e3c09752fd4260349d65c24d59d1c1e1b2702d7face6ffc470c5b5d91ad5af2127f4277837992c97f7f17e110ff2fc4b44e8011df0febedd5c1266dc81ca4ee46d235b49e1d01e8f7d68e3eb3ec6ae22a3ed61ccf0a48f260c99a66d16623d2a0867045f3fbd3b58ffe61d8615f0739db49208cc96991fd7e37068398fc76550cef68163f688ac869d19391710cd3dcc0ee71fe1cd4858b160b1dcb7392e9ad5fb3b1046e9de59e72340502d8a1258e50138c170e7936c01a2c358d9cb0101fcb70d7c5617431af577d4b869a4627ac0a49bd4d5b2a7bf3fa71e085a76d50085657bbb3ceaaa6f4763703c110016d02c0c20ec06085c7737f815f222de9084219056835796f69d5d3498e87c3ac623ae5cfddc69e185a9fa223b1eb336e32c5ce3d0153d5f2aeea046d4929adfb20d8d7ffb10c14fbdddaad394150d03746220f44a71d27eb6ffac38b25169e9cad5cebcae6b4e8f646ce6ac23790cfd1df8c8c7cf4b9b6a89a93356ef511236bb09d1df3f0c4d56822aaeaefbf56900bf0f7bc0ce8db12b43be231edbddb5f1b4e6375dda5b231887184f7f2d6bf6b69b38bd70f1ede27d95dcff01269b4420d434d739147115339bed7c8067e9a0805fb7ef84bf65dcac42ca463468aa8c438cd0574227367d728f066159f96f3110d50f46986e04db200e21cbc00ab4400f2268cd9209dca0e7b92c8fb935e81794436e9bc3ed90bb43a709aacabbee25986eaaa8526f852ab09634260f99c72cf492ae193c2385808846134048e774a27013580005fee33555a6af6d31fcd97684ca16bbd441f1b03f65cea4202a718fc3436400500aeda56f13a020c513d88c57e36544ddfb3b51e28f598429cc942411c34a13623194d3afc486fd938b6660836df3f173682dc5547545e41f8ba86426df2b70308aa5518a8bce9a1d00917b9f0623cc966c26b362c7a8f6d5a980f155134dc0354850325e2f145ce80952d329b3adab53ee0b2128a431e9e56e229a829f0bd657613f8b32b6fac97a94b9d3651f84a3b699bc97eaa5696cc6f897a845b163d95079c562c987dcc7b69e4db46d03e578ffb8a61c16c9632a417e95db8d2ad03196d719c5d47c271ea847625a2dbbff1805d6c4dc5da5abafbc210dbe39f4ba100dcf7ee276bda08f6e9828e102f8652340cb817f42d5cf59d4d42886b37f578f793278a313869d1419fe4244e71e14fa7d82a20790437d3d11969339642be3b67996b3330981f60d520bc47aa80c0f000ed4c625439402a6d8a144448c175d1b396824a8cb0986478920e9f2dd2aaea99dfd3611e4f5fe910321b6652c19d50d1ade267104858a23add0294e613c93abbf65ccf8d98d791105e72bf0101d770de2afb271b36cf3926631acaff70d0bca57c1d10747b025a9438cb48921b0151a9a4f3fcd25a9342c5878a35b743a5adfb0714ab55c610edcb6f82206a32dc5eaacb70563edb4aed0fd58434da07cdbe0fe4791e43b701d3e4cc6587c18e1d03498244d5f3cfa2966588cd6721d8edf66d5ee6f9ea9ad12ae95b0775bef6551446d09c572480383c60c09c9e1d53b5c88edf6f69911955303637e58d9bb28df425257f977738547b79c646bb76e2dc2a2d076ddda1649f78ff878719fb73b7fff2526f65f3d21f1569f1c0a7d2411bc6f2095bceda3a43a23d1d18c287902bb512159d9e9840243f3e11b83aea992b3888a375d014188c4134e4da54b91a981d33483c816d9aef44eb6b426f2e1e53fc95dbd61ada4107e86949b64d95e5b0fe7b48f4cc1abb55be6adcf75137089a4da8099ea8d33b13992a60999142abef64c4ae6797f6daa3568c10d7a7dfe6cad4e92abe75a238bcbd96ab2e69ef6a6c11a62286b70fba061f48bff1e0f173930cb37084e666f934755b5acd17a588c43c4557da60c42bb3e5cc9d9fc997fa1093e847fdc99d791345f2ef583100fbc5b256a011936183bb6218c84d0d055736a8d88d4417029305b5a5f8cf80f18a452e48b49519998900c3d4461db2dfc8dc9e29a53053efdf8ca637fcde2a23c33b8d026ac5ce3d3038da0094b4f310bdc5c930f2d3f4586b6eb7877ba2666c5866d5ab2d50c2c45b2a5d5e91ca332a1557578066226641f1b982244ee21955e989f4968c00952d0af2888deabc64976a17f050ebb5e2bd84a1b09eb3d56aca3ac96c59645605027e6a5be0e24eacbc2f573caa0ec16fec498374c320c8a2ad697b7c1f7a7109d9c612c7f1e0735c5975e77aec0a250b0b3f8c118055f0040ae1fda32db8cd04b4fb5cd7af3fc7f918d5aaaac321bca9c46a8031c1ad256e0e619f75752c618203f3878f517511b8009e3e7e16a8ae5bbfc87f89c90ce9a8e621a7e9f6d8231b310fd0e6e3f37c706034ea1b45cc22a934ac544459c6f1b678e4fdf6ce0298fb8eb92c2ee4adf8098856cff11d7b7c699fdc656bc6007667091e205f92e7dfbf7632be64175425a1cfb47c64a3539495070817c0dcd535d9397ca2b1af241dc0ef3f373a202629136ff3106d06c66717c4cc12bce5b9cdf79b77ee6873c41cdb4f0858ac4d2b2b45e874936d0ef8408ad8378aee6f71c80d66e33724764f11366105f356ba63193775a546911ebe71615ad8622424bb56ba0cea4e505faa00ec254d7926fbb0e72b850c609d55c3c79107c2a055505ded7d604fe60ba839885a0018cfbbdf161edc3ce7663e58cdb47c6d1e7b4894ae3556819471aca0bacb92064e26dc5aabfad0a9bbcff2bd102b778fa873962c011925db987f89c6e19b4b48f98ee30622eda896d81821b8bc098eb0aa0e153de061d04c2b57ede525c25104d96a4019aeb5d0b93bfc57d3cdc97c0c5136755e299bed691112e76c6ebb6313f9d1c71076d9492d5a88d842330e791b8a160743f25c29841ad66cc57cae2313370e154e8790d7c632763e09c13cb69597b0bb25eef374fc8bac79b6bc4a66699ad7fe9e5d1d5066a62482e17c29beb908b9e3c2387bce7400982caa85b9f830be574baf60328a21d6d53af336bcfdf66a8e13c6a1fb6c7c8b785f5c6850110bb1e2f989b8d200bfb49439ff9bbcc22e14f418c857d2e30aaa9101cba0629f9038a79c672b3ed6789315a534774e0bc1579aecccfeb47ba7dc20abbf5c0c0e154086f4b20884c834834b2198b2aea4bf1ab8ca59ab79ccb8333071e02fdf2c5de6af638d617f1af432eb7b4d5846fa4db8bd112f2ca17de1b0acd6c57e1194a55aa29f4c95f4d199ace3165b67c34eebd7d40b6cba0869c82068e720491bd718b2d42a934b07e3668fec95337cf564848983ce01f03a8d2698046b5de2a9bcd16e3ee64df6a2d54b986f152d4bcd4c965e153573670db20c47c8f27c71d7db666a347396918e3489489f92d7e45636516f2018e77ce9361d65857f97f6bea94103d861fdb89c9f57fe36bdea0db8b03e21492bcc92a9047ed000689518cb97a5929bd0d71e59efc56da5b490f4941ee079af4a6a02fdef27cb15c335a4feaa628451204f291b9d4be6110a7db35ffb77ce27734f677fc4afd303e0949dce23c13857835addf9449461b6117af3884296ebe0a90bbc3476aabcbbc6ac0cd89557a6f7e3c0cbf545b2ca0244c302a7880c6d53082433a9a06263cd5f0d1052e8de1b686506c5c5fe4a36cce6e85645fc6be034b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe959cdea44fdd98eb626c403d5490c654341b13a084839e6371d0a3f95c03c2936014c57840513a62e542ac5c88f6baaab95a8755fee194ee75fedb7d1ff531bfbb659df6670778a25ebee835818a5191ac2c8bcb317adfffbe5840b24536e6aeff23e90ddaac45d59c0b53e1cda32a6f6c3d33dac0cff671ebd6dc72fc62102b016101b2589ab6a4ed3f140e932f87b4408907fae3ff81690d1de4f7042a4a8bc57a1eee57c3a993b501cf7ca1719549715fb330cf0b5c9449c05228287d28d1cd19"); + + +pub struct UnstuckSnowbridge; + +impl OnRuntimeUpgrade for UnstuckSnowbridge { + fn on_runtime_upgrade() -> Weight { + if !is_bridge_stuck() { + return RocksDbWeight::get().reads(1); + } + + log::info!(target: LOG_TARGET, "Updating beacon checkpoint set to unstuck bridge."); + + let checkpoint = checkpoint(); + CurrentSyncCommittee::::set(sync_committee_keys(checkpoint.current_sync_committee)); + NextSyncCommittee::::kill(); + InitialCheckpointRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); + LatestExecutionState::::kill(); + FinalizedBeaconStateBuffer::::insert( + NEW_CHECKPOINT_HEADER_ROOT.into(), + snowbridge_beacon_primitives::CompactBeaconState { slot: checkpoint.header.slot, block_roots_root: checkpoint.block_roots_root }, + ); + LatestFinalizedBlockRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); + + RocksDbWeight::get().reads_writes(6, 6) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, TryRuntimeError> { + if !is_bridge_stuck() { + log::info!(target: LOG_TARGET, "Going to unstuck bridge."); + } else { + log::info!(target: LOG_TARGET, "Bridge is not stuck."); + } + Ok(vec![]) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { + frame_support::ensure!(!is_bridge_stuck(), "Bridge is still stuck."); + Ok(()) + } +} + +fn is_bridge_stuck() -> bool { + LatestFinalizedBlockRoot::::get() == LAST_IMPORTED_BEACON_HEADER.into() +} + +fn checkpoint() -> snowbridge_pallet_ethereum_client::types::CheckpointUpdate { + snowbridge_pallet_ethereum_client::types::CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") +} + +fn sync_committee_keys(sync_committee: snowbridge_pallet_ethereum_client::types::SyncCommittee) -> snowbridge_pallet_ethereum_client::types::SyncCommitteePrepared { + let prepared: snowbridge_pallet_ethereum_client::types::SyncCommitteePrepared = (&sync_committee) + .try_into() + .expect("checked by tests; qed"); + prepared +} + +#[test] +fn header_hash_matches() { + assert_eq!(checkpoint().header.hash_tree_root().expect("checked by tests; qed"), NEW_CHECKPOINT_HEADER_ROOT.into()); +} + From 1b0b738975d2dcd9121b3a23f170f007a8215536 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 16:04:46 +0200 Subject: [PATCH 02/22] more tests --- .../src/bridge_to_ethereum_unstuck.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 7390753677..99d9b6fb1f 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +use std::convert::TryInto; use crate::{ weights::RocksDbWeight, Runtime, }; @@ -99,3 +100,15 @@ fn header_hash_matches() { assert_eq!(checkpoint().header.hash_tree_root().expect("checked by tests; qed"), NEW_CHECKPOINT_HEADER_ROOT.into()); } +#[test] +fn can_decode_checkpoint() { + assert_ok!(snowbridge_pallet_ethereum_client::types::CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..])); +} + +#[test] +fn sync_committee_can_be_converted_to_prepared_keys() { + let prepared: snowbridge_pallet_ethereum_client::types::SyncCommitteePrepared = (&sync_committee) + .try_into(); + assert_ok(prepared); +} + From b13f7a97601e91759ebd8c5aabfb3a334f03b418 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 16:07:46 +0200 Subject: [PATCH 03/22] adds migration --- system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 37d537ba48..18b22d8604 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -24,6 +24,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod bridge_to_ethereum_config; pub mod bridge_to_kusama_config; +mod bridge_to_ethereum_unstuck; mod bridge_to_kusama_unstuck; mod weights; pub mod xcm_config; @@ -149,6 +150,7 @@ pub type Migrations = ( ConstU32, >, bridge_to_kusama_unstuck::BridgeToKusamaUnstuck, + bridge_to_ethereum_unstuck::UnstuckSnowbridge, pallet_collator_selection::migration::v2::MigrationToV2, // permanent pallet_xcm::migration::MigrateToLatestXcmVersion, From 68877e530e849c03a644aaed8b95549588205629 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Fri, 17 May 2024 16:23:15 +0200 Subject: [PATCH 04/22] Update system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs Co-authored-by: Adrian Catangiu --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 99d9b6fb1f..4abfdefa42 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -66,7 +66,7 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { if !is_bridge_stuck() { - log::info!(target: LOG_TARGET, "Going to unstuck bridge."); + log::info!(target: LOG_TARGET, "Going to unstuck Snowbridge."); } else { log::info!(target: LOG_TARGET, "Bridge is not stuck."); } From 1b555da4373db85e90252c769ce1fbe608ac8770 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Fri, 17 May 2024 16:23:23 +0200 Subject: [PATCH 05/22] Update system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs Co-authored-by: Adrian Catangiu --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 4abfdefa42..23520c4b8d 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -68,7 +68,7 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { if !is_bridge_stuck() { log::info!(target: LOG_TARGET, "Going to unstuck Snowbridge."); } else { - log::info!(target: LOG_TARGET, "Bridge is not stuck."); + log::info!(target: LOG_TARGET, "Snowbridge is not stuck."); } Ok(vec![]) } From dcee64e5d5ed80f1d22d32baaa37095a20ca6aab Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Fri, 17 May 2024 16:23:28 +0200 Subject: [PATCH 06/22] Update system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs Co-authored-by: Adrian Catangiu --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 23520c4b8d..9cc56866a9 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -75,7 +75,7 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { #[cfg(feature = "try-runtime")] fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { - frame_support::ensure!(!is_bridge_stuck(), "Bridge is still stuck."); + frame_support::ensure!(!is_bridge_stuck(), "Snowbridge is still stuck."); Ok(()) } } From bdde1f9712ff3037d4b6eea7090c676646e5488c Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 16:31:15 +0200 Subject: [PATCH 07/22] compiler fixes --- .../src/bridge_to_ethereum_unstuck.rs | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 99d9b6fb1f..c21d7726f9 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -19,7 +19,8 @@ use crate::{ weights::RocksDbWeight, Runtime, }; use codec::Decode; -use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; +use frame_support::{traits::OnRuntimeUpgrade, weights::Weight, assert_ok}; +use snowbridge_beacon_primitives::BlsError; use sp_core::H256; use snowbridge_pallet_ethereum_client::{CurrentSyncCommittee, NextSyncCommittee, InitialCheckpointRoot, LatestExecutionState, types::FinalizedBeaconStateBuffer, LatestFinalizedBlockRoot}; @@ -30,13 +31,13 @@ use sp_runtime::TryRuntimeError; #[cfg(feature = "try-runtime")] use sp_std::prelude::*; -const LOG_TARGET: &str = "runtime::bridge::migration"; +const LOG_TARGET: &str = "runtime::snowbridge::migration"; /// Last successful imported beacon header const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = hex_literal::hex!("8866b2286167938628be9eee938d21321837025f93725f9516b30dce5f8c11fa"); -const NEW_CHECKPOINT: [u8; 25122] = hex_literal::hex!("0x520080708a000000000001f2140000000000940aea29cc27e4c0d49ef156e437e8a11c30c80c55c04c08af82a139e1e4153110fab24f024fab4709b5c44d8e2f9b645dabe743b0fb535b9771e856b12ce3a13227d1f3b67e33bdddd0789f7eb0062f5915ac2c47150c767e5fff56552b6107b9095fea6f875454778517648e9e387aaf15cec76acf45e082f7f2fa33fedbb51a7cd7a5a2a85f97028006c832797782803fe2edbe2a3c5e2da51b1359de062de8ea7fa96f24bff84fefd7017d1e1b015b61251ba0f11007c35d6fcbead0b36ab85b4671136af19ceab86204acf823a1a6aacaddd4f9e103df36e00fd61f13baaf4bf467970f36b99c246cd546c11d61a81546818e798e438c59757cfb672f65174b8e7c5bdda7708fd74f385e1a0b14da3a9d19f1976013dd274ecd334876a58da521cf0dc61ab4f0f4efe0729f58fb40875cc752654c38c5731a3c47f255567990a768170e7ef7241593f6ece8ecf999a33c7cb7c5965d7919d6604cb4d757b71509ab9a7d44b740153f96e9ce177641e75e3977f19570e22cf79a7b5ebcf1ade0bd29448068331d4d2821dbeba946558f385a71c7834fde97379a416c1fbd74e858bf53d331b6dd09c20eae6da6f58238add7f888ff9d14e3bab0d76587d6a3263bd7087f862926cbc5d92794e7d74433d4ebd26834f3158f93b676dac18491b58a008c83086d5a313a808bc2ea87cd36093492e74a40037fe038766c6b3feaf98ee84a5fff6c1118ed6cbf98d99ab056ec1874444387337977711324e43cb9dbbf84d328876c5873bc712a83f62de509414565615ce87eb35b720607324a903708b46625788eddd9f83ba177bdefbb23fb35af2e1dbc4c3c70daa3d5d2c732ccb89aa0ca8962d9ced1ea35276b98b2af95aaf853e13b66425de03007cca28a32a948ec463498de1157e76dd6d5dd8356363c171036564cb53dea2c0c2ef4b62f872c577a6a29a8b446e2f145b00b71384b4e1d32a350e57028526c0e4031de67c3739fc815c3cfaed641b8e063608569163dd68aa8ce01e48c36314525016e04668b9df1d741cee60240701418d35992b88fe84fd018580f1d4dccdd58d280512ed0ceaba36480c84259aa3e8f7d602ca9b8f7695b1cd160796d2c1f230ff40fe69dace0e03554b2d496a787bac2a0ba72126973575be2895dc3df5a8fa3873a8a94ab9e92f37a50d9a9573a4b0e24ff55821f674f2fab99c4ece573d635b415f68237827439663ccd7157bd889b2a1af63ed81071ebdfaea91200e5602e4d8759935a333068d46c117d8e7518c0922ec8b3b04408b08d6af43909c3e1823af2ec579b5d860a790f5d21c234a3e13d64d244ed00f46af133c14ba69e113cb1945348ec8263e8fb5481c6768a38b29c75fc6635781ce2949bc08982d4b92bb9816154527903ee9968f27f0e7383fc83a3fba2e1eca9c79194cfffe6e57cdd84ac6094ff45f44e14091ea8d769b8f0f25c60b719c97ee7635835ec401dcaebb060a4eb891594add14fa0be6861f6eafe684618bb55147deff21dcf65c1c8e155e25a84a2a15f1a8e1b9ed26c58dc069028366d2a5fbe8d4d8ec6ea90f0735970b633f371bfcb3cdf700060d1e3a4ae8af0ee14e528dc175931a18020463b5794e9d266ddd356a6d377827a5d5bba702d1a4a9c33be33785175beb893c20d54631a5aa120cfd4fda9b5de8b0ac86e8f86c0fc6598ff80f5f2cb02dce934d17912428f722c0b68c99ca11802fb085e1ffad76cdd15e849095388428851b43a95983bf9c2675bc87cac621f68552533fcbeb19e06b1498d3df4f6e0359b19ec30e6ffc18d27c663a76ad106224e856d40925fc70ef05f8cb888992e3edd3c20b73a8f0648d5d58e04de317de82c4d32144df7b9511d20b44da626ec6588d8158cad2db14ad6940a5af0dd128d6b151acbed1571fa7439f56a73c58e889be548c5bc5b63d85150a3ab4cd859719c384d2994e891cb90ed7378a04e2d36278429b272ca81c55865a364aafa3d5240346989c4db46c50a09ecd2b135c2fcf2a274e58c14bc8ed9f787392879009b2bdc92dc596910012755bbd900ee46c594c8c6e593f6df9baae8787ca17fd44974504c6c94812defe94a878b37c8c9f0d6a188a446a000ab1cccfc0983b476ed8f4d178fa1cea06023cd2e8600c539842877c6ac94f0eec917a2232f88e1bc7069591b40e6a4fe8f604349a33aa6992f5ff11ff73bb9fa676f9d6ab1e08dcb246df59534a2793fe461d8562982022bbafce8b37f1d98d10e151be8b4b95b97fdec144bc2940b1ff407a9da5a5a1a0a8492e572ff9944d0e21abbad71f2b8c5509e7b64bd3123ee3f283959eb4e1b752a3873e827ad6f2d9199d1330dca7a9889f0884cee8ceb61f112a2f4569d73e403409f561d12a85d47f32b50142d3394cbe9997aba834ffbced35a67c0d602eb9933a3eca08d657d0c550b5fa64d4e8d9df44560dad489ea9a822e916e4dc613ad6e8071759cdead340fae99a23318842242285c4eb6a1976e10c527650186dff573b3b02db2697049b708fcc67bab8477480c26f0e6ac4d6089433d3799f34df757fd09e7a6605aecd79aece1aa9a101ff61f2fa9f03fd573a188b18560de6b148327d13dc097f8f4e77ff7f04b58c743294fca2f89f30fb125d449ef3929a811d122e15810f074ccaf290446b0f77698ea3e5c663c2c9539a1637cf167316ffd0b0941e480b05cd88ea11467cb7bbd61458c8d12fa2d1816007dc74f007b17541816689b890ca51e83293647dd7c4ef14a5612dfac38416bb4860c4179e6d76fd5a4afb1ae7f78f88ca43c1731dfd42f3e5b20ddf920ad098b5b5d5832a0e6a599ab1aaeb2294e404ab79b5a7fb1a022b612661712739a32a9d0fdf13179029f3d39c46ea029972a39fe622fb9ae82d8e5959c54a1984e67cd4f60cf36032092f39d6d62728f34220081735c6c064682af870883504b8d9676d7409477d251728b6aee3eaa3467eb491b74dcca7c9c0067e4a36917c7bd8a8c9439892c26d7980b67dbdd334538c95f05438838da906ab327dc99998881c2f1663ebecc8ef1535918169ecc3a64971ef905eec8bfe998837abad2f65e0196168c7b928fee34b0e499bdbd97f8a4c57d1efa1dce03b405900dbf0109b315266c5cf3d0fa2b626cf02217b9621fd8884f03a836bae647acdfe49485ae299894ce11339f6aeb078f28055c730a18097ee708681bb015bbfaf5094fb3d2ec98a1590fc9391742f0e2ed05f33996a49e6ef5687db8be0c7d7de3b700a54b727e5741049f683a008ffa5f2e2f1f83d281ffeed756a7a477207b6f3360168b13f75d39256afa2d357914519ce104af23ccce1f03b91df63584c5acc2c9f67dd20f2913abe56fc4b011d11a9ff1de83497bb4b001a6ace5739088c6e17a356a14f97ce878311745cec46b058d0adeaf7dd0004846a73a6b79efb05139d85594a31078712b6c11983136d50e5895b08e06913477b6443de60c85ca5cab6e2a7ae799161791d78674305082262d010fb84fe9441c6fc66456f4fdf722d1f889fac449cc1563071098d039d2904ff1fe46aa3392109c1f2eb8477ac6fd8f7a71b7335500fe720bb23aa864e2b094a51ed369cd2615ea3b17de97c52b4ace914126ff9ea5b2c7c30d413b6186dbbbe7afb2a102c22d1bf616d7afa20fa9eed6802ce5a165ed6f1d9f1779ab7dcb6dcfe874ff1cf812b71f1b54ad288d53ea16668bb5c9123ecd53f6cd05ca0fae2118939bcf43d4b0de098e72018735b70a2b74f82afa890abb133da2ea87d18d547e29b5e4ec4ec8fd286b503d50cbae947699165d5529a2912efea5a07dbe19240a271aa9a4f161bb024f5aa112c0409d3b919735d50cf00fc5b3c9d1f5a7ed09ac05045c1b23f5e02a82277a792b921ef675e3e318b27bd27ee869dafd25f2690aa8b3fd5040d2985d4b9476ed0b8a6eecf9b0852270ea7288ec92e24184d845d608b81c52dfc0ec242711d443924c3c84148383a862e41ed8ab22fc85ec678edee00f61ac92a28728a2bfe3da566fb5f9dbff2edae13d1edbd3d5fed7dfab1ff85daf789a5c449f17e5c22102d269b648ae75a8a3a9a1bb57b419ccb5331ac7a7deb308d64c1dfe606f120269c7fedfd6f3a3b2d260119903d4269b63543a9349d89e4e20afa050fb87cc91585628456f8ba5dd056f9bc34a81f82d374adf278f3b925dbe0f22e4092984a022109127e694b14368fc2aae1feb00c67cf42b91e2e0501e6b2bee9a8699753ea4f58ca4eb0fb11bd32173fadf098eed0d0348d7fa0a881200faa25f3af847de7a42254214389db4565712c0720e2a5321b56dedd70785ecd3c18071df550a595b460539a153bb414143a7f46c2c78aa766bf2a88e32fb463a51ba8ac7dff808fac5ffd1a9698d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826a4911842526a32087692c3c45960f370b10052c4a8caa3d8872d8821c8f2387b701e0319f913cd0bfcb5a6d38eeef1d2b1c7aeb71e4c6ca0e3e1614795ed746c2dd5bd07de082baf478a8c7fec59e2060ba8c015f289545a25b9f278cb29324782a7b7df647af67dc5ac5f82e144b3162f757fed2150f42c59c1c8644ef7e9efab902907247cf63a1751974f0954274285111345b4e0d0e8553b7fbf0007d614e9a67f5563195b98cb77a3d08ed519c047e8b0660456d512dc1af58ee4a7f12380fd420f44a41c865ef2ee576488b08cb803b4a41cc878304e3434267aafe1668a62ef22c74c6298799dec09bb68dffe920ece825fcf710ca6ed805be2d947319646b850ee40e6f1aadc4aaaed89da8e7585c3a0687ecf2bf2d27a59d67f5db5b8555047a55d7aa87cf2244ccbd82f9f287d4c6fc61aeca969f0c17fc377444feab3b55aa7280ad4debaf8cdaae972a3a60b602b2f0fafea0d2afb55b06e884e02d86d90b433e5f7781fb3d182f792f81b9747f528b1dcde994ac72fdedf066f931ff4a5b05b57775632ec5ea6dc3560a6919ca82348903e5245a4da54aad05aaa9970043fbeeea3250e2e63d4ab0643b6c279e718c44a5dd283e4b1bb6ff876ddd0868b80da00bf872c522bb1e9835c1d8c9861ef5a455ac5c816adf43b5916951235de7ec61c200616a83af6f1cb18665688fcc957a2dd28ad911f1b5b82c96f89fec7f64d17dc115dab08d3878d50a1672feaf6dee4b9bd7101eb26cd67d1a136e9c18c97151730829be4211798241ce7ca15349a23bb0bf10996561e6dfdaec3571a80dbb6b7981a56abcb0abffb110137efdf5d9258f6b35d703312465ae947576be7f8dfef0cfee97b4666e1d8a2f326ddf32ccce7c114a827e65348461e7c2a66ded66fb89c0d95506033f5e9d6cb8a235f7beb2d49c7729d7c536f618ff95801359d44b1dc4fb14dc215e850aa20df734701a21ad89315f25ac620ec7f7a1aaca2deb1beebbcbbacf7c54df5b9ef38e4893e77bd5e285f02ce7b5b0c4477fe46d6b0187a768eb0a33d91b49a331632b28a9e164487e4838f24dba0528f1a722ce5210e343cd531bfcdbcd2936326e0b9881a555ad97bc19eeeb308e8aff73cc2fa8c11b96ae1b8c83fbaf7c5a49554ea71624fdd5ccc377b6af318375f33bf344af84d0240acd68584251e032bc143dd0c2796ae25c48151295c82c7a17d2e5aab9b7ef2d50c9eec62365ca71679a4f5045f5390d96e9018bc88a758c1dd2b4397e617dbd9dfd7cd632f84c1a7eec6ad2d20cc851eda9b3253d96befdc4ef45206ba7b9dbdb2b8a6e69c689c48aea9b126e620db0c588fd5c7e405c4b72d5c03c253a4ac150f7ffdc9cd69e7e606c5eaa8590c7a389ff1ed3de21201f664f01d20992f4747339d3a48524f3686356397881935be9afcc5e16850bb8a40b869c9f03ac7cc49cc02f190cec7b8ff8464d64eb3f374d04dbe8b3d3e0727a2a1850e5c2f7b5a16cdc5ed55592947c8d1dec392e56632946f386bc56d4fa3a09400824508125b48785436c5693f4e99e62e2ec62fcae44a9af8080c0063a6e9bc7e1ba9e377c36b329e77c0abbdcd03df5dbbc069badb9f517fbe06519f90ad6b3f82a4e63d206cb6fbc4f5fa15062be4808a3924269ed1784926abfeb82bfcb8f5f4a305a8a1a99a96d9f68ab8c38e70b5d3ea4ed706ecd7604acd52c60e854469132493e8bc14ec3a1668f974ebb5f2ab65630fb07a8f0a3c8745b122088884c0abba4885f963ea29cfb142f0f0385cc8420bdb1eac2c1a70549883fef1204989e667a710c07f37cebc8e2fd7ddb1a6ae98282bd4e82002857fa92d4458a6c6fb856ec13f83c31a3c6e57552aec15d30017eacd01fa3bcbc90dfcc756eda50c7019bb6f22052e36b64431886143b0636d47d15c69e1f4a40e392abb6d50d0288f34e963e9625fbb416836587d7b8171425e6472442f78941457c76ff131b432dc83cee60245c482f6eaa48812a6345344855dd2916468f9908c6857bc7eb05219fceb609ffa3c4acfc23907fd8185645b614a80f5bed03ee1c723bf9c7324f376f88536a78091de87df89c251c382efc893feb41afd17d02f17891e84defef493806f959e6b7bbf19f44c032a3ab3d79e6cfd4d602a2e00901f46ae10ef8d838495449118e8132dfc420c02be5f37ff72ee95601bccead77901176bc7ba0e2b8ff0e7eb66adccdfd7e123dafc93ac2aa0bd38e21b92fc609ddaf17b6ef8c02f26fdc8122a4c2a4b906e29429260c69800fe6b0b2193ad49f851c7130c9aac7196b9122df4024578f5cf8ec999a22f5569b254abfbdf552341c4b35c1a9955284d77d1d561b9a407e4ba227b760e88ddd4a93dfd6a5df8f3178931bec5690e826509e20725c79dcfb9d134bb8159b98bf1c976cf0e708a5da90fff176dd889d75f559f59bac3a07229c2fcd87b52a8c29a5e471d48c30a8e662c88a867fdbb26f57f88e428522391c5ab960a698c9357613c4efaa3c8c902eca73073f943434ba236135f38d8da35af0edfc90c09e7179ad38ef18b73365e38df872a3c2b8fbc6800f1dfbe8f3a2bafe36ec315777bb74c145844696cf877317ca4fd9ced86098dff5d5a0d9925b718e256ce2a63a7e450c7abc7da24a9d2e2ac169a3825129f84cb4b9dd5f42d5ff05f63ceb0142be4ffa432b6ea8d80006fd6a2f2e0b0b186f9a9eedc64d6ab1942252514fbaa6346d9180d6691494f37f4b6aeea118666f9c784b8cea8ef906e394ad4733f3bb2449504438740fa8fd10a97cd287bf86ddaf050bfef118c3da4dda7b0d16555378cc34c306608bb502844c2673ed4808c2d751dc21da4a48d48c095510d5a1330e48043cb1486f14af2b4f8659384219c6983d8254655079b991b185a01178eb81c29da857c604d4fff201ac94f13e4b9081bd9838eabc7e2dd078dbe84dc14ea767b32d96c9c9ebc0a6bd21ebc32b483ddec6cb85671acfa9f5487ebb7e6c589f3af4063244a785cefd3ae8584c50aba91c6fa1721f02b6ee230b17795c5c998431f8e088d2fffe1c5ea154403b82268b5df336a7f1823e96eb56b88314ee100f719d842760a0bc1ea47394ef4b1dea737a583a913b68aee961890e157471e0b39a0b1828ca4fef21af330c3c57e00b135075e845feb34589acd63ab1f6cada1252c9e0594180f0bd9b9a3465191758a151b7ec9091901d3d80136ca72ad88aaa3dbe110e7078efcb9c165408c4a73a11bcc80ae53a80b035d4018640a8e53b8e374b3f746df77a7398f00ffe98384146ad2e81fa85e1bc22c0b093d3c1c35b46c12777617d4c152ce73928af98592e66831f03604f003b621ad0e070704967ea91bb668631249ed97475c1eda6a42a8f6f8ae6476e165e25a72460680d0ed56bfcb3161885fbc770308790d39e1a6ccaf3057ae01de336fcd4bbde72c32b4a74a1b7ff0a0b76f32e88fe7a66b6f0fa360e144288656610552e564d8fa27c624ca3b71afac49945b4397235c20ceafaed87cdae23d1d859b7047f12db145c56a52433c90ef4555f1af0092d1eb32bf5b96eb11d4de6f81b430cc3665669d2789840c7276ba346a4b0708c9da56ca72cd549b85221c622ad5aa405305316559a8278ace913f689c06d68c63529b1ab8843a0378c2f6bd40ea6851c76ffe6ace0e9d2ebd39bcc8f878f8b72f68abc296e465db3a3f7b8892bea7291f92e82faea385c793ed013babb68d39f57074dc651d3f083eae28b26806d993f88dfe21bcde991da3efaf833329a3352422b5affcb652c618cbb8d154ffcbd69343f3516a02c626c61563c2a29bdd4b197027016eb7f60fd69396ad2a258ed63acdaa86c1a0bbd50ff1624e47dbc820bbc2169c17ccaddda93d93ab900971b1606341d9b2da21685fad153b9c711917834199b2608a5c1879f88d53e93cfd56747d3591c525cc506c5adb880c1767400ebaf0d6c68c5cd4ad81e9af454b565def6221625d8395a5c490715844bfc618c23a3e59c42909a12c2f18de4281ec6dc3ef1779b16de3664e56e130a0f99e64bc6c1330eca257a6dcc611e781d3d00b68bca10e8c67f33de54041f5238f154f849cb864744c4a71a803d0d5683d022a4ca80c5db7a25399b315f6cc5d10df07ce536c35f48e1c736a7cc2bfa839383f04cabd65ba6c5ad1de7a4e84a9051f11013650a96bb56189c36f14cf162795efedbf61b0a24f15986bd5ede461242573144a8d6d76c2d1532549f63c066e88556a74e05199a517a91ab689a2252a645ba457c8a13752950c07ada64a9264548f7e2a92aeab53b5d4161a1670defe510bfbcda516d7b5cef76ff8662b0dd046bba591f7d46c9405d7d05989d627438e02479c23f704c7a0ba4b597963ac0a3f523313d5f920b8ac61e24de79aec534b7e643ff4df321b64217e20128c88e83411a0eaeb6e6c264db61819ffcb0c0fe269d5aa6e7d648141e64163d2a0e5ccb44a2492e735ff839fc0911acded26b178713f1bb6c845a00416ec6e5f72eb9a1095fa70c91fb4b1a9928f39a055b339882904c9df5c3d4d4e2947eb1cb3ea56296654df6c77aaacd68500dbc45513f1cc41434c3cf485abd4e8b226fc479f22f40d3dba59086ddb9c7a2e0c813e8f1dd58504569ac9b60781ed0d4eb209575cbce5b31096745aa5e84e08f5ea02e543fcac4d37730d5b1475248ae0f78a63b0a48cffcaf802d8db5bb644327a775dce7bc28658bf8160ab4ddc4926dfab69e1925fd3a4234dbf817cc5c44dc25592722b7a75bc116ba94c32f82b36704baf2809fef5afdd894ca660ff2fba1fabecaaa54b3572369516ce608b2b27bef586ce90675834bcf07e5182ce2eb11bf3f19d94e24c2d229bc8a638c2c5af50f5ef770567b612e372ec730e9df6ab3b1c7aa6aec2f3ed5d0abf01b16a9d1feb7c6e913d13f977b828d08aacf510e97882b1a87bea91795a2b5d12069f7978174301cf64fa05ee524a568d9faa42d1446a65cabb1cf1d06a271d8a1a8b30d876845383433af1d31fee583e2d1112be3167dba6242fc0af1a5545da24b0eb3f7cd50e2fc21b9233c85373ab9ef14139a2938155438d0560cc9d3f16b6cd4b1bf8e932b147be879912a2bf957ebd98241d1937316475f15462b865b84501a80d0003f9258375437c50bb25aa9ee37c22a6a6c6ea067123844e56b79cb18bb58d2975f28698e47d0871180a99baa125bd3c864ffdd370dcdc4d9d235e5bc2dcfb4ba551e7b1f85ccde552d5e1c2ac63761ff4ce1dfb0ea052684f6c888644d00ff83569dbd285573eec71f8a8672916c82a470814f777dc27713b905eb06416d76c12bf81fe493aec8c6d7a89459afddc6d949ff95356de103c56cc144591a68255cb28a2eed3e624ddee61694c5561925040a37aa96ec4a27652f5a55deee5b486f861e05a347234e465410cee7d09bee7a1ea6fba484883735339a522c4be592564ac66f96d918d0e497f89f3540a7f8c8bb5e38d46f4f30fe9a0aa57f3b6b78ef32b1902dfd188a47e12efd47291ee774392e3c9b0e58f52be2e8671d17618d76629d4681270bc4052f4d20fbe45edba9909973ac9aefcbf972821bfe3d1afcb533e8de08654c1a01bd681c37ad1daac4493e31855687d8340199fac45f771bdecd7c85b21564e4f2b0aee0d70ea1182cc9da5e939b488f8ca2297da1583347c959b2248f3d61769aba21a9e6407a83699258f7df385f14917efd46e4208c81fa84e93d0bb9ddbfb68aa9417e45eb0fa4786b2c3e5b1c41fcc175fc719e588288dac7556d30caa72a027d733a3d41f4d19a9fc385a249ee2f6ccb817746b45b1122738028f34e71272c7a16093743e00786b36f32f28899bb81e63217bf4bdc70ec23e748b83f925843fae57081669fb804c53733fa999ab6e87cc4c1fffb83898ea5237e3ec8a561a3d02cf71a076c8a102ce1f9f61a5275f8d90df010ee4e093b96cb53753589472cffbd24c1128d7a9e85811fcad66d219deecaeb6f01b4fab9ff8b6c75ed1213d73b97b31a32390737ddd99cb2076d79c860be03d6e35f78b8fb59363f3a44503662dcb6ee7a634a087e18d451a2ac6e19a9179b020877c236368a1d1e2fa127ab932da6ad9fe8c2f61da8a356fbb37f2e6c86a147013720e294b960bf8ad6604448a44cfc9c00966b0020f6d2eff691fbbff9505d6fd3e48ffdb54928795d1fa831b95b67f7805fa6a19e4eb0dcd7b1c49b4530f4be07193c7e8bd271f7694968f16349f7532f4d2d697740d4fcb949c97d03128d274bbc52b5f28063fc735ca7f9403d51137390e7c0de3cb1ad83a2afa680f4fe2dd40ce4cb9add58d38a20eedfebd7fbe6a2dc59231feeda3fb523bb1869cc13c9e3c0028be94bcbe06c918140c8d71638580b8b5e06cb9cb8f24d32c225f53bd7909a9473bc03170485384e48f55b9ca1261fd8f6e6f3e44dc113205442fe8fde7610f1c67263df2150f7d31a71ca0b6c1b95d30f56f70b912249d86ab9615471711ce3805d1ede785e678e1039bcaa22d6de39092b7eedd716ad738cb313947e8ac39663221038b5711a76da558fe6f4dd4d59b78de9482a39a6bf4453c948f0237fa68fa83566ad294266e88ed2ac8ddbde41567c8854095c42e5aa943045f30f0c619011fcd87bd19b7302c5ae572b3e69a4610fc90e496d55285b652ff723b72ad55b6afe0f90598450caeb0bf0fb42a689c942a5cab1ce0547bad1e575bf29a1c063c8087dd5a8e9791f67f6789926ee2e2dbc853de026f37e3b584fed0fae0974cb5897597011a9b7b967001f4bdf712d804b814c901e27c9b33ffbc02690e1d25e1db8ebb1d437fe4aa2501952911b187d0f84470c359fe1e0900a96c25af8e291e71cf48fa14afca0ec0398657bb0119565ceef78f1baeb382d58e480492437a49f9ed0be97a43b5bdf416b82ef3d3f25e3b4010cfd494be23b0b942086c781cc59602353c0820a3884ae091bf72136303b1d4ad231963d378e17386992cd6044e96d3f1b44036f09577f5b7b2dfa5b523e380a7bc90cfd391576609d3e7bc2d8fb9a2eb84fa4b5881474a3647e6a51fb7c5919e1dede1b479bc157a3b3fe9d556f4b8c378dc23d082e0df126fa74ffb10baa4169c78065d9cd0e422d8718f006510248227f9dceb1756120e42813df5de46c3e0683b685b8405bdc363a10d989a565bf46aa3fe1576de2580747053ca840e5374a0bc1ad01c896fb90a5a1133a20e581b27d4e271aeb0ef7a713c605fe0b8e1d821b6b96797c199b09b412f480fa5162ce5295f4cbaa2c74be1a4b312c961d5048b35509cb0006be505b56b129719bd2c8a66d76922f8ca54aba66e4f311230373c72aca00dd63f8bd8befede5203ac4812193f478691b1e23de1edfdcc5b7c42fd784700d3b52120d70dbd7f130e7517795f5451e06ee746ba2a90809747169f24498b4ca64331fc0f4f5b0dea6568292b773caa8d01f76e3a0bd4426d0fa8e8459d3f4f2f4d4e391c86f629b408ee7ce13163f0a823810c62eed089e179d4a8737f7218b5dac38b79cfad5198a637eb0493ed81933fca9adaf046ab27eb018a1b58d28bb3a6dac4459b1587071304910f2f9ea91f65cb0a3dbc7cc4357ec2bab469649631e3cda618ed9f6c3e2751d4694806858660ce2f5406dce9a6d451773827d53b67264f38bc49c5c06e11406c2c34f26c0d362b314890e33d3588e40ec939c8a4acd117495001b184530fca9daa18174d28211f64d46b366f45157cba6683d54e028d9caed95963f0e9c4135760dc3f0d837292a38d00bacef4cda7b0ed7c52b0daebc5bc55dd7da4381b601cff3aea5a5c8c5daf74c11671f9044bf6f316b761aadaffb8523cba0963f8af1272732c65d07fd7d972586a85e739daa5d368f946712a3b6cb2f5fe908e58e57a25c69a518e25db751601701e185fc1383d582bff621c9e31b0e0016b9a54630ae51b863288dc448c332e17102cb79f2b2402ed1498838660e0a4a08f4eacfd363f81cf3275cd93a1f7a87fe6a9d2f0ff2f8b422cc7f09b19d99587d8d0011f002ca017b48e89c27bf4199683dbb95d6026a742cffcc9db1798eeb6edcef6f191e0fcf01e4e3d0e049ee8406d068ba6ae7baf0927b734e563e48f2d42bf6d5f9ebe6cdd95d65b473298e9633c86e2a134fd9ff8034be8836a4b4de46b1170487d5504130a979e2a4ef477e0b09e5ed13a556e813db0ef15f82f68769b800f93c6dbea2755c1416dcfedab1e2cbc6c4b2e5dd3391591dbcd268fc63802e492b344302f8fdce7834b80dd64e74a6d7e1da763b8b35a6c33964ca7742abb5454586dc60a54418df564a436fd34f011ea5f2371d2bb7230ec17507fb052eff41bb5cb07f7203cd43ee2e9218697efa8da41d21d10d922b6b773e148cc8758ab9d9196a220a1a37608d107e5c86d8740142d71ab6d83d82ca52bbe9656ecc3e53e210ba390fdada90eff88696c52c2fd76f1eac6c1dcd75cf57019c9b62a5d51490b565ae9354f2e70d38a84f546696ffa263383736b99951e37acce9be25e7f0f73b9dc37fab5bcf974bbb652bc373d781dc26bdfa04cec38d41eae85c93c15c483934473e931a2b8dcda808e6737b27ee05f537608f2bf991b9665290f8ce718fe2a625789843cd35512b5614ea3da1561320212a64d898862385d6ea27c09e4f6bc8f89c7b678c50b769453331d37cf8bb53d4d827de7799aab0af57dddb751b144950c5445b8b07374c22d840c9c23fc958f4948f1db9176ea845c657043396e417a664b3618e0b688caa828a95262d5204a682cba8ce8d6cfaa03010f8606b3251cc78fbe2240ab6b745a49b81c4eb25c3f5522a54cbf3758b2240409baea45b5c850f381a5c8e3c5e82aa74b9405d0c0409bc27d9949584c7f09b64c5d16db3636a7318e9baa871eb30ceb122dfda4e3038f66ddb811f804934e6ac7d59938784f3c9b1198d0fc6b0eedf65179feadebe8b60b43de33abfac8c241d7c2a69ec461b67f1ab8b11c599faa81a58281f9d9882a9b03f307e333baa5d10abe158b35307e2f63166d674676d1a2eb37802ee804d57a4e946d4a7853970561efd0c4d06bf427354fb8dbccdbd57c3ddd50ff01b331e8549fbc5a47b4d5a002efa0c4649cb3f0dfb66495573dbfbd7b4cef37613040560530197e3c210d303f32a4ab3b83af08d5101d54cce5596faca914dd06a5d08bcbaf2bb8bd737e2de76fe96327699428881f5e32e7c94873949d9fd2cb32cbbcfa640fa9404f344e824cf6b663834e08b6add8f2f2d111f39f07c4f01446fb69d7f12f6a3dd53788939c9d19bdf2519a8e4d20883570b3acba5e2755270ee99a5d93f56c2b9e2328857ef082c413d7e7410b1351f4177ee5cd9f95f6ccd094a920ea44e11c274754cc257c8a8a3a87ec1ea3e5a1e4e63211e41241a045ecef0dd349f4a81f0521aa615e262ee0e4576f915cae0eaec114dca45250186292d88afc9722dd5352ca439da267db8824e27a5489f074eb3465a0c70302fe8d9c717e7603732fcfb26083b86550d69f6e6ee78b902e8e375fab5b26d2d8ad47331ab7827ee9d557e0b25b5492119642a6dd2d5b606c16b06541243f60afd360f7902ad683808dc887290c0235bf4eb0e80e0a35c6f3cad89bb1b5c5085254dbcdc7bbb31e51f854c4e7c50da9b73d79e1225734a99e2afd2ca07e8e0fcaa9b8e458fceb38d5e9ed7d118aafc2918ad84aa118b05bad0101d37c6c7d54bd0446ea41caff863facf77d2d254199ea20669cb02a30ef5d29636ea28798c118555e3a54b9af3879aeef01277c405cb29ed04fc783c09475d37a177dd5e5c95c0080c2401bd8bb00f55db9a4e09fda2da986c6c008528a9e18001521866ac2ea9a7535eb12f4ac2df73467dab54449f86c52ec44ee26fb84b11d3ff54d97702642b13f2438844c8f946019437bee664f331d7b4411b1a0c7b04d942a35e6740610f40dfdc7af96ee46b3c2c6d3d9fe7cc0300a672964897a04f3501a648e97775d185d51f763a36fc5228fbcd62d6c14809cccf260af52928dd2cb92274e2c8d4002685fcf8351c54299e7e3d340753590d2530621f6913395e4c4e6817f16a0ff6c36c7c6a4a54f08c103fed66e5ee7272721c4d5491a413ca4e980c3ba35595703e3bae1a4b2e020a97ad0031fe44e219a99dfde70a7d6a8d0b488fb119cca89e2088b230c700e1e151c9a30fbc1fa1b52261e7317971930cc16996dadb3ff17ab9ae8b3dc11349ca0f8831a646f3ad75fc7c43d7bf54764f975a443d801ed1d69d6e502d69447c5fd2e90e2b895e384eb12a09cb2d52f7e99ef7e2c61239ebf23ac6c8949b384e01ce65d15ebe54eb4d488443885adbf12b281e92e50027f81e1d7ed0896fdd6fda8b9b26f903f1fa0fb2ebe67c32285f05c9d5862cc5cd809176dcf8e0bb282e94acfa5a3d9c59c2aa9fd6f8c01909d08336c0be5c2b641f590a0c8e238410789050076e7f79c48f6ef3605d30e8f6916cc5146f86a08b0fa3fe9b8d5d69f6881fe06577caf5c191ef65438451c0535650f3707147aecee1501a1c3ccc68c1a218eb0c7628c8939145340a7313415b991f3810448663ad269848214be3aa625c00e801adbe1512eed43f043abd2a4992c17147f356d0081009b1821741f0545616a5557c6d867490e77a24940381770832508a043bfcca6364ae6ff573f922b472b84ce26581196ae29d777c231305a8909d46a70ac28a737e27dce20cd34289272755e326273cea4e4a9cb0387923c67fef39a9eef474818aee3297cd689c736c2491d2d9f587b4f9c90f4537eeb68e1c3ccd6ef2d9c5a3acd9b27aaddb671cc2b2811aa8c436808b3a3b50721e93b5aaa4d70cfaeb19614466478673d249cd30796197ce380d5a6198eb2d51e88bc58333de530828cc2be887f0451c1a52bfbf075171fc74df10ab9500e535ceb40ea64694a0c4e9aeb7fb32c0559af90bc13644cba2b02570de0c0bd55d0de73818927337b818b778bb9a4aaa491fb2ef5a5b397491611d05e8d3d2ef0505991b818b28e85f9ae105c6b66ab6eda8726b11387c5cd4abfeaea8fc910101fe168532e601f6490112feb284ee90dae1892131a348ac070f59f22fb3ff3b07b5f269c9426302bc4a2922f229ddf8ac58f914ebb3dbaf3349a3ca36ae02bcb2e74969e5aae5b1eaafecbfe19985b219490263970aa5eb876bdfa4fa5ab5a856c4841733b4a886e89e048230f634402dbc796496e10aff7be1222777e93a416523ac6c36114c953648316885f4409a31f92c1bcf1ec60ae8d2f7414ed8077523c198fbd285e9a3163d50d4e972c301d400b5eb73b5cf03c8dfeddcc9e0781671d8a093f0e45a40d7f5dff7984decc15fb298805b105276a4fb0eb75e36dc20fca75e5f10152f1458cd77ccdcc7605d7bb3c85453723137cc5321830e1a2646a2b7595687f11f64f0227c9f2fc8937e8a218ac0db55da223fa0df40872000d72e6f27be9ccc92e8889c33cde8daddc1864d395eafb200bfa54451e18913eb6306d2d1da4fc4ebfde6bc6941556ce28134a737f46652fc673115bafdf4317bd94bc4aa4938ae234d177a36d3c5eb0e4f2b683ebe4d59358264056270cf6548dac3e1bec19d536d87c041ee9ea2110ef6ec21392a5d32e417a0b12c11563c6bab02ce83264a95aeb4736bdadf130997009cb7faadde51a9d9d48aa10c727c46f7e5b07b96b83d9d93342dbaa8be52b5b3a4ac1e73dbdfb02519a8ce5934c40c57741c8c66b0a2c0024e7520858410c4a5558268af3066e5507918a01fcfc495bcad91b8244d80c381c86af510c6a50c0c20092506fa397999ca074518a42987d67cacbaa2b4e0e40ae1522b9de3cd9d02f7e73999d9ec3e2ac9e6c5a3b0346db6301d3c30d6c8492e1c50c611a263c91a7dfd1a61b7cb1e307fa478a2c3b45518eaab9f6c91407e9d7f41fb76ddc73e8cfc87f9bfefd2773be7b96d6d5b81e7b85a884800b162555081eb6bf2f03bcacdab6e5250ca5eac19134afebc7bdf3bfbdd7294c830046ca55fc91f2f68eeef9ef1ccdb3a365cfefe66ecf597b1efeebec83942155f9ed8f35c1f91ebbbaa9eafe4308be905f1fb19cdaeb76e1b61e93fa5202b2d30a51435c2236c65caf447e982db873651565fcac7ecccbcd2d6e5fd3d6615bcfe19f5c919c7da38bfea1ca2d5f1db0674c330696bbbfd4be4fbc69beef6f3c2aa00e803b2b1d881d989a00b3187909bf6599258cc86be287c5d271581f5e8fac6de11381e55e6401a5ecf53e1973abfcae291b92ae2fdc3919569c9780a640909262b41cc33dc62585bb16ac60b0a9aa57a9ff05858eaa28d8a500e3268ecb8bf79fc8bfd33ca2a4982b61cc9244269100f4412f541ec3c40c2105d3fb68a302f6c8f4aebb40f8c869e0ff8afd53ae14bd5f74174eea2d797aaa84b91e39a0095ee38adf7dd2931b51310071f605ae657d155176bfaed310ce9f8b8931ad5dce2d41f1978263b3803a94d47d7f9ad25739a6fd3f52bc861afb6d5762e92db317f7b08a0fb193ca1c515cdf2f83a6b3d007bb86b11ee91b12a6421763be3c774dfe7ec9f042e62cfb9d4fcd6da52894289b8f1897a2cf08d5d8b53e7457a04f0894d1de6d05a4531ea3625da7bdbd9251a71e6b7314a16163ffb62004b72eb8322d55ad8a3a9b91a5c780017729f6a89943b952cd232837c683b3c1c020b342ea6921f5aab4f87a5a6ffcf1541d81879599a0c0e3dbe98d4dce8564df2910dcd5d491dd12687166de1a43565c79b4278226ab6c61169267302df9a4d7b18d8f8ebdd910f2ed56fbef8b8895c7990991653f72eca3e2f505c975cc0d77a53723bb51a4c3bab093839b061e4e88973c853d1249ca694e75b4d327320a135ea17fb51a110affdd0505ff93e7a2aced341a5cc1d3c04fcdb6bc13e7e59b9985e7a3919a21fef0ca2706b832013bb627782f0cb3cba7791a1c8b03572ef4982cd89d7c8d35fb8147b82ba4af88d0d53e19957ae5fa41347396e55ca80aa4e4dbed40c82f1b5d755cdcb1f4dc6de1f308443ff9f1269439548f4865ec7d762e4963961f6c5a17cb83069e3970cc8cc8c6cf0dad76efc661d79b42b23d82609e227cfb278ad0110ca536bc5f3665d76ebcc5a0f10161058f7a172306baf62a71c0a6fa1a2d8e89e6cf8a8e6da96aea0c121f9a3c90845b71bec1aafeab7dd34928f193744f03f5b883b800dd2a0ca79385ee02e73111159172a510206181ddc313270db4cd90188245a6cfbd4573c165eea1ad64206c38c95b285f2f5e806388b0e1f1ba64320261f1a09afb753bbd74838a54cc8572757cd5b86ae843159bd89db4b0474f8ff6713cc4d65d917be3ea6f357b497a19e3b67b8e9914cc53f50917433c1a08f2e060034b00f407367aea56bbab122da6994ab44585c446d58f5b8e11d8d845ded46b43f288c34978b09255cce1ba9441d1e02de432e2ba46e7799dd4897c3f5fbf06793d4adf1b74dbb711cf2099495e2aa382ed29b1da8528d38521b7de8a6835e991cbb60911b89568c1b0a6efdbe0a5871b9e73fcf90e1980c9a7fa31d9f41b52897fda9b96d9ec5f3592864089a52d473d5726fb9a39ba408626a42ee3695774907e1a004823f0d7e7e45f82c7e1e9d4b1c9372462018455cae340b5b45c76a817b8e2307261a140a2e492e99003d02abbb4d06d22d3e6a3d770fbb1a9330221de5800868b2086d030feb7e530b025d17f5df7c931443998f2eb99d10ae9d60bbc4bacad5e1b875af1797bd572fb5a7a87c7fcedf96514c82ee6d0421a7992185f3d4564d71ba3b15e04b4abdbd14e60eb5be63d8f146c09820193fd2d03822a504e51c05107133632839d2d14587d919f28362efad61f1a95efa9859be6f3367ba4ff469c2e0583012c97f18b7d55bb64067a8d46136806cd76c43294e406255627ad7dc1c377e8c9628378334f6dd60241b9462baedc5cc571042303cb82205df0a072dd9fbcde460151a009b46feeea6e5fa33a2f32aeab78859a5e6776e2ec6338f1ec25e948fbb6a979f72fe68b567a99b1d417ffd15b395390affea3facc8902e63383cc8324619185b27c40d41463e3ae7921fa1895af2e3575054e2695508a661035b1c14de6ee2a1f5e960d41579d7211501712974a8416809520432fe09f7efc26d38dcb2d4572bae78888d55aa54d93e947c7d52bf0d0d14815991086c8cbbe03e1b9a79992a81bfb0279887f0601df93494639f3b2436f55b2080185de13c5481c1f73e3b166df76e9386e22cfe8a06fef536260b31effeea3bb6e9b4060c1d543f18cf7810196e77cb066ad324c7c22c0fb8be056e4de1b2693fc9346c1d2bd6c774aa2803ce9f25f6db6384a6c09c3f95a7ad087bea14eea1ec59b5641c3add4ff8fbc034234f426cc2ed1132a4ebd7125c92092bf05e0182d1e7e129b1b619c173dc272b5672e56d1a7b4f3ae47948ad38a9255563f7dff4b87a1d9fcb52a6bd7eaa9ab716d74da66516f67825fd6b1b5daa8131db746548059d7c9659748f8b121a736e8b418a7ebd3bcc4f12c11157a127b92bbed927bdc30c9ab6213b1960f6cf09430f8f888a5ef00ea4296c2440ef051dfdd668477a20cc3913fe1e6e3373324ac11e20ad2a1b8ce4883a544dcf59d3d6d0c2a73333523a9f57263919fab62ae3281547762157e1f709d6d3d6fc019258fce3759fc28ad7222d0352130ded97e494c52988d2d6eb59f28cc604e059d3ca10171dd3086291b465d79275597896382ab0c771b98ed35aa280beb4d32878e938b54553e47f51ed86f22eeded670f8474a5dff10a96facefcd1914a44061bc9613f3167298f5c0efaf7a3a8196f5ce8f160f27775b83dc304aac97a0072ef9eaa0fe8db70c02f2d78921b07acd49958f6a8b71bd391f8300d81079eb982f8f229614a860dd776e5bbcca3242cea3c5e52d10a87cc5097f9a26bb9c81b27ce6b6fbdd583b919c9ee89c031139f119be807fa34be8aedef6eb101dc62d3b526bb510195b8b457a4c6987b47159d179d588fbc2a1a8bb984066eddc2fc94f2c53f4cfbb483fcbbf7cf777c80a23d1f30c24e10dd9fcb8401ae6e1494e5fa18b90939e6a90aa8c3e618350889bb0b9b907da82e4beb109f30eb8c94e328c5ade1a658172c693ab4888a5470c59f22f953482ba2fd07adb5a46df8f91910cba34dc1fdadc1271edd8827af5e6090d63f958216d48570d4b4cc12ddf5d1200cb24e3a449f4b1c38dcc8105c83c8433179e979d7ac6c59134170b37c42593838513c5c05254d9127105840cb749c39a22b3e5b0080acbf5e2c5b81e80744336f4dcc4aebbedd5274b90ebbe3396fb3113897949b8bd3ea17b74d30a458fe147cbe53b87740c49ecace13cc3a679f21479fb2d136487a619fc438741f186ae496948a88e861076d581625554d5fb4dddff9269811bcd58b1b92644ef97e83a61b8a48f79a14b435a51fcd44b39ae3fe94f9f8fc706fe7960c3f96d55971f3e35d3bd9f86f7f811b47a73b5d1904e03249fbe99f762be1679807bf507e9e1b8e57a1d56c7322ebce97ce8e2e938c042d261b454a498156ba0442ad80d00bb5e514e30ba50da063793acf5299e9a7ebadcd40573bbb1bd68c54851c5192c8e67efc992cb85b451b5a520725da699828f0ae21f6b197a09621c12bca34be9a8e3933dbadc589306564b22bc2e867487bfd840b188b2c2b1eaf600a67f5beaff2d1b83eb798e4db8d1fe57ded3554365f52010816948eec7a61ed7a47a39f3db46ec0cbbf49214fa101a877c039598ea0f1c2940313ffe92cb78e1546a68877f6be960d4ff08c114b9ae1cf7e565ccac103094e58b85cffc7455eab53015e809f2d3ad95b0cde27b0952e766a62f99edd0d069f16ce05ceb3921b32886e2c55949c9e0a4e68aed79ebc883579d3172ee32858c73365bfd9bfea2907180471162bedd4dbe82bdb42b5c90814c1734e42cb4a683ebd094852ec0bface78999ae44611e18c15e6c349910f753c1eb078ff16f5e2a65bb4bc924200b621f7b877169df30003dc4a20788cae6221f50b6b4167752234c9ef64ee7c2490e9521f9248b28f2effbb806f8b1c4f83801593225f3fabba095e18472eb72b04ea9da9a6e262d25c76061503ef7db222538d0fa84e9caee1a005cf4fc6b4b26614c81249ffde3955be3108cbad3acbff358c4f76682635dd4284055d7cd74c506570f94a9efc2d090dee520171b225b98b39f3b20c992c8df9e4ba5b5c834b530815520becc61d6fa83658978087f0b26858208555ad9f268e48daf8fb463f215ca9c49a68c9612db7156b08b07eccb4a907468adeed4ffc006217ffa50630cbf9c4d9a3897e6864e3e99997407f1a57d9de8228ede138b29d2958e17e18471e7138ddff3a2b86c21e69dd45cdc94414a2dab30cb2703b8556fd6f3e70ba851c8acc622f0deebde5d087b895f64007c152d7987d2eeba49a044d4849aed1c756d59c736c0c3a096384354c9effab943020cf535a7889d5911811ca16fe26d602ad5a9185436ceca847627e19495144f9c040df87cfd758457b44951e2e0e640f032d323024acab208e2f3a6fa5400e390ee6eac23c5437203ab501ff17aabcadb329f55ac1de86457cb567a10efc265e43b8ff10b0799ff045fcdb7a42572cddd8ab4a9c7827472cee65e99066824b52b42df6708c13628d65bf19b17ce2fd620420c5fab5a028c7510e5b052619d1ae376117c3823b158af66106879c6b9b6ab121fad7a212bcb96a644a4f3d9e646c38e56f5a9cfda294aca518d91a7000aa5312ddf86078e2fe88cd36003d460f0aad718d46dd76afb1a712d2c6d347ffc77d248be336440ab10be5180d951ee9b21c658b83c00af18d6304acb780fd48cc56d7a0732ec9da7277100fd7d86db8154b63a3b5dbfbfd9784f9d8fbfa26c3efc5ae8ff66ad0f65e5cbe1902a16f48e707cc9a072bde8a1412cc9b5b834c8d08bf69bc6c61e3fd74d3b9ba1be524c364f3ba9dcc3d14d764d415f80e94defdec67460e2237e09d3654a4348912d8c3ea99aeed2e3af50a090ac86851eb3641ac983d28641417fa756fa496437fdcd7d04717d899f0e49c68f4913f68614ab57618813d82722bacba2a0b2a3349dd8e14d3d1ebb6a566071d8556b1319e25e814cb739e5c03682666d4c20553f038645e4812542cf3079413a88fbb5a9ec5d3009b30e56d0664590eb52942f00aad556b6411f42593eb5f59a9c2177f3d28431cd1136395da074a0aff7b98aaa5a804268c9eb17373a8a81b4cc45f6d0a35eb7c1d21ba09c31a6b7280bb5f612f5596540ebe58fe0231d0d77c142804d59422b836104f7e0a56bbc47258bcdc6ac2c394cf9286ea07a2e9b2c10e050d8badaebdab38344ca4a687f25146aa9f58923b359205a403d503b1b2d07690cfd6cf5b671b0880179e4ea3f2794fa05e2a44a500dc574b1ae0462048e1860968ffc10886394e1ec3673ffffbb3273f9401629be4f476abaec54a0e9904ffd1b3f5f7fb79de2ba3e821a5c9223257fa89050f82ba6ae807a714ab7aa24ee86819a3d173e0a901566054b9b8519a68cff2763b9a5599b98153d8f4416f1d9daa938836cd232dac659815dbc67f7faed3ef8f123102359e3e586ac95a8bed1684d1cb24a2b83b4af35433d0b1c0a438d9137e0047e14e636c7743c81c00c7a9a2a60674159fa5fded2af3948cfd5b5c4e701798af03b346ff60921eccc6a2f29a9f17d1829ae02b34c911825b91e8026d08a3706e3e829ea6604018e8031ad32f36ebea10558d3ec0875be3ac90b667baa48f390ca42fba1dff05fc80e88c4dc1f2282f91f41a58089a1920e6fd60751aca2a214deaa1d1774822b8011658ff282fda630a8f486f94d31b201aa779d97c8e43b8c58768de4d1b5803254749db9a35e9553355ff5a2a37cf2f8fe61a46b941f30f9456d2ad64793cecd9009223f8fd0a66940cee1045c835c4c5868ee5da5a9d4c13b45f657be97542ea7f4ab39b408d4d51a2ad2fa583ad94cc2f6e2b1a8cfc27e824e403273929b53d62acf20d10df16dac8b4859d8861f9d3d87eddb85d356c98914a116d910fea39e00fa46f0c29fffd32646b956d64e48a317486373abc1ca1a73496c1bb6f54a269e999883ed5b6d68130039d3972fab0c245fd5de9dcfb2c4138fd850c3825b6d3c4a0c8bc3c9f3e74df9113f7bc611a2f22d0794711f272fd42cf6d9bba9c92574822d4b8eddea2d05b36070e451aad887efdba63dafb47e68930e27cc6432e9a9fc5aaa87de3ccbad9cf88677df4d40a66b72e37208a982867251cee4f4bbc73a24eeba30d31674420359d657626b8674f5e7b5c516a6af51a70bcd91f7d0e148ec8a94f561ea77471a3ab7e7415be788fd58524137b518c9df4c1fb9f9d528ade33eb6d00cfce4b07a1860a70f170e468c92c9864cb855720f7d73b6fda28fd9f8ac1c93da7c5faff8c9ca3ed396433deffba6c5593c0178ff859e7a928a657cca9460f6d62478c80ef8bea67c4e427fceec253dbd518569327ca1b95b2839075b4792520441c7b6934e5e05766ce61209672482fe1e41ee51291ee7b35f0dd1c4b3a3f270856fb5ffa9bf230b069413850b810ca53f2bd77897049115b1b091a61d2c2e07fdb771729895ba7c874b43122769f46340ebcbf61574327e5be6335d66b273da02e3969085a75f09f75b5c79dbc5d41d7914adc3da4c840444edda24a287adc3934fb3b1de927eade5bd4940dea180e3720f8a1cfb70a8b07429a27b59e9bc6c415f31ca6664f664be5a05e93c3b205633d659c1bb64daccbabfaee67f8adef7bf0d6f40320193897a1d3782442d5f8aa99680af63f2a43081c8ba23dae5f86e07a2d10643cf8e7fc549c82e17a4c427a683cf21d44c74b508efc6151f17e36d67f0cd734466bda0ae27f70ccc2a66e7501719f9a8adf21eeb2bd0126c9122af1f178e9d7bd943c012efc01fcf6bae57a0ed1d9cf5bfab8de5e2a895f17d22edc567ffa70d5ac0f9e28577f8e78599d9dc9c5c761428ac2fa0a3d7965c41d1d816ed2e69e4caa2f159baac300c614fd09eaf2c84fc09ababf6c4834c5c9122b337628320e3dfdf38906c61561c51935b2ae8f625220beeb5bdb77b5db2a7950b73499c2b32b638b72214276b28b3ce6f7b47b7434a5c6d63c0264c14351b2216d295458e93e617de5852a6404afb6a3e670f75cc8557e90a2ec988843eb865d00d9686001abb408c2b87953d0ade9a742b20e92a74e08efa88ef1cd50d73aa0d5fc834ea3013c8b0902e5f8bb0b4cbaef70f4439acecdcbf00cbe8b1ffa5279e65835de38d6384968180c6aea36c955deac073c512c803ab064155512fb8ace0a218d9c08205a125fc3e602f1db3138665abe0814bd44a1dc7c096ae8fdfa85e276c712384df7c6fc2f9293dde8f437fa12bcdb53e017046b729eb4922b7aad6b5e7eb03bd548396e289ca14feab394f900c698297a3e2111a550be73aa2a2711880854bc35e061d653340c3788d7748c213fb213caca527bff0e40d9094f24267c95bfd560210096440407dc7b8f1cfdbbb9f3d45921c2c0820c48a8c3a784eb394d68f42406d424febe72aa891cc89020097a6cb3de72c6da76625e4b9087e855810e300362b90328d21a01dfb245f158e4245f038882f198f7cd460fec3374df8b9c9951b5eebe907e75846a2e696d9bab9cdaebfa571e769f5c052c8582f42356496e0fe30679b2f520220dd96413bbc37ddea441ac2483ca9fc279944bd398dedf4d1492c1463841aaff5dae0c4cae78a2552acc35f3e449fedbec8f31b20250bacb1fc2e9437c3ec1606b30b6cf5d4daf08a8d8b555d68c9665d49198cbebaf1b3c6fc6d040684b2fa64a1584eb02d2cd5a8bedda87e6b6edf82a8a8133645d740dee7db4ea26c31427093fcaf3e6b97ddb38652c3380674a34ed90874fae1af92bc2eb93e7715903300a291045f4cca31f082ed3c059f95f3f1393affdaf441a90a3fddca9cc6b5473941b1f97e13ff413e434ff570f865724d816f042ebb1a62092a01f579c33d9b8db2e141611988dc7c7a6e82c4c9beb5e507cc5cd9e775ab6b7f1b3b921825a8908b16cc250e932972f4e4cbffc79c36ebb1b7469718003ca6f94717fe91fd0bfe4b1687855c70d1308241a5f61c71c6ca864f8349530a344204af378b63a3f5e431cc5d79960adc0dd7e7ac3f341f80c76debf738a2cb40516bdac919b8ad5dfc901854de4a28ac5cebe90dcd4460581829ec1e678aa13819c72bd03781588e598ddb7e9b0d5e743f9f93f3ce4ffef0ffb2483d46840bc9a63838c63d3d50590424efc1cafefc2bf1a8764f3ba2f87037a93c87e477f282eea4c406105ee7fa97b3c2395211239c0d6b66c0acfd3fd9aea0dc9a2143ba8ca13c6a7fec059a5604c101f9b010fd7422aa06c3685ebfe3e5b3b64e4aa097a64c30bcf10ed1484991fe1c88a7a50e62a1eaf06a2b1e1033db9c9fc5796c9d06b9538719633a76bad093a7c2636725d3a15bcdaf0fdd44bd1596effb2b599463e8fc5820ff54c0364a2e5db470724b373104f301c2d6bf6586b097196ec08c1a839904b265d0dba4f6925d7a7b1b2b11caa0709d6f57cce1ef9194f4f395efc3a9fdb9309eb50b0a0ab3afcc6b8a22bb1da5c3de00dbb453fe76910dc36a108673e872bc862f56c0be4d2e93f3d68aeeea19a4baeeb6f7ea9c868dda7d6b28c4c29765a434e8c9c312243a86fd41583208c39dd33945eb427d23e0f2dcc4a68429c86cc627796800bbb61f45f4d64e6a0fb9beec8e58ee7caee8ad232d3a438dd6370e3f3a8d398660172e8498da7586ca0471be727106a9eda2d8802d611917789cb3922467485d5d07b9ce2abdd5dc653bc9adeb723ab97e051974106868b3597ec584b38ab44ba98f0a957006b99ffae394b9d971cfed6d081498583a94967e1561ef4af8a90736ecad65de54049113d1e4537056003a47988662559907fd85e77e3ca4e52446ca6365fc354ddccd6be274aceeba71d73841c7212558c5424fc946c8e008594e26a540bcc32d4c7b5e7b2975d3843e1020b8ff44ef08d12e4dcc13e8a43e914b5e16e4effd2a10594b1f4a96d55c89178baaeda3d4582d6b3bc0ca4ae1da25d4f1b908c98a6e5e685e3772798be2b0b640fa1859f3b7741f2a25fa379fdbb3955db5376644c3bdef45ec52316080ecc2d866af966ab183685df83d4722f5d8a1edc39054d58670b04de95177d76becf90db92cddc8dc6b00f1f9d6944895f04dd6c0beef6a0ba4dbef1cd71876cf0695931ac955a7d2ce8d747d6cdb7e74493cb780fa65605a6ddf096a6b404f6b6242f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e42f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e746bedc1463cbdb2c1b151027d107888a93bccf4cde8b0ded8da4e956bf73bb583aa1fe8318a2e0c5e7514c38dd2a4ab27dacb12ff26d474d0884ec53c5ce2c522787c5044b273fd68e862eb33d56d662533e6a41d219445d9168354d71582a40e243274cb946c875b60ef27885b72cf0bd5791497f82eff21e902fecca2fe56ecb13535a09f1fd8ae298511a96a14a2ca896ded75c973e09605227ca1ec038acb1aba127ac820b5a7ef26fca6e34de58d4ef24ade9c413aa6a73ca06d26cc8bc0c26598b382e0c914f624253d20ee0b45f845b79ea8f47d1dcb18876898e98b15638986e30c0975af6ab2ff62575dad258ab14f75c3f7068c2117863e67b1832fdc1506968b7fdac79bb838f911dee5c20be68ae274d9f83d8d4c8e7493d6aadf6b7de41058bebc10f0ad0b5adf429625ebdac77a649b8a1aff6e92ee0976aa4c0d654eaa6ce0021883ebc2d8064eb0286c3a55e0ac5bee5540134aa8ec38323d6261da50d586bbafb457b85b8b141b7ec5e19133ac1d0aecef686574e2d292a17e00bd9d2b3ee7653bc55b6893ee86239fc25173bf138995b960a8d5e478a8e4d2d5de2dbe8f4e9f890c7ba78a3382b9b9f8b845551d3b1e2810d5c70021b9e78b75089f83408baab2e1927f8e2c6c311ccc84f32d61ed001d2f4fceb883a2b785f0781490b69011f769663e63e90f9bdebafab81133e3ae7d2a88983f8aa9b040c13b9e54acb907e6aaa668119d8b86b880af40c722358cc6ecf9e545d7b0a67d2c626e3c46e8505cb07ac740c6c38fb55964cf9f37194c91649812ed22a4ac1dc2b3210ef58b3ff49459edbf98e469d24ad4d893fd9f762e48c66bce2557fbf06c1ea07735d49672809e074afcb998a65fb579371de9c5e286e0263d00b9abc68675747b61157a92abaa6e5110169fb30f0ea3bd9118e34c58cebcb784ac0efbde1ec9ae5422776b3eee9031ce6a695f43e701e549a6f04e6c6ab2745c788434abdc1659cedb7fe597959b096ca23b6811ec8588af99572e9d9dfd04d8c2f8d5ebb2dc9b246f80db36624357472a0c8edff9fe0ac45e3eb88b4b4769818d7dd614385bf90c52dc5dbad475c6c0a70b9b6b152889ce08ae88423f2833009f0563ecf3612587092cbdc753f340a5851d22137e908bc9ade1e9081cac13f8dc18ac7e0eb86b20c129246ce490dfb7d97ae066cffd68f5e32c012dae93e39e9761513d8f64d558d1b904ee2ee198cb5a31d0faeecf1797d615d63befeee7643dece90d562f50fdd808c104bb79773e93271213770e145a56b653093c5c72ea41bcf2e73418b0ae9099f1048a20d9a541130691c8af3969e5686d90f4eaa1108ff7f5461acedf87f8cd0dde50a33330f390178c8b000f1a84ecedef4dfc6f806eaf75adf2968ac615df010aa027f1ca967479bef7137d68bdfa28c80701449393496653a9b60008b93fa31a33bccecc69bf2c9eee72b80d7f078c2ef629a39bb4520ad0420beb681f956e5551d3e0a5dcd75dd5e16ad9c0f4b56f3e9e9779b2f6cb43e9130d160a6ce8b66bb3fbe7b6b330f1085ed2578aa4dfcd8c665d4ea9a8231188c63163942a1630e55a2751159250f4ea9454779eb3d46a3b52850dc299414d9c1624a5403980e43c3d30f772bd6d78bf00ee7cdde5d1784780a1828cc32e38831607820ad5a89a29a87ca2ab99d6cd2fc61be74394a76df647ec0385c047b00fed469ecf9f8971bdbd2dcdec585cf85e18f118f6025b0258da6fc21db0b53ad4a15c5e1340daec9c9649a2ce7a6e2aa3d202307be6a1da7b6c7404a434866bf24225f99d0842b51cf5e0b6f08d5a03aaece376e16f387479a88019cbe1747da2f300a1be882f3111b6d1fb9cbdfae5b2d9ef8429b31378eeed06bdd5b9afcf7c2fac79d48cdfd5e9dd6cbf284e55cf3ef8e22b5f63b0d2bad664026aacac41ed8f1c9e6ce02f96bfe496117eabc1190b38ca980d7cdd20c5277e14b40eb30027f548b9d0ffb7e0778eea5a1f9766bcf85c00bd8ff669ea7a616cd0f4aa5113822935bf845be423e819403c9cb27be889f11f2a1297d7efbfa4bd021824c8dfd9ac2806c478e59e5c9a7dc7948de39862e62eae3874ba478c57c269a5278b2eed9278d2de68443ef44fba7d8ae68cfd66f52a42b7e444365e37dc57ef98f613daa942a5a9ea4e2480380168c27f7a96babdfa7f039764a259c4769a3f5560d0f8aa825354feead38ff1c376388cba5fe6f4860be9e44cb40392ec6d88da655f33373e60c97d9fc44b968492b603edd7392dda35d6d18b7589da78112e820c7dab3b1e208de2614d058546de4526dea593bfe70dc3bd15b3fdd4d897793902116e88e9b9a56e48d1f8bf57b9cdb109fb015592de63bec01423aa1a52b7f967836272b275b0c411896f88323720513bfef363281293be99b87859ae78d6843ded2160823ba4647653ad54ffe1015f1e012224a6d9143d360b918949e4c879d42413d361186e5c1fc838aee61d6a8876e0515b4e7be69adbe290e6087a1d55f2b27e418d43a4e0dda48be2b0fe79ef605c1991d78693ece080080be68922b15870413a7d27dad591deb4bdd64feb66ff9ea9c8fd454048310b57db36a3e60f2cd8c1e7ff4b277861bf75c0dbd7a58975a8958f80958fb96c126a430ad29242c5009b704f71bdfe4a26103ebea98a7377a77c93e8e8bb8c1799d8b97ec69dae82fa5427101c86f02e8987666d128e59a6228d6aad804c1df1d00cba5abb1c86c26bf7ffff06ee387cb1589eda22468bf56af7208f185e89a86039f2a776271098d94ad4eaebc82a10b1ac86e1a866ea74abb4349081462ea8d551f4834fbcaf347abaffe3af50a3827f6894dd3297a95adbdd4404f74bea25bc1c8a5495a680625196d8088a0a03d702cfcf9d7819aac7e85f9a7e61b99085203c4cdce282bac2d488faeb29b2cb274c86c0bf0fc770e8c85ba17330a67382363fb3152e6cb9b18831dd4bce2b80c67c7af3caed97a05c9d868017dfa1659b01e60f908029da4d3120d875dd907e2ddf07d6137754b165ddb063169c8d3e65ccbdb6719b6bdbca62f2e5746d2c1e040ed84d739aee242726b817e3e8b8b4ea9ecf35a8bb2da38287da1ec4f1d312ca5767fcf9102b23cee037f715aa442237b4d7e43bcd93b7b80a47d7489a8dfe8fedfae19380f5823686c750b47e938991e64233bfbf051a3ee0490f16740f8bbb89cd19fa83975326d236a067563a78ce707d0f4f5ee8a9dfbdc660295669dedcccc275fbc2cafe08190d90c3188cd82f22367c3e7c7bc393031279f39a826020cc62e8e5e2e9b5527b61d7cc30b594a9dd87342fe0e22e5f9ba165d7c5d13310d1fbde6f2165ccac898771b87c64f7572fa43718d10b95b25ebe946c4ea87a427676b21c7eb9ce7b766b22e6c7344de5254b1dc3d8cf87624a21138fb8ea04109f4a18f55dd1aab315f0a1066297a2e2faf54de860e8bf28f15d6f09ea6d23668ff7fcbec43fa8c225dc3ab2eee481df1688048852c8a011da21c750dd3c6c1c4359a2fbbbe02b647ba88ea8e11908f59cc8d71ca843131ee9a1f3f870b2a85506d36d233cac88696bdaba3e806f9a90973f10c0e5c58fcef79f07e612fbade1c56035695ded17d5bb7df8eec9a0938967eeb5c9f94faed4dffd5fe7df1bc19a52daabe2428f7831f8663be421b8897b68fcc1cd6664b09448136b73dceaf95d0bf7c0878384a1e2c882b104c0583eb211de6441b362f062981baf12e9758fe045d8c26cf2bd7c595b4e95300d9220e0d9b8ee6463bbafb730d3704d8a4e3ffb0edbcf8da5e5a89a6cc19f3d926d8d13f79986c80f2f34c03eb6f042bd2a46c731c65f09bb23a7e1e37b4dcaf7e1095805b5927796413544b48c2e9ec105ab123dba2a31625ca3747a2342924b8e85fd9d6e047fa0178ef77b0869ef7f988a2f6b457a6ab53cec0972b6d990a8f9809b2bae33efd6e20c199cec82f8b7b31ca6c508078d2d81993b1b48c3c15ce9843c5c961bfd5bbef07f64d28b450302fa4ae4377bada1593797bae251ea9f47ef3ae31ba99e3109810d4e1705fe68121151e8df4152536f9b64cabe937e1bf7f7e89243ee7ccfad9451802782dc5b58293e85f970aadf978c485537899dcf45120441b5a4a9e5ab1cc3400aeef1a10da996ba96bbef8d7eeb0c42da89a37bf5002702a0f8dedd53a13cbd97d22bb1f375f9731f5ec45384093baf7c78266bb941648a60680edb1f87522b5a5d9b13288f22663dbd804de58f5cdcfddec98b85d73da99a9a612e8243cb56dda4753874ddb23fee1d72b6e65ad4dfc7ad5d60cbef195126cdee3f00b31b5db8d2fbf90358cab8ed097756ce72df48a7deb2d1cd70d6254cedd36867be36c82a2796a8961d155cb4c5b7fb0fb38657a54e326001a4d762cb5ebdb1c0149065c0ba20d1417d76e71757e6535223244f0919c324ae34791b29ccc0da50a375015124bc18b4bab11cbe89be3d7a81d07998a084f3a4d9b3d25e1a19b996f3cce665a3bbbdfbb7bd601ea7de5050b4340786f5401a692d3ca636c14aca51fae9a26aff6cecc08a6be677bf77b3a93ef805afc79e8c525996e5e0e7c80acfa8923d4c6cbbfe6cbfed769ab28ecd6603a3e097631fdb0acaa4f9dbbca5f3eeb0f354343c3e1c96abb36e169ec4641a993e0388c7db025d7103d388a110bee886a704a0a38b4069e75c45fce5c7e7fa71a599ff488612d2445617d86c7e01468e9e80ce207a27dbbb23c899263eb2f4fa02d3fbf8b2652bde5da7d8b665e0acd81d137887275328d85c5bae0d04e90dae9630760e2bed828fb9e164b430911a60f5394fa9330422511c5df0d6fd65a42746fdb5b82218912fed75910e00a6f0b1975c6a0c1eb458f77b43e29936e533a91e1965ad60ff7947b7e6370a6eadc1897d68e933804d35d2a73b4e4179429fb387b1d5ebe7400a3c5913ca75d8dc5d370184d90500332703825e297ac1f192e164522da47b566cb4135cb1782416e08518e07a2f41e4d98f33f00337b59b3dfa3fe62b38668681e0c05e9eefead43e347e59e2364b0c92e74685493191a84a88cc421467de66b2b48d396e37e77df20bdf73e06d9a3d7b966d913dce9d6e9b24c10e95384518b64ade2d339cf74030a30633d221c047e80fa90be54763f5195d32e837996d05e0649a4dc2397a98b068d7613bb13b34fa12c5e1e093e4d9b1af72e087525e2ccf1350cbd02c0a781c41d13bbc2bc4bfe1f25757e210909a1de258d95ae47f775f9350522bf429c14690059b160b41695b6e8d257f9f4c67cf30365d07f55e5f9d99c41785dafcb79310ba10ce76e589487e1443ab521ba11fa11a837b9dc138350d402762bdfe034caafccee774c64ad441ee014040455cdd5de5ea20a244fcd6178a7ce55d0a0bc4ae06c36c2b356b8a714ebfc84306ef572dd10e50a32d0f64080e23922339503a0f8924c960408060e713b00b4e423e0b98e17b5f035b192ad818ef34704b47f596a2495568b3764f077263fd61d64dfdefac5235271999f2139ff21a028c2c6fb582f1b5b69ad78d9045f6e3c09752fd4260349d65c24d59d1c1e1b2702d7face6ffc470c5b5d91ad5af2127f4277837992c97f7f17e110ff2fc4b44e8011df0febedd5c1266dc81ca4ee46d235b49e1d01e8f7d68e3eb3ec6ae22a3ed61ccf0a48f260c99a66d16623d2a0867045f3fbd3b58ffe61d8615f0739db49208cc96991fd7e37068398fc76550cef68163f688ac869d19391710cd3dcc0ee71fe1cd4858b160b1dcb7392e9ad5fb3b1046e9de59e72340502d8a1258e50138c170e7936c01a2c358d9cb0101fcb70d7c5617431af577d4b869a4627ac0a49bd4d5b2a7bf3fa71e085a76d50085657bbb3ceaaa6f4763703c110016d02c0c20ec06085c7737f815f222de9084219056835796f69d5d3498e87c3ac623ae5cfddc69e185a9fa223b1eb336e32c5ce3d0153d5f2aeea046d4929adfb20d8d7ffb10c14fbdddaad394150d03746220f44a71d27eb6ffac38b25169e9cad5cebcae6b4e8f646ce6ac23790cfd1df8c8c7cf4b9b6a89a93356ef511236bb09d1df3f0c4d56822aaeaefbf56900bf0f7bc0ce8db12b43be231edbddb5f1b4e6375dda5b231887184f7f2d6bf6b69b38bd70f1ede27d95dcff01269b4420d434d739147115339bed7c8067e9a0805fb7ef84bf65dcac42ca463468aa8c438cd0574227367d728f066159f96f3110d50f46986e04db200e21cbc00ab4400f2268cd9209dca0e7b92c8fb935e81794436e9bc3ed90bb43a709aacabbee25986eaaa8526f852ab09634260f99c72cf492ae193c2385808846134048e774a27013580005fee33555a6af6d31fcd97684ca16bbd441f1b03f65cea4202a718fc3436400500aeda56f13a020c513d88c57e36544ddfb3b51e28f598429cc942411c34a13623194d3afc486fd938b6660836df3f173682dc5547545e41f8ba86426df2b70308aa5518a8bce9a1d00917b9f0623cc966c26b362c7a8f6d5a980f155134dc0354850325e2f145ce80952d329b3adab53ee0b2128a431e9e56e229a829f0bd657613f8b32b6fac97a94b9d3651f84a3b699bc97eaa5696cc6f897a845b163d95079c562c987dcc7b69e4db46d03e578ffb8a61c16c9632a417e95db8d2ad03196d719c5d47c271ea847625a2dbbff1805d6c4dc5da5abafbc210dbe39f4ba100dcf7ee276bda08f6e9828e102f8652340cb817f42d5cf59d4d42886b37f578f793278a313869d1419fe4244e71e14fa7d82a20790437d3d11969339642be3b67996b3330981f60d520bc47aa80c0f000ed4c625439402a6d8a144448c175d1b396824a8cb0986478920e9f2dd2aaea99dfd3611e4f5fe910321b6652c19d50d1ade267104858a23add0294e613c93abbf65ccf8d98d791105e72bf0101d770de2afb271b36cf3926631acaff70d0bca57c1d10747b025a9438cb48921b0151a9a4f3fcd25a9342c5878a35b743a5adfb0714ab55c610edcb6f82206a32dc5eaacb70563edb4aed0fd58434da07cdbe0fe4791e43b701d3e4cc6587c18e1d03498244d5f3cfa2966588cd6721d8edf66d5ee6f9ea9ad12ae95b0775bef6551446d09c572480383c60c09c9e1d53b5c88edf6f69911955303637e58d9bb28df425257f977738547b79c646bb76e2dc2a2d076ddda1649f78ff878719fb73b7fff2526f65f3d21f1569f1c0a7d2411bc6f2095bceda3a43a23d1d18c287902bb512159d9e9840243f3e11b83aea992b3888a375d014188c4134e4da54b91a981d33483c816d9aef44eb6b426f2e1e53fc95dbd61ada4107e86949b64d95e5b0fe7b48f4cc1abb55be6adcf75137089a4da8099ea8d33b13992a60999142abef64c4ae6797f6daa3568c10d7a7dfe6cad4e92abe75a238bcbd96ab2e69ef6a6c11a62286b70fba061f48bff1e0f173930cb37084e666f934755b5acd17a588c43c4557da60c42bb3e5cc9d9fc997fa1093e847fdc99d791345f2ef583100fbc5b256a011936183bb6218c84d0d055736a8d88d4417029305b5a5f8cf80f18a452e48b49519998900c3d4461db2dfc8dc9e29a53053efdf8ca637fcde2a23c33b8d026ac5ce3d3038da0094b4f310bdc5c930f2d3f4586b6eb7877ba2666c5866d5ab2d50c2c45b2a5d5e91ca332a1557578066226641f1b982244ee21955e989f4968c00952d0af2888deabc64976a17f050ebb5e2bd84a1b09eb3d56aca3ac96c59645605027e6a5be0e24eacbc2f573caa0ec16fec498374c320c8a2ad697b7c1f7a7109d9c612c7f1e0735c5975e77aec0a250b0b3f8c118055f0040ae1fda32db8cd04b4fb5cd7af3fc7f918d5aaaac321bca9c46a8031c1ad256e0e619f75752c618203f3878f517511b8009e3e7e16a8ae5bbfc87f89c90ce9a8e621a7e9f6d8231b310fd0e6e3f37c706034ea1b45cc22a934ac544459c6f1b678e4fdf6ce0298fb8eb92c2ee4adf8098856cff11d7b7c699fdc656bc6007667091e205f92e7dfbf7632be64175425a1cfb47c64a3539495070817c0dcd535d9397ca2b1af241dc0ef3f373a202629136ff3106d06c66717c4cc12bce5b9cdf79b77ee6873c41cdb4f0858ac4d2b2b45e874936d0ef8408ad8378aee6f71c80d66e33724764f11366105f356ba63193775a546911ebe71615ad8622424bb56ba0cea4e505faa00ec254d7926fbb0e72b850c609d55c3c79107c2a055505ded7d604fe60ba839885a0018cfbbdf161edc3ce7663e58cdb47c6d1e7b4894ae3556819471aca0bacb92064e26dc5aabfad0a9bbcff2bd102b778fa873962c011925db987f89c6e19b4b48f98ee30622eda896d81821b8bc098eb0aa0e153de061d04c2b57ede525c25104d96a4019aeb5d0b93bfc57d3cdc97c0c5136755e299bed691112e76c6ebb6313f9d1c71076d9492d5a88d842330e791b8a160743f25c29841ad66cc57cae2313370e154e8790d7c632763e09c13cb69597b0bb25eef374fc8bac79b6bc4a66699ad7fe9e5d1d5066a62482e17c29beb908b9e3c2387bce7400982caa85b9f830be574baf60328a21d6d53af336bcfdf66a8e13c6a1fb6c7c8b785f5c6850110bb1e2f989b8d200bfb49439ff9bbcc22e14f418c857d2e30aaa9101cba0629f9038a79c672b3ed6789315a534774e0bc1579aecccfeb47ba7dc20abbf5c0c0e154086f4b20884c834834b2198b2aea4bf1ab8ca59ab79ccb8333071e02fdf2c5de6af638d617f1af432eb7b4d5846fa4db8bd112f2ca17de1b0acd6c57e1194a55aa29f4c95f4d199ace3165b67c34eebd7d40b6cba0869c82068e720491bd718b2d42a934b07e3668fec95337cf564848983ce01f03a8d2698046b5de2a9bcd16e3ee64df6a2d54b986f152d4bcd4c965e153573670db20c47c8f27c71d7db666a347396918e3489489f92d7e45636516f2018e77ce9361d65857f97f6bea94103d861fdb89c9f57fe36bdea0db8b03e21492bcc92a9047ed000689518cb97a5929bd0d71e59efc56da5b490f4941ee079af4a6a02fdef27cb15c335a4feaa628451204f291b9d4be6110a7db35ffb77ce27734f677fc4afd303e0949dce23c13857835addf9449461b6117af3884296ebe0a90bbc3476aabcbbc6ac0cd89557a6f7e3c0cbf545b2ca0244c302a7880c6d53082433a9a06263cd5f0d1052e8de1b686506c5c5fe4a36cce6e85645fc6be034b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe959cdea44fdd98eb626c403d5490c654341b13a084839e6371d0a3f95c03c2936014c57840513a62e542ac5c88f6baaab95a8755fee194ee75fedb7d1ff531bfbb659df6670778a25ebee835818a5191ac2c8bcb317adfffbe5840b24536e6aeff23e90ddaac45d59c0b53e1cda32a6f6c3d33dac0cff671ebd6dc72fc62102b016101b2589ab6a4ed3f140e932f87b4408907fae3ff81690d1de4f7042a4a8bc57a1eee57c3a993b501cf7ca1719549715fb330cf0b5c9449c05228287d28d1cd19"); +const NEW_CHECKPOINT: [u8; 25159] = hex_literal::hex!("520080708a000000000001f2140000000000940aea29cc27e4c0d49ef156e437e8a11c30c80c55c04c08af82a139e1e4153110fab24f024fab4709b5c44d8e2f9b645dabe743b0fb535b9771e856b12ce3a13227d1f3b67e33bdddd0789f7eb0062f5915ac2c47150c767e5fff56552b6107b9095fea6f875454778517648e9e387aaf15cec76acf45e082f7f2fa33fedbb51a7cd7a5a2a85f97028006c832797782803fe2edbe2a3c5e2da51b1359de062de8ea7fa96f24bff84fefd7017d1e1b015b61251ba0f11007c35d6fcbead0b36ab85b4671136af19ceab86204acf823a1a6aacaddd4f9e103df36e00fd61f13baaf4bf467970f36b99c246cd546c11d61a81546818e798e438c59757cfb672f65174b8e7c5bdda7708fd74f385e1a0b14da3a9d19f1976013dd274ecd334876a58da521cf0dc61ab4f0f4efe0729f58fb40875cc752654c38c5731a3c47f255567990a768170e7ef7241593f6ece8ecf999a33c7cb7c5965d7919d6604cb4d757b71509ab9a7d44b740153f96e9ce177641e75e3977f19570e22cf79a7b5ebcf1ade0bd29448068331d4d2821dbeba946558f385a71c7834fde97379a416c1fbd74e858bf53d331b6dd09c20eae6da6f58238add7f888ff9d14e3bab0d76587d6a3263bd7087f862926cbc5d92794e7d74433d4ebd26834f3158f93b676dac18491b58a008c83086d5a313a808bc2ea87cd36093492e74a40037fe038766c6b3feaf98ee84a5fff6c1118ed6cbf98d99ab056ec1874444387337977711324e43cb9dbbf84d328876c5873bc712a83f62de509414565615ce87eb35b720607324a903708b46625788eddd9f83ba177bdefbb23fb35af2e1dbc4c3c70daa3d5d2c732ccb89aa0ca8962d9ced1ea35276b98b2af95aaf853e13b66425de03007cca28a32a948ec463498de1157e76dd6d5dd8356363c171036564cb53dea2c0c2ef4b62f872c577a6a29a8b446e2f145b00b71384b4e1d32a350e57028526c0e4031de67c3739fc815c3cfaed641b8e063608569163dd68aa8ce01e48c36314525016e04668b9df1d741cee60240701418d35992b88fe84fd018580f1d4dccdd58d280512ed0ceaba36480c84259aa3e8f7d602ca9b8f7695b1cd160796d2c1f230ff40fe69dace0e03554b2d496a787bac2a0ba72126973575be2895dc3df5a8fa3873a8a94ab9e92f37a50d9a9573a4b0e24ff55821f674f2fab99c4ece573d635b415f68237827439663ccd7157bd889b2a1af63ed81071ebdfaea91200e5602e4d8759935a333068d46c117d8e7518c0922ec8b3b04408b08d6af43909c3e1823af2ec579b5d860a790f5d21c234a3e13d64d244ed00f46af133c14ba69e113cb1945348ec8263e8fb5481c6768a38b29c75fc6635781ce2949bc08982d4b92bb9816154527903ee9968f27f0e7383fc83a3fba2e1eca9c79194cfffe6e57cdd84ac6094ff45f44e14091ea8d769b8f0f25c60b719c97ee7635835ec401dcaebb060a4eb891594add14fa0be6861f6eafe684618bb55147deff21dcf65c1c8e155e25a84a2a15f1a8e1b9ed26c58dc069028366d2a5fbe8d4d8ec6ea90f0735970b633f371bfcb3cdf700060d1e3a4ae8af0ee14e528dc175931a18020463b5794e9d266ddd356a6d377827a5d5bba702d1a4a9c33be33785175beb893c20d54631a5aa120cfd4fda9b5de8b0ac86e8f86c0fc6598ff80f5f2cb02dce934d17912428f722c0b68c99ca11802fb085e1ffad76cdd15e849095388428851b43a95983bf9c2675bc87cac621f68552533fcbeb19e06b1498d3df4f6e0359b19ec30e6ffc18d27c663a76ad106224e856d40925fc70ef05f8cb888992e3edd3c20b73a8f0648d5d58e04de317de82c4d32144df7b9511d20b44da626ec6588d8158cad2db14ad6940a5af0dd128d6b151acbed1571fa7439f56a73c58e889be548c5bc5b63d85150a3ab4cd859719c384d2994e891cb90ed7378a04e2d36278429b272ca81c55865a364aafa3d5240346989c4db46c50a09ecd2b135c2fcf2a274e58c14bc8ed9f787392879009b2bdc92dc596910012755bbd900ee46c594c8c6e593f6df9baae8787ca17fd44974504c6c94812defe94a878b37c8c9f0d6a188a446a000ab1cccfc0983b476ed8f4d178fa1cea06023cd2e8600c539842877c6ac94f0eec917a2232f88e1bc7069591b40e6a4fe8f604349a33aa6992f5ff11ff73bb9fa676f9d6ab1e08dcb246df59534a2793fe461d8562982022bbafce8b37f1d98d10e151be8b4b95b97fdec144bc2940b1ff407a9da5a5a1a0a8492e572ff9944d0e21abbad71f2b8c5509e7b64bd3123ee3f283959eb4e1b752a3873e827ad6f2d9199d1330dca7a9889f0884cee8ceb61f112a2f4569d73e403409f561d12a85d47f32b50142d3394cbe9997aba834ffbced35a67c0d602eb9933a3eca08d657d0c550b5fa64d4e8d9df44560dad489ea9a822e916e4dc613ad6e8071759cdead340fae99a23318842242285c4eb6a1976e10c527650186dff573b3b02db2697049b708fcc67bab8477480c26f0e6ac4d6089433d3799f34df757fd09e7a6605aecd79aece1aa9a101ff61f2fa9f03fd573a188b18560de6b148327d13dc097f8f4e77ff7f04b58c743294fca2f89f30fb125d449ef3929a811d122e15810f074ccaf290446b0f77698ea3e5c663c2c9539a1637cf167316ffd0b0941e480b05cd88ea11467cb7bbd61458c8d12fa2d1816007dc74f007b17541816689b890ca51e83293647dd7c4ef14a5612dfac38416bb4860c4179e6d76fd5a4afb1ae7f78f88ca43c1731dfd42f3e5b20ddf920ad098b5b5d5832a0e6a599ab1aaeb2294e404ab79b5a7fb1a022b612661712739a32a9d0fdf13179029f3d39c46ea029972a39fe622fb9ae82d8e5959c54a1984e67cd4f60cf36032092f39d6d62728f34220081735c6c064682af870883504b8d9676d7409477d251728b6aee3eaa3467eb491b74dcca7c9c0067e4a36917c7bd8a8c9439892c26d7980b67dbdd334538c95f05438838da906ab327dc99998881c2f1663ebecc8ef1535918169ecc3a64971ef905eec8bfe998837abad2f65e0196168c7b928fee34b0e499bdbd97f8a4c57d1efa1dce03b405900dbf0109b315266c5cf3d0fa2b626cf02217b9621fd8884f03a836bae647acdfe49485ae299894ce11339f6aeb078f28055c730a18097ee708681bb015bbfaf5094fb3d2ec98a1590fc9391742f0e2ed05f33996a49e6ef5687db8be0c7d7de3b700a54b727e5741049f683a008ffa5f2e2f1f83d281ffeed756a7a477207b6f3360168b13f75d39256afa2d357914519ce104af23ccce1f03b91df63584c5acc2c9f67dd20f2913abe56fc4b011d11a9ff1de83497bb4b001a6ace5739088c6e17a356a14f97ce878311745cec46b058d0adeaf7dd0004846a73a6b79efb05139d85594a31078712b6c11983136d50e5895b08e06913477b6443de60c85ca5cab6e2a7ae799161791d78674305082262d010fb84fe9441c6fc66456f4fdf722d1f889fac449cc1563071098d039d2904ff1fe46aa3392109c1f2eb8477ac6fd8f7a71b7335500fe720bb23aa864e2b094a51ed369cd2615ea3b17de97c52b4ace914126ff9ea5b2c7c30d413b6186dbbbe7afb2a102c22d1bf616d7afa20fa9eed6802ce5a165ed6f1d9f1779ab7dcb6dcfe874ff1cf812b71f1b54ad288d53ea16668bb5c9123ecd53f6cd05ca0fae2118939bcf43d4b0de098e72018735b70a2b74f82afa890abb133da2ea87d18d547e29b5e4ec4ec8fd286b503d50cbae947699165d5529a2912efea5a07dbe19240a271aa9a4f161bb024f5aa112c0409d3b919735d50cf00fc5b3c9d1f5a7ed09ac05045c1b23f5e02a82277a792b921ef675e3e318b27bd27ee869dafd25f2690aa8b3fd5040d2985d4b9476ed0b8a6eecf9b0852270ea7288ec92e24184d845d608b81c52dfc0ec242711d443924c3c84148383a862e41ed8ab22fc85ec678edee00f61ac92a28728a2bfe3da566fb5f9dbff2edae13d1edbd3d5fed7dfab1ff85daf789a5c449f17e5c22102d269b648ae75a8a3a9a1bb57b419ccb5331ac7a7deb308d64c1dfe606f120269c7fedfd6f3a3b2d260119903d4269b63543a9349d89e4e20afa050fb87cc91585628456f8ba5dd056f9bc34a81f82d374adf278f3b925dbe0f22e4092984a022109127e694b14368fc2aae1feb00c67cf42b91e2e0501e6b2bee9a8699753ea4f58ca4eb0fb11bd32173fadf098eed0d0348d7fa0a881200faa25f3af847de7a42254214389db4565712c0720e2a5321b56dedd70785ecd3c18071df550a595b460539a153bb414143a7f46c2c78aa766bf2a88e32fb463a51ba8ac7dff808fac5ffd1a9698d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826a4911842526a32087692c3c45960f370b10052c4a8caa3d8872d8821c8f2387b701e0319f913cd0bfcb5a6d38eeef1d2b1c7aeb71e4c6ca0e3e1614795ed746c2dd5bd07de082baf478a8c7fec59e2060ba8c015f289545a25b9f278cb29324782a7b7df647af67dc5ac5f82e144b3162f757fed2150f42c59c1c8644ef7e9efab902907247cf63a1751974f0954274285111345b4e0d0e8553b7fbf0007d614e9a67f5563195b98cb77a3d08ed519c047e8b0660456d512dc1af58ee4a7f12380fd420f44a41c865ef2ee576488b08cb803b4a41cc878304e3434267aafe1668a62ef22c74c6298799dec09bb68dffe920ece825fcf710ca6ed805be2d947319646b850ee40e6f1aadc4aaaed89da8e7585c3a0687ecf2bf2d27a59d67f5db5b8555047a55d7aa87cf2244ccbd82f9f287d4c6fc61aeca969f0c17fc377444feab3b55aa7280ad4debaf8cdaae972a3a60b602b2f0fafea0d2afb55b06e884e02d86d90b433e5f7781fb3d182f792f81b9747f528b1dcde994ac72fdedf066f931ff4a5b05b57775632ec5ea6dc3560a6919ca82348903e5245a4da54aad05aaa9970043fbeeea3250e2e63d4ab0643b6c279e718c44a5dd283e4b1bb6ff876ddd0868b80da00bf872c522bb1e9835c1d8c9861ef5a455ac5c816adf43b5916951235de7ec61c200616a83af6f1cb18665688fcc957a2dd28ad911f1b5b82c96f89fec7f64d17dc115dab08d3878d50a1672feaf6dee4b9bd7101eb26cd67d1a136e9c18c97151730829be4211798241ce7ca15349a23bb0bf10996561e6dfdaec3571a80dbb6b7981a56abcb0abffb110137efdf5d9258f6b35d703312465ae947576be7f8dfef0cfee97b4666e1d8a2f326ddf32ccce7c114a827e65348461e7c2a66ded66fb89c0d95506033f5e9d6cb8a235f7beb2d49c7729d7c536f618ff95801359d44b1dc4fb14dc215e850aa20df734701a21ad89315f25ac620ec7f7a1aaca2deb1beebbcbbacf7c54df5b9ef38e4893e77bd5e285f02ce7b5b0c4477fe46d6b0187a768eb0a33d91b49a331632b28a9e164487e4838f24dba0528f1a722ce5210e343cd531bfcdbcd2936326e0b9881a555ad97bc19eeeb308e8aff73cc2fa8c11b96ae1b8c83fbaf7c5a49554ea71624fdd5ccc377b6af318375f33bf344af84d0240acd68584251e032bc143dd0c2796ae25c48151295c82c7a17d2e5aab9b7ef2d50c9eec62365ca71679a4f5045f5390d96e9018bc88a758c1dd2b4397e617dbd9dfd7cd632f84c1a7eec6ad2d20cc851eda9b3253d96befdc4ef45206ba7b9dbdb2b8a6e69c689c48aea9b126e620db0c588fd5c7e405c4b72d5c03c253a4ac150f7ffdc9cd69e7e606c5eaa8590c7a389ff1ed3de21201f664f01d20992f4747339d3a48524f3686356397881935be9afcc5e16850bb8a40b869c9f03ac7cc49cc02f190cec7b8ff8464d64eb3f374d04dbe8b3d3e0727a2a1850e5c2f7b5a16cdc5ed55592947c8d1dec392e56632946f386bc56d4fa3a09400824508125b48785436c5693f4e99e62e2ec62fcae44a9af8080c0063a6e9bc7e1ba9e377c36b329e77c0abbdcd03df5dbbc069badb9f517fbe06519f90ad6b3f82a4e63d206cb6fbc4f5fa15062be4808a3924269ed1784926abfeb82bfcb8f5f4a305a8a1a99a96d9f68ab8c38e70b5d3ea4ed706ecd7604acd52c60e854469132493e8bc14ec3a1668f974ebb5f2ab65630fb07a8f0a3c8745b122088884c0abba4885f963ea29cfb142f0f0385cc8420bdb1eac2c1a70549883fef1204989e667a710c07f37cebc8e2fd7ddb1a6ae98282bd4e82002857fa92d4458a6c6fb856ec13f83c31a3c6e57552aec15d30017eacd01fa3bcbc90dfcc756eda50c7019bb6f22052e36b64431886143b0636d47d15c69e1f4a40e392abb6d50d0288f34e963e9625fbb416836587d7b8171425e6472442f78941457c76ff131b432dc83cee60245c482f6eaa48812a6345344855dd2916468f9908c6857bc7eb05219fceb609ffa3c4acfc23907fd8185645b614a80f5bed03ee1c723bf9c7324f376f88536a78091de87df89c251c382efc893feb41afd17d02f17891e84defef493806f959e6b7bbf19f44c032a3ab3d79e6cfd4d602a2e00901f46ae10ef8d838495449118e8132dfc420c02be5f37ff72ee95601bccead77901176bc7ba0e2b8ff0e7eb66adccdfd7e123dafc93ac2aa0bd38e21b92fc609ddaf17b6ef8c02f26fdc8122a4c2a4b906e29429260c69800fe6b0b2193ad49f851c7130c9aac7196b9122df4024578f5cf8ec999a22f5569b254abfbdf552341c4b35c1a9955284d77d1d561b9a407e4ba227b760e88ddd4a93dfd6a5df8f3178931bec5690e826509e20725c79dcfb9d134bb8159b98bf1c976cf0e708a5da90fff176dd889d75f559f59bac3a07229c2fcd87b52a8c29a5e471d48c30a8e662c88a867fdbb26f57f88e428522391c5ab960a698c9357613c4efaa3c8c902eca73073f943434ba236135f38d8da35af0edfc90c09e7179ad38ef18b73365e38df872a3c2b8fbc6800f1dfbe8f3a2bafe36ec315777bb74c145844696cf877317ca4fd9ced86098dff5d5a0d9925b718e256ce2a63a7e450c7abc7da24a9d2e2ac169a3825129f84cb4b9dd5f42d5ff05f63ceb0142be4ffa432b6ea8d80006fd6a2f2e0b0b186f9a9eedc64d6ab1942252514fbaa6346d9180d6691494f37f4b6aeea118666f9c784b8cea8ef906e394ad4733f3bb2449504438740fa8fd10a97cd287bf86ddaf050bfef118c3da4dda7b0d16555378cc34c306608bb502844c2673ed4808c2d751dc21da4a48d48c095510d5a1330e48043cb1486f14af2b4f8659384219c6983d8254655079b991b185a01178eb81c29da857c604d4fff201ac94f13e4b9081bd9838eabc7e2dd078dbe84dc14ea767b32d96c9c9ebc0a6bd21ebc32b483ddec6cb85671acfa9f5487ebb7e6c589f3af4063244a785cefd3ae8584c50aba91c6fa1721f02b6ee230b17795c5c998431f8e088d2fffe1c5ea154403b82268b5df336a7f1823e96eb56b88314ee100f719d842760a0bc1ea47394ef4b1dea737a583a913b68aee961890e157471e0b39a0b1828ca4fef21af330c3c57e00b135075e845feb34589acd63ab1f6cada1252c9e0594180f0bd9b9a3465191758a151b7ec9091901d3d80136ca72ad88aaa3dbe110e7078efcb9c165408c4a73a11bcc80ae53a80b035d4018640a8e53b8e374b3f746df77a7398f00ffe98384146ad2e81fa85e1bc22c0b093d3c1c35b46c12777617d4c152ce73928af98592e66831f03604f003b621ad0e070704967ea91bb668631249ed97475c1eda6a42a8f6f8ae6476e165e25a72460680d0ed56bfcb3161885fbc770308790d39e1a6ccaf3057ae01de336fcd4bbde72c32b4a74a1b7ff0a0b76f32e88fe7a66b6f0fa360e144288656610552e564d8fa27c624ca3b71afac49945b4397235c20ceafaed87cdae23d1d859b7047f12db145c56a52433c90ef4555f1af0092d1eb32bf5b96eb11d4de6f81b430cc3665669d2789840c7276ba346a4b0708c9da56ca72cd549b85221c622ad5aa405305316559a8278ace913f689c06d68c63529b1ab8843a0378c2f6bd40ea6851c76ffe6ace0e9d2ebd39bcc8f878f8b72f68abc296e465db3a3f7b8892bea7291f92e82faea385c793ed013babb68d39f57074dc651d3f083eae28b26806d993f88dfe21bcde991da3efaf833329a3352422b5affcb652c618cbb8d154ffcbd69343f3516a02c626c61563c2a29bdd4b197027016eb7f60fd69396ad2a258ed63acdaa86c1a0bbd50ff1624e47dbc820bbc2169c17ccaddda93d93ab900971b1606341d9b2da21685fad153b9c711917834199b2608a5c1879f88d53e93cfd56747d3591c525cc506c5adb880c1767400ebaf0d6c68c5cd4ad81e9af454b565def6221625d8395a5c490715844bfc618c23a3e59c42909a12c2f18de4281ec6dc3ef1779b16de3664e56e130a0f99e64bc6c1330eca257a6dcc611e781d3d00b68bca10e8c67f33de54041f5238f154f849cb864744c4a71a803d0d5683d022a4ca80c5db7a25399b315f6cc5d10df07ce536c35f48e1c736a7cc2bfa839383f04cabd65ba6c5ad1de7a4e84a9051f11013650a96bb56189c36f14cf162795efedbf61b0a24f15986bd5ede461242573144a8d6d76c2d1532549f63c066e88556a74e05199a517a91ab689a2252a645ba457c8a13752950c07ada64a9264548f7e2a92aeab53b5d4161a1670defe510bfbcda516d7b5cef76ff8662b0dd046bba591f7d46c9405d7d05989d627438e02479c23f704c7a0ba4b597963ac0a3f523313d5f920b8ac61e24de79aec534b7e643ff4df321b64217e20128c88e83411a0eaeb6e6c264db61819ffcb0c0fe269d5aa6e7d648141e64163d2a0e5ccb44a2492e735ff839fc0911acded26b178713f1bb6c845a00416ec6e5f72eb9a1095fa70c91fb4b1a9928f39a055b339882904c9df5c3d4d4e2947eb1cb3ea56296654df6c77aaacd68500dbc45513f1cc41434c3cf485abd4e8b226fc479f22f40d3dba59086ddb9c7a2e0c813e8f1dd58504569ac9b60781ed0d4eb209575cbce5b31096745aa5e84e08f5ea02e543fcac4d37730d5b1475248ae0f78a63b0a48cffcaf802d8db5bb644327a775dce7bc28658bf8160ab4ddc4926dfab69e1925fd3a4234dbf817cc5c44dc25592722b7a75bc116ba94c32f82b36704baf2809fef5afdd894ca660ff2fba1fabecaaa54b3572369516ce608b2b27bef586ce90675834bcf07e5182ce2eb11bf3f19d94e24c2d229bc8a638c2c5af50f5ef770567b612e372ec730e9df6ab3b1c7aa6aec2f3ed5d0abf01b16a9d1feb7c6e913d13f977b828d08aacf510e97882b1a87bea91795a2b5d12069f7978174301cf64fa05ee524a568d9faa42d1446a65cabb1cf1d06a271d8a1a8b30d876845383433af1d31fee583e2d1112be3167dba6242fc0af1a5545da24b0eb3f7cd50e2fc21b9233c85373ab9ef14139a2938155438d0560cc9d3f16b6cd4b1bf8e932b147be879912a2bf957ebd98241d1937316475f15462b865b84501a80d0003f9258375437c50bb25aa9ee37c22a6a6c6ea067123844e56b79cb18bb58d2975f28698e47d0871180a99baa125bd3c864ffdd370dcdc4d9d235e5bc2dcfb4ba551e7b1f85ccde552d5e1c2ac63761ff4ce1dfb0ea052684f6c888644d00ff83569dbd285573eec71f8a8672916c82a470814f777dc27713b905eb06416d76c12bf81fe493aec8c6d7a89459afddc6d949ff95356de103c56cc144591a68255cb28a2eed3e624ddee61694c5561925040a37aa96ec4a27652f5a55deee5b486f861e05a347234e465410cee7d09bee7a1ea6fba484883735339a522c4be592564ac66f96d918d0e497f89f3540a7f8c8bb5e38d46f4f30fe9a0aa57f3b6b78ef32b1902dfd188a47e12efd47291ee774392e3c9b0e58f52be2e8671d17618d76629d4681270bc4052f4d20fbe45edba9909973ac9aefcbf972821bfe3d1afcb533e8de08654c1a01bd681c37ad1daac4493e31855687d8340199fac45f771bdecd7c85b21564e4f2b0aee0d70ea1182cc9da5e939b488f8ca2297da1583347c959b2248f3d61769aba21a9e6407a83699258f7df385f14917efd46e4208c81fa84e93d0bb9ddbfb68aa9417e45eb0fa4786b2c3e5b1c41fcc175fc719e588288dac7556d30caa72a027d733a3d41f4d19a9fc385a249ee2f6ccb817746b45b1122738028f34e71272c7a16093743e00786b36f32f28899bb81e63217bf4bdc70ec23e748b83f925843fae57081669fb804c53733fa999ab6e87cc4c1fffb83898ea5237e3ec8a561a3d02cf71a076c8a102ce1f9f61a5275f8d90df010ee4e093b96cb53753589472cffbd24c1128d7a9e85811fcad66d219deecaeb6f01b4fab9ff8b6c75ed1213d73b97b31a32390737ddd99cb2076d79c860be03d6e35f78b8fb59363f3a44503662dcb6ee7a634a087e18d451a2ac6e19a9179b020877c236368a1d1e2fa127ab932da6ad9fe8c2f61da8a356fbb37f2e6c86a147013720e294b960bf8ad6604448a44cfc9c00966b0020f6d2eff691fbbff9505d6fd3e48ffdb54928795d1fa831b95b67f7805fa6a19e4eb0dcd7b1c49b4530f4be07193c7e8bd271f7694968f16349f7532f4d2d697740d4fcb949c97d03128d274bbc52b5f28063fc735ca7f9403d51137390e7c0de3cb1ad83a2afa680f4fe2dd40ce4cb9add58d38a20eedfebd7fbe6a2dc59231feeda3fb523bb1869cc13c9e3c0028be94bcbe06c918140c8d71638580b8b5e06cb9cb8f24d32c225f53bd7909a9473bc03170485384e48f55b9ca1261fd8f6e6f3e44dc113205442fe8fde7610f1c67263df2150f7d31a71ca0b6c1b95d30f56f70b912249d86ab9615471711ce3805d1ede785e678e1039bcaa22d6de39092b7eedd716ad738cb313947e8ac39663221038b5711a76da558fe6f4dd4d59b78de9482a39a6bf4453c948f0237fa68fa83566ad294266e88ed2ac8ddbde41567c8854095c42e5aa943045f30f0c619011fcd87bd19b7302c5ae572b3e69a4610fc90e496d55285b652ff723b72ad55b6afe0f90598450caeb0bf0fb42a689c942a5cab1ce0547bad1e575bf29a1c063c8087dd5a8e9791f67f6789926ee2e2dbc853de026f37e3b584fed0fae0974cb5897597011a9b7b967001f4bdf712d804b814c901e27c9b33ffbc02690e1d25e1db8ebb1d437fe4aa2501952911b187d0f84470c359fe1e0900a96c25af8e291e71cf48fa14afca0ec0398657bb0119565ceef78f1baeb382d58e480492437a49f9ed0be97a43b5bdf416b82ef3d3f25e3b4010cfd494be23b0b942086c781cc59602353c0820a3884ae091bf72136303b1d4ad231963d378e17386992cd6044e96d3f1b44036f09577f5b7b2dfa5b523e380a7bc90cfd391576609d3e7bc2d8fb9a2eb84fa4b5881474a3647e6a51fb7c5919e1dede1b479bc157a3b3fe9d556f4b8c378dc23d082e0df126fa74ffb10baa4169c78065d9cd0e422d8718f006510248227f9dceb1756120e42813df5de46c3e0683b685b8405bdc363a10d989a565bf46aa3fe1576de2580747053ca840e5374a0bc1ad01c896fb90a5a1133a20e581b27d4e271aeb0ef7a713c605fe0b8e1d821b6b96797c199b09b412f480fa5162ce5295f4cbaa2c74be1a4b312c961d5048b35509cb0006be505b56b129719bd2c8a66d76922f8ca54aba66e4f311230373c72aca00dd63f8bd8befede5203ac4812193f478691b1e23de1edfdcc5b7c42fd784700d3b52120d70dbd7f130e7517795f5451e06ee746ba2a90809747169f24498b4ca64331fc0f4f5b0dea6568292b773caa8d01f76e3a0bd4426d0fa8e8459d3f4f2f4d4e391c86f629b408ee7ce13163f0a823810c62eed089e179d4a8737f7218b5dac38b79cfad5198a637eb0493ed81933fca9adaf046ab27eb018a1b58d28bb3a6dac4459b1587071304910f2f9ea91f65cb0a3dbc7cc4357ec2bab469649631e3cda618ed9f6c3e2751d4694806858660ce2f5406dce9a6d451773827d53b67264f38bc49c5c06e11406c2c34f26c0d362b314890e33d3588e40ec939c8a4acd117495001b184530fca9daa18174d28211f64d46b366f45157cba6683d54e028d9caed95963f0e9c4135760dc3f0d837292a38d00bacef4cda7b0ed7c52b0daebc5bc55dd7da4381b601cff3aea5a5c8c5daf74c11671f9044bf6f316b761aadaffb8523cba0963f8af1272732c65d07fd7d972586a85e739daa5d368f946712a3b6cb2f5fe908e58e57a25c69a518e25db751601701e185fc1383d582bff621c9e31b0e0016b9a54630ae51b863288dc448c332e17102cb79f2b2402ed1498838660e0a4a08f4eacfd363f81cf3275cd93a1f7a87fe6a9d2f0ff2f8b422cc7f09b19d99587d8d0011f002ca017b48e89c27bf4199683dbb95d6026a742cffcc9db1798eeb6edcef6f191e0fcf01e4e3d0e049ee8406d068ba6ae7baf0927b734e563e48f2d42bf6d5f9ebe6cdd95d65b473298e9633c86e2a134fd9ff8034be8836a4b4de46b1170487d5504130a979e2a4ef477e0b09e5ed13a556e813db0ef15f82f68769b800f93c6dbea2755c1416dcfedab1e2cbc6c4b2e5dd3391591dbcd268fc63802e492b344302f8fdce7834b80dd64e74a6d7e1da763b8b35a6c33964ca7742abb5454586dc60a54418df564a436fd34f011ea5f2371d2bb7230ec17507fb052eff41bb5cb07f7203cd43ee2e9218697efa8da41d21d10d922b6b773e148cc8758ab9d9196a220a1a37608d107e5c86d8740142d71ab6d83d82ca52bbe9656ecc3e53e210ba390fdada90eff88696c52c2fd76f1eac6c1dcd75cf57019c9b62a5d51490b565ae9354f2e70d38a84f546696ffa263383736b99951e37acce9be25e7f0f73b9dc37fab5bcf974bbb652bc373d781dc26bdfa04cec38d41eae85c93c15c483934473e931a2b8dcda808e6737b27ee05f537608f2bf991b9665290f8ce718fe2a625789843cd35512b5614ea3da1561320212a64d898862385d6ea27c09e4f6bc8f89c7b678c50b769453331d37cf8bb53d4d827de7799aab0af57dddb751b144950c5445b8b07374c22d840c9c23fc958f4948f1db9176ea845c657043396e417a664b3618e0b688caa828a95262d5204a682cba8ce8d6cfaa03010f8606b3251cc78fbe2240ab6b745a49b81c4eb25c3f5522a54cbf3758b2240409baea45b5c850f381a5c8e3c5e82aa74b9405d0c0409bc27d9949584c7f09b64c5d16db3636a7318e9baa871eb30ceb122dfda4e3038f66ddb811f804934e6ac7d59938784f3c9b1198d0fc6b0eedf65179feadebe8b60b43de33abfac8c241d7c2a69ec461b67f1ab8b11c599faa81a58281f9d9882a9b03f307e333baa5d10abe158b35307e2f63166d674676d1a2eb37802ee804d57a4e946d4a7853970561efd0c4d06bf427354fb8dbccdbd57c3ddd50ff01b331e8549fbc5a47b4d5a002efa0c4649cb3f0dfb66495573dbfbd7b4cef37613040560530197e3c210d303f32a4ab3b83af08d5101d54cce5596faca914dd06a5d08bcbaf2bb8bd737e2de76fe96327699428881f5e32e7c94873949d9fd2cb32cbbcfa640fa9404f344e824cf6b663834e08b6add8f2f2d111f39f07c4f01446fb69d7f12f6a3dd53788939c9d19bdf2519a8e4d20883570b3acba5e2755270ee99a5d93f56c2b9e2328857ef082c413d7e7410b1351f4177ee5cd9f95f6ccd094a920ea44e11c274754cc257c8a8a3a87ec1ea3e5a1e4e63211e41241a045ecef0dd349f4a81f0521aa615e262ee0e4576f915cae0eaec114dca45250186292d88afc9722dd5352ca439da267db8824e27a5489f074eb3465a0c70302fe8d9c717e7603732fcfb26083b86550d69f6e6ee78b902e8e375fab5b26d2d8ad47331ab7827ee9d557e0b25b5492119642a6dd2d5b606c16b06541243f60afd360f7902ad683808dc887290c0235bf4eb0e80e0a35c6f3cad89bb1b5c5085254dbcdc7bbb31e51f854c4e7c50da9b73d79e1225734a99e2afd2ca07e8e0fcaa9b8e458fceb38d5e9ed7d118aafc2918ad84aa118b05bad0101d37c6c7d54bd0446ea41caff863facf77d2d254199ea20669cb02a30ef5d29636ea28798c118555e3a54b9af3879aeef01277c405cb29ed04fc783c09475d37a177dd5e5c95c0080c2401bd8bb00f55db9a4e09fda2da986c6c008528a9e18001521866ac2ea9a7535eb12f4ac2df73467dab54449f86c52ec44ee26fb84b11d3ff54d97702642b13f2438844c8f946019437bee664f331d7b4411b1a0c7b04d942a35e6740610f40dfdc7af96ee46b3c2c6d3d9fe7cc0300a672964897a04f3501a648e97775d185d51f763a36fc5228fbcd62d6c14809cccf260af52928dd2cb92274e2c8d4002685fcf8351c54299e7e3d340753590d2530621f6913395e4c4e6817f16a0ff6c36c7c6a4a54f08c103fed66e5ee7272721c4d5491a413ca4e980c3ba35595703e3bae1a4b2e020a97ad0031fe44e219a99dfde70a7d6a8d0b488fb119cca89e2088b230c700e1e151c9a30fbc1fa1b52261e7317971930cc16996dadb3ff17ab9ae8b3dc11349ca0f8831a646f3ad75fc7c43d7bf54764f975a443d801ed1d69d6e502d69447c5fd2e90e2b895e384eb12a09cb2d52f7e99ef7e2c61239ebf23ac6c8949b384e01ce65d15ebe54eb4d488443885adbf12b281e92e50027f81e1d7ed0896fdd6fda8b9b26f903f1fa0fb2ebe67c32285f05c9d5862cc5cd809176dcf8e0bb282e94acfa5a3d9c59c2aa9fd6f8c01909d08336c0be5c2b641f590a0c8e238410789050076e7f79c48f6ef3605d30e8f6916cc5146f86a08b0fa3fe9b8d5d69f6881fe06577caf5c191ef65438451c0535650f3707147aecee1501a1c3ccc68c1a218eb0c7628c8939145340a7313415b991f3810448663ad269848214be3aa625c00e801adbe1512eed43f043abd2a4992c17147f356d0081009b1821741f0545616a5557c6d867490e77a24940381770832508a043bfcca6364ae6ff573f922b472b84ce26581196ae29d777c231305a8909d46a70ac28a737e27dce20cd34289272755e326273cea4e4a9cb0387923c67fef39a9eef474818aee3297cd689c736c2491d2d9f587b4f9c90f4537eeb68e1c3ccd6ef2d9c5a3acd9b27aaddb671cc2b2811aa8c436808b3a3b50721e93b5aaa4d70cfaeb19614466478673d249cd30796197ce380d5a6198eb2d51e88bc58333de530828cc2be887f0451c1a52bfbf075171fc74df10ab9500e535ceb40ea64694a0c4e9aeb7fb32c0559af90bc13644cba2b02570de0c0bd55d0de73818927337b818b778bb9a4aaa491fb2ef5a5b397491611d05e8d3d2ef0505991b818b28e85f9ae105c6b66ab6eda8726b11387c5cd4abfeaea8fc910101fe168532e601f6490112feb284ee90dae1892131a348ac070f59f22fb3ff3b07b5f269c9426302bc4a2922f229ddf8ac58f914ebb3dbaf3349a3ca36ae02bcb2e74969e5aae5b1eaafecbfe19985b219490263970aa5eb876bdfa4fa5ab5a856c4841733b4a886e89e048230f634402dbc796496e10aff7be1222777e93a416523ac6c36114c953648316885f4409a31f92c1bcf1ec60ae8d2f7414ed8077523c198fbd285e9a3163d50d4e972c301d400b5eb73b5cf03c8dfeddcc9e0781671d8a093f0e45a40d7f5dff7984decc15fb298805b105276a4fb0eb75e36dc20fca75e5f10152f1458cd77ccdcc7605d7bb3c85453723137cc5321830e1a2646a2b7595687f11f64f0227c9f2fc8937e8a218ac0db55da223fa0df40872000d72e6f27be9ccc92e8889c33cde8daddc1864d395eafb200bfa54451e18913eb6306d2d1da4fc4ebfde6bc6941556ce28134a737f46652fc673115bafdf4317bd94bc4aa4938ae234d177a36d3c5eb0e4f2b683ebe4d59358264056270cf6548dac3e1bec19d536d87c041ee9ea2110ef6ec21392a5d32e417a0b12c11563c6bab02ce83264a95aeb4736bdadf130997009cb7faadde51a9d9d48aa10c727c46f7e5b07b96b83d9d93342dbaa8be52b5b3a4ac1e73dbdfb02519a8ce5934c40c57741c8c66b0a2c0024e7520858410c4a5558268af3066e5507918a01fcfc495bcad91b8244d80c381c86af510c6a50c0c20092506fa397999ca074518a42987d67cacbaa2b4e0e40ae1522b9de3cd9d02f7e73999d9ec3e2ac9e6c5a3b0346db6301d3c30d6c8492e1c50c611a263c91a7dfd1a61b7cb1e307fa478a2c3b45518eaab9f6c91407e9d7f41fb76ddc73e8cfc87f9bfefd2773be7b96d6d5b81e7b85a884800b162555081eb6bf2f03bcacdab6e5250ca5eac19134afebc7bdf3bfbdd7294c830046ca55fc91f2f68eeef9ef1ccdb3a365cfefe66ecf597b1efeebec83942155f9ed8f35c1f91ebbbaa9eafe4308be905f1fb19cdaeb76e1b61e93fa5202b2d30a51435c2236c65caf447e982db873651565fcac7ecccbcd2d6e5fd3d6615bcfe19f5c919c7da38bfea1ca2d5f1db0674c330696bbbfd4be4fbc69beef6f3c2aa00e803b2b1d881d989a00b3187909bf6599258cc86be287c5d271581f5e8fac6de11381e55e6401a5ecf53e1973abfcae291b92ae2fdc3919569c9780a640909262b41cc33dc62585bb16ac60b0a9aa57a9ff05858eaa28d8a500e3268ecb8bf79fc8bfd33ca2a4982b61cc9244269100f4412f541ec3c40c2105d3fb68a302f6c8f4aebb40f8c869e0ff8afd53ae14bd5f74174eea2d797aaa84b91e39a0095ee38adf7dd2931b51310071f605ae657d155176bfaed310ce9f8b8931ad5dce2d41f1978263b3803a94d47d7f9ad25739a6fd3f52bc861afb6d5762e92db317f7b08a0fb193ca1c515cdf2f83a6b3d007bb86b11ee91b12a6421763be3c774dfe7ec9f042e62cfb9d4fcd6da52894289b8f1897a2cf08d5d8b53e7457a04f0894d1de6d05a4531ea3625da7bdbd9251a71e6b7314a16163ffb62004b72eb8322d55ad8a3a9b91a5c780017729f6a89943b952cd232837c683b3c1c020b342ea6921f5aab4f87a5a6ffcf1541d81879599a0c0e3dbe98d4dce8564df2910dcd5d491dd12687166de1a43565c79b4278226ab6c61169267302df9a4d7b18d8f8ebdd910f2ed56fbef8b8895c7990991653f72eca3e2f505c975cc0d77a53723bb51a4c3bab093839b061e4e88973c853d1249ca694e75b4d327320a135ea17fb51a110affdd0505ff93e7a2aced341a5cc1d3c04fcdb6bc13e7e59b9985e7a3919a21fef0ca2706b832013bb627782f0cb3cba7791a1c8b03572ef4982cd89d7c8d35fb8147b82ba4af88d0d53e19957ae5fa41347396e55ca80aa4e4dbed40c82f1b5d755cdcb1f4dc6de1f308443ff9f1269439548f4865ec7d762e4963961f6c5a17cb83069e3970cc8cc8c6cf0dad76efc661d79b42b23d82609e227cfb278ad0110ca536bc5f3665d76ebcc5a0f10161058f7a172306baf62a71c0a6fa1a2d8e89e6cf8a8e6da96aea0c121f9a3c90845b71bec1aafeab7dd34928f193744f03f5b883b800dd2a0ca79385ee02e73111159172a510206181ddc313270db4cd90188245a6cfbd4573c165eea1ad64206c38c95b285f2f5e806388b0e1f1ba64320261f1a09afb753bbd74838a54cc8572757cd5b86ae843159bd89db4b0474f8ff6713cc4d65d917be3ea6f357b497a19e3b67b8e9914cc53f50917433c1a08f2e060034b00f407367aea56bbab122da6994ab44585c446d58f5b8e11d8d845ded46b43f288c34978b09255cce1ba9441d1e02de432e2ba46e7799dd4897c3f5fbf06793d4adf1b74dbb711cf2099495e2aa382ed29b1da8528d38521b7de8a6835e991cbb60911b89568c1b0a6efdbe0a5871b9e73fcf90e1980c9a7fa31d9f41b52897fda9b96d9ec5f3592864089a52d473d5726fb9a39ba408626a42ee3695774907e1a004823f0d7e7e45f82c7e1e9d4b1c9372462018455cae340b5b45c76a817b8e2307261a140a2e492e99003d02abbb4d06d22d3e6a3d770fbb1a9330221de5800868b2086d030feb7e530b025d17f5df7c931443998f2eb99d10ae9d60bbc4bacad5e1b875af1797bd572fb5a7a87c7fcedf96514c82ee6d0421a7992185f3d4564d71ba3b15e04b4abdbd14e60eb5be63d8f146c09820193fd2d03822a504e51c05107133632839d2d14587d919f28362efad61f1a95efa9859be6f3367ba4ff469c2e0583012c97f18b7d55bb64067a8d46136806cd76c43294e406255627ad7dc1c377e8c9628378334f6dd60241b9462baedc5cc571042303cb82205df0a072dd9fbcde460151a009b46feeea6e5fa33a2f32aeab78859a5e6776e2ec6338f1ec25e948fbb6a979f72fe68b567a99b1d417ffd15b395390affea3facc8902e63383cc8324619185b27c40d41463e3ae7921fa1895af2e3575054e2695508a661035b1c14de6ee2a1f5e960d41579d7211501712974a8416809520432fe09f7efc26d38dcb2d4572bae78888d55aa54d93e947c7d52bf0d0d14815991086c8cbbe03e1b9a79992a81bfb0279887f0601df93494639f3b2436f55b2080185de13c5481c1f73e3b166df76e9386e22cfe8a06fef536260b31effeea3bb6e9b4060c1d543f18cf7810196e77cb066ad324c7c22c0fb8be056e4de1b2693fc9346c1d2bd6c774aa2803ce9f25f6db6384a6c09c3f95a7ad087bea14eea1ec59b5641c3add4ff8fbc034234f426cc2ed1132a4ebd7125c92092bf05e0182d1e7e129b1b619c173dc272b5672e56d1a7b4f3ae47948ad38a9255563f7dff4b87a1d9fcb52a6bd7eaa9ab716d74da66516f67825fd6b1b5daa8131db746548059d7c9659748f8b121a736e8b418a7ebd3bcc4f12c11157a127b92bbed927bdc30c9ab6213b1960f6cf09430f8f888a5ef00ea4296c2440ef051dfdd668477a20cc3913fe1e6e3373324ac11e20ad2a1b8ce4883a544dcf59d3d6d0c2a73333523a9f57263919fab62ae3281547762157e1f709d6d3d6fc019258fce3759fc28ad7222d0352130ded97e494c52988d2d6eb59f28cc604e059d3ca10171dd3086291b465d79275597896382ab0c771b98ed35aa280beb4d32878e938b54553e47f51ed86f22eeded670f8474a5dff10a96facefcd1914a44061bc9613f3167298f5c0efaf7a3a8196f5ce8f160f27775b83dc304aac97a0072ef9eaa0fe8db70c02f2d78921b07acd49958f6a8b71bd391f8300d81079eb982f8f229614a860dd776e5bbcca3242cea3c5e52d10a87cc5097f9a26bb9c81b27ce6b6fbdd583b919c9ee89c031139f119be807fa34be8aedef6eb101dc62d3b526bb510195b8b457a4c6987b47159d179d588fbc2a1a8bb984066eddc2fc94f2c53f4cfbb483fcbbf7cf777c80a23d1f30c24e10dd9fcb8401ae6e1494e5fa18b90939e6a90aa8c3e618350889bb0b9b907da82e4beb109f30eb8c94e328c5ade1a658172c693ab4888a5470c59f22f953482ba2fd07adb5a46df8f91910cba34dc1fdadc1271edd8827af5e6090d63f958216d48570d4b4cc12ddf5d1200cb24e3a449f4b1c38dcc8105c83c8433179e979d7ac6c59134170b37c42593838513c5c05254d9127105840cb749c39a22b3e5b0080acbf5e2c5b81e80744336f4dcc4aebbedd5274b90ebbe3396fb3113897949b8bd3ea17b74d30a458fe147cbe53b87740c49ecace13cc3a679f21479fb2d136487a619fc438741f186ae496948a88e861076d581625554d5fb4dddff9269811bcd58b1b92644ef97e83a61b8a48f79a14b435a51fcd44b39ae3fe94f9f8fc706fe7960c3f96d55971f3e35d3bd9f86f7f811b47a73b5d1904e03249fbe99f762be1679807bf507e9e1b8e57a1d56c7322ebce97ce8e2e938c042d261b454a498156ba0442ad80d00bb5e514e30ba50da063793acf5299e9a7ebadcd40573bbb1bd68c54851c5192c8e67efc992cb85b451b5a520725da699828f0ae21f6b197a09621c12bca34be9a8e3933dbadc589306564b22bc2e867487bfd840b188b2c2b1eaf600a67f5beaff2d1b83eb798e4db8d1fe57ded3554365f52010816948eec7a61ed7a47a39f3db46ec0cbbf49214fa101a877c039598ea0f1c2940313ffe92cb78e1546a68877f6be960d4ff08c114b9ae1cf7e565ccac103094e58b85cffc7455eab53015e809f2d3ad95b0cde27b0952e766a62f99edd0d069f16ce05ceb3921b32886e2c55949c9e0a4e68aed79ebc883579d3172ee32858c73365bfd9bfea2907180471162bedd4dbe82bdb42b5c90814c1734e42cb4a683ebd094852ec0bface78999ae44611e18c15e6c349910f753c1eb078ff16f5e2a65bb4bc924200b621f7b877169df30003dc4a20788cae6221f50b6b4167752234c9ef64ee7c2490e9521f9248b28f2effbb806f8b1c4f83801593225f3fabba095e18472eb72b04ea9da9a6e262d25c76061503ef7db222538d0fa84e9caee1a005cf4fc6b4b26614c81249ffde3955be3108cbad3acbff358c4f76682635dd4284055d7cd74c506570f94a9efc2d090dee520171b225b98b39f3b20c992c8df9e4ba5b5c834b530815520becc61d6fa83658978087f0b26858208555ad9f268e48daf8fb463f215ca9c49a68c9612db7156b08b07eccb4a907468adeed4ffc006217ffa50630cbf9c4d9a3897e6864e3e99997407f1a57d9de8228ede138b29d2958e17e18471e7138ddff3a2b86c21e69dd45cdc94414a2dab30cb2703b8556fd6f3e70ba851c8acc622f0deebde5d087b895f64007c152d7987d2eeba49a044d4849aed1c756d59c736c0c3a096384354c9effab943020cf535a7889d5911811ca16fe26d602ad5a9185436ceca847627e19495144f9c040df87cfd758457b44951e2e0e640f032d323024acab208e2f3a6fa5400e390ee6eac23c5437203ab501ff17aabcadb329f55ac1de86457cb567a10efc265e43b8ff10b0799ff045fcdb7a42572cddd8ab4a9c7827472cee65e99066824b52b42df6708c13628d65bf19b17ce2fd620420c5fab5a028c7510e5b052619d1ae376117c3823b158af66106879c6b9b6ab121fad7a212bcb96a644a4f3d9e646c38e56f5a9cfda294aca518d91a7000aa5312ddf86078e2fe88cd36003d460f0aad718d46dd76afb1a712d2c6d347ffc77d248be336440ab10be5180d951ee9b21c658b83c00af18d6304acb780fd48cc56d7a0732ec9da7277100fd7d86db8154b63a3b5dbfbfd9784f9d8fbfa26c3efc5ae8ff66ad0f65e5cbe1902a16f48e707cc9a072bde8a1412cc9b5b834c8d08bf69bc6c61e3fd74d3b9ba1be524c364f3ba9dcc3d14d764d415f80e94defdec67460e2237e09d3654a4348912d8c3ea99aeed2e3af50a090ac86851eb3641ac983d28641417fa756fa496437fdcd7d04717d899f0e49c68f4913f68614ab57618813d82722bacba2a0b2a3349dd8e14d3d1ebb6a566071d8556b1319e25e814cb739e5c03682666d4c20553f038645e4812542cf3079413a88fbb5a9ec5d3009b30e56d0664590eb52942f00aad556b6411f42593eb5f59a9c2177f3d28431cd1136395da074a0aff7b98aaa5a804268c9eb17373a8a81b4cc45f6d0a35eb7c1d21ba09c31a6b7280bb5f612f5596540ebe58fe0231d0d77c142804d59422b836104f7e0a56bbc47258bcdc6ac2c394cf9286ea07a2e9b2c10e050d8badaebdab38344ca4a687f25146aa9f58923b359205a403d503b1b2d07690cfd6cf5b671b0880179e4ea3f2794fa05e2a44a500dc574b1ae0462048e1860968ffc10886394e1ec3673ffffbb3273f9401629be4f476abaec54a0e9904ffd1b3f5f7fb79de2ba3e821a5c9223257fa89050f82ba6ae807a714ab7aa24ee86819a3d173e0a901566054b9b8519a68cff2763b9a5599b98153d8f4416f1d9daa938836cd232dac659815dbc67f7faed3ef8f123102359e3e586ac95a8bed1684d1cb24a2b83b4af35433d0b1c0a438d9137e0047e14e636c7743c81c00c7a9a2a60674159fa5fded2af3948cfd5b5c4e701798af03b346ff60921eccc6a2f29a9f17d1829ae02b34c911825b91e8026d08a3706e3e829ea6604018e8031ad32f36ebea10558d3ec0875be3ac90b667baa48f390ca42fba1dff05fc80e88c4dc1f2282f91f41a58089a1920e6fd60751aca2a214deaa1d1774822b8011658ff282fda630a8f486f94d31b201aa779d97c8e43b8c58768de4d1b5803254749db9a35e9553355ff5a2a37cf2f8fe61a46b941f30f9456d2ad64793cecd9009223f8fd0a66940cee1045c835c4c5868ee5da5a9d4c13b45f657be97542ea7f4ab39b408d4d51a2ad2fa583ad94cc2f6e2b1a8cfc27e824e403273929b53d62acf20d10df16dac8b4859d8861f9d3d87eddb85d356c98914a116d910fea39e00fa46f0c29fffd32646b956d64e48a317486373abc1ca1a73496c1bb6f54a269e999883ed5b6d68130039d3972fab0c245fd5de9dcfb2c4138fd850c3825b6d3c4a0c8bc3c9f3e74df9113f7bc611a2f22d0794711f272fd42cf6d9bba9c92574822d4b8eddea2d05b36070e451aad887efdba63dafb47e68930e27cc6432e9a9fc5aaa87de3ccbad9cf88677df4d40a66b72e37208a982867251cee4f4bbc73a24eeba30d31674420359d657626b8674f5e7b5c516a6af51a70bcd91f7d0e148ec8a94f561ea77471a3ab7e7415be788fd58524137b518c9df4c1fb9f9d528ade33eb6d00cfce4b07a1860a70f170e468c92c9864cb855720f7d73b6fda28fd9f8ac1c93da7c5faff8c9ca3ed396433deffba6c5593c0178ff859e7a928a657cca9460f6d62478c80ef8bea67c4e427fceec253dbd518569327ca1b95b2839075b4792520441c7b6934e5e05766ce61209672482fe1e41ee51291ee7b35f0dd1c4b3a3f270856fb5ffa9bf230b069413850b810ca53f2bd77897049115b1b091a61d2c2e07fdb771729895ba7c874b43122769f46340ebcbf61574327e5be6335d66b273da02e3969085a75f09f75b5c79dbc5d41d7914adc3da4c840444edda24a287adc3934fb3b1de927eade5bd4940dea180e3720f8a1cfb70a8b07429a27b59e9bc6c415f31ca6664f664be5a05e93c3b205633d659c1bb64daccbabfaee67f8adef7bf0d6f40320193897a1d3782442d5f8aa99680af63f2a43081c8ba23dae5f86e07a2d10643cf8e7fc549c82e17a4c427a683cf21d44c74b508efc6151f17e36d67f0cd734466bda0ae27f70ccc2a66e7501719f9a8adf21eeb2bd0126c9122af1f178e9d7bd943c012efc01fcf6bae57a0ed1d9cf5bfab8de5e2a895f17d22edc567ffa70d5ac0f9e28577f8e78599d9dc9c5c761428ac2fa0a3d7965c41d1d816ed2e69e4caa2f159baac300c614fd09eaf2c84fc09ababf6c4834c5c9122b337628320e3dfdf38906c61561c51935b2ae8f625220beeb5bdb77b5db2a7950b73499c2b32b638b72214276b28b3ce6f7b47b7434a5c6d63c0264c14351b2216d295458e93e617de5852a6404afb6a3e670f75cc8557e90a2ec988843eb865d00d9686001abb408c2b87953d0ade9a742b20e92a74e08efa88ef1cd50d73aa0d5fc834ea3013c8b0902e5f8bb0b4cbaef70f4439acecdcbf00cbe8b1ffa5279e65835de38d6384968180c6aea36c955deac073c512c803ab064155512fb8ace0a218d9c08205a125fc3e602f1db3138665abe0814bd44a1dc7c096ae8fdfa85e276c712384df7c6fc2f9293dde8f437fa12bcdb53e017046b729eb4922b7aad6b5e7eb03bd548396e289ca14feab394f900c698297a3e2111a550be73aa2a2711880854bc35e061d653340c3788d7748c213fb213caca527bff0e40d9094f24267c95bfd560210096440407dc7b8f1cfdbbb9f3d45921c2c0820c48a8c3a784eb394d68f42406d424febe72aa891cc89020097a6cb3de72c6da76625e4b9087e855810e300362b90328d21a01dfb245f158e4245f038882f198f7cd460fec3374df8b9c9951b5eebe907e75846a2e696d9bab9cdaebfa571e769f5c052c8582f42356496e0fe30679b2f520220dd96413bbc37ddea441ac2483ca9fc279944bd398dedf4d1492c1463841aaff5dae0c4cae78a2552acc35f3e449fedbec8f31b20250bacb1fc2e9437c3ec1606b30b6cf5d4daf08a8d8b555d68c9665d49198cbebaf1b3c6fc6d040684b2fa64a1584eb02d2cd5a8bedda87e6b6edf82a8a8133645d740dee7db4ea26c31427093fcaf3e6b97ddb38652c3380674a34ed90874fae1af92bc2eb93e7715903300a291045f4cca31f082ed3c059f95f3f1393affdaf441a90a3fddca9cc6b5473941b1f97e13ff413e434ff570f865724d816f042ebb1a62092a01f579c33d9b8db2e141611988dc7c7a6e82c4c9beb5e507cc5cd9e775ab6b7f1b3b921825a8908b16cc250e932972f4e4cbffc79c36ebb1b7469718003ca6f94717fe91fd0bfe4b1687855c70d1308241a5f61c71c6ca864f8349530a344204af378b63a3f5e431cc5d79960adc0dd7e7ac3f341f80c76debf738a2cb40516bdac919b8ad5dfc901854de4a28ac5cebe90dcd4460581829ec1e678aa13819c72bd03781588e598ddb7e9b0d5e743f9f93f3ce4ffef0ffb2483d46840bc9a63838c63d3d50590424efc1cafefc2bf1a8764f3ba2f87037a93c87e477f282eea4c406105ee7fa97b3c2395211239c0d6b66c0acfd3fd9aea0dc9a2143ba8ca13c6a7fec059a5604c101f9b010fd7422aa06c3685ebfe3e5b3b64e4aa097a64c30bcf10ed1484991fe1c88a7a50e62a1eaf06a2b1e1033db9c9fc5796c9d06b9538719633a76bad093a7c2636725d3a15bcdaf0fdd44bd1596effb2b599463e8fc5820ff54c0364a2e5db470724b373104f301c2d6bf6586b097196ec08c1a839904b265d0dba4f6925d7a7b1b2b11caa0709d6f57cce1ef9194f4f395efc3a9fdb9309eb50b0a0ab3afcc6b8a22bb1da5c3de00dbb453fe76910dc36a108673e872bc862f56c0be4d2e93f3d68aeeea19a4baeeb6f7ea9c868dda7d6b28c4c29765a434e8c9c312243a86fd41583208c39dd33945eb427d23e0f2dcc4a68429c86cc627796800bbb61f45f4d64e6a0fb9beec8e58ee7caee8ad232d3a438dd6370e3f3a8d398660172e8498da7586ca0471be727106a9eda2d8802d611917789cb3922467485d5d07b9ce2abdd5dc653bc9adeb723ab97e051974106868b3597ec584b38ab44ba98f0a957006b99ffae394b9d971cfed6d081498583a94967e1561ef4af8a90736ecad65de54049113d1e4537056003a47988662559907fd85e77e3ca4e52446ca6365fc354ddccd6be274aceeba71d73841c7212558c5424fc946c8e008594e26a540bcc32d4c7b5e7b2975d3843e1020b8ff44ef08d12e4dcc13e8a43e914b5e16e4effd2a10594b1f4a96d55c89178baaeda3d4582d6b3bc0ca4ae1da25d4f1b908c98a6e5e685e3772798be2b0b640fa1859f3b7741f2a25fa379fdbb3955db5376644c3bdef45ec52316080ecc2d866af966ab183685df83d4722f5d8a1edc39054d58670b04de95177d76becf90db92cddc8dc6b00f1f9d6944895f04dd6c0beef6a0ba4dbef1cd71876cf0695931ac955a7d2ce8d747d6cdb7e74493cb780fa65605a6ddf096a6b404f6b6242f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e42f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e746bedc1463cbdb2c1b151027d107888a93bccf4cde8b0ded8da4e956bf73bb583aa1fe8318a2e0c5e7514c38dd2a4ab27dacb12ff26d474d0884ec53c5ce2c522787c5044b273fd68e862eb33d56d662533e6a41d219445d9168354d71582a40e243274cb946c875b60ef27885b72cf0bd5791497f82eff21e902fecca2fe56ecb13535a09f1fd8ae298511a96a14a2ca896ded75c973e09605227ca1ec038acb1aba127ac820b5a7ef26fca6e34de58d4ef24ade9c413aa6a73ca06d26cc8bc0c26598b382e0c914f624253d20ee0b45f845b79ea8f47d1dcb18876898e98b15638986e30c0975af6ab2ff62575dad258ab14f75c3f7068c2117863e67b1832fdc1506968b7fdac79bb838f911dee5c20be68ae274d9f83d8d4c8e7493d6aadf6b7de41058bebc10f0ad0b5adf429625ebdac77a649b8a1aff6e92ee0976aa4c0d654eaa6ce0021883ebc2d8064eb0286c3a55e0ac5bee5540134aa8ec38323d6261da50d586bbafb457b85b8b141b7ec5e19133ac1d0aecef686574e2d292a17e00bd9d2b3ee7653bc55b6893ee86239fc25173bf138995b960a8d5e478a8e4d2d5de2dbe8f4e9f890c7ba78a3382b9b9f8b845551d3b1e2810d5c70021b9e78b75089f83408baab2e1927f8e2c6c311ccc84f32d61ed001d2f4fceb883a2b785f0781490b69011f769663e63e90f9bdebafab81133e3ae7d2a88983f8aa9b040c13b9e54acb907e6aaa668119d8b86b880af40c722358cc6ecf9e545d7b0a67d2c626e3c46e8505cb07ac740c6c38fb55964cf9f37194c91649812ed22a4ac1dc2b3210ef58b3ff49459edbf98e469d24ad4d893fd9f762e48c66bce2557fbf06c1ea07735d49672809e074afcb998a65fb579371de9c5e286e0263d00b9abc68675747b61157a92abaa6e5110169fb30f0ea3bd9118e34c58cebcb784ac0efbde1ec9ae5422776b3eee9031ce6a695f43e701e549a6f04e6c6ab2745c788434abdc1659cedb7fe597959b096ca23b6811ec8588af99572e9d9dfd04d8c2f8d5ebb2dc9b246f80db36624357472a0c8edff9fe0ac45e3eb88b4b4769818d7dd614385bf90c52dc5dbad475c6c0a70b9b6b152889ce08ae88423f2833009f0563ecf3612587092cbdc753f340a5851d22137e908bc9ade1e9081cac13f8dc18ac7e0eb86b20c129246ce490dfb7d97ae066cffd68f5e32c012dae93e39e9761513d8f64d558d1b904ee2ee198cb5a31d0faeecf1797d615d63befeee7643dece90d562f50fdd808c104bb79773e93271213770e145a56b653093c5c72ea41bcf2e73418b0ae9099f1048a20d9a541130691c8af3969e5686d90f4eaa1108ff7f5461acedf87f8cd0dde50a33330f390178c8b000f1a84ecedef4dfc6f806eaf75adf2968ac615df010aa027f1ca967479bef7137d68bdfa28c80701449393496653a9b60008b93fa31a33bccecc69bf2c9eee72b80d7f078c2ef629a39bb4520ad0420beb681f956e5551d3e0a5dcd75dd5e16ad9c0f4b56f3e9e9779b2f6cb43e9130d160a6ce8b66bb3fbe7b6b330f1085ed2578aa4dfcd8c665d4ea9a8231188c63163942a1630e55a2751159250f4ea9454779eb3d46a3b52850dc299414d9c1624a5403980e43c3d30f772bd6d78bf00ee7cdde5d1784780a1828cc32e38831607820ad5a89a29a87ca2ab99d6cd2fc61be74394a76df647ec0385c047b00fed469ecf9f8971bdbd2dcdec585cf85e18f118f6025b0258da6fc21db0b53ad4a15c5e1340daec9c9649a2ce7a6e2aa3d202307be6a1da7b6c7404a434866bf24225f99d0842b51cf5e0b6f08d5a03aaece376e16f387479a88019cbe1747da2f300a1be882f3111b6d1fb9cbdfae5b2d9ef8429b31378eeed06bdd5b9afcf7c2fac79d48cdfd5e9dd6cbf284e55cf3ef8e22b5f63b0d2bad664026aacac41ed8f1c9e6ce02f96bfe496117eabc1190b38ca980d7cdd20c5277e14b40eb30027f548b9d0ffb7e0778eea5a1f9766bcf85c00bd8ff669ea7a616cd0f4aa5113822935bf845be423e819403c9cb27be889f11f2a1297d7efbfa4bd021824c8dfd9ac2806c478e59e5c9a7dc7948de39862e62eae3874ba478c57c269a5278b2eed9278d2de68443ef44fba7d8ae68cfd66f52a42b7e444365e37dc57ef98f613daa942a5a9ea4e2480380168c27f7a96babdfa7f039764a259c4769a3f5560d0f8aa825354feead38ff1c376388cba5fe6f4860be9e44cb40392ec6d88da655f33373e60c97d9fc44b968492b603edd7392dda35d6d18b7589da78112e820c7dab3b1e208de2614d058546de4526dea593bfe70dc3bd15b3fdd4d897793902116e88e9b9a56e48d1f8bf57b9cdb109fb015592de63bec01423aa1a52b7f967836272b275b0c411896f88323720513bfef363281293be99b87859ae78d6843ded2160823ba4647653ad54ffe1015f1e012224a6d9143d360b918949e4c879d42413d361186e5c1fc838aee61d6a8876e0515b4e7be69adbe290e6087a1d55f2b27e418d43a4e0dda48be2b0fe79ef605c1991d78693ece080080be68922b15870413a7d27dad591deb4bdd64feb66ff9ea9c8fd454048310b57db36a3e60f2cd8c1e7ff4b277861bf75c0dbd7a58975a8958f80958fb96c126a430ad29242c5009b704f71bdfe4a26103ebea98a7377a77c93e8e8bb8c1799d8b97ec69dae82fa5427101c86f02e8987666d128e59a6228d6aad804c1df1d00cba5abb1c86c26bf7ffff06ee387cb1589eda22468bf56af7208f185e89a86039f2a776271098d94ad4eaebc82a10b1ac86e1a866ea74abb4349081462ea8d551f4834fbcaf347abaffe3af50a3827f6894dd3297a95adbdd4404f74bea25bc1c8a5495a680625196d8088a0a03d702cfcf9d7819aac7e85f9a7e61b99085203c4cdce282bac2d488faeb29b2cb274c86c0bf0fc770e8c85ba17330a67382363fb3152e6cb9b18831dd4bce2b80c67c7af3caed97a05c9d868017dfa1659b01e60f908029da4d3120d875dd907e2ddf07d6137754b165ddb063169c8d3e65ccbdb6719b6bdbca62f2e5746d2c1e040ed84d739aee242726b817e3e8b8b4ea9ecf35a8bb2da38287da1ec4f1d312ca5767fcf9102b23cee037f715aa442237b4d7e43bcd93b7b80a47d7489a8dfe8fedfae19380f5823686c750b47e938991e64233bfbf051a3ee0490f16740f8bbb89cd19fa83975326d236a067563a78ce707d0f4f5ee8a9dfbdc660295669dedcccc275fbc2cafe08190d90c3188cd82f22367c3e7c7bc393031279f39a826020cc62e8e5e2e9b5527b61d7cc30b594a9dd87342fe0e22e5f9ba165d7c5d13310d1fbde6f2165ccac898771b87c64f7572fa43718d10b95b25ebe946c4ea87a427676b21c7eb9ce7b766b22e6c7344de5254b1dc3d8cf87624a21138fb8ea04109f4a18f55dd1aab315f0a1066297a2e2faf54de860e8bf28f15d6f09ea6d23668ff7fcbec43fa8c225dc3ab2eee481df1688048852c8a011da21c750dd3c6c1c4359a2fbbbe02b647ba88ea8e11908f59cc8d71ca843131ee9a1f3f870b2a85506d36d233cac88696bdaba3e806f9a90973f10c0e5c58fcef79f07e612fbade1c56035695ded17d5bb7df8eec9a0938967eeb5c9f94faed4dffd5fe7df1bc19a52daabe2428f7831f8663be421b8897b68fcc1cd6664b09448136b73dceaf95d0bf7c0878384a1e2c882b104c0583eb211de6441b362f062981baf12e9758fe045d8c26cf2bd7c595b4e95300d9220e0d9b8ee6463bbafb730d3704d8a4e3ffb0edbcf8da5e5a89a6cc19f3d926d8d13f79986c80f2f34c03eb6f042bd2a46c731c65f09bb23a7e1e37b4dcaf7e1095805b5927796413544b48c2e9ec105ab123dba2a31625ca3747a2342924b8e85fd9d6e047fa0178ef77b0869ef7f988a2f6b457a6ab53cec0972b6d990a8f9809b2bae33efd6e20c199cec82f8b7b31ca6c508078d2d81993b1b48c3c15ce9843c5c961bfd5bbef07f64d28b450302fa4ae4377bada1593797bae251ea9f47ef3ae31ba99e3109810d4e1705fe68121151e8df4152536f9b64cabe937e1bf7f7e89243ee7ccfad9451802782dc5b58293e85f970aadf978c485537899dcf45120441b5a4a9e5ab1cc3400aeef1a10da996ba96bbef8d7eeb0c42da89a37bf5002702a0f8dedd53a13cbd97d22bb1f375f9731f5ec45384093baf7c78266bb941648a60680edb1f87522b5a5d9b13288f22663dbd804de58f5cdcfddec98b85d73da99a9a612e8243cb56dda4753874ddb23fee1d72b6e65ad4dfc7ad5d60cbef195126cdee3f00b31b5db8d2fbf90358cab8ed097756ce72df48a7deb2d1cd70d6254cedd36867be36c82a2796a8961d155cb4c5b7fb0fb38657a54e326001a4d762cb5ebdb1c0149065c0ba20d1417d76e71757e6535223244f0919c324ae34791b29ccc0da50a375015124bc18b4bab11cbe89be3d7a81d07998a084f3a4d9b3d25e1a19b996f3cce665a3bbbdfbb7bd601ea7de5050b4340786f5401a692d3ca636c14aca51fae9a26aff6cecc08a6be677bf77b3a93ef805afc79e8c525996e5e0e7c80acfa8923d4c6cbbfe6cbfed769ab28ecd6603a3e097631fdb0acaa4f9dbbca5f3eeb0f354343c3e1c96abb36e169ec4641a993e0388c7db025d7103d388a110bee886a704a0a38b4069e75c45fce5c7e7fa71a599ff488612d2445617d86c7e01468e9e80ce207a27dbbb23c899263eb2f4fa02d3fbf8b2652bde5da7d8b665e0acd81d137887275328d85c5bae0d04e90dae9630760e2bed828fb9e164b430911a60f5394fa9330422511c5df0d6fd65a42746fdb5b82218912fed75910e00a6f0b1975c6a0c1eb458f77b43e29936e533a91e1965ad60ff7947b7e6370a6eadc1897d68e933804d35d2a73b4e4179429fb387b1d5ebe7400a3c5913ca75d8dc5d370184d90500332703825e297ac1f192e164522da47b566cb4135cb1782416e08518e07a2f41e4d98f33f00337b59b3dfa3fe62b38668681e0c05e9eefead43e347e59e2364b0c92e74685493191a84a88cc421467de66b2b48d396e37e77df20bdf73e06d9a3d7b966d913dce9d6e9b24c10e95384518b64ade2d339cf74030a30633d221c047e80fa90be54763f5195d32e837996d05e0649a4dc2397a98b068d7613bb13b34fa12c5e1e093e4d9b1af72e087525e2ccf1350cbd02c0a781c41d13bbc2bc4bfe1f25757e210909a1de258d95ae47f775f9350522bf429c14690059b160b41695b6e8d257f9f4c67cf30365d07f55e5f9d99c41785dafcb79310ba10ce76e589487e1443ab521ba11fa11a837b9dc138350d402762bdfe034caafccee774c64ad441ee014040455cdd5de5ea20a244fcd6178a7ce55d0a0bc4ae06c36c2b356b8a714ebfc84306ef572dd10e50a32d0f64080e23922339503a0f8924c960408060e713b00b4e423e0b98e17b5f035b192ad818ef34704b47f596a2495568b3764f077263fd61d64dfdefac5235271999f2139ff21a028c2c6fb582f1b5b69ad78d9045f6e3c09752fd4260349d65c24d59d1c1e1b2702d7face6ffc470c5b5d91ad5af2127f4277837992c97f7f17e110ff2fc4b44e8011df0febedd5c1266dc81ca4ee46d235b49e1d01e8f7d68e3eb3ec6ae22a3ed61ccf0a48f260c99a66d16623d2a0867045f3fbd3b58ffe61d8615f0739db49208cc96991fd7e37068398fc76550cef68163f688ac869d19391710cd3dcc0ee71fe1cd4858b160b1dcb7392e9ad5fb3b1046e9de59e72340502d8a1258e50138c170e7936c01a2c358d9cb0101fcb70d7c5617431af577d4b869a4627ac0a49bd4d5b2a7bf3fa71e085a76d50085657bbb3ceaaa6f4763703c110016d02c0c20ec06085c7737f815f222de9084219056835796f69d5d3498e87c3ac623ae5cfddc69e185a9fa223b1eb336e32c5ce3d0153d5f2aeea046d4929adfb20d8d7ffb10c14fbdddaad394150d03746220f44a71d27eb6ffac38b25169e9cad5cebcae6b4e8f646ce6ac23790cfd1df8c8c7cf4b9b6a89a93356ef511236bb09d1df3f0c4d56822aaeaefbf56900bf0f7bc0ce8db12b43be231edbddb5f1b4e6375dda5b231887184f7f2d6bf6b69b38bd70f1ede27d95dcff01269b4420d434d739147115339bed7c8067e9a0805fb7ef84bf65dcac42ca463468aa8c438cd0574227367d728f066159f96f3110d50f46986e04db200e21cbc00ab4400f2268cd9209dca0e7b92c8fb935e81794436e9bc3ed90bb43a709aacabbee25986eaaa8526f852ab09634260f99c72cf492ae193c2385808846134048e774a27013580005fee33555a6af6d31fcd97684ca16bbd441f1b03f65cea4202a718fc3436400500aeda56f13a020c513d88c57e36544ddfb3b51e28f598429cc942411c34a13623194d3afc486fd938b6660836df3f173682dc5547545e41f8ba86426df2b70308aa5518a8bce9a1d00917b9f0623cc966c26b362c7a8f6d5a980f155134dc0354850325e2f145ce80952d329b3adab53ee0b2128a431e9e56e229a829f0bd657613f8b32b6fac97a94b9d3651f84a3b699bc97eaa5696cc6f897a845b163d95079c562c987dcc7b69e4db46d03e578ffb8a61c16c9632a417e95db8d2ad03196d719c5d47c271ea847625a2dbbff1805d6c4dc5da5abafbc210dbe39f4ba100dcf7ee276bda08f6e9828e102f8652340cb817f42d5cf59d4d42886b37f578f793278a313869d1419fe4244e71e14fa7d82a20790437d3d11969339642be3b67996b3330981f60d520bc47aa80c0f000ed4c625439402a6d8a144448c175d1b396824a8cb0986478920e9f2dd2aaea99dfd3611e4f5fe910321b6652c19d50d1ade267104858a23add0294e613c93abbf65ccf8d98d791105e72bf0101d770de2afb271b36cf3926631acaff70d0bca57c1d10747b025a9438cb48921b0151a9a4f3fcd25a9342c5878a35b743a5adfb0714ab55c610edcb6f82206a32dc5eaacb70563edb4aed0fd58434da07cdbe0fe4791e43b701d3e4cc6587c18e1d03498244d5f3cfa2966588cd6721d8edf66d5ee6f9ea9ad12ae95b0775bef6551446d09c572480383c60c09c9e1d53b5c88edf6f69911955303637e58d9bb28df425257f977738547b79c646bb76e2dc2a2d076ddda1649f78ff878719fb73b7fff2526f65f3d21f1569f1c0a7d2411bc6f2095bceda3a43a23d1d18c287902bb512159d9e9840243f3e11b83aea992b3888a375d014188c4134e4da54b91a981d33483c816d9aef44eb6b426f2e1e53fc95dbd61ada4107e86949b64d95e5b0fe7b48f4cc1abb55be6adcf75137089a4da8099ea8d33b13992a60999142abef64c4ae6797f6daa3568c10d7a7dfe6cad4e92abe75a238bcbd96ab2e69ef6a6c11a62286b70fba061f48bff1e0f173930cb37084e666f934755b5acd17a588c43c4557da60c42bb3e5cc9d9fc997fa1093e847fdc99d791345f2ef583100fbc5b256a011936183bb6218c84d0d055736a8d88d4417029305b5a5f8cf80f18a452e48b49519998900c3d4461db2dfc8dc9e29a53053efdf8ca637fcde2a23c33b8d026ac5ce3d3038da0094b4f310bdc5c930f2d3f4586b6eb7877ba2666c5866d5ab2d50c2c45b2a5d5e91ca332a1557578066226641f1b982244ee21955e989f4968c00952d0af2888deabc64976a17f050ebb5e2bd84a1b09eb3d56aca3ac96c59645605027e6a5be0e24eacbc2f573caa0ec16fec498374c320c8a2ad697b7c1f7a7109d9c612c7f1e0735c5975e77aec0a250b0b3f8c118055f0040ae1fda32db8cd04b4fb5cd7af3fc7f918d5aaaac321bca9c46a8031c1ad256e0e619f75752c618203f3878f517511b8009e3e7e16a8ae5bbfc87f89c90ce9a8e621a7e9f6d8231b310fd0e6e3f37c706034ea1b45cc22a934ac544459c6f1b678e4fdf6ce0298fb8eb92c2ee4adf8098856cff11d7b7c699fdc656bc6007667091e205f92e7dfbf7632be64175425a1cfb47c64a3539495070817c0dcd535d9397ca2b1af241dc0ef3f373a202629136ff3106d06c66717c4cc12bce5b9cdf79b77ee6873c41cdb4f0858ac4d2b2b45e874936d0ef8408ad8378aee6f71c80d66e33724764f11366105f356ba63193775a546911ebe71615ad8622424bb56ba0cea4e505faa00ec254d7926fbb0e72b850c609d55c3c79107c2a055505ded7d604fe60ba839885a0018cfbbdf161edc3ce7663e58cdb47c6d1e7b4894ae3556819471aca0bacb92064e26dc5aabfad0a9bbcff2bd102b778fa873962c011925db987f89c6e19b4b48f98ee30622eda896d81821b8bc098eb0aa0e153de061d04c2b57ede525c25104d96a4019aeb5d0b93bfc57d3cdc97c0c5136755e299bed691112e76c6ebb6313f9d1c71076d9492d5a88d842330e791b8a160743f25c29841ad66cc57cae2313370e154e8790d7c632763e09c13cb69597b0bb25eef374fc8bac79b6bc4a66699ad7fe9e5d1d5066a62482e17c29beb908b9e3c2387bce7400982caa85b9f830be574baf60328a21d6d53af336bcfdf66a8e13c6a1fb6c7c8b785f5c6850110bb1e2f989b8d200bfb49439ff9bbcc22e14f418c857d2e30aaa9101cba0629f9038a79c672b3ed6789315a534774e0bc1579aecccfeb47ba7dc20abbf5c0c0e154086f4b20884c834834b2198b2aea4bf1ab8ca59ab79ccb8333071e02fdf2c5de6af638d617f1af432eb7b4d5846fa4db8bd112f2ca17de1b0acd6c57e1194a55aa29f4c95f4d199ace3165b67c34eebd7d40b6cba0869c82068e720491bd718b2d42a934b07e3668fec95337cf564848983ce01f03a8d2698046b5de2a9bcd16e3ee64df6a2d54b986f152d4bcd4c965e153573670db20c47c8f27c71d7db666a347396918e3489489f92d7e45636516f2018e77ce9361d65857f97f6bea94103d861fdb89c9f57fe36bdea0db8b03e21492bcc92a9047ed000689518cb97a5929bd0d71e59efc56da5b490f4941ee079af4a6a02fdef27cb15c335a4feaa628451204f291b9d4be6110a7db35ffb77ce27734f677fc4afd303e0949dce23c13857835addf9449461b6117af3884296ebe0a90bbc3476aabcbbc6ac0cd89557a6f7e3c0cbf545b2ca0244c302a7880c6d53082433a9a06263cd5f0d1052e8de1b686506c5c5fe4a36cce6e85645fc6be034b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe959cdea44fdd98eb626c403d5490c654341b13a084839e6371d0a3f95c03c2936014c57840513a62e542ac5c88f6baaab95a8755fee194ee75fedb7d1ff531bfbb659df6670778a25ebee835818a5191ac2c8bcb317adfffbe5840b24536e6aeff23e90ddaac45d59c0b53e1cda32a6f6c3d33dac0cff671ebd6dc72fc62102b016101b2589ab6a4ed3f140e932f87b4408907fae3ff81690d1de4f7042a4a8bc57a1eee57c3a993b501cf7ca1719549715fb330cf0b5c9449c05228287d28d1cd19"); pub struct UnstuckSnowbridge; @@ -99,16 +100,12 @@ fn sync_committee_keys(sync_committee: snowbridge_pallet_ethereum_client::types: fn header_hash_matches() { assert_eq!(checkpoint().header.hash_tree_root().expect("checked by tests; qed"), NEW_CHECKPOINT_HEADER_ROOT.into()); } - #[test] -fn can_decode_checkpoint() { - assert_ok!(snowbridge_pallet_ethereum_client::types::CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..])); -} - -#[test] -fn sync_committee_can_be_converted_to_prepared_keys() { - let prepared: snowbridge_pallet_ethereum_client::types::SyncCommitteePrepared = (&sync_committee) +fn checkpoint_sanity_checks() { + let checkpoint = snowbridge_pallet_ethereum_client::types::CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]); + assert_ok!(checkpoint.clone()); + let prepared: Result = (&checkpoint.unwrap().current_sync_committee) .try_into(); - assert_ok(prepared); + assert!(prepared.is_ok()); } From ec0c1a325fe4590dfc0bda0803b1c4459ca1c661 Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Fri, 17 May 2024 17:01:30 +0200 Subject: [PATCH 08/22] compiler warnings --- .../src/bridge_to_ethereum_unstuck.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index f13cd04a0d..54e2b59565 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -19,13 +19,17 @@ use crate::{ weights::RocksDbWeight, Runtime, }; use codec::Decode; -use frame_support::{traits::OnRuntimeUpgrade, weights::Weight, assert_ok}; -use snowbridge_beacon_primitives::BlsError; -use sp_core::H256; +use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; use snowbridge_pallet_ethereum_client::{CurrentSyncCommittee, NextSyncCommittee, InitialCheckpointRoot, LatestExecutionState, types::FinalizedBeaconStateBuffer, LatestFinalizedBlockRoot}; use snowbridge_core::RingBufferMap; +#[cfg(test)] +use frame_support::assert_ok; + +#[cfg(test)] +use snowbridge_beacon_primitives::BlsError; + #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; #[cfg(feature = "try-runtime")] @@ -37,7 +41,7 @@ const LOG_TARGET: &str = "runtime::snowbridge::migration"; const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = hex_literal::hex!("8866b2286167938628be9eee938d21321837025f93725f9516b30dce5f8c11fa"); -const NEW_CHECKPOINT: [u8; 25159] = hex_literal::hex!("520080708a000000000001f2140000000000940aea29cc27e4c0d49ef156e437e8a11c30c80c55c04c08af82a139e1e4153110fab24f024fab4709b5c44d8e2f9b645dabe743b0fb535b9771e856b12ce3a13227d1f3b67e33bdddd0789f7eb0062f5915ac2c47150c767e5fff56552b6107b9095fea6f875454778517648e9e387aaf15cec76acf45e082f7f2fa33fedbb51a7cd7a5a2a85f97028006c832797782803fe2edbe2a3c5e2da51b1359de062de8ea7fa96f24bff84fefd7017d1e1b015b61251ba0f11007c35d6fcbead0b36ab85b4671136af19ceab86204acf823a1a6aacaddd4f9e103df36e00fd61f13baaf4bf467970f36b99c246cd546c11d61a81546818e798e438c59757cfb672f65174b8e7c5bdda7708fd74f385e1a0b14da3a9d19f1976013dd274ecd334876a58da521cf0dc61ab4f0f4efe0729f58fb40875cc752654c38c5731a3c47f255567990a768170e7ef7241593f6ece8ecf999a33c7cb7c5965d7919d6604cb4d757b71509ab9a7d44b740153f96e9ce177641e75e3977f19570e22cf79a7b5ebcf1ade0bd29448068331d4d2821dbeba946558f385a71c7834fde97379a416c1fbd74e858bf53d331b6dd09c20eae6da6f58238add7f888ff9d14e3bab0d76587d6a3263bd7087f862926cbc5d92794e7d74433d4ebd26834f3158f93b676dac18491b58a008c83086d5a313a808bc2ea87cd36093492e74a40037fe038766c6b3feaf98ee84a5fff6c1118ed6cbf98d99ab056ec1874444387337977711324e43cb9dbbf84d328876c5873bc712a83f62de509414565615ce87eb35b720607324a903708b46625788eddd9f83ba177bdefbb23fb35af2e1dbc4c3c70daa3d5d2c732ccb89aa0ca8962d9ced1ea35276b98b2af95aaf853e13b66425de03007cca28a32a948ec463498de1157e76dd6d5dd8356363c171036564cb53dea2c0c2ef4b62f872c577a6a29a8b446e2f145b00b71384b4e1d32a350e57028526c0e4031de67c3739fc815c3cfaed641b8e063608569163dd68aa8ce01e48c36314525016e04668b9df1d741cee60240701418d35992b88fe84fd018580f1d4dccdd58d280512ed0ceaba36480c84259aa3e8f7d602ca9b8f7695b1cd160796d2c1f230ff40fe69dace0e03554b2d496a787bac2a0ba72126973575be2895dc3df5a8fa3873a8a94ab9e92f37a50d9a9573a4b0e24ff55821f674f2fab99c4ece573d635b415f68237827439663ccd7157bd889b2a1af63ed81071ebdfaea91200e5602e4d8759935a333068d46c117d8e7518c0922ec8b3b04408b08d6af43909c3e1823af2ec579b5d860a790f5d21c234a3e13d64d244ed00f46af133c14ba69e113cb1945348ec8263e8fb5481c6768a38b29c75fc6635781ce2949bc08982d4b92bb9816154527903ee9968f27f0e7383fc83a3fba2e1eca9c79194cfffe6e57cdd84ac6094ff45f44e14091ea8d769b8f0f25c60b719c97ee7635835ec401dcaebb060a4eb891594add14fa0be6861f6eafe684618bb55147deff21dcf65c1c8e155e25a84a2a15f1a8e1b9ed26c58dc069028366d2a5fbe8d4d8ec6ea90f0735970b633f371bfcb3cdf700060d1e3a4ae8af0ee14e528dc175931a18020463b5794e9d266ddd356a6d377827a5d5bba702d1a4a9c33be33785175beb893c20d54631a5aa120cfd4fda9b5de8b0ac86e8f86c0fc6598ff80f5f2cb02dce934d17912428f722c0b68c99ca11802fb085e1ffad76cdd15e849095388428851b43a95983bf9c2675bc87cac621f68552533fcbeb19e06b1498d3df4f6e0359b19ec30e6ffc18d27c663a76ad106224e856d40925fc70ef05f8cb888992e3edd3c20b73a8f0648d5d58e04de317de82c4d32144df7b9511d20b44da626ec6588d8158cad2db14ad6940a5af0dd128d6b151acbed1571fa7439f56a73c58e889be548c5bc5b63d85150a3ab4cd859719c384d2994e891cb90ed7378a04e2d36278429b272ca81c55865a364aafa3d5240346989c4db46c50a09ecd2b135c2fcf2a274e58c14bc8ed9f787392879009b2bdc92dc596910012755bbd900ee46c594c8c6e593f6df9baae8787ca17fd44974504c6c94812defe94a878b37c8c9f0d6a188a446a000ab1cccfc0983b476ed8f4d178fa1cea06023cd2e8600c539842877c6ac94f0eec917a2232f88e1bc7069591b40e6a4fe8f604349a33aa6992f5ff11ff73bb9fa676f9d6ab1e08dcb246df59534a2793fe461d8562982022bbafce8b37f1d98d10e151be8b4b95b97fdec144bc2940b1ff407a9da5a5a1a0a8492e572ff9944d0e21abbad71f2b8c5509e7b64bd3123ee3f283959eb4e1b752a3873e827ad6f2d9199d1330dca7a9889f0884cee8ceb61f112a2f4569d73e403409f561d12a85d47f32b50142d3394cbe9997aba834ffbced35a67c0d602eb9933a3eca08d657d0c550b5fa64d4e8d9df44560dad489ea9a822e916e4dc613ad6e8071759cdead340fae99a23318842242285c4eb6a1976e10c527650186dff573b3b02db2697049b708fcc67bab8477480c26f0e6ac4d6089433d3799f34df757fd09e7a6605aecd79aece1aa9a101ff61f2fa9f03fd573a188b18560de6b148327d13dc097f8f4e77ff7f04b58c743294fca2f89f30fb125d449ef3929a811d122e15810f074ccaf290446b0f77698ea3e5c663c2c9539a1637cf167316ffd0b0941e480b05cd88ea11467cb7bbd61458c8d12fa2d1816007dc74f007b17541816689b890ca51e83293647dd7c4ef14a5612dfac38416bb4860c4179e6d76fd5a4afb1ae7f78f88ca43c1731dfd42f3e5b20ddf920ad098b5b5d5832a0e6a599ab1aaeb2294e404ab79b5a7fb1a022b612661712739a32a9d0fdf13179029f3d39c46ea029972a39fe622fb9ae82d8e5959c54a1984e67cd4f60cf36032092f39d6d62728f34220081735c6c064682af870883504b8d9676d7409477d251728b6aee3eaa3467eb491b74dcca7c9c0067e4a36917c7bd8a8c9439892c26d7980b67dbdd334538c95f05438838da906ab327dc99998881c2f1663ebecc8ef1535918169ecc3a64971ef905eec8bfe998837abad2f65e0196168c7b928fee34b0e499bdbd97f8a4c57d1efa1dce03b405900dbf0109b315266c5cf3d0fa2b626cf02217b9621fd8884f03a836bae647acdfe49485ae299894ce11339f6aeb078f28055c730a18097ee708681bb015bbfaf5094fb3d2ec98a1590fc9391742f0e2ed05f33996a49e6ef5687db8be0c7d7de3b700a54b727e5741049f683a008ffa5f2e2f1f83d281ffeed756a7a477207b6f3360168b13f75d39256afa2d357914519ce104af23ccce1f03b91df63584c5acc2c9f67dd20f2913abe56fc4b011d11a9ff1de83497bb4b001a6ace5739088c6e17a356a14f97ce878311745cec46b058d0adeaf7dd0004846a73a6b79efb05139d85594a31078712b6c11983136d50e5895b08e06913477b6443de60c85ca5cab6e2a7ae799161791d78674305082262d010fb84fe9441c6fc66456f4fdf722d1f889fac449cc1563071098d039d2904ff1fe46aa3392109c1f2eb8477ac6fd8f7a71b7335500fe720bb23aa864e2b094a51ed369cd2615ea3b17de97c52b4ace914126ff9ea5b2c7c30d413b6186dbbbe7afb2a102c22d1bf616d7afa20fa9eed6802ce5a165ed6f1d9f1779ab7dcb6dcfe874ff1cf812b71f1b54ad288d53ea16668bb5c9123ecd53f6cd05ca0fae2118939bcf43d4b0de098e72018735b70a2b74f82afa890abb133da2ea87d18d547e29b5e4ec4ec8fd286b503d50cbae947699165d5529a2912efea5a07dbe19240a271aa9a4f161bb024f5aa112c0409d3b919735d50cf00fc5b3c9d1f5a7ed09ac05045c1b23f5e02a82277a792b921ef675e3e318b27bd27ee869dafd25f2690aa8b3fd5040d2985d4b9476ed0b8a6eecf9b0852270ea7288ec92e24184d845d608b81c52dfc0ec242711d443924c3c84148383a862e41ed8ab22fc85ec678edee00f61ac92a28728a2bfe3da566fb5f9dbff2edae13d1edbd3d5fed7dfab1ff85daf789a5c449f17e5c22102d269b648ae75a8a3a9a1bb57b419ccb5331ac7a7deb308d64c1dfe606f120269c7fedfd6f3a3b2d260119903d4269b63543a9349d89e4e20afa050fb87cc91585628456f8ba5dd056f9bc34a81f82d374adf278f3b925dbe0f22e4092984a022109127e694b14368fc2aae1feb00c67cf42b91e2e0501e6b2bee9a8699753ea4f58ca4eb0fb11bd32173fadf098eed0d0348d7fa0a881200faa25f3af847de7a42254214389db4565712c0720e2a5321b56dedd70785ecd3c18071df550a595b460539a153bb414143a7f46c2c78aa766bf2a88e32fb463a51ba8ac7dff808fac5ffd1a9698d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826a4911842526a32087692c3c45960f370b10052c4a8caa3d8872d8821c8f2387b701e0319f913cd0bfcb5a6d38eeef1d2b1c7aeb71e4c6ca0e3e1614795ed746c2dd5bd07de082baf478a8c7fec59e2060ba8c015f289545a25b9f278cb29324782a7b7df647af67dc5ac5f82e144b3162f757fed2150f42c59c1c8644ef7e9efab902907247cf63a1751974f0954274285111345b4e0d0e8553b7fbf0007d614e9a67f5563195b98cb77a3d08ed519c047e8b0660456d512dc1af58ee4a7f12380fd420f44a41c865ef2ee576488b08cb803b4a41cc878304e3434267aafe1668a62ef22c74c6298799dec09bb68dffe920ece825fcf710ca6ed805be2d947319646b850ee40e6f1aadc4aaaed89da8e7585c3a0687ecf2bf2d27a59d67f5db5b8555047a55d7aa87cf2244ccbd82f9f287d4c6fc61aeca969f0c17fc377444feab3b55aa7280ad4debaf8cdaae972a3a60b602b2f0fafea0d2afb55b06e884e02d86d90b433e5f7781fb3d182f792f81b9747f528b1dcde994ac72fdedf066f931ff4a5b05b57775632ec5ea6dc3560a6919ca82348903e5245a4da54aad05aaa9970043fbeeea3250e2e63d4ab0643b6c279e718c44a5dd283e4b1bb6ff876ddd0868b80da00bf872c522bb1e9835c1d8c9861ef5a455ac5c816adf43b5916951235de7ec61c200616a83af6f1cb18665688fcc957a2dd28ad911f1b5b82c96f89fec7f64d17dc115dab08d3878d50a1672feaf6dee4b9bd7101eb26cd67d1a136e9c18c97151730829be4211798241ce7ca15349a23bb0bf10996561e6dfdaec3571a80dbb6b7981a56abcb0abffb110137efdf5d9258f6b35d703312465ae947576be7f8dfef0cfee97b4666e1d8a2f326ddf32ccce7c114a827e65348461e7c2a66ded66fb89c0d95506033f5e9d6cb8a235f7beb2d49c7729d7c536f618ff95801359d44b1dc4fb14dc215e850aa20df734701a21ad89315f25ac620ec7f7a1aaca2deb1beebbcbbacf7c54df5b9ef38e4893e77bd5e285f02ce7b5b0c4477fe46d6b0187a768eb0a33d91b49a331632b28a9e164487e4838f24dba0528f1a722ce5210e343cd531bfcdbcd2936326e0b9881a555ad97bc19eeeb308e8aff73cc2fa8c11b96ae1b8c83fbaf7c5a49554ea71624fdd5ccc377b6af318375f33bf344af84d0240acd68584251e032bc143dd0c2796ae25c48151295c82c7a17d2e5aab9b7ef2d50c9eec62365ca71679a4f5045f5390d96e9018bc88a758c1dd2b4397e617dbd9dfd7cd632f84c1a7eec6ad2d20cc851eda9b3253d96befdc4ef45206ba7b9dbdb2b8a6e69c689c48aea9b126e620db0c588fd5c7e405c4b72d5c03c253a4ac150f7ffdc9cd69e7e606c5eaa8590c7a389ff1ed3de21201f664f01d20992f4747339d3a48524f3686356397881935be9afcc5e16850bb8a40b869c9f03ac7cc49cc02f190cec7b8ff8464d64eb3f374d04dbe8b3d3e0727a2a1850e5c2f7b5a16cdc5ed55592947c8d1dec392e56632946f386bc56d4fa3a09400824508125b48785436c5693f4e99e62e2ec62fcae44a9af8080c0063a6e9bc7e1ba9e377c36b329e77c0abbdcd03df5dbbc069badb9f517fbe06519f90ad6b3f82a4e63d206cb6fbc4f5fa15062be4808a3924269ed1784926abfeb82bfcb8f5f4a305a8a1a99a96d9f68ab8c38e70b5d3ea4ed706ecd7604acd52c60e854469132493e8bc14ec3a1668f974ebb5f2ab65630fb07a8f0a3c8745b122088884c0abba4885f963ea29cfb142f0f0385cc8420bdb1eac2c1a70549883fef1204989e667a710c07f37cebc8e2fd7ddb1a6ae98282bd4e82002857fa92d4458a6c6fb856ec13f83c31a3c6e57552aec15d30017eacd01fa3bcbc90dfcc756eda50c7019bb6f22052e36b64431886143b0636d47d15c69e1f4a40e392abb6d50d0288f34e963e9625fbb416836587d7b8171425e6472442f78941457c76ff131b432dc83cee60245c482f6eaa48812a6345344855dd2916468f9908c6857bc7eb05219fceb609ffa3c4acfc23907fd8185645b614a80f5bed03ee1c723bf9c7324f376f88536a78091de87df89c251c382efc893feb41afd17d02f17891e84defef493806f959e6b7bbf19f44c032a3ab3d79e6cfd4d602a2e00901f46ae10ef8d838495449118e8132dfc420c02be5f37ff72ee95601bccead77901176bc7ba0e2b8ff0e7eb66adccdfd7e123dafc93ac2aa0bd38e21b92fc609ddaf17b6ef8c02f26fdc8122a4c2a4b906e29429260c69800fe6b0b2193ad49f851c7130c9aac7196b9122df4024578f5cf8ec999a22f5569b254abfbdf552341c4b35c1a9955284d77d1d561b9a407e4ba227b760e88ddd4a93dfd6a5df8f3178931bec5690e826509e20725c79dcfb9d134bb8159b98bf1c976cf0e708a5da90fff176dd889d75f559f59bac3a07229c2fcd87b52a8c29a5e471d48c30a8e662c88a867fdbb26f57f88e428522391c5ab960a698c9357613c4efaa3c8c902eca73073f943434ba236135f38d8da35af0edfc90c09e7179ad38ef18b73365e38df872a3c2b8fbc6800f1dfbe8f3a2bafe36ec315777bb74c145844696cf877317ca4fd9ced86098dff5d5a0d9925b718e256ce2a63a7e450c7abc7da24a9d2e2ac169a3825129f84cb4b9dd5f42d5ff05f63ceb0142be4ffa432b6ea8d80006fd6a2f2e0b0b186f9a9eedc64d6ab1942252514fbaa6346d9180d6691494f37f4b6aeea118666f9c784b8cea8ef906e394ad4733f3bb2449504438740fa8fd10a97cd287bf86ddaf050bfef118c3da4dda7b0d16555378cc34c306608bb502844c2673ed4808c2d751dc21da4a48d48c095510d5a1330e48043cb1486f14af2b4f8659384219c6983d8254655079b991b185a01178eb81c29da857c604d4fff201ac94f13e4b9081bd9838eabc7e2dd078dbe84dc14ea767b32d96c9c9ebc0a6bd21ebc32b483ddec6cb85671acfa9f5487ebb7e6c589f3af4063244a785cefd3ae8584c50aba91c6fa1721f02b6ee230b17795c5c998431f8e088d2fffe1c5ea154403b82268b5df336a7f1823e96eb56b88314ee100f719d842760a0bc1ea47394ef4b1dea737a583a913b68aee961890e157471e0b39a0b1828ca4fef21af330c3c57e00b135075e845feb34589acd63ab1f6cada1252c9e0594180f0bd9b9a3465191758a151b7ec9091901d3d80136ca72ad88aaa3dbe110e7078efcb9c165408c4a73a11bcc80ae53a80b035d4018640a8e53b8e374b3f746df77a7398f00ffe98384146ad2e81fa85e1bc22c0b093d3c1c35b46c12777617d4c152ce73928af98592e66831f03604f003b621ad0e070704967ea91bb668631249ed97475c1eda6a42a8f6f8ae6476e165e25a72460680d0ed56bfcb3161885fbc770308790d39e1a6ccaf3057ae01de336fcd4bbde72c32b4a74a1b7ff0a0b76f32e88fe7a66b6f0fa360e144288656610552e564d8fa27c624ca3b71afac49945b4397235c20ceafaed87cdae23d1d859b7047f12db145c56a52433c90ef4555f1af0092d1eb32bf5b96eb11d4de6f81b430cc3665669d2789840c7276ba346a4b0708c9da56ca72cd549b85221c622ad5aa405305316559a8278ace913f689c06d68c63529b1ab8843a0378c2f6bd40ea6851c76ffe6ace0e9d2ebd39bcc8f878f8b72f68abc296e465db3a3f7b8892bea7291f92e82faea385c793ed013babb68d39f57074dc651d3f083eae28b26806d993f88dfe21bcde991da3efaf833329a3352422b5affcb652c618cbb8d154ffcbd69343f3516a02c626c61563c2a29bdd4b197027016eb7f60fd69396ad2a258ed63acdaa86c1a0bbd50ff1624e47dbc820bbc2169c17ccaddda93d93ab900971b1606341d9b2da21685fad153b9c711917834199b2608a5c1879f88d53e93cfd56747d3591c525cc506c5adb880c1767400ebaf0d6c68c5cd4ad81e9af454b565def6221625d8395a5c490715844bfc618c23a3e59c42909a12c2f18de4281ec6dc3ef1779b16de3664e56e130a0f99e64bc6c1330eca257a6dcc611e781d3d00b68bca10e8c67f33de54041f5238f154f849cb864744c4a71a803d0d5683d022a4ca80c5db7a25399b315f6cc5d10df07ce536c35f48e1c736a7cc2bfa839383f04cabd65ba6c5ad1de7a4e84a9051f11013650a96bb56189c36f14cf162795efedbf61b0a24f15986bd5ede461242573144a8d6d76c2d1532549f63c066e88556a74e05199a517a91ab689a2252a645ba457c8a13752950c07ada64a9264548f7e2a92aeab53b5d4161a1670defe510bfbcda516d7b5cef76ff8662b0dd046bba591f7d46c9405d7d05989d627438e02479c23f704c7a0ba4b597963ac0a3f523313d5f920b8ac61e24de79aec534b7e643ff4df321b64217e20128c88e83411a0eaeb6e6c264db61819ffcb0c0fe269d5aa6e7d648141e64163d2a0e5ccb44a2492e735ff839fc0911acded26b178713f1bb6c845a00416ec6e5f72eb9a1095fa70c91fb4b1a9928f39a055b339882904c9df5c3d4d4e2947eb1cb3ea56296654df6c77aaacd68500dbc45513f1cc41434c3cf485abd4e8b226fc479f22f40d3dba59086ddb9c7a2e0c813e8f1dd58504569ac9b60781ed0d4eb209575cbce5b31096745aa5e84e08f5ea02e543fcac4d37730d5b1475248ae0f78a63b0a48cffcaf802d8db5bb644327a775dce7bc28658bf8160ab4ddc4926dfab69e1925fd3a4234dbf817cc5c44dc25592722b7a75bc116ba94c32f82b36704baf2809fef5afdd894ca660ff2fba1fabecaaa54b3572369516ce608b2b27bef586ce90675834bcf07e5182ce2eb11bf3f19d94e24c2d229bc8a638c2c5af50f5ef770567b612e372ec730e9df6ab3b1c7aa6aec2f3ed5d0abf01b16a9d1feb7c6e913d13f977b828d08aacf510e97882b1a87bea91795a2b5d12069f7978174301cf64fa05ee524a568d9faa42d1446a65cabb1cf1d06a271d8a1a8b30d876845383433af1d31fee583e2d1112be3167dba6242fc0af1a5545da24b0eb3f7cd50e2fc21b9233c85373ab9ef14139a2938155438d0560cc9d3f16b6cd4b1bf8e932b147be879912a2bf957ebd98241d1937316475f15462b865b84501a80d0003f9258375437c50bb25aa9ee37c22a6a6c6ea067123844e56b79cb18bb58d2975f28698e47d0871180a99baa125bd3c864ffdd370dcdc4d9d235e5bc2dcfb4ba551e7b1f85ccde552d5e1c2ac63761ff4ce1dfb0ea052684f6c888644d00ff83569dbd285573eec71f8a8672916c82a470814f777dc27713b905eb06416d76c12bf81fe493aec8c6d7a89459afddc6d949ff95356de103c56cc144591a68255cb28a2eed3e624ddee61694c5561925040a37aa96ec4a27652f5a55deee5b486f861e05a347234e465410cee7d09bee7a1ea6fba484883735339a522c4be592564ac66f96d918d0e497f89f3540a7f8c8bb5e38d46f4f30fe9a0aa57f3b6b78ef32b1902dfd188a47e12efd47291ee774392e3c9b0e58f52be2e8671d17618d76629d4681270bc4052f4d20fbe45edba9909973ac9aefcbf972821bfe3d1afcb533e8de08654c1a01bd681c37ad1daac4493e31855687d8340199fac45f771bdecd7c85b21564e4f2b0aee0d70ea1182cc9da5e939b488f8ca2297da1583347c959b2248f3d61769aba21a9e6407a83699258f7df385f14917efd46e4208c81fa84e93d0bb9ddbfb68aa9417e45eb0fa4786b2c3e5b1c41fcc175fc719e588288dac7556d30caa72a027d733a3d41f4d19a9fc385a249ee2f6ccb817746b45b1122738028f34e71272c7a16093743e00786b36f32f28899bb81e63217bf4bdc70ec23e748b83f925843fae57081669fb804c53733fa999ab6e87cc4c1fffb83898ea5237e3ec8a561a3d02cf71a076c8a102ce1f9f61a5275f8d90df010ee4e093b96cb53753589472cffbd24c1128d7a9e85811fcad66d219deecaeb6f01b4fab9ff8b6c75ed1213d73b97b31a32390737ddd99cb2076d79c860be03d6e35f78b8fb59363f3a44503662dcb6ee7a634a087e18d451a2ac6e19a9179b020877c236368a1d1e2fa127ab932da6ad9fe8c2f61da8a356fbb37f2e6c86a147013720e294b960bf8ad6604448a44cfc9c00966b0020f6d2eff691fbbff9505d6fd3e48ffdb54928795d1fa831b95b67f7805fa6a19e4eb0dcd7b1c49b4530f4be07193c7e8bd271f7694968f16349f7532f4d2d697740d4fcb949c97d03128d274bbc52b5f28063fc735ca7f9403d51137390e7c0de3cb1ad83a2afa680f4fe2dd40ce4cb9add58d38a20eedfebd7fbe6a2dc59231feeda3fb523bb1869cc13c9e3c0028be94bcbe06c918140c8d71638580b8b5e06cb9cb8f24d32c225f53bd7909a9473bc03170485384e48f55b9ca1261fd8f6e6f3e44dc113205442fe8fde7610f1c67263df2150f7d31a71ca0b6c1b95d30f56f70b912249d86ab9615471711ce3805d1ede785e678e1039bcaa22d6de39092b7eedd716ad738cb313947e8ac39663221038b5711a76da558fe6f4dd4d59b78de9482a39a6bf4453c948f0237fa68fa83566ad294266e88ed2ac8ddbde41567c8854095c42e5aa943045f30f0c619011fcd87bd19b7302c5ae572b3e69a4610fc90e496d55285b652ff723b72ad55b6afe0f90598450caeb0bf0fb42a689c942a5cab1ce0547bad1e575bf29a1c063c8087dd5a8e9791f67f6789926ee2e2dbc853de026f37e3b584fed0fae0974cb5897597011a9b7b967001f4bdf712d804b814c901e27c9b33ffbc02690e1d25e1db8ebb1d437fe4aa2501952911b187d0f84470c359fe1e0900a96c25af8e291e71cf48fa14afca0ec0398657bb0119565ceef78f1baeb382d58e480492437a49f9ed0be97a43b5bdf416b82ef3d3f25e3b4010cfd494be23b0b942086c781cc59602353c0820a3884ae091bf72136303b1d4ad231963d378e17386992cd6044e96d3f1b44036f09577f5b7b2dfa5b523e380a7bc90cfd391576609d3e7bc2d8fb9a2eb84fa4b5881474a3647e6a51fb7c5919e1dede1b479bc157a3b3fe9d556f4b8c378dc23d082e0df126fa74ffb10baa4169c78065d9cd0e422d8718f006510248227f9dceb1756120e42813df5de46c3e0683b685b8405bdc363a10d989a565bf46aa3fe1576de2580747053ca840e5374a0bc1ad01c896fb90a5a1133a20e581b27d4e271aeb0ef7a713c605fe0b8e1d821b6b96797c199b09b412f480fa5162ce5295f4cbaa2c74be1a4b312c961d5048b35509cb0006be505b56b129719bd2c8a66d76922f8ca54aba66e4f311230373c72aca00dd63f8bd8befede5203ac4812193f478691b1e23de1edfdcc5b7c42fd784700d3b52120d70dbd7f130e7517795f5451e06ee746ba2a90809747169f24498b4ca64331fc0f4f5b0dea6568292b773caa8d01f76e3a0bd4426d0fa8e8459d3f4f2f4d4e391c86f629b408ee7ce13163f0a823810c62eed089e179d4a8737f7218b5dac38b79cfad5198a637eb0493ed81933fca9adaf046ab27eb018a1b58d28bb3a6dac4459b1587071304910f2f9ea91f65cb0a3dbc7cc4357ec2bab469649631e3cda618ed9f6c3e2751d4694806858660ce2f5406dce9a6d451773827d53b67264f38bc49c5c06e11406c2c34f26c0d362b314890e33d3588e40ec939c8a4acd117495001b184530fca9daa18174d28211f64d46b366f45157cba6683d54e028d9caed95963f0e9c4135760dc3f0d837292a38d00bacef4cda7b0ed7c52b0daebc5bc55dd7da4381b601cff3aea5a5c8c5daf74c11671f9044bf6f316b761aadaffb8523cba0963f8af1272732c65d07fd7d972586a85e739daa5d368f946712a3b6cb2f5fe908e58e57a25c69a518e25db751601701e185fc1383d582bff621c9e31b0e0016b9a54630ae51b863288dc448c332e17102cb79f2b2402ed1498838660e0a4a08f4eacfd363f81cf3275cd93a1f7a87fe6a9d2f0ff2f8b422cc7f09b19d99587d8d0011f002ca017b48e89c27bf4199683dbb95d6026a742cffcc9db1798eeb6edcef6f191e0fcf01e4e3d0e049ee8406d068ba6ae7baf0927b734e563e48f2d42bf6d5f9ebe6cdd95d65b473298e9633c86e2a134fd9ff8034be8836a4b4de46b1170487d5504130a979e2a4ef477e0b09e5ed13a556e813db0ef15f82f68769b800f93c6dbea2755c1416dcfedab1e2cbc6c4b2e5dd3391591dbcd268fc63802e492b344302f8fdce7834b80dd64e74a6d7e1da763b8b35a6c33964ca7742abb5454586dc60a54418df564a436fd34f011ea5f2371d2bb7230ec17507fb052eff41bb5cb07f7203cd43ee2e9218697efa8da41d21d10d922b6b773e148cc8758ab9d9196a220a1a37608d107e5c86d8740142d71ab6d83d82ca52bbe9656ecc3e53e210ba390fdada90eff88696c52c2fd76f1eac6c1dcd75cf57019c9b62a5d51490b565ae9354f2e70d38a84f546696ffa263383736b99951e37acce9be25e7f0f73b9dc37fab5bcf974bbb652bc373d781dc26bdfa04cec38d41eae85c93c15c483934473e931a2b8dcda808e6737b27ee05f537608f2bf991b9665290f8ce718fe2a625789843cd35512b5614ea3da1561320212a64d898862385d6ea27c09e4f6bc8f89c7b678c50b769453331d37cf8bb53d4d827de7799aab0af57dddb751b144950c5445b8b07374c22d840c9c23fc958f4948f1db9176ea845c657043396e417a664b3618e0b688caa828a95262d5204a682cba8ce8d6cfaa03010f8606b3251cc78fbe2240ab6b745a49b81c4eb25c3f5522a54cbf3758b2240409baea45b5c850f381a5c8e3c5e82aa74b9405d0c0409bc27d9949584c7f09b64c5d16db3636a7318e9baa871eb30ceb122dfda4e3038f66ddb811f804934e6ac7d59938784f3c9b1198d0fc6b0eedf65179feadebe8b60b43de33abfac8c241d7c2a69ec461b67f1ab8b11c599faa81a58281f9d9882a9b03f307e333baa5d10abe158b35307e2f63166d674676d1a2eb37802ee804d57a4e946d4a7853970561efd0c4d06bf427354fb8dbccdbd57c3ddd50ff01b331e8549fbc5a47b4d5a002efa0c4649cb3f0dfb66495573dbfbd7b4cef37613040560530197e3c210d303f32a4ab3b83af08d5101d54cce5596faca914dd06a5d08bcbaf2bb8bd737e2de76fe96327699428881f5e32e7c94873949d9fd2cb32cbbcfa640fa9404f344e824cf6b663834e08b6add8f2f2d111f39f07c4f01446fb69d7f12f6a3dd53788939c9d19bdf2519a8e4d20883570b3acba5e2755270ee99a5d93f56c2b9e2328857ef082c413d7e7410b1351f4177ee5cd9f95f6ccd094a920ea44e11c274754cc257c8a8a3a87ec1ea3e5a1e4e63211e41241a045ecef0dd349f4a81f0521aa615e262ee0e4576f915cae0eaec114dca45250186292d88afc9722dd5352ca439da267db8824e27a5489f074eb3465a0c70302fe8d9c717e7603732fcfb26083b86550d69f6e6ee78b902e8e375fab5b26d2d8ad47331ab7827ee9d557e0b25b5492119642a6dd2d5b606c16b06541243f60afd360f7902ad683808dc887290c0235bf4eb0e80e0a35c6f3cad89bb1b5c5085254dbcdc7bbb31e51f854c4e7c50da9b73d79e1225734a99e2afd2ca07e8e0fcaa9b8e458fceb38d5e9ed7d118aafc2918ad84aa118b05bad0101d37c6c7d54bd0446ea41caff863facf77d2d254199ea20669cb02a30ef5d29636ea28798c118555e3a54b9af3879aeef01277c405cb29ed04fc783c09475d37a177dd5e5c95c0080c2401bd8bb00f55db9a4e09fda2da986c6c008528a9e18001521866ac2ea9a7535eb12f4ac2df73467dab54449f86c52ec44ee26fb84b11d3ff54d97702642b13f2438844c8f946019437bee664f331d7b4411b1a0c7b04d942a35e6740610f40dfdc7af96ee46b3c2c6d3d9fe7cc0300a672964897a04f3501a648e97775d185d51f763a36fc5228fbcd62d6c14809cccf260af52928dd2cb92274e2c8d4002685fcf8351c54299e7e3d340753590d2530621f6913395e4c4e6817f16a0ff6c36c7c6a4a54f08c103fed66e5ee7272721c4d5491a413ca4e980c3ba35595703e3bae1a4b2e020a97ad0031fe44e219a99dfde70a7d6a8d0b488fb119cca89e2088b230c700e1e151c9a30fbc1fa1b52261e7317971930cc16996dadb3ff17ab9ae8b3dc11349ca0f8831a646f3ad75fc7c43d7bf54764f975a443d801ed1d69d6e502d69447c5fd2e90e2b895e384eb12a09cb2d52f7e99ef7e2c61239ebf23ac6c8949b384e01ce65d15ebe54eb4d488443885adbf12b281e92e50027f81e1d7ed0896fdd6fda8b9b26f903f1fa0fb2ebe67c32285f05c9d5862cc5cd809176dcf8e0bb282e94acfa5a3d9c59c2aa9fd6f8c01909d08336c0be5c2b641f590a0c8e238410789050076e7f79c48f6ef3605d30e8f6916cc5146f86a08b0fa3fe9b8d5d69f6881fe06577caf5c191ef65438451c0535650f3707147aecee1501a1c3ccc68c1a218eb0c7628c8939145340a7313415b991f3810448663ad269848214be3aa625c00e801adbe1512eed43f043abd2a4992c17147f356d0081009b1821741f0545616a5557c6d867490e77a24940381770832508a043bfcca6364ae6ff573f922b472b84ce26581196ae29d777c231305a8909d46a70ac28a737e27dce20cd34289272755e326273cea4e4a9cb0387923c67fef39a9eef474818aee3297cd689c736c2491d2d9f587b4f9c90f4537eeb68e1c3ccd6ef2d9c5a3acd9b27aaddb671cc2b2811aa8c436808b3a3b50721e93b5aaa4d70cfaeb19614466478673d249cd30796197ce380d5a6198eb2d51e88bc58333de530828cc2be887f0451c1a52bfbf075171fc74df10ab9500e535ceb40ea64694a0c4e9aeb7fb32c0559af90bc13644cba2b02570de0c0bd55d0de73818927337b818b778bb9a4aaa491fb2ef5a5b397491611d05e8d3d2ef0505991b818b28e85f9ae105c6b66ab6eda8726b11387c5cd4abfeaea8fc910101fe168532e601f6490112feb284ee90dae1892131a348ac070f59f22fb3ff3b07b5f269c9426302bc4a2922f229ddf8ac58f914ebb3dbaf3349a3ca36ae02bcb2e74969e5aae5b1eaafecbfe19985b219490263970aa5eb876bdfa4fa5ab5a856c4841733b4a886e89e048230f634402dbc796496e10aff7be1222777e93a416523ac6c36114c953648316885f4409a31f92c1bcf1ec60ae8d2f7414ed8077523c198fbd285e9a3163d50d4e972c301d400b5eb73b5cf03c8dfeddcc9e0781671d8a093f0e45a40d7f5dff7984decc15fb298805b105276a4fb0eb75e36dc20fca75e5f10152f1458cd77ccdcc7605d7bb3c85453723137cc5321830e1a2646a2b7595687f11f64f0227c9f2fc8937e8a218ac0db55da223fa0df40872000d72e6f27be9ccc92e8889c33cde8daddc1864d395eafb200bfa54451e18913eb6306d2d1da4fc4ebfde6bc6941556ce28134a737f46652fc673115bafdf4317bd94bc4aa4938ae234d177a36d3c5eb0e4f2b683ebe4d59358264056270cf6548dac3e1bec19d536d87c041ee9ea2110ef6ec21392a5d32e417a0b12c11563c6bab02ce83264a95aeb4736bdadf130997009cb7faadde51a9d9d48aa10c727c46f7e5b07b96b83d9d93342dbaa8be52b5b3a4ac1e73dbdfb02519a8ce5934c40c57741c8c66b0a2c0024e7520858410c4a5558268af3066e5507918a01fcfc495bcad91b8244d80c381c86af510c6a50c0c20092506fa397999ca074518a42987d67cacbaa2b4e0e40ae1522b9de3cd9d02f7e73999d9ec3e2ac9e6c5a3b0346db6301d3c30d6c8492e1c50c611a263c91a7dfd1a61b7cb1e307fa478a2c3b45518eaab9f6c91407e9d7f41fb76ddc73e8cfc87f9bfefd2773be7b96d6d5b81e7b85a884800b162555081eb6bf2f03bcacdab6e5250ca5eac19134afebc7bdf3bfbdd7294c830046ca55fc91f2f68eeef9ef1ccdb3a365cfefe66ecf597b1efeebec83942155f9ed8f35c1f91ebbbaa9eafe4308be905f1fb19cdaeb76e1b61e93fa5202b2d30a51435c2236c65caf447e982db873651565fcac7ecccbcd2d6e5fd3d6615bcfe19f5c919c7da38bfea1ca2d5f1db0674c330696bbbfd4be4fbc69beef6f3c2aa00e803b2b1d881d989a00b3187909bf6599258cc86be287c5d271581f5e8fac6de11381e55e6401a5ecf53e1973abfcae291b92ae2fdc3919569c9780a640909262b41cc33dc62585bb16ac60b0a9aa57a9ff05858eaa28d8a500e3268ecb8bf79fc8bfd33ca2a4982b61cc9244269100f4412f541ec3c40c2105d3fb68a302f6c8f4aebb40f8c869e0ff8afd53ae14bd5f74174eea2d797aaa84b91e39a0095ee38adf7dd2931b51310071f605ae657d155176bfaed310ce9f8b8931ad5dce2d41f1978263b3803a94d47d7f9ad25739a6fd3f52bc861afb6d5762e92db317f7b08a0fb193ca1c515cdf2f83a6b3d007bb86b11ee91b12a6421763be3c774dfe7ec9f042e62cfb9d4fcd6da52894289b8f1897a2cf08d5d8b53e7457a04f0894d1de6d05a4531ea3625da7bdbd9251a71e6b7314a16163ffb62004b72eb8322d55ad8a3a9b91a5c780017729f6a89943b952cd232837c683b3c1c020b342ea6921f5aab4f87a5a6ffcf1541d81879599a0c0e3dbe98d4dce8564df2910dcd5d491dd12687166de1a43565c79b4278226ab6c61169267302df9a4d7b18d8f8ebdd910f2ed56fbef8b8895c7990991653f72eca3e2f505c975cc0d77a53723bb51a4c3bab093839b061e4e88973c853d1249ca694e75b4d327320a135ea17fb51a110affdd0505ff93e7a2aced341a5cc1d3c04fcdb6bc13e7e59b9985e7a3919a21fef0ca2706b832013bb627782f0cb3cba7791a1c8b03572ef4982cd89d7c8d35fb8147b82ba4af88d0d53e19957ae5fa41347396e55ca80aa4e4dbed40c82f1b5d755cdcb1f4dc6de1f308443ff9f1269439548f4865ec7d762e4963961f6c5a17cb83069e3970cc8cc8c6cf0dad76efc661d79b42b23d82609e227cfb278ad0110ca536bc5f3665d76ebcc5a0f10161058f7a172306baf62a71c0a6fa1a2d8e89e6cf8a8e6da96aea0c121f9a3c90845b71bec1aafeab7dd34928f193744f03f5b883b800dd2a0ca79385ee02e73111159172a510206181ddc313270db4cd90188245a6cfbd4573c165eea1ad64206c38c95b285f2f5e806388b0e1f1ba64320261f1a09afb753bbd74838a54cc8572757cd5b86ae843159bd89db4b0474f8ff6713cc4d65d917be3ea6f357b497a19e3b67b8e9914cc53f50917433c1a08f2e060034b00f407367aea56bbab122da6994ab44585c446d58f5b8e11d8d845ded46b43f288c34978b09255cce1ba9441d1e02de432e2ba46e7799dd4897c3f5fbf06793d4adf1b74dbb711cf2099495e2aa382ed29b1da8528d38521b7de8a6835e991cbb60911b89568c1b0a6efdbe0a5871b9e73fcf90e1980c9a7fa31d9f41b52897fda9b96d9ec5f3592864089a52d473d5726fb9a39ba408626a42ee3695774907e1a004823f0d7e7e45f82c7e1e9d4b1c9372462018455cae340b5b45c76a817b8e2307261a140a2e492e99003d02abbb4d06d22d3e6a3d770fbb1a9330221de5800868b2086d030feb7e530b025d17f5df7c931443998f2eb99d10ae9d60bbc4bacad5e1b875af1797bd572fb5a7a87c7fcedf96514c82ee6d0421a7992185f3d4564d71ba3b15e04b4abdbd14e60eb5be63d8f146c09820193fd2d03822a504e51c05107133632839d2d14587d919f28362efad61f1a95efa9859be6f3367ba4ff469c2e0583012c97f18b7d55bb64067a8d46136806cd76c43294e406255627ad7dc1c377e8c9628378334f6dd60241b9462baedc5cc571042303cb82205df0a072dd9fbcde460151a009b46feeea6e5fa33a2f32aeab78859a5e6776e2ec6338f1ec25e948fbb6a979f72fe68b567a99b1d417ffd15b395390affea3facc8902e63383cc8324619185b27c40d41463e3ae7921fa1895af2e3575054e2695508a661035b1c14de6ee2a1f5e960d41579d7211501712974a8416809520432fe09f7efc26d38dcb2d4572bae78888d55aa54d93e947c7d52bf0d0d14815991086c8cbbe03e1b9a79992a81bfb0279887f0601df93494639f3b2436f55b2080185de13c5481c1f73e3b166df76e9386e22cfe8a06fef536260b31effeea3bb6e9b4060c1d543f18cf7810196e77cb066ad324c7c22c0fb8be056e4de1b2693fc9346c1d2bd6c774aa2803ce9f25f6db6384a6c09c3f95a7ad087bea14eea1ec59b5641c3add4ff8fbc034234f426cc2ed1132a4ebd7125c92092bf05e0182d1e7e129b1b619c173dc272b5672e56d1a7b4f3ae47948ad38a9255563f7dff4b87a1d9fcb52a6bd7eaa9ab716d74da66516f67825fd6b1b5daa8131db746548059d7c9659748f8b121a736e8b418a7ebd3bcc4f12c11157a127b92bbed927bdc30c9ab6213b1960f6cf09430f8f888a5ef00ea4296c2440ef051dfdd668477a20cc3913fe1e6e3373324ac11e20ad2a1b8ce4883a544dcf59d3d6d0c2a73333523a9f57263919fab62ae3281547762157e1f709d6d3d6fc019258fce3759fc28ad7222d0352130ded97e494c52988d2d6eb59f28cc604e059d3ca10171dd3086291b465d79275597896382ab0c771b98ed35aa280beb4d32878e938b54553e47f51ed86f22eeded670f8474a5dff10a96facefcd1914a44061bc9613f3167298f5c0efaf7a3a8196f5ce8f160f27775b83dc304aac97a0072ef9eaa0fe8db70c02f2d78921b07acd49958f6a8b71bd391f8300d81079eb982f8f229614a860dd776e5bbcca3242cea3c5e52d10a87cc5097f9a26bb9c81b27ce6b6fbdd583b919c9ee89c031139f119be807fa34be8aedef6eb101dc62d3b526bb510195b8b457a4c6987b47159d179d588fbc2a1a8bb984066eddc2fc94f2c53f4cfbb483fcbbf7cf777c80a23d1f30c24e10dd9fcb8401ae6e1494e5fa18b90939e6a90aa8c3e618350889bb0b9b907da82e4beb109f30eb8c94e328c5ade1a658172c693ab4888a5470c59f22f953482ba2fd07adb5a46df8f91910cba34dc1fdadc1271edd8827af5e6090d63f958216d48570d4b4cc12ddf5d1200cb24e3a449f4b1c38dcc8105c83c8433179e979d7ac6c59134170b37c42593838513c5c05254d9127105840cb749c39a22b3e5b0080acbf5e2c5b81e80744336f4dcc4aebbedd5274b90ebbe3396fb3113897949b8bd3ea17b74d30a458fe147cbe53b87740c49ecace13cc3a679f21479fb2d136487a619fc438741f186ae496948a88e861076d581625554d5fb4dddff9269811bcd58b1b92644ef97e83a61b8a48f79a14b435a51fcd44b39ae3fe94f9f8fc706fe7960c3f96d55971f3e35d3bd9f86f7f811b47a73b5d1904e03249fbe99f762be1679807bf507e9e1b8e57a1d56c7322ebce97ce8e2e938c042d261b454a498156ba0442ad80d00bb5e514e30ba50da063793acf5299e9a7ebadcd40573bbb1bd68c54851c5192c8e67efc992cb85b451b5a520725da699828f0ae21f6b197a09621c12bca34be9a8e3933dbadc589306564b22bc2e867487bfd840b188b2c2b1eaf600a67f5beaff2d1b83eb798e4db8d1fe57ded3554365f52010816948eec7a61ed7a47a39f3db46ec0cbbf49214fa101a877c039598ea0f1c2940313ffe92cb78e1546a68877f6be960d4ff08c114b9ae1cf7e565ccac103094e58b85cffc7455eab53015e809f2d3ad95b0cde27b0952e766a62f99edd0d069f16ce05ceb3921b32886e2c55949c9e0a4e68aed79ebc883579d3172ee32858c73365bfd9bfea2907180471162bedd4dbe82bdb42b5c90814c1734e42cb4a683ebd094852ec0bface78999ae44611e18c15e6c349910f753c1eb078ff16f5e2a65bb4bc924200b621f7b877169df30003dc4a20788cae6221f50b6b4167752234c9ef64ee7c2490e9521f9248b28f2effbb806f8b1c4f83801593225f3fabba095e18472eb72b04ea9da9a6e262d25c76061503ef7db222538d0fa84e9caee1a005cf4fc6b4b26614c81249ffde3955be3108cbad3acbff358c4f76682635dd4284055d7cd74c506570f94a9efc2d090dee520171b225b98b39f3b20c992c8df9e4ba5b5c834b530815520becc61d6fa83658978087f0b26858208555ad9f268e48daf8fb463f215ca9c49a68c9612db7156b08b07eccb4a907468adeed4ffc006217ffa50630cbf9c4d9a3897e6864e3e99997407f1a57d9de8228ede138b29d2958e17e18471e7138ddff3a2b86c21e69dd45cdc94414a2dab30cb2703b8556fd6f3e70ba851c8acc622f0deebde5d087b895f64007c152d7987d2eeba49a044d4849aed1c756d59c736c0c3a096384354c9effab943020cf535a7889d5911811ca16fe26d602ad5a9185436ceca847627e19495144f9c040df87cfd758457b44951e2e0e640f032d323024acab208e2f3a6fa5400e390ee6eac23c5437203ab501ff17aabcadb329f55ac1de86457cb567a10efc265e43b8ff10b0799ff045fcdb7a42572cddd8ab4a9c7827472cee65e99066824b52b42df6708c13628d65bf19b17ce2fd620420c5fab5a028c7510e5b052619d1ae376117c3823b158af66106879c6b9b6ab121fad7a212bcb96a644a4f3d9e646c38e56f5a9cfda294aca518d91a7000aa5312ddf86078e2fe88cd36003d460f0aad718d46dd76afb1a712d2c6d347ffc77d248be336440ab10be5180d951ee9b21c658b83c00af18d6304acb780fd48cc56d7a0732ec9da7277100fd7d86db8154b63a3b5dbfbfd9784f9d8fbfa26c3efc5ae8ff66ad0f65e5cbe1902a16f48e707cc9a072bde8a1412cc9b5b834c8d08bf69bc6c61e3fd74d3b9ba1be524c364f3ba9dcc3d14d764d415f80e94defdec67460e2237e09d3654a4348912d8c3ea99aeed2e3af50a090ac86851eb3641ac983d28641417fa756fa496437fdcd7d04717d899f0e49c68f4913f68614ab57618813d82722bacba2a0b2a3349dd8e14d3d1ebb6a566071d8556b1319e25e814cb739e5c03682666d4c20553f038645e4812542cf3079413a88fbb5a9ec5d3009b30e56d0664590eb52942f00aad556b6411f42593eb5f59a9c2177f3d28431cd1136395da074a0aff7b98aaa5a804268c9eb17373a8a81b4cc45f6d0a35eb7c1d21ba09c31a6b7280bb5f612f5596540ebe58fe0231d0d77c142804d59422b836104f7e0a56bbc47258bcdc6ac2c394cf9286ea07a2e9b2c10e050d8badaebdab38344ca4a687f25146aa9f58923b359205a403d503b1b2d07690cfd6cf5b671b0880179e4ea3f2794fa05e2a44a500dc574b1ae0462048e1860968ffc10886394e1ec3673ffffbb3273f9401629be4f476abaec54a0e9904ffd1b3f5f7fb79de2ba3e821a5c9223257fa89050f82ba6ae807a714ab7aa24ee86819a3d173e0a901566054b9b8519a68cff2763b9a5599b98153d8f4416f1d9daa938836cd232dac659815dbc67f7faed3ef8f123102359e3e586ac95a8bed1684d1cb24a2b83b4af35433d0b1c0a438d9137e0047e14e636c7743c81c00c7a9a2a60674159fa5fded2af3948cfd5b5c4e701798af03b346ff60921eccc6a2f29a9f17d1829ae02b34c911825b91e8026d08a3706e3e829ea6604018e8031ad32f36ebea10558d3ec0875be3ac90b667baa48f390ca42fba1dff05fc80e88c4dc1f2282f91f41a58089a1920e6fd60751aca2a214deaa1d1774822b8011658ff282fda630a8f486f94d31b201aa779d97c8e43b8c58768de4d1b5803254749db9a35e9553355ff5a2a37cf2f8fe61a46b941f30f9456d2ad64793cecd9009223f8fd0a66940cee1045c835c4c5868ee5da5a9d4c13b45f657be97542ea7f4ab39b408d4d51a2ad2fa583ad94cc2f6e2b1a8cfc27e824e403273929b53d62acf20d10df16dac8b4859d8861f9d3d87eddb85d356c98914a116d910fea39e00fa46f0c29fffd32646b956d64e48a317486373abc1ca1a73496c1bb6f54a269e999883ed5b6d68130039d3972fab0c245fd5de9dcfb2c4138fd850c3825b6d3c4a0c8bc3c9f3e74df9113f7bc611a2f22d0794711f272fd42cf6d9bba9c92574822d4b8eddea2d05b36070e451aad887efdba63dafb47e68930e27cc6432e9a9fc5aaa87de3ccbad9cf88677df4d40a66b72e37208a982867251cee4f4bbc73a24eeba30d31674420359d657626b8674f5e7b5c516a6af51a70bcd91f7d0e148ec8a94f561ea77471a3ab7e7415be788fd58524137b518c9df4c1fb9f9d528ade33eb6d00cfce4b07a1860a70f170e468c92c9864cb855720f7d73b6fda28fd9f8ac1c93da7c5faff8c9ca3ed396433deffba6c5593c0178ff859e7a928a657cca9460f6d62478c80ef8bea67c4e427fceec253dbd518569327ca1b95b2839075b4792520441c7b6934e5e05766ce61209672482fe1e41ee51291ee7b35f0dd1c4b3a3f270856fb5ffa9bf230b069413850b810ca53f2bd77897049115b1b091a61d2c2e07fdb771729895ba7c874b43122769f46340ebcbf61574327e5be6335d66b273da02e3969085a75f09f75b5c79dbc5d41d7914adc3da4c840444edda24a287adc3934fb3b1de927eade5bd4940dea180e3720f8a1cfb70a8b07429a27b59e9bc6c415f31ca6664f664be5a05e93c3b205633d659c1bb64daccbabfaee67f8adef7bf0d6f40320193897a1d3782442d5f8aa99680af63f2a43081c8ba23dae5f86e07a2d10643cf8e7fc549c82e17a4c427a683cf21d44c74b508efc6151f17e36d67f0cd734466bda0ae27f70ccc2a66e7501719f9a8adf21eeb2bd0126c9122af1f178e9d7bd943c012efc01fcf6bae57a0ed1d9cf5bfab8de5e2a895f17d22edc567ffa70d5ac0f9e28577f8e78599d9dc9c5c761428ac2fa0a3d7965c41d1d816ed2e69e4caa2f159baac300c614fd09eaf2c84fc09ababf6c4834c5c9122b337628320e3dfdf38906c61561c51935b2ae8f625220beeb5bdb77b5db2a7950b73499c2b32b638b72214276b28b3ce6f7b47b7434a5c6d63c0264c14351b2216d295458e93e617de5852a6404afb6a3e670f75cc8557e90a2ec988843eb865d00d9686001abb408c2b87953d0ade9a742b20e92a74e08efa88ef1cd50d73aa0d5fc834ea3013c8b0902e5f8bb0b4cbaef70f4439acecdcbf00cbe8b1ffa5279e65835de38d6384968180c6aea36c955deac073c512c803ab064155512fb8ace0a218d9c08205a125fc3e602f1db3138665abe0814bd44a1dc7c096ae8fdfa85e276c712384df7c6fc2f9293dde8f437fa12bcdb53e017046b729eb4922b7aad6b5e7eb03bd548396e289ca14feab394f900c698297a3e2111a550be73aa2a2711880854bc35e061d653340c3788d7748c213fb213caca527bff0e40d9094f24267c95bfd560210096440407dc7b8f1cfdbbb9f3d45921c2c0820c48a8c3a784eb394d68f42406d424febe72aa891cc89020097a6cb3de72c6da76625e4b9087e855810e300362b90328d21a01dfb245f158e4245f038882f198f7cd460fec3374df8b9c9951b5eebe907e75846a2e696d9bab9cdaebfa571e769f5c052c8582f42356496e0fe30679b2f520220dd96413bbc37ddea441ac2483ca9fc279944bd398dedf4d1492c1463841aaff5dae0c4cae78a2552acc35f3e449fedbec8f31b20250bacb1fc2e9437c3ec1606b30b6cf5d4daf08a8d8b555d68c9665d49198cbebaf1b3c6fc6d040684b2fa64a1584eb02d2cd5a8bedda87e6b6edf82a8a8133645d740dee7db4ea26c31427093fcaf3e6b97ddb38652c3380674a34ed90874fae1af92bc2eb93e7715903300a291045f4cca31f082ed3c059f95f3f1393affdaf441a90a3fddca9cc6b5473941b1f97e13ff413e434ff570f865724d816f042ebb1a62092a01f579c33d9b8db2e141611988dc7c7a6e82c4c9beb5e507cc5cd9e775ab6b7f1b3b921825a8908b16cc250e932972f4e4cbffc79c36ebb1b7469718003ca6f94717fe91fd0bfe4b1687855c70d1308241a5f61c71c6ca864f8349530a344204af378b63a3f5e431cc5d79960adc0dd7e7ac3f341f80c76debf738a2cb40516bdac919b8ad5dfc901854de4a28ac5cebe90dcd4460581829ec1e678aa13819c72bd03781588e598ddb7e9b0d5e743f9f93f3ce4ffef0ffb2483d46840bc9a63838c63d3d50590424efc1cafefc2bf1a8764f3ba2f87037a93c87e477f282eea4c406105ee7fa97b3c2395211239c0d6b66c0acfd3fd9aea0dc9a2143ba8ca13c6a7fec059a5604c101f9b010fd7422aa06c3685ebfe3e5b3b64e4aa097a64c30bcf10ed1484991fe1c88a7a50e62a1eaf06a2b1e1033db9c9fc5796c9d06b9538719633a76bad093a7c2636725d3a15bcdaf0fdd44bd1596effb2b599463e8fc5820ff54c0364a2e5db470724b373104f301c2d6bf6586b097196ec08c1a839904b265d0dba4f6925d7a7b1b2b11caa0709d6f57cce1ef9194f4f395efc3a9fdb9309eb50b0a0ab3afcc6b8a22bb1da5c3de00dbb453fe76910dc36a108673e872bc862f56c0be4d2e93f3d68aeeea19a4baeeb6f7ea9c868dda7d6b28c4c29765a434e8c9c312243a86fd41583208c39dd33945eb427d23e0f2dcc4a68429c86cc627796800bbb61f45f4d64e6a0fb9beec8e58ee7caee8ad232d3a438dd6370e3f3a8d398660172e8498da7586ca0471be727106a9eda2d8802d611917789cb3922467485d5d07b9ce2abdd5dc653bc9adeb723ab97e051974106868b3597ec584b38ab44ba98f0a957006b99ffae394b9d971cfed6d081498583a94967e1561ef4af8a90736ecad65de54049113d1e4537056003a47988662559907fd85e77e3ca4e52446ca6365fc354ddccd6be274aceeba71d73841c7212558c5424fc946c8e008594e26a540bcc32d4c7b5e7b2975d3843e1020b8ff44ef08d12e4dcc13e8a43e914b5e16e4effd2a10594b1f4a96d55c89178baaeda3d4582d6b3bc0ca4ae1da25d4f1b908c98a6e5e685e3772798be2b0b640fa1859f3b7741f2a25fa379fdbb3955db5376644c3bdef45ec52316080ecc2d866af966ab183685df83d4722f5d8a1edc39054d58670b04de95177d76becf90db92cddc8dc6b00f1f9d6944895f04dd6c0beef6a0ba4dbef1cd71876cf0695931ac955a7d2ce8d747d6cdb7e74493cb780fa65605a6ddf096a6b404f6b6242f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e42f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e746bedc1463cbdb2c1b151027d107888a93bccf4cde8b0ded8da4e956bf73bb583aa1fe8318a2e0c5e7514c38dd2a4ab27dacb12ff26d474d0884ec53c5ce2c522787c5044b273fd68e862eb33d56d662533e6a41d219445d9168354d71582a40e243274cb946c875b60ef27885b72cf0bd5791497f82eff21e902fecca2fe56ecb13535a09f1fd8ae298511a96a14a2ca896ded75c973e09605227ca1ec038acb1aba127ac820b5a7ef26fca6e34de58d4ef24ade9c413aa6a73ca06d26cc8bc0c26598b382e0c914f624253d20ee0b45f845b79ea8f47d1dcb18876898e98b15638986e30c0975af6ab2ff62575dad258ab14f75c3f7068c2117863e67b1832fdc1506968b7fdac79bb838f911dee5c20be68ae274d9f83d8d4c8e7493d6aadf6b7de41058bebc10f0ad0b5adf429625ebdac77a649b8a1aff6e92ee0976aa4c0d654eaa6ce0021883ebc2d8064eb0286c3a55e0ac5bee5540134aa8ec38323d6261da50d586bbafb457b85b8b141b7ec5e19133ac1d0aecef686574e2d292a17e00bd9d2b3ee7653bc55b6893ee86239fc25173bf138995b960a8d5e478a8e4d2d5de2dbe8f4e9f890c7ba78a3382b9b9f8b845551d3b1e2810d5c70021b9e78b75089f83408baab2e1927f8e2c6c311ccc84f32d61ed001d2f4fceb883a2b785f0781490b69011f769663e63e90f9bdebafab81133e3ae7d2a88983f8aa9b040c13b9e54acb907e6aaa668119d8b86b880af40c722358cc6ecf9e545d7b0a67d2c626e3c46e8505cb07ac740c6c38fb55964cf9f37194c91649812ed22a4ac1dc2b3210ef58b3ff49459edbf98e469d24ad4d893fd9f762e48c66bce2557fbf06c1ea07735d49672809e074afcb998a65fb579371de9c5e286e0263d00b9abc68675747b61157a92abaa6e5110169fb30f0ea3bd9118e34c58cebcb784ac0efbde1ec9ae5422776b3eee9031ce6a695f43e701e549a6f04e6c6ab2745c788434abdc1659cedb7fe597959b096ca23b6811ec8588af99572e9d9dfd04d8c2f8d5ebb2dc9b246f80db36624357472a0c8edff9fe0ac45e3eb88b4b4769818d7dd614385bf90c52dc5dbad475c6c0a70b9b6b152889ce08ae88423f2833009f0563ecf3612587092cbdc753f340a5851d22137e908bc9ade1e9081cac13f8dc18ac7e0eb86b20c129246ce490dfb7d97ae066cffd68f5e32c012dae93e39e9761513d8f64d558d1b904ee2ee198cb5a31d0faeecf1797d615d63befeee7643dece90d562f50fdd808c104bb79773e93271213770e145a56b653093c5c72ea41bcf2e73418b0ae9099f1048a20d9a541130691c8af3969e5686d90f4eaa1108ff7f5461acedf87f8cd0dde50a33330f390178c8b000f1a84ecedef4dfc6f806eaf75adf2968ac615df010aa027f1ca967479bef7137d68bdfa28c80701449393496653a9b60008b93fa31a33bccecc69bf2c9eee72b80d7f078c2ef629a39bb4520ad0420beb681f956e5551d3e0a5dcd75dd5e16ad9c0f4b56f3e9e9779b2f6cb43e9130d160a6ce8b66bb3fbe7b6b330f1085ed2578aa4dfcd8c665d4ea9a8231188c63163942a1630e55a2751159250f4ea9454779eb3d46a3b52850dc299414d9c1624a5403980e43c3d30f772bd6d78bf00ee7cdde5d1784780a1828cc32e38831607820ad5a89a29a87ca2ab99d6cd2fc61be74394a76df647ec0385c047b00fed469ecf9f8971bdbd2dcdec585cf85e18f118f6025b0258da6fc21db0b53ad4a15c5e1340daec9c9649a2ce7a6e2aa3d202307be6a1da7b6c7404a434866bf24225f99d0842b51cf5e0b6f08d5a03aaece376e16f387479a88019cbe1747da2f300a1be882f3111b6d1fb9cbdfae5b2d9ef8429b31378eeed06bdd5b9afcf7c2fac79d48cdfd5e9dd6cbf284e55cf3ef8e22b5f63b0d2bad664026aacac41ed8f1c9e6ce02f96bfe496117eabc1190b38ca980d7cdd20c5277e14b40eb30027f548b9d0ffb7e0778eea5a1f9766bcf85c00bd8ff669ea7a616cd0f4aa5113822935bf845be423e819403c9cb27be889f11f2a1297d7efbfa4bd021824c8dfd9ac2806c478e59e5c9a7dc7948de39862e62eae3874ba478c57c269a5278b2eed9278d2de68443ef44fba7d8ae68cfd66f52a42b7e444365e37dc57ef98f613daa942a5a9ea4e2480380168c27f7a96babdfa7f039764a259c4769a3f5560d0f8aa825354feead38ff1c376388cba5fe6f4860be9e44cb40392ec6d88da655f33373e60c97d9fc44b968492b603edd7392dda35d6d18b7589da78112e820c7dab3b1e208de2614d058546de4526dea593bfe70dc3bd15b3fdd4d897793902116e88e9b9a56e48d1f8bf57b9cdb109fb015592de63bec01423aa1a52b7f967836272b275b0c411896f88323720513bfef363281293be99b87859ae78d6843ded2160823ba4647653ad54ffe1015f1e012224a6d9143d360b918949e4c879d42413d361186e5c1fc838aee61d6a8876e0515b4e7be69adbe290e6087a1d55f2b27e418d43a4e0dda48be2b0fe79ef605c1991d78693ece080080be68922b15870413a7d27dad591deb4bdd64feb66ff9ea9c8fd454048310b57db36a3e60f2cd8c1e7ff4b277861bf75c0dbd7a58975a8958f80958fb96c126a430ad29242c5009b704f71bdfe4a26103ebea98a7377a77c93e8e8bb8c1799d8b97ec69dae82fa5427101c86f02e8987666d128e59a6228d6aad804c1df1d00cba5abb1c86c26bf7ffff06ee387cb1589eda22468bf56af7208f185e89a86039f2a776271098d94ad4eaebc82a10b1ac86e1a866ea74abb4349081462ea8d551f4834fbcaf347abaffe3af50a3827f6894dd3297a95adbdd4404f74bea25bc1c8a5495a680625196d8088a0a03d702cfcf9d7819aac7e85f9a7e61b99085203c4cdce282bac2d488faeb29b2cb274c86c0bf0fc770e8c85ba17330a67382363fb3152e6cb9b18831dd4bce2b80c67c7af3caed97a05c9d868017dfa1659b01e60f908029da4d3120d875dd907e2ddf07d6137754b165ddb063169c8d3e65ccbdb6719b6bdbca62f2e5746d2c1e040ed84d739aee242726b817e3e8b8b4ea9ecf35a8bb2da38287da1ec4f1d312ca5767fcf9102b23cee037f715aa442237b4d7e43bcd93b7b80a47d7489a8dfe8fedfae19380f5823686c750b47e938991e64233bfbf051a3ee0490f16740f8bbb89cd19fa83975326d236a067563a78ce707d0f4f5ee8a9dfbdc660295669dedcccc275fbc2cafe08190d90c3188cd82f22367c3e7c7bc393031279f39a826020cc62e8e5e2e9b5527b61d7cc30b594a9dd87342fe0e22e5f9ba165d7c5d13310d1fbde6f2165ccac898771b87c64f7572fa43718d10b95b25ebe946c4ea87a427676b21c7eb9ce7b766b22e6c7344de5254b1dc3d8cf87624a21138fb8ea04109f4a18f55dd1aab315f0a1066297a2e2faf54de860e8bf28f15d6f09ea6d23668ff7fcbec43fa8c225dc3ab2eee481df1688048852c8a011da21c750dd3c6c1c4359a2fbbbe02b647ba88ea8e11908f59cc8d71ca843131ee9a1f3f870b2a85506d36d233cac88696bdaba3e806f9a90973f10c0e5c58fcef79f07e612fbade1c56035695ded17d5bb7df8eec9a0938967eeb5c9f94faed4dffd5fe7df1bc19a52daabe2428f7831f8663be421b8897b68fcc1cd6664b09448136b73dceaf95d0bf7c0878384a1e2c882b104c0583eb211de6441b362f062981baf12e9758fe045d8c26cf2bd7c595b4e95300d9220e0d9b8ee6463bbafb730d3704d8a4e3ffb0edbcf8da5e5a89a6cc19f3d926d8d13f79986c80f2f34c03eb6f042bd2a46c731c65f09bb23a7e1e37b4dcaf7e1095805b5927796413544b48c2e9ec105ab123dba2a31625ca3747a2342924b8e85fd9d6e047fa0178ef77b0869ef7f988a2f6b457a6ab53cec0972b6d990a8f9809b2bae33efd6e20c199cec82f8b7b31ca6c508078d2d81993b1b48c3c15ce9843c5c961bfd5bbef07f64d28b450302fa4ae4377bada1593797bae251ea9f47ef3ae31ba99e3109810d4e1705fe68121151e8df4152536f9b64cabe937e1bf7f7e89243ee7ccfad9451802782dc5b58293e85f970aadf978c485537899dcf45120441b5a4a9e5ab1cc3400aeef1a10da996ba96bbef8d7eeb0c42da89a37bf5002702a0f8dedd53a13cbd97d22bb1f375f9731f5ec45384093baf7c78266bb941648a60680edb1f87522b5a5d9b13288f22663dbd804de58f5cdcfddec98b85d73da99a9a612e8243cb56dda4753874ddb23fee1d72b6e65ad4dfc7ad5d60cbef195126cdee3f00b31b5db8d2fbf90358cab8ed097756ce72df48a7deb2d1cd70d6254cedd36867be36c82a2796a8961d155cb4c5b7fb0fb38657a54e326001a4d762cb5ebdb1c0149065c0ba20d1417d76e71757e6535223244f0919c324ae34791b29ccc0da50a375015124bc18b4bab11cbe89be3d7a81d07998a084f3a4d9b3d25e1a19b996f3cce665a3bbbdfbb7bd601ea7de5050b4340786f5401a692d3ca636c14aca51fae9a26aff6cecc08a6be677bf77b3a93ef805afc79e8c525996e5e0e7c80acfa8923d4c6cbbfe6cbfed769ab28ecd6603a3e097631fdb0acaa4f9dbbca5f3eeb0f354343c3e1c96abb36e169ec4641a993e0388c7db025d7103d388a110bee886a704a0a38b4069e75c45fce5c7e7fa71a599ff488612d2445617d86c7e01468e9e80ce207a27dbbb23c899263eb2f4fa02d3fbf8b2652bde5da7d8b665e0acd81d137887275328d85c5bae0d04e90dae9630760e2bed828fb9e164b430911a60f5394fa9330422511c5df0d6fd65a42746fdb5b82218912fed75910e00a6f0b1975c6a0c1eb458f77b43e29936e533a91e1965ad60ff7947b7e6370a6eadc1897d68e933804d35d2a73b4e4179429fb387b1d5ebe7400a3c5913ca75d8dc5d370184d90500332703825e297ac1f192e164522da47b566cb4135cb1782416e08518e07a2f41e4d98f33f00337b59b3dfa3fe62b38668681e0c05e9eefead43e347e59e2364b0c92e74685493191a84a88cc421467de66b2b48d396e37e77df20bdf73e06d9a3d7b966d913dce9d6e9b24c10e95384518b64ade2d339cf74030a30633d221c047e80fa90be54763f5195d32e837996d05e0649a4dc2397a98b068d7613bb13b34fa12c5e1e093e4d9b1af72e087525e2ccf1350cbd02c0a781c41d13bbc2bc4bfe1f25757e210909a1de258d95ae47f775f9350522bf429c14690059b160b41695b6e8d257f9f4c67cf30365d07f55e5f9d99c41785dafcb79310ba10ce76e589487e1443ab521ba11fa11a837b9dc138350d402762bdfe034caafccee774c64ad441ee014040455cdd5de5ea20a244fcd6178a7ce55d0a0bc4ae06c36c2b356b8a714ebfc84306ef572dd10e50a32d0f64080e23922339503a0f8924c960408060e713b00b4e423e0b98e17b5f035b192ad818ef34704b47f596a2495568b3764f077263fd61d64dfdefac5235271999f2139ff21a028c2c6fb582f1b5b69ad78d9045f6e3c09752fd4260349d65c24d59d1c1e1b2702d7face6ffc470c5b5d91ad5af2127f4277837992c97f7f17e110ff2fc4b44e8011df0febedd5c1266dc81ca4ee46d235b49e1d01e8f7d68e3eb3ec6ae22a3ed61ccf0a48f260c99a66d16623d2a0867045f3fbd3b58ffe61d8615f0739db49208cc96991fd7e37068398fc76550cef68163f688ac869d19391710cd3dcc0ee71fe1cd4858b160b1dcb7392e9ad5fb3b1046e9de59e72340502d8a1258e50138c170e7936c01a2c358d9cb0101fcb70d7c5617431af577d4b869a4627ac0a49bd4d5b2a7bf3fa71e085a76d50085657bbb3ceaaa6f4763703c110016d02c0c20ec06085c7737f815f222de9084219056835796f69d5d3498e87c3ac623ae5cfddc69e185a9fa223b1eb336e32c5ce3d0153d5f2aeea046d4929adfb20d8d7ffb10c14fbdddaad394150d03746220f44a71d27eb6ffac38b25169e9cad5cebcae6b4e8f646ce6ac23790cfd1df8c8c7cf4b9b6a89a93356ef511236bb09d1df3f0c4d56822aaeaefbf56900bf0f7bc0ce8db12b43be231edbddb5f1b4e6375dda5b231887184f7f2d6bf6b69b38bd70f1ede27d95dcff01269b4420d434d739147115339bed7c8067e9a0805fb7ef84bf65dcac42ca463468aa8c438cd0574227367d728f066159f96f3110d50f46986e04db200e21cbc00ab4400f2268cd9209dca0e7b92c8fb935e81794436e9bc3ed90bb43a709aacabbee25986eaaa8526f852ab09634260f99c72cf492ae193c2385808846134048e774a27013580005fee33555a6af6d31fcd97684ca16bbd441f1b03f65cea4202a718fc3436400500aeda56f13a020c513d88c57e36544ddfb3b51e28f598429cc942411c34a13623194d3afc486fd938b6660836df3f173682dc5547545e41f8ba86426df2b70308aa5518a8bce9a1d00917b9f0623cc966c26b362c7a8f6d5a980f155134dc0354850325e2f145ce80952d329b3adab53ee0b2128a431e9e56e229a829f0bd657613f8b32b6fac97a94b9d3651f84a3b699bc97eaa5696cc6f897a845b163d95079c562c987dcc7b69e4db46d03e578ffb8a61c16c9632a417e95db8d2ad03196d719c5d47c271ea847625a2dbbff1805d6c4dc5da5abafbc210dbe39f4ba100dcf7ee276bda08f6e9828e102f8652340cb817f42d5cf59d4d42886b37f578f793278a313869d1419fe4244e71e14fa7d82a20790437d3d11969339642be3b67996b3330981f60d520bc47aa80c0f000ed4c625439402a6d8a144448c175d1b396824a8cb0986478920e9f2dd2aaea99dfd3611e4f5fe910321b6652c19d50d1ade267104858a23add0294e613c93abbf65ccf8d98d791105e72bf0101d770de2afb271b36cf3926631acaff70d0bca57c1d10747b025a9438cb48921b0151a9a4f3fcd25a9342c5878a35b743a5adfb0714ab55c610edcb6f82206a32dc5eaacb70563edb4aed0fd58434da07cdbe0fe4791e43b701d3e4cc6587c18e1d03498244d5f3cfa2966588cd6721d8edf66d5ee6f9ea9ad12ae95b0775bef6551446d09c572480383c60c09c9e1d53b5c88edf6f69911955303637e58d9bb28df425257f977738547b79c646bb76e2dc2a2d076ddda1649f78ff878719fb73b7fff2526f65f3d21f1569f1c0a7d2411bc6f2095bceda3a43a23d1d18c287902bb512159d9e9840243f3e11b83aea992b3888a375d014188c4134e4da54b91a981d33483c816d9aef44eb6b426f2e1e53fc95dbd61ada4107e86949b64d95e5b0fe7b48f4cc1abb55be6adcf75137089a4da8099ea8d33b13992a60999142abef64c4ae6797f6daa3568c10d7a7dfe6cad4e92abe75a238bcbd96ab2e69ef6a6c11a62286b70fba061f48bff1e0f173930cb37084e666f934755b5acd17a588c43c4557da60c42bb3e5cc9d9fc997fa1093e847fdc99d791345f2ef583100fbc5b256a011936183bb6218c84d0d055736a8d88d4417029305b5a5f8cf80f18a452e48b49519998900c3d4461db2dfc8dc9e29a53053efdf8ca637fcde2a23c33b8d026ac5ce3d3038da0094b4f310bdc5c930f2d3f4586b6eb7877ba2666c5866d5ab2d50c2c45b2a5d5e91ca332a1557578066226641f1b982244ee21955e989f4968c00952d0af2888deabc64976a17f050ebb5e2bd84a1b09eb3d56aca3ac96c59645605027e6a5be0e24eacbc2f573caa0ec16fec498374c320c8a2ad697b7c1f7a7109d9c612c7f1e0735c5975e77aec0a250b0b3f8c118055f0040ae1fda32db8cd04b4fb5cd7af3fc7f918d5aaaac321bca9c46a8031c1ad256e0e619f75752c618203f3878f517511b8009e3e7e16a8ae5bbfc87f89c90ce9a8e621a7e9f6d8231b310fd0e6e3f37c706034ea1b45cc22a934ac544459c6f1b678e4fdf6ce0298fb8eb92c2ee4adf8098856cff11d7b7c699fdc656bc6007667091e205f92e7dfbf7632be64175425a1cfb47c64a3539495070817c0dcd535d9397ca2b1af241dc0ef3f373a202629136ff3106d06c66717c4cc12bce5b9cdf79b77ee6873c41cdb4f0858ac4d2b2b45e874936d0ef8408ad8378aee6f71c80d66e33724764f11366105f356ba63193775a546911ebe71615ad8622424bb56ba0cea4e505faa00ec254d7926fbb0e72b850c609d55c3c79107c2a055505ded7d604fe60ba839885a0018cfbbdf161edc3ce7663e58cdb47c6d1e7b4894ae3556819471aca0bacb92064e26dc5aabfad0a9bbcff2bd102b778fa873962c011925db987f89c6e19b4b48f98ee30622eda896d81821b8bc098eb0aa0e153de061d04c2b57ede525c25104d96a4019aeb5d0b93bfc57d3cdc97c0c5136755e299bed691112e76c6ebb6313f9d1c71076d9492d5a88d842330e791b8a160743f25c29841ad66cc57cae2313370e154e8790d7c632763e09c13cb69597b0bb25eef374fc8bac79b6bc4a66699ad7fe9e5d1d5066a62482e17c29beb908b9e3c2387bce7400982caa85b9f830be574baf60328a21d6d53af336bcfdf66a8e13c6a1fb6c7c8b785f5c6850110bb1e2f989b8d200bfb49439ff9bbcc22e14f418c857d2e30aaa9101cba0629f9038a79c672b3ed6789315a534774e0bc1579aecccfeb47ba7dc20abbf5c0c0e154086f4b20884c834834b2198b2aea4bf1ab8ca59ab79ccb8333071e02fdf2c5de6af638d617f1af432eb7b4d5846fa4db8bd112f2ca17de1b0acd6c57e1194a55aa29f4c95f4d199ace3165b67c34eebd7d40b6cba0869c82068e720491bd718b2d42a934b07e3668fec95337cf564848983ce01f03a8d2698046b5de2a9bcd16e3ee64df6a2d54b986f152d4bcd4c965e153573670db20c47c8f27c71d7db666a347396918e3489489f92d7e45636516f2018e77ce9361d65857f97f6bea94103d861fdb89c9f57fe36bdea0db8b03e21492bcc92a9047ed000689518cb97a5929bd0d71e59efc56da5b490f4941ee079af4a6a02fdef27cb15c335a4feaa628451204f291b9d4be6110a7db35ffb77ce27734f677fc4afd303e0949dce23c13857835addf9449461b6117af3884296ebe0a90bbc3476aabcbbc6ac0cd89557a6f7e3c0cbf545b2ca0244c302a7880c6d53082433a9a06263cd5f0d1052e8de1b686506c5c5fe4a36cce6e85645fc6be034b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe959cdea44fdd98eb626c403d5490c654341b13a084839e6371d0a3f95c03c2936014c57840513a62e542ac5c88f6baaab95a8755fee194ee75fedb7d1ff531bfbb659df6670778a25ebee835818a5191ac2c8bcb317adfffbe5840b24536e6aeff23e90ddaac45d59c0b53e1cda32a6f6c3d33dac0cff671ebd6dc72fc62102b016101b2589ab6a4ed3f140e932f87b4408907fae3ff81690d1de4f7042a4a8bc57a1eee57c3a993b501cf7ca1719549715fb330cf0b5c9449c05228287d28d1cd19"); +const NEW_CHECKPOINT: [u8; 25157] = hex_literal::hex!("80708a000000000001f2140000000000940aea29cc27e4c0d49ef156e437e8a11c30c80c55c04c08af82a139e1e4153110fab24f024fab4709b5c44d8e2f9b645dabe743b0fb535b9771e856b12ce3a13227d1f3b67e33bdddd0789f7eb0062f5915ac2c47150c767e5fff56552b6107b9095fea6f875454778517648e9e387aaf15cec76acf45e082f7f2fa33fedbb51a7cd7a5a2a85f97028006c832797782803fe2edbe2a3c5e2da51b1359de062de8ea7fa96f24bff84fefd7017d1e1b015b61251ba0f11007c35d6fcbead0b36ab85b4671136af19ceab86204acf823a1a6aacaddd4f9e103df36e00fd61f13baaf4bf467970f36b99c246cd546c11d61a81546818e798e438c59757cfb672f65174b8e7c5bdda7708fd74f385e1a0b14da3a9d19f1976013dd274ecd334876a58da521cf0dc61ab4f0f4efe0729f58fb40875cc752654c38c5731a3c47f255567990a768170e7ef7241593f6ece8ecf999a33c7cb7c5965d7919d6604cb4d757b71509ab9a7d44b740153f96e9ce177641e75e3977f19570e22cf79a7b5ebcf1ade0bd29448068331d4d2821dbeba946558f385a71c7834fde97379a416c1fbd74e858bf53d331b6dd09c20eae6da6f58238add7f888ff9d14e3bab0d76587d6a3263bd7087f862926cbc5d92794e7d74433d4ebd26834f3158f93b676dac18491b58a008c83086d5a313a808bc2ea87cd36093492e74a40037fe038766c6b3feaf98ee84a5fff6c1118ed6cbf98d99ab056ec1874444387337977711324e43cb9dbbf84d328876c5873bc712a83f62de509414565615ce87eb35b720607324a903708b46625788eddd9f83ba177bdefbb23fb35af2e1dbc4c3c70daa3d5d2c732ccb89aa0ca8962d9ced1ea35276b98b2af95aaf853e13b66425de03007cca28a32a948ec463498de1157e76dd6d5dd8356363c171036564cb53dea2c0c2ef4b62f872c577a6a29a8b446e2f145b00b71384b4e1d32a350e57028526c0e4031de67c3739fc815c3cfaed641b8e063608569163dd68aa8ce01e48c36314525016e04668b9df1d741cee60240701418d35992b88fe84fd018580f1d4dccdd58d280512ed0ceaba36480c84259aa3e8f7d602ca9b8f7695b1cd160796d2c1f230ff40fe69dace0e03554b2d496a787bac2a0ba72126973575be2895dc3df5a8fa3873a8a94ab9e92f37a50d9a9573a4b0e24ff55821f674f2fab99c4ece573d635b415f68237827439663ccd7157bd889b2a1af63ed81071ebdfaea91200e5602e4d8759935a333068d46c117d8e7518c0922ec8b3b04408b08d6af43909c3e1823af2ec579b5d860a790f5d21c234a3e13d64d244ed00f46af133c14ba69e113cb1945348ec8263e8fb5481c6768a38b29c75fc6635781ce2949bc08982d4b92bb9816154527903ee9968f27f0e7383fc83a3fba2e1eca9c79194cfffe6e57cdd84ac6094ff45f44e14091ea8d769b8f0f25c60b719c97ee7635835ec401dcaebb060a4eb891594add14fa0be6861f6eafe684618bb55147deff21dcf65c1c8e155e25a84a2a15f1a8e1b9ed26c58dc069028366d2a5fbe8d4d8ec6ea90f0735970b633f371bfcb3cdf700060d1e3a4ae8af0ee14e528dc175931a18020463b5794e9d266ddd356a6d377827a5d5bba702d1a4a9c33be33785175beb893c20d54631a5aa120cfd4fda9b5de8b0ac86e8f86c0fc6598ff80f5f2cb02dce934d17912428f722c0b68c99ca11802fb085e1ffad76cdd15e849095388428851b43a95983bf9c2675bc87cac621f68552533fcbeb19e06b1498d3df4f6e0359b19ec30e6ffc18d27c663a76ad106224e856d40925fc70ef05f8cb888992e3edd3c20b73a8f0648d5d58e04de317de82c4d32144df7b9511d20b44da626ec6588d8158cad2db14ad6940a5af0dd128d6b151acbed1571fa7439f56a73c58e889be548c5bc5b63d85150a3ab4cd859719c384d2994e891cb90ed7378a04e2d36278429b272ca81c55865a364aafa3d5240346989c4db46c50a09ecd2b135c2fcf2a274e58c14bc8ed9f787392879009b2bdc92dc596910012755bbd900ee46c594c8c6e593f6df9baae8787ca17fd44974504c6c94812defe94a878b37c8c9f0d6a188a446a000ab1cccfc0983b476ed8f4d178fa1cea06023cd2e8600c539842877c6ac94f0eec917a2232f88e1bc7069591b40e6a4fe8f604349a33aa6992f5ff11ff73bb9fa676f9d6ab1e08dcb246df59534a2793fe461d8562982022bbafce8b37f1d98d10e151be8b4b95b97fdec144bc2940b1ff407a9da5a5a1a0a8492e572ff9944d0e21abbad71f2b8c5509e7b64bd3123ee3f283959eb4e1b752a3873e827ad6f2d9199d1330dca7a9889f0884cee8ceb61f112a2f4569d73e403409f561d12a85d47f32b50142d3394cbe9997aba834ffbced35a67c0d602eb9933a3eca08d657d0c550b5fa64d4e8d9df44560dad489ea9a822e916e4dc613ad6e8071759cdead340fae99a23318842242285c4eb6a1976e10c527650186dff573b3b02db2697049b708fcc67bab8477480c26f0e6ac4d6089433d3799f34df757fd09e7a6605aecd79aece1aa9a101ff61f2fa9f03fd573a188b18560de6b148327d13dc097f8f4e77ff7f04b58c743294fca2f89f30fb125d449ef3929a811d122e15810f074ccaf290446b0f77698ea3e5c663c2c9539a1637cf167316ffd0b0941e480b05cd88ea11467cb7bbd61458c8d12fa2d1816007dc74f007b17541816689b890ca51e83293647dd7c4ef14a5612dfac38416bb4860c4179e6d76fd5a4afb1ae7f78f88ca43c1731dfd42f3e5b20ddf920ad098b5b5d5832a0e6a599ab1aaeb2294e404ab79b5a7fb1a022b612661712739a32a9d0fdf13179029f3d39c46ea029972a39fe622fb9ae82d8e5959c54a1984e67cd4f60cf36032092f39d6d62728f34220081735c6c064682af870883504b8d9676d7409477d251728b6aee3eaa3467eb491b74dcca7c9c0067e4a36917c7bd8a8c9439892c26d7980b67dbdd334538c95f05438838da906ab327dc99998881c2f1663ebecc8ef1535918169ecc3a64971ef905eec8bfe998837abad2f65e0196168c7b928fee34b0e499bdbd97f8a4c57d1efa1dce03b405900dbf0109b315266c5cf3d0fa2b626cf02217b9621fd8884f03a836bae647acdfe49485ae299894ce11339f6aeb078f28055c730a18097ee708681bb015bbfaf5094fb3d2ec98a1590fc9391742f0e2ed05f33996a49e6ef5687db8be0c7d7de3b700a54b727e5741049f683a008ffa5f2e2f1f83d281ffeed756a7a477207b6f3360168b13f75d39256afa2d357914519ce104af23ccce1f03b91df63584c5acc2c9f67dd20f2913abe56fc4b011d11a9ff1de83497bb4b001a6ace5739088c6e17a356a14f97ce878311745cec46b058d0adeaf7dd0004846a73a6b79efb05139d85594a31078712b6c11983136d50e5895b08e06913477b6443de60c85ca5cab6e2a7ae799161791d78674305082262d010fb84fe9441c6fc66456f4fdf722d1f889fac449cc1563071098d039d2904ff1fe46aa3392109c1f2eb8477ac6fd8f7a71b7335500fe720bb23aa864e2b094a51ed369cd2615ea3b17de97c52b4ace914126ff9ea5b2c7c30d413b6186dbbbe7afb2a102c22d1bf616d7afa20fa9eed6802ce5a165ed6f1d9f1779ab7dcb6dcfe874ff1cf812b71f1b54ad288d53ea16668bb5c9123ecd53f6cd05ca0fae2118939bcf43d4b0de098e72018735b70a2b74f82afa890abb133da2ea87d18d547e29b5e4ec4ec8fd286b503d50cbae947699165d5529a2912efea5a07dbe19240a271aa9a4f161bb024f5aa112c0409d3b919735d50cf00fc5b3c9d1f5a7ed09ac05045c1b23f5e02a82277a792b921ef675e3e318b27bd27ee869dafd25f2690aa8b3fd5040d2985d4b9476ed0b8a6eecf9b0852270ea7288ec92e24184d845d608b81c52dfc0ec242711d443924c3c84148383a862e41ed8ab22fc85ec678edee00f61ac92a28728a2bfe3da566fb5f9dbff2edae13d1edbd3d5fed7dfab1ff85daf789a5c449f17e5c22102d269b648ae75a8a3a9a1bb57b419ccb5331ac7a7deb308d64c1dfe606f120269c7fedfd6f3a3b2d260119903d4269b63543a9349d89e4e20afa050fb87cc91585628456f8ba5dd056f9bc34a81f82d374adf278f3b925dbe0f22e4092984a022109127e694b14368fc2aae1feb00c67cf42b91e2e0501e6b2bee9a8699753ea4f58ca4eb0fb11bd32173fadf098eed0d0348d7fa0a881200faa25f3af847de7a42254214389db4565712c0720e2a5321b56dedd70785ecd3c18071df550a595b460539a153bb414143a7f46c2c78aa766bf2a88e32fb463a51ba8ac7dff808fac5ffd1a9698d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826a4911842526a32087692c3c45960f370b10052c4a8caa3d8872d8821c8f2387b701e0319f913cd0bfcb5a6d38eeef1d2b1c7aeb71e4c6ca0e3e1614795ed746c2dd5bd07de082baf478a8c7fec59e2060ba8c015f289545a25b9f278cb29324782a7b7df647af67dc5ac5f82e144b3162f757fed2150f42c59c1c8644ef7e9efab902907247cf63a1751974f0954274285111345b4e0d0e8553b7fbf0007d614e9a67f5563195b98cb77a3d08ed519c047e8b0660456d512dc1af58ee4a7f12380fd420f44a41c865ef2ee576488b08cb803b4a41cc878304e3434267aafe1668a62ef22c74c6298799dec09bb68dffe920ece825fcf710ca6ed805be2d947319646b850ee40e6f1aadc4aaaed89da8e7585c3a0687ecf2bf2d27a59d67f5db5b8555047a55d7aa87cf2244ccbd82f9f287d4c6fc61aeca969f0c17fc377444feab3b55aa7280ad4debaf8cdaae972a3a60b602b2f0fafea0d2afb55b06e884e02d86d90b433e5f7781fb3d182f792f81b9747f528b1dcde994ac72fdedf066f931ff4a5b05b57775632ec5ea6dc3560a6919ca82348903e5245a4da54aad05aaa9970043fbeeea3250e2e63d4ab0643b6c279e718c44a5dd283e4b1bb6ff876ddd0868b80da00bf872c522bb1e9835c1d8c9861ef5a455ac5c816adf43b5916951235de7ec61c200616a83af6f1cb18665688fcc957a2dd28ad911f1b5b82c96f89fec7f64d17dc115dab08d3878d50a1672feaf6dee4b9bd7101eb26cd67d1a136e9c18c97151730829be4211798241ce7ca15349a23bb0bf10996561e6dfdaec3571a80dbb6b7981a56abcb0abffb110137efdf5d9258f6b35d703312465ae947576be7f8dfef0cfee97b4666e1d8a2f326ddf32ccce7c114a827e65348461e7c2a66ded66fb89c0d95506033f5e9d6cb8a235f7beb2d49c7729d7c536f618ff95801359d44b1dc4fb14dc215e850aa20df734701a21ad89315f25ac620ec7f7a1aaca2deb1beebbcbbacf7c54df5b9ef38e4893e77bd5e285f02ce7b5b0c4477fe46d6b0187a768eb0a33d91b49a331632b28a9e164487e4838f24dba0528f1a722ce5210e343cd531bfcdbcd2936326e0b9881a555ad97bc19eeeb308e8aff73cc2fa8c11b96ae1b8c83fbaf7c5a49554ea71624fdd5ccc377b6af318375f33bf344af84d0240acd68584251e032bc143dd0c2796ae25c48151295c82c7a17d2e5aab9b7ef2d50c9eec62365ca71679a4f5045f5390d96e9018bc88a758c1dd2b4397e617dbd9dfd7cd632f84c1a7eec6ad2d20cc851eda9b3253d96befdc4ef45206ba7b9dbdb2b8a6e69c689c48aea9b126e620db0c588fd5c7e405c4b72d5c03c253a4ac150f7ffdc9cd69e7e606c5eaa8590c7a389ff1ed3de21201f664f01d20992f4747339d3a48524f3686356397881935be9afcc5e16850bb8a40b869c9f03ac7cc49cc02f190cec7b8ff8464d64eb3f374d04dbe8b3d3e0727a2a1850e5c2f7b5a16cdc5ed55592947c8d1dec392e56632946f386bc56d4fa3a09400824508125b48785436c5693f4e99e62e2ec62fcae44a9af8080c0063a6e9bc7e1ba9e377c36b329e77c0abbdcd03df5dbbc069badb9f517fbe06519f90ad6b3f82a4e63d206cb6fbc4f5fa15062be4808a3924269ed1784926abfeb82bfcb8f5f4a305a8a1a99a96d9f68ab8c38e70b5d3ea4ed706ecd7604acd52c60e854469132493e8bc14ec3a1668f974ebb5f2ab65630fb07a8f0a3c8745b122088884c0abba4885f963ea29cfb142f0f0385cc8420bdb1eac2c1a70549883fef1204989e667a710c07f37cebc8e2fd7ddb1a6ae98282bd4e82002857fa92d4458a6c6fb856ec13f83c31a3c6e57552aec15d30017eacd01fa3bcbc90dfcc756eda50c7019bb6f22052e36b64431886143b0636d47d15c69e1f4a40e392abb6d50d0288f34e963e9625fbb416836587d7b8171425e6472442f78941457c76ff131b432dc83cee60245c482f6eaa48812a6345344855dd2916468f9908c6857bc7eb05219fceb609ffa3c4acfc23907fd8185645b614a80f5bed03ee1c723bf9c7324f376f88536a78091de87df89c251c382efc893feb41afd17d02f17891e84defef493806f959e6b7bbf19f44c032a3ab3d79e6cfd4d602a2e00901f46ae10ef8d838495449118e8132dfc420c02be5f37ff72ee95601bccead77901176bc7ba0e2b8ff0e7eb66adccdfd7e123dafc93ac2aa0bd38e21b92fc609ddaf17b6ef8c02f26fdc8122a4c2a4b906e29429260c69800fe6b0b2193ad49f851c7130c9aac7196b9122df4024578f5cf8ec999a22f5569b254abfbdf552341c4b35c1a9955284d77d1d561b9a407e4ba227b760e88ddd4a93dfd6a5df8f3178931bec5690e826509e20725c79dcfb9d134bb8159b98bf1c976cf0e708a5da90fff176dd889d75f559f59bac3a07229c2fcd87b52a8c29a5e471d48c30a8e662c88a867fdbb26f57f88e428522391c5ab960a698c9357613c4efaa3c8c902eca73073f943434ba236135f38d8da35af0edfc90c09e7179ad38ef18b73365e38df872a3c2b8fbc6800f1dfbe8f3a2bafe36ec315777bb74c145844696cf877317ca4fd9ced86098dff5d5a0d9925b718e256ce2a63a7e450c7abc7da24a9d2e2ac169a3825129f84cb4b9dd5f42d5ff05f63ceb0142be4ffa432b6ea8d80006fd6a2f2e0b0b186f9a9eedc64d6ab1942252514fbaa6346d9180d6691494f37f4b6aeea118666f9c784b8cea8ef906e394ad4733f3bb2449504438740fa8fd10a97cd287bf86ddaf050bfef118c3da4dda7b0d16555378cc34c306608bb502844c2673ed4808c2d751dc21da4a48d48c095510d5a1330e48043cb1486f14af2b4f8659384219c6983d8254655079b991b185a01178eb81c29da857c604d4fff201ac94f13e4b9081bd9838eabc7e2dd078dbe84dc14ea767b32d96c9c9ebc0a6bd21ebc32b483ddec6cb85671acfa9f5487ebb7e6c589f3af4063244a785cefd3ae8584c50aba91c6fa1721f02b6ee230b17795c5c998431f8e088d2fffe1c5ea154403b82268b5df336a7f1823e96eb56b88314ee100f719d842760a0bc1ea47394ef4b1dea737a583a913b68aee961890e157471e0b39a0b1828ca4fef21af330c3c57e00b135075e845feb34589acd63ab1f6cada1252c9e0594180f0bd9b9a3465191758a151b7ec9091901d3d80136ca72ad88aaa3dbe110e7078efcb9c165408c4a73a11bcc80ae53a80b035d4018640a8e53b8e374b3f746df77a7398f00ffe98384146ad2e81fa85e1bc22c0b093d3c1c35b46c12777617d4c152ce73928af98592e66831f03604f003b621ad0e070704967ea91bb668631249ed97475c1eda6a42a8f6f8ae6476e165e25a72460680d0ed56bfcb3161885fbc770308790d39e1a6ccaf3057ae01de336fcd4bbde72c32b4a74a1b7ff0a0b76f32e88fe7a66b6f0fa360e144288656610552e564d8fa27c624ca3b71afac49945b4397235c20ceafaed87cdae23d1d859b7047f12db145c56a52433c90ef4555f1af0092d1eb32bf5b96eb11d4de6f81b430cc3665669d2789840c7276ba346a4b0708c9da56ca72cd549b85221c622ad5aa405305316559a8278ace913f689c06d68c63529b1ab8843a0378c2f6bd40ea6851c76ffe6ace0e9d2ebd39bcc8f878f8b72f68abc296e465db3a3f7b8892bea7291f92e82faea385c793ed013babb68d39f57074dc651d3f083eae28b26806d993f88dfe21bcde991da3efaf833329a3352422b5affcb652c618cbb8d154ffcbd69343f3516a02c626c61563c2a29bdd4b197027016eb7f60fd69396ad2a258ed63acdaa86c1a0bbd50ff1624e47dbc820bbc2169c17ccaddda93d93ab900971b1606341d9b2da21685fad153b9c711917834199b2608a5c1879f88d53e93cfd56747d3591c525cc506c5adb880c1767400ebaf0d6c68c5cd4ad81e9af454b565def6221625d8395a5c490715844bfc618c23a3e59c42909a12c2f18de4281ec6dc3ef1779b16de3664e56e130a0f99e64bc6c1330eca257a6dcc611e781d3d00b68bca10e8c67f33de54041f5238f154f849cb864744c4a71a803d0d5683d022a4ca80c5db7a25399b315f6cc5d10df07ce536c35f48e1c736a7cc2bfa839383f04cabd65ba6c5ad1de7a4e84a9051f11013650a96bb56189c36f14cf162795efedbf61b0a24f15986bd5ede461242573144a8d6d76c2d1532549f63c066e88556a74e05199a517a91ab689a2252a645ba457c8a13752950c07ada64a9264548f7e2a92aeab53b5d4161a1670defe510bfbcda516d7b5cef76ff8662b0dd046bba591f7d46c9405d7d05989d627438e02479c23f704c7a0ba4b597963ac0a3f523313d5f920b8ac61e24de79aec534b7e643ff4df321b64217e20128c88e83411a0eaeb6e6c264db61819ffcb0c0fe269d5aa6e7d648141e64163d2a0e5ccb44a2492e735ff839fc0911acded26b178713f1bb6c845a00416ec6e5f72eb9a1095fa70c91fb4b1a9928f39a055b339882904c9df5c3d4d4e2947eb1cb3ea56296654df6c77aaacd68500dbc45513f1cc41434c3cf485abd4e8b226fc479f22f40d3dba59086ddb9c7a2e0c813e8f1dd58504569ac9b60781ed0d4eb209575cbce5b31096745aa5e84e08f5ea02e543fcac4d37730d5b1475248ae0f78a63b0a48cffcaf802d8db5bb644327a775dce7bc28658bf8160ab4ddc4926dfab69e1925fd3a4234dbf817cc5c44dc25592722b7a75bc116ba94c32f82b36704baf2809fef5afdd894ca660ff2fba1fabecaaa54b3572369516ce608b2b27bef586ce90675834bcf07e5182ce2eb11bf3f19d94e24c2d229bc8a638c2c5af50f5ef770567b612e372ec730e9df6ab3b1c7aa6aec2f3ed5d0abf01b16a9d1feb7c6e913d13f977b828d08aacf510e97882b1a87bea91795a2b5d12069f7978174301cf64fa05ee524a568d9faa42d1446a65cabb1cf1d06a271d8a1a8b30d876845383433af1d31fee583e2d1112be3167dba6242fc0af1a5545da24b0eb3f7cd50e2fc21b9233c85373ab9ef14139a2938155438d0560cc9d3f16b6cd4b1bf8e932b147be879912a2bf957ebd98241d1937316475f15462b865b84501a80d0003f9258375437c50bb25aa9ee37c22a6a6c6ea067123844e56b79cb18bb58d2975f28698e47d0871180a99baa125bd3c864ffdd370dcdc4d9d235e5bc2dcfb4ba551e7b1f85ccde552d5e1c2ac63761ff4ce1dfb0ea052684f6c888644d00ff83569dbd285573eec71f8a8672916c82a470814f777dc27713b905eb06416d76c12bf81fe493aec8c6d7a89459afddc6d949ff95356de103c56cc144591a68255cb28a2eed3e624ddee61694c5561925040a37aa96ec4a27652f5a55deee5b486f861e05a347234e465410cee7d09bee7a1ea6fba484883735339a522c4be592564ac66f96d918d0e497f89f3540a7f8c8bb5e38d46f4f30fe9a0aa57f3b6b78ef32b1902dfd188a47e12efd47291ee774392e3c9b0e58f52be2e8671d17618d76629d4681270bc4052f4d20fbe45edba9909973ac9aefcbf972821bfe3d1afcb533e8de08654c1a01bd681c37ad1daac4493e31855687d8340199fac45f771bdecd7c85b21564e4f2b0aee0d70ea1182cc9da5e939b488f8ca2297da1583347c959b2248f3d61769aba21a9e6407a83699258f7df385f14917efd46e4208c81fa84e93d0bb9ddbfb68aa9417e45eb0fa4786b2c3e5b1c41fcc175fc719e588288dac7556d30caa72a027d733a3d41f4d19a9fc385a249ee2f6ccb817746b45b1122738028f34e71272c7a16093743e00786b36f32f28899bb81e63217bf4bdc70ec23e748b83f925843fae57081669fb804c53733fa999ab6e87cc4c1fffb83898ea5237e3ec8a561a3d02cf71a076c8a102ce1f9f61a5275f8d90df010ee4e093b96cb53753589472cffbd24c1128d7a9e85811fcad66d219deecaeb6f01b4fab9ff8b6c75ed1213d73b97b31a32390737ddd99cb2076d79c860be03d6e35f78b8fb59363f3a44503662dcb6ee7a634a087e18d451a2ac6e19a9179b020877c236368a1d1e2fa127ab932da6ad9fe8c2f61da8a356fbb37f2e6c86a147013720e294b960bf8ad6604448a44cfc9c00966b0020f6d2eff691fbbff9505d6fd3e48ffdb54928795d1fa831b95b67f7805fa6a19e4eb0dcd7b1c49b4530f4be07193c7e8bd271f7694968f16349f7532f4d2d697740d4fcb949c97d03128d274bbc52b5f28063fc735ca7f9403d51137390e7c0de3cb1ad83a2afa680f4fe2dd40ce4cb9add58d38a20eedfebd7fbe6a2dc59231feeda3fb523bb1869cc13c9e3c0028be94bcbe06c918140c8d71638580b8b5e06cb9cb8f24d32c225f53bd7909a9473bc03170485384e48f55b9ca1261fd8f6e6f3e44dc113205442fe8fde7610f1c67263df2150f7d31a71ca0b6c1b95d30f56f70b912249d86ab9615471711ce3805d1ede785e678e1039bcaa22d6de39092b7eedd716ad738cb313947e8ac39663221038b5711a76da558fe6f4dd4d59b78de9482a39a6bf4453c948f0237fa68fa83566ad294266e88ed2ac8ddbde41567c8854095c42e5aa943045f30f0c619011fcd87bd19b7302c5ae572b3e69a4610fc90e496d55285b652ff723b72ad55b6afe0f90598450caeb0bf0fb42a689c942a5cab1ce0547bad1e575bf29a1c063c8087dd5a8e9791f67f6789926ee2e2dbc853de026f37e3b584fed0fae0974cb5897597011a9b7b967001f4bdf712d804b814c901e27c9b33ffbc02690e1d25e1db8ebb1d437fe4aa2501952911b187d0f84470c359fe1e0900a96c25af8e291e71cf48fa14afca0ec0398657bb0119565ceef78f1baeb382d58e480492437a49f9ed0be97a43b5bdf416b82ef3d3f25e3b4010cfd494be23b0b942086c781cc59602353c0820a3884ae091bf72136303b1d4ad231963d378e17386992cd6044e96d3f1b44036f09577f5b7b2dfa5b523e380a7bc90cfd391576609d3e7bc2d8fb9a2eb84fa4b5881474a3647e6a51fb7c5919e1dede1b479bc157a3b3fe9d556f4b8c378dc23d082e0df126fa74ffb10baa4169c78065d9cd0e422d8718f006510248227f9dceb1756120e42813df5de46c3e0683b685b8405bdc363a10d989a565bf46aa3fe1576de2580747053ca840e5374a0bc1ad01c896fb90a5a1133a20e581b27d4e271aeb0ef7a713c605fe0b8e1d821b6b96797c199b09b412f480fa5162ce5295f4cbaa2c74be1a4b312c961d5048b35509cb0006be505b56b129719bd2c8a66d76922f8ca54aba66e4f311230373c72aca00dd63f8bd8befede5203ac4812193f478691b1e23de1edfdcc5b7c42fd784700d3b52120d70dbd7f130e7517795f5451e06ee746ba2a90809747169f24498b4ca64331fc0f4f5b0dea6568292b773caa8d01f76e3a0bd4426d0fa8e8459d3f4f2f4d4e391c86f629b408ee7ce13163f0a823810c62eed089e179d4a8737f7218b5dac38b79cfad5198a637eb0493ed81933fca9adaf046ab27eb018a1b58d28bb3a6dac4459b1587071304910f2f9ea91f65cb0a3dbc7cc4357ec2bab469649631e3cda618ed9f6c3e2751d4694806858660ce2f5406dce9a6d451773827d53b67264f38bc49c5c06e11406c2c34f26c0d362b314890e33d3588e40ec939c8a4acd117495001b184530fca9daa18174d28211f64d46b366f45157cba6683d54e028d9caed95963f0e9c4135760dc3f0d837292a38d00bacef4cda7b0ed7c52b0daebc5bc55dd7da4381b601cff3aea5a5c8c5daf74c11671f9044bf6f316b761aadaffb8523cba0963f8af1272732c65d07fd7d972586a85e739daa5d368f946712a3b6cb2f5fe908e58e57a25c69a518e25db751601701e185fc1383d582bff621c9e31b0e0016b9a54630ae51b863288dc448c332e17102cb79f2b2402ed1498838660e0a4a08f4eacfd363f81cf3275cd93a1f7a87fe6a9d2f0ff2f8b422cc7f09b19d99587d8d0011f002ca017b48e89c27bf4199683dbb95d6026a742cffcc9db1798eeb6edcef6f191e0fcf01e4e3d0e049ee8406d068ba6ae7baf0927b734e563e48f2d42bf6d5f9ebe6cdd95d65b473298e9633c86e2a134fd9ff8034be8836a4b4de46b1170487d5504130a979e2a4ef477e0b09e5ed13a556e813db0ef15f82f68769b800f93c6dbea2755c1416dcfedab1e2cbc6c4b2e5dd3391591dbcd268fc63802e492b344302f8fdce7834b80dd64e74a6d7e1da763b8b35a6c33964ca7742abb5454586dc60a54418df564a436fd34f011ea5f2371d2bb7230ec17507fb052eff41bb5cb07f7203cd43ee2e9218697efa8da41d21d10d922b6b773e148cc8758ab9d9196a220a1a37608d107e5c86d8740142d71ab6d83d82ca52bbe9656ecc3e53e210ba390fdada90eff88696c52c2fd76f1eac6c1dcd75cf57019c9b62a5d51490b565ae9354f2e70d38a84f546696ffa263383736b99951e37acce9be25e7f0f73b9dc37fab5bcf974bbb652bc373d781dc26bdfa04cec38d41eae85c93c15c483934473e931a2b8dcda808e6737b27ee05f537608f2bf991b9665290f8ce718fe2a625789843cd35512b5614ea3da1561320212a64d898862385d6ea27c09e4f6bc8f89c7b678c50b769453331d37cf8bb53d4d827de7799aab0af57dddb751b144950c5445b8b07374c22d840c9c23fc958f4948f1db9176ea845c657043396e417a664b3618e0b688caa828a95262d5204a682cba8ce8d6cfaa03010f8606b3251cc78fbe2240ab6b745a49b81c4eb25c3f5522a54cbf3758b2240409baea45b5c850f381a5c8e3c5e82aa74b9405d0c0409bc27d9949584c7f09b64c5d16db3636a7318e9baa871eb30ceb122dfda4e3038f66ddb811f804934e6ac7d59938784f3c9b1198d0fc6b0eedf65179feadebe8b60b43de33abfac8c241d7c2a69ec461b67f1ab8b11c599faa81a58281f9d9882a9b03f307e333baa5d10abe158b35307e2f63166d674676d1a2eb37802ee804d57a4e946d4a7853970561efd0c4d06bf427354fb8dbccdbd57c3ddd50ff01b331e8549fbc5a47b4d5a002efa0c4649cb3f0dfb66495573dbfbd7b4cef37613040560530197e3c210d303f32a4ab3b83af08d5101d54cce5596faca914dd06a5d08bcbaf2bb8bd737e2de76fe96327699428881f5e32e7c94873949d9fd2cb32cbbcfa640fa9404f344e824cf6b663834e08b6add8f2f2d111f39f07c4f01446fb69d7f12f6a3dd53788939c9d19bdf2519a8e4d20883570b3acba5e2755270ee99a5d93f56c2b9e2328857ef082c413d7e7410b1351f4177ee5cd9f95f6ccd094a920ea44e11c274754cc257c8a8a3a87ec1ea3e5a1e4e63211e41241a045ecef0dd349f4a81f0521aa615e262ee0e4576f915cae0eaec114dca45250186292d88afc9722dd5352ca439da267db8824e27a5489f074eb3465a0c70302fe8d9c717e7603732fcfb26083b86550d69f6e6ee78b902e8e375fab5b26d2d8ad47331ab7827ee9d557e0b25b5492119642a6dd2d5b606c16b06541243f60afd360f7902ad683808dc887290c0235bf4eb0e80e0a35c6f3cad89bb1b5c5085254dbcdc7bbb31e51f854c4e7c50da9b73d79e1225734a99e2afd2ca07e8e0fcaa9b8e458fceb38d5e9ed7d118aafc2918ad84aa118b05bad0101d37c6c7d54bd0446ea41caff863facf77d2d254199ea20669cb02a30ef5d29636ea28798c118555e3a54b9af3879aeef01277c405cb29ed04fc783c09475d37a177dd5e5c95c0080c2401bd8bb00f55db9a4e09fda2da986c6c008528a9e18001521866ac2ea9a7535eb12f4ac2df73467dab54449f86c52ec44ee26fb84b11d3ff54d97702642b13f2438844c8f946019437bee664f331d7b4411b1a0c7b04d942a35e6740610f40dfdc7af96ee46b3c2c6d3d9fe7cc0300a672964897a04f3501a648e97775d185d51f763a36fc5228fbcd62d6c14809cccf260af52928dd2cb92274e2c8d4002685fcf8351c54299e7e3d340753590d2530621f6913395e4c4e6817f16a0ff6c36c7c6a4a54f08c103fed66e5ee7272721c4d5491a413ca4e980c3ba35595703e3bae1a4b2e020a97ad0031fe44e219a99dfde70a7d6a8d0b488fb119cca89e2088b230c700e1e151c9a30fbc1fa1b52261e7317971930cc16996dadb3ff17ab9ae8b3dc11349ca0f8831a646f3ad75fc7c43d7bf54764f975a443d801ed1d69d6e502d69447c5fd2e90e2b895e384eb12a09cb2d52f7e99ef7e2c61239ebf23ac6c8949b384e01ce65d15ebe54eb4d488443885adbf12b281e92e50027f81e1d7ed0896fdd6fda8b9b26f903f1fa0fb2ebe67c32285f05c9d5862cc5cd809176dcf8e0bb282e94acfa5a3d9c59c2aa9fd6f8c01909d08336c0be5c2b641f590a0c8e238410789050076e7f79c48f6ef3605d30e8f6916cc5146f86a08b0fa3fe9b8d5d69f6881fe06577caf5c191ef65438451c0535650f3707147aecee1501a1c3ccc68c1a218eb0c7628c8939145340a7313415b991f3810448663ad269848214be3aa625c00e801adbe1512eed43f043abd2a4992c17147f356d0081009b1821741f0545616a5557c6d867490e77a24940381770832508a043bfcca6364ae6ff573f922b472b84ce26581196ae29d777c231305a8909d46a70ac28a737e27dce20cd34289272755e326273cea4e4a9cb0387923c67fef39a9eef474818aee3297cd689c736c2491d2d9f587b4f9c90f4537eeb68e1c3ccd6ef2d9c5a3acd9b27aaddb671cc2b2811aa8c436808b3a3b50721e93b5aaa4d70cfaeb19614466478673d249cd30796197ce380d5a6198eb2d51e88bc58333de530828cc2be887f0451c1a52bfbf075171fc74df10ab9500e535ceb40ea64694a0c4e9aeb7fb32c0559af90bc13644cba2b02570de0c0bd55d0de73818927337b818b778bb9a4aaa491fb2ef5a5b397491611d05e8d3d2ef0505991b818b28e85f9ae105c6b66ab6eda8726b11387c5cd4abfeaea8fc910101fe168532e601f6490112feb284ee90dae1892131a348ac070f59f22fb3ff3b07b5f269c9426302bc4a2922f229ddf8ac58f914ebb3dbaf3349a3ca36ae02bcb2e74969e5aae5b1eaafecbfe19985b219490263970aa5eb876bdfa4fa5ab5a856c4841733b4a886e89e048230f634402dbc796496e10aff7be1222777e93a416523ac6c36114c953648316885f4409a31f92c1bcf1ec60ae8d2f7414ed8077523c198fbd285e9a3163d50d4e972c301d400b5eb73b5cf03c8dfeddcc9e0781671d8a093f0e45a40d7f5dff7984decc15fb298805b105276a4fb0eb75e36dc20fca75e5f10152f1458cd77ccdcc7605d7bb3c85453723137cc5321830e1a2646a2b7595687f11f64f0227c9f2fc8937e8a218ac0db55da223fa0df40872000d72e6f27be9ccc92e8889c33cde8daddc1864d395eafb200bfa54451e18913eb6306d2d1da4fc4ebfde6bc6941556ce28134a737f46652fc673115bafdf4317bd94bc4aa4938ae234d177a36d3c5eb0e4f2b683ebe4d59358264056270cf6548dac3e1bec19d536d87c041ee9ea2110ef6ec21392a5d32e417a0b12c11563c6bab02ce83264a95aeb4736bdadf130997009cb7faadde51a9d9d48aa10c727c46f7e5b07b96b83d9d93342dbaa8be52b5b3a4ac1e73dbdfb02519a8ce5934c40c57741c8c66b0a2c0024e7520858410c4a5558268af3066e5507918a01fcfc495bcad91b8244d80c381c86af510c6a50c0c20092506fa397999ca074518a42987d67cacbaa2b4e0e40ae1522b9de3cd9d02f7e73999d9ec3e2ac9e6c5a3b0346db6301d3c30d6c8492e1c50c611a263c91a7dfd1a61b7cb1e307fa478a2c3b45518eaab9f6c91407e9d7f41fb76ddc73e8cfc87f9bfefd2773be7b96d6d5b81e7b85a884800b162555081eb6bf2f03bcacdab6e5250ca5eac19134afebc7bdf3bfbdd7294c830046ca55fc91f2f68eeef9ef1ccdb3a365cfefe66ecf597b1efeebec83942155f9ed8f35c1f91ebbbaa9eafe4308be905f1fb19cdaeb76e1b61e93fa5202b2d30a51435c2236c65caf447e982db873651565fcac7ecccbcd2d6e5fd3d6615bcfe19f5c919c7da38bfea1ca2d5f1db0674c330696bbbfd4be4fbc69beef6f3c2aa00e803b2b1d881d989a00b3187909bf6599258cc86be287c5d271581f5e8fac6de11381e55e6401a5ecf53e1973abfcae291b92ae2fdc3919569c9780a640909262b41cc33dc62585bb16ac60b0a9aa57a9ff05858eaa28d8a500e3268ecb8bf79fc8bfd33ca2a4982b61cc9244269100f4412f541ec3c40c2105d3fb68a302f6c8f4aebb40f8c869e0ff8afd53ae14bd5f74174eea2d797aaa84b91e39a0095ee38adf7dd2931b51310071f605ae657d155176bfaed310ce9f8b8931ad5dce2d41f1978263b3803a94d47d7f9ad25739a6fd3f52bc861afb6d5762e92db317f7b08a0fb193ca1c515cdf2f83a6b3d007bb86b11ee91b12a6421763be3c774dfe7ec9f042e62cfb9d4fcd6da52894289b8f1897a2cf08d5d8b53e7457a04f0894d1de6d05a4531ea3625da7bdbd9251a71e6b7314a16163ffb62004b72eb8322d55ad8a3a9b91a5c780017729f6a89943b952cd232837c683b3c1c020b342ea6921f5aab4f87a5a6ffcf1541d81879599a0c0e3dbe98d4dce8564df2910dcd5d491dd12687166de1a43565c79b4278226ab6c61169267302df9a4d7b18d8f8ebdd910f2ed56fbef8b8895c7990991653f72eca3e2f505c975cc0d77a53723bb51a4c3bab093839b061e4e88973c853d1249ca694e75b4d327320a135ea17fb51a110affdd0505ff93e7a2aced341a5cc1d3c04fcdb6bc13e7e59b9985e7a3919a21fef0ca2706b832013bb627782f0cb3cba7791a1c8b03572ef4982cd89d7c8d35fb8147b82ba4af88d0d53e19957ae5fa41347396e55ca80aa4e4dbed40c82f1b5d755cdcb1f4dc6de1f308443ff9f1269439548f4865ec7d762e4963961f6c5a17cb83069e3970cc8cc8c6cf0dad76efc661d79b42b23d82609e227cfb278ad0110ca536bc5f3665d76ebcc5a0f10161058f7a172306baf62a71c0a6fa1a2d8e89e6cf8a8e6da96aea0c121f9a3c90845b71bec1aafeab7dd34928f193744f03f5b883b800dd2a0ca79385ee02e73111159172a510206181ddc313270db4cd90188245a6cfbd4573c165eea1ad64206c38c95b285f2f5e806388b0e1f1ba64320261f1a09afb753bbd74838a54cc8572757cd5b86ae843159bd89db4b0474f8ff6713cc4d65d917be3ea6f357b497a19e3b67b8e9914cc53f50917433c1a08f2e060034b00f407367aea56bbab122da6994ab44585c446d58f5b8e11d8d845ded46b43f288c34978b09255cce1ba9441d1e02de432e2ba46e7799dd4897c3f5fbf06793d4adf1b74dbb711cf2099495e2aa382ed29b1da8528d38521b7de8a6835e991cbb60911b89568c1b0a6efdbe0a5871b9e73fcf90e1980c9a7fa31d9f41b52897fda9b96d9ec5f3592864089a52d473d5726fb9a39ba408626a42ee3695774907e1a004823f0d7e7e45f82c7e1e9d4b1c9372462018455cae340b5b45c76a817b8e2307261a140a2e492e99003d02abbb4d06d22d3e6a3d770fbb1a9330221de5800868b2086d030feb7e530b025d17f5df7c931443998f2eb99d10ae9d60bbc4bacad5e1b875af1797bd572fb5a7a87c7fcedf96514c82ee6d0421a7992185f3d4564d71ba3b15e04b4abdbd14e60eb5be63d8f146c09820193fd2d03822a504e51c05107133632839d2d14587d919f28362efad61f1a95efa9859be6f3367ba4ff469c2e0583012c97f18b7d55bb64067a8d46136806cd76c43294e406255627ad7dc1c377e8c9628378334f6dd60241b9462baedc5cc571042303cb82205df0a072dd9fbcde460151a009b46feeea6e5fa33a2f32aeab78859a5e6776e2ec6338f1ec25e948fbb6a979f72fe68b567a99b1d417ffd15b395390affea3facc8902e63383cc8324619185b27c40d41463e3ae7921fa1895af2e3575054e2695508a661035b1c14de6ee2a1f5e960d41579d7211501712974a8416809520432fe09f7efc26d38dcb2d4572bae78888d55aa54d93e947c7d52bf0d0d14815991086c8cbbe03e1b9a79992a81bfb0279887f0601df93494639f3b2436f55b2080185de13c5481c1f73e3b166df76e9386e22cfe8a06fef536260b31effeea3bb6e9b4060c1d543f18cf7810196e77cb066ad324c7c22c0fb8be056e4de1b2693fc9346c1d2bd6c774aa2803ce9f25f6db6384a6c09c3f95a7ad087bea14eea1ec59b5641c3add4ff8fbc034234f426cc2ed1132a4ebd7125c92092bf05e0182d1e7e129b1b619c173dc272b5672e56d1a7b4f3ae47948ad38a9255563f7dff4b87a1d9fcb52a6bd7eaa9ab716d74da66516f67825fd6b1b5daa8131db746548059d7c9659748f8b121a736e8b418a7ebd3bcc4f12c11157a127b92bbed927bdc30c9ab6213b1960f6cf09430f8f888a5ef00ea4296c2440ef051dfdd668477a20cc3913fe1e6e3373324ac11e20ad2a1b8ce4883a544dcf59d3d6d0c2a73333523a9f57263919fab62ae3281547762157e1f709d6d3d6fc019258fce3759fc28ad7222d0352130ded97e494c52988d2d6eb59f28cc604e059d3ca10171dd3086291b465d79275597896382ab0c771b98ed35aa280beb4d32878e938b54553e47f51ed86f22eeded670f8474a5dff10a96facefcd1914a44061bc9613f3167298f5c0efaf7a3a8196f5ce8f160f27775b83dc304aac97a0072ef9eaa0fe8db70c02f2d78921b07acd49958f6a8b71bd391f8300d81079eb982f8f229614a860dd776e5bbcca3242cea3c5e52d10a87cc5097f9a26bb9c81b27ce6b6fbdd583b919c9ee89c031139f119be807fa34be8aedef6eb101dc62d3b526bb510195b8b457a4c6987b47159d179d588fbc2a1a8bb984066eddc2fc94f2c53f4cfbb483fcbbf7cf777c80a23d1f30c24e10dd9fcb8401ae6e1494e5fa18b90939e6a90aa8c3e618350889bb0b9b907da82e4beb109f30eb8c94e328c5ade1a658172c693ab4888a5470c59f22f953482ba2fd07adb5a46df8f91910cba34dc1fdadc1271edd8827af5e6090d63f958216d48570d4b4cc12ddf5d1200cb24e3a449f4b1c38dcc8105c83c8433179e979d7ac6c59134170b37c42593838513c5c05254d9127105840cb749c39a22b3e5b0080acbf5e2c5b81e80744336f4dcc4aebbedd5274b90ebbe3396fb3113897949b8bd3ea17b74d30a458fe147cbe53b87740c49ecace13cc3a679f21479fb2d136487a619fc438741f186ae496948a88e861076d581625554d5fb4dddff9269811bcd58b1b92644ef97e83a61b8a48f79a14b435a51fcd44b39ae3fe94f9f8fc706fe7960c3f96d55971f3e35d3bd9f86f7f811b47a73b5d1904e03249fbe99f762be1679807bf507e9e1b8e57a1d56c7322ebce97ce8e2e938c042d261b454a498156ba0442ad80d00bb5e514e30ba50da063793acf5299e9a7ebadcd40573bbb1bd68c54851c5192c8e67efc992cb85b451b5a520725da699828f0ae21f6b197a09621c12bca34be9a8e3933dbadc589306564b22bc2e867487bfd840b188b2c2b1eaf600a67f5beaff2d1b83eb798e4db8d1fe57ded3554365f52010816948eec7a61ed7a47a39f3db46ec0cbbf49214fa101a877c039598ea0f1c2940313ffe92cb78e1546a68877f6be960d4ff08c114b9ae1cf7e565ccac103094e58b85cffc7455eab53015e809f2d3ad95b0cde27b0952e766a62f99edd0d069f16ce05ceb3921b32886e2c55949c9e0a4e68aed79ebc883579d3172ee32858c73365bfd9bfea2907180471162bedd4dbe82bdb42b5c90814c1734e42cb4a683ebd094852ec0bface78999ae44611e18c15e6c349910f753c1eb078ff16f5e2a65bb4bc924200b621f7b877169df30003dc4a20788cae6221f50b6b4167752234c9ef64ee7c2490e9521f9248b28f2effbb806f8b1c4f83801593225f3fabba095e18472eb72b04ea9da9a6e262d25c76061503ef7db222538d0fa84e9caee1a005cf4fc6b4b26614c81249ffde3955be3108cbad3acbff358c4f76682635dd4284055d7cd74c506570f94a9efc2d090dee520171b225b98b39f3b20c992c8df9e4ba5b5c834b530815520becc61d6fa83658978087f0b26858208555ad9f268e48daf8fb463f215ca9c49a68c9612db7156b08b07eccb4a907468adeed4ffc006217ffa50630cbf9c4d9a3897e6864e3e99997407f1a57d9de8228ede138b29d2958e17e18471e7138ddff3a2b86c21e69dd45cdc94414a2dab30cb2703b8556fd6f3e70ba851c8acc622f0deebde5d087b895f64007c152d7987d2eeba49a044d4849aed1c756d59c736c0c3a096384354c9effab943020cf535a7889d5911811ca16fe26d602ad5a9185436ceca847627e19495144f9c040df87cfd758457b44951e2e0e640f032d323024acab208e2f3a6fa5400e390ee6eac23c5437203ab501ff17aabcadb329f55ac1de86457cb567a10efc265e43b8ff10b0799ff045fcdb7a42572cddd8ab4a9c7827472cee65e99066824b52b42df6708c13628d65bf19b17ce2fd620420c5fab5a028c7510e5b052619d1ae376117c3823b158af66106879c6b9b6ab121fad7a212bcb96a644a4f3d9e646c38e56f5a9cfda294aca518d91a7000aa5312ddf86078e2fe88cd36003d460f0aad718d46dd76afb1a712d2c6d347ffc77d248be336440ab10be5180d951ee9b21c658b83c00af18d6304acb780fd48cc56d7a0732ec9da7277100fd7d86db8154b63a3b5dbfbfd9784f9d8fbfa26c3efc5ae8ff66ad0f65e5cbe1902a16f48e707cc9a072bde8a1412cc9b5b834c8d08bf69bc6c61e3fd74d3b9ba1be524c364f3ba9dcc3d14d764d415f80e94defdec67460e2237e09d3654a4348912d8c3ea99aeed2e3af50a090ac86851eb3641ac983d28641417fa756fa496437fdcd7d04717d899f0e49c68f4913f68614ab57618813d82722bacba2a0b2a3349dd8e14d3d1ebb6a566071d8556b1319e25e814cb739e5c03682666d4c20553f038645e4812542cf3079413a88fbb5a9ec5d3009b30e56d0664590eb52942f00aad556b6411f42593eb5f59a9c2177f3d28431cd1136395da074a0aff7b98aaa5a804268c9eb17373a8a81b4cc45f6d0a35eb7c1d21ba09c31a6b7280bb5f612f5596540ebe58fe0231d0d77c142804d59422b836104f7e0a56bbc47258bcdc6ac2c394cf9286ea07a2e9b2c10e050d8badaebdab38344ca4a687f25146aa9f58923b359205a403d503b1b2d07690cfd6cf5b671b0880179e4ea3f2794fa05e2a44a500dc574b1ae0462048e1860968ffc10886394e1ec3673ffffbb3273f9401629be4f476abaec54a0e9904ffd1b3f5f7fb79de2ba3e821a5c9223257fa89050f82ba6ae807a714ab7aa24ee86819a3d173e0a901566054b9b8519a68cff2763b9a5599b98153d8f4416f1d9daa938836cd232dac659815dbc67f7faed3ef8f123102359e3e586ac95a8bed1684d1cb24a2b83b4af35433d0b1c0a438d9137e0047e14e636c7743c81c00c7a9a2a60674159fa5fded2af3948cfd5b5c4e701798af03b346ff60921eccc6a2f29a9f17d1829ae02b34c911825b91e8026d08a3706e3e829ea6604018e8031ad32f36ebea10558d3ec0875be3ac90b667baa48f390ca42fba1dff05fc80e88c4dc1f2282f91f41a58089a1920e6fd60751aca2a214deaa1d1774822b8011658ff282fda630a8f486f94d31b201aa779d97c8e43b8c58768de4d1b5803254749db9a35e9553355ff5a2a37cf2f8fe61a46b941f30f9456d2ad64793cecd9009223f8fd0a66940cee1045c835c4c5868ee5da5a9d4c13b45f657be97542ea7f4ab39b408d4d51a2ad2fa583ad94cc2f6e2b1a8cfc27e824e403273929b53d62acf20d10df16dac8b4859d8861f9d3d87eddb85d356c98914a116d910fea39e00fa46f0c29fffd32646b956d64e48a317486373abc1ca1a73496c1bb6f54a269e999883ed5b6d68130039d3972fab0c245fd5de9dcfb2c4138fd850c3825b6d3c4a0c8bc3c9f3e74df9113f7bc611a2f22d0794711f272fd42cf6d9bba9c92574822d4b8eddea2d05b36070e451aad887efdba63dafb47e68930e27cc6432e9a9fc5aaa87de3ccbad9cf88677df4d40a66b72e37208a982867251cee4f4bbc73a24eeba30d31674420359d657626b8674f5e7b5c516a6af51a70bcd91f7d0e148ec8a94f561ea77471a3ab7e7415be788fd58524137b518c9df4c1fb9f9d528ade33eb6d00cfce4b07a1860a70f170e468c92c9864cb855720f7d73b6fda28fd9f8ac1c93da7c5faff8c9ca3ed396433deffba6c5593c0178ff859e7a928a657cca9460f6d62478c80ef8bea67c4e427fceec253dbd518569327ca1b95b2839075b4792520441c7b6934e5e05766ce61209672482fe1e41ee51291ee7b35f0dd1c4b3a3f270856fb5ffa9bf230b069413850b810ca53f2bd77897049115b1b091a61d2c2e07fdb771729895ba7c874b43122769f46340ebcbf61574327e5be6335d66b273da02e3969085a75f09f75b5c79dbc5d41d7914adc3da4c840444edda24a287adc3934fb3b1de927eade5bd4940dea180e3720f8a1cfb70a8b07429a27b59e9bc6c415f31ca6664f664be5a05e93c3b205633d659c1bb64daccbabfaee67f8adef7bf0d6f40320193897a1d3782442d5f8aa99680af63f2a43081c8ba23dae5f86e07a2d10643cf8e7fc549c82e17a4c427a683cf21d44c74b508efc6151f17e36d67f0cd734466bda0ae27f70ccc2a66e7501719f9a8adf21eeb2bd0126c9122af1f178e9d7bd943c012efc01fcf6bae57a0ed1d9cf5bfab8de5e2a895f17d22edc567ffa70d5ac0f9e28577f8e78599d9dc9c5c761428ac2fa0a3d7965c41d1d816ed2e69e4caa2f159baac300c614fd09eaf2c84fc09ababf6c4834c5c9122b337628320e3dfdf38906c61561c51935b2ae8f625220beeb5bdb77b5db2a7950b73499c2b32b638b72214276b28b3ce6f7b47b7434a5c6d63c0264c14351b2216d295458e93e617de5852a6404afb6a3e670f75cc8557e90a2ec988843eb865d00d9686001abb408c2b87953d0ade9a742b20e92a74e08efa88ef1cd50d73aa0d5fc834ea3013c8b0902e5f8bb0b4cbaef70f4439acecdcbf00cbe8b1ffa5279e65835de38d6384968180c6aea36c955deac073c512c803ab064155512fb8ace0a218d9c08205a125fc3e602f1db3138665abe0814bd44a1dc7c096ae8fdfa85e276c712384df7c6fc2f9293dde8f437fa12bcdb53e017046b729eb4922b7aad6b5e7eb03bd548396e289ca14feab394f900c698297a3e2111a550be73aa2a2711880854bc35e061d653340c3788d7748c213fb213caca527bff0e40d9094f24267c95bfd560210096440407dc7b8f1cfdbbb9f3d45921c2c0820c48a8c3a784eb394d68f42406d424febe72aa891cc89020097a6cb3de72c6da76625e4b9087e855810e300362b90328d21a01dfb245f158e4245f038882f198f7cd460fec3374df8b9c9951b5eebe907e75846a2e696d9bab9cdaebfa571e769f5c052c8582f42356496e0fe30679b2f520220dd96413bbc37ddea441ac2483ca9fc279944bd398dedf4d1492c1463841aaff5dae0c4cae78a2552acc35f3e449fedbec8f31b20250bacb1fc2e9437c3ec1606b30b6cf5d4daf08a8d8b555d68c9665d49198cbebaf1b3c6fc6d040684b2fa64a1584eb02d2cd5a8bedda87e6b6edf82a8a8133645d740dee7db4ea26c31427093fcaf3e6b97ddb38652c3380674a34ed90874fae1af92bc2eb93e7715903300a291045f4cca31f082ed3c059f95f3f1393affdaf441a90a3fddca9cc6b5473941b1f97e13ff413e434ff570f865724d816f042ebb1a62092a01f579c33d9b8db2e141611988dc7c7a6e82c4c9beb5e507cc5cd9e775ab6b7f1b3b921825a8908b16cc250e932972f4e4cbffc79c36ebb1b7469718003ca6f94717fe91fd0bfe4b1687855c70d1308241a5f61c71c6ca864f8349530a344204af378b63a3f5e431cc5d79960adc0dd7e7ac3f341f80c76debf738a2cb40516bdac919b8ad5dfc901854de4a28ac5cebe90dcd4460581829ec1e678aa13819c72bd03781588e598ddb7e9b0d5e743f9f93f3ce4ffef0ffb2483d46840bc9a63838c63d3d50590424efc1cafefc2bf1a8764f3ba2f87037a93c87e477f282eea4c406105ee7fa97b3c2395211239c0d6b66c0acfd3fd9aea0dc9a2143ba8ca13c6a7fec059a5604c101f9b010fd7422aa06c3685ebfe3e5b3b64e4aa097a64c30bcf10ed1484991fe1c88a7a50e62a1eaf06a2b1e1033db9c9fc5796c9d06b9538719633a76bad093a7c2636725d3a15bcdaf0fdd44bd1596effb2b599463e8fc5820ff54c0364a2e5db470724b373104f301c2d6bf6586b097196ec08c1a839904b265d0dba4f6925d7a7b1b2b11caa0709d6f57cce1ef9194f4f395efc3a9fdb9309eb50b0a0ab3afcc6b8a22bb1da5c3de00dbb453fe76910dc36a108673e872bc862f56c0be4d2e93f3d68aeeea19a4baeeb6f7ea9c868dda7d6b28c4c29765a434e8c9c312243a86fd41583208c39dd33945eb427d23e0f2dcc4a68429c86cc627796800bbb61f45f4d64e6a0fb9beec8e58ee7caee8ad232d3a438dd6370e3f3a8d398660172e8498da7586ca0471be727106a9eda2d8802d611917789cb3922467485d5d07b9ce2abdd5dc653bc9adeb723ab97e051974106868b3597ec584b38ab44ba98f0a957006b99ffae394b9d971cfed6d081498583a94967e1561ef4af8a90736ecad65de54049113d1e4537056003a47988662559907fd85e77e3ca4e52446ca6365fc354ddccd6be274aceeba71d73841c7212558c5424fc946c8e008594e26a540bcc32d4c7b5e7b2975d3843e1020b8ff44ef08d12e4dcc13e8a43e914b5e16e4effd2a10594b1f4a96d55c89178baaeda3d4582d6b3bc0ca4ae1da25d4f1b908c98a6e5e685e3772798be2b0b640fa1859f3b7741f2a25fa379fdbb3955db5376644c3bdef45ec52316080ecc2d866af966ab183685df83d4722f5d8a1edc39054d58670b04de95177d76becf90db92cddc8dc6b00f1f9d6944895f04dd6c0beef6a0ba4dbef1cd71876cf0695931ac955a7d2ce8d747d6cdb7e74493cb780fa65605a6ddf096a6b404f6b6242f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e42f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e746bedc1463cbdb2c1b151027d107888a93bccf4cde8b0ded8da4e956bf73bb583aa1fe8318a2e0c5e7514c38dd2a4ab27dacb12ff26d474d0884ec53c5ce2c522787c5044b273fd68e862eb33d56d662533e6a41d219445d9168354d71582a40e243274cb946c875b60ef27885b72cf0bd5791497f82eff21e902fecca2fe56ecb13535a09f1fd8ae298511a96a14a2ca896ded75c973e09605227ca1ec038acb1aba127ac820b5a7ef26fca6e34de58d4ef24ade9c413aa6a73ca06d26cc8bc0c26598b382e0c914f624253d20ee0b45f845b79ea8f47d1dcb18876898e98b15638986e30c0975af6ab2ff62575dad258ab14f75c3f7068c2117863e67b1832fdc1506968b7fdac79bb838f911dee5c20be68ae274d9f83d8d4c8e7493d6aadf6b7de41058bebc10f0ad0b5adf429625ebdac77a649b8a1aff6e92ee0976aa4c0d654eaa6ce0021883ebc2d8064eb0286c3a55e0ac5bee5540134aa8ec38323d6261da50d586bbafb457b85b8b141b7ec5e19133ac1d0aecef686574e2d292a17e00bd9d2b3ee7653bc55b6893ee86239fc25173bf138995b960a8d5e478a8e4d2d5de2dbe8f4e9f890c7ba78a3382b9b9f8b845551d3b1e2810d5c70021b9e78b75089f83408baab2e1927f8e2c6c311ccc84f32d61ed001d2f4fceb883a2b785f0781490b69011f769663e63e90f9bdebafab81133e3ae7d2a88983f8aa9b040c13b9e54acb907e6aaa668119d8b86b880af40c722358cc6ecf9e545d7b0a67d2c626e3c46e8505cb07ac740c6c38fb55964cf9f37194c91649812ed22a4ac1dc2b3210ef58b3ff49459edbf98e469d24ad4d893fd9f762e48c66bce2557fbf06c1ea07735d49672809e074afcb998a65fb579371de9c5e286e0263d00b9abc68675747b61157a92abaa6e5110169fb30f0ea3bd9118e34c58cebcb784ac0efbde1ec9ae5422776b3eee9031ce6a695f43e701e549a6f04e6c6ab2745c788434abdc1659cedb7fe597959b096ca23b6811ec8588af99572e9d9dfd04d8c2f8d5ebb2dc9b246f80db36624357472a0c8edff9fe0ac45e3eb88b4b4769818d7dd614385bf90c52dc5dbad475c6c0a70b9b6b152889ce08ae88423f2833009f0563ecf3612587092cbdc753f340a5851d22137e908bc9ade1e9081cac13f8dc18ac7e0eb86b20c129246ce490dfb7d97ae066cffd68f5e32c012dae93e39e9761513d8f64d558d1b904ee2ee198cb5a31d0faeecf1797d615d63befeee7643dece90d562f50fdd808c104bb79773e93271213770e145a56b653093c5c72ea41bcf2e73418b0ae9099f1048a20d9a541130691c8af3969e5686d90f4eaa1108ff7f5461acedf87f8cd0dde50a33330f390178c8b000f1a84ecedef4dfc6f806eaf75adf2968ac615df010aa027f1ca967479bef7137d68bdfa28c80701449393496653a9b60008b93fa31a33bccecc69bf2c9eee72b80d7f078c2ef629a39bb4520ad0420beb681f956e5551d3e0a5dcd75dd5e16ad9c0f4b56f3e9e9779b2f6cb43e9130d160a6ce8b66bb3fbe7b6b330f1085ed2578aa4dfcd8c665d4ea9a8231188c63163942a1630e55a2751159250f4ea9454779eb3d46a3b52850dc299414d9c1624a5403980e43c3d30f772bd6d78bf00ee7cdde5d1784780a1828cc32e38831607820ad5a89a29a87ca2ab99d6cd2fc61be74394a76df647ec0385c047b00fed469ecf9f8971bdbd2dcdec585cf85e18f118f6025b0258da6fc21db0b53ad4a15c5e1340daec9c9649a2ce7a6e2aa3d202307be6a1da7b6c7404a434866bf24225f99d0842b51cf5e0b6f08d5a03aaece376e16f387479a88019cbe1747da2f300a1be882f3111b6d1fb9cbdfae5b2d9ef8429b31378eeed06bdd5b9afcf7c2fac79d48cdfd5e9dd6cbf284e55cf3ef8e22b5f63b0d2bad664026aacac41ed8f1c9e6ce02f96bfe496117eabc1190b38ca980d7cdd20c5277e14b40eb30027f548b9d0ffb7e0778eea5a1f9766bcf85c00bd8ff669ea7a616cd0f4aa5113822935bf845be423e819403c9cb27be889f11f2a1297d7efbfa4bd021824c8dfd9ac2806c478e59e5c9a7dc7948de39862e62eae3874ba478c57c269a5278b2eed9278d2de68443ef44fba7d8ae68cfd66f52a42b7e444365e37dc57ef98f613daa942a5a9ea4e2480380168c27f7a96babdfa7f039764a259c4769a3f5560d0f8aa825354feead38ff1c376388cba5fe6f4860be9e44cb40392ec6d88da655f33373e60c97d9fc44b968492b603edd7392dda35d6d18b7589da78112e820c7dab3b1e208de2614d058546de4526dea593bfe70dc3bd15b3fdd4d897793902116e88e9b9a56e48d1f8bf57b9cdb109fb015592de63bec01423aa1a52b7f967836272b275b0c411896f88323720513bfef363281293be99b87859ae78d6843ded2160823ba4647653ad54ffe1015f1e012224a6d9143d360b918949e4c879d42413d361186e5c1fc838aee61d6a8876e0515b4e7be69adbe290e6087a1d55f2b27e418d43a4e0dda48be2b0fe79ef605c1991d78693ece080080be68922b15870413a7d27dad591deb4bdd64feb66ff9ea9c8fd454048310b57db36a3e60f2cd8c1e7ff4b277861bf75c0dbd7a58975a8958f80958fb96c126a430ad29242c5009b704f71bdfe4a26103ebea98a7377a77c93e8e8bb8c1799d8b97ec69dae82fa5427101c86f02e8987666d128e59a6228d6aad804c1df1d00cba5abb1c86c26bf7ffff06ee387cb1589eda22468bf56af7208f185e89a86039f2a776271098d94ad4eaebc82a10b1ac86e1a866ea74abb4349081462ea8d551f4834fbcaf347abaffe3af50a3827f6894dd3297a95adbdd4404f74bea25bc1c8a5495a680625196d8088a0a03d702cfcf9d7819aac7e85f9a7e61b99085203c4cdce282bac2d488faeb29b2cb274c86c0bf0fc770e8c85ba17330a67382363fb3152e6cb9b18831dd4bce2b80c67c7af3caed97a05c9d868017dfa1659b01e60f908029da4d3120d875dd907e2ddf07d6137754b165ddb063169c8d3e65ccbdb6719b6bdbca62f2e5746d2c1e040ed84d739aee242726b817e3e8b8b4ea9ecf35a8bb2da38287da1ec4f1d312ca5767fcf9102b23cee037f715aa442237b4d7e43bcd93b7b80a47d7489a8dfe8fedfae19380f5823686c750b47e938991e64233bfbf051a3ee0490f16740f8bbb89cd19fa83975326d236a067563a78ce707d0f4f5ee8a9dfbdc660295669dedcccc275fbc2cafe08190d90c3188cd82f22367c3e7c7bc393031279f39a826020cc62e8e5e2e9b5527b61d7cc30b594a9dd87342fe0e22e5f9ba165d7c5d13310d1fbde6f2165ccac898771b87c64f7572fa43718d10b95b25ebe946c4ea87a427676b21c7eb9ce7b766b22e6c7344de5254b1dc3d8cf87624a21138fb8ea04109f4a18f55dd1aab315f0a1066297a2e2faf54de860e8bf28f15d6f09ea6d23668ff7fcbec43fa8c225dc3ab2eee481df1688048852c8a011da21c750dd3c6c1c4359a2fbbbe02b647ba88ea8e11908f59cc8d71ca843131ee9a1f3f870b2a85506d36d233cac88696bdaba3e806f9a90973f10c0e5c58fcef79f07e612fbade1c56035695ded17d5bb7df8eec9a0938967eeb5c9f94faed4dffd5fe7df1bc19a52daabe2428f7831f8663be421b8897b68fcc1cd6664b09448136b73dceaf95d0bf7c0878384a1e2c882b104c0583eb211de6441b362f062981baf12e9758fe045d8c26cf2bd7c595b4e95300d9220e0d9b8ee6463bbafb730d3704d8a4e3ffb0edbcf8da5e5a89a6cc19f3d926d8d13f79986c80f2f34c03eb6f042bd2a46c731c65f09bb23a7e1e37b4dcaf7e1095805b5927796413544b48c2e9ec105ab123dba2a31625ca3747a2342924b8e85fd9d6e047fa0178ef77b0869ef7f988a2f6b457a6ab53cec0972b6d990a8f9809b2bae33efd6e20c199cec82f8b7b31ca6c508078d2d81993b1b48c3c15ce9843c5c961bfd5bbef07f64d28b450302fa4ae4377bada1593797bae251ea9f47ef3ae31ba99e3109810d4e1705fe68121151e8df4152536f9b64cabe937e1bf7f7e89243ee7ccfad9451802782dc5b58293e85f970aadf978c485537899dcf45120441b5a4a9e5ab1cc3400aeef1a10da996ba96bbef8d7eeb0c42da89a37bf5002702a0f8dedd53a13cbd97d22bb1f375f9731f5ec45384093baf7c78266bb941648a60680edb1f87522b5a5d9b13288f22663dbd804de58f5cdcfddec98b85d73da99a9a612e8243cb56dda4753874ddb23fee1d72b6e65ad4dfc7ad5d60cbef195126cdee3f00b31b5db8d2fbf90358cab8ed097756ce72df48a7deb2d1cd70d6254cedd36867be36c82a2796a8961d155cb4c5b7fb0fb38657a54e326001a4d762cb5ebdb1c0149065c0ba20d1417d76e71757e6535223244f0919c324ae34791b29ccc0da50a375015124bc18b4bab11cbe89be3d7a81d07998a084f3a4d9b3d25e1a19b996f3cce665a3bbbdfbb7bd601ea7de5050b4340786f5401a692d3ca636c14aca51fae9a26aff6cecc08a6be677bf77b3a93ef805afc79e8c525996e5e0e7c80acfa8923d4c6cbbfe6cbfed769ab28ecd6603a3e097631fdb0acaa4f9dbbca5f3eeb0f354343c3e1c96abb36e169ec4641a993e0388c7db025d7103d388a110bee886a704a0a38b4069e75c45fce5c7e7fa71a599ff488612d2445617d86c7e01468e9e80ce207a27dbbb23c899263eb2f4fa02d3fbf8b2652bde5da7d8b665e0acd81d137887275328d85c5bae0d04e90dae9630760e2bed828fb9e164b430911a60f5394fa9330422511c5df0d6fd65a42746fdb5b82218912fed75910e00a6f0b1975c6a0c1eb458f77b43e29936e533a91e1965ad60ff7947b7e6370a6eadc1897d68e933804d35d2a73b4e4179429fb387b1d5ebe7400a3c5913ca75d8dc5d370184d90500332703825e297ac1f192e164522da47b566cb4135cb1782416e08518e07a2f41e4d98f33f00337b59b3dfa3fe62b38668681e0c05e9eefead43e347e59e2364b0c92e74685493191a84a88cc421467de66b2b48d396e37e77df20bdf73e06d9a3d7b966d913dce9d6e9b24c10e95384518b64ade2d339cf74030a30633d221c047e80fa90be54763f5195d32e837996d05e0649a4dc2397a98b068d7613bb13b34fa12c5e1e093e4d9b1af72e087525e2ccf1350cbd02c0a781c41d13bbc2bc4bfe1f25757e210909a1de258d95ae47f775f9350522bf429c14690059b160b41695b6e8d257f9f4c67cf30365d07f55e5f9d99c41785dafcb79310ba10ce76e589487e1443ab521ba11fa11a837b9dc138350d402762bdfe034caafccee774c64ad441ee014040455cdd5de5ea20a244fcd6178a7ce55d0a0bc4ae06c36c2b356b8a714ebfc84306ef572dd10e50a32d0f64080e23922339503a0f8924c960408060e713b00b4e423e0b98e17b5f035b192ad818ef34704b47f596a2495568b3764f077263fd61d64dfdefac5235271999f2139ff21a028c2c6fb582f1b5b69ad78d9045f6e3c09752fd4260349d65c24d59d1c1e1b2702d7face6ffc470c5b5d91ad5af2127f4277837992c97f7f17e110ff2fc4b44e8011df0febedd5c1266dc81ca4ee46d235b49e1d01e8f7d68e3eb3ec6ae22a3ed61ccf0a48f260c99a66d16623d2a0867045f3fbd3b58ffe61d8615f0739db49208cc96991fd7e37068398fc76550cef68163f688ac869d19391710cd3dcc0ee71fe1cd4858b160b1dcb7392e9ad5fb3b1046e9de59e72340502d8a1258e50138c170e7936c01a2c358d9cb0101fcb70d7c5617431af577d4b869a4627ac0a49bd4d5b2a7bf3fa71e085a76d50085657bbb3ceaaa6f4763703c110016d02c0c20ec06085c7737f815f222de9084219056835796f69d5d3498e87c3ac623ae5cfddc69e185a9fa223b1eb336e32c5ce3d0153d5f2aeea046d4929adfb20d8d7ffb10c14fbdddaad394150d03746220f44a71d27eb6ffac38b25169e9cad5cebcae6b4e8f646ce6ac23790cfd1df8c8c7cf4b9b6a89a93356ef511236bb09d1df3f0c4d56822aaeaefbf56900bf0f7bc0ce8db12b43be231edbddb5f1b4e6375dda5b231887184f7f2d6bf6b69b38bd70f1ede27d95dcff01269b4420d434d739147115339bed7c8067e9a0805fb7ef84bf65dcac42ca463468aa8c438cd0574227367d728f066159f96f3110d50f46986e04db200e21cbc00ab4400f2268cd9209dca0e7b92c8fb935e81794436e9bc3ed90bb43a709aacabbee25986eaaa8526f852ab09634260f99c72cf492ae193c2385808846134048e774a27013580005fee33555a6af6d31fcd97684ca16bbd441f1b03f65cea4202a718fc3436400500aeda56f13a020c513d88c57e36544ddfb3b51e28f598429cc942411c34a13623194d3afc486fd938b6660836df3f173682dc5547545e41f8ba86426df2b70308aa5518a8bce9a1d00917b9f0623cc966c26b362c7a8f6d5a980f155134dc0354850325e2f145ce80952d329b3adab53ee0b2128a431e9e56e229a829f0bd657613f8b32b6fac97a94b9d3651f84a3b699bc97eaa5696cc6f897a845b163d95079c562c987dcc7b69e4db46d03e578ffb8a61c16c9632a417e95db8d2ad03196d719c5d47c271ea847625a2dbbff1805d6c4dc5da5abafbc210dbe39f4ba100dcf7ee276bda08f6e9828e102f8652340cb817f42d5cf59d4d42886b37f578f793278a313869d1419fe4244e71e14fa7d82a20790437d3d11969339642be3b67996b3330981f60d520bc47aa80c0f000ed4c625439402a6d8a144448c175d1b396824a8cb0986478920e9f2dd2aaea99dfd3611e4f5fe910321b6652c19d50d1ade267104858a23add0294e613c93abbf65ccf8d98d791105e72bf0101d770de2afb271b36cf3926631acaff70d0bca57c1d10747b025a9438cb48921b0151a9a4f3fcd25a9342c5878a35b743a5adfb0714ab55c610edcb6f82206a32dc5eaacb70563edb4aed0fd58434da07cdbe0fe4791e43b701d3e4cc6587c18e1d03498244d5f3cfa2966588cd6721d8edf66d5ee6f9ea9ad12ae95b0775bef6551446d09c572480383c60c09c9e1d53b5c88edf6f69911955303637e58d9bb28df425257f977738547b79c646bb76e2dc2a2d076ddda1649f78ff878719fb73b7fff2526f65f3d21f1569f1c0a7d2411bc6f2095bceda3a43a23d1d18c287902bb512159d9e9840243f3e11b83aea992b3888a375d014188c4134e4da54b91a981d33483c816d9aef44eb6b426f2e1e53fc95dbd61ada4107e86949b64d95e5b0fe7b48f4cc1abb55be6adcf75137089a4da8099ea8d33b13992a60999142abef64c4ae6797f6daa3568c10d7a7dfe6cad4e92abe75a238bcbd96ab2e69ef6a6c11a62286b70fba061f48bff1e0f173930cb37084e666f934755b5acd17a588c43c4557da60c42bb3e5cc9d9fc997fa1093e847fdc99d791345f2ef583100fbc5b256a011936183bb6218c84d0d055736a8d88d4417029305b5a5f8cf80f18a452e48b49519998900c3d4461db2dfc8dc9e29a53053efdf8ca637fcde2a23c33b8d026ac5ce3d3038da0094b4f310bdc5c930f2d3f4586b6eb7877ba2666c5866d5ab2d50c2c45b2a5d5e91ca332a1557578066226641f1b982244ee21955e989f4968c00952d0af2888deabc64976a17f050ebb5e2bd84a1b09eb3d56aca3ac96c59645605027e6a5be0e24eacbc2f573caa0ec16fec498374c320c8a2ad697b7c1f7a7109d9c612c7f1e0735c5975e77aec0a250b0b3f8c118055f0040ae1fda32db8cd04b4fb5cd7af3fc7f918d5aaaac321bca9c46a8031c1ad256e0e619f75752c618203f3878f517511b8009e3e7e16a8ae5bbfc87f89c90ce9a8e621a7e9f6d8231b310fd0e6e3f37c706034ea1b45cc22a934ac544459c6f1b678e4fdf6ce0298fb8eb92c2ee4adf8098856cff11d7b7c699fdc656bc6007667091e205f92e7dfbf7632be64175425a1cfb47c64a3539495070817c0dcd535d9397ca2b1af241dc0ef3f373a202629136ff3106d06c66717c4cc12bce5b9cdf79b77ee6873c41cdb4f0858ac4d2b2b45e874936d0ef8408ad8378aee6f71c80d66e33724764f11366105f356ba63193775a546911ebe71615ad8622424bb56ba0cea4e505faa00ec254d7926fbb0e72b850c609d55c3c79107c2a055505ded7d604fe60ba839885a0018cfbbdf161edc3ce7663e58cdb47c6d1e7b4894ae3556819471aca0bacb92064e26dc5aabfad0a9bbcff2bd102b778fa873962c011925db987f89c6e19b4b48f98ee30622eda896d81821b8bc098eb0aa0e153de061d04c2b57ede525c25104d96a4019aeb5d0b93bfc57d3cdc97c0c5136755e299bed691112e76c6ebb6313f9d1c71076d9492d5a88d842330e791b8a160743f25c29841ad66cc57cae2313370e154e8790d7c632763e09c13cb69597b0bb25eef374fc8bac79b6bc4a66699ad7fe9e5d1d5066a62482e17c29beb908b9e3c2387bce7400982caa85b9f830be574baf60328a21d6d53af336bcfdf66a8e13c6a1fb6c7c8b785f5c6850110bb1e2f989b8d200bfb49439ff9bbcc22e14f418c857d2e30aaa9101cba0629f9038a79c672b3ed6789315a534774e0bc1579aecccfeb47ba7dc20abbf5c0c0e154086f4b20884c834834b2198b2aea4bf1ab8ca59ab79ccb8333071e02fdf2c5de6af638d617f1af432eb7b4d5846fa4db8bd112f2ca17de1b0acd6c57e1194a55aa29f4c95f4d199ace3165b67c34eebd7d40b6cba0869c82068e720491bd718b2d42a934b07e3668fec95337cf564848983ce01f03a8d2698046b5de2a9bcd16e3ee64df6a2d54b986f152d4bcd4c965e153573670db20c47c8f27c71d7db666a347396918e3489489f92d7e45636516f2018e77ce9361d65857f97f6bea94103d861fdb89c9f57fe36bdea0db8b03e21492bcc92a9047ed000689518cb97a5929bd0d71e59efc56da5b490f4941ee079af4a6a02fdef27cb15c335a4feaa628451204f291b9d4be6110a7db35ffb77ce27734f677fc4afd303e0949dce23c13857835addf9449461b6117af3884296ebe0a90bbc3476aabcbbc6ac0cd89557a6f7e3c0cbf545b2ca0244c302a7880c6d53082433a9a06263cd5f0d1052e8de1b686506c5c5fe4a36cce6e85645fc6be034b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe959cdea44fdd98eb626c403d5490c654341b13a084839e6371d0a3f95c03c2936014c57840513a62e542ac5c88f6baaab95a8755fee194ee75fedb7d1ff531bfbb659df6670778a25ebee835818a5191ac2c8bcb317adfffbe5840b24536e6aeff23e90ddaac45d59c0b53e1cda32a6f6c3d33dac0cff671ebd6dc72fc62102b016101b2589ab6a4ed3f140e932f87b4408907fae3ff81690d1de4f7042a4a8bc57a1eee57c3a993b501cf7ca1719549715fb330cf0b5c9449c05228287d28d1cd19"); pub struct UnstuckSnowbridge; @@ -108,4 +112,3 @@ fn checkpoint_sanity_checks() { .try_into(); assert!(prepared.is_ok()); } - From ba71a05f7991879b2f092bab19c817e2eb926a1d Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Fri, 17 May 2024 17:30:50 +0200 Subject: [PATCH 09/22] Previous checkpoint was invalid --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 54e2b59565..ba94a375f5 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -41,7 +41,8 @@ const LOG_TARGET: &str = "runtime::snowbridge::migration"; const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = hex_literal::hex!("8866b2286167938628be9eee938d21321837025f93725f9516b30dce5f8c11fa"); -const NEW_CHECKPOINT: [u8; 25157] = hex_literal::hex!("80708a000000000001f2140000000000940aea29cc27e4c0d49ef156e437e8a11c30c80c55c04c08af82a139e1e4153110fab24f024fab4709b5c44d8e2f9b645dabe743b0fb535b9771e856b12ce3a13227d1f3b67e33bdddd0789f7eb0062f5915ac2c47150c767e5fff56552b6107b9095fea6f875454778517648e9e387aaf15cec76acf45e082f7f2fa33fedbb51a7cd7a5a2a85f97028006c832797782803fe2edbe2a3c5e2da51b1359de062de8ea7fa96f24bff84fefd7017d1e1b015b61251ba0f11007c35d6fcbead0b36ab85b4671136af19ceab86204acf823a1a6aacaddd4f9e103df36e00fd61f13baaf4bf467970f36b99c246cd546c11d61a81546818e798e438c59757cfb672f65174b8e7c5bdda7708fd74f385e1a0b14da3a9d19f1976013dd274ecd334876a58da521cf0dc61ab4f0f4efe0729f58fb40875cc752654c38c5731a3c47f255567990a768170e7ef7241593f6ece8ecf999a33c7cb7c5965d7919d6604cb4d757b71509ab9a7d44b740153f96e9ce177641e75e3977f19570e22cf79a7b5ebcf1ade0bd29448068331d4d2821dbeba946558f385a71c7834fde97379a416c1fbd74e858bf53d331b6dd09c20eae6da6f58238add7f888ff9d14e3bab0d76587d6a3263bd7087f862926cbc5d92794e7d74433d4ebd26834f3158f93b676dac18491b58a008c83086d5a313a808bc2ea87cd36093492e74a40037fe038766c6b3feaf98ee84a5fff6c1118ed6cbf98d99ab056ec1874444387337977711324e43cb9dbbf84d328876c5873bc712a83f62de509414565615ce87eb35b720607324a903708b46625788eddd9f83ba177bdefbb23fb35af2e1dbc4c3c70daa3d5d2c732ccb89aa0ca8962d9ced1ea35276b98b2af95aaf853e13b66425de03007cca28a32a948ec463498de1157e76dd6d5dd8356363c171036564cb53dea2c0c2ef4b62f872c577a6a29a8b446e2f145b00b71384b4e1d32a350e57028526c0e4031de67c3739fc815c3cfaed641b8e063608569163dd68aa8ce01e48c36314525016e04668b9df1d741cee60240701418d35992b88fe84fd018580f1d4dccdd58d280512ed0ceaba36480c84259aa3e8f7d602ca9b8f7695b1cd160796d2c1f230ff40fe69dace0e03554b2d496a787bac2a0ba72126973575be2895dc3df5a8fa3873a8a94ab9e92f37a50d9a9573a4b0e24ff55821f674f2fab99c4ece573d635b415f68237827439663ccd7157bd889b2a1af63ed81071ebdfaea91200e5602e4d8759935a333068d46c117d8e7518c0922ec8b3b04408b08d6af43909c3e1823af2ec579b5d860a790f5d21c234a3e13d64d244ed00f46af133c14ba69e113cb1945348ec8263e8fb5481c6768a38b29c75fc6635781ce2949bc08982d4b92bb9816154527903ee9968f27f0e7383fc83a3fba2e1eca9c79194cfffe6e57cdd84ac6094ff45f44e14091ea8d769b8f0f25c60b719c97ee7635835ec401dcaebb060a4eb891594add14fa0be6861f6eafe684618bb55147deff21dcf65c1c8e155e25a84a2a15f1a8e1b9ed26c58dc069028366d2a5fbe8d4d8ec6ea90f0735970b633f371bfcb3cdf700060d1e3a4ae8af0ee14e528dc175931a18020463b5794e9d266ddd356a6d377827a5d5bba702d1a4a9c33be33785175beb893c20d54631a5aa120cfd4fda9b5de8b0ac86e8f86c0fc6598ff80f5f2cb02dce934d17912428f722c0b68c99ca11802fb085e1ffad76cdd15e849095388428851b43a95983bf9c2675bc87cac621f68552533fcbeb19e06b1498d3df4f6e0359b19ec30e6ffc18d27c663a76ad106224e856d40925fc70ef05f8cb888992e3edd3c20b73a8f0648d5d58e04de317de82c4d32144df7b9511d20b44da626ec6588d8158cad2db14ad6940a5af0dd128d6b151acbed1571fa7439f56a73c58e889be548c5bc5b63d85150a3ab4cd859719c384d2994e891cb90ed7378a04e2d36278429b272ca81c55865a364aafa3d5240346989c4db46c50a09ecd2b135c2fcf2a274e58c14bc8ed9f787392879009b2bdc92dc596910012755bbd900ee46c594c8c6e593f6df9baae8787ca17fd44974504c6c94812defe94a878b37c8c9f0d6a188a446a000ab1cccfc0983b476ed8f4d178fa1cea06023cd2e8600c539842877c6ac94f0eec917a2232f88e1bc7069591b40e6a4fe8f604349a33aa6992f5ff11ff73bb9fa676f9d6ab1e08dcb246df59534a2793fe461d8562982022bbafce8b37f1d98d10e151be8b4b95b97fdec144bc2940b1ff407a9da5a5a1a0a8492e572ff9944d0e21abbad71f2b8c5509e7b64bd3123ee3f283959eb4e1b752a3873e827ad6f2d9199d1330dca7a9889f0884cee8ceb61f112a2f4569d73e403409f561d12a85d47f32b50142d3394cbe9997aba834ffbced35a67c0d602eb9933a3eca08d657d0c550b5fa64d4e8d9df44560dad489ea9a822e916e4dc613ad6e8071759cdead340fae99a23318842242285c4eb6a1976e10c527650186dff573b3b02db2697049b708fcc67bab8477480c26f0e6ac4d6089433d3799f34df757fd09e7a6605aecd79aece1aa9a101ff61f2fa9f03fd573a188b18560de6b148327d13dc097f8f4e77ff7f04b58c743294fca2f89f30fb125d449ef3929a811d122e15810f074ccaf290446b0f77698ea3e5c663c2c9539a1637cf167316ffd0b0941e480b05cd88ea11467cb7bbd61458c8d12fa2d1816007dc74f007b17541816689b890ca51e83293647dd7c4ef14a5612dfac38416bb4860c4179e6d76fd5a4afb1ae7f78f88ca43c1731dfd42f3e5b20ddf920ad098b5b5d5832a0e6a599ab1aaeb2294e404ab79b5a7fb1a022b612661712739a32a9d0fdf13179029f3d39c46ea029972a39fe622fb9ae82d8e5959c54a1984e67cd4f60cf36032092f39d6d62728f34220081735c6c064682af870883504b8d9676d7409477d251728b6aee3eaa3467eb491b74dcca7c9c0067e4a36917c7bd8a8c9439892c26d7980b67dbdd334538c95f05438838da906ab327dc99998881c2f1663ebecc8ef1535918169ecc3a64971ef905eec8bfe998837abad2f65e0196168c7b928fee34b0e499bdbd97f8a4c57d1efa1dce03b405900dbf0109b315266c5cf3d0fa2b626cf02217b9621fd8884f03a836bae647acdfe49485ae299894ce11339f6aeb078f28055c730a18097ee708681bb015bbfaf5094fb3d2ec98a1590fc9391742f0e2ed05f33996a49e6ef5687db8be0c7d7de3b700a54b727e5741049f683a008ffa5f2e2f1f83d281ffeed756a7a477207b6f3360168b13f75d39256afa2d357914519ce104af23ccce1f03b91df63584c5acc2c9f67dd20f2913abe56fc4b011d11a9ff1de83497bb4b001a6ace5739088c6e17a356a14f97ce878311745cec46b058d0adeaf7dd0004846a73a6b79efb05139d85594a31078712b6c11983136d50e5895b08e06913477b6443de60c85ca5cab6e2a7ae799161791d78674305082262d010fb84fe9441c6fc66456f4fdf722d1f889fac449cc1563071098d039d2904ff1fe46aa3392109c1f2eb8477ac6fd8f7a71b7335500fe720bb23aa864e2b094a51ed369cd2615ea3b17de97c52b4ace914126ff9ea5b2c7c30d413b6186dbbbe7afb2a102c22d1bf616d7afa20fa9eed6802ce5a165ed6f1d9f1779ab7dcb6dcfe874ff1cf812b71f1b54ad288d53ea16668bb5c9123ecd53f6cd05ca0fae2118939bcf43d4b0de098e72018735b70a2b74f82afa890abb133da2ea87d18d547e29b5e4ec4ec8fd286b503d50cbae947699165d5529a2912efea5a07dbe19240a271aa9a4f161bb024f5aa112c0409d3b919735d50cf00fc5b3c9d1f5a7ed09ac05045c1b23f5e02a82277a792b921ef675e3e318b27bd27ee869dafd25f2690aa8b3fd5040d2985d4b9476ed0b8a6eecf9b0852270ea7288ec92e24184d845d608b81c52dfc0ec242711d443924c3c84148383a862e41ed8ab22fc85ec678edee00f61ac92a28728a2bfe3da566fb5f9dbff2edae13d1edbd3d5fed7dfab1ff85daf789a5c449f17e5c22102d269b648ae75a8a3a9a1bb57b419ccb5331ac7a7deb308d64c1dfe606f120269c7fedfd6f3a3b2d260119903d4269b63543a9349d89e4e20afa050fb87cc91585628456f8ba5dd056f9bc34a81f82d374adf278f3b925dbe0f22e4092984a022109127e694b14368fc2aae1feb00c67cf42b91e2e0501e6b2bee9a8699753ea4f58ca4eb0fb11bd32173fadf098eed0d0348d7fa0a881200faa25f3af847de7a42254214389db4565712c0720e2a5321b56dedd70785ecd3c18071df550a595b460539a153bb414143a7f46c2c78aa766bf2a88e32fb463a51ba8ac7dff808fac5ffd1a9698d4376ece76ec4fa996f07618fecbb57e1a55c9cc6e5a63143d323003e935243c49552f83975569a59306521a267d826a4911842526a32087692c3c45960f370b10052c4a8caa3d8872d8821c8f2387b701e0319f913cd0bfcb5a6d38eeef1d2b1c7aeb71e4c6ca0e3e1614795ed746c2dd5bd07de082baf478a8c7fec59e2060ba8c015f289545a25b9f278cb29324782a7b7df647af67dc5ac5f82e144b3162f757fed2150f42c59c1c8644ef7e9efab902907247cf63a1751974f0954274285111345b4e0d0e8553b7fbf0007d614e9a67f5563195b98cb77a3d08ed519c047e8b0660456d512dc1af58ee4a7f12380fd420f44a41c865ef2ee576488b08cb803b4a41cc878304e3434267aafe1668a62ef22c74c6298799dec09bb68dffe920ece825fcf710ca6ed805be2d947319646b850ee40e6f1aadc4aaaed89da8e7585c3a0687ecf2bf2d27a59d67f5db5b8555047a55d7aa87cf2244ccbd82f9f287d4c6fc61aeca969f0c17fc377444feab3b55aa7280ad4debaf8cdaae972a3a60b602b2f0fafea0d2afb55b06e884e02d86d90b433e5f7781fb3d182f792f81b9747f528b1dcde994ac72fdedf066f931ff4a5b05b57775632ec5ea6dc3560a6919ca82348903e5245a4da54aad05aaa9970043fbeeea3250e2e63d4ab0643b6c279e718c44a5dd283e4b1bb6ff876ddd0868b80da00bf872c522bb1e9835c1d8c9861ef5a455ac5c816adf43b5916951235de7ec61c200616a83af6f1cb18665688fcc957a2dd28ad911f1b5b82c96f89fec7f64d17dc115dab08d3878d50a1672feaf6dee4b9bd7101eb26cd67d1a136e9c18c97151730829be4211798241ce7ca15349a23bb0bf10996561e6dfdaec3571a80dbb6b7981a56abcb0abffb110137efdf5d9258f6b35d703312465ae947576be7f8dfef0cfee97b4666e1d8a2f326ddf32ccce7c114a827e65348461e7c2a66ded66fb89c0d95506033f5e9d6cb8a235f7beb2d49c7729d7c536f618ff95801359d44b1dc4fb14dc215e850aa20df734701a21ad89315f25ac620ec7f7a1aaca2deb1beebbcbbacf7c54df5b9ef38e4893e77bd5e285f02ce7b5b0c4477fe46d6b0187a768eb0a33d91b49a331632b28a9e164487e4838f24dba0528f1a722ce5210e343cd531bfcdbcd2936326e0b9881a555ad97bc19eeeb308e8aff73cc2fa8c11b96ae1b8c83fbaf7c5a49554ea71624fdd5ccc377b6af318375f33bf344af84d0240acd68584251e032bc143dd0c2796ae25c48151295c82c7a17d2e5aab9b7ef2d50c9eec62365ca71679a4f5045f5390d96e9018bc88a758c1dd2b4397e617dbd9dfd7cd632f84c1a7eec6ad2d20cc851eda9b3253d96befdc4ef45206ba7b9dbdb2b8a6e69c689c48aea9b126e620db0c588fd5c7e405c4b72d5c03c253a4ac150f7ffdc9cd69e7e606c5eaa8590c7a389ff1ed3de21201f664f01d20992f4747339d3a48524f3686356397881935be9afcc5e16850bb8a40b869c9f03ac7cc49cc02f190cec7b8ff8464d64eb3f374d04dbe8b3d3e0727a2a1850e5c2f7b5a16cdc5ed55592947c8d1dec392e56632946f386bc56d4fa3a09400824508125b48785436c5693f4e99e62e2ec62fcae44a9af8080c0063a6e9bc7e1ba9e377c36b329e77c0abbdcd03df5dbbc069badb9f517fbe06519f90ad6b3f82a4e63d206cb6fbc4f5fa15062be4808a3924269ed1784926abfeb82bfcb8f5f4a305a8a1a99a96d9f68ab8c38e70b5d3ea4ed706ecd7604acd52c60e854469132493e8bc14ec3a1668f974ebb5f2ab65630fb07a8f0a3c8745b122088884c0abba4885f963ea29cfb142f0f0385cc8420bdb1eac2c1a70549883fef1204989e667a710c07f37cebc8e2fd7ddb1a6ae98282bd4e82002857fa92d4458a6c6fb856ec13f83c31a3c6e57552aec15d30017eacd01fa3bcbc90dfcc756eda50c7019bb6f22052e36b64431886143b0636d47d15c69e1f4a40e392abb6d50d0288f34e963e9625fbb416836587d7b8171425e6472442f78941457c76ff131b432dc83cee60245c482f6eaa48812a6345344855dd2916468f9908c6857bc7eb05219fceb609ffa3c4acfc23907fd8185645b614a80f5bed03ee1c723bf9c7324f376f88536a78091de87df89c251c382efc893feb41afd17d02f17891e84defef493806f959e6b7bbf19f44c032a3ab3d79e6cfd4d602a2e00901f46ae10ef8d838495449118e8132dfc420c02be5f37ff72ee95601bccead77901176bc7ba0e2b8ff0e7eb66adccdfd7e123dafc93ac2aa0bd38e21b92fc609ddaf17b6ef8c02f26fdc8122a4c2a4b906e29429260c69800fe6b0b2193ad49f851c7130c9aac7196b9122df4024578f5cf8ec999a22f5569b254abfbdf552341c4b35c1a9955284d77d1d561b9a407e4ba227b760e88ddd4a93dfd6a5df8f3178931bec5690e826509e20725c79dcfb9d134bb8159b98bf1c976cf0e708a5da90fff176dd889d75f559f59bac3a07229c2fcd87b52a8c29a5e471d48c30a8e662c88a867fdbb26f57f88e428522391c5ab960a698c9357613c4efaa3c8c902eca73073f943434ba236135f38d8da35af0edfc90c09e7179ad38ef18b73365e38df872a3c2b8fbc6800f1dfbe8f3a2bafe36ec315777bb74c145844696cf877317ca4fd9ced86098dff5d5a0d9925b718e256ce2a63a7e450c7abc7da24a9d2e2ac169a3825129f84cb4b9dd5f42d5ff05f63ceb0142be4ffa432b6ea8d80006fd6a2f2e0b0b186f9a9eedc64d6ab1942252514fbaa6346d9180d6691494f37f4b6aeea118666f9c784b8cea8ef906e394ad4733f3bb2449504438740fa8fd10a97cd287bf86ddaf050bfef118c3da4dda7b0d16555378cc34c306608bb502844c2673ed4808c2d751dc21da4a48d48c095510d5a1330e48043cb1486f14af2b4f8659384219c6983d8254655079b991b185a01178eb81c29da857c604d4fff201ac94f13e4b9081bd9838eabc7e2dd078dbe84dc14ea767b32d96c9c9ebc0a6bd21ebc32b483ddec6cb85671acfa9f5487ebb7e6c589f3af4063244a785cefd3ae8584c50aba91c6fa1721f02b6ee230b17795c5c998431f8e088d2fffe1c5ea154403b82268b5df336a7f1823e96eb56b88314ee100f719d842760a0bc1ea47394ef4b1dea737a583a913b68aee961890e157471e0b39a0b1828ca4fef21af330c3c57e00b135075e845feb34589acd63ab1f6cada1252c9e0594180f0bd9b9a3465191758a151b7ec9091901d3d80136ca72ad88aaa3dbe110e7078efcb9c165408c4a73a11bcc80ae53a80b035d4018640a8e53b8e374b3f746df77a7398f00ffe98384146ad2e81fa85e1bc22c0b093d3c1c35b46c12777617d4c152ce73928af98592e66831f03604f003b621ad0e070704967ea91bb668631249ed97475c1eda6a42a8f6f8ae6476e165e25a72460680d0ed56bfcb3161885fbc770308790d39e1a6ccaf3057ae01de336fcd4bbde72c32b4a74a1b7ff0a0b76f32e88fe7a66b6f0fa360e144288656610552e564d8fa27c624ca3b71afac49945b4397235c20ceafaed87cdae23d1d859b7047f12db145c56a52433c90ef4555f1af0092d1eb32bf5b96eb11d4de6f81b430cc3665669d2789840c7276ba346a4b0708c9da56ca72cd549b85221c622ad5aa405305316559a8278ace913f689c06d68c63529b1ab8843a0378c2f6bd40ea6851c76ffe6ace0e9d2ebd39bcc8f878f8b72f68abc296e465db3a3f7b8892bea7291f92e82faea385c793ed013babb68d39f57074dc651d3f083eae28b26806d993f88dfe21bcde991da3efaf833329a3352422b5affcb652c618cbb8d154ffcbd69343f3516a02c626c61563c2a29bdd4b197027016eb7f60fd69396ad2a258ed63acdaa86c1a0bbd50ff1624e47dbc820bbc2169c17ccaddda93d93ab900971b1606341d9b2da21685fad153b9c711917834199b2608a5c1879f88d53e93cfd56747d3591c525cc506c5adb880c1767400ebaf0d6c68c5cd4ad81e9af454b565def6221625d8395a5c490715844bfc618c23a3e59c42909a12c2f18de4281ec6dc3ef1779b16de3664e56e130a0f99e64bc6c1330eca257a6dcc611e781d3d00b68bca10e8c67f33de54041f5238f154f849cb864744c4a71a803d0d5683d022a4ca80c5db7a25399b315f6cc5d10df07ce536c35f48e1c736a7cc2bfa839383f04cabd65ba6c5ad1de7a4e84a9051f11013650a96bb56189c36f14cf162795efedbf61b0a24f15986bd5ede461242573144a8d6d76c2d1532549f63c066e88556a74e05199a517a91ab689a2252a645ba457c8a13752950c07ada64a9264548f7e2a92aeab53b5d4161a1670defe510bfbcda516d7b5cef76ff8662b0dd046bba591f7d46c9405d7d05989d627438e02479c23f704c7a0ba4b597963ac0a3f523313d5f920b8ac61e24de79aec534b7e643ff4df321b64217e20128c88e83411a0eaeb6e6c264db61819ffcb0c0fe269d5aa6e7d648141e64163d2a0e5ccb44a2492e735ff839fc0911acded26b178713f1bb6c845a00416ec6e5f72eb9a1095fa70c91fb4b1a9928f39a055b339882904c9df5c3d4d4e2947eb1cb3ea56296654df6c77aaacd68500dbc45513f1cc41434c3cf485abd4e8b226fc479f22f40d3dba59086ddb9c7a2e0c813e8f1dd58504569ac9b60781ed0d4eb209575cbce5b31096745aa5e84e08f5ea02e543fcac4d37730d5b1475248ae0f78a63b0a48cffcaf802d8db5bb644327a775dce7bc28658bf8160ab4ddc4926dfab69e1925fd3a4234dbf817cc5c44dc25592722b7a75bc116ba94c32f82b36704baf2809fef5afdd894ca660ff2fba1fabecaaa54b3572369516ce608b2b27bef586ce90675834bcf07e5182ce2eb11bf3f19d94e24c2d229bc8a638c2c5af50f5ef770567b612e372ec730e9df6ab3b1c7aa6aec2f3ed5d0abf01b16a9d1feb7c6e913d13f977b828d08aacf510e97882b1a87bea91795a2b5d12069f7978174301cf64fa05ee524a568d9faa42d1446a65cabb1cf1d06a271d8a1a8b30d876845383433af1d31fee583e2d1112be3167dba6242fc0af1a5545da24b0eb3f7cd50e2fc21b9233c85373ab9ef14139a2938155438d0560cc9d3f16b6cd4b1bf8e932b147be879912a2bf957ebd98241d1937316475f15462b865b84501a80d0003f9258375437c50bb25aa9ee37c22a6a6c6ea067123844e56b79cb18bb58d2975f28698e47d0871180a99baa125bd3c864ffdd370dcdc4d9d235e5bc2dcfb4ba551e7b1f85ccde552d5e1c2ac63761ff4ce1dfb0ea052684f6c888644d00ff83569dbd285573eec71f8a8672916c82a470814f777dc27713b905eb06416d76c12bf81fe493aec8c6d7a89459afddc6d949ff95356de103c56cc144591a68255cb28a2eed3e624ddee61694c5561925040a37aa96ec4a27652f5a55deee5b486f861e05a347234e465410cee7d09bee7a1ea6fba484883735339a522c4be592564ac66f96d918d0e497f89f3540a7f8c8bb5e38d46f4f30fe9a0aa57f3b6b78ef32b1902dfd188a47e12efd47291ee774392e3c9b0e58f52be2e8671d17618d76629d4681270bc4052f4d20fbe45edba9909973ac9aefcbf972821bfe3d1afcb533e8de08654c1a01bd681c37ad1daac4493e31855687d8340199fac45f771bdecd7c85b21564e4f2b0aee0d70ea1182cc9da5e939b488f8ca2297da1583347c959b2248f3d61769aba21a9e6407a83699258f7df385f14917efd46e4208c81fa84e93d0bb9ddbfb68aa9417e45eb0fa4786b2c3e5b1c41fcc175fc719e588288dac7556d30caa72a027d733a3d41f4d19a9fc385a249ee2f6ccb817746b45b1122738028f34e71272c7a16093743e00786b36f32f28899bb81e63217bf4bdc70ec23e748b83f925843fae57081669fb804c53733fa999ab6e87cc4c1fffb83898ea5237e3ec8a561a3d02cf71a076c8a102ce1f9f61a5275f8d90df010ee4e093b96cb53753589472cffbd24c1128d7a9e85811fcad66d219deecaeb6f01b4fab9ff8b6c75ed1213d73b97b31a32390737ddd99cb2076d79c860be03d6e35f78b8fb59363f3a44503662dcb6ee7a634a087e18d451a2ac6e19a9179b020877c236368a1d1e2fa127ab932da6ad9fe8c2f61da8a356fbb37f2e6c86a147013720e294b960bf8ad6604448a44cfc9c00966b0020f6d2eff691fbbff9505d6fd3e48ffdb54928795d1fa831b95b67f7805fa6a19e4eb0dcd7b1c49b4530f4be07193c7e8bd271f7694968f16349f7532f4d2d697740d4fcb949c97d03128d274bbc52b5f28063fc735ca7f9403d51137390e7c0de3cb1ad83a2afa680f4fe2dd40ce4cb9add58d38a20eedfebd7fbe6a2dc59231feeda3fb523bb1869cc13c9e3c0028be94bcbe06c918140c8d71638580b8b5e06cb9cb8f24d32c225f53bd7909a9473bc03170485384e48f55b9ca1261fd8f6e6f3e44dc113205442fe8fde7610f1c67263df2150f7d31a71ca0b6c1b95d30f56f70b912249d86ab9615471711ce3805d1ede785e678e1039bcaa22d6de39092b7eedd716ad738cb313947e8ac39663221038b5711a76da558fe6f4dd4d59b78de9482a39a6bf4453c948f0237fa68fa83566ad294266e88ed2ac8ddbde41567c8854095c42e5aa943045f30f0c619011fcd87bd19b7302c5ae572b3e69a4610fc90e496d55285b652ff723b72ad55b6afe0f90598450caeb0bf0fb42a689c942a5cab1ce0547bad1e575bf29a1c063c8087dd5a8e9791f67f6789926ee2e2dbc853de026f37e3b584fed0fae0974cb5897597011a9b7b967001f4bdf712d804b814c901e27c9b33ffbc02690e1d25e1db8ebb1d437fe4aa2501952911b187d0f84470c359fe1e0900a96c25af8e291e71cf48fa14afca0ec0398657bb0119565ceef78f1baeb382d58e480492437a49f9ed0be97a43b5bdf416b82ef3d3f25e3b4010cfd494be23b0b942086c781cc59602353c0820a3884ae091bf72136303b1d4ad231963d378e17386992cd6044e96d3f1b44036f09577f5b7b2dfa5b523e380a7bc90cfd391576609d3e7bc2d8fb9a2eb84fa4b5881474a3647e6a51fb7c5919e1dede1b479bc157a3b3fe9d556f4b8c378dc23d082e0df126fa74ffb10baa4169c78065d9cd0e422d8718f006510248227f9dceb1756120e42813df5de46c3e0683b685b8405bdc363a10d989a565bf46aa3fe1576de2580747053ca840e5374a0bc1ad01c896fb90a5a1133a20e581b27d4e271aeb0ef7a713c605fe0b8e1d821b6b96797c199b09b412f480fa5162ce5295f4cbaa2c74be1a4b312c961d5048b35509cb0006be505b56b129719bd2c8a66d76922f8ca54aba66e4f311230373c72aca00dd63f8bd8befede5203ac4812193f478691b1e23de1edfdcc5b7c42fd784700d3b52120d70dbd7f130e7517795f5451e06ee746ba2a90809747169f24498b4ca64331fc0f4f5b0dea6568292b773caa8d01f76e3a0bd4426d0fa8e8459d3f4f2f4d4e391c86f629b408ee7ce13163f0a823810c62eed089e179d4a8737f7218b5dac38b79cfad5198a637eb0493ed81933fca9adaf046ab27eb018a1b58d28bb3a6dac4459b1587071304910f2f9ea91f65cb0a3dbc7cc4357ec2bab469649631e3cda618ed9f6c3e2751d4694806858660ce2f5406dce9a6d451773827d53b67264f38bc49c5c06e11406c2c34f26c0d362b314890e33d3588e40ec939c8a4acd117495001b184530fca9daa18174d28211f64d46b366f45157cba6683d54e028d9caed95963f0e9c4135760dc3f0d837292a38d00bacef4cda7b0ed7c52b0daebc5bc55dd7da4381b601cff3aea5a5c8c5daf74c11671f9044bf6f316b761aadaffb8523cba0963f8af1272732c65d07fd7d972586a85e739daa5d368f946712a3b6cb2f5fe908e58e57a25c69a518e25db751601701e185fc1383d582bff621c9e31b0e0016b9a54630ae51b863288dc448c332e17102cb79f2b2402ed1498838660e0a4a08f4eacfd363f81cf3275cd93a1f7a87fe6a9d2f0ff2f8b422cc7f09b19d99587d8d0011f002ca017b48e89c27bf4199683dbb95d6026a742cffcc9db1798eeb6edcef6f191e0fcf01e4e3d0e049ee8406d068ba6ae7baf0927b734e563e48f2d42bf6d5f9ebe6cdd95d65b473298e9633c86e2a134fd9ff8034be8836a4b4de46b1170487d5504130a979e2a4ef477e0b09e5ed13a556e813db0ef15f82f68769b800f93c6dbea2755c1416dcfedab1e2cbc6c4b2e5dd3391591dbcd268fc63802e492b344302f8fdce7834b80dd64e74a6d7e1da763b8b35a6c33964ca7742abb5454586dc60a54418df564a436fd34f011ea5f2371d2bb7230ec17507fb052eff41bb5cb07f7203cd43ee2e9218697efa8da41d21d10d922b6b773e148cc8758ab9d9196a220a1a37608d107e5c86d8740142d71ab6d83d82ca52bbe9656ecc3e53e210ba390fdada90eff88696c52c2fd76f1eac6c1dcd75cf57019c9b62a5d51490b565ae9354f2e70d38a84f546696ffa263383736b99951e37acce9be25e7f0f73b9dc37fab5bcf974bbb652bc373d781dc26bdfa04cec38d41eae85c93c15c483934473e931a2b8dcda808e6737b27ee05f537608f2bf991b9665290f8ce718fe2a625789843cd35512b5614ea3da1561320212a64d898862385d6ea27c09e4f6bc8f89c7b678c50b769453331d37cf8bb53d4d827de7799aab0af57dddb751b144950c5445b8b07374c22d840c9c23fc958f4948f1db9176ea845c657043396e417a664b3618e0b688caa828a95262d5204a682cba8ce8d6cfaa03010f8606b3251cc78fbe2240ab6b745a49b81c4eb25c3f5522a54cbf3758b2240409baea45b5c850f381a5c8e3c5e82aa74b9405d0c0409bc27d9949584c7f09b64c5d16db3636a7318e9baa871eb30ceb122dfda4e3038f66ddb811f804934e6ac7d59938784f3c9b1198d0fc6b0eedf65179feadebe8b60b43de33abfac8c241d7c2a69ec461b67f1ab8b11c599faa81a58281f9d9882a9b03f307e333baa5d10abe158b35307e2f63166d674676d1a2eb37802ee804d57a4e946d4a7853970561efd0c4d06bf427354fb8dbccdbd57c3ddd50ff01b331e8549fbc5a47b4d5a002efa0c4649cb3f0dfb66495573dbfbd7b4cef37613040560530197e3c210d303f32a4ab3b83af08d5101d54cce5596faca914dd06a5d08bcbaf2bb8bd737e2de76fe96327699428881f5e32e7c94873949d9fd2cb32cbbcfa640fa9404f344e824cf6b663834e08b6add8f2f2d111f39f07c4f01446fb69d7f12f6a3dd53788939c9d19bdf2519a8e4d20883570b3acba5e2755270ee99a5d93f56c2b9e2328857ef082c413d7e7410b1351f4177ee5cd9f95f6ccd094a920ea44e11c274754cc257c8a8a3a87ec1ea3e5a1e4e63211e41241a045ecef0dd349f4a81f0521aa615e262ee0e4576f915cae0eaec114dca45250186292d88afc9722dd5352ca439da267db8824e27a5489f074eb3465a0c70302fe8d9c717e7603732fcfb26083b86550d69f6e6ee78b902e8e375fab5b26d2d8ad47331ab7827ee9d557e0b25b5492119642a6dd2d5b606c16b06541243f60afd360f7902ad683808dc887290c0235bf4eb0e80e0a35c6f3cad89bb1b5c5085254dbcdc7bbb31e51f854c4e7c50da9b73d79e1225734a99e2afd2ca07e8e0fcaa9b8e458fceb38d5e9ed7d118aafc2918ad84aa118b05bad0101d37c6c7d54bd0446ea41caff863facf77d2d254199ea20669cb02a30ef5d29636ea28798c118555e3a54b9af3879aeef01277c405cb29ed04fc783c09475d37a177dd5e5c95c0080c2401bd8bb00f55db9a4e09fda2da986c6c008528a9e18001521866ac2ea9a7535eb12f4ac2df73467dab54449f86c52ec44ee26fb84b11d3ff54d97702642b13f2438844c8f946019437bee664f331d7b4411b1a0c7b04d942a35e6740610f40dfdc7af96ee46b3c2c6d3d9fe7cc0300a672964897a04f3501a648e97775d185d51f763a36fc5228fbcd62d6c14809cccf260af52928dd2cb92274e2c8d4002685fcf8351c54299e7e3d340753590d2530621f6913395e4c4e6817f16a0ff6c36c7c6a4a54f08c103fed66e5ee7272721c4d5491a413ca4e980c3ba35595703e3bae1a4b2e020a97ad0031fe44e219a99dfde70a7d6a8d0b488fb119cca89e2088b230c700e1e151c9a30fbc1fa1b52261e7317971930cc16996dadb3ff17ab9ae8b3dc11349ca0f8831a646f3ad75fc7c43d7bf54764f975a443d801ed1d69d6e502d69447c5fd2e90e2b895e384eb12a09cb2d52f7e99ef7e2c61239ebf23ac6c8949b384e01ce65d15ebe54eb4d488443885adbf12b281e92e50027f81e1d7ed0896fdd6fda8b9b26f903f1fa0fb2ebe67c32285f05c9d5862cc5cd809176dcf8e0bb282e94acfa5a3d9c59c2aa9fd6f8c01909d08336c0be5c2b641f590a0c8e238410789050076e7f79c48f6ef3605d30e8f6916cc5146f86a08b0fa3fe9b8d5d69f6881fe06577caf5c191ef65438451c0535650f3707147aecee1501a1c3ccc68c1a218eb0c7628c8939145340a7313415b991f3810448663ad269848214be3aa625c00e801adbe1512eed43f043abd2a4992c17147f356d0081009b1821741f0545616a5557c6d867490e77a24940381770832508a043bfcca6364ae6ff573f922b472b84ce26581196ae29d777c231305a8909d46a70ac28a737e27dce20cd34289272755e326273cea4e4a9cb0387923c67fef39a9eef474818aee3297cd689c736c2491d2d9f587b4f9c90f4537eeb68e1c3ccd6ef2d9c5a3acd9b27aaddb671cc2b2811aa8c436808b3a3b50721e93b5aaa4d70cfaeb19614466478673d249cd30796197ce380d5a6198eb2d51e88bc58333de530828cc2be887f0451c1a52bfbf075171fc74df10ab9500e535ceb40ea64694a0c4e9aeb7fb32c0559af90bc13644cba2b02570de0c0bd55d0de73818927337b818b778bb9a4aaa491fb2ef5a5b397491611d05e8d3d2ef0505991b818b28e85f9ae105c6b66ab6eda8726b11387c5cd4abfeaea8fc910101fe168532e601f6490112feb284ee90dae1892131a348ac070f59f22fb3ff3b07b5f269c9426302bc4a2922f229ddf8ac58f914ebb3dbaf3349a3ca36ae02bcb2e74969e5aae5b1eaafecbfe19985b219490263970aa5eb876bdfa4fa5ab5a856c4841733b4a886e89e048230f634402dbc796496e10aff7be1222777e93a416523ac6c36114c953648316885f4409a31f92c1bcf1ec60ae8d2f7414ed8077523c198fbd285e9a3163d50d4e972c301d400b5eb73b5cf03c8dfeddcc9e0781671d8a093f0e45a40d7f5dff7984decc15fb298805b105276a4fb0eb75e36dc20fca75e5f10152f1458cd77ccdcc7605d7bb3c85453723137cc5321830e1a2646a2b7595687f11f64f0227c9f2fc8937e8a218ac0db55da223fa0df40872000d72e6f27be9ccc92e8889c33cde8daddc1864d395eafb200bfa54451e18913eb6306d2d1da4fc4ebfde6bc6941556ce28134a737f46652fc673115bafdf4317bd94bc4aa4938ae234d177a36d3c5eb0e4f2b683ebe4d59358264056270cf6548dac3e1bec19d536d87c041ee9ea2110ef6ec21392a5d32e417a0b12c11563c6bab02ce83264a95aeb4736bdadf130997009cb7faadde51a9d9d48aa10c727c46f7e5b07b96b83d9d93342dbaa8be52b5b3a4ac1e73dbdfb02519a8ce5934c40c57741c8c66b0a2c0024e7520858410c4a5558268af3066e5507918a01fcfc495bcad91b8244d80c381c86af510c6a50c0c20092506fa397999ca074518a42987d67cacbaa2b4e0e40ae1522b9de3cd9d02f7e73999d9ec3e2ac9e6c5a3b0346db6301d3c30d6c8492e1c50c611a263c91a7dfd1a61b7cb1e307fa478a2c3b45518eaab9f6c91407e9d7f41fb76ddc73e8cfc87f9bfefd2773be7b96d6d5b81e7b85a884800b162555081eb6bf2f03bcacdab6e5250ca5eac19134afebc7bdf3bfbdd7294c830046ca55fc91f2f68eeef9ef1ccdb3a365cfefe66ecf597b1efeebec83942155f9ed8f35c1f91ebbbaa9eafe4308be905f1fb19cdaeb76e1b61e93fa5202b2d30a51435c2236c65caf447e982db873651565fcac7ecccbcd2d6e5fd3d6615bcfe19f5c919c7da38bfea1ca2d5f1db0674c330696bbbfd4be4fbc69beef6f3c2aa00e803b2b1d881d989a00b3187909bf6599258cc86be287c5d271581f5e8fac6de11381e55e6401a5ecf53e1973abfcae291b92ae2fdc3919569c9780a640909262b41cc33dc62585bb16ac60b0a9aa57a9ff05858eaa28d8a500e3268ecb8bf79fc8bfd33ca2a4982b61cc9244269100f4412f541ec3c40c2105d3fb68a302f6c8f4aebb40f8c869e0ff8afd53ae14bd5f74174eea2d797aaa84b91e39a0095ee38adf7dd2931b51310071f605ae657d155176bfaed310ce9f8b8931ad5dce2d41f1978263b3803a94d47d7f9ad25739a6fd3f52bc861afb6d5762e92db317f7b08a0fb193ca1c515cdf2f83a6b3d007bb86b11ee91b12a6421763be3c774dfe7ec9f042e62cfb9d4fcd6da52894289b8f1897a2cf08d5d8b53e7457a04f0894d1de6d05a4531ea3625da7bdbd9251a71e6b7314a16163ffb62004b72eb8322d55ad8a3a9b91a5c780017729f6a89943b952cd232837c683b3c1c020b342ea6921f5aab4f87a5a6ffcf1541d81879599a0c0e3dbe98d4dce8564df2910dcd5d491dd12687166de1a43565c79b4278226ab6c61169267302df9a4d7b18d8f8ebdd910f2ed56fbef8b8895c7990991653f72eca3e2f505c975cc0d77a53723bb51a4c3bab093839b061e4e88973c853d1249ca694e75b4d327320a135ea17fb51a110affdd0505ff93e7a2aced341a5cc1d3c04fcdb6bc13e7e59b9985e7a3919a21fef0ca2706b832013bb627782f0cb3cba7791a1c8b03572ef4982cd89d7c8d35fb8147b82ba4af88d0d53e19957ae5fa41347396e55ca80aa4e4dbed40c82f1b5d755cdcb1f4dc6de1f308443ff9f1269439548f4865ec7d762e4963961f6c5a17cb83069e3970cc8cc8c6cf0dad76efc661d79b42b23d82609e227cfb278ad0110ca536bc5f3665d76ebcc5a0f10161058f7a172306baf62a71c0a6fa1a2d8e89e6cf8a8e6da96aea0c121f9a3c90845b71bec1aafeab7dd34928f193744f03f5b883b800dd2a0ca79385ee02e73111159172a510206181ddc313270db4cd90188245a6cfbd4573c165eea1ad64206c38c95b285f2f5e806388b0e1f1ba64320261f1a09afb753bbd74838a54cc8572757cd5b86ae843159bd89db4b0474f8ff6713cc4d65d917be3ea6f357b497a19e3b67b8e9914cc53f50917433c1a08f2e060034b00f407367aea56bbab122da6994ab44585c446d58f5b8e11d8d845ded46b43f288c34978b09255cce1ba9441d1e02de432e2ba46e7799dd4897c3f5fbf06793d4adf1b74dbb711cf2099495e2aa382ed29b1da8528d38521b7de8a6835e991cbb60911b89568c1b0a6efdbe0a5871b9e73fcf90e1980c9a7fa31d9f41b52897fda9b96d9ec5f3592864089a52d473d5726fb9a39ba408626a42ee3695774907e1a004823f0d7e7e45f82c7e1e9d4b1c9372462018455cae340b5b45c76a817b8e2307261a140a2e492e99003d02abbb4d06d22d3e6a3d770fbb1a9330221de5800868b2086d030feb7e530b025d17f5df7c931443998f2eb99d10ae9d60bbc4bacad5e1b875af1797bd572fb5a7a87c7fcedf96514c82ee6d0421a7992185f3d4564d71ba3b15e04b4abdbd14e60eb5be63d8f146c09820193fd2d03822a504e51c05107133632839d2d14587d919f28362efad61f1a95efa9859be6f3367ba4ff469c2e0583012c97f18b7d55bb64067a8d46136806cd76c43294e406255627ad7dc1c377e8c9628378334f6dd60241b9462baedc5cc571042303cb82205df0a072dd9fbcde460151a009b46feeea6e5fa33a2f32aeab78859a5e6776e2ec6338f1ec25e948fbb6a979f72fe68b567a99b1d417ffd15b395390affea3facc8902e63383cc8324619185b27c40d41463e3ae7921fa1895af2e3575054e2695508a661035b1c14de6ee2a1f5e960d41579d7211501712974a8416809520432fe09f7efc26d38dcb2d4572bae78888d55aa54d93e947c7d52bf0d0d14815991086c8cbbe03e1b9a79992a81bfb0279887f0601df93494639f3b2436f55b2080185de13c5481c1f73e3b166df76e9386e22cfe8a06fef536260b31effeea3bb6e9b4060c1d543f18cf7810196e77cb066ad324c7c22c0fb8be056e4de1b2693fc9346c1d2bd6c774aa2803ce9f25f6db6384a6c09c3f95a7ad087bea14eea1ec59b5641c3add4ff8fbc034234f426cc2ed1132a4ebd7125c92092bf05e0182d1e7e129b1b619c173dc272b5672e56d1a7b4f3ae47948ad38a9255563f7dff4b87a1d9fcb52a6bd7eaa9ab716d74da66516f67825fd6b1b5daa8131db746548059d7c9659748f8b121a736e8b418a7ebd3bcc4f12c11157a127b92bbed927bdc30c9ab6213b1960f6cf09430f8f888a5ef00ea4296c2440ef051dfdd668477a20cc3913fe1e6e3373324ac11e20ad2a1b8ce4883a544dcf59d3d6d0c2a73333523a9f57263919fab62ae3281547762157e1f709d6d3d6fc019258fce3759fc28ad7222d0352130ded97e494c52988d2d6eb59f28cc604e059d3ca10171dd3086291b465d79275597896382ab0c771b98ed35aa280beb4d32878e938b54553e47f51ed86f22eeded670f8474a5dff10a96facefcd1914a44061bc9613f3167298f5c0efaf7a3a8196f5ce8f160f27775b83dc304aac97a0072ef9eaa0fe8db70c02f2d78921b07acd49958f6a8b71bd391f8300d81079eb982f8f229614a860dd776e5bbcca3242cea3c5e52d10a87cc5097f9a26bb9c81b27ce6b6fbdd583b919c9ee89c031139f119be807fa34be8aedef6eb101dc62d3b526bb510195b8b457a4c6987b47159d179d588fbc2a1a8bb984066eddc2fc94f2c53f4cfbb483fcbbf7cf777c80a23d1f30c24e10dd9fcb8401ae6e1494e5fa18b90939e6a90aa8c3e618350889bb0b9b907da82e4beb109f30eb8c94e328c5ade1a658172c693ab4888a5470c59f22f953482ba2fd07adb5a46df8f91910cba34dc1fdadc1271edd8827af5e6090d63f958216d48570d4b4cc12ddf5d1200cb24e3a449f4b1c38dcc8105c83c8433179e979d7ac6c59134170b37c42593838513c5c05254d9127105840cb749c39a22b3e5b0080acbf5e2c5b81e80744336f4dcc4aebbedd5274b90ebbe3396fb3113897949b8bd3ea17b74d30a458fe147cbe53b87740c49ecace13cc3a679f21479fb2d136487a619fc438741f186ae496948a88e861076d581625554d5fb4dddff9269811bcd58b1b92644ef97e83a61b8a48f79a14b435a51fcd44b39ae3fe94f9f8fc706fe7960c3f96d55971f3e35d3bd9f86f7f811b47a73b5d1904e03249fbe99f762be1679807bf507e9e1b8e57a1d56c7322ebce97ce8e2e938c042d261b454a498156ba0442ad80d00bb5e514e30ba50da063793acf5299e9a7ebadcd40573bbb1bd68c54851c5192c8e67efc992cb85b451b5a520725da699828f0ae21f6b197a09621c12bca34be9a8e3933dbadc589306564b22bc2e867487bfd840b188b2c2b1eaf600a67f5beaff2d1b83eb798e4db8d1fe57ded3554365f52010816948eec7a61ed7a47a39f3db46ec0cbbf49214fa101a877c039598ea0f1c2940313ffe92cb78e1546a68877f6be960d4ff08c114b9ae1cf7e565ccac103094e58b85cffc7455eab53015e809f2d3ad95b0cde27b0952e766a62f99edd0d069f16ce05ceb3921b32886e2c55949c9e0a4e68aed79ebc883579d3172ee32858c73365bfd9bfea2907180471162bedd4dbe82bdb42b5c90814c1734e42cb4a683ebd094852ec0bface78999ae44611e18c15e6c349910f753c1eb078ff16f5e2a65bb4bc924200b621f7b877169df30003dc4a20788cae6221f50b6b4167752234c9ef64ee7c2490e9521f9248b28f2effbb806f8b1c4f83801593225f3fabba095e18472eb72b04ea9da9a6e262d25c76061503ef7db222538d0fa84e9caee1a005cf4fc6b4b26614c81249ffde3955be3108cbad3acbff358c4f76682635dd4284055d7cd74c506570f94a9efc2d090dee520171b225b98b39f3b20c992c8df9e4ba5b5c834b530815520becc61d6fa83658978087f0b26858208555ad9f268e48daf8fb463f215ca9c49a68c9612db7156b08b07eccb4a907468adeed4ffc006217ffa50630cbf9c4d9a3897e6864e3e99997407f1a57d9de8228ede138b29d2958e17e18471e7138ddff3a2b86c21e69dd45cdc94414a2dab30cb2703b8556fd6f3e70ba851c8acc622f0deebde5d087b895f64007c152d7987d2eeba49a044d4849aed1c756d59c736c0c3a096384354c9effab943020cf535a7889d5911811ca16fe26d602ad5a9185436ceca847627e19495144f9c040df87cfd758457b44951e2e0e640f032d323024acab208e2f3a6fa5400e390ee6eac23c5437203ab501ff17aabcadb329f55ac1de86457cb567a10efc265e43b8ff10b0799ff045fcdb7a42572cddd8ab4a9c7827472cee65e99066824b52b42df6708c13628d65bf19b17ce2fd620420c5fab5a028c7510e5b052619d1ae376117c3823b158af66106879c6b9b6ab121fad7a212bcb96a644a4f3d9e646c38e56f5a9cfda294aca518d91a7000aa5312ddf86078e2fe88cd36003d460f0aad718d46dd76afb1a712d2c6d347ffc77d248be336440ab10be5180d951ee9b21c658b83c00af18d6304acb780fd48cc56d7a0732ec9da7277100fd7d86db8154b63a3b5dbfbfd9784f9d8fbfa26c3efc5ae8ff66ad0f65e5cbe1902a16f48e707cc9a072bde8a1412cc9b5b834c8d08bf69bc6c61e3fd74d3b9ba1be524c364f3ba9dcc3d14d764d415f80e94defdec67460e2237e09d3654a4348912d8c3ea99aeed2e3af50a090ac86851eb3641ac983d28641417fa756fa496437fdcd7d04717d899f0e49c68f4913f68614ab57618813d82722bacba2a0b2a3349dd8e14d3d1ebb6a566071d8556b1319e25e814cb739e5c03682666d4c20553f038645e4812542cf3079413a88fbb5a9ec5d3009b30e56d0664590eb52942f00aad556b6411f42593eb5f59a9c2177f3d28431cd1136395da074a0aff7b98aaa5a804268c9eb17373a8a81b4cc45f6d0a35eb7c1d21ba09c31a6b7280bb5f612f5596540ebe58fe0231d0d77c142804d59422b836104f7e0a56bbc47258bcdc6ac2c394cf9286ea07a2e9b2c10e050d8badaebdab38344ca4a687f25146aa9f58923b359205a403d503b1b2d07690cfd6cf5b671b0880179e4ea3f2794fa05e2a44a500dc574b1ae0462048e1860968ffc10886394e1ec3673ffffbb3273f9401629be4f476abaec54a0e9904ffd1b3f5f7fb79de2ba3e821a5c9223257fa89050f82ba6ae807a714ab7aa24ee86819a3d173e0a901566054b9b8519a68cff2763b9a5599b98153d8f4416f1d9daa938836cd232dac659815dbc67f7faed3ef8f123102359e3e586ac95a8bed1684d1cb24a2b83b4af35433d0b1c0a438d9137e0047e14e636c7743c81c00c7a9a2a60674159fa5fded2af3948cfd5b5c4e701798af03b346ff60921eccc6a2f29a9f17d1829ae02b34c911825b91e8026d08a3706e3e829ea6604018e8031ad32f36ebea10558d3ec0875be3ac90b667baa48f390ca42fba1dff05fc80e88c4dc1f2282f91f41a58089a1920e6fd60751aca2a214deaa1d1774822b8011658ff282fda630a8f486f94d31b201aa779d97c8e43b8c58768de4d1b5803254749db9a35e9553355ff5a2a37cf2f8fe61a46b941f30f9456d2ad64793cecd9009223f8fd0a66940cee1045c835c4c5868ee5da5a9d4c13b45f657be97542ea7f4ab39b408d4d51a2ad2fa583ad94cc2f6e2b1a8cfc27e824e403273929b53d62acf20d10df16dac8b4859d8861f9d3d87eddb85d356c98914a116d910fea39e00fa46f0c29fffd32646b956d64e48a317486373abc1ca1a73496c1bb6f54a269e999883ed5b6d68130039d3972fab0c245fd5de9dcfb2c4138fd850c3825b6d3c4a0c8bc3c9f3e74df9113f7bc611a2f22d0794711f272fd42cf6d9bba9c92574822d4b8eddea2d05b36070e451aad887efdba63dafb47e68930e27cc6432e9a9fc5aaa87de3ccbad9cf88677df4d40a66b72e37208a982867251cee4f4bbc73a24eeba30d31674420359d657626b8674f5e7b5c516a6af51a70bcd91f7d0e148ec8a94f561ea77471a3ab7e7415be788fd58524137b518c9df4c1fb9f9d528ade33eb6d00cfce4b07a1860a70f170e468c92c9864cb855720f7d73b6fda28fd9f8ac1c93da7c5faff8c9ca3ed396433deffba6c5593c0178ff859e7a928a657cca9460f6d62478c80ef8bea67c4e427fceec253dbd518569327ca1b95b2839075b4792520441c7b6934e5e05766ce61209672482fe1e41ee51291ee7b35f0dd1c4b3a3f270856fb5ffa9bf230b069413850b810ca53f2bd77897049115b1b091a61d2c2e07fdb771729895ba7c874b43122769f46340ebcbf61574327e5be6335d66b273da02e3969085a75f09f75b5c79dbc5d41d7914adc3da4c840444edda24a287adc3934fb3b1de927eade5bd4940dea180e3720f8a1cfb70a8b07429a27b59e9bc6c415f31ca6664f664be5a05e93c3b205633d659c1bb64daccbabfaee67f8adef7bf0d6f40320193897a1d3782442d5f8aa99680af63f2a43081c8ba23dae5f86e07a2d10643cf8e7fc549c82e17a4c427a683cf21d44c74b508efc6151f17e36d67f0cd734466bda0ae27f70ccc2a66e7501719f9a8adf21eeb2bd0126c9122af1f178e9d7bd943c012efc01fcf6bae57a0ed1d9cf5bfab8de5e2a895f17d22edc567ffa70d5ac0f9e28577f8e78599d9dc9c5c761428ac2fa0a3d7965c41d1d816ed2e69e4caa2f159baac300c614fd09eaf2c84fc09ababf6c4834c5c9122b337628320e3dfdf38906c61561c51935b2ae8f625220beeb5bdb77b5db2a7950b73499c2b32b638b72214276b28b3ce6f7b47b7434a5c6d63c0264c14351b2216d295458e93e617de5852a6404afb6a3e670f75cc8557e90a2ec988843eb865d00d9686001abb408c2b87953d0ade9a742b20e92a74e08efa88ef1cd50d73aa0d5fc834ea3013c8b0902e5f8bb0b4cbaef70f4439acecdcbf00cbe8b1ffa5279e65835de38d6384968180c6aea36c955deac073c512c803ab064155512fb8ace0a218d9c08205a125fc3e602f1db3138665abe0814bd44a1dc7c096ae8fdfa85e276c712384df7c6fc2f9293dde8f437fa12bcdb53e017046b729eb4922b7aad6b5e7eb03bd548396e289ca14feab394f900c698297a3e2111a550be73aa2a2711880854bc35e061d653340c3788d7748c213fb213caca527bff0e40d9094f24267c95bfd560210096440407dc7b8f1cfdbbb9f3d45921c2c0820c48a8c3a784eb394d68f42406d424febe72aa891cc89020097a6cb3de72c6da76625e4b9087e855810e300362b90328d21a01dfb245f158e4245f038882f198f7cd460fec3374df8b9c9951b5eebe907e75846a2e696d9bab9cdaebfa571e769f5c052c8582f42356496e0fe30679b2f520220dd96413bbc37ddea441ac2483ca9fc279944bd398dedf4d1492c1463841aaff5dae0c4cae78a2552acc35f3e449fedbec8f31b20250bacb1fc2e9437c3ec1606b30b6cf5d4daf08a8d8b555d68c9665d49198cbebaf1b3c6fc6d040684b2fa64a1584eb02d2cd5a8bedda87e6b6edf82a8a8133645d740dee7db4ea26c31427093fcaf3e6b97ddb38652c3380674a34ed90874fae1af92bc2eb93e7715903300a291045f4cca31f082ed3c059f95f3f1393affdaf441a90a3fddca9cc6b5473941b1f97e13ff413e434ff570f865724d816f042ebb1a62092a01f579c33d9b8db2e141611988dc7c7a6e82c4c9beb5e507cc5cd9e775ab6b7f1b3b921825a8908b16cc250e932972f4e4cbffc79c36ebb1b7469718003ca6f94717fe91fd0bfe4b1687855c70d1308241a5f61c71c6ca864f8349530a344204af378b63a3f5e431cc5d79960adc0dd7e7ac3f341f80c76debf738a2cb40516bdac919b8ad5dfc901854de4a28ac5cebe90dcd4460581829ec1e678aa13819c72bd03781588e598ddb7e9b0d5e743f9f93f3ce4ffef0ffb2483d46840bc9a63838c63d3d50590424efc1cafefc2bf1a8764f3ba2f87037a93c87e477f282eea4c406105ee7fa97b3c2395211239c0d6b66c0acfd3fd9aea0dc9a2143ba8ca13c6a7fec059a5604c101f9b010fd7422aa06c3685ebfe3e5b3b64e4aa097a64c30bcf10ed1484991fe1c88a7a50e62a1eaf06a2b1e1033db9c9fc5796c9d06b9538719633a76bad093a7c2636725d3a15bcdaf0fdd44bd1596effb2b599463e8fc5820ff54c0364a2e5db470724b373104f301c2d6bf6586b097196ec08c1a839904b265d0dba4f6925d7a7b1b2b11caa0709d6f57cce1ef9194f4f395efc3a9fdb9309eb50b0a0ab3afcc6b8a22bb1da5c3de00dbb453fe76910dc36a108673e872bc862f56c0be4d2e93f3d68aeeea19a4baeeb6f7ea9c868dda7d6b28c4c29765a434e8c9c312243a86fd41583208c39dd33945eb427d23e0f2dcc4a68429c86cc627796800bbb61f45f4d64e6a0fb9beec8e58ee7caee8ad232d3a438dd6370e3f3a8d398660172e8498da7586ca0471be727106a9eda2d8802d611917789cb3922467485d5d07b9ce2abdd5dc653bc9adeb723ab97e051974106868b3597ec584b38ab44ba98f0a957006b99ffae394b9d971cfed6d081498583a94967e1561ef4af8a90736ecad65de54049113d1e4537056003a47988662559907fd85e77e3ca4e52446ca6365fc354ddccd6be274aceeba71d73841c7212558c5424fc946c8e008594e26a540bcc32d4c7b5e7b2975d3843e1020b8ff44ef08d12e4dcc13e8a43e914b5e16e4effd2a10594b1f4a96d55c89178baaeda3d4582d6b3bc0ca4ae1da25d4f1b908c98a6e5e685e3772798be2b0b640fa1859f3b7741f2a25fa379fdbb3955db5376644c3bdef45ec52316080ecc2d866af966ab183685df83d4722f5d8a1edc39054d58670b04de95177d76becf90db92cddc8dc6b00f1f9d6944895f04dd6c0beef6a0ba4dbef1cd71876cf0695931ac955a7d2ce8d747d6cdb7e74493cb780fa65605a6ddf096a6b404f6b6242f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e42f444a5a89f32b24698607d51178c74d4c918a578e2f1296de66c81f0d57aecea998e746bedc1463cbdb2c1b151027d107888a93bccf4cde8b0ded8da4e956bf73bb583aa1fe8318a2e0c5e7514c38dd2a4ab27dacb12ff26d474d0884ec53c5ce2c522787c5044b273fd68e862eb33d56d662533e6a41d219445d9168354d71582a40e243274cb946c875b60ef27885b72cf0bd5791497f82eff21e902fecca2fe56ecb13535a09f1fd8ae298511a96a14a2ca896ded75c973e09605227ca1ec038acb1aba127ac820b5a7ef26fca6e34de58d4ef24ade9c413aa6a73ca06d26cc8bc0c26598b382e0c914f624253d20ee0b45f845b79ea8f47d1dcb18876898e98b15638986e30c0975af6ab2ff62575dad258ab14f75c3f7068c2117863e67b1832fdc1506968b7fdac79bb838f911dee5c20be68ae274d9f83d8d4c8e7493d6aadf6b7de41058bebc10f0ad0b5adf429625ebdac77a649b8a1aff6e92ee0976aa4c0d654eaa6ce0021883ebc2d8064eb0286c3a55e0ac5bee5540134aa8ec38323d6261da50d586bbafb457b85b8b141b7ec5e19133ac1d0aecef686574e2d292a17e00bd9d2b3ee7653bc55b6893ee86239fc25173bf138995b960a8d5e478a8e4d2d5de2dbe8f4e9f890c7ba78a3382b9b9f8b845551d3b1e2810d5c70021b9e78b75089f83408baab2e1927f8e2c6c311ccc84f32d61ed001d2f4fceb883a2b785f0781490b69011f769663e63e90f9bdebafab81133e3ae7d2a88983f8aa9b040c13b9e54acb907e6aaa668119d8b86b880af40c722358cc6ecf9e545d7b0a67d2c626e3c46e8505cb07ac740c6c38fb55964cf9f37194c91649812ed22a4ac1dc2b3210ef58b3ff49459edbf98e469d24ad4d893fd9f762e48c66bce2557fbf06c1ea07735d49672809e074afcb998a65fb579371de9c5e286e0263d00b9abc68675747b61157a92abaa6e5110169fb30f0ea3bd9118e34c58cebcb784ac0efbde1ec9ae5422776b3eee9031ce6a695f43e701e549a6f04e6c6ab2745c788434abdc1659cedb7fe597959b096ca23b6811ec8588af99572e9d9dfd04d8c2f8d5ebb2dc9b246f80db36624357472a0c8edff9fe0ac45e3eb88b4b4769818d7dd614385bf90c52dc5dbad475c6c0a70b9b6b152889ce08ae88423f2833009f0563ecf3612587092cbdc753f340a5851d22137e908bc9ade1e9081cac13f8dc18ac7e0eb86b20c129246ce490dfb7d97ae066cffd68f5e32c012dae93e39e9761513d8f64d558d1b904ee2ee198cb5a31d0faeecf1797d615d63befeee7643dece90d562f50fdd808c104bb79773e93271213770e145a56b653093c5c72ea41bcf2e73418b0ae9099f1048a20d9a541130691c8af3969e5686d90f4eaa1108ff7f5461acedf87f8cd0dde50a33330f390178c8b000f1a84ecedef4dfc6f806eaf75adf2968ac615df010aa027f1ca967479bef7137d68bdfa28c80701449393496653a9b60008b93fa31a33bccecc69bf2c9eee72b80d7f078c2ef629a39bb4520ad0420beb681f956e5551d3e0a5dcd75dd5e16ad9c0f4b56f3e9e9779b2f6cb43e9130d160a6ce8b66bb3fbe7b6b330f1085ed2578aa4dfcd8c665d4ea9a8231188c63163942a1630e55a2751159250f4ea9454779eb3d46a3b52850dc299414d9c1624a5403980e43c3d30f772bd6d78bf00ee7cdde5d1784780a1828cc32e38831607820ad5a89a29a87ca2ab99d6cd2fc61be74394a76df647ec0385c047b00fed469ecf9f8971bdbd2dcdec585cf85e18f118f6025b0258da6fc21db0b53ad4a15c5e1340daec9c9649a2ce7a6e2aa3d202307be6a1da7b6c7404a434866bf24225f99d0842b51cf5e0b6f08d5a03aaece376e16f387479a88019cbe1747da2f300a1be882f3111b6d1fb9cbdfae5b2d9ef8429b31378eeed06bdd5b9afcf7c2fac79d48cdfd5e9dd6cbf284e55cf3ef8e22b5f63b0d2bad664026aacac41ed8f1c9e6ce02f96bfe496117eabc1190b38ca980d7cdd20c5277e14b40eb30027f548b9d0ffb7e0778eea5a1f9766bcf85c00bd8ff669ea7a616cd0f4aa5113822935bf845be423e819403c9cb27be889f11f2a1297d7efbfa4bd021824c8dfd9ac2806c478e59e5c9a7dc7948de39862e62eae3874ba478c57c269a5278b2eed9278d2de68443ef44fba7d8ae68cfd66f52a42b7e444365e37dc57ef98f613daa942a5a9ea4e2480380168c27f7a96babdfa7f039764a259c4769a3f5560d0f8aa825354feead38ff1c376388cba5fe6f4860be9e44cb40392ec6d88da655f33373e60c97d9fc44b968492b603edd7392dda35d6d18b7589da78112e820c7dab3b1e208de2614d058546de4526dea593bfe70dc3bd15b3fdd4d897793902116e88e9b9a56e48d1f8bf57b9cdb109fb015592de63bec01423aa1a52b7f967836272b275b0c411896f88323720513bfef363281293be99b87859ae78d6843ded2160823ba4647653ad54ffe1015f1e012224a6d9143d360b918949e4c879d42413d361186e5c1fc838aee61d6a8876e0515b4e7be69adbe290e6087a1d55f2b27e418d43a4e0dda48be2b0fe79ef605c1991d78693ece080080be68922b15870413a7d27dad591deb4bdd64feb66ff9ea9c8fd454048310b57db36a3e60f2cd8c1e7ff4b277861bf75c0dbd7a58975a8958f80958fb96c126a430ad29242c5009b704f71bdfe4a26103ebea98a7377a77c93e8e8bb8c1799d8b97ec69dae82fa5427101c86f02e8987666d128e59a6228d6aad804c1df1d00cba5abb1c86c26bf7ffff06ee387cb1589eda22468bf56af7208f185e89a86039f2a776271098d94ad4eaebc82a10b1ac86e1a866ea74abb4349081462ea8d551f4834fbcaf347abaffe3af50a3827f6894dd3297a95adbdd4404f74bea25bc1c8a5495a680625196d8088a0a03d702cfcf9d7819aac7e85f9a7e61b99085203c4cdce282bac2d488faeb29b2cb274c86c0bf0fc770e8c85ba17330a67382363fb3152e6cb9b18831dd4bce2b80c67c7af3caed97a05c9d868017dfa1659b01e60f908029da4d3120d875dd907e2ddf07d6137754b165ddb063169c8d3e65ccbdb6719b6bdbca62f2e5746d2c1e040ed84d739aee242726b817e3e8b8b4ea9ecf35a8bb2da38287da1ec4f1d312ca5767fcf9102b23cee037f715aa442237b4d7e43bcd93b7b80a47d7489a8dfe8fedfae19380f5823686c750b47e938991e64233bfbf051a3ee0490f16740f8bbb89cd19fa83975326d236a067563a78ce707d0f4f5ee8a9dfbdc660295669dedcccc275fbc2cafe08190d90c3188cd82f22367c3e7c7bc393031279f39a826020cc62e8e5e2e9b5527b61d7cc30b594a9dd87342fe0e22e5f9ba165d7c5d13310d1fbde6f2165ccac898771b87c64f7572fa43718d10b95b25ebe946c4ea87a427676b21c7eb9ce7b766b22e6c7344de5254b1dc3d8cf87624a21138fb8ea04109f4a18f55dd1aab315f0a1066297a2e2faf54de860e8bf28f15d6f09ea6d23668ff7fcbec43fa8c225dc3ab2eee481df1688048852c8a011da21c750dd3c6c1c4359a2fbbbe02b647ba88ea8e11908f59cc8d71ca843131ee9a1f3f870b2a85506d36d233cac88696bdaba3e806f9a90973f10c0e5c58fcef79f07e612fbade1c56035695ded17d5bb7df8eec9a0938967eeb5c9f94faed4dffd5fe7df1bc19a52daabe2428f7831f8663be421b8897b68fcc1cd6664b09448136b73dceaf95d0bf7c0878384a1e2c882b104c0583eb211de6441b362f062981baf12e9758fe045d8c26cf2bd7c595b4e95300d9220e0d9b8ee6463bbafb730d3704d8a4e3ffb0edbcf8da5e5a89a6cc19f3d926d8d13f79986c80f2f34c03eb6f042bd2a46c731c65f09bb23a7e1e37b4dcaf7e1095805b5927796413544b48c2e9ec105ab123dba2a31625ca3747a2342924b8e85fd9d6e047fa0178ef77b0869ef7f988a2f6b457a6ab53cec0972b6d990a8f9809b2bae33efd6e20c199cec82f8b7b31ca6c508078d2d81993b1b48c3c15ce9843c5c961bfd5bbef07f64d28b450302fa4ae4377bada1593797bae251ea9f47ef3ae31ba99e3109810d4e1705fe68121151e8df4152536f9b64cabe937e1bf7f7e89243ee7ccfad9451802782dc5b58293e85f970aadf978c485537899dcf45120441b5a4a9e5ab1cc3400aeef1a10da996ba96bbef8d7eeb0c42da89a37bf5002702a0f8dedd53a13cbd97d22bb1f375f9731f5ec45384093baf7c78266bb941648a60680edb1f87522b5a5d9b13288f22663dbd804de58f5cdcfddec98b85d73da99a9a612e8243cb56dda4753874ddb23fee1d72b6e65ad4dfc7ad5d60cbef195126cdee3f00b31b5db8d2fbf90358cab8ed097756ce72df48a7deb2d1cd70d6254cedd36867be36c82a2796a8961d155cb4c5b7fb0fb38657a54e326001a4d762cb5ebdb1c0149065c0ba20d1417d76e71757e6535223244f0919c324ae34791b29ccc0da50a375015124bc18b4bab11cbe89be3d7a81d07998a084f3a4d9b3d25e1a19b996f3cce665a3bbbdfbb7bd601ea7de5050b4340786f5401a692d3ca636c14aca51fae9a26aff6cecc08a6be677bf77b3a93ef805afc79e8c525996e5e0e7c80acfa8923d4c6cbbfe6cbfed769ab28ecd6603a3e097631fdb0acaa4f9dbbca5f3eeb0f354343c3e1c96abb36e169ec4641a993e0388c7db025d7103d388a110bee886a704a0a38b4069e75c45fce5c7e7fa71a599ff488612d2445617d86c7e01468e9e80ce207a27dbbb23c899263eb2f4fa02d3fbf8b2652bde5da7d8b665e0acd81d137887275328d85c5bae0d04e90dae9630760e2bed828fb9e164b430911a60f5394fa9330422511c5df0d6fd65a42746fdb5b82218912fed75910e00a6f0b1975c6a0c1eb458f77b43e29936e533a91e1965ad60ff7947b7e6370a6eadc1897d68e933804d35d2a73b4e4179429fb387b1d5ebe7400a3c5913ca75d8dc5d370184d90500332703825e297ac1f192e164522da47b566cb4135cb1782416e08518e07a2f41e4d98f33f00337b59b3dfa3fe62b38668681e0c05e9eefead43e347e59e2364b0c92e74685493191a84a88cc421467de66b2b48d396e37e77df20bdf73e06d9a3d7b966d913dce9d6e9b24c10e95384518b64ade2d339cf74030a30633d221c047e80fa90be54763f5195d32e837996d05e0649a4dc2397a98b068d7613bb13b34fa12c5e1e093e4d9b1af72e087525e2ccf1350cbd02c0a781c41d13bbc2bc4bfe1f25757e210909a1de258d95ae47f775f9350522bf429c14690059b160b41695b6e8d257f9f4c67cf30365d07f55e5f9d99c41785dafcb79310ba10ce76e589487e1443ab521ba11fa11a837b9dc138350d402762bdfe034caafccee774c64ad441ee014040455cdd5de5ea20a244fcd6178a7ce55d0a0bc4ae06c36c2b356b8a714ebfc84306ef572dd10e50a32d0f64080e23922339503a0f8924c960408060e713b00b4e423e0b98e17b5f035b192ad818ef34704b47f596a2495568b3764f077263fd61d64dfdefac5235271999f2139ff21a028c2c6fb582f1b5b69ad78d9045f6e3c09752fd4260349d65c24d59d1c1e1b2702d7face6ffc470c5b5d91ad5af2127f4277837992c97f7f17e110ff2fc4b44e8011df0febedd5c1266dc81ca4ee46d235b49e1d01e8f7d68e3eb3ec6ae22a3ed61ccf0a48f260c99a66d16623d2a0867045f3fbd3b58ffe61d8615f0739db49208cc96991fd7e37068398fc76550cef68163f688ac869d19391710cd3dcc0ee71fe1cd4858b160b1dcb7392e9ad5fb3b1046e9de59e72340502d8a1258e50138c170e7936c01a2c358d9cb0101fcb70d7c5617431af577d4b869a4627ac0a49bd4d5b2a7bf3fa71e085a76d50085657bbb3ceaaa6f4763703c110016d02c0c20ec06085c7737f815f222de9084219056835796f69d5d3498e87c3ac623ae5cfddc69e185a9fa223b1eb336e32c5ce3d0153d5f2aeea046d4929adfb20d8d7ffb10c14fbdddaad394150d03746220f44a71d27eb6ffac38b25169e9cad5cebcae6b4e8f646ce6ac23790cfd1df8c8c7cf4b9b6a89a93356ef511236bb09d1df3f0c4d56822aaeaefbf56900bf0f7bc0ce8db12b43be231edbddb5f1b4e6375dda5b231887184f7f2d6bf6b69b38bd70f1ede27d95dcff01269b4420d434d739147115339bed7c8067e9a0805fb7ef84bf65dcac42ca463468aa8c438cd0574227367d728f066159f96f3110d50f46986e04db200e21cbc00ab4400f2268cd9209dca0e7b92c8fb935e81794436e9bc3ed90bb43a709aacabbee25986eaaa8526f852ab09634260f99c72cf492ae193c2385808846134048e774a27013580005fee33555a6af6d31fcd97684ca16bbd441f1b03f65cea4202a718fc3436400500aeda56f13a020c513d88c57e36544ddfb3b51e28f598429cc942411c34a13623194d3afc486fd938b6660836df3f173682dc5547545e41f8ba86426df2b70308aa5518a8bce9a1d00917b9f0623cc966c26b362c7a8f6d5a980f155134dc0354850325e2f145ce80952d329b3adab53ee0b2128a431e9e56e229a829f0bd657613f8b32b6fac97a94b9d3651f84a3b699bc97eaa5696cc6f897a845b163d95079c562c987dcc7b69e4db46d03e578ffb8a61c16c9632a417e95db8d2ad03196d719c5d47c271ea847625a2dbbff1805d6c4dc5da5abafbc210dbe39f4ba100dcf7ee276bda08f6e9828e102f8652340cb817f42d5cf59d4d42886b37f578f793278a313869d1419fe4244e71e14fa7d82a20790437d3d11969339642be3b67996b3330981f60d520bc47aa80c0f000ed4c625439402a6d8a144448c175d1b396824a8cb0986478920e9f2dd2aaea99dfd3611e4f5fe910321b6652c19d50d1ade267104858a23add0294e613c93abbf65ccf8d98d791105e72bf0101d770de2afb271b36cf3926631acaff70d0bca57c1d10747b025a9438cb48921b0151a9a4f3fcd25a9342c5878a35b743a5adfb0714ab55c610edcb6f82206a32dc5eaacb70563edb4aed0fd58434da07cdbe0fe4791e43b701d3e4cc6587c18e1d03498244d5f3cfa2966588cd6721d8edf66d5ee6f9ea9ad12ae95b0775bef6551446d09c572480383c60c09c9e1d53b5c88edf6f69911955303637e58d9bb28df425257f977738547b79c646bb76e2dc2a2d076ddda1649f78ff878719fb73b7fff2526f65f3d21f1569f1c0a7d2411bc6f2095bceda3a43a23d1d18c287902bb512159d9e9840243f3e11b83aea992b3888a375d014188c4134e4da54b91a981d33483c816d9aef44eb6b426f2e1e53fc95dbd61ada4107e86949b64d95e5b0fe7b48f4cc1abb55be6adcf75137089a4da8099ea8d33b13992a60999142abef64c4ae6797f6daa3568c10d7a7dfe6cad4e92abe75a238bcbd96ab2e69ef6a6c11a62286b70fba061f48bff1e0f173930cb37084e666f934755b5acd17a588c43c4557da60c42bb3e5cc9d9fc997fa1093e847fdc99d791345f2ef583100fbc5b256a011936183bb6218c84d0d055736a8d88d4417029305b5a5f8cf80f18a452e48b49519998900c3d4461db2dfc8dc9e29a53053efdf8ca637fcde2a23c33b8d026ac5ce3d3038da0094b4f310bdc5c930f2d3f4586b6eb7877ba2666c5866d5ab2d50c2c45b2a5d5e91ca332a1557578066226641f1b982244ee21955e989f4968c00952d0af2888deabc64976a17f050ebb5e2bd84a1b09eb3d56aca3ac96c59645605027e6a5be0e24eacbc2f573caa0ec16fec498374c320c8a2ad697b7c1f7a7109d9c612c7f1e0735c5975e77aec0a250b0b3f8c118055f0040ae1fda32db8cd04b4fb5cd7af3fc7f918d5aaaac321bca9c46a8031c1ad256e0e619f75752c618203f3878f517511b8009e3e7e16a8ae5bbfc87f89c90ce9a8e621a7e9f6d8231b310fd0e6e3f37c706034ea1b45cc22a934ac544459c6f1b678e4fdf6ce0298fb8eb92c2ee4adf8098856cff11d7b7c699fdc656bc6007667091e205f92e7dfbf7632be64175425a1cfb47c64a3539495070817c0dcd535d9397ca2b1af241dc0ef3f373a202629136ff3106d06c66717c4cc12bce5b9cdf79b77ee6873c41cdb4f0858ac4d2b2b45e874936d0ef8408ad8378aee6f71c80d66e33724764f11366105f356ba63193775a546911ebe71615ad8622424bb56ba0cea4e505faa00ec254d7926fbb0e72b850c609d55c3c79107c2a055505ded7d604fe60ba839885a0018cfbbdf161edc3ce7663e58cdb47c6d1e7b4894ae3556819471aca0bacb92064e26dc5aabfad0a9bbcff2bd102b778fa873962c011925db987f89c6e19b4b48f98ee30622eda896d81821b8bc098eb0aa0e153de061d04c2b57ede525c25104d96a4019aeb5d0b93bfc57d3cdc97c0c5136755e299bed691112e76c6ebb6313f9d1c71076d9492d5a88d842330e791b8a160743f25c29841ad66cc57cae2313370e154e8790d7c632763e09c13cb69597b0bb25eef374fc8bac79b6bc4a66699ad7fe9e5d1d5066a62482e17c29beb908b9e3c2387bce7400982caa85b9f830be574baf60328a21d6d53af336bcfdf66a8e13c6a1fb6c7c8b785f5c6850110bb1e2f989b8d200bfb49439ff9bbcc22e14f418c857d2e30aaa9101cba0629f9038a79c672b3ed6789315a534774e0bc1579aecccfeb47ba7dc20abbf5c0c0e154086f4b20884c834834b2198b2aea4bf1ab8ca59ab79ccb8333071e02fdf2c5de6af638d617f1af432eb7b4d5846fa4db8bd112f2ca17de1b0acd6c57e1194a55aa29f4c95f4d199ace3165b67c34eebd7d40b6cba0869c82068e720491bd718b2d42a934b07e3668fec95337cf564848983ce01f03a8d2698046b5de2a9bcd16e3ee64df6a2d54b986f152d4bcd4c965e153573670db20c47c8f27c71d7db666a347396918e3489489f92d7e45636516f2018e77ce9361d65857f97f6bea94103d861fdb89c9f57fe36bdea0db8b03e21492bcc92a9047ed000689518cb97a5929bd0d71e59efc56da5b490f4941ee079af4a6a02fdef27cb15c335a4feaa628451204f291b9d4be6110a7db35ffb77ce27734f677fc4afd303e0949dce23c13857835addf9449461b6117af3884296ebe0a90bbc3476aabcbbc6ac0cd89557a6f7e3c0cbf545b2ca0244c302a7880c6d53082433a9a06263cd5f0d1052e8de1b686506c5c5fe4a36cce6e85645fc6be034b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe959cdea44fdd98eb626c403d5490c654341b13a084839e6371d0a3f95c03c2936014c57840513a62e542ac5c88f6baaab95a8755fee194ee75fedb7d1ff531bfbb659df6670778a25ebee835818a5191ac2c8bcb317adfffbe5840b24536e6aeff23e90ddaac45d59c0b53e1cda32a6f6c3d33dac0cff671ebd6dc72fc62102b016101b2589ab6a4ed3f140e932f87b4408907fae3ff81690d1de4f7042a4a8bc57a1eee57c3a993b501cf7ca1719549715fb330cf0b5c9449c05228287d28d1cd19"); +const NEW_CHECKPOINT: [u8; 25122] = hex_literal::hex!("80c58a00000000009cde110000000000f118ba039276d46ba87cd50790e2547060aa6cd260476bdb499dc38ef834d618910884d25c9608dfe669a39ae64814db99553d82cd7a5bf5808240d2dbef04e6035075425a8cfe9d2bc194fa1ce245681e84909e4159e0c5cc1be7f876ff57d0af821d9b65aecbfd133c02eeecf2d8f64a164474274529f0a0fa9f8ab033cddc183b5dc028ccbc6c27887cbd65da8d4b8d6983ebcf4a910e6e2403b68f52628fb555e3486e21fd446483ed9df35377b07851e0e07803b7af34cc02494fe7a71fb32ec66a1c279dfa9e12b96b4a1e44fd1d3ca5db007ab2b953f6708514bc65ea545ad562b10a900bf3d9b25b5153d552ac07a256fe4f7761a5f9fe130c8e65b8f35ec53499db3a67c630148b7baf1ae8b79c00ed0c5f8f808bcb9e01cdeb963d8a6319e82af0f8a64b1819e2b21ddd3b07b74c8ef2bf01450a4bcb4180795b745f2f11c449223cb5590c155b284ef45ca108dd0c6e2ebeeb1e93bf710e1573e1cf7d2e3ce4c45cd5e5cc6aabfb110fc1c748b6a22677b333aa36d283f3d99eb09577cbd44b3fe69dea5d5651887877aac4f7f7eb0856e272144e187aeb92df3bc4b789b16ccc3b9f014b60b56159692db7f9ec5f2bbf753c0e19a5a22400b614c45da5ee07ff2a4558c2038f3772f2da1772070d65ecf063b908ad751a192cf1aafe980d1b628aff8bb34f7cead01aa4baf5d8be084e112f2cad65561c40a0932cbda6d5d37d6650500f14b7269575e1ac157dae537eab19abb957f40043c71954cde60e164200f453233a8b77fcf8ffe5d95463b486da0e6e873a1a00d3b04aa4f0672ad6b6d03180cc0a089adcf50b7e3688c68b47d1d5812972cfd5952b4197c414bfad6025d8c8f060f16edcf8ba8bb9075672310a1e10745e4e90fbbbc61f2fcecf5399045b103317086f544bef7b5414e373401b13893a7520fe0201de90c58991af476a86d9eec14cfd0baaad4278204b6d822cd32414da207ec86da840cefe31c5cbfa6ceff0546294c296e6aa5683093bf0a69ba502c89e50a6084b899a36f3d60db2dc9ba128210c4e75d76e83799132cbd4fdd9fd17eb704703cea9df391c83d66a2d7ab894cb5a15a575d1e71389b8c57d63ea48017254c02c106c64b3e8aa0c2f33b9af3ebc44e541aca5e69cfae22549ee562eb8e825d81830317e565d04563ed05fb8682f1ff79e0c855990e03a9d18ad8ce8983fc55deb5398b333a26db57d0e690ef6ad56d85512859d9bea389877d01d3fd8ce1a0517c87ca515b12ac524c47439b2c4c00b553f8a9a6831fccd0641f8eb33c0eeba8cb5ed88e035f5bfa079644258f5077483b45589d5cf4b53915bdab34d4030dfa8ad85af76e194db58d453df3411431cbbd8dd19e619ff613cc3cc9e88745bd1b3d24422d3dd4ebd82467bd232600401a39fa3134a2cc099b690158e52694b2141ce2979ee84416d8c89f55c23cfab2804e26fa2f58e96fa9d8e7f7fa8c33022247ca0cd1808fbccfa4f3dc4e70ed62e031598f4776745fee59bf0fd5369246ad97c2f2798e808fccf295ce5f8ad8e7e70268d6667508104ed10beb70a794196a3b7c7e7188e766d9a68d32ba7297f9f916e7e20f5afe0a758dcd16953dd81ed2ef48f4d8bc8190f601dd3da1df6f78ded9ced42b00a310957f65ae029e7e170d106e9593dc2df9b54d9d6692ab68e9d42688304fe8257fdade19bca9d162c83b3bac4b6626979a8fc77f49105f49103d55374bdf18e1638be1d8db2945dce2a9b7ca3c772605f9059f0754a06cd170268ed71a19419ec3c88bacb63bed8086c29322bf2d5ede197f3dc626dc83fcf7d3ad2aa959d28c9f659824abd2e7392a2658f1cda46be4fccca644292573c21ba76cd183817fe7d59641bb39a369f4b43237eb752ee6e0647a94c0cd1ee669010a851f133e7d674bf23e6ba23028bfcf6ead7d960833ddf004e335b83ee062938bf9183c99d97a411ee79b18725de81a5131e8c8f0e5dcac8837d036ed9c85cc02314994d865c8476e63100deeb615722ad6f8110b209ba9eff76fbcbff25b1d83f31e7439c00ba009d8ec4f87d32ed566e7f516e7dd48d085808641df325942b46d98b616d8bf622147f24e180a6be27fb74e042439e19ab3c73f833439a86dbbcd4e0ac43db4b891b67155ddb007d2475fbb070e847fa254273b63d0bad326ba60dd8c0849725be0496d270c2cb30804da546d94b3071e6de53a2ccd167acaa2439920e9c77e475fc120a12d91be2176a87f6c7f57061fba362e5c38ebd01f01c659c3631bccfd6973d68beecc3b363ba5ea9fe3918cc7629672fda8922852fdae18a99ca7536861c73a6f241440fb9116ffb3c9144d649d00255a4f15b1f6afa5c88e59885eae06fa271e0e1ab7b5a1b4ce2827d3e2cb309ae2d58e98a926d2ed525a8e8e1d4bb55f621eb6f688ba7184688819bc8aa9e95b114b78584247ab2f7e8c217ca0de8e219646f9c0184d03f292bb3138feebdd38de30ba4951cb1665a81994db24b5105ddd683075f6cf5f884ce7ee6525dcb09e04903424d7b8610a4be604a89d099d71d038091eca1a6317291e4fdbd84837621ae37182bb9eedc4182c1b3e3af35491cfa701ae2f55522c2042e7d8a93a54c2f505b62a748e1377789780f6fd9c54981e93f76b65a7c0010ce6f84bf03154c2d75b1da316b9dc62a2f62736944cb935f2f985da9f6fac23ea4d578136a1b3cd1ad29818cd02e9a72da1779f07c7a9f88b4e9fef6ae1db26de2946ba6edaa1b43fcb1c7e10ad49b9d84d060c6ffe0ee4f2fdcc34d27601a6bb3fc326b7dd600aed38ebdb605282d7346c990194aa7bc8775a1dd5f64c61abe8b375d61223917fc8427e659d431a27391ea0df523a25e96210e17ca85cf5a4f5f6fb6b5c4473b4b92c62609bf31e8bf8402e391e3a7ae63d4aff55a17ac1d97620b97983e3ca421a81ab97f811921df29e09948dddb325945e3a7c53fd68c9c9633321afd3873ce4ebb4a6856b4a4caf2e57a2e2532a20bd768404e84d2b2044b22f9b2e8f76946029db8b84290f6ed94df22c8596dd9c6bce3cdaadb43bc90d1f263e64bc00863fa218495994cd4b42025b22d257d3ab275ca382ee10231e8850ada2b50d0fd507b34c0b74b13d1794ea68c1d594d221ef84f9557bb43495f9652e3fdee490cd327116aba0bde4812a95c47955ea446dd6548aac044e14798beccee03b10a59ea6d9a5a2bf6e6bba2f2130128a29ead57203869d1fff9467d835cf8e7ad3f3d2fc077dfe11769982b2fa5e94379c3a2087edf3bc587d27987811204505bd74d8ef13acbec609ae24793f5a2b101eca199dcfaa4531a987b6524018fbe4c9ffc95985096a67bb041c37056498dc3733b5be3d6d03a001b418ab4c0ef72c609ff263136e14c16e9ffcc8a2c6ab4b3b1bb730feec0a1ae7c15fed5509ddef0e00b8de4dcfdb93be4e6ac902462ae732c20a79209499b9b87870e0476d016889a60ed361c5353020a3ec98e34e63b9f3182ac02fe66da7efbb1a3895c727cdca56fd43edd20bff709ce5f86fe5f9c880c11ec739b9485c0132efeca6f6014be637028ec04a36b57345d5680ca76837e1aa7f14999c928578daf668cea7358c4110d88abfbe25380352feba160638608ae27c8336fc4fccccf4eb0abe8942f11a77c6a39786aa8287ecff1af4732e63c834f325d0719e5870914a7ee8cd22592c42b6bbe86ece668f7b75ab921fb30979ea979d9a67dc6cd4b3ae2cb3751b35f51c7c8fcd75505d656d10fd54bb1afa2d24afe1502740275589f07b5371914d703690da14b54285e8943f0e6c532a977f5fc3c1564048b19d731cba84f69c076a823353ce020094fb46c5784c2098313f99c96c539258b59630de96d217795318faa7bbdc52aa37525c7091c8574c4a9a03b5cbf80963facc40ea68ec48cc24f71f3337c8f7871aea9a18aed2b1664c9c5f5af76dec55f74bb441abc21da357de621473325018aecc06917aff025087275ca4f964b8cd945c7c41964fea49386cb3ed22036e0474cc2def65a6a380f9a120e5560722b942f5b88369817d0a965d6482ab324b7af23bbf854a41fc2510c2898712f6177f9990a2587a2fc9d2cc0b7ff3c07b5ed0ea20c24bbaf58d5a29ab1c64f42e8d94ba4400c65a90a6ea0a7d2623dca1b2e4f74a4374faef87e0a77b09a1b45558a9b81b9402b933317fce57824dca4b911f066892672e667f37ad0a750e09802784f2a0f6ca3a675b5f6a6e76e96ed60a36cb09046b39975f8575adf33e2b0ec9eea1cc61ec6364a0ebae32e9902129aa3b174c0332bd338a33dd91cd8159b47b10883b32a4ba60759c14f12b8741582bce5cfa0f7d86743e0da364170d9677cf448d7fa3590256ea01dcf11905726b88b15056236d8b65ea63039efd66b7fb4f168e6ff46fc5f7d7dc734d2d406153340788216a5df6ec9fa169ac78540cedd4fd9a00382798ed054223ebbac19c32a0e02b9a27c5db531e507c1855fcb354bea4e484bb30bef99bcd63be47e4d3d4a4e0249f41588a18519584d6086e0b2039b5d14130a4b6aa53a088e98ac24da38b83b8f1801b612370c71613612bae8e5f1ec6e07260fa081bacbefc947bd612ab85eafe775db1aac43fd4abefc58d49aacb57307b29ac2ba517af4e7b26d6a836338d6c8941db0bbb9ea279d33bdb9632be5ffd687acd2b9003040d346aa947425b475d04333b54958b6f4600f7d7456050f160e2a078302e7011c634abff5e0dc08880d5cf6ec705f94951273125ee1886396fd14df2ebb8f39e6171876ad7eb0797e97facf88217ecb60eda8fb336efd13715928f1311606187e38e0d7a4cc94d9a1a0c36aca43f3a98440724e8704b935fb52a0d9aeb1b8861c6a7c4535af798f2d46a769f897bceceaf1f5fb55986a40567a8d13731b4274787ac1995b77d08d780fe788b45ac80dc136504f7e1f8a96f55add4bc347ebcadac13dc5f43436192b7ef765a23dd8a82083dafd346a8ed35890a855a0856abe09f943f27d2ae609efb77499ed7fbac5f5d6ebb58bc1aa061fe70397143434f1b318e3d9aa8f5daa5543f7af91f534d2193d7a09097c373ebbcd9982c24bb1ef2c3b6125466ed13ecf5776c032a3bdd2a77107d6a1323fed662ee74a8650bcf27ba22e9c5172c069b0db13a03a0aa7e689a0c6cccd03b894348e2b88a577921a1934a3888a13c4219057df4393158c7202ed74ba8ccce6491af1b143758cc25e4261cac346a38761c0a6a24f275e1fbb117e9fe566a555e86ec79072ab3e3c17471bd6fd429af98b00b8abe4cbb397660351dcdd941bd3c8b6f77ba9a6f7bfce57d1820273a8000b9a9cc23fb8536bdac8a3f780f0ad86964828ea9be5595640b4a7a6c14427d7cde445d1fa4985a032beaaa5ad2d47bf2a536f25fd855247c5e229f5084f4d3edce308fc0e3e92c00ce3ea6b6c81381cab6d769c81410b76120343202a0fe78b083c4b3da0a5a16d4169cbe2f18fd611cff69d75673dbb01dc2e288335644825e3297a6b94ef4407036fc2c15109ac307d8c83ab4d8029afd1213fc4c2df73da3eb545c6c55cdc003bbf6bd302c8a792263c2ffb1acff931957e761bd98ada159b91c5db7db9cc5708843bb0ff18b82d85d51f9227de4a5292d4cad152bee03e97007f40dff61b9f326121e4d533322a8a04cc5421aa4fbc8256bd21c37943bc25be49e8ada61e5f240c754dae5fb242b5f4e101317143d0f7da29a42dc81dac6987517ff085cc9b2eaf258fc97aba502d83e38247f5ed56a7eaacc68f850b3541a435304344f3b466925cdc531d54ea55988271c18f993ff6ac2f02a4c1f1aeedda7c20082dd5a7c2291e1ee60a449a6b8f66f2938af7b48a2ba01b453cc2d98baa4bb2449139c3cd4436daae2c1f637c8f7fee6e3897534250f313ddd3417bc92b0129c347c648d7773c79655b4aec68623b2924aee7da53e8ba56772cd6520a5c6d78b553627f3de75b056bc618ecb17a94b4d6b60a7164b024a693e526bb32e97f612b92e6a798b10b774f3cc7886a3bf419c0562801baa67fb28b3c02909bca1d542cd6da0f359d6a89aa73760b8d3642e3e688294ccf604369978ae4c9b220a9661205ba7a1fec3e96e2e10d73af9af284d7218dc9c249c6fd5f339ceb3380cea7f5b9ca305c04d9f0322c827bfd5ff8704d9a0b95c10ef7a4e3a332ac2e227beab26f367fd5a61ecdc228c73455890e935d949dfaa52ca8e65dfd5be9d73c4be0f8d2c0666c688de7e98de4f567627d3aedee8eb7fc75c4ab573e3fbdc7adf0d934a25d5312c8ff2cebb7959177aa440fb3a7cc8f4b85dbda4c65524df016c7e77ef90b11038e6da568d6c04bec1d53740d8d0e669d7a7f9ac3e979e816194cbdc54ae7fdee3d793a0006d415e048fe4e0f3f69c04bde7bf192686e53f7783fe7caaeee6019ceec793e54f3d0ec024e9feae6f643b8826dee65647b9f53a51509d36464685f44e1964eafb98b825d53ee3a8e9f85894ad6097a5cefe8daf6931ea7033400c7808d6be6cbbd244a6a694ec9bb3602a1bffaeeb3ac266ee3dafb4a0b8af48486c8c682e70597d5952e78a5fb01137dde04b8dc0af662de6b8a33a890f40e3c68c1c49dba60fa5e7e9d8d1414a36b0394acb7549bdd405732d118ce9e18899f897ada4be16a73a5d2f8e83b36d1370e0d71a3f0b1ab6e956ae959fd878374a31d52c8f6a5a30442652760c9de032cd6e1f621cd557b802777f290fa716771bd240f23217c2993a56aff4205f5b233e4403d73c719b6c483c0ee81c51056125793efd502e3b7be54138357335f7ed5370be3baf470ed7287a0da23815690ccd6d59c55ae1b272d46d2d57d7186e8b2550350b023b09cf34947fa86f24ca0b8b71a3ae3933cf8aa43afc46d87de82b57b3fa83e09e87ac43e362625ffddc02d4bf35f1514f755ebae9aea374dc7720319d4f80d4c9609d0970f16ab5b6ab96d10040777e2ba8dcac635a9358e636fe84a4c9794ee9f7c9e6b4682a4c9ec5b2a594071eb34a5c581d1288678dac0b525b459f96f377ba56a1eb1ae9275d70d33c3d4741e66144ea92f880fb154ce6d5dd8fc74fba41d12e9d66c859a8cb892df9a8d9398a80fd1a746ed19cda457c58fac722259a67573b7add86ce157cb3fd1e01c077e93a1560b2ff3c79c4cca88100a4cbd6e0a40fa3631d1de6e035bc197ab7573f10eddcca678433f231dd23ec2fe50652473af6133bc8c1033953baea90012e2878afa07e842f8b47a328ca9df0d21b58ace0fa8e7e501a5b03313764c81e2786e9489fdfe741521bd4fe299548e89bab19e8847ab274d0273f70f52e71e9003d42a7276521750e5c0792ee01cea2be884920f52075dcd02e9e25c8307dd499764fc029717c2ae5178607d17a730978a8896b6bb3b97b47cac98aba15ab24e1bfbefc5a2f8e2ac0c4eef44b26917de5e7d8b7330fca531689569fbe31003b760c6f4bf17460eb51d21c11b4cb8ac3bb28ba7e0c16d35104d92b1738e84b31cd27408d095984d8d0b20e0386e4e4670f34d0e8a0314500df98a568303486dac06ee4c6b14e1747062c34af8ae21b715a30e4654806717a334660155b8ef0d713e7cd2d0ab0386016b90eaaf8468e75bdedb81aa9f3467a86e012916afc5ed65ee4542016b22a6926c58962decf0319b73397e000a8ac83245564e5ba5adae8e0c76eb64bc4a82e05f9b376185aa44aa9ae831f3b2338badaff0436c57c38e9f3242aa9c9f7c00807a9ac8a97ed812c5ca69767766f87ab3711cfd478f6f60f9218c32a1c5d9d7b5bac1c1093b399c46f3270e26f035fee1e5b2c9680298b570a2db6fc8f2ed1c5b9eb65c8b915378db43893c9f4ad7026c4867f04e286d26c70e52fbfbd0420c4fddc0179675d2b2a5b7a7a3bc325967566662192b93e1fbec87f90e4861809e84e5a691bb1aed7b03797036c668fd07aea5d5586d1ed72df9fce56a6c599bff50a70086e689fe0d102e078358e4ebcf70746e7b86ba97ef46eda5927fcc5bd63564794ba207b1d85a2b38ec7a93e84768962ac23cadd9e4d66daf8f9772ffdf311a1d28fcd2187b8a5f83b03c64dc49660f630303ca5d8e37e4169dfdbddf490dd8f226b29774d95082314ff6112ae77869e72886c7a93bee730897b7d38ceb673d4030283a248b66c62c9554e3236655486c214baed7631a301fe780d283adb6fede12e43e848f81f16b36f97149263fa6bf54484c201f51665e2532f6b29d4037a19bb798d5d73aba460e78794afd7f3dc2efe998eacc597a27ae8c7d0378a6aa42dbbd2606b9a9f0045adc22ca004ac27a7e0b87d282c2102797566e215a456cd34e754c67258a067db1a6af16ee8dd50a863da3939ea8f26e89c5e87c3a35dfbe08a98c0f2a45b297609ae574173d9cd07955814ba24fd0810b686a6a6487a34bdadb76cbe8d7a100e29eb66a4d2ab72df6738d15092f519d8cd1ff5724e359d2cebc2ace815c4c11012aefe433e176b394315c6ff6b31d745b65de56fd842c78de07a1b22652fcd11a340caaf56626a999625d32d762c81e097f4d548d94eb075849beeed2d57c40ff9a545371ce9bd9f42caea334101a01afb0a73bfce8fa0c6ba88e9c159f8009701773f2b9d79f48bb793c04fedf8278efc1a54c1f77a1f8ac4e83e784054e76160e05af8b06e565a5eef9b06e5623f5c0dca6f2c741de8e71241d94055e0115056200cc5a5de25c4cc3a7507e3b153bddcd89bbd9faa0e13c30c6aa4f3b8b28e7436b0564625c15e7425ca2e1dfcdab8a721d5a01314e23358e991ae4eaee313c8efe723b19a22ea8f857667afd92267cca94bc82d6bd73f4a935c2f32d79dbff17f9e54b463911d81d80b3c9d98d45e7a93c3b6198ea8b8223f2223950196950dcd4f5f4d81423d61c682c040b2748e57dd3e51b207b4bb1658fa013f1f6ffcffb5a3df119753e65619a5dca4e507f510360721e37654b76771814fba673e1c8ef24ebcf91f2f7d08db30da1a1b0bf3300a66d992072f15daddfb5d08a08942f14e854dc29c3029f6c27968118aa2d23b528148a6e70f2438faacb3c4ce494dbeef03508206826ca8b0bada57796f4a4cace53a1339b41331dae0c6cd3f620ec58d04dfdb03d0710da8cbc876ba222b16ede82ec4f8839d42d8d92f4e67f804baf44790c00918f7e231d6b79016cccdb2efeb7858e1e9e4a1eaa67ce4bb608790b09894b06bd0803684ef706c0ccdea713ea7ee376d9d6c9f676efecc91ea317cccfebfe465edf03278410fb011e5fbf8d50192e98bc0f65aa4a8615e44660d3e047e2703d60f7a6d08d468611fc0b1a0f16d3293842c80a3fa7de450ef0ae47a084763780da1d7e9755b80fbb07ec7304d1c19a7f6dd3c2878ecbeb46706d9939922b92b3390dd918a11eedccee7188a65503c983b8804acec6bced9dfccde579891a1a884a4000adb864d8f9be54657d653713184a81225a83f314b07e32fad554ae49697d5cd9927761fb78eae1e8571efffc50072b44a3d229e07cd8cc57751a33537e66ddd2e4950793b39d471821a8bb26943e0307d924e82d3adb7fb04dfbbc1b1b832643d84362f465a8ba7bb8543ab793caea761c9986b845aa2ae3d99604185bc12c25019d5a981812348c662cae1795aacd0eea8609ea2dfaa0e772e9aea92d2d654305ab6a0068ad1475fe14f733483b03e768562e563739a412f4d3eff2ae6c19883681e3b22432943b32d9ebc6941674deb3920c52624605ad196bf1f8146689872672ddba241100425d7b73d8ce99f141de338f94e3e6e1a9bd8d6ccc8dc87e585ea8120121308ab58517549e87e8d9e358f7c653af923c2b56a0ab756afa52c2fc5b1133407ff0d088914f04adde7d8b9a840156135b5991dff05165e34974d92702d93d7027d56a6fe2a9004c05446ccb7283f2994cc064cbe6850dc82c9865738e9ee7bd205a50ae83128f007bb1b6e5f330fdb634e823fbb09c279609e9819df52bfd3214635c80c4fcfd47672cd7dcb05a7ffe0bb71867e7061764cb68fed668b00335d6d011be76c3545c4ffb3d54810fae5c498a29ead7fbf6d0c4e707308ad95103f9b9bcfd3e3a66c8cc66e506a650a9a2f55de7724254943e076a0aae77969219f0df9f7781278b9a7cf9960fb6ec69d05e819b3b448910a59f1eb3307135b469dce550594709cd9bd7e2ae8defb1526dba97db70b04c2d361f468a3193fd57d0fd328117d05bbbfed2a6d3ae4a555c332dc38fd74daaa6a8b3b55624836e41d8aad26be0982de48a98f93153b27ccb597b8f68f798789a9d46d84cb72ef3cebc064e428613757eb75c86f535b3dfb13f7abb8bd9216e70f04c67da84b6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651584b9a04a9fd73cde3a56904b09f6ae9f6a4bdcb0bab6c1e5b8e7e0eb5c8bc1d130cea0f4a6be6e364a28021fa476893e87e779022b6cf983dcb394fa936a2245cedf379642716df1a932d899e56a9d42ac668e783a910fa39284ec7ab00f08918acf9119f9e964cfea71404064417aa574c0416acfdbadca8ba43895bfff699cedc1603f781b4b7c353724019562a947afc7e7c30ffe6d9857346aaee04143e19d8429e486003243387444b718ddf52bf372f542a95e1280c4a54299d13e3879b8e479925aaa84368b47a69f9c1fe7598f0d0f5fa405ef3829299e970a8822e1885aa33e7eb400d538d335ab97b746bca8da82350e3d52a9833f010d9b998af92b54a67f6d906d12fdf22d64db5902452071bfc8fa65fa010d2a8ec2a1b8f3f38fe4c37fc95cdc46a8ccb9743534278d225a5ce233a15d503158e1db6e9d016db93b240aba04afdd7ed2f8f909f32d478b149569b768c13c4f9f7bc14fd5da12bec4692dd6119bb35693bc0ba09cca16c496164bf598d24e5fa641ca59d4b283a60b2a3d30f365014f6c8d79f0b3d878a5cff8f0ef98e48b5864c9e0a450fcc3467e19a3761ff916ff1e2a89f61bb73080cab649a91ad197fa3c3b17c6859b57f49a845fadf994fd36f575724226e32866725d8f641bbf052bcb41c96c6b7dfbb13324b10a801ae1314373b77b6cfc61580c46bfaef27b0b0446801d054be7f1e33266bbc267c09c6aba0c3b81ad54da83c0b627503d9462b75249569c8b97b6da662c18e2269b37ae6eb3e07e995d92466a990b3f8856bbe83a478a7f8725b49285b479e1cb89335af647463a4892216851668daeaadaffb0bb37d8dd651c509c3743274eaf7a2a51a0e1777fd21ef8a1555f625d5f21823aaf317e36369bd5c4976ff3c848256df750c421c9145f64a59a62218ae70d4684935b63ac3ff6f4a96aeb2910993aa02dffa434ee1ce52cc899089eac0c142a6d2ff99cec8107649c42b61a32e9e4b0541635191007ba47803c1c351ff2302104f39c4d5dd1614175cef07ca15cbd0a774dfbb79e897bcce54c4f49124d0abb171159eed866101f8bc4782c167ad4332e04d659c071fc7cfa8530854f8e6e93f21bc8152e672ee134b93e64eebe550f35e53691d1ea6993ad2158006191f1e2973efc194ca0ab66fc174758f0226dc531fb265a560e5e38a4225c01b2bc362af73af9cf446491578ecfd176663c471c60a613ad7a119659ee68c43a5a08cc7c737c58447668644f2444fdd978bda86c60bbfabd0098e7d29746440da19e9ec5c8cba161f299fb9a5a83ffe05ef8433746c7eb6e174b4f245bdd63973c76c73befd9b7230fc8f115813e6651f1cc7445c5622af346dacd00bd0d6d47f204caa07f54d4c8c3a6a1ffccf161038bb7e2184821427e2bc8fe3c8cfddd731c8d98b4e6386d70a6d9040a8a4993061e72773d1a82dadc8c9e0d0927d990916ecc59118eacb586294277fc8f63de585929d522e13f8e27331a96499ff0f1daa43e30176853767fa3362209f69dd13004e6e6f7e898182dcbd2c1cea23b682caf8d9139d4f0baa12592284c3569031f77d4cb3df039991d2d032f5fc61b035a0eb2f70f7cf1177be908cb8eaea47baccaa254a1533cf91f52c586e5648d1271cefe9633f39cdfce209e09530056123ddafaae6c8cf7cdc4a5ee592ba291292adaff17a97ed3de2ee575af0ed4b4705c90b30f42902f7f5591aebc1e5e9a25b103c16aadbae2682df90eddca8610025bcd0254fc55833850ce6b1121defec4a9e502ec46af0293dd87f90fabe7e8eb0d758cf4a6c2c6b4ea6bd2183ba734471c82f41105179d222f34b40dc1df7d4370be2d0b1c985ced4311a85479e7d5b520fad7ad6a30fdf272f3c6140487ce28a9b490c65e3976f35e51d1e5d3147a1fc418c8fb9b98dbb032af3193f1196689423632d92fa81302e998faa9b9964d0a92a7159bfb362749ae88dfcdbb7e3b87ea009a4fa76880b817aa55df06b1d2327b01c387a0b926d8ba31a32a3696402c64e0a02efbfc32af918129a4e2184833c3a763c9681092db63fa29ff811de4fb7f34211d7a05c5d46a890e5e058b18522565e89649c9e397b3c4a2a35065fc996469416425e3e59cf69fb886b9f89785c9c4bdd8c4c224bb826c0c2fe2928a66d78432d240c1aadee7acc061727d3ca44db2ba819cd401cb9404751d1f48f23184f3aca22245791be2ffe23c25a811adae614effe498d6f0c5cb0d2cdc6714b3f23a1c7858ffd43dc1d1be0f760cf28d2d3e64d6310854d6d54471d71e8a8d7f77f3098378ba1e5122eabbe0cb9d224ed4904429b2b275f5bdc45bd8eb71f9d243e5b7e55161ff23e35434e83cb38c3873c037f255995350869d8c06ddb813aef18bdafd7a280d92f25b5719a242000ebf0a89ca4589894f6aaf04e0288534f83560c53c82e472ae8ce54c5dd9812a6964174192b857f8144a77af9c6a86d4d301212ea8137352c14a002fbfcfa6c56d4df69fc9c235ae58b7fb11df3bfc2f087a051095beb722f58d1d1c6b644f989ebaf4bdf648b8addcc90ce1d8d080acd5ca2e6499bdac856177d8b121b77e7998ed394b47a5e6badbedb0e63207d84190b721b7a40037df1bcf45bfee6c953aa2dd319498200365a5518ef7815c71bdc88c1d8c317d9c1174c401cec7eef84e49fd2e13b60210d58cece2b3ef17b0fc0253c68c125cc18e028311623ba3f0ed6126e71e0af814fb5137bd5653b6fd923ce03df31addb6728df0932d710f876b87e4ec88b05fc406b2cb5ebf3a7097068a0a3edf583d44f7a52e042fecb083bc6bf8927b503fe23134d1fca2d7238e894606860ac772a3d371643acac90dd864107a046dcace6e1089135612040ed33ca50ccd15358813ea65077abf2da58b84891ecebd6856ec6da84e1aa05007db848d95b27246565d7fa46b2f4515fa38c33b0c190b343ac27e18779082eed3a54eb129c4e889f52779cfebf26b915227724e16bad10f4a2037128bc44c341f90418332f8037c34cf4e781a01bb9421922b747ac89ab2a8a3378709ed1c401e8445c2272d26ebd9b585127fb57d5d183e52b2e17861336cf9e10e34073a97a4880794a507bdc3c9dc553735787357eb8f726cd7ac0b56559fdbb1e3758ac97fda1c37419da24450c62eb6dad5e479608bbd4ed4296c6ebf812b6a57c379c796a5a6baa3045f715c0a7894427d314ef37f454c83cc888b165aca2a3eae11a768834b6b358bd399fed1dd302fd79ebf951527a448669c516cc2d0f63f7f968d138c3af179d42f02d3c0f627eb7dae2f4489baec3626c85116dc23072b4d9c59f35564137816b4ff91fa4988cca72f0583ccf80a5ce91edb8642758f49118ddd7cb598f92cde96e8cc7873c34c1d50988346307c7ad359a5fb1e2a8f21b54fc1f800d83a5db56f7d3c459500429346de68a1a049a610c86dcc5a7dd737a0b1525791d8712d4de313bf3e68fca59a38a43145074bd0235a4e599da5f58197d353bfa8c9432c709eb3a6a8b533930531b16388e0d9df67c46dd2199188be257c065c55091a1006ee6f8f93677f3f9ba7a7e0989b993fdd53a97b92b7a33d4ab0cda47ed4a26bb9e6f0ce3ce05f9cc563231e020fb655e76ac7276febba742c99f5928f17c2f5788f0f9bb4c3021dfcbe7b86cd1396aac2828455064d7cd2c56cab823e2e1b56e6f41db25ace49d092eddbb0913c13f9c8783bf986e7de6fc5f2db09ca04c6837730c7ecaed255c6147b6974a29fdd2e3b7140e3397fee402c9d478d879aeabb03f0f3362f5b5a2ee4d8b92aa97a0dc8c8465d0375d8e0eb3db05589a86dea8ee32ba2b040048f0ec7ed391691a1cf93c439737fee4445fc2750378f3c3dcef47310dee2ec95558e2fdcd69fbe4eed7fb4f804970c4afb7ea2f54486a6122bb870abac18656546f92efc00660503ed2ed25be1b43275cb454bf1cefe62865830ae736357dee7eb125ac93a308a7144662371d634c3ec003aca83647443cac5f8e8a324d2a8ff69722da02fdaf0f1ddcfbf836411cd5994f0c8f816fc8e5a738d6778d4afadbefd3eb830ca2168a1cd941d037f8f0889dcdbc7321b131c7bd6d6dedbef81e9162b8a6028696391a5f4d40d52e8bde21fc8f4df1396b58d6c9d125cf676a93029994d13255f14b6f7ef90fd6aab2e8d0e8297cb53d7faad0e361be240b127d5d275fb84759ab13a7ad8be346518eb425d471b2600b78fbe5218878aa6997cdee9baa4eb483c7d979162ab1418ba5d4de7c2609837607bfd9e24ba0aedecd13d0253aa10c91fa13cce0ea826bd9c4964e416f9d0ce064e8abe60dfdee2845d2c393196cc17f7f5cafcd2fe059b217ff9b97ee17b779401e701c971a99a378635cb6fa1389d6aa5ae5027d924743a3a4c68919efb780e4bae0b725df4e1b1d4f9a5c3efee2beecb428d4ea0b1232e073350c30d86ca6197b5d079bf1c9d0fcb1e705d2b54951027000245ba068b7c6d9af593e8ef64834d47489a673df93960b90c54ba259150e989c941fef9de78403bd7e8e6961811c5e824f43cf71e6a48ecb0c65f14d168fcab6eca03d7ce316f8b3a40c0cf4a5baab0ca4d339aef0b5d027c75daa258941cd6f6ad7260c1bc5c1ffc463b0be9a40ac7f96f90d269b60c8c583e624e0c11aa951a4542df0684fa5c699a5416067d5e2e26d9e28b90bc50b6f9ad2365f31cab40ec0e58d824e047914b97cab112ac35b49ec606d981c0c3083e013be7fdcaa80a2686bda1c58386aee9507801aec128641ac6c2fb6346aeef8ac2e86e122621b7e95131dbb576d6975ff0c12bd7990c3c94a19eb85efe8b682bb526e5ab6645767b9fc86cfe92101773fa7348076ec58c1991cb182a949b52178a353299114d4c20e389d4dee383d6750cad56fe52591635a8dc94af1208782bda71108f03d9a14a41310c4dae567c7dcb22f1f42c6475319cea9701834164fbe9418a9eb575b516e5c64b3ec3952fa51ba06685f0d79378e8e5e8c0b61c662f0dd48b1a9ad44ca7f94bca32ab8affc2d7f1f48301a491d0d61fb47a59e14cb84688f5d6b6a68052d4850d1490da9a0e764565c4c57f06ca7e23341dddf122499ac666eb2c9fb4cc9190ef9c7cfd595f49a12b383706b7b1424d77102738eaf01ed34326776776f3d69ca39b73ee4706e7bef37ab288554bb51e9050fd7d86540db0b550f463a17485483d5932a3962ba3be881298d314d25ff8716e670d2938f6cdb250fc4a05ee338c0977900498d1fe2b194b1e47b6b674ec87f43ca2d4dc70103395ed85b20574c5fe4c62c4fe092262cb3b06ec0fa3fb7eede7f0c9e7461835c73160998b03c3249eb465667b1363875db308e837ec4843a20773df183663ca92b1af0dbf790cf3d3ba94c95668fe939eaf2cba82006755730e94e86f3ef600bba835371552ec4258cd64920bc19e6618bbdfde8c600bfb842c054040fc9792403147d48ada0fad576b0535312225418dcb0c82334a3f14dcfbbc9fde1200e3ab2d7f3e3a993182af99213c0e00b4e4dd3581bdaced70e7116a7916e62bcf0a78668112d43d23291aa30b3acb4bab4d4bda8d2824192bffc4f7eaa5b8aa056f178b6ddeaedb7e38af6197ec370691a6e6819e6b4080aa8f51e412d504656ee70b782995848b1e7e5df415e86a646ce2c86fc126a21fc4b00d3f4927700c53615b79a72da6124854014aa16f6f8e05e316003bf4542bda9a03705c456d22c668f9d5f8cda0231785bac0986001de9d41aeb2b8b21f4996483d7bf61dac2618a42c329fd514eec5c80de4604269cd1f1f74cffba98acd54dbbacf938dd42c9564b145c5dcf21f8aaed19d238f2ee3519489898ad2bb00f235bfb6b34ed913871fc1ee5af2a832b01ad5be44ada3b1d53df21ea0145611688e1ecfc4579f5cd951a04aa8a5a1865b93fddff38aa6bd6f67b43680efa558192feb644672003e95ff12e9d7616108f4bebdccd422e0a46d4275ffbff3a7bba3b9ca3cf10a4202f71e0a24fb98874ea983b7e98de2dc70d3802fe2f9ac074335b1c002f429ed56645d532d8436cd9d068100d536416fd2b48796dd5bfea7048362d70ad1217f17090d388bcad7f7758079e1d0ec27442731e9ca09c5a9033860039617da07628933dd0dd5c8c98956ff072840ff2128749d747c70db6ece43f1a54d239eebac6b380b71437307bb78741da5f310bb10431164010b0729b55c1686427dfd6ce56e5a24c38d4c64f81f3b2ef7dda5a0e524e6302f2577af7bdc9f898ba5930528bb3380b8b57e60ab77ac5e6df651a89a7ce535fc5f615aa057624745d1be6611c591fa3c4ab2f6c235904063f7df82c374fede0ab2cfb983f4a63455889234e41716baebd9fa6d797ee58fa56bdb5b02e50594e1cf0c43744a26e0ccd230545d79656e6ee161f4a27b3acc65e472f89281f4c12bfe8f3c412fd5abc2c6593b6b8ac71c17dbaf42e639dd4b869792418fded79484e56b758531293cab094cf0895c922f57780ac7a27c7e92d6a8c1b859833ab9753b745bfb17c3e84430db225ad04abb9fd5fe5ab337773c3226c2934809fef9b2d9a6e981042508330551f0e7a248e1e546c42d79449ed43fbef745aae18f3d9745cb1d95669c521c1e1375a161209918ea32cb8cabee764637e7071f3b0d0fffab98672ea5bc3ff0e2418db5a76bb7aa28bc5095c487d12c42be09c7ec7c8030b54826af316d3782353d709c62b16d65e65af2d1f17a2655e46674a0bf82f38f2f53bfb8add3b43bd66041a346c9cb65e8d73d53d077c0fee758215942aea0af363b33f562b0614a186afa1cc5479fb797bff0957b49d1b5ca904307568d147e598869d72d9e9516cbebf153b427511c0b10c9792c62be54c51af4bf6a6fd90403aedbb67669e5f47ee010c2369d716774be289391ea80e07d756ba2669a6825ab425430cb9ca3ac1921997db50c424d7a6b9b829dbb3a4a13de16227ad16d62f820bcedd88aba5368bf9fc4f6206f186572898c0fe88509d87ec32f18108490f7404d856448393ae8440668b090146419e3b93008568800432213455cad46c504d51906674c602f1ef66d5a4caf76ec1ca319a80eddc66f438cc7aee775120210515b19107a01777e10cf23a7915bf2ec11f9e3d3defa70b77291670c5cb99d46bd5d89ba4a7019297cecb1014e78882ce25822dad5fa6b9671431bbf83539e7bf1537ce0b152a3e618c0b1285ce2955531e28c508b561b2e11757ad4c71e86e4f56b2f24d65acc5acacc3601f3d69d5622867eeb72d39c6b9860df450096f5fab66693662ca3e6e36d9e0ce8c486856243a9249c155dc6be52f09415d848af3444603e3e3e94e39b188641df7f548265c9f2b0741f275eb2210cbfa22d522b9cf1bd89424a644b97d1471a175cc7dc1a26a0f180dbf97316b8344a48d2063bafda91af0826a37b8e97c64317fefe2ad1c8bf7e80b78981ac14589c11daba097540122105e6e9a99554343f50ca6b9e6ab4a3ad3f005b5ec04c421e84e69feff6003c1e8492024595e31483ae9117cdaafc8b7db08d732618594c92ddcd2a0c84104291dc5e997ed9b4a149d99522ab2245bf225d848d790824e4630899e3e1dfe6f12e4afec92a1952fcc0d3a5ac8b02ef1c98b4735e4e478d34e0837779dbc3c32c7806e3922561605117e632eee86e250f64033a51b27d2e6fb36f9bea0dfa9931a0f76e4c98f142bedd160653a9b1072b258dcd9d5f86cf1c76f14afd79eef7e17709cbf259f94b7fd0cbd136d0ed5c5482fedbfecd845c0dc52b2fa674d51f26826b538ea62dfa20b4d8a41bd26c0b056b34eb1753281910cdc1c149c14da6cfa5d062fde59dde7f29c1a6a72ff8670e4ff6a7260f836ed9527fb64e8b0e925b0c83269fe58b07b5950bdf8cd209f5939713c5e24ef439b2020131c1fa10af61c4afcc81d49909d0a37441b9861bcf4babf7f490bf3c397298c4a475d1614be8a3897595f83cf1b96d56390dfda29304b1eef5acdcad0a15ab4a13c61ac03a9e08ca433aaf9329710c683a7faf2a613fa721c7ca98552a28b357277c30843222db2d54e033fc99a94c6c59111fdf18f54c287cf4259a00ced3653bf01a9f1941abed36a6bcb6f806662e0c82b94ccd760835ae922a81d0b01d7ae7987233e61320228d5393431362d430c8860c020bf2a43444fc05ec36b02d428a02669370ec6bb036dcfecbd3bba4acbb7d65e59a4fbd5580964e60e74476f6662cc58c5dfe8aabaa001e6ea5eee885c69523eba01118381dc608f4c2671e36f1abfcccea32fe08755bf203b6408fa4d982f729d571984902adae18fa71a15b363792a9e013b06a30def5db262d0ec542d933a02c6ed1d9f09d5240f7fbc23d4bcc1f4745f6ad256d37665a57888e9746d81d39edbf4cbecd2a5f4c219657b85885ee35b806685fb0e50e544ad151952ce1d5eb0fcaa05e1dffbb1bb82e407bd99cb5cb4b793f39ff10aa5f1c9e5c158606ec3eec64d60e4a7bcd228a8a2fe5807d68a4952cb29906c0fd627df3019a234f82ce9974c95cfcacbe6b9d6de25b5b1d425b985027967128fc1395e009acb2becb9f339a96345749ad459ff4a8fa749aa47b33ab7aa1b6a79e6d9cb73e46675235eb0a8b1b82ca8c5ec91b694f09c826243310558e062554423cb1d837bb4c06779fa47d7c88e1a5e71feb2c707dee677a5e07baca4001ed4ee9e2c165be2824291dd3f397edb022b03c5b49246a22eb669e3525c92a6faffd400dd53b66973343aed34c5b99480ee0980a8f611b5f5389869ec6b0f7020cc3f73bfed687c06ab5f23c3757c730309240d7840bbc20c4d09b9993a0706890b76d543d37e1c4741f44751ca3549de3f1d721c0a196424d1d2c62edec2172c155d522995c75776424d3ba9b4310ffc50a51863f5895829ec2909a0997d91d18cf8044b0722fa6487a27ab6cc0eb88b35102338c65a62427cc3cb212c045d2c659cfcb111becf2b71b9a2a6e93714b15132e7261dd821966e8dfcc09d86a65218801844f374afea830dc4107d38effe63ab01cc1d6505c8771fa0387a2726fe96094c24d048638e2ba9def73f70e0f0fea802cb733151c652e8c3f512cd5ec8d7c369c092075fbaae060f2ba8a1f0b7f1c6f505d908e5a302592446cb26737b57e038242b8daf06d6feeb2c9a4031654e7d9a8b07fcb529fd3c77bcea6c4fa97027fc292d32b5b834606412e1ab5a4cd25ab3af24db414cc35b6aaf4e2800dc1c3c655b0bbdc2a1501070f96a7839e5ca3653b4596d8210f725fc3f24fbf8e506953d9c2077dfdab76046dda37945acafa2326e00524321283b7d8de962c6babb6a4826ea24b8f6abbe18cf8cfc322f75f08b11eb612bdbbd6dbaad2314e3523ce196a4c7b7ed01a290526ca828b3886b36e316478aec8199cdd4c40dccd17e14c5b8a3743166a41bebf0099f2d38aa1817dfc0c54b04164992416718eed4563357bdea26e952ceacf2a4ce6cebccc3c188873e0b4628e90d2474632753bbe7373db04a528f06f04240f362cb9ca48e67a236309f82602cc62765aaba724d07f542fa0f42c537e8a772203e400f92f27f36f8cba341dfdb613d9bd81857f8fe530fac2c593d92b5138d92c36570d25f70b19dc4c1ea3f2cb60bd9d2cea7a80a3d2e624ef3c1aa8ac466a7ab494b123e4dc026cb1b4528df1593f58971b3f9f6f1b31083eb8b6c40365957e0b3c89b8efd120c6fd16e93915f989368492a44b759a47847e4190409e62b82ece30d1aa63f8a553a70829c7c60a3d627e7154a390b83b1ebe01156b00ba2b1153b924bc9fbde0e01c35b09fac0ab9fbf4e86c5a0cd7fe094a15da00d28532ed2eba4243893aaa7708d6e70519d25bcb2985bf2596086c4cdd020bf330f45bc5251b20723e71a1ff9ea6ba65b0548023690f7f3553bd483a338f45902d4a53dd319234012016748fb642eaf36265ba94010b3d544ebf355322a32836c4e7ffb140faf971018bda3e5352012db80b80fa10a8d287a4c6772f6dc258d933e8404d22387ad40d8a92ba731812f4d7c9f0cc7f02a70b496ef969a56f843312d0d57f71a2f36753ab37dee4059404eb8755e3831a6c3900bce4b25a6cc86a722c574fbf118ab60f5d93cd8dccb884cb06e5501eb332a69b5d90ca50cb328a4d3cd0a62fbf943a8ac87cedaa1b062dee70dc185f58e41e6f6930f77528485f715f5dcb2bac5d49f4d06e1501aedf675066a688af26c84448c114d1e8120ea68584d728067ec03ad23c75bd6caa3abe9c54d92c53924aaed4e2ed70b414e9b5c57f1ae35fb099856e24e7a9414c1d4c26f4b486d238c6304510ee3c4dd18bbbb8ba195dc9b63d0f357a33dc87373822fec9443a814606f44fa13324dce0e099921077b83edc9f19849dd0917e943dc721ae520bf2a1b15d29b8f12775ebc14b5be224c65f369e3d305f03fff87fb5e91b45ecbaea7571905ad14407d079898e7883b3e334880ab16a5bbed13d38e271357f03184d31fd55f66e6e1f1a9d49ce029841ba7672e103de0b0a48c3b71a8d626c578da391c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bc84e8db3ab29823469574c9b596e2e070b258640b33d402da3213cf53c7550243e3f5faca65791ccb4f456ad51adc0e1589df67d0ab448d486155b8b26be4dcbc2bddaf70383a6338fd234a532516647f6b6967a51d3b7f65fcc60af45f2d46028cded491058ead42e78f898a70468e9112d7085fb21792fc74ebaa7afe80267b33fb1e62fd1561b94ab2c94148f94e2a898d31c37ad5fdabbd3754dfba6e48db7979d808acdfa2b85ad4e4637d1bbbfb5add0f67aa31f709da8856ae5ec34235b5f9a170558b9ea06b9ab63b0014a800aa41c716a851bc9e4460348db50bd4c18293719c2f60a2442fb5eea3d33efee7b1134f3328161e67ca307316d44160e8e1257a4499f57d0e098429a13048a105d7d34bde433e8610ad4aaa237bff7271914e526b96564e7a3c210c88192a59f3bcdbf558a7a8e6a732472aaf6020d30821cd3a04a5f49ff7ed41549faf9ac8ce82a32650e1cab5a4bea50f749d51855f76d7a2ba7ecfa0026ef50d9002c1f455fb814ba024122311757feb22ab7c2723a1cd5efe2a55848b347f7b62aac34ff7369b0cb479714e97fc943a136b20fc1149e900e56a9e667b1ea9d2691ae9ec72a20e722d5a4c87ca9d51526d1a37b4dc0638abd12d1f58cb6e02d096514d8f4de73c8b989052e3eec5f7a7fc72a11cf6ac2cf20022b862b312fe4e4dce760ea7d75ec8f01e595966154033f30783402e9eeccee22712a78a8646ad493777177692910aa01e5f402b47d76c27f43b4824b03beb9996c39dec280b3e0ec0ab390c7e4cc00df6314984cec4b76750627afe99eeb998d02dafd64b9505dd39d889d2f0217095963e5f7e38aac3ac3f5531e285808609db23be1d1ff8d4a5999666b984b6bd0a865ef8e195343c8dc6a2fc3b34385ee72f83ec049991f6999fdcb8e1efebe92a71f2f9c788c6bc6b2ddd84658b1ca4a87c3fec78396311eb498d46d3a459ccc9dc5b8362597f9d67abc3ba900afd8bda4bd20d55d22d371f87bd32898b58eccb42dbc524c8294f00fbacc62fffa1e6e7c6b6707427f2121f9437811e72a7ac0da7563d81b0275429e4e15e5d80b67392bb1cf4a75ba0e4ff27c7eaf72681f41c5b94076ae263c0fa311547a1610fd4240ed106c5c5529ba611dc1155a4541562e4c4fff585ccfa3a425516ff917cab5ebd4d5b219795887362628789e9e996de906eeba05ed747c4a7c532b092be5e7c14750f6ef6dac5983ffab22709d942ecf807869653657e89a98eb298e2e24d3ae263fe4f25ac168a715d476c85d532eba1a43448019ab43754a5c0f72c620dc0856dd7bfdfea72ac7fa7d2ce9705c4ff0c6e91106f47dde089cd6796a8c6c5e585cea5d0744a53c28efa2b678e98817411e583191d64ad5c3896a9881cd6e642b104ceaba79a47ffada4851caa7abdfd8803597a4b4c8f38e278d6affd8934ef17c495cfd3382cd36504f10f3eed146539caea34aca98987dd6f6a2ab44f20346477238e09335fe9ecac88f385625b2573710a88a48fa5da761d39a340974ba8bbfb6f1d5acdab9d8b2c7ceb86cd60ca7da608ea7e79c1659346cf59375847d48504b920364c08bf17d465c7eebc57aeefaa0f3312880108b954892aa76b5b70886e1ead98751950a4af8d5446481c7141c3351cedc596a3b132d471244df56c2a3c28a7a3e7d65762cb431a8e4c093401ad9f50f8366e6b24e9d0e6adaf1ccd219adb4e628eef8d033872c41ddb2a5436b91a8112df55813b5ad6bf96fe9a3b5b1860ee2e41f35873fc8141da0a6753120d91ebf1c4fc8b3b58d4bdbbf12449b1c48331d6e36ec303cdaeb58303eba7e478a2249bd6cf81c5e11018463ab8f5a4fca2813ce0eabef7d9dfb310060fc7b0267611463c81ec58753450ab7e7f58c7b3c7c286befcd33fc317c55c4401c1a1dc3617ffb7cd049998449927387e70d519b7d07ac617f193409e6a965ff20953978269c3e73dfeac852d3dd7a09a058d6a79fda1133992caa3c71ab2a85f857a05308b027b017d085d73fa9971e87e527e23299766a1079164e70d1ed7750ef7e25a976e69aee6e35e1e46802b958157043aab9f5b8132a250fa918cdbc69a8e1b191c06c2c433c10342e6f6e7422635058914c099ed0a435a8611e141b46053886315b8908a4ab6a0823aa1dae7329656270d54b9c9636205297171cf4e63c4db4e810078d93d765f78f224562a163a5d5770393bb54b666737a0a13fcd5e8024cf8e25973f36925e92823d81b4d6260365454dc01dab3a02b4190448549996fd8ce52a0cdac9ba702bc485d4a62d48a26650fc11c0eeb60232787508ecae3395529c41e86c024c40cd153474d8698f035e8fd450e41bfa57fedf841bcdf891e077c1c5893d7c5c8dcf0ae417f8d141f101a94ca97a859fca42e92f9db94cf11b70204cdefe9ca4e51934a1225d0820b59ab2209c7f1dab9df65e1bc80a3e9a862ec63f73cd38bc4b7794eec4c67691bdf18d1cf601da22bf100ea9883f7c079be1b45647b2685cabbc5f5ac0f43fc96ebbad1e3ce6c7ffe25e72387d0ec9f3efc81de04e8c6c1b3a900aa7aa9703394def15d532d649064b40ddd3fc1d71287bd5985667356034f8a39576b3492e9d6c4e1f685e159b40085473acf9bd1c9108d8b4471a62ef613d67fcf44b73f22ef17a03c9d10c310449479f710f7ffc66784d065beeea0977b451c98422f629da448a54bdc442b1e19a55e8bac544f6122b1b7d185ac3bd4340f93c3063dd337940b530c39c443d17f15f1bb7052402ea380961ee19a83271eb9c53341996a55ef77ba58a696e3cfd7c37b1b992047985be1a7bd26b053571d0dc84b1265a97d03614c2d45c0df3b61d09c790336d24226ba600c821d29f8d694bcdde887fe9f0c0fae0ee60ccbe55a520eba4ecfc7c9b734612dc9ca777571e63ea32b1738677fab634dd3f0e07d625b045142142d3e204ff5f937883c0fc6c9855a971421e7bdc38bca00cc9ad32f6a556ab243612d3964e30574bde4ed1abf7352fa1dd7ac0bdf387bcec1782ed6d1012886e81fd3e919a53c785cf0c28aae1248766ae9653ac43632c4f6d3123c240c6014ef90111248952452c5a8f19c98e1a97e9d856d7470df70046359900e01b3ac906fe305277d802781a7a02e5782bfea2fd290cbda2d367110ba39c1e3260a1b41d88126b921e1c34f8578a5715303d80d227de9aedf5337b602165972dc9676e40b9b118f8e797606271d736e42b518f74ae72a3333a847a79299b4de1db49f426260bdd5454fdf18b56daef690264e7e675b856fdade54fef5aac36c52657927c1afd0868c13b7ec29be409913cff2b9f357c7857b83321b3380396de09abe5517926ab23b40c68f8c971e6c357ac81e6694b5d23d2674711acc817b1dc6a1e9cab51bedb61eddd5b0d6502fc766505315e2993bf6cb0136f8fdeb9b9cb3ba5bae4d1a95275c1a78b159ee15bf47fc7ca1af3be779ef0c7a3f45e8b66b7c0f03cc8870272ddacef8efc3e9e1867e2ad2958a3d48800a8352a4a3de143f93254389db5330346705d7566c2a24e2a5c4eb5cc432d3e55e8aac37fe77903cf17a13e9e5da6e52febfb491528370980624db7427366cc841aba23a6680aaa39ee760f9c857541e6a6bcbf2a66e8197078b70361f465038bf9a1e44be41a48facc4c62972d2a2303dcf07f82b7ee979a31e292ad84009b529ff0512f13c9cf14ba87f5da317d0e3b468e9ab258fcc87c87c6cf0aaf7db05345edd6309e451704e85a52a2942736e69d0ff9a4ab7b35450ea9162286711d4906a5ce3ea7d3f79c95c93d772d10a39aaca284d118f31857213d9dfce4e0f2d80830c0816fa8c6850bb1f0a2a117879185361d7ca996ec4f94e21bfcf117e396de524f3e3778540bc06673decfc447b8536574bf8166febc99b876ffe55e6777e8ed486cebbcd594a307ba3d5da6e666dcb1ff95880614675aa92bc3f1dd7630ae7b84c07abdd42254b9f6961246f2f284b12e0e32265603d0df6d9b99184d8acd3b064a4bd22eb031e244d269308d4241b05d49a5ddd2d3ebad6701dc8eef502cf633d9892cf84e6c1bc2a53ef2121e8f791bf2fe36d631b5f3064c5ff47861c969c505b5d2041cc68d922bf12cfc6387d124b2ef3b22511481e07f601765930beb55e8781aa71cddc70856729453aa7350719d9cacc1e23f87b64c70b0ef52b421faf36b393f2a57889e42f59fbb16ec710fee23d770b5645160fd5194ce609b91291de4eeb49588ac272219fc701f29a2c3fc50dcdc0d2d01954a910b963313b61dc88260c7c598ab3bc79bddd57ca1d42cbf8f1f0d4b8186729ffbbeaa668550fc36e510fb3c5970804272f57c7622f51e63303ac3bf5b0ae45cb28b7c985889c39ccbe15b30c3909d093093aaeba34cd089bf87d16e07257cf21444863ec1d131a5e8a5724d02959e748919cc18bb8311d5c7452f390883f7b693d2a0b54519a6ca41f9f35443a85ca48e8481cb350851bea417ba42be4b3bffc76a7e71f1fbe9c9a8319f61a7abecbbf218c377c0ec1c5512ec379ab333cfef78a0f88bfa516e5b0dc37b2b9387107cd09c0a68454762f69d4601a500a0fbf1a5746c22efc2bda7fe595cc53263fb759eb0adf651ce221836c34c8e018a9d5cf7f11f0b49adbd2f8b844d6bc889a8a12d52f96543da3ac3d20f4f17509e76999212923d584a50626b54f4d50d0a389db3648d29371df62dc49ff938c4ad51d8e49805f266555bcf22bb261dc8a8efc0ca6f6d29aca55e110d92eaaae583d4cd784529f7998fbdff084dfc260eb1af5e1ed3a43993971a923b803bacb3cf3a493175152e8ea3af1e1862a467bd1d29add3a47f6911d651e4a526da163b8da718ff5ab6f95d7468cbd7d07b0323a75cdcbf7cd1170d185ab74e47fe508ffaa30fd847e38fa2b42bcb83cf67516db1b773c6c3d5a5cb22f425cb57d62734d1534e816c2fef0a7d30821beae76e216c251e9e55fc1db5096cd28dde7943de9858bae95b7e7032f2076cbcc2b7d934219ed0d3b29cd049ee94ec5ece7ea9f0c6fa2faf6615cfac2caa63424c72817baa90807bae132b06b21567393c8ab71827e00103f0b9cb2a6aa8e50f5260a301d36d6e2e29fe51d46f50b1a7fd7e89a790b98fe62bdae71b24981e1285ae27a8e2e4eeba9e629f477db6378aef7d68492553bf89a955b4ae84f96927035e374aafd9c7f49bc05de73089991669eab370d7a69bfa6f322134b78e67959ee7a2600efae6f37bddbe6c6aa49a068bcdcb92847dad27b4cff7b37bfaad5b7e441124e19eae304059ffe9fbe1fef5b0f153566c05ba49cbc75a057ef7f5f336a06ba58a4cce365cf207eac2ecae5abb2d9077bf252737abecc3cf30b9cbb68d66a69624eddf58e9c8d8e20f40cffc0905bbcfafb57c09571e635f3452e6a459dfa0d548658a9fb0b1837d10478c8b17c1300b42e8eb462eedfbdf85c5b7291c59a05e8bae729ca8fb7e9c32a00d8bf943f6412413f660c9807fc931294e5788ba2f184f2bf69e67703a868be8f0b7029284768f88634a6a185a37d1b4ae0d7b858837b2e23b07d9fd045d73849e5a8cfb279940ac515ca97131e703455ff844d211b281761c751ffbeb44059b32d6a8a8da2062e0a493db7cb050e3443d7f76e37ab19ddc5996828ae143c40e753f64a433b381424363dbd9ce965f84d001c686de80a04dd270d4d3e2c3a9ce3a5fd5e8c50e04280a3d3512f90759f2c4afe03dbbeb8cf183391ce2edae7bc81b62699ef006874cb0c95b8ba5ce0c5361c4e8ef358f106aff304c30acf17015144895b812b4a61b9ac841d8f4402f6484b275e18350278471fbd47981fca3a0be0e5740ec259867f4e88c716379f4fcc43dcd432904918a0e2a4e2615ec7cfc2584c202722413c8a843bc3625ed9fe76da0159d85ce5ba462c23d390f163e7b08c4c1f160e8b4989cad558d913696b06817912b730edef40ae3a1d727783ddfb5fbd0a8271d6d624253957b6209a3e2101afc2d2df082304be41b2141a6e5c38eb13df0874cf402c9cf57f6735dfcf0422e86efd775fc578d64f78bce8a0b1f367a0c7cb009935f30c13a7713b029f6ec3748334b3205c5d2ceca3abd81f032003cc90b6fb23cc284dd690d1be1c2bd3602b60891d3a52982858e275eb6a1ae5280145c34c207c556acd3eb36d771f10e13b1f3a1101c047328e40d4cf45bf7970f14d91c61811d24a852257d9bba4821db57af1b326100fe262b492fbd7f697fd86cf44b5a59c3e86d2c22608bffbd534846b9bedd97553d7a047e834249650679a7d018e9efa60eef00637439841e761b481cab5fc88fdf3c8d1d61e22005790c9b1b52da8160366b372087f3f7cb1eccc303a85a8879a10fd6cce12319c9f64b95a3367d885268d647a2ab5f43166b2d5f94516b919a55c6a03516207dec1c0e73ef454c3a52487552109cf635c1028883040af0969352b04f142c5ce8a2ac5a37531dd7b6a3557533c0ee7a25fb25eea77de284898a0e5b57066c1edcaa2292cefe1bf43960d7723c27f56b3d5054d037cf14508571a36ae42ba5f9eeda34bf5915907869bacc66ad83d2fda0ed5ca9e3b073ae8ec047d4add458669015850c248cac2f8b39f2da267264e7bef215c6ff4651b36cddef2f57453e5ab6de7ba7a7999fdc66fba3c60cf8c070dc2e0bd28c9f4cbfa049f4af736f80bfbc80d585831d544f961684a35b14a41dd40111c4274d356e9f2fffbb4eb77b0edd58a4490a34f5a6b834ae596f349ba131263b7e7318a4646c936475864fe6a14b0fcad82eabf7a355ef04ab0718a8a3cffa114c551f44a6a71b864420036885b89c998b7f47308426700b800176268b6b9cee4af3be48c003e6126cf4cab9ff061606686a373a21a7a4a61ffd7df5eb769063ff6bcc3682c5ec432757df673f9aff6c1a5e8f675790f8a6b8751d7c79f8db32b302c1d3a9b5108e24ff30c1f2e68b4801ad433b141a46e9c827c538600278e65a51f8ebeb8194c77fc99ab4c91a6fdf75c292554196b8eb006e652c7c97018db8ce3f7a21a73296bd269e6fc1c42d3d02bfb145a5e4202d6056f40562bddcab9e81e69add85439c933ccb2dee1b333181b2e174802c8cda0ce8bd936e20a418794fae6ed58c0e9b5ea91e61cedc091665bd7038d7af7cc9175e6457fd626c351aa03a5d76b86e8f090624dd7a6575c3f17994423f9d70677e3a84d2965ee6d4f70614d7c8998b741a9e9a81362a1b3f7746013f35ea2919966e3030799dfb7e263e63ed9a9a936a3775c17ddc139a2aa369d78777b53587088739a8ee9bcfe03f561541468090308e6d21db9bde1d40095d34a9e0a1513a7fabdade1309fa77f80d4f51bf8f92cd49cf74e48b80d0413fc9fe861e91c431838091e61bffe94a9a8f9b6448660dc7c3fb8ab8c6a9467c4b580fc6c588b702945a125368261312a9c40e781066b77dfd95afb2278b4a737a0ddec847b48045366688b9424a694390a111165ab4b28f2da525cffdd81f0e3624e10a52ba2f3891fffaa0ba1c650ffe4509794a404126470d811a81ddaf0464d5a8cf31b7238e75ddfa9999f975136353ac68eeb39d1a4f66a71170590e6ba91aba97ac7d039428c85fa425d6d707acf1411618a144f08549f74ac6938fdabc25e7b7a44edd8b3213fe6dfc62046da4aea5f4b85d48c09c01a994ddc9eb0c5a190416868476134b991eb66f16b224bc770cb2df36f42a33b413d36e3f02965f9a2c3bbfbca15be770786376e7b35e7c5a1c390ca07f98f358b981fa18a0a0bb6802d3a67c4d2545252e71ebfa6df775982ae70f9eb737ced39f1921263c16d261f5cb1b84dbf1a3a578fd9460cdc6122265527d34a19480ec6851cd28b0740a5535a9b45d15fe0f9fe60cfff4e8bc840a14ad0388df257375ef8c0729eeef028cd6aa863ea0cce6951d4a6adbd0052ea14349f4726ba763d366319da7e48191ae3faf38a03351e4a5af31c70e3e4f69cf995d783853ef70a9570ec0c7fa1893ddc28104bc29b905e66d618434d4a4c80e5e1503a771751e3f84836e63c020f7d264cd62cb39acac61b53609c3a399e2ed4436cbb5b83f185dcccea986e5371f030bb0e3a25316026166aa81c8a8a3154b2591c52552f1c30da447a2f8377058202dcd2dabc90976bc9b3a0fd1d782c2d9b3fcd68ee62dd5bcd2813c4d80025337a5dde84223aabeb91a12a52fe38fe7f2e5d689ae07233260783eb1720f652d20789dbdb794dba5c941da246396a4de7cf19fdf481ef78ff59be601f0a220b7e5991b25dcacf8edb5a637105fb139c8d7d04d9e88fe3559cf133aa38725b8a4cb00a491652676ca731513d7e03bca1fa57b648a25f1f7ec079b7a1aeec7598e1c0cd228930df20e2aaf0fb97c8cb8e4567d119d3ac25fee1c0e031575eb1e1e6cbdf7a6dafc444055ab1646ed0e0c63774b222b99e08096a0d6a09689dcf8b80271f0082babf29a6260a9ab5021edec8e6a3c7f915e0b742437e420443def7aa3f9aedbb3089fd0473200c31d7ca20e403d3bdcd40b6e73dd772610cd582a1d07d07500f8c043a1098fb3a120d93ddf836c3775a5997b9842bdfdc78615dc83d7bbe97ec7c1c3d4ec504158ab297b755facbc9ef00caaf5c6a4ac45e9dba22cc5b73350a107e123276b84d96601fed3f2e1af18ffa29517dc9cd046d273428627889fd18ddf6a8ac8901509d53bcb3026c62570a0370505ee1d6baeb689955c4b39bbff2fe875e5b9d3eef2a5f61b570ef043bf8d7b7d8090b37364cf01f7b5fcefb538998eff4fee8699e97fd0c91a62c4960b64e12454eb31fc19b3978baaff0c43bba5132c12c27a8817a3e2ac0bb37a74dbaf602504d61538ebcb03aeb277acc64760bf3e0ca2df55da1bcbd00187953c3cd968a90b74beddfe008f90be48bf959091b68f2ce78c0427705411b23fc2e764957cee78869647b67b61da29c33403df1c075730af2246ad2bbf059c962b84dcaaf2de43237578b2efb92b1f66cd6c29e5f5adc2304a87bc416bd71c53350541d444b768f9ebb50ffe3255001f0fc4fa804731710025f253bc005adf1aba619ef6168a5722b185d5075211abb9b09ed00db760dee50167d39777151d14bf12ae9826ddae793eaf601c8aac2f1603dd3b62fdb91ac326063c999e668d7171c98a91705a6fbd617041517afb93d322a823b06ea31a0d6129b0ff9d060305d6dffdd764d02efc129a666ecaa0f109c4a30209c4bbf2cc2156e984c9663ac4bbd655a4a9678e735cdd555c9b73e34480e7ff2878c5f0c29e6d2524ebdc6b67fbd291c3f8509500460649f3dce066879ef2c2884902790fb1309d3e3ecb6dd42179983bd11dc7c6180f27edf97a1563c385127d43166cedb710db3eb326355d00ac08aee1ae4b2b399f357695a41b25ee6dbca79d973e294a25eb06f5159c44f129e2a4068d1dc1eb8f1512dda907a11b911c85a54800f65d91e5dedb9cf1fe7aa027e3fef4c6de92c73e56f96e368acfb62fb156609c72dcf3fc882f9fb889b15b57840114d3709482805b02614c494e95cbc5e382c61857a1726ffa7a88cd135fb8e7ef8e8f24169aba8a356c0a1cb0bf90b26f0d6ea59bf882f653d7630503054c2e9785b21c83f9c93a33dc13c1cb3e7f3d8fd5f40e0e92af02cc4dc37bd1d49bb87dba6d410523b4031974279d9275920fcf8dd50b72e781161bd8a6f5a5b70b096d94c671a0bad05b3ece99921cc250884eaf550e685e12a6e00f59c8a8259c492973ed998444f5b9797b6c342a49aa808c54ef3dc1a65ae297db972936f7cb88fe731d572f423599630d979142643e263e5a773d30915fc2ed0d785197c6bf6bb86156607b328a58a4bbdbd8bb7eb4a2cca4b9ce799b20c8532751c2e088f3d0846326a69d42db34360f8e0a3c5ac1cc5dfb5ec065d68f2b4e5755f890491ca7e56b65a9e70817e50683241b2079fa9fe7f537f67e4434bd5dbe9b194d6913613143ec838a1ab8b219511124290a1d927944e270325cf7bbb21c3a01fe787364101d87777bfef36cc977e47f787d0c39e604f840834d9f086609a28b6b49ab83155ef32cb6193a9abddcb06a6993cb40a396c1e085f600347c2b7ea619eee2c5bb3eb816d2822c46b47d59f1b639dea69ad6a6fc19b2d5418eb624d5a92f26e550e71da463a9f0eba29510dec09e59977dbb9522c9eacda7a6ce1f07908bba9999b86087987c2c38f2c45f85a8de97716957581746b992239e0c96f6d275e9d07e36713de9a5a3becb94ec5621360f8d248a310075ff378af138703e50329bade76649dea85a90e5f07729a94cc8e4f48296f0a05c36c82e3500e6f46b9b1db46b420c39de4b7d1fb13e89bbe469876ee4b244f3778eec28e65f3a2c2e7b2b311e6f8d365d8988d5822feff28cab30b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8b9e0f2b3a223d82087ffe594d6d7829600273de919a96d0f2452c8716b0e2971dc02a61525f8694b8eba3679238b73ba37383d4718993a0646bfa1c85b7e36df79ae1261ff4ca2ce7b777e45a1a3517acff247e2222ba73f65befb42d94faa88a8c145af5154477f14b5a3cad90858143f159c5008cc5ae69a762298adf36ede7314fe0084538acb9229198e301e0ebb5ef62ece69eca57cd1fc0b905a662c98fa62a30bedbd22ff797add0a167e1e953918b132dd4cfcc8bf7b3ce1cf3002f8917dc4552848c9bc21771fdceb0fbd77dd7618123234b6743fd29dbb18c23b4eff50e38e0409f2a2cfe4bbe734ac85d85b5fc05191402986dc2d4a278956e4fadcc1d641158c05428f7128138c785bccc8c06c59ba5b8988c1c3e5fc92bf40a959662879fc2f4b00a462335ce971e7f7b7553261c798912ed9872328842a1394c84a2af5f1da00fd5dfaa87b37964b7ace8bd7e110aa7c7c65fce19a17c8049488e80d95cea228134b5f05d3f17cdbcba1887fb38279bb6864ec4ec191f1d8181784b135b363978b89358ab9bd8bf0848c1bfcc1934e2de2eaf3f5d2dc23d53bb0f415ee675bac37e5d1e48585a105c9478cd94ace5d1059fc3258f7cf8a197c9bd0ec4658f223053c53101240ca478c11bc6dd8b94462c1243807156080b7f827d94ec85674b703f5fcfecc7f90af2f65f9ba70bab70e474b37b2544a425df406dd0775a5d8719e2316963d53f13708b31a67d7a996ec0b1c4e320dfb25938a4d081e1009672e318779468ba2d5d507d924327919f0b7f76bd45a306cd4fbba5b2a0e945eab386caba321d452a62ce40d1398a7ca5e447329e657987178f006617ca5191dee1676d7a3a566f841c8b82cd9e89bf947c3fbee75125093190d512cb70bc167c29f62ce2c4d82c7279b27c011c3a1e5adb5dd8b5cf64a250c590a0f13be4f38ba4c688f6af4496c396c1ce97cd371499471e890f1a421b94d404192af783fcc4b7996a5753725731782f8b9cda9f82fb9a089c4bff3bda28a2baf48fd97443bfe8f95ed711efe9ccc4d2e1b65f5d67bc49503d8fcfeef5df2300b2f2df07382924451c22579bb55fca85f02e8fcdabf2a2ece3f429204423b39372379dc6d48b350b5c16e18ac78cf212b2655bd8795b21b689039e49820f4e6a0299d74ef23968ffce5c98393395d2833c092039a02861040a9253a0611f40ac89a828c9caa407cf9dc57d8b048d5a07341b8f9061fad1d678bcbe4988db97e9dbdb353e7a8ea5655554b9d7b5992d4983a6db77c5ec95a462354d0db9ca680e13ffd6ac07f75f52462151f914331f89b2dad85cd88d44bf800d4c6aea0fa9c48b7fe25b3ea46ecff43c89e285cbad27ad0ae245c46be7d0b9eb188bdabc3b9b501c4fd13998ff2498aa10cdb52f8e9aa2180b52dd722214560934856cdd413a0844682b450c072341c396fdb1e7232c83311f95461b43d907a6cf2052570cdcae75aec4ebc2d21e111223d0fc4d75df4d53d3bc893baa3fb91ee99b8009d76f49cdaa476894237758fd795f987ec95f88ebafc6e509a9c56c704d1e07772191bb0a9ea2974451471ff1131e8fb0880efec56f6bf6dedcabdc784ca30190db8aaccb5d972ee5227958df1586556fe6c9bb7fbfcc2dba5c2b9c78961327635d147f663cd76a5442dc54e0e1d3930f627c8fb36bd813d59c49a62f5c157c5b9250e58aa02851eea9f6a2fe14857750a558260552d504bb9039d777572fa71f52e88a1841ab10a54b7aebe94046a9a2c7621c4df3b6142fa3a1e2cda6332b927a484fb9578186e5e9f47438f4a2a123e3b7b34c88f5c51739649e5b87c5e0fe8ecd68a6278ce0afce79a7b82010fe7f41d71e73d804601364a3dee89b9b919d51e1b8f3fb696fb9787df427d46e75db528a051fddd1e4c314c3da0ca15e03c16be82a0816fc0840189b0ba45523e7fb1ae5a1c98b384689d8775ac7f675f7f1f4a28368032b30795986ed95033607aa72689c44551243416db292007da123b7700dac53ea18973b24c63e9f8e0331450d672b99d1a9bb7116444c01f46040997d6c720d836e0daa109368db89927d2d6280b22684f581cb129268295b281103746348c288f0e904989ff638892ddca22952fde2cc8cee6dcc4b3601f22e7c27f1f78427c324d57dd56437cb31462909da1a0e1485691a47858c36034ae13a2997b7569d8a81a62494bc56203c57a3c9a6bfa3684aea392df1a537ddaed992814dc81719e95e443a21a85d03f633438d152b2df343acd7c2c570f3b2bfdb0a057c86b3d800c827fc1d4d39a4f6b22f89c3774296da68ba5f37542753eccaf92a8d0742951dc2f4cf4a0d19de7456ad4f7cfeb1a0f6fcf9af6dabaf462b4ecced3d195fe1b2e82bae23af088ed48f9dcbe3704ff614adf382373dc8dd9432c39cdbd48f2730e08be81dcce2179494f98da010b7e6164ddd88f7604b1e813505b6803d9611fb22b86801b986ee8d72a5e6d25dadf9f13e4d7c558e045d6c9ec1f7a607414ed6726d08ac780a2dd5bf5cb03c8bbd896fb0d94aae4925eb2f24ca2783b7a061d9bed376b3724ad6393ed08c817aa5dd9ffbee22f3656d0948d312264976dae5c6b2dd5fe93dec513c13680c5371a6f742957e248ecedd5220472c28c930d2f2d863e52d15af9e1570a88b01c9632dcc7f038c4e264d83997f3694751f808788a7a652b5b00361b7588a0855f6fd123434766ef36128b2aed370199f1b98d62a7e8f75e6471e248cd7ad615d1cf5a0e037d894a007dd467211ed07f0564777b676f88de294c659b5b7ec9dc46f68529f518d85d5c9be6b82ecc73137a7c3a9192258d189ff7efb598d202c501c7606b48c899b5c9aba85aadabc1d67c055d998d2321016823e4dd6c2be473bcde5ad5c7f4264ecad21d7252bc5418e74c99d7db7675aa9b5383dddf1082eb6bbe1efbbd05487ef3a61315eef3933d32ddda3360712724cde070e4ed36349abb3f756881d3dfb7fc71e646277abc197662d1d81b24b70663b347c0e06a2c48fb23fb4ed42716a72c09033b386563a08968c5b55dc9a77c7789896ba14266d3023d388b1811b87d21454a90d8d5853183d3ba3d3d3f8af59167d120ea504acb005d73a8169f59c8c6cae07dd77458f9b28a11a6f08d65acd478c814d0eccd98ca43ba251804df69c446611a42977b6ef9c09cf906329317c0930a6e15832957e8e51f34ddb288408d57a55ccd6e9443cc17a81ad57bbc52928e855214afbf1fbe48138fbb25a71df3a1cb2abe803df77e7f7086ba591ecb7f098b0d96178c161a9ac146fa4666731ceb355c7c48baf392f2f02e3545d448c0237c4b552a6e6cf0cfcf28e130ae50e41a9c491bb05d6baba768677bbc68b682e136c6829fc30c93a93276ca96ab5170e3c41d47031a0c1de7fd5dd6da9730e79ecf095dda3ab815e3a7f451948a098bf915ca849de967d2a11ad8ff0376172e67b065364d3bb28f9ce095fd7f31df4c3e499d6129ac17d3e1a243937503878833ebc0280f781c3ac14164b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe950fc8893ce690c41c30bb1a9846adcef56fe53eeb84398327326ce74b71f9069214cebea7c0677ad4c1c530bb2516bab0ca560779be256a7260acf5d576b9b3118d409387e386ddf67b1f02a03542b092edfb32be734144f947a53916972e39d515f7bf0f4839e721dfbf7814e4a990deaf77cbc2517c38d54e651caf8a34dfe0d59daf186fbe30b578aa59f9add67080011d2b490316ec124cdf0f936282d5d0b3ee9c1c79fe5f6cb5d7a3359f607b62472ea5bdc75008d17e4e608e514be761c2 +"); pub struct UnstuckSnowbridge; From 33d0bf4e61ce9bda7f570258e339b5df133f1ad5 Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Fri, 17 May 2024 18:01:26 +0200 Subject: [PATCH 10/22] misc cleanups --- .../src/bridge_to_ethereum_unstuck.rs | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index ba94a375f5..3496899cf8 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -20,13 +20,17 @@ use crate::{ }; use codec::Decode; use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; -use snowbridge_pallet_ethereum_client::{CurrentSyncCommittee, NextSyncCommittee, InitialCheckpointRoot, - LatestExecutionState, types::FinalizedBeaconStateBuffer, LatestFinalizedBlockRoot}; use snowbridge_core::RingBufferMap; +use snowbridge_pallet_ethereum_client::{ + CurrentSyncCommittee, NextSyncCommittee, InitialCheckpointRoot, + LatestExecutionState, types::FinalizedBeaconStateBuffer, LatestFinalizedBlockRoot, + types::{ + CheckpointUpdate, SyncCommittee, SyncCommitteePrepared + }, +}; #[cfg(test)] use frame_support::assert_ok; - #[cfg(test)] use snowbridge_beacon_primitives::BlsError; @@ -55,14 +59,18 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { log::info!(target: LOG_TARGET, "Updating beacon checkpoint set to unstuck bridge."); - let checkpoint = checkpoint(); - CurrentSyncCommittee::::set(sync_committee_keys(checkpoint.current_sync_committee)); + let checkpoint_update = checkpoint_update(); + CurrentSyncCommittee::::set(sync_committee_keys(checkpoint_update.current_sync_committee)); NextSyncCommittee::::kill(); InitialCheckpointRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); LatestExecutionState::::kill(); FinalizedBeaconStateBuffer::::insert( NEW_CHECKPOINT_HEADER_ROOT.into(), - snowbridge_beacon_primitives::CompactBeaconState { slot: checkpoint.header.slot, block_roots_root: checkpoint.block_roots_root }, + snowbridge_beacon_primitives::CompactBeaconState { + slot: checkpoint_update.header.slot, + block_roots_root: + checkpoint_update.block_roots_root + }, ); LatestFinalizedBlockRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); @@ -90,12 +98,12 @@ fn is_bridge_stuck() -> bool { LatestFinalizedBlockRoot::::get() == LAST_IMPORTED_BEACON_HEADER.into() } -fn checkpoint() -> snowbridge_pallet_ethereum_client::types::CheckpointUpdate { - snowbridge_pallet_ethereum_client::types::CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") +fn checkpoint_update() -> CheckpointUpdate { + CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") } -fn sync_committee_keys(sync_committee: snowbridge_pallet_ethereum_client::types::SyncCommittee) -> snowbridge_pallet_ethereum_client::types::SyncCommitteePrepared { - let prepared: snowbridge_pallet_ethereum_client::types::SyncCommitteePrepared = (&sync_committee) +fn sync_committee_keys(sync_committee: SyncCommittee) -> SyncCommitteePrepared { + let prepared: SyncCommitteePrepared = (&sync_committee) .try_into() .expect("checked by tests; qed"); prepared @@ -103,13 +111,13 @@ fn sync_committee_keys(sync_committee: snowbridge_pallet_ethereum_client::types: #[test] fn header_hash_matches() { - assert_eq!(checkpoint().header.hash_tree_root().expect("checked by tests; qed"), NEW_CHECKPOINT_HEADER_ROOT.into()); + assert_eq!(checkpoint_update().header.hash_tree_root().expect("checked by tests; qed"), NEW_CHECKPOINT_HEADER_ROOT.into()); } #[test] -fn checkpoint_sanity_checks() { - let checkpoint = snowbridge_pallet_ethereum_client::types::CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]); - assert_ok!(checkpoint.clone()); - let prepared: Result = (&checkpoint.unwrap().current_sync_committee) +fn decodes_checkpoint() { + let checkpoint_update = CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]); + assert_ok!(checkpoint_update.clone()); + let prepared_sync_committee: Result = (&checkpoint_update.unwrap().current_sync_committee) .try_into(); - assert!(prepared.is_ok()); + assert!(prepared_sync_committee.is_ok()); } From 934eddd5aa37ec227ae738f48f92ad3538038b02 Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Fri, 17 May 2024 18:49:33 +0200 Subject: [PATCH 11/22] rustfmt --- .../src/bridge_to_ethereum_unstuck.rs | 128 +++++++++--------- .../bridge-hub-polkadot/src/lib.rs | 2 +- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 3496899cf8..0775ea1b04 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -14,20 +14,16 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use std::convert::TryInto; -use crate::{ - weights::RocksDbWeight, Runtime, -}; +use crate::{weights::RocksDbWeight, Runtime}; use codec::Decode; use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; use snowbridge_core::RingBufferMap; use snowbridge_pallet_ethereum_client::{ - CurrentSyncCommittee, NextSyncCommittee, InitialCheckpointRoot, - LatestExecutionState, types::FinalizedBeaconStateBuffer, LatestFinalizedBlockRoot, - types::{ - CheckpointUpdate, SyncCommittee, SyncCommitteePrepared - }, + types::{CheckpointUpdate, FinalizedBeaconStateBuffer, SyncCommittee, SyncCommitteePrepared}, + CurrentSyncCommittee, InitialCheckpointRoot, LatestExecutionState, LatestFinalizedBlockRoot, + NextSyncCommittee, }; +use std::convert::TryInto; #[cfg(test)] use frame_support::assert_ok; @@ -42,82 +38,86 @@ use sp_std::prelude::*; const LOG_TARGET: &str = "runtime::snowbridge::migration"; /// Last successful imported beacon header -const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); -const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = hex_literal::hex!("8866b2286167938628be9eee938d21321837025f93725f9516b30dce5f8c11fa"); +const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = + hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); +const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = + hex_literal::hex!("8866b2286167938628be9eee938d21321837025f93725f9516b30dce5f8c11fa"); const NEW_CHECKPOINT: [u8; 25122] = hex_literal::hex!("80c58a00000000009cde110000000000f118ba039276d46ba87cd50790e2547060aa6cd260476bdb499dc38ef834d618910884d25c9608dfe669a39ae64814db99553d82cd7a5bf5808240d2dbef04e6035075425a8cfe9d2bc194fa1ce245681e84909e4159e0c5cc1be7f876ff57d0af821d9b65aecbfd133c02eeecf2d8f64a164474274529f0a0fa9f8ab033cddc183b5dc028ccbc6c27887cbd65da8d4b8d6983ebcf4a910e6e2403b68f52628fb555e3486e21fd446483ed9df35377b07851e0e07803b7af34cc02494fe7a71fb32ec66a1c279dfa9e12b96b4a1e44fd1d3ca5db007ab2b953f6708514bc65ea545ad562b10a900bf3d9b25b5153d552ac07a256fe4f7761a5f9fe130c8e65b8f35ec53499db3a67c630148b7baf1ae8b79c00ed0c5f8f808bcb9e01cdeb963d8a6319e82af0f8a64b1819e2b21ddd3b07b74c8ef2bf01450a4bcb4180795b745f2f11c449223cb5590c155b284ef45ca108dd0c6e2ebeeb1e93bf710e1573e1cf7d2e3ce4c45cd5e5cc6aabfb110fc1c748b6a22677b333aa36d283f3d99eb09577cbd44b3fe69dea5d5651887877aac4f7f7eb0856e272144e187aeb92df3bc4b789b16ccc3b9f014b60b56159692db7f9ec5f2bbf753c0e19a5a22400b614c45da5ee07ff2a4558c2038f3772f2da1772070d65ecf063b908ad751a192cf1aafe980d1b628aff8bb34f7cead01aa4baf5d8be084e112f2cad65561c40a0932cbda6d5d37d6650500f14b7269575e1ac157dae537eab19abb957f40043c71954cde60e164200f453233a8b77fcf8ffe5d95463b486da0e6e873a1a00d3b04aa4f0672ad6b6d03180cc0a089adcf50b7e3688c68b47d1d5812972cfd5952b4197c414bfad6025d8c8f060f16edcf8ba8bb9075672310a1e10745e4e90fbbbc61f2fcecf5399045b103317086f544bef7b5414e373401b13893a7520fe0201de90c58991af476a86d9eec14cfd0baaad4278204b6d822cd32414da207ec86da840cefe31c5cbfa6ceff0546294c296e6aa5683093bf0a69ba502c89e50a6084b899a36f3d60db2dc9ba128210c4e75d76e83799132cbd4fdd9fd17eb704703cea9df391c83d66a2d7ab894cb5a15a575d1e71389b8c57d63ea48017254c02c106c64b3e8aa0c2f33b9af3ebc44e541aca5e69cfae22549ee562eb8e825d81830317e565d04563ed05fb8682f1ff79e0c855990e03a9d18ad8ce8983fc55deb5398b333a26db57d0e690ef6ad56d85512859d9bea389877d01d3fd8ce1a0517c87ca515b12ac524c47439b2c4c00b553f8a9a6831fccd0641f8eb33c0eeba8cb5ed88e035f5bfa079644258f5077483b45589d5cf4b53915bdab34d4030dfa8ad85af76e194db58d453df3411431cbbd8dd19e619ff613cc3cc9e88745bd1b3d24422d3dd4ebd82467bd232600401a39fa3134a2cc099b690158e52694b2141ce2979ee84416d8c89f55c23cfab2804e26fa2f58e96fa9d8e7f7fa8c33022247ca0cd1808fbccfa4f3dc4e70ed62e031598f4776745fee59bf0fd5369246ad97c2f2798e808fccf295ce5f8ad8e7e70268d6667508104ed10beb70a794196a3b7c7e7188e766d9a68d32ba7297f9f916e7e20f5afe0a758dcd16953dd81ed2ef48f4d8bc8190f601dd3da1df6f78ded9ced42b00a310957f65ae029e7e170d106e9593dc2df9b54d9d6692ab68e9d42688304fe8257fdade19bca9d162c83b3bac4b6626979a8fc77f49105f49103d55374bdf18e1638be1d8db2945dce2a9b7ca3c772605f9059f0754a06cd170268ed71a19419ec3c88bacb63bed8086c29322bf2d5ede197f3dc626dc83fcf7d3ad2aa959d28c9f659824abd2e7392a2658f1cda46be4fccca644292573c21ba76cd183817fe7d59641bb39a369f4b43237eb752ee6e0647a94c0cd1ee669010a851f133e7d674bf23e6ba23028bfcf6ead7d960833ddf004e335b83ee062938bf9183c99d97a411ee79b18725de81a5131e8c8f0e5dcac8837d036ed9c85cc02314994d865c8476e63100deeb615722ad6f8110b209ba9eff76fbcbff25b1d83f31e7439c00ba009d8ec4f87d32ed566e7f516e7dd48d085808641df325942b46d98b616d8bf622147f24e180a6be27fb74e042439e19ab3c73f833439a86dbbcd4e0ac43db4b891b67155ddb007d2475fbb070e847fa254273b63d0bad326ba60dd8c0849725be0496d270c2cb30804da546d94b3071e6de53a2ccd167acaa2439920e9c77e475fc120a12d91be2176a87f6c7f57061fba362e5c38ebd01f01c659c3631bccfd6973d68beecc3b363ba5ea9fe3918cc7629672fda8922852fdae18a99ca7536861c73a6f241440fb9116ffb3c9144d649d00255a4f15b1f6afa5c88e59885eae06fa271e0e1ab7b5a1b4ce2827d3e2cb309ae2d58e98a926d2ed525a8e8e1d4bb55f621eb6f688ba7184688819bc8aa9e95b114b78584247ab2f7e8c217ca0de8e219646f9c0184d03f292bb3138feebdd38de30ba4951cb1665a81994db24b5105ddd683075f6cf5f884ce7ee6525dcb09e04903424d7b8610a4be604a89d099d71d038091eca1a6317291e4fdbd84837621ae37182bb9eedc4182c1b3e3af35491cfa701ae2f55522c2042e7d8a93a54c2f505b62a748e1377789780f6fd9c54981e93f76b65a7c0010ce6f84bf03154c2d75b1da316b9dc62a2f62736944cb935f2f985da9f6fac23ea4d578136a1b3cd1ad29818cd02e9a72da1779f07c7a9f88b4e9fef6ae1db26de2946ba6edaa1b43fcb1c7e10ad49b9d84d060c6ffe0ee4f2fdcc34d27601a6bb3fc326b7dd600aed38ebdb605282d7346c990194aa7bc8775a1dd5f64c61abe8b375d61223917fc8427e659d431a27391ea0df523a25e96210e17ca85cf5a4f5f6fb6b5c4473b4b92c62609bf31e8bf8402e391e3a7ae63d4aff55a17ac1d97620b97983e3ca421a81ab97f811921df29e09948dddb325945e3a7c53fd68c9c9633321afd3873ce4ebb4a6856b4a4caf2e57a2e2532a20bd768404e84d2b2044b22f9b2e8f76946029db8b84290f6ed94df22c8596dd9c6bce3cdaadb43bc90d1f263e64bc00863fa218495994cd4b42025b22d257d3ab275ca382ee10231e8850ada2b50d0fd507b34c0b74b13d1794ea68c1d594d221ef84f9557bb43495f9652e3fdee490cd327116aba0bde4812a95c47955ea446dd6548aac044e14798beccee03b10a59ea6d9a5a2bf6e6bba2f2130128a29ead57203869d1fff9467d835cf8e7ad3f3d2fc077dfe11769982b2fa5e94379c3a2087edf3bc587d27987811204505bd74d8ef13acbec609ae24793f5a2b101eca199dcfaa4531a987b6524018fbe4c9ffc95985096a67bb041c37056498dc3733b5be3d6d03a001b418ab4c0ef72c609ff263136e14c16e9ffcc8a2c6ab4b3b1bb730feec0a1ae7c15fed5509ddef0e00b8de4dcfdb93be4e6ac902462ae732c20a79209499b9b87870e0476d016889a60ed361c5353020a3ec98e34e63b9f3182ac02fe66da7efbb1a3895c727cdca56fd43edd20bff709ce5f86fe5f9c880c11ec739b9485c0132efeca6f6014be637028ec04a36b57345d5680ca76837e1aa7f14999c928578daf668cea7358c4110d88abfbe25380352feba160638608ae27c8336fc4fccccf4eb0abe8942f11a77c6a39786aa8287ecff1af4732e63c834f325d0719e5870914a7ee8cd22592c42b6bbe86ece668f7b75ab921fb30979ea979d9a67dc6cd4b3ae2cb3751b35f51c7c8fcd75505d656d10fd54bb1afa2d24afe1502740275589f07b5371914d703690da14b54285e8943f0e6c532a977f5fc3c1564048b19d731cba84f69c076a823353ce020094fb46c5784c2098313f99c96c539258b59630de96d217795318faa7bbdc52aa37525c7091c8574c4a9a03b5cbf80963facc40ea68ec48cc24f71f3337c8f7871aea9a18aed2b1664c9c5f5af76dec55f74bb441abc21da357de621473325018aecc06917aff025087275ca4f964b8cd945c7c41964fea49386cb3ed22036e0474cc2def65a6a380f9a120e5560722b942f5b88369817d0a965d6482ab324b7af23bbf854a41fc2510c2898712f6177f9990a2587a2fc9d2cc0b7ff3c07b5ed0ea20c24bbaf58d5a29ab1c64f42e8d94ba4400c65a90a6ea0a7d2623dca1b2e4f74a4374faef87e0a77b09a1b45558a9b81b9402b933317fce57824dca4b911f066892672e667f37ad0a750e09802784f2a0f6ca3a675b5f6a6e76e96ed60a36cb09046b39975f8575adf33e2b0ec9eea1cc61ec6364a0ebae32e9902129aa3b174c0332bd338a33dd91cd8159b47b10883b32a4ba60759c14f12b8741582bce5cfa0f7d86743e0da364170d9677cf448d7fa3590256ea01dcf11905726b88b15056236d8b65ea63039efd66b7fb4f168e6ff46fc5f7d7dc734d2d406153340788216a5df6ec9fa169ac78540cedd4fd9a00382798ed054223ebbac19c32a0e02b9a27c5db531e507c1855fcb354bea4e484bb30bef99bcd63be47e4d3d4a4e0249f41588a18519584d6086e0b2039b5d14130a4b6aa53a088e98ac24da38b83b8f1801b612370c71613612bae8e5f1ec6e07260fa081bacbefc947bd612ab85eafe775db1aac43fd4abefc58d49aacb57307b29ac2ba517af4e7b26d6a836338d6c8941db0bbb9ea279d33bdb9632be5ffd687acd2b9003040d346aa947425b475d04333b54958b6f4600f7d7456050f160e2a078302e7011c634abff5e0dc08880d5cf6ec705f94951273125ee1886396fd14df2ebb8f39e6171876ad7eb0797e97facf88217ecb60eda8fb336efd13715928f1311606187e38e0d7a4cc94d9a1a0c36aca43f3a98440724e8704b935fb52a0d9aeb1b8861c6a7c4535af798f2d46a769f897bceceaf1f5fb55986a40567a8d13731b4274787ac1995b77d08d780fe788b45ac80dc136504f7e1f8a96f55add4bc347ebcadac13dc5f43436192b7ef765a23dd8a82083dafd346a8ed35890a855a0856abe09f943f27d2ae609efb77499ed7fbac5f5d6ebb58bc1aa061fe70397143434f1b318e3d9aa8f5daa5543f7af91f534d2193d7a09097c373ebbcd9982c24bb1ef2c3b6125466ed13ecf5776c032a3bdd2a77107d6a1323fed662ee74a8650bcf27ba22e9c5172c069b0db13a03a0aa7e689a0c6cccd03b894348e2b88a577921a1934a3888a13c4219057df4393158c7202ed74ba8ccce6491af1b143758cc25e4261cac346a38761c0a6a24f275e1fbb117e9fe566a555e86ec79072ab3e3c17471bd6fd429af98b00b8abe4cbb397660351dcdd941bd3c8b6f77ba9a6f7bfce57d1820273a8000b9a9cc23fb8536bdac8a3f780f0ad86964828ea9be5595640b4a7a6c14427d7cde445d1fa4985a032beaaa5ad2d47bf2a536f25fd855247c5e229f5084f4d3edce308fc0e3e92c00ce3ea6b6c81381cab6d769c81410b76120343202a0fe78b083c4b3da0a5a16d4169cbe2f18fd611cff69d75673dbb01dc2e288335644825e3297a6b94ef4407036fc2c15109ac307d8c83ab4d8029afd1213fc4c2df73da3eb545c6c55cdc003bbf6bd302c8a792263c2ffb1acff931957e761bd98ada159b91c5db7db9cc5708843bb0ff18b82d85d51f9227de4a5292d4cad152bee03e97007f40dff61b9f326121e4d533322a8a04cc5421aa4fbc8256bd21c37943bc25be49e8ada61e5f240c754dae5fb242b5f4e101317143d0f7da29a42dc81dac6987517ff085cc9b2eaf258fc97aba502d83e38247f5ed56a7eaacc68f850b3541a435304344f3b466925cdc531d54ea55988271c18f993ff6ac2f02a4c1f1aeedda7c20082dd5a7c2291e1ee60a449a6b8f66f2938af7b48a2ba01b453cc2d98baa4bb2449139c3cd4436daae2c1f637c8f7fee6e3897534250f313ddd3417bc92b0129c347c648d7773c79655b4aec68623b2924aee7da53e8ba56772cd6520a5c6d78b553627f3de75b056bc618ecb17a94b4d6b60a7164b024a693e526bb32e97f612b92e6a798b10b774f3cc7886a3bf419c0562801baa67fb28b3c02909bca1d542cd6da0f359d6a89aa73760b8d3642e3e688294ccf604369978ae4c9b220a9661205ba7a1fec3e96e2e10d73af9af284d7218dc9c249c6fd5f339ceb3380cea7f5b9ca305c04d9f0322c827bfd5ff8704d9a0b95c10ef7a4e3a332ac2e227beab26f367fd5a61ecdc228c73455890e935d949dfaa52ca8e65dfd5be9d73c4be0f8d2c0666c688de7e98de4f567627d3aedee8eb7fc75c4ab573e3fbdc7adf0d934a25d5312c8ff2cebb7959177aa440fb3a7cc8f4b85dbda4c65524df016c7e77ef90b11038e6da568d6c04bec1d53740d8d0e669d7a7f9ac3e979e816194cbdc54ae7fdee3d793a0006d415e048fe4e0f3f69c04bde7bf192686e53f7783fe7caaeee6019ceec793e54f3d0ec024e9feae6f643b8826dee65647b9f53a51509d36464685f44e1964eafb98b825d53ee3a8e9f85894ad6097a5cefe8daf6931ea7033400c7808d6be6cbbd244a6a694ec9bb3602a1bffaeeb3ac266ee3dafb4a0b8af48486c8c682e70597d5952e78a5fb01137dde04b8dc0af662de6b8a33a890f40e3c68c1c49dba60fa5e7e9d8d1414a36b0394acb7549bdd405732d118ce9e18899f897ada4be16a73a5d2f8e83b36d1370e0d71a3f0b1ab6e956ae959fd878374a31d52c8f6a5a30442652760c9de032cd6e1f621cd557b802777f290fa716771bd240f23217c2993a56aff4205f5b233e4403d73c719b6c483c0ee81c51056125793efd502e3b7be54138357335f7ed5370be3baf470ed7287a0da23815690ccd6d59c55ae1b272d46d2d57d7186e8b2550350b023b09cf34947fa86f24ca0b8b71a3ae3933cf8aa43afc46d87de82b57b3fa83e09e87ac43e362625ffddc02d4bf35f1514f755ebae9aea374dc7720319d4f80d4c9609d0970f16ab5b6ab96d10040777e2ba8dcac635a9358e636fe84a4c9794ee9f7c9e6b4682a4c9ec5b2a594071eb34a5c581d1288678dac0b525b459f96f377ba56a1eb1ae9275d70d33c3d4741e66144ea92f880fb154ce6d5dd8fc74fba41d12e9d66c859a8cb892df9a8d9398a80fd1a746ed19cda457c58fac722259a67573b7add86ce157cb3fd1e01c077e93a1560b2ff3c79c4cca88100a4cbd6e0a40fa3631d1de6e035bc197ab7573f10eddcca678433f231dd23ec2fe50652473af6133bc8c1033953baea90012e2878afa07e842f8b47a328ca9df0d21b58ace0fa8e7e501a5b03313764c81e2786e9489fdfe741521bd4fe299548e89bab19e8847ab274d0273f70f52e71e9003d42a7276521750e5c0792ee01cea2be884920f52075dcd02e9e25c8307dd499764fc029717c2ae5178607d17a730978a8896b6bb3b97b47cac98aba15ab24e1bfbefc5a2f8e2ac0c4eef44b26917de5e7d8b7330fca531689569fbe31003b760c6f4bf17460eb51d21c11b4cb8ac3bb28ba7e0c16d35104d92b1738e84b31cd27408d095984d8d0b20e0386e4e4670f34d0e8a0314500df98a568303486dac06ee4c6b14e1747062c34af8ae21b715a30e4654806717a334660155b8ef0d713e7cd2d0ab0386016b90eaaf8468e75bdedb81aa9f3467a86e012916afc5ed65ee4542016b22a6926c58962decf0319b73397e000a8ac83245564e5ba5adae8e0c76eb64bc4a82e05f9b376185aa44aa9ae831f3b2338badaff0436c57c38e9f3242aa9c9f7c00807a9ac8a97ed812c5ca69767766f87ab3711cfd478f6f60f9218c32a1c5d9d7b5bac1c1093b399c46f3270e26f035fee1e5b2c9680298b570a2db6fc8f2ed1c5b9eb65c8b915378db43893c9f4ad7026c4867f04e286d26c70e52fbfbd0420c4fddc0179675d2b2a5b7a7a3bc325967566662192b93e1fbec87f90e4861809e84e5a691bb1aed7b03797036c668fd07aea5d5586d1ed72df9fce56a6c599bff50a70086e689fe0d102e078358e4ebcf70746e7b86ba97ef46eda5927fcc5bd63564794ba207b1d85a2b38ec7a93e84768962ac23cadd9e4d66daf8f9772ffdf311a1d28fcd2187b8a5f83b03c64dc49660f630303ca5d8e37e4169dfdbddf490dd8f226b29774d95082314ff6112ae77869e72886c7a93bee730897b7d38ceb673d4030283a248b66c62c9554e3236655486c214baed7631a301fe780d283adb6fede12e43e848f81f16b36f97149263fa6bf54484c201f51665e2532f6b29d4037a19bb798d5d73aba460e78794afd7f3dc2efe998eacc597a27ae8c7d0378a6aa42dbbd2606b9a9f0045adc22ca004ac27a7e0b87d282c2102797566e215a456cd34e754c67258a067db1a6af16ee8dd50a863da3939ea8f26e89c5e87c3a35dfbe08a98c0f2a45b297609ae574173d9cd07955814ba24fd0810b686a6a6487a34bdadb76cbe8d7a100e29eb66a4d2ab72df6738d15092f519d8cd1ff5724e359d2cebc2ace815c4c11012aefe433e176b394315c6ff6b31d745b65de56fd842c78de07a1b22652fcd11a340caaf56626a999625d32d762c81e097f4d548d94eb075849beeed2d57c40ff9a545371ce9bd9f42caea334101a01afb0a73bfce8fa0c6ba88e9c159f8009701773f2b9d79f48bb793c04fedf8278efc1a54c1f77a1f8ac4e83e784054e76160e05af8b06e565a5eef9b06e5623f5c0dca6f2c741de8e71241d94055e0115056200cc5a5de25c4cc3a7507e3b153bddcd89bbd9faa0e13c30c6aa4f3b8b28e7436b0564625c15e7425ca2e1dfcdab8a721d5a01314e23358e991ae4eaee313c8efe723b19a22ea8f857667afd92267cca94bc82d6bd73f4a935c2f32d79dbff17f9e54b463911d81d80b3c9d98d45e7a93c3b6198ea8b8223f2223950196950dcd4f5f4d81423d61c682c040b2748e57dd3e51b207b4bb1658fa013f1f6ffcffb5a3df119753e65619a5dca4e507f510360721e37654b76771814fba673e1c8ef24ebcf91f2f7d08db30da1a1b0bf3300a66d992072f15daddfb5d08a08942f14e854dc29c3029f6c27968118aa2d23b528148a6e70f2438faacb3c4ce494dbeef03508206826ca8b0bada57796f4a4cace53a1339b41331dae0c6cd3f620ec58d04dfdb03d0710da8cbc876ba222b16ede82ec4f8839d42d8d92f4e67f804baf44790c00918f7e231d6b79016cccdb2efeb7858e1e9e4a1eaa67ce4bb608790b09894b06bd0803684ef706c0ccdea713ea7ee376d9d6c9f676efecc91ea317cccfebfe465edf03278410fb011e5fbf8d50192e98bc0f65aa4a8615e44660d3e047e2703d60f7a6d08d468611fc0b1a0f16d3293842c80a3fa7de450ef0ae47a084763780da1d7e9755b80fbb07ec7304d1c19a7f6dd3c2878ecbeb46706d9939922b92b3390dd918a11eedccee7188a65503c983b8804acec6bced9dfccde579891a1a884a4000adb864d8f9be54657d653713184a81225a83f314b07e32fad554ae49697d5cd9927761fb78eae1e8571efffc50072b44a3d229e07cd8cc57751a33537e66ddd2e4950793b39d471821a8bb26943e0307d924e82d3adb7fb04dfbbc1b1b832643d84362f465a8ba7bb8543ab793caea761c9986b845aa2ae3d99604185bc12c25019d5a981812348c662cae1795aacd0eea8609ea2dfaa0e772e9aea92d2d654305ab6a0068ad1475fe14f733483b03e768562e563739a412f4d3eff2ae6c19883681e3b22432943b32d9ebc6941674deb3920c52624605ad196bf1f8146689872672ddba241100425d7b73d8ce99f141de338f94e3e6e1a9bd8d6ccc8dc87e585ea8120121308ab58517549e87e8d9e358f7c653af923c2b56a0ab756afa52c2fc5b1133407ff0d088914f04adde7d8b9a840156135b5991dff05165e34974d92702d93d7027d56a6fe2a9004c05446ccb7283f2994cc064cbe6850dc82c9865738e9ee7bd205a50ae83128f007bb1b6e5f330fdb634e823fbb09c279609e9819df52bfd3214635c80c4fcfd47672cd7dcb05a7ffe0bb71867e7061764cb68fed668b00335d6d011be76c3545c4ffb3d54810fae5c498a29ead7fbf6d0c4e707308ad95103f9b9bcfd3e3a66c8cc66e506a650a9a2f55de7724254943e076a0aae77969219f0df9f7781278b9a7cf9960fb6ec69d05e819b3b448910a59f1eb3307135b469dce550594709cd9bd7e2ae8defb1526dba97db70b04c2d361f468a3193fd57d0fd328117d05bbbfed2a6d3ae4a555c332dc38fd74daaa6a8b3b55624836e41d8aad26be0982de48a98f93153b27ccb597b8f68f798789a9d46d84cb72ef3cebc064e428613757eb75c86f535b3dfb13f7abb8bd9216e70f04c67da84b6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651584b9a04a9fd73cde3a56904b09f6ae9f6a4bdcb0bab6c1e5b8e7e0eb5c8bc1d130cea0f4a6be6e364a28021fa476893e87e779022b6cf983dcb394fa936a2245cedf379642716df1a932d899e56a9d42ac668e783a910fa39284ec7ab00f08918acf9119f9e964cfea71404064417aa574c0416acfdbadca8ba43895bfff699cedc1603f781b4b7c353724019562a947afc7e7c30ffe6d9857346aaee04143e19d8429e486003243387444b718ddf52bf372f542a95e1280c4a54299d13e3879b8e479925aaa84368b47a69f9c1fe7598f0d0f5fa405ef3829299e970a8822e1885aa33e7eb400d538d335ab97b746bca8da82350e3d52a9833f010d9b998af92b54a67f6d906d12fdf22d64db5902452071bfc8fa65fa010d2a8ec2a1b8f3f38fe4c37fc95cdc46a8ccb9743534278d225a5ce233a15d503158e1db6e9d016db93b240aba04afdd7ed2f8f909f32d478b149569b768c13c4f9f7bc14fd5da12bec4692dd6119bb35693bc0ba09cca16c496164bf598d24e5fa641ca59d4b283a60b2a3d30f365014f6c8d79f0b3d878a5cff8f0ef98e48b5864c9e0a450fcc3467e19a3761ff916ff1e2a89f61bb73080cab649a91ad197fa3c3b17c6859b57f49a845fadf994fd36f575724226e32866725d8f641bbf052bcb41c96c6b7dfbb13324b10a801ae1314373b77b6cfc61580c46bfaef27b0b0446801d054be7f1e33266bbc267c09c6aba0c3b81ad54da83c0b627503d9462b75249569c8b97b6da662c18e2269b37ae6eb3e07e995d92466a990b3f8856bbe83a478a7f8725b49285b479e1cb89335af647463a4892216851668daeaadaffb0bb37d8dd651c509c3743274eaf7a2a51a0e1777fd21ef8a1555f625d5f21823aaf317e36369bd5c4976ff3c848256df750c421c9145f64a59a62218ae70d4684935b63ac3ff6f4a96aeb2910993aa02dffa434ee1ce52cc899089eac0c142a6d2ff99cec8107649c42b61a32e9e4b0541635191007ba47803c1c351ff2302104f39c4d5dd1614175cef07ca15cbd0a774dfbb79e897bcce54c4f49124d0abb171159eed866101f8bc4782c167ad4332e04d659c071fc7cfa8530854f8e6e93f21bc8152e672ee134b93e64eebe550f35e53691d1ea6993ad2158006191f1e2973efc194ca0ab66fc174758f0226dc531fb265a560e5e38a4225c01b2bc362af73af9cf446491578ecfd176663c471c60a613ad7a119659ee68c43a5a08cc7c737c58447668644f2444fdd978bda86c60bbfabd0098e7d29746440da19e9ec5c8cba161f299fb9a5a83ffe05ef8433746c7eb6e174b4f245bdd63973c76c73befd9b7230fc8f115813e6651f1cc7445c5622af346dacd00bd0d6d47f204caa07f54d4c8c3a6a1ffccf161038bb7e2184821427e2bc8fe3c8cfddd731c8d98b4e6386d70a6d9040a8a4993061e72773d1a82dadc8c9e0d0927d990916ecc59118eacb586294277fc8f63de585929d522e13f8e27331a96499ff0f1daa43e30176853767fa3362209f69dd13004e6e6f7e898182dcbd2c1cea23b682caf8d9139d4f0baa12592284c3569031f77d4cb3df039991d2d032f5fc61b035a0eb2f70f7cf1177be908cb8eaea47baccaa254a1533cf91f52c586e5648d1271cefe9633f39cdfce209e09530056123ddafaae6c8cf7cdc4a5ee592ba291292adaff17a97ed3de2ee575af0ed4b4705c90b30f42902f7f5591aebc1e5e9a25b103c16aadbae2682df90eddca8610025bcd0254fc55833850ce6b1121defec4a9e502ec46af0293dd87f90fabe7e8eb0d758cf4a6c2c6b4ea6bd2183ba734471c82f41105179d222f34b40dc1df7d4370be2d0b1c985ced4311a85479e7d5b520fad7ad6a30fdf272f3c6140487ce28a9b490c65e3976f35e51d1e5d3147a1fc418c8fb9b98dbb032af3193f1196689423632d92fa81302e998faa9b9964d0a92a7159bfb362749ae88dfcdbb7e3b87ea009a4fa76880b817aa55df06b1d2327b01c387a0b926d8ba31a32a3696402c64e0a02efbfc32af918129a4e2184833c3a763c9681092db63fa29ff811de4fb7f34211d7a05c5d46a890e5e058b18522565e89649c9e397b3c4a2a35065fc996469416425e3e59cf69fb886b9f89785c9c4bdd8c4c224bb826c0c2fe2928a66d78432d240c1aadee7acc061727d3ca44db2ba819cd401cb9404751d1f48f23184f3aca22245791be2ffe23c25a811adae614effe498d6f0c5cb0d2cdc6714b3f23a1c7858ffd43dc1d1be0f760cf28d2d3e64d6310854d6d54471d71e8a8d7f77f3098378ba1e5122eabbe0cb9d224ed4904429b2b275f5bdc45bd8eb71f9d243e5b7e55161ff23e35434e83cb38c3873c037f255995350869d8c06ddb813aef18bdafd7a280d92f25b5719a242000ebf0a89ca4589894f6aaf04e0288534f83560c53c82e472ae8ce54c5dd9812a6964174192b857f8144a77af9c6a86d4d301212ea8137352c14a002fbfcfa6c56d4df69fc9c235ae58b7fb11df3bfc2f087a051095beb722f58d1d1c6b644f989ebaf4bdf648b8addcc90ce1d8d080acd5ca2e6499bdac856177d8b121b77e7998ed394b47a5e6badbedb0e63207d84190b721b7a40037df1bcf45bfee6c953aa2dd319498200365a5518ef7815c71bdc88c1d8c317d9c1174c401cec7eef84e49fd2e13b60210d58cece2b3ef17b0fc0253c68c125cc18e028311623ba3f0ed6126e71e0af814fb5137bd5653b6fd923ce03df31addb6728df0932d710f876b87e4ec88b05fc406b2cb5ebf3a7097068a0a3edf583d44f7a52e042fecb083bc6bf8927b503fe23134d1fca2d7238e894606860ac772a3d371643acac90dd864107a046dcace6e1089135612040ed33ca50ccd15358813ea65077abf2da58b84891ecebd6856ec6da84e1aa05007db848d95b27246565d7fa46b2f4515fa38c33b0c190b343ac27e18779082eed3a54eb129c4e889f52779cfebf26b915227724e16bad10f4a2037128bc44c341f90418332f8037c34cf4e781a01bb9421922b747ac89ab2a8a3378709ed1c401e8445c2272d26ebd9b585127fb57d5d183e52b2e17861336cf9e10e34073a97a4880794a507bdc3c9dc553735787357eb8f726cd7ac0b56559fdbb1e3758ac97fda1c37419da24450c62eb6dad5e479608bbd4ed4296c6ebf812b6a57c379c796a5a6baa3045f715c0a7894427d314ef37f454c83cc888b165aca2a3eae11a768834b6b358bd399fed1dd302fd79ebf951527a448669c516cc2d0f63f7f968d138c3af179d42f02d3c0f627eb7dae2f4489baec3626c85116dc23072b4d9c59f35564137816b4ff91fa4988cca72f0583ccf80a5ce91edb8642758f49118ddd7cb598f92cde96e8cc7873c34c1d50988346307c7ad359a5fb1e2a8f21b54fc1f800d83a5db56f7d3c459500429346de68a1a049a610c86dcc5a7dd737a0b1525791d8712d4de313bf3e68fca59a38a43145074bd0235a4e599da5f58197d353bfa8c9432c709eb3a6a8b533930531b16388e0d9df67c46dd2199188be257c065c55091a1006ee6f8f93677f3f9ba7a7e0989b993fdd53a97b92b7a33d4ab0cda47ed4a26bb9e6f0ce3ce05f9cc563231e020fb655e76ac7276febba742c99f5928f17c2f5788f0f9bb4c3021dfcbe7b86cd1396aac2828455064d7cd2c56cab823e2e1b56e6f41db25ace49d092eddbb0913c13f9c8783bf986e7de6fc5f2db09ca04c6837730c7ecaed255c6147b6974a29fdd2e3b7140e3397fee402c9d478d879aeabb03f0f3362f5b5a2ee4d8b92aa97a0dc8c8465d0375d8e0eb3db05589a86dea8ee32ba2b040048f0ec7ed391691a1cf93c439737fee4445fc2750378f3c3dcef47310dee2ec95558e2fdcd69fbe4eed7fb4f804970c4afb7ea2f54486a6122bb870abac18656546f92efc00660503ed2ed25be1b43275cb454bf1cefe62865830ae736357dee7eb125ac93a308a7144662371d634c3ec003aca83647443cac5f8e8a324d2a8ff69722da02fdaf0f1ddcfbf836411cd5994f0c8f816fc8e5a738d6778d4afadbefd3eb830ca2168a1cd941d037f8f0889dcdbc7321b131c7bd6d6dedbef81e9162b8a6028696391a5f4d40d52e8bde21fc8f4df1396b58d6c9d125cf676a93029994d13255f14b6f7ef90fd6aab2e8d0e8297cb53d7faad0e361be240b127d5d275fb84759ab13a7ad8be346518eb425d471b2600b78fbe5218878aa6997cdee9baa4eb483c7d979162ab1418ba5d4de7c2609837607bfd9e24ba0aedecd13d0253aa10c91fa13cce0ea826bd9c4964e416f9d0ce064e8abe60dfdee2845d2c393196cc17f7f5cafcd2fe059b217ff9b97ee17b779401e701c971a99a378635cb6fa1389d6aa5ae5027d924743a3a4c68919efb780e4bae0b725df4e1b1d4f9a5c3efee2beecb428d4ea0b1232e073350c30d86ca6197b5d079bf1c9d0fcb1e705d2b54951027000245ba068b7c6d9af593e8ef64834d47489a673df93960b90c54ba259150e989c941fef9de78403bd7e8e6961811c5e824f43cf71e6a48ecb0c65f14d168fcab6eca03d7ce316f8b3a40c0cf4a5baab0ca4d339aef0b5d027c75daa258941cd6f6ad7260c1bc5c1ffc463b0be9a40ac7f96f90d269b60c8c583e624e0c11aa951a4542df0684fa5c699a5416067d5e2e26d9e28b90bc50b6f9ad2365f31cab40ec0e58d824e047914b97cab112ac35b49ec606d981c0c3083e013be7fdcaa80a2686bda1c58386aee9507801aec128641ac6c2fb6346aeef8ac2e86e122621b7e95131dbb576d6975ff0c12bd7990c3c94a19eb85efe8b682bb526e5ab6645767b9fc86cfe92101773fa7348076ec58c1991cb182a949b52178a353299114d4c20e389d4dee383d6750cad56fe52591635a8dc94af1208782bda71108f03d9a14a41310c4dae567c7dcb22f1f42c6475319cea9701834164fbe9418a9eb575b516e5c64b3ec3952fa51ba06685f0d79378e8e5e8c0b61c662f0dd48b1a9ad44ca7f94bca32ab8affc2d7f1f48301a491d0d61fb47a59e14cb84688f5d6b6a68052d4850d1490da9a0e764565c4c57f06ca7e23341dddf122499ac666eb2c9fb4cc9190ef9c7cfd595f49a12b383706b7b1424d77102738eaf01ed34326776776f3d69ca39b73ee4706e7bef37ab288554bb51e9050fd7d86540db0b550f463a17485483d5932a3962ba3be881298d314d25ff8716e670d2938f6cdb250fc4a05ee338c0977900498d1fe2b194b1e47b6b674ec87f43ca2d4dc70103395ed85b20574c5fe4c62c4fe092262cb3b06ec0fa3fb7eede7f0c9e7461835c73160998b03c3249eb465667b1363875db308e837ec4843a20773df183663ca92b1af0dbf790cf3d3ba94c95668fe939eaf2cba82006755730e94e86f3ef600bba835371552ec4258cd64920bc19e6618bbdfde8c600bfb842c054040fc9792403147d48ada0fad576b0535312225418dcb0c82334a3f14dcfbbc9fde1200e3ab2d7f3e3a993182af99213c0e00b4e4dd3581bdaced70e7116a7916e62bcf0a78668112d43d23291aa30b3acb4bab4d4bda8d2824192bffc4f7eaa5b8aa056f178b6ddeaedb7e38af6197ec370691a6e6819e6b4080aa8f51e412d504656ee70b782995848b1e7e5df415e86a646ce2c86fc126a21fc4b00d3f4927700c53615b79a72da6124854014aa16f6f8e05e316003bf4542bda9a03705c456d22c668f9d5f8cda0231785bac0986001de9d41aeb2b8b21f4996483d7bf61dac2618a42c329fd514eec5c80de4604269cd1f1f74cffba98acd54dbbacf938dd42c9564b145c5dcf21f8aaed19d238f2ee3519489898ad2bb00f235bfb6b34ed913871fc1ee5af2a832b01ad5be44ada3b1d53df21ea0145611688e1ecfc4579f5cd951a04aa8a5a1865b93fddff38aa6bd6f67b43680efa558192feb644672003e95ff12e9d7616108f4bebdccd422e0a46d4275ffbff3a7bba3b9ca3cf10a4202f71e0a24fb98874ea983b7e98de2dc70d3802fe2f9ac074335b1c002f429ed56645d532d8436cd9d068100d536416fd2b48796dd5bfea7048362d70ad1217f17090d388bcad7f7758079e1d0ec27442731e9ca09c5a9033860039617da07628933dd0dd5c8c98956ff072840ff2128749d747c70db6ece43f1a54d239eebac6b380b71437307bb78741da5f310bb10431164010b0729b55c1686427dfd6ce56e5a24c38d4c64f81f3b2ef7dda5a0e524e6302f2577af7bdc9f898ba5930528bb3380b8b57e60ab77ac5e6df651a89a7ce535fc5f615aa057624745d1be6611c591fa3c4ab2f6c235904063f7df82c374fede0ab2cfb983f4a63455889234e41716baebd9fa6d797ee58fa56bdb5b02e50594e1cf0c43744a26e0ccd230545d79656e6ee161f4a27b3acc65e472f89281f4c12bfe8f3c412fd5abc2c6593b6b8ac71c17dbaf42e639dd4b869792418fded79484e56b758531293cab094cf0895c922f57780ac7a27c7e92d6a8c1b859833ab9753b745bfb17c3e84430db225ad04abb9fd5fe5ab337773c3226c2934809fef9b2d9a6e981042508330551f0e7a248e1e546c42d79449ed43fbef745aae18f3d9745cb1d95669c521c1e1375a161209918ea32cb8cabee764637e7071f3b0d0fffab98672ea5bc3ff0e2418db5a76bb7aa28bc5095c487d12c42be09c7ec7c8030b54826af316d3782353d709c62b16d65e65af2d1f17a2655e46674a0bf82f38f2f53bfb8add3b43bd66041a346c9cb65e8d73d53d077c0fee758215942aea0af363b33f562b0614a186afa1cc5479fb797bff0957b49d1b5ca904307568d147e598869d72d9e9516cbebf153b427511c0b10c9792c62be54c51af4bf6a6fd90403aedbb67669e5f47ee010c2369d716774be289391ea80e07d756ba2669a6825ab425430cb9ca3ac1921997db50c424d7a6b9b829dbb3a4a13de16227ad16d62f820bcedd88aba5368bf9fc4f6206f186572898c0fe88509d87ec32f18108490f7404d856448393ae8440668b090146419e3b93008568800432213455cad46c504d51906674c602f1ef66d5a4caf76ec1ca319a80eddc66f438cc7aee775120210515b19107a01777e10cf23a7915bf2ec11f9e3d3defa70b77291670c5cb99d46bd5d89ba4a7019297cecb1014e78882ce25822dad5fa6b9671431bbf83539e7bf1537ce0b152a3e618c0b1285ce2955531e28c508b561b2e11757ad4c71e86e4f56b2f24d65acc5acacc3601f3d69d5622867eeb72d39c6b9860df450096f5fab66693662ca3e6e36d9e0ce8c486856243a9249c155dc6be52f09415d848af3444603e3e3e94e39b188641df7f548265c9f2b0741f275eb2210cbfa22d522b9cf1bd89424a644b97d1471a175cc7dc1a26a0f180dbf97316b8344a48d2063bafda91af0826a37b8e97c64317fefe2ad1c8bf7e80b78981ac14589c11daba097540122105e6e9a99554343f50ca6b9e6ab4a3ad3f005b5ec04c421e84e69feff6003c1e8492024595e31483ae9117cdaafc8b7db08d732618594c92ddcd2a0c84104291dc5e997ed9b4a149d99522ab2245bf225d848d790824e4630899e3e1dfe6f12e4afec92a1952fcc0d3a5ac8b02ef1c98b4735e4e478d34e0837779dbc3c32c7806e3922561605117e632eee86e250f64033a51b27d2e6fb36f9bea0dfa9931a0f76e4c98f142bedd160653a9b1072b258dcd9d5f86cf1c76f14afd79eef7e17709cbf259f94b7fd0cbd136d0ed5c5482fedbfecd845c0dc52b2fa674d51f26826b538ea62dfa20b4d8a41bd26c0b056b34eb1753281910cdc1c149c14da6cfa5d062fde59dde7f29c1a6a72ff8670e4ff6a7260f836ed9527fb64e8b0e925b0c83269fe58b07b5950bdf8cd209f5939713c5e24ef439b2020131c1fa10af61c4afcc81d49909d0a37441b9861bcf4babf7f490bf3c397298c4a475d1614be8a3897595f83cf1b96d56390dfda29304b1eef5acdcad0a15ab4a13c61ac03a9e08ca433aaf9329710c683a7faf2a613fa721c7ca98552a28b357277c30843222db2d54e033fc99a94c6c59111fdf18f54c287cf4259a00ced3653bf01a9f1941abed36a6bcb6f806662e0c82b94ccd760835ae922a81d0b01d7ae7987233e61320228d5393431362d430c8860c020bf2a43444fc05ec36b02d428a02669370ec6bb036dcfecbd3bba4acbb7d65e59a4fbd5580964e60e74476f6662cc58c5dfe8aabaa001e6ea5eee885c69523eba01118381dc608f4c2671e36f1abfcccea32fe08755bf203b6408fa4d982f729d571984902adae18fa71a15b363792a9e013b06a30def5db262d0ec542d933a02c6ed1d9f09d5240f7fbc23d4bcc1f4745f6ad256d37665a57888e9746d81d39edbf4cbecd2a5f4c219657b85885ee35b806685fb0e50e544ad151952ce1d5eb0fcaa05e1dffbb1bb82e407bd99cb5cb4b793f39ff10aa5f1c9e5c158606ec3eec64d60e4a7bcd228a8a2fe5807d68a4952cb29906c0fd627df3019a234f82ce9974c95cfcacbe6b9d6de25b5b1d425b985027967128fc1395e009acb2becb9f339a96345749ad459ff4a8fa749aa47b33ab7aa1b6a79e6d9cb73e46675235eb0a8b1b82ca8c5ec91b694f09c826243310558e062554423cb1d837bb4c06779fa47d7c88e1a5e71feb2c707dee677a5e07baca4001ed4ee9e2c165be2824291dd3f397edb022b03c5b49246a22eb669e3525c92a6faffd400dd53b66973343aed34c5b99480ee0980a8f611b5f5389869ec6b0f7020cc3f73bfed687c06ab5f23c3757c730309240d7840bbc20c4d09b9993a0706890b76d543d37e1c4741f44751ca3549de3f1d721c0a196424d1d2c62edec2172c155d522995c75776424d3ba9b4310ffc50a51863f5895829ec2909a0997d91d18cf8044b0722fa6487a27ab6cc0eb88b35102338c65a62427cc3cb212c045d2c659cfcb111becf2b71b9a2a6e93714b15132e7261dd821966e8dfcc09d86a65218801844f374afea830dc4107d38effe63ab01cc1d6505c8771fa0387a2726fe96094c24d048638e2ba9def73f70e0f0fea802cb733151c652e8c3f512cd5ec8d7c369c092075fbaae060f2ba8a1f0b7f1c6f505d908e5a302592446cb26737b57e038242b8daf06d6feeb2c9a4031654e7d9a8b07fcb529fd3c77bcea6c4fa97027fc292d32b5b834606412e1ab5a4cd25ab3af24db414cc35b6aaf4e2800dc1c3c655b0bbdc2a1501070f96a7839e5ca3653b4596d8210f725fc3f24fbf8e506953d9c2077dfdab76046dda37945acafa2326e00524321283b7d8de962c6babb6a4826ea24b8f6abbe18cf8cfc322f75f08b11eb612bdbbd6dbaad2314e3523ce196a4c7b7ed01a290526ca828b3886b36e316478aec8199cdd4c40dccd17e14c5b8a3743166a41bebf0099f2d38aa1817dfc0c54b04164992416718eed4563357bdea26e952ceacf2a4ce6cebccc3c188873e0b4628e90d2474632753bbe7373db04a528f06f04240f362cb9ca48e67a236309f82602cc62765aaba724d07f542fa0f42c537e8a772203e400f92f27f36f8cba341dfdb613d9bd81857f8fe530fac2c593d92b5138d92c36570d25f70b19dc4c1ea3f2cb60bd9d2cea7a80a3d2e624ef3c1aa8ac466a7ab494b123e4dc026cb1b4528df1593f58971b3f9f6f1b31083eb8b6c40365957e0b3c89b8efd120c6fd16e93915f989368492a44b759a47847e4190409e62b82ece30d1aa63f8a553a70829c7c60a3d627e7154a390b83b1ebe01156b00ba2b1153b924bc9fbde0e01c35b09fac0ab9fbf4e86c5a0cd7fe094a15da00d28532ed2eba4243893aaa7708d6e70519d25bcb2985bf2596086c4cdd020bf330f45bc5251b20723e71a1ff9ea6ba65b0548023690f7f3553bd483a338f45902d4a53dd319234012016748fb642eaf36265ba94010b3d544ebf355322a32836c4e7ffb140faf971018bda3e5352012db80b80fa10a8d287a4c6772f6dc258d933e8404d22387ad40d8a92ba731812f4d7c9f0cc7f02a70b496ef969a56f843312d0d57f71a2f36753ab37dee4059404eb8755e3831a6c3900bce4b25a6cc86a722c574fbf118ab60f5d93cd8dccb884cb06e5501eb332a69b5d90ca50cb328a4d3cd0a62fbf943a8ac87cedaa1b062dee70dc185f58e41e6f6930f77528485f715f5dcb2bac5d49f4d06e1501aedf675066a688af26c84448c114d1e8120ea68584d728067ec03ad23c75bd6caa3abe9c54d92c53924aaed4e2ed70b414e9b5c57f1ae35fb099856e24e7a9414c1d4c26f4b486d238c6304510ee3c4dd18bbbb8ba195dc9b63d0f357a33dc87373822fec9443a814606f44fa13324dce0e099921077b83edc9f19849dd0917e943dc721ae520bf2a1b15d29b8f12775ebc14b5be224c65f369e3d305f03fff87fb5e91b45ecbaea7571905ad14407d079898e7883b3e334880ab16a5bbed13d38e271357f03184d31fd55f66e6e1f1a9d49ce029841ba7672e103de0b0a48c3b71a8d626c578da391c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bc84e8db3ab29823469574c9b596e2e070b258640b33d402da3213cf53c7550243e3f5faca65791ccb4f456ad51adc0e1589df67d0ab448d486155b8b26be4dcbc2bddaf70383a6338fd234a532516647f6b6967a51d3b7f65fcc60af45f2d46028cded491058ead42e78f898a70468e9112d7085fb21792fc74ebaa7afe80267b33fb1e62fd1561b94ab2c94148f94e2a898d31c37ad5fdabbd3754dfba6e48db7979d808acdfa2b85ad4e4637d1bbbfb5add0f67aa31f709da8856ae5ec34235b5f9a170558b9ea06b9ab63b0014a800aa41c716a851bc9e4460348db50bd4c18293719c2f60a2442fb5eea3d33efee7b1134f3328161e67ca307316d44160e8e1257a4499f57d0e098429a13048a105d7d34bde433e8610ad4aaa237bff7271914e526b96564e7a3c210c88192a59f3bcdbf558a7a8e6a732472aaf6020d30821cd3a04a5f49ff7ed41549faf9ac8ce82a32650e1cab5a4bea50f749d51855f76d7a2ba7ecfa0026ef50d9002c1f455fb814ba024122311757feb22ab7c2723a1cd5efe2a55848b347f7b62aac34ff7369b0cb479714e97fc943a136b20fc1149e900e56a9e667b1ea9d2691ae9ec72a20e722d5a4c87ca9d51526d1a37b4dc0638abd12d1f58cb6e02d096514d8f4de73c8b989052e3eec5f7a7fc72a11cf6ac2cf20022b862b312fe4e4dce760ea7d75ec8f01e595966154033f30783402e9eeccee22712a78a8646ad493777177692910aa01e5f402b47d76c27f43b4824b03beb9996c39dec280b3e0ec0ab390c7e4cc00df6314984cec4b76750627afe99eeb998d02dafd64b9505dd39d889d2f0217095963e5f7e38aac3ac3f5531e285808609db23be1d1ff8d4a5999666b984b6bd0a865ef8e195343c8dc6a2fc3b34385ee72f83ec049991f6999fdcb8e1efebe92a71f2f9c788c6bc6b2ddd84658b1ca4a87c3fec78396311eb498d46d3a459ccc9dc5b8362597f9d67abc3ba900afd8bda4bd20d55d22d371f87bd32898b58eccb42dbc524c8294f00fbacc62fffa1e6e7c6b6707427f2121f9437811e72a7ac0da7563d81b0275429e4e15e5d80b67392bb1cf4a75ba0e4ff27c7eaf72681f41c5b94076ae263c0fa311547a1610fd4240ed106c5c5529ba611dc1155a4541562e4c4fff585ccfa3a425516ff917cab5ebd4d5b219795887362628789e9e996de906eeba05ed747c4a7c532b092be5e7c14750f6ef6dac5983ffab22709d942ecf807869653657e89a98eb298e2e24d3ae263fe4f25ac168a715d476c85d532eba1a43448019ab43754a5c0f72c620dc0856dd7bfdfea72ac7fa7d2ce9705c4ff0c6e91106f47dde089cd6796a8c6c5e585cea5d0744a53c28efa2b678e98817411e583191d64ad5c3896a9881cd6e642b104ceaba79a47ffada4851caa7abdfd8803597a4b4c8f38e278d6affd8934ef17c495cfd3382cd36504f10f3eed146539caea34aca98987dd6f6a2ab44f20346477238e09335fe9ecac88f385625b2573710a88a48fa5da761d39a340974ba8bbfb6f1d5acdab9d8b2c7ceb86cd60ca7da608ea7e79c1659346cf59375847d48504b920364c08bf17d465c7eebc57aeefaa0f3312880108b954892aa76b5b70886e1ead98751950a4af8d5446481c7141c3351cedc596a3b132d471244df56c2a3c28a7a3e7d65762cb431a8e4c093401ad9f50f8366e6b24e9d0e6adaf1ccd219adb4e628eef8d033872c41ddb2a5436b91a8112df55813b5ad6bf96fe9a3b5b1860ee2e41f35873fc8141da0a6753120d91ebf1c4fc8b3b58d4bdbbf12449b1c48331d6e36ec303cdaeb58303eba7e478a2249bd6cf81c5e11018463ab8f5a4fca2813ce0eabef7d9dfb310060fc7b0267611463c81ec58753450ab7e7f58c7b3c7c286befcd33fc317c55c4401c1a1dc3617ffb7cd049998449927387e70d519b7d07ac617f193409e6a965ff20953978269c3e73dfeac852d3dd7a09a058d6a79fda1133992caa3c71ab2a85f857a05308b027b017d085d73fa9971e87e527e23299766a1079164e70d1ed7750ef7e25a976e69aee6e35e1e46802b958157043aab9f5b8132a250fa918cdbc69a8e1b191c06c2c433c10342e6f6e7422635058914c099ed0a435a8611e141b46053886315b8908a4ab6a0823aa1dae7329656270d54b9c9636205297171cf4e63c4db4e810078d93d765f78f224562a163a5d5770393bb54b666737a0a13fcd5e8024cf8e25973f36925e92823d81b4d6260365454dc01dab3a02b4190448549996fd8ce52a0cdac9ba702bc485d4a62d48a26650fc11c0eeb60232787508ecae3395529c41e86c024c40cd153474d8698f035e8fd450e41bfa57fedf841bcdf891e077c1c5893d7c5c8dcf0ae417f8d141f101a94ca97a859fca42e92f9db94cf11b70204cdefe9ca4e51934a1225d0820b59ab2209c7f1dab9df65e1bc80a3e9a862ec63f73cd38bc4b7794eec4c67691bdf18d1cf601da22bf100ea9883f7c079be1b45647b2685cabbc5f5ac0f43fc96ebbad1e3ce6c7ffe25e72387d0ec9f3efc81de04e8c6c1b3a900aa7aa9703394def15d532d649064b40ddd3fc1d71287bd5985667356034f8a39576b3492e9d6c4e1f685e159b40085473acf9bd1c9108d8b4471a62ef613d67fcf44b73f22ef17a03c9d10c310449479f710f7ffc66784d065beeea0977b451c98422f629da448a54bdc442b1e19a55e8bac544f6122b1b7d185ac3bd4340f93c3063dd337940b530c39c443d17f15f1bb7052402ea380961ee19a83271eb9c53341996a55ef77ba58a696e3cfd7c37b1b992047985be1a7bd26b053571d0dc84b1265a97d03614c2d45c0df3b61d09c790336d24226ba600c821d29f8d694bcdde887fe9f0c0fae0ee60ccbe55a520eba4ecfc7c9b734612dc9ca777571e63ea32b1738677fab634dd3f0e07d625b045142142d3e204ff5f937883c0fc6c9855a971421e7bdc38bca00cc9ad32f6a556ab243612d3964e30574bde4ed1abf7352fa1dd7ac0bdf387bcec1782ed6d1012886e81fd3e919a53c785cf0c28aae1248766ae9653ac43632c4f6d3123c240c6014ef90111248952452c5a8f19c98e1a97e9d856d7470df70046359900e01b3ac906fe305277d802781a7a02e5782bfea2fd290cbda2d367110ba39c1e3260a1b41d88126b921e1c34f8578a5715303d80d227de9aedf5337b602165972dc9676e40b9b118f8e797606271d736e42b518f74ae72a3333a847a79299b4de1db49f426260bdd5454fdf18b56daef690264e7e675b856fdade54fef5aac36c52657927c1afd0868c13b7ec29be409913cff2b9f357c7857b83321b3380396de09abe5517926ab23b40c68f8c971e6c357ac81e6694b5d23d2674711acc817b1dc6a1e9cab51bedb61eddd5b0d6502fc766505315e2993bf6cb0136f8fdeb9b9cb3ba5bae4d1a95275c1a78b159ee15bf47fc7ca1af3be779ef0c7a3f45e8b66b7c0f03cc8870272ddacef8efc3e9e1867e2ad2958a3d48800a8352a4a3de143f93254389db5330346705d7566c2a24e2a5c4eb5cc432d3e55e8aac37fe77903cf17a13e9e5da6e52febfb491528370980624db7427366cc841aba23a6680aaa39ee760f9c857541e6a6bcbf2a66e8197078b70361f465038bf9a1e44be41a48facc4c62972d2a2303dcf07f82b7ee979a31e292ad84009b529ff0512f13c9cf14ba87f5da317d0e3b468e9ab258fcc87c87c6cf0aaf7db05345edd6309e451704e85a52a2942736e69d0ff9a4ab7b35450ea9162286711d4906a5ce3ea7d3f79c95c93d772d10a39aaca284d118f31857213d9dfce4e0f2d80830c0816fa8c6850bb1f0a2a117879185361d7ca996ec4f94e21bfcf117e396de524f3e3778540bc06673decfc447b8536574bf8166febc99b876ffe55e6777e8ed486cebbcd594a307ba3d5da6e666dcb1ff95880614675aa92bc3f1dd7630ae7b84c07abdd42254b9f6961246f2f284b12e0e32265603d0df6d9b99184d8acd3b064a4bd22eb031e244d269308d4241b05d49a5ddd2d3ebad6701dc8eef502cf633d9892cf84e6c1bc2a53ef2121e8f791bf2fe36d631b5f3064c5ff47861c969c505b5d2041cc68d922bf12cfc6387d124b2ef3b22511481e07f601765930beb55e8781aa71cddc70856729453aa7350719d9cacc1e23f87b64c70b0ef52b421faf36b393f2a57889e42f59fbb16ec710fee23d770b5645160fd5194ce609b91291de4eeb49588ac272219fc701f29a2c3fc50dcdc0d2d01954a910b963313b61dc88260c7c598ab3bc79bddd57ca1d42cbf8f1f0d4b8186729ffbbeaa668550fc36e510fb3c5970804272f57c7622f51e63303ac3bf5b0ae45cb28b7c985889c39ccbe15b30c3909d093093aaeba34cd089bf87d16e07257cf21444863ec1d131a5e8a5724d02959e748919cc18bb8311d5c7452f390883f7b693d2a0b54519a6ca41f9f35443a85ca48e8481cb350851bea417ba42be4b3bffc76a7e71f1fbe9c9a8319f61a7abecbbf218c377c0ec1c5512ec379ab333cfef78a0f88bfa516e5b0dc37b2b9387107cd09c0a68454762f69d4601a500a0fbf1a5746c22efc2bda7fe595cc53263fb759eb0adf651ce221836c34c8e018a9d5cf7f11f0b49adbd2f8b844d6bc889a8a12d52f96543da3ac3d20f4f17509e76999212923d584a50626b54f4d50d0a389db3648d29371df62dc49ff938c4ad51d8e49805f266555bcf22bb261dc8a8efc0ca6f6d29aca55e110d92eaaae583d4cd784529f7998fbdff084dfc260eb1af5e1ed3a43993971a923b803bacb3cf3a493175152e8ea3af1e1862a467bd1d29add3a47f6911d651e4a526da163b8da718ff5ab6f95d7468cbd7d07b0323a75cdcbf7cd1170d185ab74e47fe508ffaa30fd847e38fa2b42bcb83cf67516db1b773c6c3d5a5cb22f425cb57d62734d1534e816c2fef0a7d30821beae76e216c251e9e55fc1db5096cd28dde7943de9858bae95b7e7032f2076cbcc2b7d934219ed0d3b29cd049ee94ec5ece7ea9f0c6fa2faf6615cfac2caa63424c72817baa90807bae132b06b21567393c8ab71827e00103f0b9cb2a6aa8e50f5260a301d36d6e2e29fe51d46f50b1a7fd7e89a790b98fe62bdae71b24981e1285ae27a8e2e4eeba9e629f477db6378aef7d68492553bf89a955b4ae84f96927035e374aafd9c7f49bc05de73089991669eab370d7a69bfa6f322134b78e67959ee7a2600efae6f37bddbe6c6aa49a068bcdcb92847dad27b4cff7b37bfaad5b7e441124e19eae304059ffe9fbe1fef5b0f153566c05ba49cbc75a057ef7f5f336a06ba58a4cce365cf207eac2ecae5abb2d9077bf252737abecc3cf30b9cbb68d66a69624eddf58e9c8d8e20f40cffc0905bbcfafb57c09571e635f3452e6a459dfa0d548658a9fb0b1837d10478c8b17c1300b42e8eb462eedfbdf85c5b7291c59a05e8bae729ca8fb7e9c32a00d8bf943f6412413f660c9807fc931294e5788ba2f184f2bf69e67703a868be8f0b7029284768f88634a6a185a37d1b4ae0d7b858837b2e23b07d9fd045d73849e5a8cfb279940ac515ca97131e703455ff844d211b281761c751ffbeb44059b32d6a8a8da2062e0a493db7cb050e3443d7f76e37ab19ddc5996828ae143c40e753f64a433b381424363dbd9ce965f84d001c686de80a04dd270d4d3e2c3a9ce3a5fd5e8c50e04280a3d3512f90759f2c4afe03dbbeb8cf183391ce2edae7bc81b62699ef006874cb0c95b8ba5ce0c5361c4e8ef358f106aff304c30acf17015144895b812b4a61b9ac841d8f4402f6484b275e18350278471fbd47981fca3a0be0e5740ec259867f4e88c716379f4fcc43dcd432904918a0e2a4e2615ec7cfc2584c202722413c8a843bc3625ed9fe76da0159d85ce5ba462c23d390f163e7b08c4c1f160e8b4989cad558d913696b06817912b730edef40ae3a1d727783ddfb5fbd0a8271d6d624253957b6209a3e2101afc2d2df082304be41b2141a6e5c38eb13df0874cf402c9cf57f6735dfcf0422e86efd775fc578d64f78bce8a0b1f367a0c7cb009935f30c13a7713b029f6ec3748334b3205c5d2ceca3abd81f032003cc90b6fb23cc284dd690d1be1c2bd3602b60891d3a52982858e275eb6a1ae5280145c34c207c556acd3eb36d771f10e13b1f3a1101c047328e40d4cf45bf7970f14d91c61811d24a852257d9bba4821db57af1b326100fe262b492fbd7f697fd86cf44b5a59c3e86d2c22608bffbd534846b9bedd97553d7a047e834249650679a7d018e9efa60eef00637439841e761b481cab5fc88fdf3c8d1d61e22005790c9b1b52da8160366b372087f3f7cb1eccc303a85a8879a10fd6cce12319c9f64b95a3367d885268d647a2ab5f43166b2d5f94516b919a55c6a03516207dec1c0e73ef454c3a52487552109cf635c1028883040af0969352b04f142c5ce8a2ac5a37531dd7b6a3557533c0ee7a25fb25eea77de284898a0e5b57066c1edcaa2292cefe1bf43960d7723c27f56b3d5054d037cf14508571a36ae42ba5f9eeda34bf5915907869bacc66ad83d2fda0ed5ca9e3b073ae8ec047d4add458669015850c248cac2f8b39f2da267264e7bef215c6ff4651b36cddef2f57453e5ab6de7ba7a7999fdc66fba3c60cf8c070dc2e0bd28c9f4cbfa049f4af736f80bfbc80d585831d544f961684a35b14a41dd40111c4274d356e9f2fffbb4eb77b0edd58a4490a34f5a6b834ae596f349ba131263b7e7318a4646c936475864fe6a14b0fcad82eabf7a355ef04ab0718a8a3cffa114c551f44a6a71b864420036885b89c998b7f47308426700b800176268b6b9cee4af3be48c003e6126cf4cab9ff061606686a373a21a7a4a61ffd7df5eb769063ff6bcc3682c5ec432757df673f9aff6c1a5e8f675790f8a6b8751d7c79f8db32b302c1d3a9b5108e24ff30c1f2e68b4801ad433b141a46e9c827c538600278e65a51f8ebeb8194c77fc99ab4c91a6fdf75c292554196b8eb006e652c7c97018db8ce3f7a21a73296bd269e6fc1c42d3d02bfb145a5e4202d6056f40562bddcab9e81e69add85439c933ccb2dee1b333181b2e174802c8cda0ce8bd936e20a418794fae6ed58c0e9b5ea91e61cedc091665bd7038d7af7cc9175e6457fd626c351aa03a5d76b86e8f090624dd7a6575c3f17994423f9d70677e3a84d2965ee6d4f70614d7c8998b741a9e9a81362a1b3f7746013f35ea2919966e3030799dfb7e263e63ed9a9a936a3775c17ddc139a2aa369d78777b53587088739a8ee9bcfe03f561541468090308e6d21db9bde1d40095d34a9e0a1513a7fabdade1309fa77f80d4f51bf8f92cd49cf74e48b80d0413fc9fe861e91c431838091e61bffe94a9a8f9b6448660dc7c3fb8ab8c6a9467c4b580fc6c588b702945a125368261312a9c40e781066b77dfd95afb2278b4a737a0ddec847b48045366688b9424a694390a111165ab4b28f2da525cffdd81f0e3624e10a52ba2f3891fffaa0ba1c650ffe4509794a404126470d811a81ddaf0464d5a8cf31b7238e75ddfa9999f975136353ac68eeb39d1a4f66a71170590e6ba91aba97ac7d039428c85fa425d6d707acf1411618a144f08549f74ac6938fdabc25e7b7a44edd8b3213fe6dfc62046da4aea5f4b85d48c09c01a994ddc9eb0c5a190416868476134b991eb66f16b224bc770cb2df36f42a33b413d36e3f02965f9a2c3bbfbca15be770786376e7b35e7c5a1c390ca07f98f358b981fa18a0a0bb6802d3a67c4d2545252e71ebfa6df775982ae70f9eb737ced39f1921263c16d261f5cb1b84dbf1a3a578fd9460cdc6122265527d34a19480ec6851cd28b0740a5535a9b45d15fe0f9fe60cfff4e8bc840a14ad0388df257375ef8c0729eeef028cd6aa863ea0cce6951d4a6adbd0052ea14349f4726ba763d366319da7e48191ae3faf38a03351e4a5af31c70e3e4f69cf995d783853ef70a9570ec0c7fa1893ddc28104bc29b905e66d618434d4a4c80e5e1503a771751e3f84836e63c020f7d264cd62cb39acac61b53609c3a399e2ed4436cbb5b83f185dcccea986e5371f030bb0e3a25316026166aa81c8a8a3154b2591c52552f1c30da447a2f8377058202dcd2dabc90976bc9b3a0fd1d782c2d9b3fcd68ee62dd5bcd2813c4d80025337a5dde84223aabeb91a12a52fe38fe7f2e5d689ae07233260783eb1720f652d20789dbdb794dba5c941da246396a4de7cf19fdf481ef78ff59be601f0a220b7e5991b25dcacf8edb5a637105fb139c8d7d04d9e88fe3559cf133aa38725b8a4cb00a491652676ca731513d7e03bca1fa57b648a25f1f7ec079b7a1aeec7598e1c0cd228930df20e2aaf0fb97c8cb8e4567d119d3ac25fee1c0e031575eb1e1e6cbdf7a6dafc444055ab1646ed0e0c63774b222b99e08096a0d6a09689dcf8b80271f0082babf29a6260a9ab5021edec8e6a3c7f915e0b742437e420443def7aa3f9aedbb3089fd0473200c31d7ca20e403d3bdcd40b6e73dd772610cd582a1d07d07500f8c043a1098fb3a120d93ddf836c3775a5997b9842bdfdc78615dc83d7bbe97ec7c1c3d4ec504158ab297b755facbc9ef00caaf5c6a4ac45e9dba22cc5b73350a107e123276b84d96601fed3f2e1af18ffa29517dc9cd046d273428627889fd18ddf6a8ac8901509d53bcb3026c62570a0370505ee1d6baeb689955c4b39bbff2fe875e5b9d3eef2a5f61b570ef043bf8d7b7d8090b37364cf01f7b5fcefb538998eff4fee8699e97fd0c91a62c4960b64e12454eb31fc19b3978baaff0c43bba5132c12c27a8817a3e2ac0bb37a74dbaf602504d61538ebcb03aeb277acc64760bf3e0ca2df55da1bcbd00187953c3cd968a90b74beddfe008f90be48bf959091b68f2ce78c0427705411b23fc2e764957cee78869647b67b61da29c33403df1c075730af2246ad2bbf059c962b84dcaaf2de43237578b2efb92b1f66cd6c29e5f5adc2304a87bc416bd71c53350541d444b768f9ebb50ffe3255001f0fc4fa804731710025f253bc005adf1aba619ef6168a5722b185d5075211abb9b09ed00db760dee50167d39777151d14bf12ae9826ddae793eaf601c8aac2f1603dd3b62fdb91ac326063c999e668d7171c98a91705a6fbd617041517afb93d322a823b06ea31a0d6129b0ff9d060305d6dffdd764d02efc129a666ecaa0f109c4a30209c4bbf2cc2156e984c9663ac4bbd655a4a9678e735cdd555c9b73e34480e7ff2878c5f0c29e6d2524ebdc6b67fbd291c3f8509500460649f3dce066879ef2c2884902790fb1309d3e3ecb6dd42179983bd11dc7c6180f27edf97a1563c385127d43166cedb710db3eb326355d00ac08aee1ae4b2b399f357695a41b25ee6dbca79d973e294a25eb06f5159c44f129e2a4068d1dc1eb8f1512dda907a11b911c85a54800f65d91e5dedb9cf1fe7aa027e3fef4c6de92c73e56f96e368acfb62fb156609c72dcf3fc882f9fb889b15b57840114d3709482805b02614c494e95cbc5e382c61857a1726ffa7a88cd135fb8e7ef8e8f24169aba8a356c0a1cb0bf90b26f0d6ea59bf882f653d7630503054c2e9785b21c83f9c93a33dc13c1cb3e7f3d8fd5f40e0e92af02cc4dc37bd1d49bb87dba6d410523b4031974279d9275920fcf8dd50b72e781161bd8a6f5a5b70b096d94c671a0bad05b3ece99921cc250884eaf550e685e12a6e00f59c8a8259c492973ed998444f5b9797b6c342a49aa808c54ef3dc1a65ae297db972936f7cb88fe731d572f423599630d979142643e263e5a773d30915fc2ed0d785197c6bf6bb86156607b328a58a4bbdbd8bb7eb4a2cca4b9ce799b20c8532751c2e088f3d0846326a69d42db34360f8e0a3c5ac1cc5dfb5ec065d68f2b4e5755f890491ca7e56b65a9e70817e50683241b2079fa9fe7f537f67e4434bd5dbe9b194d6913613143ec838a1ab8b219511124290a1d927944e270325cf7bbb21c3a01fe787364101d87777bfef36cc977e47f787d0c39e604f840834d9f086609a28b6b49ab83155ef32cb6193a9abddcb06a6993cb40a396c1e085f600347c2b7ea619eee2c5bb3eb816d2822c46b47d59f1b639dea69ad6a6fc19b2d5418eb624d5a92f26e550e71da463a9f0eba29510dec09e59977dbb9522c9eacda7a6ce1f07908bba9999b86087987c2c38f2c45f85a8de97716957581746b992239e0c96f6d275e9d07e36713de9a5a3becb94ec5621360f8d248a310075ff378af138703e50329bade76649dea85a90e5f07729a94cc8e4f48296f0a05c36c82e3500e6f46b9b1db46b420c39de4b7d1fb13e89bbe469876ee4b244f3778eec28e65f3a2c2e7b2b311e6f8d365d8988d5822feff28cab30b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8b9e0f2b3a223d82087ffe594d6d7829600273de919a96d0f2452c8716b0e2971dc02a61525f8694b8eba3679238b73ba37383d4718993a0646bfa1c85b7e36df79ae1261ff4ca2ce7b777e45a1a3517acff247e2222ba73f65befb42d94faa88a8c145af5154477f14b5a3cad90858143f159c5008cc5ae69a762298adf36ede7314fe0084538acb9229198e301e0ebb5ef62ece69eca57cd1fc0b905a662c98fa62a30bedbd22ff797add0a167e1e953918b132dd4cfcc8bf7b3ce1cf3002f8917dc4552848c9bc21771fdceb0fbd77dd7618123234b6743fd29dbb18c23b4eff50e38e0409f2a2cfe4bbe734ac85d85b5fc05191402986dc2d4a278956e4fadcc1d641158c05428f7128138c785bccc8c06c59ba5b8988c1c3e5fc92bf40a959662879fc2f4b00a462335ce971e7f7b7553261c798912ed9872328842a1394c84a2af5f1da00fd5dfaa87b37964b7ace8bd7e110aa7c7c65fce19a17c8049488e80d95cea228134b5f05d3f17cdbcba1887fb38279bb6864ec4ec191f1d8181784b135b363978b89358ab9bd8bf0848c1bfcc1934e2de2eaf3f5d2dc23d53bb0f415ee675bac37e5d1e48585a105c9478cd94ace5d1059fc3258f7cf8a197c9bd0ec4658f223053c53101240ca478c11bc6dd8b94462c1243807156080b7f827d94ec85674b703f5fcfecc7f90af2f65f9ba70bab70e474b37b2544a425df406dd0775a5d8719e2316963d53f13708b31a67d7a996ec0b1c4e320dfb25938a4d081e1009672e318779468ba2d5d507d924327919f0b7f76bd45a306cd4fbba5b2a0e945eab386caba321d452a62ce40d1398a7ca5e447329e657987178f006617ca5191dee1676d7a3a566f841c8b82cd9e89bf947c3fbee75125093190d512cb70bc167c29f62ce2c4d82c7279b27c011c3a1e5adb5dd8b5cf64a250c590a0f13be4f38ba4c688f6af4496c396c1ce97cd371499471e890f1a421b94d404192af783fcc4b7996a5753725731782f8b9cda9f82fb9a089c4bff3bda28a2baf48fd97443bfe8f95ed711efe9ccc4d2e1b65f5d67bc49503d8fcfeef5df2300b2f2df07382924451c22579bb55fca85f02e8fcdabf2a2ece3f429204423b39372379dc6d48b350b5c16e18ac78cf212b2655bd8795b21b689039e49820f4e6a0299d74ef23968ffce5c98393395d2833c092039a02861040a9253a0611f40ac89a828c9caa407cf9dc57d8b048d5a07341b8f9061fad1d678bcbe4988db97e9dbdb353e7a8ea5655554b9d7b5992d4983a6db77c5ec95a462354d0db9ca680e13ffd6ac07f75f52462151f914331f89b2dad85cd88d44bf800d4c6aea0fa9c48b7fe25b3ea46ecff43c89e285cbad27ad0ae245c46be7d0b9eb188bdabc3b9b501c4fd13998ff2498aa10cdb52f8e9aa2180b52dd722214560934856cdd413a0844682b450c072341c396fdb1e7232c83311f95461b43d907a6cf2052570cdcae75aec4ebc2d21e111223d0fc4d75df4d53d3bc893baa3fb91ee99b8009d76f49cdaa476894237758fd795f987ec95f88ebafc6e509a9c56c704d1e07772191bb0a9ea2974451471ff1131e8fb0880efec56f6bf6dedcabdc784ca30190db8aaccb5d972ee5227958df1586556fe6c9bb7fbfcc2dba5c2b9c78961327635d147f663cd76a5442dc54e0e1d3930f627c8fb36bd813d59c49a62f5c157c5b9250e58aa02851eea9f6a2fe14857750a558260552d504bb9039d777572fa71f52e88a1841ab10a54b7aebe94046a9a2c7621c4df3b6142fa3a1e2cda6332b927a484fb9578186e5e9f47438f4a2a123e3b7b34c88f5c51739649e5b87c5e0fe8ecd68a6278ce0afce79a7b82010fe7f41d71e73d804601364a3dee89b9b919d51e1b8f3fb696fb9787df427d46e75db528a051fddd1e4c314c3da0ca15e03c16be82a0816fc0840189b0ba45523e7fb1ae5a1c98b384689d8775ac7f675f7f1f4a28368032b30795986ed95033607aa72689c44551243416db292007da123b7700dac53ea18973b24c63e9f8e0331450d672b99d1a9bb7116444c01f46040997d6c720d836e0daa109368db89927d2d6280b22684f581cb129268295b281103746348c288f0e904989ff638892ddca22952fde2cc8cee6dcc4b3601f22e7c27f1f78427c324d57dd56437cb31462909da1a0e1485691a47858c36034ae13a2997b7569d8a81a62494bc56203c57a3c9a6bfa3684aea392df1a537ddaed992814dc81719e95e443a21a85d03f633438d152b2df343acd7c2c570f3b2bfdb0a057c86b3d800c827fc1d4d39a4f6b22f89c3774296da68ba5f37542753eccaf92a8d0742951dc2f4cf4a0d19de7456ad4f7cfeb1a0f6fcf9af6dabaf462b4ecced3d195fe1b2e82bae23af088ed48f9dcbe3704ff614adf382373dc8dd9432c39cdbd48f2730e08be81dcce2179494f98da010b7e6164ddd88f7604b1e813505b6803d9611fb22b86801b986ee8d72a5e6d25dadf9f13e4d7c558e045d6c9ec1f7a607414ed6726d08ac780a2dd5bf5cb03c8bbd896fb0d94aae4925eb2f24ca2783b7a061d9bed376b3724ad6393ed08c817aa5dd9ffbee22f3656d0948d312264976dae5c6b2dd5fe93dec513c13680c5371a6f742957e248ecedd5220472c28c930d2f2d863e52d15af9e1570a88b01c9632dcc7f038c4e264d83997f3694751f808788a7a652b5b00361b7588a0855f6fd123434766ef36128b2aed370199f1b98d62a7e8f75e6471e248cd7ad615d1cf5a0e037d894a007dd467211ed07f0564777b676f88de294c659b5b7ec9dc46f68529f518d85d5c9be6b82ecc73137a7c3a9192258d189ff7efb598d202c501c7606b48c899b5c9aba85aadabc1d67c055d998d2321016823e4dd6c2be473bcde5ad5c7f4264ecad21d7252bc5418e74c99d7db7675aa9b5383dddf1082eb6bbe1efbbd05487ef3a61315eef3933d32ddda3360712724cde070e4ed36349abb3f756881d3dfb7fc71e646277abc197662d1d81b24b70663b347c0e06a2c48fb23fb4ed42716a72c09033b386563a08968c5b55dc9a77c7789896ba14266d3023d388b1811b87d21454a90d8d5853183d3ba3d3d3f8af59167d120ea504acb005d73a8169f59c8c6cae07dd77458f9b28a11a6f08d65acd478c814d0eccd98ca43ba251804df69c446611a42977b6ef9c09cf906329317c0930a6e15832957e8e51f34ddb288408d57a55ccd6e9443cc17a81ad57bbc52928e855214afbf1fbe48138fbb25a71df3a1cb2abe803df77e7f7086ba591ecb7f098b0d96178c161a9ac146fa4666731ceb355c7c48baf392f2f02e3545d448c0237c4b552a6e6cf0cfcf28e130ae50e41a9c491bb05d6baba768677bbc68b682e136c6829fc30c93a93276ca96ab5170e3c41d47031a0c1de7fd5dd6da9730e79ecf095dda3ab815e3a7f451948a098bf915ca849de967d2a11ad8ff0376172e67b065364d3bb28f9ce095fd7f31df4c3e499d6129ac17d3e1a243937503878833ebc0280f781c3ac14164b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe950fc8893ce690c41c30bb1a9846adcef56fe53eeb84398327326ce74b71f9069214cebea7c0677ad4c1c530bb2516bab0ca560779be256a7260acf5d576b9b3118d409387e386ddf67b1f02a03542b092edfb32be734144f947a53916972e39d515f7bf0f4839e721dfbf7814e4a990deaf77cbc2517c38d54e651caf8a34dfe0d59daf186fbe30b578aa59f9add67080011d2b490316ec124cdf0f936282d5d0b3ee9c1c79fe5f6cb5d7a3359f607b62472ea5bdc75008d17e4e608e514be761c2 "); - pub struct UnstuckSnowbridge; impl OnRuntimeUpgrade for UnstuckSnowbridge { - fn on_runtime_upgrade() -> Weight { - if !is_bridge_stuck() { - return RocksDbWeight::get().reads(1); - } - - log::info!(target: LOG_TARGET, "Updating beacon checkpoint set to unstuck bridge."); - - let checkpoint_update = checkpoint_update(); - CurrentSyncCommittee::::set(sync_committee_keys(checkpoint_update.current_sync_committee)); - NextSyncCommittee::::kill(); - InitialCheckpointRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); - LatestExecutionState::::kill(); - FinalizedBeaconStateBuffer::::insert( - NEW_CHECKPOINT_HEADER_ROOT.into(), - snowbridge_beacon_primitives::CompactBeaconState { - slot: checkpoint_update.header.slot, - block_roots_root: - checkpoint_update.block_roots_root - }, - ); - LatestFinalizedBlockRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); - - RocksDbWeight::get().reads_writes(6, 6) - } - - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, TryRuntimeError> { - if !is_bridge_stuck() { - log::info!(target: LOG_TARGET, "Going to unstuck Snowbridge."); - } else { - log::info!(target: LOG_TARGET, "Snowbridge is not stuck."); - } - Ok(vec![]) - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { - frame_support::ensure!(!is_bridge_stuck(), "Snowbridge is still stuck."); - Ok(()) - } + fn on_runtime_upgrade() -> Weight { + if !is_bridge_stuck() { + return RocksDbWeight::get().reads(1); + } + + log::info!(target: LOG_TARGET, "Updating beacon checkpoint set to unstuck bridge."); + + let checkpoint_update = checkpoint_update(); + CurrentSyncCommittee::::set(sync_committee_keys( + checkpoint_update.current_sync_committee, + )); + NextSyncCommittee::::kill(); + InitialCheckpointRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); + LatestExecutionState::::kill(); + FinalizedBeaconStateBuffer::::insert( + NEW_CHECKPOINT_HEADER_ROOT.into(), + snowbridge_beacon_primitives::CompactBeaconState { + slot: checkpoint_update.header.slot, + block_roots_root: checkpoint_update.block_roots_root, + }, + ); + LatestFinalizedBlockRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); + + RocksDbWeight::get().reads_writes(6, 6) + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, TryRuntimeError> { + if !is_bridge_stuck() { + log::info!(target: LOG_TARGET, "Going to unstuck Snowbridge."); + } else { + log::info!(target: LOG_TARGET, "Snowbridge is not stuck."); + } + Ok(vec![]) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { + frame_support::ensure!(!is_bridge_stuck(), "Snowbridge is still stuck."); + Ok(()) + } } fn is_bridge_stuck() -> bool { - LatestFinalizedBlockRoot::::get() == LAST_IMPORTED_BEACON_HEADER.into() + LatestFinalizedBlockRoot::::get() == LAST_IMPORTED_BEACON_HEADER.into() } fn checkpoint_update() -> CheckpointUpdate { - CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") + CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") } fn sync_committee_keys(sync_committee: SyncCommittee) -> SyncCommitteePrepared { - let prepared: SyncCommitteePrepared = (&sync_committee) - .try_into() - .expect("checked by tests; qed"); - prepared + let prepared: SyncCommitteePrepared = + (&sync_committee).try_into().expect("checked by tests; qed"); + prepared } #[test] fn header_hash_matches() { - assert_eq!(checkpoint_update().header.hash_tree_root().expect("checked by tests; qed"), NEW_CHECKPOINT_HEADER_ROOT.into()); + assert_eq!( + checkpoint_update().header.hash_tree_root().expect("checked by tests; qed"), + NEW_CHECKPOINT_HEADER_ROOT.into() + ); } #[test] fn decodes_checkpoint() { - let checkpoint_update = CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]); - assert_ok!(checkpoint_update.clone()); - let prepared_sync_committee: Result = (&checkpoint_update.unwrap().current_sync_committee) - .try_into(); - assert!(prepared_sync_committee.is_ok()); + let checkpoint_update = CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]); + assert_ok!(checkpoint_update.clone()); + let prepared_sync_committee: Result = + (&checkpoint_update.unwrap().current_sync_committee).try_into(); + assert!(prepared_sync_committee.is_ok()); } diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs index 18b22d8604..046e66e3d3 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/lib.rs @@ -23,8 +23,8 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod bridge_to_ethereum_config; -pub mod bridge_to_kusama_config; mod bridge_to_ethereum_unstuck; +pub mod bridge_to_kusama_config; mod bridge_to_kusama_unstuck; mod weights; pub mod xcm_config; From b90e2f4bfc47ac3b67e7da4c83dab119422df0c7 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 19:38:38 +0200 Subject: [PATCH 12/22] fix header root --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 0775ea1b04..1252ec00f0 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -23,7 +23,6 @@ use snowbridge_pallet_ethereum_client::{ CurrentSyncCommittee, InitialCheckpointRoot, LatestExecutionState, LatestFinalizedBlockRoot, NextSyncCommittee, }; -use std::convert::TryInto; #[cfg(test)] use frame_support::assert_ok; @@ -41,7 +40,7 @@ const LOG_TARGET: &str = "runtime::snowbridge::migration"; const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = - hex_literal::hex!("8866b2286167938628be9eee938d21321837025f93725f9516b30dce5f8c11fa"); + hex_literal::hex!("84a581291c4a4fe66879c4647a1084ee584ea5c8ac82009aee323a66bf865e82"); const NEW_CHECKPOINT: [u8; 25122] = hex_literal::hex!("80c58a00000000009cde110000000000f118ba039276d46ba87cd50790e2547060aa6cd260476bdb499dc38ef834d618910884d25c9608dfe669a39ae64814db99553d82cd7a5bf5808240d2dbef04e6035075425a8cfe9d2bc194fa1ce245681e84909e4159e0c5cc1be7f876ff57d0af821d9b65aecbfd133c02eeecf2d8f64a164474274529f0a0fa9f8ab033cddc183b5dc028ccbc6c27887cbd65da8d4b8d6983ebcf4a910e6e2403b68f52628fb555e3486e21fd446483ed9df35377b07851e0e07803b7af34cc02494fe7a71fb32ec66a1c279dfa9e12b96b4a1e44fd1d3ca5db007ab2b953f6708514bc65ea545ad562b10a900bf3d9b25b5153d552ac07a256fe4f7761a5f9fe130c8e65b8f35ec53499db3a67c630148b7baf1ae8b79c00ed0c5f8f808bcb9e01cdeb963d8a6319e82af0f8a64b1819e2b21ddd3b07b74c8ef2bf01450a4bcb4180795b745f2f11c449223cb5590c155b284ef45ca108dd0c6e2ebeeb1e93bf710e1573e1cf7d2e3ce4c45cd5e5cc6aabfb110fc1c748b6a22677b333aa36d283f3d99eb09577cbd44b3fe69dea5d5651887877aac4f7f7eb0856e272144e187aeb92df3bc4b789b16ccc3b9f014b60b56159692db7f9ec5f2bbf753c0e19a5a22400b614c45da5ee07ff2a4558c2038f3772f2da1772070d65ecf063b908ad751a192cf1aafe980d1b628aff8bb34f7cead01aa4baf5d8be084e112f2cad65561c40a0932cbda6d5d37d6650500f14b7269575e1ac157dae537eab19abb957f40043c71954cde60e164200f453233a8b77fcf8ffe5d95463b486da0e6e873a1a00d3b04aa4f0672ad6b6d03180cc0a089adcf50b7e3688c68b47d1d5812972cfd5952b4197c414bfad6025d8c8f060f16edcf8ba8bb9075672310a1e10745e4e90fbbbc61f2fcecf5399045b103317086f544bef7b5414e373401b13893a7520fe0201de90c58991af476a86d9eec14cfd0baaad4278204b6d822cd32414da207ec86da840cefe31c5cbfa6ceff0546294c296e6aa5683093bf0a69ba502c89e50a6084b899a36f3d60db2dc9ba128210c4e75d76e83799132cbd4fdd9fd17eb704703cea9df391c83d66a2d7ab894cb5a15a575d1e71389b8c57d63ea48017254c02c106c64b3e8aa0c2f33b9af3ebc44e541aca5e69cfae22549ee562eb8e825d81830317e565d04563ed05fb8682f1ff79e0c855990e03a9d18ad8ce8983fc55deb5398b333a26db57d0e690ef6ad56d85512859d9bea389877d01d3fd8ce1a0517c87ca515b12ac524c47439b2c4c00b553f8a9a6831fccd0641f8eb33c0eeba8cb5ed88e035f5bfa079644258f5077483b45589d5cf4b53915bdab34d4030dfa8ad85af76e194db58d453df3411431cbbd8dd19e619ff613cc3cc9e88745bd1b3d24422d3dd4ebd82467bd232600401a39fa3134a2cc099b690158e52694b2141ce2979ee84416d8c89f55c23cfab2804e26fa2f58e96fa9d8e7f7fa8c33022247ca0cd1808fbccfa4f3dc4e70ed62e031598f4776745fee59bf0fd5369246ad97c2f2798e808fccf295ce5f8ad8e7e70268d6667508104ed10beb70a794196a3b7c7e7188e766d9a68d32ba7297f9f916e7e20f5afe0a758dcd16953dd81ed2ef48f4d8bc8190f601dd3da1df6f78ded9ced42b00a310957f65ae029e7e170d106e9593dc2df9b54d9d6692ab68e9d42688304fe8257fdade19bca9d162c83b3bac4b6626979a8fc77f49105f49103d55374bdf18e1638be1d8db2945dce2a9b7ca3c772605f9059f0754a06cd170268ed71a19419ec3c88bacb63bed8086c29322bf2d5ede197f3dc626dc83fcf7d3ad2aa959d28c9f659824abd2e7392a2658f1cda46be4fccca644292573c21ba76cd183817fe7d59641bb39a369f4b43237eb752ee6e0647a94c0cd1ee669010a851f133e7d674bf23e6ba23028bfcf6ead7d960833ddf004e335b83ee062938bf9183c99d97a411ee79b18725de81a5131e8c8f0e5dcac8837d036ed9c85cc02314994d865c8476e63100deeb615722ad6f8110b209ba9eff76fbcbff25b1d83f31e7439c00ba009d8ec4f87d32ed566e7f516e7dd48d085808641df325942b46d98b616d8bf622147f24e180a6be27fb74e042439e19ab3c73f833439a86dbbcd4e0ac43db4b891b67155ddb007d2475fbb070e847fa254273b63d0bad326ba60dd8c0849725be0496d270c2cb30804da546d94b3071e6de53a2ccd167acaa2439920e9c77e475fc120a12d91be2176a87f6c7f57061fba362e5c38ebd01f01c659c3631bccfd6973d68beecc3b363ba5ea9fe3918cc7629672fda8922852fdae18a99ca7536861c73a6f241440fb9116ffb3c9144d649d00255a4f15b1f6afa5c88e59885eae06fa271e0e1ab7b5a1b4ce2827d3e2cb309ae2d58e98a926d2ed525a8e8e1d4bb55f621eb6f688ba7184688819bc8aa9e95b114b78584247ab2f7e8c217ca0de8e219646f9c0184d03f292bb3138feebdd38de30ba4951cb1665a81994db24b5105ddd683075f6cf5f884ce7ee6525dcb09e04903424d7b8610a4be604a89d099d71d038091eca1a6317291e4fdbd84837621ae37182bb9eedc4182c1b3e3af35491cfa701ae2f55522c2042e7d8a93a54c2f505b62a748e1377789780f6fd9c54981e93f76b65a7c0010ce6f84bf03154c2d75b1da316b9dc62a2f62736944cb935f2f985da9f6fac23ea4d578136a1b3cd1ad29818cd02e9a72da1779f07c7a9f88b4e9fef6ae1db26de2946ba6edaa1b43fcb1c7e10ad49b9d84d060c6ffe0ee4f2fdcc34d27601a6bb3fc326b7dd600aed38ebdb605282d7346c990194aa7bc8775a1dd5f64c61abe8b375d61223917fc8427e659d431a27391ea0df523a25e96210e17ca85cf5a4f5f6fb6b5c4473b4b92c62609bf31e8bf8402e391e3a7ae63d4aff55a17ac1d97620b97983e3ca421a81ab97f811921df29e09948dddb325945e3a7c53fd68c9c9633321afd3873ce4ebb4a6856b4a4caf2e57a2e2532a20bd768404e84d2b2044b22f9b2e8f76946029db8b84290f6ed94df22c8596dd9c6bce3cdaadb43bc90d1f263e64bc00863fa218495994cd4b42025b22d257d3ab275ca382ee10231e8850ada2b50d0fd507b34c0b74b13d1794ea68c1d594d221ef84f9557bb43495f9652e3fdee490cd327116aba0bde4812a95c47955ea446dd6548aac044e14798beccee03b10a59ea6d9a5a2bf6e6bba2f2130128a29ead57203869d1fff9467d835cf8e7ad3f3d2fc077dfe11769982b2fa5e94379c3a2087edf3bc587d27987811204505bd74d8ef13acbec609ae24793f5a2b101eca199dcfaa4531a987b6524018fbe4c9ffc95985096a67bb041c37056498dc3733b5be3d6d03a001b418ab4c0ef72c609ff263136e14c16e9ffcc8a2c6ab4b3b1bb730feec0a1ae7c15fed5509ddef0e00b8de4dcfdb93be4e6ac902462ae732c20a79209499b9b87870e0476d016889a60ed361c5353020a3ec98e34e63b9f3182ac02fe66da7efbb1a3895c727cdca56fd43edd20bff709ce5f86fe5f9c880c11ec739b9485c0132efeca6f6014be637028ec04a36b57345d5680ca76837e1aa7f14999c928578daf668cea7358c4110d88abfbe25380352feba160638608ae27c8336fc4fccccf4eb0abe8942f11a77c6a39786aa8287ecff1af4732e63c834f325d0719e5870914a7ee8cd22592c42b6bbe86ece668f7b75ab921fb30979ea979d9a67dc6cd4b3ae2cb3751b35f51c7c8fcd75505d656d10fd54bb1afa2d24afe1502740275589f07b5371914d703690da14b54285e8943f0e6c532a977f5fc3c1564048b19d731cba84f69c076a823353ce020094fb46c5784c2098313f99c96c539258b59630de96d217795318faa7bbdc52aa37525c7091c8574c4a9a03b5cbf80963facc40ea68ec48cc24f71f3337c8f7871aea9a18aed2b1664c9c5f5af76dec55f74bb441abc21da357de621473325018aecc06917aff025087275ca4f964b8cd945c7c41964fea49386cb3ed22036e0474cc2def65a6a380f9a120e5560722b942f5b88369817d0a965d6482ab324b7af23bbf854a41fc2510c2898712f6177f9990a2587a2fc9d2cc0b7ff3c07b5ed0ea20c24bbaf58d5a29ab1c64f42e8d94ba4400c65a90a6ea0a7d2623dca1b2e4f74a4374faef87e0a77b09a1b45558a9b81b9402b933317fce57824dca4b911f066892672e667f37ad0a750e09802784f2a0f6ca3a675b5f6a6e76e96ed60a36cb09046b39975f8575adf33e2b0ec9eea1cc61ec6364a0ebae32e9902129aa3b174c0332bd338a33dd91cd8159b47b10883b32a4ba60759c14f12b8741582bce5cfa0f7d86743e0da364170d9677cf448d7fa3590256ea01dcf11905726b88b15056236d8b65ea63039efd66b7fb4f168e6ff46fc5f7d7dc734d2d406153340788216a5df6ec9fa169ac78540cedd4fd9a00382798ed054223ebbac19c32a0e02b9a27c5db531e507c1855fcb354bea4e484bb30bef99bcd63be47e4d3d4a4e0249f41588a18519584d6086e0b2039b5d14130a4b6aa53a088e98ac24da38b83b8f1801b612370c71613612bae8e5f1ec6e07260fa081bacbefc947bd612ab85eafe775db1aac43fd4abefc58d49aacb57307b29ac2ba517af4e7b26d6a836338d6c8941db0bbb9ea279d33bdb9632be5ffd687acd2b9003040d346aa947425b475d04333b54958b6f4600f7d7456050f160e2a078302e7011c634abff5e0dc08880d5cf6ec705f94951273125ee1886396fd14df2ebb8f39e6171876ad7eb0797e97facf88217ecb60eda8fb336efd13715928f1311606187e38e0d7a4cc94d9a1a0c36aca43f3a98440724e8704b935fb52a0d9aeb1b8861c6a7c4535af798f2d46a769f897bceceaf1f5fb55986a40567a8d13731b4274787ac1995b77d08d780fe788b45ac80dc136504f7e1f8a96f55add4bc347ebcadac13dc5f43436192b7ef765a23dd8a82083dafd346a8ed35890a855a0856abe09f943f27d2ae609efb77499ed7fbac5f5d6ebb58bc1aa061fe70397143434f1b318e3d9aa8f5daa5543f7af91f534d2193d7a09097c373ebbcd9982c24bb1ef2c3b6125466ed13ecf5776c032a3bdd2a77107d6a1323fed662ee74a8650bcf27ba22e9c5172c069b0db13a03a0aa7e689a0c6cccd03b894348e2b88a577921a1934a3888a13c4219057df4393158c7202ed74ba8ccce6491af1b143758cc25e4261cac346a38761c0a6a24f275e1fbb117e9fe566a555e86ec79072ab3e3c17471bd6fd429af98b00b8abe4cbb397660351dcdd941bd3c8b6f77ba9a6f7bfce57d1820273a8000b9a9cc23fb8536bdac8a3f780f0ad86964828ea9be5595640b4a7a6c14427d7cde445d1fa4985a032beaaa5ad2d47bf2a536f25fd855247c5e229f5084f4d3edce308fc0e3e92c00ce3ea6b6c81381cab6d769c81410b76120343202a0fe78b083c4b3da0a5a16d4169cbe2f18fd611cff69d75673dbb01dc2e288335644825e3297a6b94ef4407036fc2c15109ac307d8c83ab4d8029afd1213fc4c2df73da3eb545c6c55cdc003bbf6bd302c8a792263c2ffb1acff931957e761bd98ada159b91c5db7db9cc5708843bb0ff18b82d85d51f9227de4a5292d4cad152bee03e97007f40dff61b9f326121e4d533322a8a04cc5421aa4fbc8256bd21c37943bc25be49e8ada61e5f240c754dae5fb242b5f4e101317143d0f7da29a42dc81dac6987517ff085cc9b2eaf258fc97aba502d83e38247f5ed56a7eaacc68f850b3541a435304344f3b466925cdc531d54ea55988271c18f993ff6ac2f02a4c1f1aeedda7c20082dd5a7c2291e1ee60a449a6b8f66f2938af7b48a2ba01b453cc2d98baa4bb2449139c3cd4436daae2c1f637c8f7fee6e3897534250f313ddd3417bc92b0129c347c648d7773c79655b4aec68623b2924aee7da53e8ba56772cd6520a5c6d78b553627f3de75b056bc618ecb17a94b4d6b60a7164b024a693e526bb32e97f612b92e6a798b10b774f3cc7886a3bf419c0562801baa67fb28b3c02909bca1d542cd6da0f359d6a89aa73760b8d3642e3e688294ccf604369978ae4c9b220a9661205ba7a1fec3e96e2e10d73af9af284d7218dc9c249c6fd5f339ceb3380cea7f5b9ca305c04d9f0322c827bfd5ff8704d9a0b95c10ef7a4e3a332ac2e227beab26f367fd5a61ecdc228c73455890e935d949dfaa52ca8e65dfd5be9d73c4be0f8d2c0666c688de7e98de4f567627d3aedee8eb7fc75c4ab573e3fbdc7adf0d934a25d5312c8ff2cebb7959177aa440fb3a7cc8f4b85dbda4c65524df016c7e77ef90b11038e6da568d6c04bec1d53740d8d0e669d7a7f9ac3e979e816194cbdc54ae7fdee3d793a0006d415e048fe4e0f3f69c04bde7bf192686e53f7783fe7caaeee6019ceec793e54f3d0ec024e9feae6f643b8826dee65647b9f53a51509d36464685f44e1964eafb98b825d53ee3a8e9f85894ad6097a5cefe8daf6931ea7033400c7808d6be6cbbd244a6a694ec9bb3602a1bffaeeb3ac266ee3dafb4a0b8af48486c8c682e70597d5952e78a5fb01137dde04b8dc0af662de6b8a33a890f40e3c68c1c49dba60fa5e7e9d8d1414a36b0394acb7549bdd405732d118ce9e18899f897ada4be16a73a5d2f8e83b36d1370e0d71a3f0b1ab6e956ae959fd878374a31d52c8f6a5a30442652760c9de032cd6e1f621cd557b802777f290fa716771bd240f23217c2993a56aff4205f5b233e4403d73c719b6c483c0ee81c51056125793efd502e3b7be54138357335f7ed5370be3baf470ed7287a0da23815690ccd6d59c55ae1b272d46d2d57d7186e8b2550350b023b09cf34947fa86f24ca0b8b71a3ae3933cf8aa43afc46d87de82b57b3fa83e09e87ac43e362625ffddc02d4bf35f1514f755ebae9aea374dc7720319d4f80d4c9609d0970f16ab5b6ab96d10040777e2ba8dcac635a9358e636fe84a4c9794ee9f7c9e6b4682a4c9ec5b2a594071eb34a5c581d1288678dac0b525b459f96f377ba56a1eb1ae9275d70d33c3d4741e66144ea92f880fb154ce6d5dd8fc74fba41d12e9d66c859a8cb892df9a8d9398a80fd1a746ed19cda457c58fac722259a67573b7add86ce157cb3fd1e01c077e93a1560b2ff3c79c4cca88100a4cbd6e0a40fa3631d1de6e035bc197ab7573f10eddcca678433f231dd23ec2fe50652473af6133bc8c1033953baea90012e2878afa07e842f8b47a328ca9df0d21b58ace0fa8e7e501a5b03313764c81e2786e9489fdfe741521bd4fe299548e89bab19e8847ab274d0273f70f52e71e9003d42a7276521750e5c0792ee01cea2be884920f52075dcd02e9e25c8307dd499764fc029717c2ae5178607d17a730978a8896b6bb3b97b47cac98aba15ab24e1bfbefc5a2f8e2ac0c4eef44b26917de5e7d8b7330fca531689569fbe31003b760c6f4bf17460eb51d21c11b4cb8ac3bb28ba7e0c16d35104d92b1738e84b31cd27408d095984d8d0b20e0386e4e4670f34d0e8a0314500df98a568303486dac06ee4c6b14e1747062c34af8ae21b715a30e4654806717a334660155b8ef0d713e7cd2d0ab0386016b90eaaf8468e75bdedb81aa9f3467a86e012916afc5ed65ee4542016b22a6926c58962decf0319b73397e000a8ac83245564e5ba5adae8e0c76eb64bc4a82e05f9b376185aa44aa9ae831f3b2338badaff0436c57c38e9f3242aa9c9f7c00807a9ac8a97ed812c5ca69767766f87ab3711cfd478f6f60f9218c32a1c5d9d7b5bac1c1093b399c46f3270e26f035fee1e5b2c9680298b570a2db6fc8f2ed1c5b9eb65c8b915378db43893c9f4ad7026c4867f04e286d26c70e52fbfbd0420c4fddc0179675d2b2a5b7a7a3bc325967566662192b93e1fbec87f90e4861809e84e5a691bb1aed7b03797036c668fd07aea5d5586d1ed72df9fce56a6c599bff50a70086e689fe0d102e078358e4ebcf70746e7b86ba97ef46eda5927fcc5bd63564794ba207b1d85a2b38ec7a93e84768962ac23cadd9e4d66daf8f9772ffdf311a1d28fcd2187b8a5f83b03c64dc49660f630303ca5d8e37e4169dfdbddf490dd8f226b29774d95082314ff6112ae77869e72886c7a93bee730897b7d38ceb673d4030283a248b66c62c9554e3236655486c214baed7631a301fe780d283adb6fede12e43e848f81f16b36f97149263fa6bf54484c201f51665e2532f6b29d4037a19bb798d5d73aba460e78794afd7f3dc2efe998eacc597a27ae8c7d0378a6aa42dbbd2606b9a9f0045adc22ca004ac27a7e0b87d282c2102797566e215a456cd34e754c67258a067db1a6af16ee8dd50a863da3939ea8f26e89c5e87c3a35dfbe08a98c0f2a45b297609ae574173d9cd07955814ba24fd0810b686a6a6487a34bdadb76cbe8d7a100e29eb66a4d2ab72df6738d15092f519d8cd1ff5724e359d2cebc2ace815c4c11012aefe433e176b394315c6ff6b31d745b65de56fd842c78de07a1b22652fcd11a340caaf56626a999625d32d762c81e097f4d548d94eb075849beeed2d57c40ff9a545371ce9bd9f42caea334101a01afb0a73bfce8fa0c6ba88e9c159f8009701773f2b9d79f48bb793c04fedf8278efc1a54c1f77a1f8ac4e83e784054e76160e05af8b06e565a5eef9b06e5623f5c0dca6f2c741de8e71241d94055e0115056200cc5a5de25c4cc3a7507e3b153bddcd89bbd9faa0e13c30c6aa4f3b8b28e7436b0564625c15e7425ca2e1dfcdab8a721d5a01314e23358e991ae4eaee313c8efe723b19a22ea8f857667afd92267cca94bc82d6bd73f4a935c2f32d79dbff17f9e54b463911d81d80b3c9d98d45e7a93c3b6198ea8b8223f2223950196950dcd4f5f4d81423d61c682c040b2748e57dd3e51b207b4bb1658fa013f1f6ffcffb5a3df119753e65619a5dca4e507f510360721e37654b76771814fba673e1c8ef24ebcf91f2f7d08db30da1a1b0bf3300a66d992072f15daddfb5d08a08942f14e854dc29c3029f6c27968118aa2d23b528148a6e70f2438faacb3c4ce494dbeef03508206826ca8b0bada57796f4a4cace53a1339b41331dae0c6cd3f620ec58d04dfdb03d0710da8cbc876ba222b16ede82ec4f8839d42d8d92f4e67f804baf44790c00918f7e231d6b79016cccdb2efeb7858e1e9e4a1eaa67ce4bb608790b09894b06bd0803684ef706c0ccdea713ea7ee376d9d6c9f676efecc91ea317cccfebfe465edf03278410fb011e5fbf8d50192e98bc0f65aa4a8615e44660d3e047e2703d60f7a6d08d468611fc0b1a0f16d3293842c80a3fa7de450ef0ae47a084763780da1d7e9755b80fbb07ec7304d1c19a7f6dd3c2878ecbeb46706d9939922b92b3390dd918a11eedccee7188a65503c983b8804acec6bced9dfccde579891a1a884a4000adb864d8f9be54657d653713184a81225a83f314b07e32fad554ae49697d5cd9927761fb78eae1e8571efffc50072b44a3d229e07cd8cc57751a33537e66ddd2e4950793b39d471821a8bb26943e0307d924e82d3adb7fb04dfbbc1b1b832643d84362f465a8ba7bb8543ab793caea761c9986b845aa2ae3d99604185bc12c25019d5a981812348c662cae1795aacd0eea8609ea2dfaa0e772e9aea92d2d654305ab6a0068ad1475fe14f733483b03e768562e563739a412f4d3eff2ae6c19883681e3b22432943b32d9ebc6941674deb3920c52624605ad196bf1f8146689872672ddba241100425d7b73d8ce99f141de338f94e3e6e1a9bd8d6ccc8dc87e585ea8120121308ab58517549e87e8d9e358f7c653af923c2b56a0ab756afa52c2fc5b1133407ff0d088914f04adde7d8b9a840156135b5991dff05165e34974d92702d93d7027d56a6fe2a9004c05446ccb7283f2994cc064cbe6850dc82c9865738e9ee7bd205a50ae83128f007bb1b6e5f330fdb634e823fbb09c279609e9819df52bfd3214635c80c4fcfd47672cd7dcb05a7ffe0bb71867e7061764cb68fed668b00335d6d011be76c3545c4ffb3d54810fae5c498a29ead7fbf6d0c4e707308ad95103f9b9bcfd3e3a66c8cc66e506a650a9a2f55de7724254943e076a0aae77969219f0df9f7781278b9a7cf9960fb6ec69d05e819b3b448910a59f1eb3307135b469dce550594709cd9bd7e2ae8defb1526dba97db70b04c2d361f468a3193fd57d0fd328117d05bbbfed2a6d3ae4a555c332dc38fd74daaa6a8b3b55624836e41d8aad26be0982de48a98f93153b27ccb597b8f68f798789a9d46d84cb72ef3cebc064e428613757eb75c86f535b3dfb13f7abb8bd9216e70f04c67da84b6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651584b9a04a9fd73cde3a56904b09f6ae9f6a4bdcb0bab6c1e5b8e7e0eb5c8bc1d130cea0f4a6be6e364a28021fa476893e87e779022b6cf983dcb394fa936a2245cedf379642716df1a932d899e56a9d42ac668e783a910fa39284ec7ab00f08918acf9119f9e964cfea71404064417aa574c0416acfdbadca8ba43895bfff699cedc1603f781b4b7c353724019562a947afc7e7c30ffe6d9857346aaee04143e19d8429e486003243387444b718ddf52bf372f542a95e1280c4a54299d13e3879b8e479925aaa84368b47a69f9c1fe7598f0d0f5fa405ef3829299e970a8822e1885aa33e7eb400d538d335ab97b746bca8da82350e3d52a9833f010d9b998af92b54a67f6d906d12fdf22d64db5902452071bfc8fa65fa010d2a8ec2a1b8f3f38fe4c37fc95cdc46a8ccb9743534278d225a5ce233a15d503158e1db6e9d016db93b240aba04afdd7ed2f8f909f32d478b149569b768c13c4f9f7bc14fd5da12bec4692dd6119bb35693bc0ba09cca16c496164bf598d24e5fa641ca59d4b283a60b2a3d30f365014f6c8d79f0b3d878a5cff8f0ef98e48b5864c9e0a450fcc3467e19a3761ff916ff1e2a89f61bb73080cab649a91ad197fa3c3b17c6859b57f49a845fadf994fd36f575724226e32866725d8f641bbf052bcb41c96c6b7dfbb13324b10a801ae1314373b77b6cfc61580c46bfaef27b0b0446801d054be7f1e33266bbc267c09c6aba0c3b81ad54da83c0b627503d9462b75249569c8b97b6da662c18e2269b37ae6eb3e07e995d92466a990b3f8856bbe83a478a7f8725b49285b479e1cb89335af647463a4892216851668daeaadaffb0bb37d8dd651c509c3743274eaf7a2a51a0e1777fd21ef8a1555f625d5f21823aaf317e36369bd5c4976ff3c848256df750c421c9145f64a59a62218ae70d4684935b63ac3ff6f4a96aeb2910993aa02dffa434ee1ce52cc899089eac0c142a6d2ff99cec8107649c42b61a32e9e4b0541635191007ba47803c1c351ff2302104f39c4d5dd1614175cef07ca15cbd0a774dfbb79e897bcce54c4f49124d0abb171159eed866101f8bc4782c167ad4332e04d659c071fc7cfa8530854f8e6e93f21bc8152e672ee134b93e64eebe550f35e53691d1ea6993ad2158006191f1e2973efc194ca0ab66fc174758f0226dc531fb265a560e5e38a4225c01b2bc362af73af9cf446491578ecfd176663c471c60a613ad7a119659ee68c43a5a08cc7c737c58447668644f2444fdd978bda86c60bbfabd0098e7d29746440da19e9ec5c8cba161f299fb9a5a83ffe05ef8433746c7eb6e174b4f245bdd63973c76c73befd9b7230fc8f115813e6651f1cc7445c5622af346dacd00bd0d6d47f204caa07f54d4c8c3a6a1ffccf161038bb7e2184821427e2bc8fe3c8cfddd731c8d98b4e6386d70a6d9040a8a4993061e72773d1a82dadc8c9e0d0927d990916ecc59118eacb586294277fc8f63de585929d522e13f8e27331a96499ff0f1daa43e30176853767fa3362209f69dd13004e6e6f7e898182dcbd2c1cea23b682caf8d9139d4f0baa12592284c3569031f77d4cb3df039991d2d032f5fc61b035a0eb2f70f7cf1177be908cb8eaea47baccaa254a1533cf91f52c586e5648d1271cefe9633f39cdfce209e09530056123ddafaae6c8cf7cdc4a5ee592ba291292adaff17a97ed3de2ee575af0ed4b4705c90b30f42902f7f5591aebc1e5e9a25b103c16aadbae2682df90eddca8610025bcd0254fc55833850ce6b1121defec4a9e502ec46af0293dd87f90fabe7e8eb0d758cf4a6c2c6b4ea6bd2183ba734471c82f41105179d222f34b40dc1df7d4370be2d0b1c985ced4311a85479e7d5b520fad7ad6a30fdf272f3c6140487ce28a9b490c65e3976f35e51d1e5d3147a1fc418c8fb9b98dbb032af3193f1196689423632d92fa81302e998faa9b9964d0a92a7159bfb362749ae88dfcdbb7e3b87ea009a4fa76880b817aa55df06b1d2327b01c387a0b926d8ba31a32a3696402c64e0a02efbfc32af918129a4e2184833c3a763c9681092db63fa29ff811de4fb7f34211d7a05c5d46a890e5e058b18522565e89649c9e397b3c4a2a35065fc996469416425e3e59cf69fb886b9f89785c9c4bdd8c4c224bb826c0c2fe2928a66d78432d240c1aadee7acc061727d3ca44db2ba819cd401cb9404751d1f48f23184f3aca22245791be2ffe23c25a811adae614effe498d6f0c5cb0d2cdc6714b3f23a1c7858ffd43dc1d1be0f760cf28d2d3e64d6310854d6d54471d71e8a8d7f77f3098378ba1e5122eabbe0cb9d224ed4904429b2b275f5bdc45bd8eb71f9d243e5b7e55161ff23e35434e83cb38c3873c037f255995350869d8c06ddb813aef18bdafd7a280d92f25b5719a242000ebf0a89ca4589894f6aaf04e0288534f83560c53c82e472ae8ce54c5dd9812a6964174192b857f8144a77af9c6a86d4d301212ea8137352c14a002fbfcfa6c56d4df69fc9c235ae58b7fb11df3bfc2f087a051095beb722f58d1d1c6b644f989ebaf4bdf648b8addcc90ce1d8d080acd5ca2e6499bdac856177d8b121b77e7998ed394b47a5e6badbedb0e63207d84190b721b7a40037df1bcf45bfee6c953aa2dd319498200365a5518ef7815c71bdc88c1d8c317d9c1174c401cec7eef84e49fd2e13b60210d58cece2b3ef17b0fc0253c68c125cc18e028311623ba3f0ed6126e71e0af814fb5137bd5653b6fd923ce03df31addb6728df0932d710f876b87e4ec88b05fc406b2cb5ebf3a7097068a0a3edf583d44f7a52e042fecb083bc6bf8927b503fe23134d1fca2d7238e894606860ac772a3d371643acac90dd864107a046dcace6e1089135612040ed33ca50ccd15358813ea65077abf2da58b84891ecebd6856ec6da84e1aa05007db848d95b27246565d7fa46b2f4515fa38c33b0c190b343ac27e18779082eed3a54eb129c4e889f52779cfebf26b915227724e16bad10f4a2037128bc44c341f90418332f8037c34cf4e781a01bb9421922b747ac89ab2a8a3378709ed1c401e8445c2272d26ebd9b585127fb57d5d183e52b2e17861336cf9e10e34073a97a4880794a507bdc3c9dc553735787357eb8f726cd7ac0b56559fdbb1e3758ac97fda1c37419da24450c62eb6dad5e479608bbd4ed4296c6ebf812b6a57c379c796a5a6baa3045f715c0a7894427d314ef37f454c83cc888b165aca2a3eae11a768834b6b358bd399fed1dd302fd79ebf951527a448669c516cc2d0f63f7f968d138c3af179d42f02d3c0f627eb7dae2f4489baec3626c85116dc23072b4d9c59f35564137816b4ff91fa4988cca72f0583ccf80a5ce91edb8642758f49118ddd7cb598f92cde96e8cc7873c34c1d50988346307c7ad359a5fb1e2a8f21b54fc1f800d83a5db56f7d3c459500429346de68a1a049a610c86dcc5a7dd737a0b1525791d8712d4de313bf3e68fca59a38a43145074bd0235a4e599da5f58197d353bfa8c9432c709eb3a6a8b533930531b16388e0d9df67c46dd2199188be257c065c55091a1006ee6f8f93677f3f9ba7a7e0989b993fdd53a97b92b7a33d4ab0cda47ed4a26bb9e6f0ce3ce05f9cc563231e020fb655e76ac7276febba742c99f5928f17c2f5788f0f9bb4c3021dfcbe7b86cd1396aac2828455064d7cd2c56cab823e2e1b56e6f41db25ace49d092eddbb0913c13f9c8783bf986e7de6fc5f2db09ca04c6837730c7ecaed255c6147b6974a29fdd2e3b7140e3397fee402c9d478d879aeabb03f0f3362f5b5a2ee4d8b92aa97a0dc8c8465d0375d8e0eb3db05589a86dea8ee32ba2b040048f0ec7ed391691a1cf93c439737fee4445fc2750378f3c3dcef47310dee2ec95558e2fdcd69fbe4eed7fb4f804970c4afb7ea2f54486a6122bb870abac18656546f92efc00660503ed2ed25be1b43275cb454bf1cefe62865830ae736357dee7eb125ac93a308a7144662371d634c3ec003aca83647443cac5f8e8a324d2a8ff69722da02fdaf0f1ddcfbf836411cd5994f0c8f816fc8e5a738d6778d4afadbefd3eb830ca2168a1cd941d037f8f0889dcdbc7321b131c7bd6d6dedbef81e9162b8a6028696391a5f4d40d52e8bde21fc8f4df1396b58d6c9d125cf676a93029994d13255f14b6f7ef90fd6aab2e8d0e8297cb53d7faad0e361be240b127d5d275fb84759ab13a7ad8be346518eb425d471b2600b78fbe5218878aa6997cdee9baa4eb483c7d979162ab1418ba5d4de7c2609837607bfd9e24ba0aedecd13d0253aa10c91fa13cce0ea826bd9c4964e416f9d0ce064e8abe60dfdee2845d2c393196cc17f7f5cafcd2fe059b217ff9b97ee17b779401e701c971a99a378635cb6fa1389d6aa5ae5027d924743a3a4c68919efb780e4bae0b725df4e1b1d4f9a5c3efee2beecb428d4ea0b1232e073350c30d86ca6197b5d079bf1c9d0fcb1e705d2b54951027000245ba068b7c6d9af593e8ef64834d47489a673df93960b90c54ba259150e989c941fef9de78403bd7e8e6961811c5e824f43cf71e6a48ecb0c65f14d168fcab6eca03d7ce316f8b3a40c0cf4a5baab0ca4d339aef0b5d027c75daa258941cd6f6ad7260c1bc5c1ffc463b0be9a40ac7f96f90d269b60c8c583e624e0c11aa951a4542df0684fa5c699a5416067d5e2e26d9e28b90bc50b6f9ad2365f31cab40ec0e58d824e047914b97cab112ac35b49ec606d981c0c3083e013be7fdcaa80a2686bda1c58386aee9507801aec128641ac6c2fb6346aeef8ac2e86e122621b7e95131dbb576d6975ff0c12bd7990c3c94a19eb85efe8b682bb526e5ab6645767b9fc86cfe92101773fa7348076ec58c1991cb182a949b52178a353299114d4c20e389d4dee383d6750cad56fe52591635a8dc94af1208782bda71108f03d9a14a41310c4dae567c7dcb22f1f42c6475319cea9701834164fbe9418a9eb575b516e5c64b3ec3952fa51ba06685f0d79378e8e5e8c0b61c662f0dd48b1a9ad44ca7f94bca32ab8affc2d7f1f48301a491d0d61fb47a59e14cb84688f5d6b6a68052d4850d1490da9a0e764565c4c57f06ca7e23341dddf122499ac666eb2c9fb4cc9190ef9c7cfd595f49a12b383706b7b1424d77102738eaf01ed34326776776f3d69ca39b73ee4706e7bef37ab288554bb51e9050fd7d86540db0b550f463a17485483d5932a3962ba3be881298d314d25ff8716e670d2938f6cdb250fc4a05ee338c0977900498d1fe2b194b1e47b6b674ec87f43ca2d4dc70103395ed85b20574c5fe4c62c4fe092262cb3b06ec0fa3fb7eede7f0c9e7461835c73160998b03c3249eb465667b1363875db308e837ec4843a20773df183663ca92b1af0dbf790cf3d3ba94c95668fe939eaf2cba82006755730e94e86f3ef600bba835371552ec4258cd64920bc19e6618bbdfde8c600bfb842c054040fc9792403147d48ada0fad576b0535312225418dcb0c82334a3f14dcfbbc9fde1200e3ab2d7f3e3a993182af99213c0e00b4e4dd3581bdaced70e7116a7916e62bcf0a78668112d43d23291aa30b3acb4bab4d4bda8d2824192bffc4f7eaa5b8aa056f178b6ddeaedb7e38af6197ec370691a6e6819e6b4080aa8f51e412d504656ee70b782995848b1e7e5df415e86a646ce2c86fc126a21fc4b00d3f4927700c53615b79a72da6124854014aa16f6f8e05e316003bf4542bda9a03705c456d22c668f9d5f8cda0231785bac0986001de9d41aeb2b8b21f4996483d7bf61dac2618a42c329fd514eec5c80de4604269cd1f1f74cffba98acd54dbbacf938dd42c9564b145c5dcf21f8aaed19d238f2ee3519489898ad2bb00f235bfb6b34ed913871fc1ee5af2a832b01ad5be44ada3b1d53df21ea0145611688e1ecfc4579f5cd951a04aa8a5a1865b93fddff38aa6bd6f67b43680efa558192feb644672003e95ff12e9d7616108f4bebdccd422e0a46d4275ffbff3a7bba3b9ca3cf10a4202f71e0a24fb98874ea983b7e98de2dc70d3802fe2f9ac074335b1c002f429ed56645d532d8436cd9d068100d536416fd2b48796dd5bfea7048362d70ad1217f17090d388bcad7f7758079e1d0ec27442731e9ca09c5a9033860039617da07628933dd0dd5c8c98956ff072840ff2128749d747c70db6ece43f1a54d239eebac6b380b71437307bb78741da5f310bb10431164010b0729b55c1686427dfd6ce56e5a24c38d4c64f81f3b2ef7dda5a0e524e6302f2577af7bdc9f898ba5930528bb3380b8b57e60ab77ac5e6df651a89a7ce535fc5f615aa057624745d1be6611c591fa3c4ab2f6c235904063f7df82c374fede0ab2cfb983f4a63455889234e41716baebd9fa6d797ee58fa56bdb5b02e50594e1cf0c43744a26e0ccd230545d79656e6ee161f4a27b3acc65e472f89281f4c12bfe8f3c412fd5abc2c6593b6b8ac71c17dbaf42e639dd4b869792418fded79484e56b758531293cab094cf0895c922f57780ac7a27c7e92d6a8c1b859833ab9753b745bfb17c3e84430db225ad04abb9fd5fe5ab337773c3226c2934809fef9b2d9a6e981042508330551f0e7a248e1e546c42d79449ed43fbef745aae18f3d9745cb1d95669c521c1e1375a161209918ea32cb8cabee764637e7071f3b0d0fffab98672ea5bc3ff0e2418db5a76bb7aa28bc5095c487d12c42be09c7ec7c8030b54826af316d3782353d709c62b16d65e65af2d1f17a2655e46674a0bf82f38f2f53bfb8add3b43bd66041a346c9cb65e8d73d53d077c0fee758215942aea0af363b33f562b0614a186afa1cc5479fb797bff0957b49d1b5ca904307568d147e598869d72d9e9516cbebf153b427511c0b10c9792c62be54c51af4bf6a6fd90403aedbb67669e5f47ee010c2369d716774be289391ea80e07d756ba2669a6825ab425430cb9ca3ac1921997db50c424d7a6b9b829dbb3a4a13de16227ad16d62f820bcedd88aba5368bf9fc4f6206f186572898c0fe88509d87ec32f18108490f7404d856448393ae8440668b090146419e3b93008568800432213455cad46c504d51906674c602f1ef66d5a4caf76ec1ca319a80eddc66f438cc7aee775120210515b19107a01777e10cf23a7915bf2ec11f9e3d3defa70b77291670c5cb99d46bd5d89ba4a7019297cecb1014e78882ce25822dad5fa6b9671431bbf83539e7bf1537ce0b152a3e618c0b1285ce2955531e28c508b561b2e11757ad4c71e86e4f56b2f24d65acc5acacc3601f3d69d5622867eeb72d39c6b9860df450096f5fab66693662ca3e6e36d9e0ce8c486856243a9249c155dc6be52f09415d848af3444603e3e3e94e39b188641df7f548265c9f2b0741f275eb2210cbfa22d522b9cf1bd89424a644b97d1471a175cc7dc1a26a0f180dbf97316b8344a48d2063bafda91af0826a37b8e97c64317fefe2ad1c8bf7e80b78981ac14589c11daba097540122105e6e9a99554343f50ca6b9e6ab4a3ad3f005b5ec04c421e84e69feff6003c1e8492024595e31483ae9117cdaafc8b7db08d732618594c92ddcd2a0c84104291dc5e997ed9b4a149d99522ab2245bf225d848d790824e4630899e3e1dfe6f12e4afec92a1952fcc0d3a5ac8b02ef1c98b4735e4e478d34e0837779dbc3c32c7806e3922561605117e632eee86e250f64033a51b27d2e6fb36f9bea0dfa9931a0f76e4c98f142bedd160653a9b1072b258dcd9d5f86cf1c76f14afd79eef7e17709cbf259f94b7fd0cbd136d0ed5c5482fedbfecd845c0dc52b2fa674d51f26826b538ea62dfa20b4d8a41bd26c0b056b34eb1753281910cdc1c149c14da6cfa5d062fde59dde7f29c1a6a72ff8670e4ff6a7260f836ed9527fb64e8b0e925b0c83269fe58b07b5950bdf8cd209f5939713c5e24ef439b2020131c1fa10af61c4afcc81d49909d0a37441b9861bcf4babf7f490bf3c397298c4a475d1614be8a3897595f83cf1b96d56390dfda29304b1eef5acdcad0a15ab4a13c61ac03a9e08ca433aaf9329710c683a7faf2a613fa721c7ca98552a28b357277c30843222db2d54e033fc99a94c6c59111fdf18f54c287cf4259a00ced3653bf01a9f1941abed36a6bcb6f806662e0c82b94ccd760835ae922a81d0b01d7ae7987233e61320228d5393431362d430c8860c020bf2a43444fc05ec36b02d428a02669370ec6bb036dcfecbd3bba4acbb7d65e59a4fbd5580964e60e74476f6662cc58c5dfe8aabaa001e6ea5eee885c69523eba01118381dc608f4c2671e36f1abfcccea32fe08755bf203b6408fa4d982f729d571984902adae18fa71a15b363792a9e013b06a30def5db262d0ec542d933a02c6ed1d9f09d5240f7fbc23d4bcc1f4745f6ad256d37665a57888e9746d81d39edbf4cbecd2a5f4c219657b85885ee35b806685fb0e50e544ad151952ce1d5eb0fcaa05e1dffbb1bb82e407bd99cb5cb4b793f39ff10aa5f1c9e5c158606ec3eec64d60e4a7bcd228a8a2fe5807d68a4952cb29906c0fd627df3019a234f82ce9974c95cfcacbe6b9d6de25b5b1d425b985027967128fc1395e009acb2becb9f339a96345749ad459ff4a8fa749aa47b33ab7aa1b6a79e6d9cb73e46675235eb0a8b1b82ca8c5ec91b694f09c826243310558e062554423cb1d837bb4c06779fa47d7c88e1a5e71feb2c707dee677a5e07baca4001ed4ee9e2c165be2824291dd3f397edb022b03c5b49246a22eb669e3525c92a6faffd400dd53b66973343aed34c5b99480ee0980a8f611b5f5389869ec6b0f7020cc3f73bfed687c06ab5f23c3757c730309240d7840bbc20c4d09b9993a0706890b76d543d37e1c4741f44751ca3549de3f1d721c0a196424d1d2c62edec2172c155d522995c75776424d3ba9b4310ffc50a51863f5895829ec2909a0997d91d18cf8044b0722fa6487a27ab6cc0eb88b35102338c65a62427cc3cb212c045d2c659cfcb111becf2b71b9a2a6e93714b15132e7261dd821966e8dfcc09d86a65218801844f374afea830dc4107d38effe63ab01cc1d6505c8771fa0387a2726fe96094c24d048638e2ba9def73f70e0f0fea802cb733151c652e8c3f512cd5ec8d7c369c092075fbaae060f2ba8a1f0b7f1c6f505d908e5a302592446cb26737b57e038242b8daf06d6feeb2c9a4031654e7d9a8b07fcb529fd3c77bcea6c4fa97027fc292d32b5b834606412e1ab5a4cd25ab3af24db414cc35b6aaf4e2800dc1c3c655b0bbdc2a1501070f96a7839e5ca3653b4596d8210f725fc3f24fbf8e506953d9c2077dfdab76046dda37945acafa2326e00524321283b7d8de962c6babb6a4826ea24b8f6abbe18cf8cfc322f75f08b11eb612bdbbd6dbaad2314e3523ce196a4c7b7ed01a290526ca828b3886b36e316478aec8199cdd4c40dccd17e14c5b8a3743166a41bebf0099f2d38aa1817dfc0c54b04164992416718eed4563357bdea26e952ceacf2a4ce6cebccc3c188873e0b4628e90d2474632753bbe7373db04a528f06f04240f362cb9ca48e67a236309f82602cc62765aaba724d07f542fa0f42c537e8a772203e400f92f27f36f8cba341dfdb613d9bd81857f8fe530fac2c593d92b5138d92c36570d25f70b19dc4c1ea3f2cb60bd9d2cea7a80a3d2e624ef3c1aa8ac466a7ab494b123e4dc026cb1b4528df1593f58971b3f9f6f1b31083eb8b6c40365957e0b3c89b8efd120c6fd16e93915f989368492a44b759a47847e4190409e62b82ece30d1aa63f8a553a70829c7c60a3d627e7154a390b83b1ebe01156b00ba2b1153b924bc9fbde0e01c35b09fac0ab9fbf4e86c5a0cd7fe094a15da00d28532ed2eba4243893aaa7708d6e70519d25bcb2985bf2596086c4cdd020bf330f45bc5251b20723e71a1ff9ea6ba65b0548023690f7f3553bd483a338f45902d4a53dd319234012016748fb642eaf36265ba94010b3d544ebf355322a32836c4e7ffb140faf971018bda3e5352012db80b80fa10a8d287a4c6772f6dc258d933e8404d22387ad40d8a92ba731812f4d7c9f0cc7f02a70b496ef969a56f843312d0d57f71a2f36753ab37dee4059404eb8755e3831a6c3900bce4b25a6cc86a722c574fbf118ab60f5d93cd8dccb884cb06e5501eb332a69b5d90ca50cb328a4d3cd0a62fbf943a8ac87cedaa1b062dee70dc185f58e41e6f6930f77528485f715f5dcb2bac5d49f4d06e1501aedf675066a688af26c84448c114d1e8120ea68584d728067ec03ad23c75bd6caa3abe9c54d92c53924aaed4e2ed70b414e9b5c57f1ae35fb099856e24e7a9414c1d4c26f4b486d238c6304510ee3c4dd18bbbb8ba195dc9b63d0f357a33dc87373822fec9443a814606f44fa13324dce0e099921077b83edc9f19849dd0917e943dc721ae520bf2a1b15d29b8f12775ebc14b5be224c65f369e3d305f03fff87fb5e91b45ecbaea7571905ad14407d079898e7883b3e334880ab16a5bbed13d38e271357f03184d31fd55f66e6e1f1a9d49ce029841ba7672e103de0b0a48c3b71a8d626c578da391c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bc84e8db3ab29823469574c9b596e2e070b258640b33d402da3213cf53c7550243e3f5faca65791ccb4f456ad51adc0e1589df67d0ab448d486155b8b26be4dcbc2bddaf70383a6338fd234a532516647f6b6967a51d3b7f65fcc60af45f2d46028cded491058ead42e78f898a70468e9112d7085fb21792fc74ebaa7afe80267b33fb1e62fd1561b94ab2c94148f94e2a898d31c37ad5fdabbd3754dfba6e48db7979d808acdfa2b85ad4e4637d1bbbfb5add0f67aa31f709da8856ae5ec34235b5f9a170558b9ea06b9ab63b0014a800aa41c716a851bc9e4460348db50bd4c18293719c2f60a2442fb5eea3d33efee7b1134f3328161e67ca307316d44160e8e1257a4499f57d0e098429a13048a105d7d34bde433e8610ad4aaa237bff7271914e526b96564e7a3c210c88192a59f3bcdbf558a7a8e6a732472aaf6020d30821cd3a04a5f49ff7ed41549faf9ac8ce82a32650e1cab5a4bea50f749d51855f76d7a2ba7ecfa0026ef50d9002c1f455fb814ba024122311757feb22ab7c2723a1cd5efe2a55848b347f7b62aac34ff7369b0cb479714e97fc943a136b20fc1149e900e56a9e667b1ea9d2691ae9ec72a20e722d5a4c87ca9d51526d1a37b4dc0638abd12d1f58cb6e02d096514d8f4de73c8b989052e3eec5f7a7fc72a11cf6ac2cf20022b862b312fe4e4dce760ea7d75ec8f01e595966154033f30783402e9eeccee22712a78a8646ad493777177692910aa01e5f402b47d76c27f43b4824b03beb9996c39dec280b3e0ec0ab390c7e4cc00df6314984cec4b76750627afe99eeb998d02dafd64b9505dd39d889d2f0217095963e5f7e38aac3ac3f5531e285808609db23be1d1ff8d4a5999666b984b6bd0a865ef8e195343c8dc6a2fc3b34385ee72f83ec049991f6999fdcb8e1efebe92a71f2f9c788c6bc6b2ddd84658b1ca4a87c3fec78396311eb498d46d3a459ccc9dc5b8362597f9d67abc3ba900afd8bda4bd20d55d22d371f87bd32898b58eccb42dbc524c8294f00fbacc62fffa1e6e7c6b6707427f2121f9437811e72a7ac0da7563d81b0275429e4e15e5d80b67392bb1cf4a75ba0e4ff27c7eaf72681f41c5b94076ae263c0fa311547a1610fd4240ed106c5c5529ba611dc1155a4541562e4c4fff585ccfa3a425516ff917cab5ebd4d5b219795887362628789e9e996de906eeba05ed747c4a7c532b092be5e7c14750f6ef6dac5983ffab22709d942ecf807869653657e89a98eb298e2e24d3ae263fe4f25ac168a715d476c85d532eba1a43448019ab43754a5c0f72c620dc0856dd7bfdfea72ac7fa7d2ce9705c4ff0c6e91106f47dde089cd6796a8c6c5e585cea5d0744a53c28efa2b678e98817411e583191d64ad5c3896a9881cd6e642b104ceaba79a47ffada4851caa7abdfd8803597a4b4c8f38e278d6affd8934ef17c495cfd3382cd36504f10f3eed146539caea34aca98987dd6f6a2ab44f20346477238e09335fe9ecac88f385625b2573710a88a48fa5da761d39a340974ba8bbfb6f1d5acdab9d8b2c7ceb86cd60ca7da608ea7e79c1659346cf59375847d48504b920364c08bf17d465c7eebc57aeefaa0f3312880108b954892aa76b5b70886e1ead98751950a4af8d5446481c7141c3351cedc596a3b132d471244df56c2a3c28a7a3e7d65762cb431a8e4c093401ad9f50f8366e6b24e9d0e6adaf1ccd219adb4e628eef8d033872c41ddb2a5436b91a8112df55813b5ad6bf96fe9a3b5b1860ee2e41f35873fc8141da0a6753120d91ebf1c4fc8b3b58d4bdbbf12449b1c48331d6e36ec303cdaeb58303eba7e478a2249bd6cf81c5e11018463ab8f5a4fca2813ce0eabef7d9dfb310060fc7b0267611463c81ec58753450ab7e7f58c7b3c7c286befcd33fc317c55c4401c1a1dc3617ffb7cd049998449927387e70d519b7d07ac617f193409e6a965ff20953978269c3e73dfeac852d3dd7a09a058d6a79fda1133992caa3c71ab2a85f857a05308b027b017d085d73fa9971e87e527e23299766a1079164e70d1ed7750ef7e25a976e69aee6e35e1e46802b958157043aab9f5b8132a250fa918cdbc69a8e1b191c06c2c433c10342e6f6e7422635058914c099ed0a435a8611e141b46053886315b8908a4ab6a0823aa1dae7329656270d54b9c9636205297171cf4e63c4db4e810078d93d765f78f224562a163a5d5770393bb54b666737a0a13fcd5e8024cf8e25973f36925e92823d81b4d6260365454dc01dab3a02b4190448549996fd8ce52a0cdac9ba702bc485d4a62d48a26650fc11c0eeb60232787508ecae3395529c41e86c024c40cd153474d8698f035e8fd450e41bfa57fedf841bcdf891e077c1c5893d7c5c8dcf0ae417f8d141f101a94ca97a859fca42e92f9db94cf11b70204cdefe9ca4e51934a1225d0820b59ab2209c7f1dab9df65e1bc80a3e9a862ec63f73cd38bc4b7794eec4c67691bdf18d1cf601da22bf100ea9883f7c079be1b45647b2685cabbc5f5ac0f43fc96ebbad1e3ce6c7ffe25e72387d0ec9f3efc81de04e8c6c1b3a900aa7aa9703394def15d532d649064b40ddd3fc1d71287bd5985667356034f8a39576b3492e9d6c4e1f685e159b40085473acf9bd1c9108d8b4471a62ef613d67fcf44b73f22ef17a03c9d10c310449479f710f7ffc66784d065beeea0977b451c98422f629da448a54bdc442b1e19a55e8bac544f6122b1b7d185ac3bd4340f93c3063dd337940b530c39c443d17f15f1bb7052402ea380961ee19a83271eb9c53341996a55ef77ba58a696e3cfd7c37b1b992047985be1a7bd26b053571d0dc84b1265a97d03614c2d45c0df3b61d09c790336d24226ba600c821d29f8d694bcdde887fe9f0c0fae0ee60ccbe55a520eba4ecfc7c9b734612dc9ca777571e63ea32b1738677fab634dd3f0e07d625b045142142d3e204ff5f937883c0fc6c9855a971421e7bdc38bca00cc9ad32f6a556ab243612d3964e30574bde4ed1abf7352fa1dd7ac0bdf387bcec1782ed6d1012886e81fd3e919a53c785cf0c28aae1248766ae9653ac43632c4f6d3123c240c6014ef90111248952452c5a8f19c98e1a97e9d856d7470df70046359900e01b3ac906fe305277d802781a7a02e5782bfea2fd290cbda2d367110ba39c1e3260a1b41d88126b921e1c34f8578a5715303d80d227de9aedf5337b602165972dc9676e40b9b118f8e797606271d736e42b518f74ae72a3333a847a79299b4de1db49f426260bdd5454fdf18b56daef690264e7e675b856fdade54fef5aac36c52657927c1afd0868c13b7ec29be409913cff2b9f357c7857b83321b3380396de09abe5517926ab23b40c68f8c971e6c357ac81e6694b5d23d2674711acc817b1dc6a1e9cab51bedb61eddd5b0d6502fc766505315e2993bf6cb0136f8fdeb9b9cb3ba5bae4d1a95275c1a78b159ee15bf47fc7ca1af3be779ef0c7a3f45e8b66b7c0f03cc8870272ddacef8efc3e9e1867e2ad2958a3d48800a8352a4a3de143f93254389db5330346705d7566c2a24e2a5c4eb5cc432d3e55e8aac37fe77903cf17a13e9e5da6e52febfb491528370980624db7427366cc841aba23a6680aaa39ee760f9c857541e6a6bcbf2a66e8197078b70361f465038bf9a1e44be41a48facc4c62972d2a2303dcf07f82b7ee979a31e292ad84009b529ff0512f13c9cf14ba87f5da317d0e3b468e9ab258fcc87c87c6cf0aaf7db05345edd6309e451704e85a52a2942736e69d0ff9a4ab7b35450ea9162286711d4906a5ce3ea7d3f79c95c93d772d10a39aaca284d118f31857213d9dfce4e0f2d80830c0816fa8c6850bb1f0a2a117879185361d7ca996ec4f94e21bfcf117e396de524f3e3778540bc06673decfc447b8536574bf8166febc99b876ffe55e6777e8ed486cebbcd594a307ba3d5da6e666dcb1ff95880614675aa92bc3f1dd7630ae7b84c07abdd42254b9f6961246f2f284b12e0e32265603d0df6d9b99184d8acd3b064a4bd22eb031e244d269308d4241b05d49a5ddd2d3ebad6701dc8eef502cf633d9892cf84e6c1bc2a53ef2121e8f791bf2fe36d631b5f3064c5ff47861c969c505b5d2041cc68d922bf12cfc6387d124b2ef3b22511481e07f601765930beb55e8781aa71cddc70856729453aa7350719d9cacc1e23f87b64c70b0ef52b421faf36b393f2a57889e42f59fbb16ec710fee23d770b5645160fd5194ce609b91291de4eeb49588ac272219fc701f29a2c3fc50dcdc0d2d01954a910b963313b61dc88260c7c598ab3bc79bddd57ca1d42cbf8f1f0d4b8186729ffbbeaa668550fc36e510fb3c5970804272f57c7622f51e63303ac3bf5b0ae45cb28b7c985889c39ccbe15b30c3909d093093aaeba34cd089bf87d16e07257cf21444863ec1d131a5e8a5724d02959e748919cc18bb8311d5c7452f390883f7b693d2a0b54519a6ca41f9f35443a85ca48e8481cb350851bea417ba42be4b3bffc76a7e71f1fbe9c9a8319f61a7abecbbf218c377c0ec1c5512ec379ab333cfef78a0f88bfa516e5b0dc37b2b9387107cd09c0a68454762f69d4601a500a0fbf1a5746c22efc2bda7fe595cc53263fb759eb0adf651ce221836c34c8e018a9d5cf7f11f0b49adbd2f8b844d6bc889a8a12d52f96543da3ac3d20f4f17509e76999212923d584a50626b54f4d50d0a389db3648d29371df62dc49ff938c4ad51d8e49805f266555bcf22bb261dc8a8efc0ca6f6d29aca55e110d92eaaae583d4cd784529f7998fbdff084dfc260eb1af5e1ed3a43993971a923b803bacb3cf3a493175152e8ea3af1e1862a467bd1d29add3a47f6911d651e4a526da163b8da718ff5ab6f95d7468cbd7d07b0323a75cdcbf7cd1170d185ab74e47fe508ffaa30fd847e38fa2b42bcb83cf67516db1b773c6c3d5a5cb22f425cb57d62734d1534e816c2fef0a7d30821beae76e216c251e9e55fc1db5096cd28dde7943de9858bae95b7e7032f2076cbcc2b7d934219ed0d3b29cd049ee94ec5ece7ea9f0c6fa2faf6615cfac2caa63424c72817baa90807bae132b06b21567393c8ab71827e00103f0b9cb2a6aa8e50f5260a301d36d6e2e29fe51d46f50b1a7fd7e89a790b98fe62bdae71b24981e1285ae27a8e2e4eeba9e629f477db6378aef7d68492553bf89a955b4ae84f96927035e374aafd9c7f49bc05de73089991669eab370d7a69bfa6f322134b78e67959ee7a2600efae6f37bddbe6c6aa49a068bcdcb92847dad27b4cff7b37bfaad5b7e441124e19eae304059ffe9fbe1fef5b0f153566c05ba49cbc75a057ef7f5f336a06ba58a4cce365cf207eac2ecae5abb2d9077bf252737abecc3cf30b9cbb68d66a69624eddf58e9c8d8e20f40cffc0905bbcfafb57c09571e635f3452e6a459dfa0d548658a9fb0b1837d10478c8b17c1300b42e8eb462eedfbdf85c5b7291c59a05e8bae729ca8fb7e9c32a00d8bf943f6412413f660c9807fc931294e5788ba2f184f2bf69e67703a868be8f0b7029284768f88634a6a185a37d1b4ae0d7b858837b2e23b07d9fd045d73849e5a8cfb279940ac515ca97131e703455ff844d211b281761c751ffbeb44059b32d6a8a8da2062e0a493db7cb050e3443d7f76e37ab19ddc5996828ae143c40e753f64a433b381424363dbd9ce965f84d001c686de80a04dd270d4d3e2c3a9ce3a5fd5e8c50e04280a3d3512f90759f2c4afe03dbbeb8cf183391ce2edae7bc81b62699ef006874cb0c95b8ba5ce0c5361c4e8ef358f106aff304c30acf17015144895b812b4a61b9ac841d8f4402f6484b275e18350278471fbd47981fca3a0be0e5740ec259867f4e88c716379f4fcc43dcd432904918a0e2a4e2615ec7cfc2584c202722413c8a843bc3625ed9fe76da0159d85ce5ba462c23d390f163e7b08c4c1f160e8b4989cad558d913696b06817912b730edef40ae3a1d727783ddfb5fbd0a8271d6d624253957b6209a3e2101afc2d2df082304be41b2141a6e5c38eb13df0874cf402c9cf57f6735dfcf0422e86efd775fc578d64f78bce8a0b1f367a0c7cb009935f30c13a7713b029f6ec3748334b3205c5d2ceca3abd81f032003cc90b6fb23cc284dd690d1be1c2bd3602b60891d3a52982858e275eb6a1ae5280145c34c207c556acd3eb36d771f10e13b1f3a1101c047328e40d4cf45bf7970f14d91c61811d24a852257d9bba4821db57af1b326100fe262b492fbd7f697fd86cf44b5a59c3e86d2c22608bffbd534846b9bedd97553d7a047e834249650679a7d018e9efa60eef00637439841e761b481cab5fc88fdf3c8d1d61e22005790c9b1b52da8160366b372087f3f7cb1eccc303a85a8879a10fd6cce12319c9f64b95a3367d885268d647a2ab5f43166b2d5f94516b919a55c6a03516207dec1c0e73ef454c3a52487552109cf635c1028883040af0969352b04f142c5ce8a2ac5a37531dd7b6a3557533c0ee7a25fb25eea77de284898a0e5b57066c1edcaa2292cefe1bf43960d7723c27f56b3d5054d037cf14508571a36ae42ba5f9eeda34bf5915907869bacc66ad83d2fda0ed5ca9e3b073ae8ec047d4add458669015850c248cac2f8b39f2da267264e7bef215c6ff4651b36cddef2f57453e5ab6de7ba7a7999fdc66fba3c60cf8c070dc2e0bd28c9f4cbfa049f4af736f80bfbc80d585831d544f961684a35b14a41dd40111c4274d356e9f2fffbb4eb77b0edd58a4490a34f5a6b834ae596f349ba131263b7e7318a4646c936475864fe6a14b0fcad82eabf7a355ef04ab0718a8a3cffa114c551f44a6a71b864420036885b89c998b7f47308426700b800176268b6b9cee4af3be48c003e6126cf4cab9ff061606686a373a21a7a4a61ffd7df5eb769063ff6bcc3682c5ec432757df673f9aff6c1a5e8f675790f8a6b8751d7c79f8db32b302c1d3a9b5108e24ff30c1f2e68b4801ad433b141a46e9c827c538600278e65a51f8ebeb8194c77fc99ab4c91a6fdf75c292554196b8eb006e652c7c97018db8ce3f7a21a73296bd269e6fc1c42d3d02bfb145a5e4202d6056f40562bddcab9e81e69add85439c933ccb2dee1b333181b2e174802c8cda0ce8bd936e20a418794fae6ed58c0e9b5ea91e61cedc091665bd7038d7af7cc9175e6457fd626c351aa03a5d76b86e8f090624dd7a6575c3f17994423f9d70677e3a84d2965ee6d4f70614d7c8998b741a9e9a81362a1b3f7746013f35ea2919966e3030799dfb7e263e63ed9a9a936a3775c17ddc139a2aa369d78777b53587088739a8ee9bcfe03f561541468090308e6d21db9bde1d40095d34a9e0a1513a7fabdade1309fa77f80d4f51bf8f92cd49cf74e48b80d0413fc9fe861e91c431838091e61bffe94a9a8f9b6448660dc7c3fb8ab8c6a9467c4b580fc6c588b702945a125368261312a9c40e781066b77dfd95afb2278b4a737a0ddec847b48045366688b9424a694390a111165ab4b28f2da525cffdd81f0e3624e10a52ba2f3891fffaa0ba1c650ffe4509794a404126470d811a81ddaf0464d5a8cf31b7238e75ddfa9999f975136353ac68eeb39d1a4f66a71170590e6ba91aba97ac7d039428c85fa425d6d707acf1411618a144f08549f74ac6938fdabc25e7b7a44edd8b3213fe6dfc62046da4aea5f4b85d48c09c01a994ddc9eb0c5a190416868476134b991eb66f16b224bc770cb2df36f42a33b413d36e3f02965f9a2c3bbfbca15be770786376e7b35e7c5a1c390ca07f98f358b981fa18a0a0bb6802d3a67c4d2545252e71ebfa6df775982ae70f9eb737ced39f1921263c16d261f5cb1b84dbf1a3a578fd9460cdc6122265527d34a19480ec6851cd28b0740a5535a9b45d15fe0f9fe60cfff4e8bc840a14ad0388df257375ef8c0729eeef028cd6aa863ea0cce6951d4a6adbd0052ea14349f4726ba763d366319da7e48191ae3faf38a03351e4a5af31c70e3e4f69cf995d783853ef70a9570ec0c7fa1893ddc28104bc29b905e66d618434d4a4c80e5e1503a771751e3f84836e63c020f7d264cd62cb39acac61b53609c3a399e2ed4436cbb5b83f185dcccea986e5371f030bb0e3a25316026166aa81c8a8a3154b2591c52552f1c30da447a2f8377058202dcd2dabc90976bc9b3a0fd1d782c2d9b3fcd68ee62dd5bcd2813c4d80025337a5dde84223aabeb91a12a52fe38fe7f2e5d689ae07233260783eb1720f652d20789dbdb794dba5c941da246396a4de7cf19fdf481ef78ff59be601f0a220b7e5991b25dcacf8edb5a637105fb139c8d7d04d9e88fe3559cf133aa38725b8a4cb00a491652676ca731513d7e03bca1fa57b648a25f1f7ec079b7a1aeec7598e1c0cd228930df20e2aaf0fb97c8cb8e4567d119d3ac25fee1c0e031575eb1e1e6cbdf7a6dafc444055ab1646ed0e0c63774b222b99e08096a0d6a09689dcf8b80271f0082babf29a6260a9ab5021edec8e6a3c7f915e0b742437e420443def7aa3f9aedbb3089fd0473200c31d7ca20e403d3bdcd40b6e73dd772610cd582a1d07d07500f8c043a1098fb3a120d93ddf836c3775a5997b9842bdfdc78615dc83d7bbe97ec7c1c3d4ec504158ab297b755facbc9ef00caaf5c6a4ac45e9dba22cc5b73350a107e123276b84d96601fed3f2e1af18ffa29517dc9cd046d273428627889fd18ddf6a8ac8901509d53bcb3026c62570a0370505ee1d6baeb689955c4b39bbff2fe875e5b9d3eef2a5f61b570ef043bf8d7b7d8090b37364cf01f7b5fcefb538998eff4fee8699e97fd0c91a62c4960b64e12454eb31fc19b3978baaff0c43bba5132c12c27a8817a3e2ac0bb37a74dbaf602504d61538ebcb03aeb277acc64760bf3e0ca2df55da1bcbd00187953c3cd968a90b74beddfe008f90be48bf959091b68f2ce78c0427705411b23fc2e764957cee78869647b67b61da29c33403df1c075730af2246ad2bbf059c962b84dcaaf2de43237578b2efb92b1f66cd6c29e5f5adc2304a87bc416bd71c53350541d444b768f9ebb50ffe3255001f0fc4fa804731710025f253bc005adf1aba619ef6168a5722b185d5075211abb9b09ed00db760dee50167d39777151d14bf12ae9826ddae793eaf601c8aac2f1603dd3b62fdb91ac326063c999e668d7171c98a91705a6fbd617041517afb93d322a823b06ea31a0d6129b0ff9d060305d6dffdd764d02efc129a666ecaa0f109c4a30209c4bbf2cc2156e984c9663ac4bbd655a4a9678e735cdd555c9b73e34480e7ff2878c5f0c29e6d2524ebdc6b67fbd291c3f8509500460649f3dce066879ef2c2884902790fb1309d3e3ecb6dd42179983bd11dc7c6180f27edf97a1563c385127d43166cedb710db3eb326355d00ac08aee1ae4b2b399f357695a41b25ee6dbca79d973e294a25eb06f5159c44f129e2a4068d1dc1eb8f1512dda907a11b911c85a54800f65d91e5dedb9cf1fe7aa027e3fef4c6de92c73e56f96e368acfb62fb156609c72dcf3fc882f9fb889b15b57840114d3709482805b02614c494e95cbc5e382c61857a1726ffa7a88cd135fb8e7ef8e8f24169aba8a356c0a1cb0bf90b26f0d6ea59bf882f653d7630503054c2e9785b21c83f9c93a33dc13c1cb3e7f3d8fd5f40e0e92af02cc4dc37bd1d49bb87dba6d410523b4031974279d9275920fcf8dd50b72e781161bd8a6f5a5b70b096d94c671a0bad05b3ece99921cc250884eaf550e685e12a6e00f59c8a8259c492973ed998444f5b9797b6c342a49aa808c54ef3dc1a65ae297db972936f7cb88fe731d572f423599630d979142643e263e5a773d30915fc2ed0d785197c6bf6bb86156607b328a58a4bbdbd8bb7eb4a2cca4b9ce799b20c8532751c2e088f3d0846326a69d42db34360f8e0a3c5ac1cc5dfb5ec065d68f2b4e5755f890491ca7e56b65a9e70817e50683241b2079fa9fe7f537f67e4434bd5dbe9b194d6913613143ec838a1ab8b219511124290a1d927944e270325cf7bbb21c3a01fe787364101d87777bfef36cc977e47f787d0c39e604f840834d9f086609a28b6b49ab83155ef32cb6193a9abddcb06a6993cb40a396c1e085f600347c2b7ea619eee2c5bb3eb816d2822c46b47d59f1b639dea69ad6a6fc19b2d5418eb624d5a92f26e550e71da463a9f0eba29510dec09e59977dbb9522c9eacda7a6ce1f07908bba9999b86087987c2c38f2c45f85a8de97716957581746b992239e0c96f6d275e9d07e36713de9a5a3becb94ec5621360f8d248a310075ff378af138703e50329bade76649dea85a90e5f07729a94cc8e4f48296f0a05c36c82e3500e6f46b9b1db46b420c39de4b7d1fb13e89bbe469876ee4b244f3778eec28e65f3a2c2e7b2b311e6f8d365d8988d5822feff28cab30b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8b9e0f2b3a223d82087ffe594d6d7829600273de919a96d0f2452c8716b0e2971dc02a61525f8694b8eba3679238b73ba37383d4718993a0646bfa1c85b7e36df79ae1261ff4ca2ce7b777e45a1a3517acff247e2222ba73f65befb42d94faa88a8c145af5154477f14b5a3cad90858143f159c5008cc5ae69a762298adf36ede7314fe0084538acb9229198e301e0ebb5ef62ece69eca57cd1fc0b905a662c98fa62a30bedbd22ff797add0a167e1e953918b132dd4cfcc8bf7b3ce1cf3002f8917dc4552848c9bc21771fdceb0fbd77dd7618123234b6743fd29dbb18c23b4eff50e38e0409f2a2cfe4bbe734ac85d85b5fc05191402986dc2d4a278956e4fadcc1d641158c05428f7128138c785bccc8c06c59ba5b8988c1c3e5fc92bf40a959662879fc2f4b00a462335ce971e7f7b7553261c798912ed9872328842a1394c84a2af5f1da00fd5dfaa87b37964b7ace8bd7e110aa7c7c65fce19a17c8049488e80d95cea228134b5f05d3f17cdbcba1887fb38279bb6864ec4ec191f1d8181784b135b363978b89358ab9bd8bf0848c1bfcc1934e2de2eaf3f5d2dc23d53bb0f415ee675bac37e5d1e48585a105c9478cd94ace5d1059fc3258f7cf8a197c9bd0ec4658f223053c53101240ca478c11bc6dd8b94462c1243807156080b7f827d94ec85674b703f5fcfecc7f90af2f65f9ba70bab70e474b37b2544a425df406dd0775a5d8719e2316963d53f13708b31a67d7a996ec0b1c4e320dfb25938a4d081e1009672e318779468ba2d5d507d924327919f0b7f76bd45a306cd4fbba5b2a0e945eab386caba321d452a62ce40d1398a7ca5e447329e657987178f006617ca5191dee1676d7a3a566f841c8b82cd9e89bf947c3fbee75125093190d512cb70bc167c29f62ce2c4d82c7279b27c011c3a1e5adb5dd8b5cf64a250c590a0f13be4f38ba4c688f6af4496c396c1ce97cd371499471e890f1a421b94d404192af783fcc4b7996a5753725731782f8b9cda9f82fb9a089c4bff3bda28a2baf48fd97443bfe8f95ed711efe9ccc4d2e1b65f5d67bc49503d8fcfeef5df2300b2f2df07382924451c22579bb55fca85f02e8fcdabf2a2ece3f429204423b39372379dc6d48b350b5c16e18ac78cf212b2655bd8795b21b689039e49820f4e6a0299d74ef23968ffce5c98393395d2833c092039a02861040a9253a0611f40ac89a828c9caa407cf9dc57d8b048d5a07341b8f9061fad1d678bcbe4988db97e9dbdb353e7a8ea5655554b9d7b5992d4983a6db77c5ec95a462354d0db9ca680e13ffd6ac07f75f52462151f914331f89b2dad85cd88d44bf800d4c6aea0fa9c48b7fe25b3ea46ecff43c89e285cbad27ad0ae245c46be7d0b9eb188bdabc3b9b501c4fd13998ff2498aa10cdb52f8e9aa2180b52dd722214560934856cdd413a0844682b450c072341c396fdb1e7232c83311f95461b43d907a6cf2052570cdcae75aec4ebc2d21e111223d0fc4d75df4d53d3bc893baa3fb91ee99b8009d76f49cdaa476894237758fd795f987ec95f88ebafc6e509a9c56c704d1e07772191bb0a9ea2974451471ff1131e8fb0880efec56f6bf6dedcabdc784ca30190db8aaccb5d972ee5227958df1586556fe6c9bb7fbfcc2dba5c2b9c78961327635d147f663cd76a5442dc54e0e1d3930f627c8fb36bd813d59c49a62f5c157c5b9250e58aa02851eea9f6a2fe14857750a558260552d504bb9039d777572fa71f52e88a1841ab10a54b7aebe94046a9a2c7621c4df3b6142fa3a1e2cda6332b927a484fb9578186e5e9f47438f4a2a123e3b7b34c88f5c51739649e5b87c5e0fe8ecd68a6278ce0afce79a7b82010fe7f41d71e73d804601364a3dee89b9b919d51e1b8f3fb696fb9787df427d46e75db528a051fddd1e4c314c3da0ca15e03c16be82a0816fc0840189b0ba45523e7fb1ae5a1c98b384689d8775ac7f675f7f1f4a28368032b30795986ed95033607aa72689c44551243416db292007da123b7700dac53ea18973b24c63e9f8e0331450d672b99d1a9bb7116444c01f46040997d6c720d836e0daa109368db89927d2d6280b22684f581cb129268295b281103746348c288f0e904989ff638892ddca22952fde2cc8cee6dcc4b3601f22e7c27f1f78427c324d57dd56437cb31462909da1a0e1485691a47858c36034ae13a2997b7569d8a81a62494bc56203c57a3c9a6bfa3684aea392df1a537ddaed992814dc81719e95e443a21a85d03f633438d152b2df343acd7c2c570f3b2bfdb0a057c86b3d800c827fc1d4d39a4f6b22f89c3774296da68ba5f37542753eccaf92a8d0742951dc2f4cf4a0d19de7456ad4f7cfeb1a0f6fcf9af6dabaf462b4ecced3d195fe1b2e82bae23af088ed48f9dcbe3704ff614adf382373dc8dd9432c39cdbd48f2730e08be81dcce2179494f98da010b7e6164ddd88f7604b1e813505b6803d9611fb22b86801b986ee8d72a5e6d25dadf9f13e4d7c558e045d6c9ec1f7a607414ed6726d08ac780a2dd5bf5cb03c8bbd896fb0d94aae4925eb2f24ca2783b7a061d9bed376b3724ad6393ed08c817aa5dd9ffbee22f3656d0948d312264976dae5c6b2dd5fe93dec513c13680c5371a6f742957e248ecedd5220472c28c930d2f2d863e52d15af9e1570a88b01c9632dcc7f038c4e264d83997f3694751f808788a7a652b5b00361b7588a0855f6fd123434766ef36128b2aed370199f1b98d62a7e8f75e6471e248cd7ad615d1cf5a0e037d894a007dd467211ed07f0564777b676f88de294c659b5b7ec9dc46f68529f518d85d5c9be6b82ecc73137a7c3a9192258d189ff7efb598d202c501c7606b48c899b5c9aba85aadabc1d67c055d998d2321016823e4dd6c2be473bcde5ad5c7f4264ecad21d7252bc5418e74c99d7db7675aa9b5383dddf1082eb6bbe1efbbd05487ef3a61315eef3933d32ddda3360712724cde070e4ed36349abb3f756881d3dfb7fc71e646277abc197662d1d81b24b70663b347c0e06a2c48fb23fb4ed42716a72c09033b386563a08968c5b55dc9a77c7789896ba14266d3023d388b1811b87d21454a90d8d5853183d3ba3d3d3f8af59167d120ea504acb005d73a8169f59c8c6cae07dd77458f9b28a11a6f08d65acd478c814d0eccd98ca43ba251804df69c446611a42977b6ef9c09cf906329317c0930a6e15832957e8e51f34ddb288408d57a55ccd6e9443cc17a81ad57bbc52928e855214afbf1fbe48138fbb25a71df3a1cb2abe803df77e7f7086ba591ecb7f098b0d96178c161a9ac146fa4666731ceb355c7c48baf392f2f02e3545d448c0237c4b552a6e6cf0cfcf28e130ae50e41a9c491bb05d6baba768677bbc68b682e136c6829fc30c93a93276ca96ab5170e3c41d47031a0c1de7fd5dd6da9730e79ecf095dda3ab815e3a7f451948a098bf915ca849de967d2a11ad8ff0376172e67b065364d3bb28f9ce095fd7f31df4c3e499d6129ac17d3e1a243937503878833ebc0280f781c3ac14164b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe950fc8893ce690c41c30bb1a9846adcef56fe53eeb84398327326ce74b71f9069214cebea7c0677ad4c1c530bb2516bab0ca560779be256a7260acf5d576b9b3118d409387e386ddf67b1f02a03542b092edfb32be734144f947a53916972e39d515f7bf0f4839e721dfbf7814e4a990deaf77cbc2517c38d54e651caf8a34dfe0d59daf186fbe30b578aa59f9add67080011d2b490316ec124cdf0f936282d5d0b3ee9c1c79fe5f6cb5d7a3359f607b62472ea5bdc75008d17e4e608e514be761c2 "); From b14ec766ebb00664d44d67767519402e7b3076df Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 19:45:04 +0200 Subject: [PATCH 13/22] updates changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26b70a801d..206de34099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Include patch to release stuck collator bonds ([polkadot-fellows/runtimes#289](https://github.com/polkadot-fellows/runtimes/pull/289)) - Safeguard pallet-balances against consumer ref underflow ([polkadot-fellows/runtimes#309](https://github.com/polkadot-fellows/runtimes/pull/309)) +- Polkadot Bridge Hub: Unstuck Snowbridge ([polkadot-fellows/runtimes#313](https://github.com/polkadot-fellows/runtimes/pull/313)) ## [1.2.3] 29.04.2024 From 15f2aee0a9ad83f0bbdc397da0db5f032a0b66ba Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Fri, 17 May 2024 20:05:39 +0200 Subject: [PATCH 14/22] Simplify migration script (#10) --- .../src/bridge_to_ethereum_unstuck.rs | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 1252ec00f0..983354064d 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -17,18 +17,14 @@ use crate::{weights::RocksDbWeight, Runtime}; use codec::Decode; use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; +use hex_literal::hex; use snowbridge_core::RingBufferMap; use snowbridge_pallet_ethereum_client::{ - types::{CheckpointUpdate, FinalizedBeaconStateBuffer, SyncCommittee, SyncCommitteePrepared}, + types::{CheckpointUpdate, FinalizedBeaconStateBuffer, SyncCommitteePrepared}, CurrentSyncCommittee, InitialCheckpointRoot, LatestExecutionState, LatestFinalizedBlockRoot, NextSyncCommittee, }; -#[cfg(test)] -use frame_support::assert_ok; -#[cfg(test)] -use snowbridge_beacon_primitives::BlsError; - #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; #[cfg(feature = "try-runtime")] @@ -38,12 +34,11 @@ const LOG_TARGET: &str = "runtime::snowbridge::migration"; /// Last successful imported beacon header const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = - hex_literal::hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); -const NEW_CHECKPOINT_HEADER_ROOT: [u8; 32] = - hex_literal::hex!("84a581291c4a4fe66879c4647a1084ee584ea5c8ac82009aee323a66bf865e82"); + hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); -const NEW_CHECKPOINT: [u8; 25122] = hex_literal::hex!("80c58a00000000009cde110000000000f118ba039276d46ba87cd50790e2547060aa6cd260476bdb499dc38ef834d618910884d25c9608dfe669a39ae64814db99553d82cd7a5bf5808240d2dbef04e6035075425a8cfe9d2bc194fa1ce245681e84909e4159e0c5cc1be7f876ff57d0af821d9b65aecbfd133c02eeecf2d8f64a164474274529f0a0fa9f8ab033cddc183b5dc028ccbc6c27887cbd65da8d4b8d6983ebcf4a910e6e2403b68f52628fb555e3486e21fd446483ed9df35377b07851e0e07803b7af34cc02494fe7a71fb32ec66a1c279dfa9e12b96b4a1e44fd1d3ca5db007ab2b953f6708514bc65ea545ad562b10a900bf3d9b25b5153d552ac07a256fe4f7761a5f9fe130c8e65b8f35ec53499db3a67c630148b7baf1ae8b79c00ed0c5f8f808bcb9e01cdeb963d8a6319e82af0f8a64b1819e2b21ddd3b07b74c8ef2bf01450a4bcb4180795b745f2f11c449223cb5590c155b284ef45ca108dd0c6e2ebeeb1e93bf710e1573e1cf7d2e3ce4c45cd5e5cc6aabfb110fc1c748b6a22677b333aa36d283f3d99eb09577cbd44b3fe69dea5d5651887877aac4f7f7eb0856e272144e187aeb92df3bc4b789b16ccc3b9f014b60b56159692db7f9ec5f2bbf753c0e19a5a22400b614c45da5ee07ff2a4558c2038f3772f2da1772070d65ecf063b908ad751a192cf1aafe980d1b628aff8bb34f7cead01aa4baf5d8be084e112f2cad65561c40a0932cbda6d5d37d6650500f14b7269575e1ac157dae537eab19abb957f40043c71954cde60e164200f453233a8b77fcf8ffe5d95463b486da0e6e873a1a00d3b04aa4f0672ad6b6d03180cc0a089adcf50b7e3688c68b47d1d5812972cfd5952b4197c414bfad6025d8c8f060f16edcf8ba8bb9075672310a1e10745e4e90fbbbc61f2fcecf5399045b103317086f544bef7b5414e373401b13893a7520fe0201de90c58991af476a86d9eec14cfd0baaad4278204b6d822cd32414da207ec86da840cefe31c5cbfa6ceff0546294c296e6aa5683093bf0a69ba502c89e50a6084b899a36f3d60db2dc9ba128210c4e75d76e83799132cbd4fdd9fd17eb704703cea9df391c83d66a2d7ab894cb5a15a575d1e71389b8c57d63ea48017254c02c106c64b3e8aa0c2f33b9af3ebc44e541aca5e69cfae22549ee562eb8e825d81830317e565d04563ed05fb8682f1ff79e0c855990e03a9d18ad8ce8983fc55deb5398b333a26db57d0e690ef6ad56d85512859d9bea389877d01d3fd8ce1a0517c87ca515b12ac524c47439b2c4c00b553f8a9a6831fccd0641f8eb33c0eeba8cb5ed88e035f5bfa079644258f5077483b45589d5cf4b53915bdab34d4030dfa8ad85af76e194db58d453df3411431cbbd8dd19e619ff613cc3cc9e88745bd1b3d24422d3dd4ebd82467bd232600401a39fa3134a2cc099b690158e52694b2141ce2979ee84416d8c89f55c23cfab2804e26fa2f58e96fa9d8e7f7fa8c33022247ca0cd1808fbccfa4f3dc4e70ed62e031598f4776745fee59bf0fd5369246ad97c2f2798e808fccf295ce5f8ad8e7e70268d6667508104ed10beb70a794196a3b7c7e7188e766d9a68d32ba7297f9f916e7e20f5afe0a758dcd16953dd81ed2ef48f4d8bc8190f601dd3da1df6f78ded9ced42b00a310957f65ae029e7e170d106e9593dc2df9b54d9d6692ab68e9d42688304fe8257fdade19bca9d162c83b3bac4b6626979a8fc77f49105f49103d55374bdf18e1638be1d8db2945dce2a9b7ca3c772605f9059f0754a06cd170268ed71a19419ec3c88bacb63bed8086c29322bf2d5ede197f3dc626dc83fcf7d3ad2aa959d28c9f659824abd2e7392a2658f1cda46be4fccca644292573c21ba76cd183817fe7d59641bb39a369f4b43237eb752ee6e0647a94c0cd1ee669010a851f133e7d674bf23e6ba23028bfcf6ead7d960833ddf004e335b83ee062938bf9183c99d97a411ee79b18725de81a5131e8c8f0e5dcac8837d036ed9c85cc02314994d865c8476e63100deeb615722ad6f8110b209ba9eff76fbcbff25b1d83f31e7439c00ba009d8ec4f87d32ed566e7f516e7dd48d085808641df325942b46d98b616d8bf622147f24e180a6be27fb74e042439e19ab3c73f833439a86dbbcd4e0ac43db4b891b67155ddb007d2475fbb070e847fa254273b63d0bad326ba60dd8c0849725be0496d270c2cb30804da546d94b3071e6de53a2ccd167acaa2439920e9c77e475fc120a12d91be2176a87f6c7f57061fba362e5c38ebd01f01c659c3631bccfd6973d68beecc3b363ba5ea9fe3918cc7629672fda8922852fdae18a99ca7536861c73a6f241440fb9116ffb3c9144d649d00255a4f15b1f6afa5c88e59885eae06fa271e0e1ab7b5a1b4ce2827d3e2cb309ae2d58e98a926d2ed525a8e8e1d4bb55f621eb6f688ba7184688819bc8aa9e95b114b78584247ab2f7e8c217ca0de8e219646f9c0184d03f292bb3138feebdd38de30ba4951cb1665a81994db24b5105ddd683075f6cf5f884ce7ee6525dcb09e04903424d7b8610a4be604a89d099d71d038091eca1a6317291e4fdbd84837621ae37182bb9eedc4182c1b3e3af35491cfa701ae2f55522c2042e7d8a93a54c2f505b62a748e1377789780f6fd9c54981e93f76b65a7c0010ce6f84bf03154c2d75b1da316b9dc62a2f62736944cb935f2f985da9f6fac23ea4d578136a1b3cd1ad29818cd02e9a72da1779f07c7a9f88b4e9fef6ae1db26de2946ba6edaa1b43fcb1c7e10ad49b9d84d060c6ffe0ee4f2fdcc34d27601a6bb3fc326b7dd600aed38ebdb605282d7346c990194aa7bc8775a1dd5f64c61abe8b375d61223917fc8427e659d431a27391ea0df523a25e96210e17ca85cf5a4f5f6fb6b5c4473b4b92c62609bf31e8bf8402e391e3a7ae63d4aff55a17ac1d97620b97983e3ca421a81ab97f811921df29e09948dddb325945e3a7c53fd68c9c9633321afd3873ce4ebb4a6856b4a4caf2e57a2e2532a20bd768404e84d2b2044b22f9b2e8f76946029db8b84290f6ed94df22c8596dd9c6bce3cdaadb43bc90d1f263e64bc00863fa218495994cd4b42025b22d257d3ab275ca382ee10231e8850ada2b50d0fd507b34c0b74b13d1794ea68c1d594d221ef84f9557bb43495f9652e3fdee490cd327116aba0bde4812a95c47955ea446dd6548aac044e14798beccee03b10a59ea6d9a5a2bf6e6bba2f2130128a29ead57203869d1fff9467d835cf8e7ad3f3d2fc077dfe11769982b2fa5e94379c3a2087edf3bc587d27987811204505bd74d8ef13acbec609ae24793f5a2b101eca199dcfaa4531a987b6524018fbe4c9ffc95985096a67bb041c37056498dc3733b5be3d6d03a001b418ab4c0ef72c609ff263136e14c16e9ffcc8a2c6ab4b3b1bb730feec0a1ae7c15fed5509ddef0e00b8de4dcfdb93be4e6ac902462ae732c20a79209499b9b87870e0476d016889a60ed361c5353020a3ec98e34e63b9f3182ac02fe66da7efbb1a3895c727cdca56fd43edd20bff709ce5f86fe5f9c880c11ec739b9485c0132efeca6f6014be637028ec04a36b57345d5680ca76837e1aa7f14999c928578daf668cea7358c4110d88abfbe25380352feba160638608ae27c8336fc4fccccf4eb0abe8942f11a77c6a39786aa8287ecff1af4732e63c834f325d0719e5870914a7ee8cd22592c42b6bbe86ece668f7b75ab921fb30979ea979d9a67dc6cd4b3ae2cb3751b35f51c7c8fcd75505d656d10fd54bb1afa2d24afe1502740275589f07b5371914d703690da14b54285e8943f0e6c532a977f5fc3c1564048b19d731cba84f69c076a823353ce020094fb46c5784c2098313f99c96c539258b59630de96d217795318faa7bbdc52aa37525c7091c8574c4a9a03b5cbf80963facc40ea68ec48cc24f71f3337c8f7871aea9a18aed2b1664c9c5f5af76dec55f74bb441abc21da357de621473325018aecc06917aff025087275ca4f964b8cd945c7c41964fea49386cb3ed22036e0474cc2def65a6a380f9a120e5560722b942f5b88369817d0a965d6482ab324b7af23bbf854a41fc2510c2898712f6177f9990a2587a2fc9d2cc0b7ff3c07b5ed0ea20c24bbaf58d5a29ab1c64f42e8d94ba4400c65a90a6ea0a7d2623dca1b2e4f74a4374faef87e0a77b09a1b45558a9b81b9402b933317fce57824dca4b911f066892672e667f37ad0a750e09802784f2a0f6ca3a675b5f6a6e76e96ed60a36cb09046b39975f8575adf33e2b0ec9eea1cc61ec6364a0ebae32e9902129aa3b174c0332bd338a33dd91cd8159b47b10883b32a4ba60759c14f12b8741582bce5cfa0f7d86743e0da364170d9677cf448d7fa3590256ea01dcf11905726b88b15056236d8b65ea63039efd66b7fb4f168e6ff46fc5f7d7dc734d2d406153340788216a5df6ec9fa169ac78540cedd4fd9a00382798ed054223ebbac19c32a0e02b9a27c5db531e507c1855fcb354bea4e484bb30bef99bcd63be47e4d3d4a4e0249f41588a18519584d6086e0b2039b5d14130a4b6aa53a088e98ac24da38b83b8f1801b612370c71613612bae8e5f1ec6e07260fa081bacbefc947bd612ab85eafe775db1aac43fd4abefc58d49aacb57307b29ac2ba517af4e7b26d6a836338d6c8941db0bbb9ea279d33bdb9632be5ffd687acd2b9003040d346aa947425b475d04333b54958b6f4600f7d7456050f160e2a078302e7011c634abff5e0dc08880d5cf6ec705f94951273125ee1886396fd14df2ebb8f39e6171876ad7eb0797e97facf88217ecb60eda8fb336efd13715928f1311606187e38e0d7a4cc94d9a1a0c36aca43f3a98440724e8704b935fb52a0d9aeb1b8861c6a7c4535af798f2d46a769f897bceceaf1f5fb55986a40567a8d13731b4274787ac1995b77d08d780fe788b45ac80dc136504f7e1f8a96f55add4bc347ebcadac13dc5f43436192b7ef765a23dd8a82083dafd346a8ed35890a855a0856abe09f943f27d2ae609efb77499ed7fbac5f5d6ebb58bc1aa061fe70397143434f1b318e3d9aa8f5daa5543f7af91f534d2193d7a09097c373ebbcd9982c24bb1ef2c3b6125466ed13ecf5776c032a3bdd2a77107d6a1323fed662ee74a8650bcf27ba22e9c5172c069b0db13a03a0aa7e689a0c6cccd03b894348e2b88a577921a1934a3888a13c4219057df4393158c7202ed74ba8ccce6491af1b143758cc25e4261cac346a38761c0a6a24f275e1fbb117e9fe566a555e86ec79072ab3e3c17471bd6fd429af98b00b8abe4cbb397660351dcdd941bd3c8b6f77ba9a6f7bfce57d1820273a8000b9a9cc23fb8536bdac8a3f780f0ad86964828ea9be5595640b4a7a6c14427d7cde445d1fa4985a032beaaa5ad2d47bf2a536f25fd855247c5e229f5084f4d3edce308fc0e3e92c00ce3ea6b6c81381cab6d769c81410b76120343202a0fe78b083c4b3da0a5a16d4169cbe2f18fd611cff69d75673dbb01dc2e288335644825e3297a6b94ef4407036fc2c15109ac307d8c83ab4d8029afd1213fc4c2df73da3eb545c6c55cdc003bbf6bd302c8a792263c2ffb1acff931957e761bd98ada159b91c5db7db9cc5708843bb0ff18b82d85d51f9227de4a5292d4cad152bee03e97007f40dff61b9f326121e4d533322a8a04cc5421aa4fbc8256bd21c37943bc25be49e8ada61e5f240c754dae5fb242b5f4e101317143d0f7da29a42dc81dac6987517ff085cc9b2eaf258fc97aba502d83e38247f5ed56a7eaacc68f850b3541a435304344f3b466925cdc531d54ea55988271c18f993ff6ac2f02a4c1f1aeedda7c20082dd5a7c2291e1ee60a449a6b8f66f2938af7b48a2ba01b453cc2d98baa4bb2449139c3cd4436daae2c1f637c8f7fee6e3897534250f313ddd3417bc92b0129c347c648d7773c79655b4aec68623b2924aee7da53e8ba56772cd6520a5c6d78b553627f3de75b056bc618ecb17a94b4d6b60a7164b024a693e526bb32e97f612b92e6a798b10b774f3cc7886a3bf419c0562801baa67fb28b3c02909bca1d542cd6da0f359d6a89aa73760b8d3642e3e688294ccf604369978ae4c9b220a9661205ba7a1fec3e96e2e10d73af9af284d7218dc9c249c6fd5f339ceb3380cea7f5b9ca305c04d9f0322c827bfd5ff8704d9a0b95c10ef7a4e3a332ac2e227beab26f367fd5a61ecdc228c73455890e935d949dfaa52ca8e65dfd5be9d73c4be0f8d2c0666c688de7e98de4f567627d3aedee8eb7fc75c4ab573e3fbdc7adf0d934a25d5312c8ff2cebb7959177aa440fb3a7cc8f4b85dbda4c65524df016c7e77ef90b11038e6da568d6c04bec1d53740d8d0e669d7a7f9ac3e979e816194cbdc54ae7fdee3d793a0006d415e048fe4e0f3f69c04bde7bf192686e53f7783fe7caaeee6019ceec793e54f3d0ec024e9feae6f643b8826dee65647b9f53a51509d36464685f44e1964eafb98b825d53ee3a8e9f85894ad6097a5cefe8daf6931ea7033400c7808d6be6cbbd244a6a694ec9bb3602a1bffaeeb3ac266ee3dafb4a0b8af48486c8c682e70597d5952e78a5fb01137dde04b8dc0af662de6b8a33a890f40e3c68c1c49dba60fa5e7e9d8d1414a36b0394acb7549bdd405732d118ce9e18899f897ada4be16a73a5d2f8e83b36d1370e0d71a3f0b1ab6e956ae959fd878374a31d52c8f6a5a30442652760c9de032cd6e1f621cd557b802777f290fa716771bd240f23217c2993a56aff4205f5b233e4403d73c719b6c483c0ee81c51056125793efd502e3b7be54138357335f7ed5370be3baf470ed7287a0da23815690ccd6d59c55ae1b272d46d2d57d7186e8b2550350b023b09cf34947fa86f24ca0b8b71a3ae3933cf8aa43afc46d87de82b57b3fa83e09e87ac43e362625ffddc02d4bf35f1514f755ebae9aea374dc7720319d4f80d4c9609d0970f16ab5b6ab96d10040777e2ba8dcac635a9358e636fe84a4c9794ee9f7c9e6b4682a4c9ec5b2a594071eb34a5c581d1288678dac0b525b459f96f377ba56a1eb1ae9275d70d33c3d4741e66144ea92f880fb154ce6d5dd8fc74fba41d12e9d66c859a8cb892df9a8d9398a80fd1a746ed19cda457c58fac722259a67573b7add86ce157cb3fd1e01c077e93a1560b2ff3c79c4cca88100a4cbd6e0a40fa3631d1de6e035bc197ab7573f10eddcca678433f231dd23ec2fe50652473af6133bc8c1033953baea90012e2878afa07e842f8b47a328ca9df0d21b58ace0fa8e7e501a5b03313764c81e2786e9489fdfe741521bd4fe299548e89bab19e8847ab274d0273f70f52e71e9003d42a7276521750e5c0792ee01cea2be884920f52075dcd02e9e25c8307dd499764fc029717c2ae5178607d17a730978a8896b6bb3b97b47cac98aba15ab24e1bfbefc5a2f8e2ac0c4eef44b26917de5e7d8b7330fca531689569fbe31003b760c6f4bf17460eb51d21c11b4cb8ac3bb28ba7e0c16d35104d92b1738e84b31cd27408d095984d8d0b20e0386e4e4670f34d0e8a0314500df98a568303486dac06ee4c6b14e1747062c34af8ae21b715a30e4654806717a334660155b8ef0d713e7cd2d0ab0386016b90eaaf8468e75bdedb81aa9f3467a86e012916afc5ed65ee4542016b22a6926c58962decf0319b73397e000a8ac83245564e5ba5adae8e0c76eb64bc4a82e05f9b376185aa44aa9ae831f3b2338badaff0436c57c38e9f3242aa9c9f7c00807a9ac8a97ed812c5ca69767766f87ab3711cfd478f6f60f9218c32a1c5d9d7b5bac1c1093b399c46f3270e26f035fee1e5b2c9680298b570a2db6fc8f2ed1c5b9eb65c8b915378db43893c9f4ad7026c4867f04e286d26c70e52fbfbd0420c4fddc0179675d2b2a5b7a7a3bc325967566662192b93e1fbec87f90e4861809e84e5a691bb1aed7b03797036c668fd07aea5d5586d1ed72df9fce56a6c599bff50a70086e689fe0d102e078358e4ebcf70746e7b86ba97ef46eda5927fcc5bd63564794ba207b1d85a2b38ec7a93e84768962ac23cadd9e4d66daf8f9772ffdf311a1d28fcd2187b8a5f83b03c64dc49660f630303ca5d8e37e4169dfdbddf490dd8f226b29774d95082314ff6112ae77869e72886c7a93bee730897b7d38ceb673d4030283a248b66c62c9554e3236655486c214baed7631a301fe780d283adb6fede12e43e848f81f16b36f97149263fa6bf54484c201f51665e2532f6b29d4037a19bb798d5d73aba460e78794afd7f3dc2efe998eacc597a27ae8c7d0378a6aa42dbbd2606b9a9f0045adc22ca004ac27a7e0b87d282c2102797566e215a456cd34e754c67258a067db1a6af16ee8dd50a863da3939ea8f26e89c5e87c3a35dfbe08a98c0f2a45b297609ae574173d9cd07955814ba24fd0810b686a6a6487a34bdadb76cbe8d7a100e29eb66a4d2ab72df6738d15092f519d8cd1ff5724e359d2cebc2ace815c4c11012aefe433e176b394315c6ff6b31d745b65de56fd842c78de07a1b22652fcd11a340caaf56626a999625d32d762c81e097f4d548d94eb075849beeed2d57c40ff9a545371ce9bd9f42caea334101a01afb0a73bfce8fa0c6ba88e9c159f8009701773f2b9d79f48bb793c04fedf8278efc1a54c1f77a1f8ac4e83e784054e76160e05af8b06e565a5eef9b06e5623f5c0dca6f2c741de8e71241d94055e0115056200cc5a5de25c4cc3a7507e3b153bddcd89bbd9faa0e13c30c6aa4f3b8b28e7436b0564625c15e7425ca2e1dfcdab8a721d5a01314e23358e991ae4eaee313c8efe723b19a22ea8f857667afd92267cca94bc82d6bd73f4a935c2f32d79dbff17f9e54b463911d81d80b3c9d98d45e7a93c3b6198ea8b8223f2223950196950dcd4f5f4d81423d61c682c040b2748e57dd3e51b207b4bb1658fa013f1f6ffcffb5a3df119753e65619a5dca4e507f510360721e37654b76771814fba673e1c8ef24ebcf91f2f7d08db30da1a1b0bf3300a66d992072f15daddfb5d08a08942f14e854dc29c3029f6c27968118aa2d23b528148a6e70f2438faacb3c4ce494dbeef03508206826ca8b0bada57796f4a4cace53a1339b41331dae0c6cd3f620ec58d04dfdb03d0710da8cbc876ba222b16ede82ec4f8839d42d8d92f4e67f804baf44790c00918f7e231d6b79016cccdb2efeb7858e1e9e4a1eaa67ce4bb608790b09894b06bd0803684ef706c0ccdea713ea7ee376d9d6c9f676efecc91ea317cccfebfe465edf03278410fb011e5fbf8d50192e98bc0f65aa4a8615e44660d3e047e2703d60f7a6d08d468611fc0b1a0f16d3293842c80a3fa7de450ef0ae47a084763780da1d7e9755b80fbb07ec7304d1c19a7f6dd3c2878ecbeb46706d9939922b92b3390dd918a11eedccee7188a65503c983b8804acec6bced9dfccde579891a1a884a4000adb864d8f9be54657d653713184a81225a83f314b07e32fad554ae49697d5cd9927761fb78eae1e8571efffc50072b44a3d229e07cd8cc57751a33537e66ddd2e4950793b39d471821a8bb26943e0307d924e82d3adb7fb04dfbbc1b1b832643d84362f465a8ba7bb8543ab793caea761c9986b845aa2ae3d99604185bc12c25019d5a981812348c662cae1795aacd0eea8609ea2dfaa0e772e9aea92d2d654305ab6a0068ad1475fe14f733483b03e768562e563739a412f4d3eff2ae6c19883681e3b22432943b32d9ebc6941674deb3920c52624605ad196bf1f8146689872672ddba241100425d7b73d8ce99f141de338f94e3e6e1a9bd8d6ccc8dc87e585ea8120121308ab58517549e87e8d9e358f7c653af923c2b56a0ab756afa52c2fc5b1133407ff0d088914f04adde7d8b9a840156135b5991dff05165e34974d92702d93d7027d56a6fe2a9004c05446ccb7283f2994cc064cbe6850dc82c9865738e9ee7bd205a50ae83128f007bb1b6e5f330fdb634e823fbb09c279609e9819df52bfd3214635c80c4fcfd47672cd7dcb05a7ffe0bb71867e7061764cb68fed668b00335d6d011be76c3545c4ffb3d54810fae5c498a29ead7fbf6d0c4e707308ad95103f9b9bcfd3e3a66c8cc66e506a650a9a2f55de7724254943e076a0aae77969219f0df9f7781278b9a7cf9960fb6ec69d05e819b3b448910a59f1eb3307135b469dce550594709cd9bd7e2ae8defb1526dba97db70b04c2d361f468a3193fd57d0fd328117d05bbbfed2a6d3ae4a555c332dc38fd74daaa6a8b3b55624836e41d8aad26be0982de48a98f93153b27ccb597b8f68f798789a9d46d84cb72ef3cebc064e428613757eb75c86f535b3dfb13f7abb8bd9216e70f04c67da84b6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651584b9a04a9fd73cde3a56904b09f6ae9f6a4bdcb0bab6c1e5b8e7e0eb5c8bc1d130cea0f4a6be6e364a28021fa476893e87e779022b6cf983dcb394fa936a2245cedf379642716df1a932d899e56a9d42ac668e783a910fa39284ec7ab00f08918acf9119f9e964cfea71404064417aa574c0416acfdbadca8ba43895bfff699cedc1603f781b4b7c353724019562a947afc7e7c30ffe6d9857346aaee04143e19d8429e486003243387444b718ddf52bf372f542a95e1280c4a54299d13e3879b8e479925aaa84368b47a69f9c1fe7598f0d0f5fa405ef3829299e970a8822e1885aa33e7eb400d538d335ab97b746bca8da82350e3d52a9833f010d9b998af92b54a67f6d906d12fdf22d64db5902452071bfc8fa65fa010d2a8ec2a1b8f3f38fe4c37fc95cdc46a8ccb9743534278d225a5ce233a15d503158e1db6e9d016db93b240aba04afdd7ed2f8f909f32d478b149569b768c13c4f9f7bc14fd5da12bec4692dd6119bb35693bc0ba09cca16c496164bf598d24e5fa641ca59d4b283a60b2a3d30f365014f6c8d79f0b3d878a5cff8f0ef98e48b5864c9e0a450fcc3467e19a3761ff916ff1e2a89f61bb73080cab649a91ad197fa3c3b17c6859b57f49a845fadf994fd36f575724226e32866725d8f641bbf052bcb41c96c6b7dfbb13324b10a801ae1314373b77b6cfc61580c46bfaef27b0b0446801d054be7f1e33266bbc267c09c6aba0c3b81ad54da83c0b627503d9462b75249569c8b97b6da662c18e2269b37ae6eb3e07e995d92466a990b3f8856bbe83a478a7f8725b49285b479e1cb89335af647463a4892216851668daeaadaffb0bb37d8dd651c509c3743274eaf7a2a51a0e1777fd21ef8a1555f625d5f21823aaf317e36369bd5c4976ff3c848256df750c421c9145f64a59a62218ae70d4684935b63ac3ff6f4a96aeb2910993aa02dffa434ee1ce52cc899089eac0c142a6d2ff99cec8107649c42b61a32e9e4b0541635191007ba47803c1c351ff2302104f39c4d5dd1614175cef07ca15cbd0a774dfbb79e897bcce54c4f49124d0abb171159eed866101f8bc4782c167ad4332e04d659c071fc7cfa8530854f8e6e93f21bc8152e672ee134b93e64eebe550f35e53691d1ea6993ad2158006191f1e2973efc194ca0ab66fc174758f0226dc531fb265a560e5e38a4225c01b2bc362af73af9cf446491578ecfd176663c471c60a613ad7a119659ee68c43a5a08cc7c737c58447668644f2444fdd978bda86c60bbfabd0098e7d29746440da19e9ec5c8cba161f299fb9a5a83ffe05ef8433746c7eb6e174b4f245bdd63973c76c73befd9b7230fc8f115813e6651f1cc7445c5622af346dacd00bd0d6d47f204caa07f54d4c8c3a6a1ffccf161038bb7e2184821427e2bc8fe3c8cfddd731c8d98b4e6386d70a6d9040a8a4993061e72773d1a82dadc8c9e0d0927d990916ecc59118eacb586294277fc8f63de585929d522e13f8e27331a96499ff0f1daa43e30176853767fa3362209f69dd13004e6e6f7e898182dcbd2c1cea23b682caf8d9139d4f0baa12592284c3569031f77d4cb3df039991d2d032f5fc61b035a0eb2f70f7cf1177be908cb8eaea47baccaa254a1533cf91f52c586e5648d1271cefe9633f39cdfce209e09530056123ddafaae6c8cf7cdc4a5ee592ba291292adaff17a97ed3de2ee575af0ed4b4705c90b30f42902f7f5591aebc1e5e9a25b103c16aadbae2682df90eddca8610025bcd0254fc55833850ce6b1121defec4a9e502ec46af0293dd87f90fabe7e8eb0d758cf4a6c2c6b4ea6bd2183ba734471c82f41105179d222f34b40dc1df7d4370be2d0b1c985ced4311a85479e7d5b520fad7ad6a30fdf272f3c6140487ce28a9b490c65e3976f35e51d1e5d3147a1fc418c8fb9b98dbb032af3193f1196689423632d92fa81302e998faa9b9964d0a92a7159bfb362749ae88dfcdbb7e3b87ea009a4fa76880b817aa55df06b1d2327b01c387a0b926d8ba31a32a3696402c64e0a02efbfc32af918129a4e2184833c3a763c9681092db63fa29ff811de4fb7f34211d7a05c5d46a890e5e058b18522565e89649c9e397b3c4a2a35065fc996469416425e3e59cf69fb886b9f89785c9c4bdd8c4c224bb826c0c2fe2928a66d78432d240c1aadee7acc061727d3ca44db2ba819cd401cb9404751d1f48f23184f3aca22245791be2ffe23c25a811adae614effe498d6f0c5cb0d2cdc6714b3f23a1c7858ffd43dc1d1be0f760cf28d2d3e64d6310854d6d54471d71e8a8d7f77f3098378ba1e5122eabbe0cb9d224ed4904429b2b275f5bdc45bd8eb71f9d243e5b7e55161ff23e35434e83cb38c3873c037f255995350869d8c06ddb813aef18bdafd7a280d92f25b5719a242000ebf0a89ca4589894f6aaf04e0288534f83560c53c82e472ae8ce54c5dd9812a6964174192b857f8144a77af9c6a86d4d301212ea8137352c14a002fbfcfa6c56d4df69fc9c235ae58b7fb11df3bfc2f087a051095beb722f58d1d1c6b644f989ebaf4bdf648b8addcc90ce1d8d080acd5ca2e6499bdac856177d8b121b77e7998ed394b47a5e6badbedb0e63207d84190b721b7a40037df1bcf45bfee6c953aa2dd319498200365a5518ef7815c71bdc88c1d8c317d9c1174c401cec7eef84e49fd2e13b60210d58cece2b3ef17b0fc0253c68c125cc18e028311623ba3f0ed6126e71e0af814fb5137bd5653b6fd923ce03df31addb6728df0932d710f876b87e4ec88b05fc406b2cb5ebf3a7097068a0a3edf583d44f7a52e042fecb083bc6bf8927b503fe23134d1fca2d7238e894606860ac772a3d371643acac90dd864107a046dcace6e1089135612040ed33ca50ccd15358813ea65077abf2da58b84891ecebd6856ec6da84e1aa05007db848d95b27246565d7fa46b2f4515fa38c33b0c190b343ac27e18779082eed3a54eb129c4e889f52779cfebf26b915227724e16bad10f4a2037128bc44c341f90418332f8037c34cf4e781a01bb9421922b747ac89ab2a8a3378709ed1c401e8445c2272d26ebd9b585127fb57d5d183e52b2e17861336cf9e10e34073a97a4880794a507bdc3c9dc553735787357eb8f726cd7ac0b56559fdbb1e3758ac97fda1c37419da24450c62eb6dad5e479608bbd4ed4296c6ebf812b6a57c379c796a5a6baa3045f715c0a7894427d314ef37f454c83cc888b165aca2a3eae11a768834b6b358bd399fed1dd302fd79ebf951527a448669c516cc2d0f63f7f968d138c3af179d42f02d3c0f627eb7dae2f4489baec3626c85116dc23072b4d9c59f35564137816b4ff91fa4988cca72f0583ccf80a5ce91edb8642758f49118ddd7cb598f92cde96e8cc7873c34c1d50988346307c7ad359a5fb1e2a8f21b54fc1f800d83a5db56f7d3c459500429346de68a1a049a610c86dcc5a7dd737a0b1525791d8712d4de313bf3e68fca59a38a43145074bd0235a4e599da5f58197d353bfa8c9432c709eb3a6a8b533930531b16388e0d9df67c46dd2199188be257c065c55091a1006ee6f8f93677f3f9ba7a7e0989b993fdd53a97b92b7a33d4ab0cda47ed4a26bb9e6f0ce3ce05f9cc563231e020fb655e76ac7276febba742c99f5928f17c2f5788f0f9bb4c3021dfcbe7b86cd1396aac2828455064d7cd2c56cab823e2e1b56e6f41db25ace49d092eddbb0913c13f9c8783bf986e7de6fc5f2db09ca04c6837730c7ecaed255c6147b6974a29fdd2e3b7140e3397fee402c9d478d879aeabb03f0f3362f5b5a2ee4d8b92aa97a0dc8c8465d0375d8e0eb3db05589a86dea8ee32ba2b040048f0ec7ed391691a1cf93c439737fee4445fc2750378f3c3dcef47310dee2ec95558e2fdcd69fbe4eed7fb4f804970c4afb7ea2f54486a6122bb870abac18656546f92efc00660503ed2ed25be1b43275cb454bf1cefe62865830ae736357dee7eb125ac93a308a7144662371d634c3ec003aca83647443cac5f8e8a324d2a8ff69722da02fdaf0f1ddcfbf836411cd5994f0c8f816fc8e5a738d6778d4afadbefd3eb830ca2168a1cd941d037f8f0889dcdbc7321b131c7bd6d6dedbef81e9162b8a6028696391a5f4d40d52e8bde21fc8f4df1396b58d6c9d125cf676a93029994d13255f14b6f7ef90fd6aab2e8d0e8297cb53d7faad0e361be240b127d5d275fb84759ab13a7ad8be346518eb425d471b2600b78fbe5218878aa6997cdee9baa4eb483c7d979162ab1418ba5d4de7c2609837607bfd9e24ba0aedecd13d0253aa10c91fa13cce0ea826bd9c4964e416f9d0ce064e8abe60dfdee2845d2c393196cc17f7f5cafcd2fe059b217ff9b97ee17b779401e701c971a99a378635cb6fa1389d6aa5ae5027d924743a3a4c68919efb780e4bae0b725df4e1b1d4f9a5c3efee2beecb428d4ea0b1232e073350c30d86ca6197b5d079bf1c9d0fcb1e705d2b54951027000245ba068b7c6d9af593e8ef64834d47489a673df93960b90c54ba259150e989c941fef9de78403bd7e8e6961811c5e824f43cf71e6a48ecb0c65f14d168fcab6eca03d7ce316f8b3a40c0cf4a5baab0ca4d339aef0b5d027c75daa258941cd6f6ad7260c1bc5c1ffc463b0be9a40ac7f96f90d269b60c8c583e624e0c11aa951a4542df0684fa5c699a5416067d5e2e26d9e28b90bc50b6f9ad2365f31cab40ec0e58d824e047914b97cab112ac35b49ec606d981c0c3083e013be7fdcaa80a2686bda1c58386aee9507801aec128641ac6c2fb6346aeef8ac2e86e122621b7e95131dbb576d6975ff0c12bd7990c3c94a19eb85efe8b682bb526e5ab6645767b9fc86cfe92101773fa7348076ec58c1991cb182a949b52178a353299114d4c20e389d4dee383d6750cad56fe52591635a8dc94af1208782bda71108f03d9a14a41310c4dae567c7dcb22f1f42c6475319cea9701834164fbe9418a9eb575b516e5c64b3ec3952fa51ba06685f0d79378e8e5e8c0b61c662f0dd48b1a9ad44ca7f94bca32ab8affc2d7f1f48301a491d0d61fb47a59e14cb84688f5d6b6a68052d4850d1490da9a0e764565c4c57f06ca7e23341dddf122499ac666eb2c9fb4cc9190ef9c7cfd595f49a12b383706b7b1424d77102738eaf01ed34326776776f3d69ca39b73ee4706e7bef37ab288554bb51e9050fd7d86540db0b550f463a17485483d5932a3962ba3be881298d314d25ff8716e670d2938f6cdb250fc4a05ee338c0977900498d1fe2b194b1e47b6b674ec87f43ca2d4dc70103395ed85b20574c5fe4c62c4fe092262cb3b06ec0fa3fb7eede7f0c9e7461835c73160998b03c3249eb465667b1363875db308e837ec4843a20773df183663ca92b1af0dbf790cf3d3ba94c95668fe939eaf2cba82006755730e94e86f3ef600bba835371552ec4258cd64920bc19e6618bbdfde8c600bfb842c054040fc9792403147d48ada0fad576b0535312225418dcb0c82334a3f14dcfbbc9fde1200e3ab2d7f3e3a993182af99213c0e00b4e4dd3581bdaced70e7116a7916e62bcf0a78668112d43d23291aa30b3acb4bab4d4bda8d2824192bffc4f7eaa5b8aa056f178b6ddeaedb7e38af6197ec370691a6e6819e6b4080aa8f51e412d504656ee70b782995848b1e7e5df415e86a646ce2c86fc126a21fc4b00d3f4927700c53615b79a72da6124854014aa16f6f8e05e316003bf4542bda9a03705c456d22c668f9d5f8cda0231785bac0986001de9d41aeb2b8b21f4996483d7bf61dac2618a42c329fd514eec5c80de4604269cd1f1f74cffba98acd54dbbacf938dd42c9564b145c5dcf21f8aaed19d238f2ee3519489898ad2bb00f235bfb6b34ed913871fc1ee5af2a832b01ad5be44ada3b1d53df21ea0145611688e1ecfc4579f5cd951a04aa8a5a1865b93fddff38aa6bd6f67b43680efa558192feb644672003e95ff12e9d7616108f4bebdccd422e0a46d4275ffbff3a7bba3b9ca3cf10a4202f71e0a24fb98874ea983b7e98de2dc70d3802fe2f9ac074335b1c002f429ed56645d532d8436cd9d068100d536416fd2b48796dd5bfea7048362d70ad1217f17090d388bcad7f7758079e1d0ec27442731e9ca09c5a9033860039617da07628933dd0dd5c8c98956ff072840ff2128749d747c70db6ece43f1a54d239eebac6b380b71437307bb78741da5f310bb10431164010b0729b55c1686427dfd6ce56e5a24c38d4c64f81f3b2ef7dda5a0e524e6302f2577af7bdc9f898ba5930528bb3380b8b57e60ab77ac5e6df651a89a7ce535fc5f615aa057624745d1be6611c591fa3c4ab2f6c235904063f7df82c374fede0ab2cfb983f4a63455889234e41716baebd9fa6d797ee58fa56bdb5b02e50594e1cf0c43744a26e0ccd230545d79656e6ee161f4a27b3acc65e472f89281f4c12bfe8f3c412fd5abc2c6593b6b8ac71c17dbaf42e639dd4b869792418fded79484e56b758531293cab094cf0895c922f57780ac7a27c7e92d6a8c1b859833ab9753b745bfb17c3e84430db225ad04abb9fd5fe5ab337773c3226c2934809fef9b2d9a6e981042508330551f0e7a248e1e546c42d79449ed43fbef745aae18f3d9745cb1d95669c521c1e1375a161209918ea32cb8cabee764637e7071f3b0d0fffab98672ea5bc3ff0e2418db5a76bb7aa28bc5095c487d12c42be09c7ec7c8030b54826af316d3782353d709c62b16d65e65af2d1f17a2655e46674a0bf82f38f2f53bfb8add3b43bd66041a346c9cb65e8d73d53d077c0fee758215942aea0af363b33f562b0614a186afa1cc5479fb797bff0957b49d1b5ca904307568d147e598869d72d9e9516cbebf153b427511c0b10c9792c62be54c51af4bf6a6fd90403aedbb67669e5f47ee010c2369d716774be289391ea80e07d756ba2669a6825ab425430cb9ca3ac1921997db50c424d7a6b9b829dbb3a4a13de16227ad16d62f820bcedd88aba5368bf9fc4f6206f186572898c0fe88509d87ec32f18108490f7404d856448393ae8440668b090146419e3b93008568800432213455cad46c504d51906674c602f1ef66d5a4caf76ec1ca319a80eddc66f438cc7aee775120210515b19107a01777e10cf23a7915bf2ec11f9e3d3defa70b77291670c5cb99d46bd5d89ba4a7019297cecb1014e78882ce25822dad5fa6b9671431bbf83539e7bf1537ce0b152a3e618c0b1285ce2955531e28c508b561b2e11757ad4c71e86e4f56b2f24d65acc5acacc3601f3d69d5622867eeb72d39c6b9860df450096f5fab66693662ca3e6e36d9e0ce8c486856243a9249c155dc6be52f09415d848af3444603e3e3e94e39b188641df7f548265c9f2b0741f275eb2210cbfa22d522b9cf1bd89424a644b97d1471a175cc7dc1a26a0f180dbf97316b8344a48d2063bafda91af0826a37b8e97c64317fefe2ad1c8bf7e80b78981ac14589c11daba097540122105e6e9a99554343f50ca6b9e6ab4a3ad3f005b5ec04c421e84e69feff6003c1e8492024595e31483ae9117cdaafc8b7db08d732618594c92ddcd2a0c84104291dc5e997ed9b4a149d99522ab2245bf225d848d790824e4630899e3e1dfe6f12e4afec92a1952fcc0d3a5ac8b02ef1c98b4735e4e478d34e0837779dbc3c32c7806e3922561605117e632eee86e250f64033a51b27d2e6fb36f9bea0dfa9931a0f76e4c98f142bedd160653a9b1072b258dcd9d5f86cf1c76f14afd79eef7e17709cbf259f94b7fd0cbd136d0ed5c5482fedbfecd845c0dc52b2fa674d51f26826b538ea62dfa20b4d8a41bd26c0b056b34eb1753281910cdc1c149c14da6cfa5d062fde59dde7f29c1a6a72ff8670e4ff6a7260f836ed9527fb64e8b0e925b0c83269fe58b07b5950bdf8cd209f5939713c5e24ef439b2020131c1fa10af61c4afcc81d49909d0a37441b9861bcf4babf7f490bf3c397298c4a475d1614be8a3897595f83cf1b96d56390dfda29304b1eef5acdcad0a15ab4a13c61ac03a9e08ca433aaf9329710c683a7faf2a613fa721c7ca98552a28b357277c30843222db2d54e033fc99a94c6c59111fdf18f54c287cf4259a00ced3653bf01a9f1941abed36a6bcb6f806662e0c82b94ccd760835ae922a81d0b01d7ae7987233e61320228d5393431362d430c8860c020bf2a43444fc05ec36b02d428a02669370ec6bb036dcfecbd3bba4acbb7d65e59a4fbd5580964e60e74476f6662cc58c5dfe8aabaa001e6ea5eee885c69523eba01118381dc608f4c2671e36f1abfcccea32fe08755bf203b6408fa4d982f729d571984902adae18fa71a15b363792a9e013b06a30def5db262d0ec542d933a02c6ed1d9f09d5240f7fbc23d4bcc1f4745f6ad256d37665a57888e9746d81d39edbf4cbecd2a5f4c219657b85885ee35b806685fb0e50e544ad151952ce1d5eb0fcaa05e1dffbb1bb82e407bd99cb5cb4b793f39ff10aa5f1c9e5c158606ec3eec64d60e4a7bcd228a8a2fe5807d68a4952cb29906c0fd627df3019a234f82ce9974c95cfcacbe6b9d6de25b5b1d425b985027967128fc1395e009acb2becb9f339a96345749ad459ff4a8fa749aa47b33ab7aa1b6a79e6d9cb73e46675235eb0a8b1b82ca8c5ec91b694f09c826243310558e062554423cb1d837bb4c06779fa47d7c88e1a5e71feb2c707dee677a5e07baca4001ed4ee9e2c165be2824291dd3f397edb022b03c5b49246a22eb669e3525c92a6faffd400dd53b66973343aed34c5b99480ee0980a8f611b5f5389869ec6b0f7020cc3f73bfed687c06ab5f23c3757c730309240d7840bbc20c4d09b9993a0706890b76d543d37e1c4741f44751ca3549de3f1d721c0a196424d1d2c62edec2172c155d522995c75776424d3ba9b4310ffc50a51863f5895829ec2909a0997d91d18cf8044b0722fa6487a27ab6cc0eb88b35102338c65a62427cc3cb212c045d2c659cfcb111becf2b71b9a2a6e93714b15132e7261dd821966e8dfcc09d86a65218801844f374afea830dc4107d38effe63ab01cc1d6505c8771fa0387a2726fe96094c24d048638e2ba9def73f70e0f0fea802cb733151c652e8c3f512cd5ec8d7c369c092075fbaae060f2ba8a1f0b7f1c6f505d908e5a302592446cb26737b57e038242b8daf06d6feeb2c9a4031654e7d9a8b07fcb529fd3c77bcea6c4fa97027fc292d32b5b834606412e1ab5a4cd25ab3af24db414cc35b6aaf4e2800dc1c3c655b0bbdc2a1501070f96a7839e5ca3653b4596d8210f725fc3f24fbf8e506953d9c2077dfdab76046dda37945acafa2326e00524321283b7d8de962c6babb6a4826ea24b8f6abbe18cf8cfc322f75f08b11eb612bdbbd6dbaad2314e3523ce196a4c7b7ed01a290526ca828b3886b36e316478aec8199cdd4c40dccd17e14c5b8a3743166a41bebf0099f2d38aa1817dfc0c54b04164992416718eed4563357bdea26e952ceacf2a4ce6cebccc3c188873e0b4628e90d2474632753bbe7373db04a528f06f04240f362cb9ca48e67a236309f82602cc62765aaba724d07f542fa0f42c537e8a772203e400f92f27f36f8cba341dfdb613d9bd81857f8fe530fac2c593d92b5138d92c36570d25f70b19dc4c1ea3f2cb60bd9d2cea7a80a3d2e624ef3c1aa8ac466a7ab494b123e4dc026cb1b4528df1593f58971b3f9f6f1b31083eb8b6c40365957e0b3c89b8efd120c6fd16e93915f989368492a44b759a47847e4190409e62b82ece30d1aa63f8a553a70829c7c60a3d627e7154a390b83b1ebe01156b00ba2b1153b924bc9fbde0e01c35b09fac0ab9fbf4e86c5a0cd7fe094a15da00d28532ed2eba4243893aaa7708d6e70519d25bcb2985bf2596086c4cdd020bf330f45bc5251b20723e71a1ff9ea6ba65b0548023690f7f3553bd483a338f45902d4a53dd319234012016748fb642eaf36265ba94010b3d544ebf355322a32836c4e7ffb140faf971018bda3e5352012db80b80fa10a8d287a4c6772f6dc258d933e8404d22387ad40d8a92ba731812f4d7c9f0cc7f02a70b496ef969a56f843312d0d57f71a2f36753ab37dee4059404eb8755e3831a6c3900bce4b25a6cc86a722c574fbf118ab60f5d93cd8dccb884cb06e5501eb332a69b5d90ca50cb328a4d3cd0a62fbf943a8ac87cedaa1b062dee70dc185f58e41e6f6930f77528485f715f5dcb2bac5d49f4d06e1501aedf675066a688af26c84448c114d1e8120ea68584d728067ec03ad23c75bd6caa3abe9c54d92c53924aaed4e2ed70b414e9b5c57f1ae35fb099856e24e7a9414c1d4c26f4b486d238c6304510ee3c4dd18bbbb8ba195dc9b63d0f357a33dc87373822fec9443a814606f44fa13324dce0e099921077b83edc9f19849dd0917e943dc721ae520bf2a1b15d29b8f12775ebc14b5be224c65f369e3d305f03fff87fb5e91b45ecbaea7571905ad14407d079898e7883b3e334880ab16a5bbed13d38e271357f03184d31fd55f66e6e1f1a9d49ce029841ba7672e103de0b0a48c3b71a8d626c578da391c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bc84e8db3ab29823469574c9b596e2e070b258640b33d402da3213cf53c7550243e3f5faca65791ccb4f456ad51adc0e1589df67d0ab448d486155b8b26be4dcbc2bddaf70383a6338fd234a532516647f6b6967a51d3b7f65fcc60af45f2d46028cded491058ead42e78f898a70468e9112d7085fb21792fc74ebaa7afe80267b33fb1e62fd1561b94ab2c94148f94e2a898d31c37ad5fdabbd3754dfba6e48db7979d808acdfa2b85ad4e4637d1bbbfb5add0f67aa31f709da8856ae5ec34235b5f9a170558b9ea06b9ab63b0014a800aa41c716a851bc9e4460348db50bd4c18293719c2f60a2442fb5eea3d33efee7b1134f3328161e67ca307316d44160e8e1257a4499f57d0e098429a13048a105d7d34bde433e8610ad4aaa237bff7271914e526b96564e7a3c210c88192a59f3bcdbf558a7a8e6a732472aaf6020d30821cd3a04a5f49ff7ed41549faf9ac8ce82a32650e1cab5a4bea50f749d51855f76d7a2ba7ecfa0026ef50d9002c1f455fb814ba024122311757feb22ab7c2723a1cd5efe2a55848b347f7b62aac34ff7369b0cb479714e97fc943a136b20fc1149e900e56a9e667b1ea9d2691ae9ec72a20e722d5a4c87ca9d51526d1a37b4dc0638abd12d1f58cb6e02d096514d8f4de73c8b989052e3eec5f7a7fc72a11cf6ac2cf20022b862b312fe4e4dce760ea7d75ec8f01e595966154033f30783402e9eeccee22712a78a8646ad493777177692910aa01e5f402b47d76c27f43b4824b03beb9996c39dec280b3e0ec0ab390c7e4cc00df6314984cec4b76750627afe99eeb998d02dafd64b9505dd39d889d2f0217095963e5f7e38aac3ac3f5531e285808609db23be1d1ff8d4a5999666b984b6bd0a865ef8e195343c8dc6a2fc3b34385ee72f83ec049991f6999fdcb8e1efebe92a71f2f9c788c6bc6b2ddd84658b1ca4a87c3fec78396311eb498d46d3a459ccc9dc5b8362597f9d67abc3ba900afd8bda4bd20d55d22d371f87bd32898b58eccb42dbc524c8294f00fbacc62fffa1e6e7c6b6707427f2121f9437811e72a7ac0da7563d81b0275429e4e15e5d80b67392bb1cf4a75ba0e4ff27c7eaf72681f41c5b94076ae263c0fa311547a1610fd4240ed106c5c5529ba611dc1155a4541562e4c4fff585ccfa3a425516ff917cab5ebd4d5b219795887362628789e9e996de906eeba05ed747c4a7c532b092be5e7c14750f6ef6dac5983ffab22709d942ecf807869653657e89a98eb298e2e24d3ae263fe4f25ac168a715d476c85d532eba1a43448019ab43754a5c0f72c620dc0856dd7bfdfea72ac7fa7d2ce9705c4ff0c6e91106f47dde089cd6796a8c6c5e585cea5d0744a53c28efa2b678e98817411e583191d64ad5c3896a9881cd6e642b104ceaba79a47ffada4851caa7abdfd8803597a4b4c8f38e278d6affd8934ef17c495cfd3382cd36504f10f3eed146539caea34aca98987dd6f6a2ab44f20346477238e09335fe9ecac88f385625b2573710a88a48fa5da761d39a340974ba8bbfb6f1d5acdab9d8b2c7ceb86cd60ca7da608ea7e79c1659346cf59375847d48504b920364c08bf17d465c7eebc57aeefaa0f3312880108b954892aa76b5b70886e1ead98751950a4af8d5446481c7141c3351cedc596a3b132d471244df56c2a3c28a7a3e7d65762cb431a8e4c093401ad9f50f8366e6b24e9d0e6adaf1ccd219adb4e628eef8d033872c41ddb2a5436b91a8112df55813b5ad6bf96fe9a3b5b1860ee2e41f35873fc8141da0a6753120d91ebf1c4fc8b3b58d4bdbbf12449b1c48331d6e36ec303cdaeb58303eba7e478a2249bd6cf81c5e11018463ab8f5a4fca2813ce0eabef7d9dfb310060fc7b0267611463c81ec58753450ab7e7f58c7b3c7c286befcd33fc317c55c4401c1a1dc3617ffb7cd049998449927387e70d519b7d07ac617f193409e6a965ff20953978269c3e73dfeac852d3dd7a09a058d6a79fda1133992caa3c71ab2a85f857a05308b027b017d085d73fa9971e87e527e23299766a1079164e70d1ed7750ef7e25a976e69aee6e35e1e46802b958157043aab9f5b8132a250fa918cdbc69a8e1b191c06c2c433c10342e6f6e7422635058914c099ed0a435a8611e141b46053886315b8908a4ab6a0823aa1dae7329656270d54b9c9636205297171cf4e63c4db4e810078d93d765f78f224562a163a5d5770393bb54b666737a0a13fcd5e8024cf8e25973f36925e92823d81b4d6260365454dc01dab3a02b4190448549996fd8ce52a0cdac9ba702bc485d4a62d48a26650fc11c0eeb60232787508ecae3395529c41e86c024c40cd153474d8698f035e8fd450e41bfa57fedf841bcdf891e077c1c5893d7c5c8dcf0ae417f8d141f101a94ca97a859fca42e92f9db94cf11b70204cdefe9ca4e51934a1225d0820b59ab2209c7f1dab9df65e1bc80a3e9a862ec63f73cd38bc4b7794eec4c67691bdf18d1cf601da22bf100ea9883f7c079be1b45647b2685cabbc5f5ac0f43fc96ebbad1e3ce6c7ffe25e72387d0ec9f3efc81de04e8c6c1b3a900aa7aa9703394def15d532d649064b40ddd3fc1d71287bd5985667356034f8a39576b3492e9d6c4e1f685e159b40085473acf9bd1c9108d8b4471a62ef613d67fcf44b73f22ef17a03c9d10c310449479f710f7ffc66784d065beeea0977b451c98422f629da448a54bdc442b1e19a55e8bac544f6122b1b7d185ac3bd4340f93c3063dd337940b530c39c443d17f15f1bb7052402ea380961ee19a83271eb9c53341996a55ef77ba58a696e3cfd7c37b1b992047985be1a7bd26b053571d0dc84b1265a97d03614c2d45c0df3b61d09c790336d24226ba600c821d29f8d694bcdde887fe9f0c0fae0ee60ccbe55a520eba4ecfc7c9b734612dc9ca777571e63ea32b1738677fab634dd3f0e07d625b045142142d3e204ff5f937883c0fc6c9855a971421e7bdc38bca00cc9ad32f6a556ab243612d3964e30574bde4ed1abf7352fa1dd7ac0bdf387bcec1782ed6d1012886e81fd3e919a53c785cf0c28aae1248766ae9653ac43632c4f6d3123c240c6014ef90111248952452c5a8f19c98e1a97e9d856d7470df70046359900e01b3ac906fe305277d802781a7a02e5782bfea2fd290cbda2d367110ba39c1e3260a1b41d88126b921e1c34f8578a5715303d80d227de9aedf5337b602165972dc9676e40b9b118f8e797606271d736e42b518f74ae72a3333a847a79299b4de1db49f426260bdd5454fdf18b56daef690264e7e675b856fdade54fef5aac36c52657927c1afd0868c13b7ec29be409913cff2b9f357c7857b83321b3380396de09abe5517926ab23b40c68f8c971e6c357ac81e6694b5d23d2674711acc817b1dc6a1e9cab51bedb61eddd5b0d6502fc766505315e2993bf6cb0136f8fdeb9b9cb3ba5bae4d1a95275c1a78b159ee15bf47fc7ca1af3be779ef0c7a3f45e8b66b7c0f03cc8870272ddacef8efc3e9e1867e2ad2958a3d48800a8352a4a3de143f93254389db5330346705d7566c2a24e2a5c4eb5cc432d3e55e8aac37fe77903cf17a13e9e5da6e52febfb491528370980624db7427366cc841aba23a6680aaa39ee760f9c857541e6a6bcbf2a66e8197078b70361f465038bf9a1e44be41a48facc4c62972d2a2303dcf07f82b7ee979a31e292ad84009b529ff0512f13c9cf14ba87f5da317d0e3b468e9ab258fcc87c87c6cf0aaf7db05345edd6309e451704e85a52a2942736e69d0ff9a4ab7b35450ea9162286711d4906a5ce3ea7d3f79c95c93d772d10a39aaca284d118f31857213d9dfce4e0f2d80830c0816fa8c6850bb1f0a2a117879185361d7ca996ec4f94e21bfcf117e396de524f3e3778540bc06673decfc447b8536574bf8166febc99b876ffe55e6777e8ed486cebbcd594a307ba3d5da6e666dcb1ff95880614675aa92bc3f1dd7630ae7b84c07abdd42254b9f6961246f2f284b12e0e32265603d0df6d9b99184d8acd3b064a4bd22eb031e244d269308d4241b05d49a5ddd2d3ebad6701dc8eef502cf633d9892cf84e6c1bc2a53ef2121e8f791bf2fe36d631b5f3064c5ff47861c969c505b5d2041cc68d922bf12cfc6387d124b2ef3b22511481e07f601765930beb55e8781aa71cddc70856729453aa7350719d9cacc1e23f87b64c70b0ef52b421faf36b393f2a57889e42f59fbb16ec710fee23d770b5645160fd5194ce609b91291de4eeb49588ac272219fc701f29a2c3fc50dcdc0d2d01954a910b963313b61dc88260c7c598ab3bc79bddd57ca1d42cbf8f1f0d4b8186729ffbbeaa668550fc36e510fb3c5970804272f57c7622f51e63303ac3bf5b0ae45cb28b7c985889c39ccbe15b30c3909d093093aaeba34cd089bf87d16e07257cf21444863ec1d131a5e8a5724d02959e748919cc18bb8311d5c7452f390883f7b693d2a0b54519a6ca41f9f35443a85ca48e8481cb350851bea417ba42be4b3bffc76a7e71f1fbe9c9a8319f61a7abecbbf218c377c0ec1c5512ec379ab333cfef78a0f88bfa516e5b0dc37b2b9387107cd09c0a68454762f69d4601a500a0fbf1a5746c22efc2bda7fe595cc53263fb759eb0adf651ce221836c34c8e018a9d5cf7f11f0b49adbd2f8b844d6bc889a8a12d52f96543da3ac3d20f4f17509e76999212923d584a50626b54f4d50d0a389db3648d29371df62dc49ff938c4ad51d8e49805f266555bcf22bb261dc8a8efc0ca6f6d29aca55e110d92eaaae583d4cd784529f7998fbdff084dfc260eb1af5e1ed3a43993971a923b803bacb3cf3a493175152e8ea3af1e1862a467bd1d29add3a47f6911d651e4a526da163b8da718ff5ab6f95d7468cbd7d07b0323a75cdcbf7cd1170d185ab74e47fe508ffaa30fd847e38fa2b42bcb83cf67516db1b773c6c3d5a5cb22f425cb57d62734d1534e816c2fef0a7d30821beae76e216c251e9e55fc1db5096cd28dde7943de9858bae95b7e7032f2076cbcc2b7d934219ed0d3b29cd049ee94ec5ece7ea9f0c6fa2faf6615cfac2caa63424c72817baa90807bae132b06b21567393c8ab71827e00103f0b9cb2a6aa8e50f5260a301d36d6e2e29fe51d46f50b1a7fd7e89a790b98fe62bdae71b24981e1285ae27a8e2e4eeba9e629f477db6378aef7d68492553bf89a955b4ae84f96927035e374aafd9c7f49bc05de73089991669eab370d7a69bfa6f322134b78e67959ee7a2600efae6f37bddbe6c6aa49a068bcdcb92847dad27b4cff7b37bfaad5b7e441124e19eae304059ffe9fbe1fef5b0f153566c05ba49cbc75a057ef7f5f336a06ba58a4cce365cf207eac2ecae5abb2d9077bf252737abecc3cf30b9cbb68d66a69624eddf58e9c8d8e20f40cffc0905bbcfafb57c09571e635f3452e6a459dfa0d548658a9fb0b1837d10478c8b17c1300b42e8eb462eedfbdf85c5b7291c59a05e8bae729ca8fb7e9c32a00d8bf943f6412413f660c9807fc931294e5788ba2f184f2bf69e67703a868be8f0b7029284768f88634a6a185a37d1b4ae0d7b858837b2e23b07d9fd045d73849e5a8cfb279940ac515ca97131e703455ff844d211b281761c751ffbeb44059b32d6a8a8da2062e0a493db7cb050e3443d7f76e37ab19ddc5996828ae143c40e753f64a433b381424363dbd9ce965f84d001c686de80a04dd270d4d3e2c3a9ce3a5fd5e8c50e04280a3d3512f90759f2c4afe03dbbeb8cf183391ce2edae7bc81b62699ef006874cb0c95b8ba5ce0c5361c4e8ef358f106aff304c30acf17015144895b812b4a61b9ac841d8f4402f6484b275e18350278471fbd47981fca3a0be0e5740ec259867f4e88c716379f4fcc43dcd432904918a0e2a4e2615ec7cfc2584c202722413c8a843bc3625ed9fe76da0159d85ce5ba462c23d390f163e7b08c4c1f160e8b4989cad558d913696b06817912b730edef40ae3a1d727783ddfb5fbd0a8271d6d624253957b6209a3e2101afc2d2df082304be41b2141a6e5c38eb13df0874cf402c9cf57f6735dfcf0422e86efd775fc578d64f78bce8a0b1f367a0c7cb009935f30c13a7713b029f6ec3748334b3205c5d2ceca3abd81f032003cc90b6fb23cc284dd690d1be1c2bd3602b60891d3a52982858e275eb6a1ae5280145c34c207c556acd3eb36d771f10e13b1f3a1101c047328e40d4cf45bf7970f14d91c61811d24a852257d9bba4821db57af1b326100fe262b492fbd7f697fd86cf44b5a59c3e86d2c22608bffbd534846b9bedd97553d7a047e834249650679a7d018e9efa60eef00637439841e761b481cab5fc88fdf3c8d1d61e22005790c9b1b52da8160366b372087f3f7cb1eccc303a85a8879a10fd6cce12319c9f64b95a3367d885268d647a2ab5f43166b2d5f94516b919a55c6a03516207dec1c0e73ef454c3a52487552109cf635c1028883040af0969352b04f142c5ce8a2ac5a37531dd7b6a3557533c0ee7a25fb25eea77de284898a0e5b57066c1edcaa2292cefe1bf43960d7723c27f56b3d5054d037cf14508571a36ae42ba5f9eeda34bf5915907869bacc66ad83d2fda0ed5ca9e3b073ae8ec047d4add458669015850c248cac2f8b39f2da267264e7bef215c6ff4651b36cddef2f57453e5ab6de7ba7a7999fdc66fba3c60cf8c070dc2e0bd28c9f4cbfa049f4af736f80bfbc80d585831d544f961684a35b14a41dd40111c4274d356e9f2fffbb4eb77b0edd58a4490a34f5a6b834ae596f349ba131263b7e7318a4646c936475864fe6a14b0fcad82eabf7a355ef04ab0718a8a3cffa114c551f44a6a71b864420036885b89c998b7f47308426700b800176268b6b9cee4af3be48c003e6126cf4cab9ff061606686a373a21a7a4a61ffd7df5eb769063ff6bcc3682c5ec432757df673f9aff6c1a5e8f675790f8a6b8751d7c79f8db32b302c1d3a9b5108e24ff30c1f2e68b4801ad433b141a46e9c827c538600278e65a51f8ebeb8194c77fc99ab4c91a6fdf75c292554196b8eb006e652c7c97018db8ce3f7a21a73296bd269e6fc1c42d3d02bfb145a5e4202d6056f40562bddcab9e81e69add85439c933ccb2dee1b333181b2e174802c8cda0ce8bd936e20a418794fae6ed58c0e9b5ea91e61cedc091665bd7038d7af7cc9175e6457fd626c351aa03a5d76b86e8f090624dd7a6575c3f17994423f9d70677e3a84d2965ee6d4f70614d7c8998b741a9e9a81362a1b3f7746013f35ea2919966e3030799dfb7e263e63ed9a9a936a3775c17ddc139a2aa369d78777b53587088739a8ee9bcfe03f561541468090308e6d21db9bde1d40095d34a9e0a1513a7fabdade1309fa77f80d4f51bf8f92cd49cf74e48b80d0413fc9fe861e91c431838091e61bffe94a9a8f9b6448660dc7c3fb8ab8c6a9467c4b580fc6c588b702945a125368261312a9c40e781066b77dfd95afb2278b4a737a0ddec847b48045366688b9424a694390a111165ab4b28f2da525cffdd81f0e3624e10a52ba2f3891fffaa0ba1c650ffe4509794a404126470d811a81ddaf0464d5a8cf31b7238e75ddfa9999f975136353ac68eeb39d1a4f66a71170590e6ba91aba97ac7d039428c85fa425d6d707acf1411618a144f08549f74ac6938fdabc25e7b7a44edd8b3213fe6dfc62046da4aea5f4b85d48c09c01a994ddc9eb0c5a190416868476134b991eb66f16b224bc770cb2df36f42a33b413d36e3f02965f9a2c3bbfbca15be770786376e7b35e7c5a1c390ca07f98f358b981fa18a0a0bb6802d3a67c4d2545252e71ebfa6df775982ae70f9eb737ced39f1921263c16d261f5cb1b84dbf1a3a578fd9460cdc6122265527d34a19480ec6851cd28b0740a5535a9b45d15fe0f9fe60cfff4e8bc840a14ad0388df257375ef8c0729eeef028cd6aa863ea0cce6951d4a6adbd0052ea14349f4726ba763d366319da7e48191ae3faf38a03351e4a5af31c70e3e4f69cf995d783853ef70a9570ec0c7fa1893ddc28104bc29b905e66d618434d4a4c80e5e1503a771751e3f84836e63c020f7d264cd62cb39acac61b53609c3a399e2ed4436cbb5b83f185dcccea986e5371f030bb0e3a25316026166aa81c8a8a3154b2591c52552f1c30da447a2f8377058202dcd2dabc90976bc9b3a0fd1d782c2d9b3fcd68ee62dd5bcd2813c4d80025337a5dde84223aabeb91a12a52fe38fe7f2e5d689ae07233260783eb1720f652d20789dbdb794dba5c941da246396a4de7cf19fdf481ef78ff59be601f0a220b7e5991b25dcacf8edb5a637105fb139c8d7d04d9e88fe3559cf133aa38725b8a4cb00a491652676ca731513d7e03bca1fa57b648a25f1f7ec079b7a1aeec7598e1c0cd228930df20e2aaf0fb97c8cb8e4567d119d3ac25fee1c0e031575eb1e1e6cbdf7a6dafc444055ab1646ed0e0c63774b222b99e08096a0d6a09689dcf8b80271f0082babf29a6260a9ab5021edec8e6a3c7f915e0b742437e420443def7aa3f9aedbb3089fd0473200c31d7ca20e403d3bdcd40b6e73dd772610cd582a1d07d07500f8c043a1098fb3a120d93ddf836c3775a5997b9842bdfdc78615dc83d7bbe97ec7c1c3d4ec504158ab297b755facbc9ef00caaf5c6a4ac45e9dba22cc5b73350a107e123276b84d96601fed3f2e1af18ffa29517dc9cd046d273428627889fd18ddf6a8ac8901509d53bcb3026c62570a0370505ee1d6baeb689955c4b39bbff2fe875e5b9d3eef2a5f61b570ef043bf8d7b7d8090b37364cf01f7b5fcefb538998eff4fee8699e97fd0c91a62c4960b64e12454eb31fc19b3978baaff0c43bba5132c12c27a8817a3e2ac0bb37a74dbaf602504d61538ebcb03aeb277acc64760bf3e0ca2df55da1bcbd00187953c3cd968a90b74beddfe008f90be48bf959091b68f2ce78c0427705411b23fc2e764957cee78869647b67b61da29c33403df1c075730af2246ad2bbf059c962b84dcaaf2de43237578b2efb92b1f66cd6c29e5f5adc2304a87bc416bd71c53350541d444b768f9ebb50ffe3255001f0fc4fa804731710025f253bc005adf1aba619ef6168a5722b185d5075211abb9b09ed00db760dee50167d39777151d14bf12ae9826ddae793eaf601c8aac2f1603dd3b62fdb91ac326063c999e668d7171c98a91705a6fbd617041517afb93d322a823b06ea31a0d6129b0ff9d060305d6dffdd764d02efc129a666ecaa0f109c4a30209c4bbf2cc2156e984c9663ac4bbd655a4a9678e735cdd555c9b73e34480e7ff2878c5f0c29e6d2524ebdc6b67fbd291c3f8509500460649f3dce066879ef2c2884902790fb1309d3e3ecb6dd42179983bd11dc7c6180f27edf97a1563c385127d43166cedb710db3eb326355d00ac08aee1ae4b2b399f357695a41b25ee6dbca79d973e294a25eb06f5159c44f129e2a4068d1dc1eb8f1512dda907a11b911c85a54800f65d91e5dedb9cf1fe7aa027e3fef4c6de92c73e56f96e368acfb62fb156609c72dcf3fc882f9fb889b15b57840114d3709482805b02614c494e95cbc5e382c61857a1726ffa7a88cd135fb8e7ef8e8f24169aba8a356c0a1cb0bf90b26f0d6ea59bf882f653d7630503054c2e9785b21c83f9c93a33dc13c1cb3e7f3d8fd5f40e0e92af02cc4dc37bd1d49bb87dba6d410523b4031974279d9275920fcf8dd50b72e781161bd8a6f5a5b70b096d94c671a0bad05b3ece99921cc250884eaf550e685e12a6e00f59c8a8259c492973ed998444f5b9797b6c342a49aa808c54ef3dc1a65ae297db972936f7cb88fe731d572f423599630d979142643e263e5a773d30915fc2ed0d785197c6bf6bb86156607b328a58a4bbdbd8bb7eb4a2cca4b9ce799b20c8532751c2e088f3d0846326a69d42db34360f8e0a3c5ac1cc5dfb5ec065d68f2b4e5755f890491ca7e56b65a9e70817e50683241b2079fa9fe7f537f67e4434bd5dbe9b194d6913613143ec838a1ab8b219511124290a1d927944e270325cf7bbb21c3a01fe787364101d87777bfef36cc977e47f787d0c39e604f840834d9f086609a28b6b49ab83155ef32cb6193a9abddcb06a6993cb40a396c1e085f600347c2b7ea619eee2c5bb3eb816d2822c46b47d59f1b639dea69ad6a6fc19b2d5418eb624d5a92f26e550e71da463a9f0eba29510dec09e59977dbb9522c9eacda7a6ce1f07908bba9999b86087987c2c38f2c45f85a8de97716957581746b992239e0c96f6d275e9d07e36713de9a5a3becb94ec5621360f8d248a310075ff378af138703e50329bade76649dea85a90e5f07729a94cc8e4f48296f0a05c36c82e3500e6f46b9b1db46b420c39de4b7d1fb13e89bbe469876ee4b244f3778eec28e65f3a2c2e7b2b311e6f8d365d8988d5822feff28cab30b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8b9e0f2b3a223d82087ffe594d6d7829600273de919a96d0f2452c8716b0e2971dc02a61525f8694b8eba3679238b73ba37383d4718993a0646bfa1c85b7e36df79ae1261ff4ca2ce7b777e45a1a3517acff247e2222ba73f65befb42d94faa88a8c145af5154477f14b5a3cad90858143f159c5008cc5ae69a762298adf36ede7314fe0084538acb9229198e301e0ebb5ef62ece69eca57cd1fc0b905a662c98fa62a30bedbd22ff797add0a167e1e953918b132dd4cfcc8bf7b3ce1cf3002f8917dc4552848c9bc21771fdceb0fbd77dd7618123234b6743fd29dbb18c23b4eff50e38e0409f2a2cfe4bbe734ac85d85b5fc05191402986dc2d4a278956e4fadcc1d641158c05428f7128138c785bccc8c06c59ba5b8988c1c3e5fc92bf40a959662879fc2f4b00a462335ce971e7f7b7553261c798912ed9872328842a1394c84a2af5f1da00fd5dfaa87b37964b7ace8bd7e110aa7c7c65fce19a17c8049488e80d95cea228134b5f05d3f17cdbcba1887fb38279bb6864ec4ec191f1d8181784b135b363978b89358ab9bd8bf0848c1bfcc1934e2de2eaf3f5d2dc23d53bb0f415ee675bac37e5d1e48585a105c9478cd94ace5d1059fc3258f7cf8a197c9bd0ec4658f223053c53101240ca478c11bc6dd8b94462c1243807156080b7f827d94ec85674b703f5fcfecc7f90af2f65f9ba70bab70e474b37b2544a425df406dd0775a5d8719e2316963d53f13708b31a67d7a996ec0b1c4e320dfb25938a4d081e1009672e318779468ba2d5d507d924327919f0b7f76bd45a306cd4fbba5b2a0e945eab386caba321d452a62ce40d1398a7ca5e447329e657987178f006617ca5191dee1676d7a3a566f841c8b82cd9e89bf947c3fbee75125093190d512cb70bc167c29f62ce2c4d82c7279b27c011c3a1e5adb5dd8b5cf64a250c590a0f13be4f38ba4c688f6af4496c396c1ce97cd371499471e890f1a421b94d404192af783fcc4b7996a5753725731782f8b9cda9f82fb9a089c4bff3bda28a2baf48fd97443bfe8f95ed711efe9ccc4d2e1b65f5d67bc49503d8fcfeef5df2300b2f2df07382924451c22579bb55fca85f02e8fcdabf2a2ece3f429204423b39372379dc6d48b350b5c16e18ac78cf212b2655bd8795b21b689039e49820f4e6a0299d74ef23968ffce5c98393395d2833c092039a02861040a9253a0611f40ac89a828c9caa407cf9dc57d8b048d5a07341b8f9061fad1d678bcbe4988db97e9dbdb353e7a8ea5655554b9d7b5992d4983a6db77c5ec95a462354d0db9ca680e13ffd6ac07f75f52462151f914331f89b2dad85cd88d44bf800d4c6aea0fa9c48b7fe25b3ea46ecff43c89e285cbad27ad0ae245c46be7d0b9eb188bdabc3b9b501c4fd13998ff2498aa10cdb52f8e9aa2180b52dd722214560934856cdd413a0844682b450c072341c396fdb1e7232c83311f95461b43d907a6cf2052570cdcae75aec4ebc2d21e111223d0fc4d75df4d53d3bc893baa3fb91ee99b8009d76f49cdaa476894237758fd795f987ec95f88ebafc6e509a9c56c704d1e07772191bb0a9ea2974451471ff1131e8fb0880efec56f6bf6dedcabdc784ca30190db8aaccb5d972ee5227958df1586556fe6c9bb7fbfcc2dba5c2b9c78961327635d147f663cd76a5442dc54e0e1d3930f627c8fb36bd813d59c49a62f5c157c5b9250e58aa02851eea9f6a2fe14857750a558260552d504bb9039d777572fa71f52e88a1841ab10a54b7aebe94046a9a2c7621c4df3b6142fa3a1e2cda6332b927a484fb9578186e5e9f47438f4a2a123e3b7b34c88f5c51739649e5b87c5e0fe8ecd68a6278ce0afce79a7b82010fe7f41d71e73d804601364a3dee89b9b919d51e1b8f3fb696fb9787df427d46e75db528a051fddd1e4c314c3da0ca15e03c16be82a0816fc0840189b0ba45523e7fb1ae5a1c98b384689d8775ac7f675f7f1f4a28368032b30795986ed95033607aa72689c44551243416db292007da123b7700dac53ea18973b24c63e9f8e0331450d672b99d1a9bb7116444c01f46040997d6c720d836e0daa109368db89927d2d6280b22684f581cb129268295b281103746348c288f0e904989ff638892ddca22952fde2cc8cee6dcc4b3601f22e7c27f1f78427c324d57dd56437cb31462909da1a0e1485691a47858c36034ae13a2997b7569d8a81a62494bc56203c57a3c9a6bfa3684aea392df1a537ddaed992814dc81719e95e443a21a85d03f633438d152b2df343acd7c2c570f3b2bfdb0a057c86b3d800c827fc1d4d39a4f6b22f89c3774296da68ba5f37542753eccaf92a8d0742951dc2f4cf4a0d19de7456ad4f7cfeb1a0f6fcf9af6dabaf462b4ecced3d195fe1b2e82bae23af088ed48f9dcbe3704ff614adf382373dc8dd9432c39cdbd48f2730e08be81dcce2179494f98da010b7e6164ddd88f7604b1e813505b6803d9611fb22b86801b986ee8d72a5e6d25dadf9f13e4d7c558e045d6c9ec1f7a607414ed6726d08ac780a2dd5bf5cb03c8bbd896fb0d94aae4925eb2f24ca2783b7a061d9bed376b3724ad6393ed08c817aa5dd9ffbee22f3656d0948d312264976dae5c6b2dd5fe93dec513c13680c5371a6f742957e248ecedd5220472c28c930d2f2d863e52d15af9e1570a88b01c9632dcc7f038c4e264d83997f3694751f808788a7a652b5b00361b7588a0855f6fd123434766ef36128b2aed370199f1b98d62a7e8f75e6471e248cd7ad615d1cf5a0e037d894a007dd467211ed07f0564777b676f88de294c659b5b7ec9dc46f68529f518d85d5c9be6b82ecc73137a7c3a9192258d189ff7efb598d202c501c7606b48c899b5c9aba85aadabc1d67c055d998d2321016823e4dd6c2be473bcde5ad5c7f4264ecad21d7252bc5418e74c99d7db7675aa9b5383dddf1082eb6bbe1efbbd05487ef3a61315eef3933d32ddda3360712724cde070e4ed36349abb3f756881d3dfb7fc71e646277abc197662d1d81b24b70663b347c0e06a2c48fb23fb4ed42716a72c09033b386563a08968c5b55dc9a77c7789896ba14266d3023d388b1811b87d21454a90d8d5853183d3ba3d3d3f8af59167d120ea504acb005d73a8169f59c8c6cae07dd77458f9b28a11a6f08d65acd478c814d0eccd98ca43ba251804df69c446611a42977b6ef9c09cf906329317c0930a6e15832957e8e51f34ddb288408d57a55ccd6e9443cc17a81ad57bbc52928e855214afbf1fbe48138fbb25a71df3a1cb2abe803df77e7f7086ba591ecb7f098b0d96178c161a9ac146fa4666731ceb355c7c48baf392f2f02e3545d448c0237c4b552a6e6cf0cfcf28e130ae50e41a9c491bb05d6baba768677bbc68b682e136c6829fc30c93a93276ca96ab5170e3c41d47031a0c1de7fd5dd6da9730e79ecf095dda3ab815e3a7f451948a098bf915ca849de967d2a11ad8ff0376172e67b065364d3bb28f9ce095fd7f31df4c3e499d6129ac17d3e1a243937503878833ebc0280f781c3ac14164b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe950fc8893ce690c41c30bb1a9846adcef56fe53eeb84398327326ce74b71f9069214cebea7c0677ad4c1c530bb2516bab0ca560779be256a7260acf5d576b9b3118d409387e386ddf67b1f02a03542b092edfb32be734144f947a53916972e39d515f7bf0f4839e721dfbf7814e4a990deaf77cbc2517c38d54e651caf8a34dfe0d59daf186fbe30b578aa59f9add67080011d2b490316ec124cdf0f936282d5d0b3ee9c1c79fe5f6cb5d7a3359f607b62472ea5bdc75008d17e4e608e514be761c2 -"); +const NEW_CHECKPOINT: [u8; 25122] = hex![ + "80c58a00000000009cde110000000000f118ba039276d46ba87cd50790e2547060aa6cd260476bdb499dc38ef834d618910884d25c9608dfe669a39ae64814db99553d82cd7a5bf5808240d2dbef04e6035075425a8cfe9d2bc194fa1ce245681e84909e4159e0c5cc1be7f876ff57d0af821d9b65aecbfd133c02eeecf2d8f64a164474274529f0a0fa9f8ab033cddc183b5dc028ccbc6c27887cbd65da8d4b8d6983ebcf4a910e6e2403b68f52628fb555e3486e21fd446483ed9df35377b07851e0e07803b7af34cc02494fe7a71fb32ec66a1c279dfa9e12b96b4a1e44fd1d3ca5db007ab2b953f6708514bc65ea545ad562b10a900bf3d9b25b5153d552ac07a256fe4f7761a5f9fe130c8e65b8f35ec53499db3a67c630148b7baf1ae8b79c00ed0c5f8f808bcb9e01cdeb963d8a6319e82af0f8a64b1819e2b21ddd3b07b74c8ef2bf01450a4bcb4180795b745f2f11c449223cb5590c155b284ef45ca108dd0c6e2ebeeb1e93bf710e1573e1cf7d2e3ce4c45cd5e5cc6aabfb110fc1c748b6a22677b333aa36d283f3d99eb09577cbd44b3fe69dea5d5651887877aac4f7f7eb0856e272144e187aeb92df3bc4b789b16ccc3b9f014b60b56159692db7f9ec5f2bbf753c0e19a5a22400b614c45da5ee07ff2a4558c2038f3772f2da1772070d65ecf063b908ad751a192cf1aafe980d1b628aff8bb34f7cead01aa4baf5d8be084e112f2cad65561c40a0932cbda6d5d37d6650500f14b7269575e1ac157dae537eab19abb957f40043c71954cde60e164200f453233a8b77fcf8ffe5d95463b486da0e6e873a1a00d3b04aa4f0672ad6b6d03180cc0a089adcf50b7e3688c68b47d1d5812972cfd5952b4197c414bfad6025d8c8f060f16edcf8ba8bb9075672310a1e10745e4e90fbbbc61f2fcecf5399045b103317086f544bef7b5414e373401b13893a7520fe0201de90c58991af476a86d9eec14cfd0baaad4278204b6d822cd32414da207ec86da840cefe31c5cbfa6ceff0546294c296e6aa5683093bf0a69ba502c89e50a6084b899a36f3d60db2dc9ba128210c4e75d76e83799132cbd4fdd9fd17eb704703cea9df391c83d66a2d7ab894cb5a15a575d1e71389b8c57d63ea48017254c02c106c64b3e8aa0c2f33b9af3ebc44e541aca5e69cfae22549ee562eb8e825d81830317e565d04563ed05fb8682f1ff79e0c855990e03a9d18ad8ce8983fc55deb5398b333a26db57d0e690ef6ad56d85512859d9bea389877d01d3fd8ce1a0517c87ca515b12ac524c47439b2c4c00b553f8a9a6831fccd0641f8eb33c0eeba8cb5ed88e035f5bfa079644258f5077483b45589d5cf4b53915bdab34d4030dfa8ad85af76e194db58d453df3411431cbbd8dd19e619ff613cc3cc9e88745bd1b3d24422d3dd4ebd82467bd232600401a39fa3134a2cc099b690158e52694b2141ce2979ee84416d8c89f55c23cfab2804e26fa2f58e96fa9d8e7f7fa8c33022247ca0cd1808fbccfa4f3dc4e70ed62e031598f4776745fee59bf0fd5369246ad97c2f2798e808fccf295ce5f8ad8e7e70268d6667508104ed10beb70a794196a3b7c7e7188e766d9a68d32ba7297f9f916e7e20f5afe0a758dcd16953dd81ed2ef48f4d8bc8190f601dd3da1df6f78ded9ced42b00a310957f65ae029e7e170d106e9593dc2df9b54d9d6692ab68e9d42688304fe8257fdade19bca9d162c83b3bac4b6626979a8fc77f49105f49103d55374bdf18e1638be1d8db2945dce2a9b7ca3c772605f9059f0754a06cd170268ed71a19419ec3c88bacb63bed8086c29322bf2d5ede197f3dc626dc83fcf7d3ad2aa959d28c9f659824abd2e7392a2658f1cda46be4fccca644292573c21ba76cd183817fe7d59641bb39a369f4b43237eb752ee6e0647a94c0cd1ee669010a851f133e7d674bf23e6ba23028bfcf6ead7d960833ddf004e335b83ee062938bf9183c99d97a411ee79b18725de81a5131e8c8f0e5dcac8837d036ed9c85cc02314994d865c8476e63100deeb615722ad6f8110b209ba9eff76fbcbff25b1d83f31e7439c00ba009d8ec4f87d32ed566e7f516e7dd48d085808641df325942b46d98b616d8bf622147f24e180a6be27fb74e042439e19ab3c73f833439a86dbbcd4e0ac43db4b891b67155ddb007d2475fbb070e847fa254273b63d0bad326ba60dd8c0849725be0496d270c2cb30804da546d94b3071e6de53a2ccd167acaa2439920e9c77e475fc120a12d91be2176a87f6c7f57061fba362e5c38ebd01f01c659c3631bccfd6973d68beecc3b363ba5ea9fe3918cc7629672fda8922852fdae18a99ca7536861c73a6f241440fb9116ffb3c9144d649d00255a4f15b1f6afa5c88e59885eae06fa271e0e1ab7b5a1b4ce2827d3e2cb309ae2d58e98a926d2ed525a8e8e1d4bb55f621eb6f688ba7184688819bc8aa9e95b114b78584247ab2f7e8c217ca0de8e219646f9c0184d03f292bb3138feebdd38de30ba4951cb1665a81994db24b5105ddd683075f6cf5f884ce7ee6525dcb09e04903424d7b8610a4be604a89d099d71d038091eca1a6317291e4fdbd84837621ae37182bb9eedc4182c1b3e3af35491cfa701ae2f55522c2042e7d8a93a54c2f505b62a748e1377789780f6fd9c54981e93f76b65a7c0010ce6f84bf03154c2d75b1da316b9dc62a2f62736944cb935f2f985da9f6fac23ea4d578136a1b3cd1ad29818cd02e9a72da1779f07c7a9f88b4e9fef6ae1db26de2946ba6edaa1b43fcb1c7e10ad49b9d84d060c6ffe0ee4f2fdcc34d27601a6bb3fc326b7dd600aed38ebdb605282d7346c990194aa7bc8775a1dd5f64c61abe8b375d61223917fc8427e659d431a27391ea0df523a25e96210e17ca85cf5a4f5f6fb6b5c4473b4b92c62609bf31e8bf8402e391e3a7ae63d4aff55a17ac1d97620b97983e3ca421a81ab97f811921df29e09948dddb325945e3a7c53fd68c9c9633321afd3873ce4ebb4a6856b4a4caf2e57a2e2532a20bd768404e84d2b2044b22f9b2e8f76946029db8b84290f6ed94df22c8596dd9c6bce3cdaadb43bc90d1f263e64bc00863fa218495994cd4b42025b22d257d3ab275ca382ee10231e8850ada2b50d0fd507b34c0b74b13d1794ea68c1d594d221ef84f9557bb43495f9652e3fdee490cd327116aba0bde4812a95c47955ea446dd6548aac044e14798beccee03b10a59ea6d9a5a2bf6e6bba2f2130128a29ead57203869d1fff9467d835cf8e7ad3f3d2fc077dfe11769982b2fa5e94379c3a2087edf3bc587d27987811204505bd74d8ef13acbec609ae24793f5a2b101eca199dcfaa4531a987b6524018fbe4c9ffc95985096a67bb041c37056498dc3733b5be3d6d03a001b418ab4c0ef72c609ff263136e14c16e9ffcc8a2c6ab4b3b1bb730feec0a1ae7c15fed5509ddef0e00b8de4dcfdb93be4e6ac902462ae732c20a79209499b9b87870e0476d016889a60ed361c5353020a3ec98e34e63b9f3182ac02fe66da7efbb1a3895c727cdca56fd43edd20bff709ce5f86fe5f9c880c11ec739b9485c0132efeca6f6014be637028ec04a36b57345d5680ca76837e1aa7f14999c928578daf668cea7358c4110d88abfbe25380352feba160638608ae27c8336fc4fccccf4eb0abe8942f11a77c6a39786aa8287ecff1af4732e63c834f325d0719e5870914a7ee8cd22592c42b6bbe86ece668f7b75ab921fb30979ea979d9a67dc6cd4b3ae2cb3751b35f51c7c8fcd75505d656d10fd54bb1afa2d24afe1502740275589f07b5371914d703690da14b54285e8943f0e6c532a977f5fc3c1564048b19d731cba84f69c076a823353ce020094fb46c5784c2098313f99c96c539258b59630de96d217795318faa7bbdc52aa37525c7091c8574c4a9a03b5cbf80963facc40ea68ec48cc24f71f3337c8f7871aea9a18aed2b1664c9c5f5af76dec55f74bb441abc21da357de621473325018aecc06917aff025087275ca4f964b8cd945c7c41964fea49386cb3ed22036e0474cc2def65a6a380f9a120e5560722b942f5b88369817d0a965d6482ab324b7af23bbf854a41fc2510c2898712f6177f9990a2587a2fc9d2cc0b7ff3c07b5ed0ea20c24bbaf58d5a29ab1c64f42e8d94ba4400c65a90a6ea0a7d2623dca1b2e4f74a4374faef87e0a77b09a1b45558a9b81b9402b933317fce57824dca4b911f066892672e667f37ad0a750e09802784f2a0f6ca3a675b5f6a6e76e96ed60a36cb09046b39975f8575adf33e2b0ec9eea1cc61ec6364a0ebae32e9902129aa3b174c0332bd338a33dd91cd8159b47b10883b32a4ba60759c14f12b8741582bce5cfa0f7d86743e0da364170d9677cf448d7fa3590256ea01dcf11905726b88b15056236d8b65ea63039efd66b7fb4f168e6ff46fc5f7d7dc734d2d406153340788216a5df6ec9fa169ac78540cedd4fd9a00382798ed054223ebbac19c32a0e02b9a27c5db531e507c1855fcb354bea4e484bb30bef99bcd63be47e4d3d4a4e0249f41588a18519584d6086e0b2039b5d14130a4b6aa53a088e98ac24da38b83b8f1801b612370c71613612bae8e5f1ec6e07260fa081bacbefc947bd612ab85eafe775db1aac43fd4abefc58d49aacb57307b29ac2ba517af4e7b26d6a836338d6c8941db0bbb9ea279d33bdb9632be5ffd687acd2b9003040d346aa947425b475d04333b54958b6f4600f7d7456050f160e2a078302e7011c634abff5e0dc08880d5cf6ec705f94951273125ee1886396fd14df2ebb8f39e6171876ad7eb0797e97facf88217ecb60eda8fb336efd13715928f1311606187e38e0d7a4cc94d9a1a0c36aca43f3a98440724e8704b935fb52a0d9aeb1b8861c6a7c4535af798f2d46a769f897bceceaf1f5fb55986a40567a8d13731b4274787ac1995b77d08d780fe788b45ac80dc136504f7e1f8a96f55add4bc347ebcadac13dc5f43436192b7ef765a23dd8a82083dafd346a8ed35890a855a0856abe09f943f27d2ae609efb77499ed7fbac5f5d6ebb58bc1aa061fe70397143434f1b318e3d9aa8f5daa5543f7af91f534d2193d7a09097c373ebbcd9982c24bb1ef2c3b6125466ed13ecf5776c032a3bdd2a77107d6a1323fed662ee74a8650bcf27ba22e9c5172c069b0db13a03a0aa7e689a0c6cccd03b894348e2b88a577921a1934a3888a13c4219057df4393158c7202ed74ba8ccce6491af1b143758cc25e4261cac346a38761c0a6a24f275e1fbb117e9fe566a555e86ec79072ab3e3c17471bd6fd429af98b00b8abe4cbb397660351dcdd941bd3c8b6f77ba9a6f7bfce57d1820273a8000b9a9cc23fb8536bdac8a3f780f0ad86964828ea9be5595640b4a7a6c14427d7cde445d1fa4985a032beaaa5ad2d47bf2a536f25fd855247c5e229f5084f4d3edce308fc0e3e92c00ce3ea6b6c81381cab6d769c81410b76120343202a0fe78b083c4b3da0a5a16d4169cbe2f18fd611cff69d75673dbb01dc2e288335644825e3297a6b94ef4407036fc2c15109ac307d8c83ab4d8029afd1213fc4c2df73da3eb545c6c55cdc003bbf6bd302c8a792263c2ffb1acff931957e761bd98ada159b91c5db7db9cc5708843bb0ff18b82d85d51f9227de4a5292d4cad152bee03e97007f40dff61b9f326121e4d533322a8a04cc5421aa4fbc8256bd21c37943bc25be49e8ada61e5f240c754dae5fb242b5f4e101317143d0f7da29a42dc81dac6987517ff085cc9b2eaf258fc97aba502d83e38247f5ed56a7eaacc68f850b3541a435304344f3b466925cdc531d54ea55988271c18f993ff6ac2f02a4c1f1aeedda7c20082dd5a7c2291e1ee60a449a6b8f66f2938af7b48a2ba01b453cc2d98baa4bb2449139c3cd4436daae2c1f637c8f7fee6e3897534250f313ddd3417bc92b0129c347c648d7773c79655b4aec68623b2924aee7da53e8ba56772cd6520a5c6d78b553627f3de75b056bc618ecb17a94b4d6b60a7164b024a693e526bb32e97f612b92e6a798b10b774f3cc7886a3bf419c0562801baa67fb28b3c02909bca1d542cd6da0f359d6a89aa73760b8d3642e3e688294ccf604369978ae4c9b220a9661205ba7a1fec3e96e2e10d73af9af284d7218dc9c249c6fd5f339ceb3380cea7f5b9ca305c04d9f0322c827bfd5ff8704d9a0b95c10ef7a4e3a332ac2e227beab26f367fd5a61ecdc228c73455890e935d949dfaa52ca8e65dfd5be9d73c4be0f8d2c0666c688de7e98de4f567627d3aedee8eb7fc75c4ab573e3fbdc7adf0d934a25d5312c8ff2cebb7959177aa440fb3a7cc8f4b85dbda4c65524df016c7e77ef90b11038e6da568d6c04bec1d53740d8d0e669d7a7f9ac3e979e816194cbdc54ae7fdee3d793a0006d415e048fe4e0f3f69c04bde7bf192686e53f7783fe7caaeee6019ceec793e54f3d0ec024e9feae6f643b8826dee65647b9f53a51509d36464685f44e1964eafb98b825d53ee3a8e9f85894ad6097a5cefe8daf6931ea7033400c7808d6be6cbbd244a6a694ec9bb3602a1bffaeeb3ac266ee3dafb4a0b8af48486c8c682e70597d5952e78a5fb01137dde04b8dc0af662de6b8a33a890f40e3c68c1c49dba60fa5e7e9d8d1414a36b0394acb7549bdd405732d118ce9e18899f897ada4be16a73a5d2f8e83b36d1370e0d71a3f0b1ab6e956ae959fd878374a31d52c8f6a5a30442652760c9de032cd6e1f621cd557b802777f290fa716771bd240f23217c2993a56aff4205f5b233e4403d73c719b6c483c0ee81c51056125793efd502e3b7be54138357335f7ed5370be3baf470ed7287a0da23815690ccd6d59c55ae1b272d46d2d57d7186e8b2550350b023b09cf34947fa86f24ca0b8b71a3ae3933cf8aa43afc46d87de82b57b3fa83e09e87ac43e362625ffddc02d4bf35f1514f755ebae9aea374dc7720319d4f80d4c9609d0970f16ab5b6ab96d10040777e2ba8dcac635a9358e636fe84a4c9794ee9f7c9e6b4682a4c9ec5b2a594071eb34a5c581d1288678dac0b525b459f96f377ba56a1eb1ae9275d70d33c3d4741e66144ea92f880fb154ce6d5dd8fc74fba41d12e9d66c859a8cb892df9a8d9398a80fd1a746ed19cda457c58fac722259a67573b7add86ce157cb3fd1e01c077e93a1560b2ff3c79c4cca88100a4cbd6e0a40fa3631d1de6e035bc197ab7573f10eddcca678433f231dd23ec2fe50652473af6133bc8c1033953baea90012e2878afa07e842f8b47a328ca9df0d21b58ace0fa8e7e501a5b03313764c81e2786e9489fdfe741521bd4fe299548e89bab19e8847ab274d0273f70f52e71e9003d42a7276521750e5c0792ee01cea2be884920f52075dcd02e9e25c8307dd499764fc029717c2ae5178607d17a730978a8896b6bb3b97b47cac98aba15ab24e1bfbefc5a2f8e2ac0c4eef44b26917de5e7d8b7330fca531689569fbe31003b760c6f4bf17460eb51d21c11b4cb8ac3bb28ba7e0c16d35104d92b1738e84b31cd27408d095984d8d0b20e0386e4e4670f34d0e8a0314500df98a568303486dac06ee4c6b14e1747062c34af8ae21b715a30e4654806717a334660155b8ef0d713e7cd2d0ab0386016b90eaaf8468e75bdedb81aa9f3467a86e012916afc5ed65ee4542016b22a6926c58962decf0319b73397e000a8ac83245564e5ba5adae8e0c76eb64bc4a82e05f9b376185aa44aa9ae831f3b2338badaff0436c57c38e9f3242aa9c9f7c00807a9ac8a97ed812c5ca69767766f87ab3711cfd478f6f60f9218c32a1c5d9d7b5bac1c1093b399c46f3270e26f035fee1e5b2c9680298b570a2db6fc8f2ed1c5b9eb65c8b915378db43893c9f4ad7026c4867f04e286d26c70e52fbfbd0420c4fddc0179675d2b2a5b7a7a3bc325967566662192b93e1fbec87f90e4861809e84e5a691bb1aed7b03797036c668fd07aea5d5586d1ed72df9fce56a6c599bff50a70086e689fe0d102e078358e4ebcf70746e7b86ba97ef46eda5927fcc5bd63564794ba207b1d85a2b38ec7a93e84768962ac23cadd9e4d66daf8f9772ffdf311a1d28fcd2187b8a5f83b03c64dc49660f630303ca5d8e37e4169dfdbddf490dd8f226b29774d95082314ff6112ae77869e72886c7a93bee730897b7d38ceb673d4030283a248b66c62c9554e3236655486c214baed7631a301fe780d283adb6fede12e43e848f81f16b36f97149263fa6bf54484c201f51665e2532f6b29d4037a19bb798d5d73aba460e78794afd7f3dc2efe998eacc597a27ae8c7d0378a6aa42dbbd2606b9a9f0045adc22ca004ac27a7e0b87d282c2102797566e215a456cd34e754c67258a067db1a6af16ee8dd50a863da3939ea8f26e89c5e87c3a35dfbe08a98c0f2a45b297609ae574173d9cd07955814ba24fd0810b686a6a6487a34bdadb76cbe8d7a100e29eb66a4d2ab72df6738d15092f519d8cd1ff5724e359d2cebc2ace815c4c11012aefe433e176b394315c6ff6b31d745b65de56fd842c78de07a1b22652fcd11a340caaf56626a999625d32d762c81e097f4d548d94eb075849beeed2d57c40ff9a545371ce9bd9f42caea334101a01afb0a73bfce8fa0c6ba88e9c159f8009701773f2b9d79f48bb793c04fedf8278efc1a54c1f77a1f8ac4e83e784054e76160e05af8b06e565a5eef9b06e5623f5c0dca6f2c741de8e71241d94055e0115056200cc5a5de25c4cc3a7507e3b153bddcd89bbd9faa0e13c30c6aa4f3b8b28e7436b0564625c15e7425ca2e1dfcdab8a721d5a01314e23358e991ae4eaee313c8efe723b19a22ea8f857667afd92267cca94bc82d6bd73f4a935c2f32d79dbff17f9e54b463911d81d80b3c9d98d45e7a93c3b6198ea8b8223f2223950196950dcd4f5f4d81423d61c682c040b2748e57dd3e51b207b4bb1658fa013f1f6ffcffb5a3df119753e65619a5dca4e507f510360721e37654b76771814fba673e1c8ef24ebcf91f2f7d08db30da1a1b0bf3300a66d992072f15daddfb5d08a08942f14e854dc29c3029f6c27968118aa2d23b528148a6e70f2438faacb3c4ce494dbeef03508206826ca8b0bada57796f4a4cace53a1339b41331dae0c6cd3f620ec58d04dfdb03d0710da8cbc876ba222b16ede82ec4f8839d42d8d92f4e67f804baf44790c00918f7e231d6b79016cccdb2efeb7858e1e9e4a1eaa67ce4bb608790b09894b06bd0803684ef706c0ccdea713ea7ee376d9d6c9f676efecc91ea317cccfebfe465edf03278410fb011e5fbf8d50192e98bc0f65aa4a8615e44660d3e047e2703d60f7a6d08d468611fc0b1a0f16d3293842c80a3fa7de450ef0ae47a084763780da1d7e9755b80fbb07ec7304d1c19a7f6dd3c2878ecbeb46706d9939922b92b3390dd918a11eedccee7188a65503c983b8804acec6bced9dfccde579891a1a884a4000adb864d8f9be54657d653713184a81225a83f314b07e32fad554ae49697d5cd9927761fb78eae1e8571efffc50072b44a3d229e07cd8cc57751a33537e66ddd2e4950793b39d471821a8bb26943e0307d924e82d3adb7fb04dfbbc1b1b832643d84362f465a8ba7bb8543ab793caea761c9986b845aa2ae3d99604185bc12c25019d5a981812348c662cae1795aacd0eea8609ea2dfaa0e772e9aea92d2d654305ab6a0068ad1475fe14f733483b03e768562e563739a412f4d3eff2ae6c19883681e3b22432943b32d9ebc6941674deb3920c52624605ad196bf1f8146689872672ddba241100425d7b73d8ce99f141de338f94e3e6e1a9bd8d6ccc8dc87e585ea8120121308ab58517549e87e8d9e358f7c653af923c2b56a0ab756afa52c2fc5b1133407ff0d088914f04adde7d8b9a840156135b5991dff05165e34974d92702d93d7027d56a6fe2a9004c05446ccb7283f2994cc064cbe6850dc82c9865738e9ee7bd205a50ae83128f007bb1b6e5f330fdb634e823fbb09c279609e9819df52bfd3214635c80c4fcfd47672cd7dcb05a7ffe0bb71867e7061764cb68fed668b00335d6d011be76c3545c4ffb3d54810fae5c498a29ead7fbf6d0c4e707308ad95103f9b9bcfd3e3a66c8cc66e506a650a9a2f55de7724254943e076a0aae77969219f0df9f7781278b9a7cf9960fb6ec69d05e819b3b448910a59f1eb3307135b469dce550594709cd9bd7e2ae8defb1526dba97db70b04c2d361f468a3193fd57d0fd328117d05bbbfed2a6d3ae4a555c332dc38fd74daaa6a8b3b55624836e41d8aad26be0982de48a98f93153b27ccb597b8f68f798789a9d46d84cb72ef3cebc064e428613757eb75c86f535b3dfb13f7abb8bd9216e70f04c67da84b6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651584b9a04a9fd73cde3a56904b09f6ae9f6a4bdcb0bab6c1e5b8e7e0eb5c8bc1d130cea0f4a6be6e364a28021fa476893e87e779022b6cf983dcb394fa936a2245cedf379642716df1a932d899e56a9d42ac668e783a910fa39284ec7ab00f08918acf9119f9e964cfea71404064417aa574c0416acfdbadca8ba43895bfff699cedc1603f781b4b7c353724019562a947afc7e7c30ffe6d9857346aaee04143e19d8429e486003243387444b718ddf52bf372f542a95e1280c4a54299d13e3879b8e479925aaa84368b47a69f9c1fe7598f0d0f5fa405ef3829299e970a8822e1885aa33e7eb400d538d335ab97b746bca8da82350e3d52a9833f010d9b998af92b54a67f6d906d12fdf22d64db5902452071bfc8fa65fa010d2a8ec2a1b8f3f38fe4c37fc95cdc46a8ccb9743534278d225a5ce233a15d503158e1db6e9d016db93b240aba04afdd7ed2f8f909f32d478b149569b768c13c4f9f7bc14fd5da12bec4692dd6119bb35693bc0ba09cca16c496164bf598d24e5fa641ca59d4b283a60b2a3d30f365014f6c8d79f0b3d878a5cff8f0ef98e48b5864c9e0a450fcc3467e19a3761ff916ff1e2a89f61bb73080cab649a91ad197fa3c3b17c6859b57f49a845fadf994fd36f575724226e32866725d8f641bbf052bcb41c96c6b7dfbb13324b10a801ae1314373b77b6cfc61580c46bfaef27b0b0446801d054be7f1e33266bbc267c09c6aba0c3b81ad54da83c0b627503d9462b75249569c8b97b6da662c18e2269b37ae6eb3e07e995d92466a990b3f8856bbe83a478a7f8725b49285b479e1cb89335af647463a4892216851668daeaadaffb0bb37d8dd651c509c3743274eaf7a2a51a0e1777fd21ef8a1555f625d5f21823aaf317e36369bd5c4976ff3c848256df750c421c9145f64a59a62218ae70d4684935b63ac3ff6f4a96aeb2910993aa02dffa434ee1ce52cc899089eac0c142a6d2ff99cec8107649c42b61a32e9e4b0541635191007ba47803c1c351ff2302104f39c4d5dd1614175cef07ca15cbd0a774dfbb79e897bcce54c4f49124d0abb171159eed866101f8bc4782c167ad4332e04d659c071fc7cfa8530854f8e6e93f21bc8152e672ee134b93e64eebe550f35e53691d1ea6993ad2158006191f1e2973efc194ca0ab66fc174758f0226dc531fb265a560e5e38a4225c01b2bc362af73af9cf446491578ecfd176663c471c60a613ad7a119659ee68c43a5a08cc7c737c58447668644f2444fdd978bda86c60bbfabd0098e7d29746440da19e9ec5c8cba161f299fb9a5a83ffe05ef8433746c7eb6e174b4f245bdd63973c76c73befd9b7230fc8f115813e6651f1cc7445c5622af346dacd00bd0d6d47f204caa07f54d4c8c3a6a1ffccf161038bb7e2184821427e2bc8fe3c8cfddd731c8d98b4e6386d70a6d9040a8a4993061e72773d1a82dadc8c9e0d0927d990916ecc59118eacb586294277fc8f63de585929d522e13f8e27331a96499ff0f1daa43e30176853767fa3362209f69dd13004e6e6f7e898182dcbd2c1cea23b682caf8d9139d4f0baa12592284c3569031f77d4cb3df039991d2d032f5fc61b035a0eb2f70f7cf1177be908cb8eaea47baccaa254a1533cf91f52c586e5648d1271cefe9633f39cdfce209e09530056123ddafaae6c8cf7cdc4a5ee592ba291292adaff17a97ed3de2ee575af0ed4b4705c90b30f42902f7f5591aebc1e5e9a25b103c16aadbae2682df90eddca8610025bcd0254fc55833850ce6b1121defec4a9e502ec46af0293dd87f90fabe7e8eb0d758cf4a6c2c6b4ea6bd2183ba734471c82f41105179d222f34b40dc1df7d4370be2d0b1c985ced4311a85479e7d5b520fad7ad6a30fdf272f3c6140487ce28a9b490c65e3976f35e51d1e5d3147a1fc418c8fb9b98dbb032af3193f1196689423632d92fa81302e998faa9b9964d0a92a7159bfb362749ae88dfcdbb7e3b87ea009a4fa76880b817aa55df06b1d2327b01c387a0b926d8ba31a32a3696402c64e0a02efbfc32af918129a4e2184833c3a763c9681092db63fa29ff811de4fb7f34211d7a05c5d46a890e5e058b18522565e89649c9e397b3c4a2a35065fc996469416425e3e59cf69fb886b9f89785c9c4bdd8c4c224bb826c0c2fe2928a66d78432d240c1aadee7acc061727d3ca44db2ba819cd401cb9404751d1f48f23184f3aca22245791be2ffe23c25a811adae614effe498d6f0c5cb0d2cdc6714b3f23a1c7858ffd43dc1d1be0f760cf28d2d3e64d6310854d6d54471d71e8a8d7f77f3098378ba1e5122eabbe0cb9d224ed4904429b2b275f5bdc45bd8eb71f9d243e5b7e55161ff23e35434e83cb38c3873c037f255995350869d8c06ddb813aef18bdafd7a280d92f25b5719a242000ebf0a89ca4589894f6aaf04e0288534f83560c53c82e472ae8ce54c5dd9812a6964174192b857f8144a77af9c6a86d4d301212ea8137352c14a002fbfcfa6c56d4df69fc9c235ae58b7fb11df3bfc2f087a051095beb722f58d1d1c6b644f989ebaf4bdf648b8addcc90ce1d8d080acd5ca2e6499bdac856177d8b121b77e7998ed394b47a5e6badbedb0e63207d84190b721b7a40037df1bcf45bfee6c953aa2dd319498200365a5518ef7815c71bdc88c1d8c317d9c1174c401cec7eef84e49fd2e13b60210d58cece2b3ef17b0fc0253c68c125cc18e028311623ba3f0ed6126e71e0af814fb5137bd5653b6fd923ce03df31addb6728df0932d710f876b87e4ec88b05fc406b2cb5ebf3a7097068a0a3edf583d44f7a52e042fecb083bc6bf8927b503fe23134d1fca2d7238e894606860ac772a3d371643acac90dd864107a046dcace6e1089135612040ed33ca50ccd15358813ea65077abf2da58b84891ecebd6856ec6da84e1aa05007db848d95b27246565d7fa46b2f4515fa38c33b0c190b343ac27e18779082eed3a54eb129c4e889f52779cfebf26b915227724e16bad10f4a2037128bc44c341f90418332f8037c34cf4e781a01bb9421922b747ac89ab2a8a3378709ed1c401e8445c2272d26ebd9b585127fb57d5d183e52b2e17861336cf9e10e34073a97a4880794a507bdc3c9dc553735787357eb8f726cd7ac0b56559fdbb1e3758ac97fda1c37419da24450c62eb6dad5e479608bbd4ed4296c6ebf812b6a57c379c796a5a6baa3045f715c0a7894427d314ef37f454c83cc888b165aca2a3eae11a768834b6b358bd399fed1dd302fd79ebf951527a448669c516cc2d0f63f7f968d138c3af179d42f02d3c0f627eb7dae2f4489baec3626c85116dc23072b4d9c59f35564137816b4ff91fa4988cca72f0583ccf80a5ce91edb8642758f49118ddd7cb598f92cde96e8cc7873c34c1d50988346307c7ad359a5fb1e2a8f21b54fc1f800d83a5db56f7d3c459500429346de68a1a049a610c86dcc5a7dd737a0b1525791d8712d4de313bf3e68fca59a38a43145074bd0235a4e599da5f58197d353bfa8c9432c709eb3a6a8b533930531b16388e0d9df67c46dd2199188be257c065c55091a1006ee6f8f93677f3f9ba7a7e0989b993fdd53a97b92b7a33d4ab0cda47ed4a26bb9e6f0ce3ce05f9cc563231e020fb655e76ac7276febba742c99f5928f17c2f5788f0f9bb4c3021dfcbe7b86cd1396aac2828455064d7cd2c56cab823e2e1b56e6f41db25ace49d092eddbb0913c13f9c8783bf986e7de6fc5f2db09ca04c6837730c7ecaed255c6147b6974a29fdd2e3b7140e3397fee402c9d478d879aeabb03f0f3362f5b5a2ee4d8b92aa97a0dc8c8465d0375d8e0eb3db05589a86dea8ee32ba2b040048f0ec7ed391691a1cf93c439737fee4445fc2750378f3c3dcef47310dee2ec95558e2fdcd69fbe4eed7fb4f804970c4afb7ea2f54486a6122bb870abac18656546f92efc00660503ed2ed25be1b43275cb454bf1cefe62865830ae736357dee7eb125ac93a308a7144662371d634c3ec003aca83647443cac5f8e8a324d2a8ff69722da02fdaf0f1ddcfbf836411cd5994f0c8f816fc8e5a738d6778d4afadbefd3eb830ca2168a1cd941d037f8f0889dcdbc7321b131c7bd6d6dedbef81e9162b8a6028696391a5f4d40d52e8bde21fc8f4df1396b58d6c9d125cf676a93029994d13255f14b6f7ef90fd6aab2e8d0e8297cb53d7faad0e361be240b127d5d275fb84759ab13a7ad8be346518eb425d471b2600b78fbe5218878aa6997cdee9baa4eb483c7d979162ab1418ba5d4de7c2609837607bfd9e24ba0aedecd13d0253aa10c91fa13cce0ea826bd9c4964e416f9d0ce064e8abe60dfdee2845d2c393196cc17f7f5cafcd2fe059b217ff9b97ee17b779401e701c971a99a378635cb6fa1389d6aa5ae5027d924743a3a4c68919efb780e4bae0b725df4e1b1d4f9a5c3efee2beecb428d4ea0b1232e073350c30d86ca6197b5d079bf1c9d0fcb1e705d2b54951027000245ba068b7c6d9af593e8ef64834d47489a673df93960b90c54ba259150e989c941fef9de78403bd7e8e6961811c5e824f43cf71e6a48ecb0c65f14d168fcab6eca03d7ce316f8b3a40c0cf4a5baab0ca4d339aef0b5d027c75daa258941cd6f6ad7260c1bc5c1ffc463b0be9a40ac7f96f90d269b60c8c583e624e0c11aa951a4542df0684fa5c699a5416067d5e2e26d9e28b90bc50b6f9ad2365f31cab40ec0e58d824e047914b97cab112ac35b49ec606d981c0c3083e013be7fdcaa80a2686bda1c58386aee9507801aec128641ac6c2fb6346aeef8ac2e86e122621b7e95131dbb576d6975ff0c12bd7990c3c94a19eb85efe8b682bb526e5ab6645767b9fc86cfe92101773fa7348076ec58c1991cb182a949b52178a353299114d4c20e389d4dee383d6750cad56fe52591635a8dc94af1208782bda71108f03d9a14a41310c4dae567c7dcb22f1f42c6475319cea9701834164fbe9418a9eb575b516e5c64b3ec3952fa51ba06685f0d79378e8e5e8c0b61c662f0dd48b1a9ad44ca7f94bca32ab8affc2d7f1f48301a491d0d61fb47a59e14cb84688f5d6b6a68052d4850d1490da9a0e764565c4c57f06ca7e23341dddf122499ac666eb2c9fb4cc9190ef9c7cfd595f49a12b383706b7b1424d77102738eaf01ed34326776776f3d69ca39b73ee4706e7bef37ab288554bb51e9050fd7d86540db0b550f463a17485483d5932a3962ba3be881298d314d25ff8716e670d2938f6cdb250fc4a05ee338c0977900498d1fe2b194b1e47b6b674ec87f43ca2d4dc70103395ed85b20574c5fe4c62c4fe092262cb3b06ec0fa3fb7eede7f0c9e7461835c73160998b03c3249eb465667b1363875db308e837ec4843a20773df183663ca92b1af0dbf790cf3d3ba94c95668fe939eaf2cba82006755730e94e86f3ef600bba835371552ec4258cd64920bc19e6618bbdfde8c600bfb842c054040fc9792403147d48ada0fad576b0535312225418dcb0c82334a3f14dcfbbc9fde1200e3ab2d7f3e3a993182af99213c0e00b4e4dd3581bdaced70e7116a7916e62bcf0a78668112d43d23291aa30b3acb4bab4d4bda8d2824192bffc4f7eaa5b8aa056f178b6ddeaedb7e38af6197ec370691a6e6819e6b4080aa8f51e412d504656ee70b782995848b1e7e5df415e86a646ce2c86fc126a21fc4b00d3f4927700c53615b79a72da6124854014aa16f6f8e05e316003bf4542bda9a03705c456d22c668f9d5f8cda0231785bac0986001de9d41aeb2b8b21f4996483d7bf61dac2618a42c329fd514eec5c80de4604269cd1f1f74cffba98acd54dbbacf938dd42c9564b145c5dcf21f8aaed19d238f2ee3519489898ad2bb00f235bfb6b34ed913871fc1ee5af2a832b01ad5be44ada3b1d53df21ea0145611688e1ecfc4579f5cd951a04aa8a5a1865b93fddff38aa6bd6f67b43680efa558192feb644672003e95ff12e9d7616108f4bebdccd422e0a46d4275ffbff3a7bba3b9ca3cf10a4202f71e0a24fb98874ea983b7e98de2dc70d3802fe2f9ac074335b1c002f429ed56645d532d8436cd9d068100d536416fd2b48796dd5bfea7048362d70ad1217f17090d388bcad7f7758079e1d0ec27442731e9ca09c5a9033860039617da07628933dd0dd5c8c98956ff072840ff2128749d747c70db6ece43f1a54d239eebac6b380b71437307bb78741da5f310bb10431164010b0729b55c1686427dfd6ce56e5a24c38d4c64f81f3b2ef7dda5a0e524e6302f2577af7bdc9f898ba5930528bb3380b8b57e60ab77ac5e6df651a89a7ce535fc5f615aa057624745d1be6611c591fa3c4ab2f6c235904063f7df82c374fede0ab2cfb983f4a63455889234e41716baebd9fa6d797ee58fa56bdb5b02e50594e1cf0c43744a26e0ccd230545d79656e6ee161f4a27b3acc65e472f89281f4c12bfe8f3c412fd5abc2c6593b6b8ac71c17dbaf42e639dd4b869792418fded79484e56b758531293cab094cf0895c922f57780ac7a27c7e92d6a8c1b859833ab9753b745bfb17c3e84430db225ad04abb9fd5fe5ab337773c3226c2934809fef9b2d9a6e981042508330551f0e7a248e1e546c42d79449ed43fbef745aae18f3d9745cb1d95669c521c1e1375a161209918ea32cb8cabee764637e7071f3b0d0fffab98672ea5bc3ff0e2418db5a76bb7aa28bc5095c487d12c42be09c7ec7c8030b54826af316d3782353d709c62b16d65e65af2d1f17a2655e46674a0bf82f38f2f53bfb8add3b43bd66041a346c9cb65e8d73d53d077c0fee758215942aea0af363b33f562b0614a186afa1cc5479fb797bff0957b49d1b5ca904307568d147e598869d72d9e9516cbebf153b427511c0b10c9792c62be54c51af4bf6a6fd90403aedbb67669e5f47ee010c2369d716774be289391ea80e07d756ba2669a6825ab425430cb9ca3ac1921997db50c424d7a6b9b829dbb3a4a13de16227ad16d62f820bcedd88aba5368bf9fc4f6206f186572898c0fe88509d87ec32f18108490f7404d856448393ae8440668b090146419e3b93008568800432213455cad46c504d51906674c602f1ef66d5a4caf76ec1ca319a80eddc66f438cc7aee775120210515b19107a01777e10cf23a7915bf2ec11f9e3d3defa70b77291670c5cb99d46bd5d89ba4a7019297cecb1014e78882ce25822dad5fa6b9671431bbf83539e7bf1537ce0b152a3e618c0b1285ce2955531e28c508b561b2e11757ad4c71e86e4f56b2f24d65acc5acacc3601f3d69d5622867eeb72d39c6b9860df450096f5fab66693662ca3e6e36d9e0ce8c486856243a9249c155dc6be52f09415d848af3444603e3e3e94e39b188641df7f548265c9f2b0741f275eb2210cbfa22d522b9cf1bd89424a644b97d1471a175cc7dc1a26a0f180dbf97316b8344a48d2063bafda91af0826a37b8e97c64317fefe2ad1c8bf7e80b78981ac14589c11daba097540122105e6e9a99554343f50ca6b9e6ab4a3ad3f005b5ec04c421e84e69feff6003c1e8492024595e31483ae9117cdaafc8b7db08d732618594c92ddcd2a0c84104291dc5e997ed9b4a149d99522ab2245bf225d848d790824e4630899e3e1dfe6f12e4afec92a1952fcc0d3a5ac8b02ef1c98b4735e4e478d34e0837779dbc3c32c7806e3922561605117e632eee86e250f64033a51b27d2e6fb36f9bea0dfa9931a0f76e4c98f142bedd160653a9b1072b258dcd9d5f86cf1c76f14afd79eef7e17709cbf259f94b7fd0cbd136d0ed5c5482fedbfecd845c0dc52b2fa674d51f26826b538ea62dfa20b4d8a41bd26c0b056b34eb1753281910cdc1c149c14da6cfa5d062fde59dde7f29c1a6a72ff8670e4ff6a7260f836ed9527fb64e8b0e925b0c83269fe58b07b5950bdf8cd209f5939713c5e24ef439b2020131c1fa10af61c4afcc81d49909d0a37441b9861bcf4babf7f490bf3c397298c4a475d1614be8a3897595f83cf1b96d56390dfda29304b1eef5acdcad0a15ab4a13c61ac03a9e08ca433aaf9329710c683a7faf2a613fa721c7ca98552a28b357277c30843222db2d54e033fc99a94c6c59111fdf18f54c287cf4259a00ced3653bf01a9f1941abed36a6bcb6f806662e0c82b94ccd760835ae922a81d0b01d7ae7987233e61320228d5393431362d430c8860c020bf2a43444fc05ec36b02d428a02669370ec6bb036dcfecbd3bba4acbb7d65e59a4fbd5580964e60e74476f6662cc58c5dfe8aabaa001e6ea5eee885c69523eba01118381dc608f4c2671e36f1abfcccea32fe08755bf203b6408fa4d982f729d571984902adae18fa71a15b363792a9e013b06a30def5db262d0ec542d933a02c6ed1d9f09d5240f7fbc23d4bcc1f4745f6ad256d37665a57888e9746d81d39edbf4cbecd2a5f4c219657b85885ee35b806685fb0e50e544ad151952ce1d5eb0fcaa05e1dffbb1bb82e407bd99cb5cb4b793f39ff10aa5f1c9e5c158606ec3eec64d60e4a7bcd228a8a2fe5807d68a4952cb29906c0fd627df3019a234f82ce9974c95cfcacbe6b9d6de25b5b1d425b985027967128fc1395e009acb2becb9f339a96345749ad459ff4a8fa749aa47b33ab7aa1b6a79e6d9cb73e46675235eb0a8b1b82ca8c5ec91b694f09c826243310558e062554423cb1d837bb4c06779fa47d7c88e1a5e71feb2c707dee677a5e07baca4001ed4ee9e2c165be2824291dd3f397edb022b03c5b49246a22eb669e3525c92a6faffd400dd53b66973343aed34c5b99480ee0980a8f611b5f5389869ec6b0f7020cc3f73bfed687c06ab5f23c3757c730309240d7840bbc20c4d09b9993a0706890b76d543d37e1c4741f44751ca3549de3f1d721c0a196424d1d2c62edec2172c155d522995c75776424d3ba9b4310ffc50a51863f5895829ec2909a0997d91d18cf8044b0722fa6487a27ab6cc0eb88b35102338c65a62427cc3cb212c045d2c659cfcb111becf2b71b9a2a6e93714b15132e7261dd821966e8dfcc09d86a65218801844f374afea830dc4107d38effe63ab01cc1d6505c8771fa0387a2726fe96094c24d048638e2ba9def73f70e0f0fea802cb733151c652e8c3f512cd5ec8d7c369c092075fbaae060f2ba8a1f0b7f1c6f505d908e5a302592446cb26737b57e038242b8daf06d6feeb2c9a4031654e7d9a8b07fcb529fd3c77bcea6c4fa97027fc292d32b5b834606412e1ab5a4cd25ab3af24db414cc35b6aaf4e2800dc1c3c655b0bbdc2a1501070f96a7839e5ca3653b4596d8210f725fc3f24fbf8e506953d9c2077dfdab76046dda37945acafa2326e00524321283b7d8de962c6babb6a4826ea24b8f6abbe18cf8cfc322f75f08b11eb612bdbbd6dbaad2314e3523ce196a4c7b7ed01a290526ca828b3886b36e316478aec8199cdd4c40dccd17e14c5b8a3743166a41bebf0099f2d38aa1817dfc0c54b04164992416718eed4563357bdea26e952ceacf2a4ce6cebccc3c188873e0b4628e90d2474632753bbe7373db04a528f06f04240f362cb9ca48e67a236309f82602cc62765aaba724d07f542fa0f42c537e8a772203e400f92f27f36f8cba341dfdb613d9bd81857f8fe530fac2c593d92b5138d92c36570d25f70b19dc4c1ea3f2cb60bd9d2cea7a80a3d2e624ef3c1aa8ac466a7ab494b123e4dc026cb1b4528df1593f58971b3f9f6f1b31083eb8b6c40365957e0b3c89b8efd120c6fd16e93915f989368492a44b759a47847e4190409e62b82ece30d1aa63f8a553a70829c7c60a3d627e7154a390b83b1ebe01156b00ba2b1153b924bc9fbde0e01c35b09fac0ab9fbf4e86c5a0cd7fe094a15da00d28532ed2eba4243893aaa7708d6e70519d25bcb2985bf2596086c4cdd020bf330f45bc5251b20723e71a1ff9ea6ba65b0548023690f7f3553bd483a338f45902d4a53dd319234012016748fb642eaf36265ba94010b3d544ebf355322a32836c4e7ffb140faf971018bda3e5352012db80b80fa10a8d287a4c6772f6dc258d933e8404d22387ad40d8a92ba731812f4d7c9f0cc7f02a70b496ef969a56f843312d0d57f71a2f36753ab37dee4059404eb8755e3831a6c3900bce4b25a6cc86a722c574fbf118ab60f5d93cd8dccb884cb06e5501eb332a69b5d90ca50cb328a4d3cd0a62fbf943a8ac87cedaa1b062dee70dc185f58e41e6f6930f77528485f715f5dcb2bac5d49f4d06e1501aedf675066a688af26c84448c114d1e8120ea68584d728067ec03ad23c75bd6caa3abe9c54d92c53924aaed4e2ed70b414e9b5c57f1ae35fb099856e24e7a9414c1d4c26f4b486d238c6304510ee3c4dd18bbbb8ba195dc9b63d0f357a33dc87373822fec9443a814606f44fa13324dce0e099921077b83edc9f19849dd0917e943dc721ae520bf2a1b15d29b8f12775ebc14b5be224c65f369e3d305f03fff87fb5e91b45ecbaea7571905ad14407d079898e7883b3e334880ab16a5bbed13d38e271357f03184d31fd55f66e6e1f1a9d49ce029841ba7672e103de0b0a48c3b71a8d626c578da391c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bc84e8db3ab29823469574c9b596e2e070b258640b33d402da3213cf53c7550243e3f5faca65791ccb4f456ad51adc0e1589df67d0ab448d486155b8b26be4dcbc2bddaf70383a6338fd234a532516647f6b6967a51d3b7f65fcc60af45f2d46028cded491058ead42e78f898a70468e9112d7085fb21792fc74ebaa7afe80267b33fb1e62fd1561b94ab2c94148f94e2a898d31c37ad5fdabbd3754dfba6e48db7979d808acdfa2b85ad4e4637d1bbbfb5add0f67aa31f709da8856ae5ec34235b5f9a170558b9ea06b9ab63b0014a800aa41c716a851bc9e4460348db50bd4c18293719c2f60a2442fb5eea3d33efee7b1134f3328161e67ca307316d44160e8e1257a4499f57d0e098429a13048a105d7d34bde433e8610ad4aaa237bff7271914e526b96564e7a3c210c88192a59f3bcdbf558a7a8e6a732472aaf6020d30821cd3a04a5f49ff7ed41549faf9ac8ce82a32650e1cab5a4bea50f749d51855f76d7a2ba7ecfa0026ef50d9002c1f455fb814ba024122311757feb22ab7c2723a1cd5efe2a55848b347f7b62aac34ff7369b0cb479714e97fc943a136b20fc1149e900e56a9e667b1ea9d2691ae9ec72a20e722d5a4c87ca9d51526d1a37b4dc0638abd12d1f58cb6e02d096514d8f4de73c8b989052e3eec5f7a7fc72a11cf6ac2cf20022b862b312fe4e4dce760ea7d75ec8f01e595966154033f30783402e9eeccee22712a78a8646ad493777177692910aa01e5f402b47d76c27f43b4824b03beb9996c39dec280b3e0ec0ab390c7e4cc00df6314984cec4b76750627afe99eeb998d02dafd64b9505dd39d889d2f0217095963e5f7e38aac3ac3f5531e285808609db23be1d1ff8d4a5999666b984b6bd0a865ef8e195343c8dc6a2fc3b34385ee72f83ec049991f6999fdcb8e1efebe92a71f2f9c788c6bc6b2ddd84658b1ca4a87c3fec78396311eb498d46d3a459ccc9dc5b8362597f9d67abc3ba900afd8bda4bd20d55d22d371f87bd32898b58eccb42dbc524c8294f00fbacc62fffa1e6e7c6b6707427f2121f9437811e72a7ac0da7563d81b0275429e4e15e5d80b67392bb1cf4a75ba0e4ff27c7eaf72681f41c5b94076ae263c0fa311547a1610fd4240ed106c5c5529ba611dc1155a4541562e4c4fff585ccfa3a425516ff917cab5ebd4d5b219795887362628789e9e996de906eeba05ed747c4a7c532b092be5e7c14750f6ef6dac5983ffab22709d942ecf807869653657e89a98eb298e2e24d3ae263fe4f25ac168a715d476c85d532eba1a43448019ab43754a5c0f72c620dc0856dd7bfdfea72ac7fa7d2ce9705c4ff0c6e91106f47dde089cd6796a8c6c5e585cea5d0744a53c28efa2b678e98817411e583191d64ad5c3896a9881cd6e642b104ceaba79a47ffada4851caa7abdfd8803597a4b4c8f38e278d6affd8934ef17c495cfd3382cd36504f10f3eed146539caea34aca98987dd6f6a2ab44f20346477238e09335fe9ecac88f385625b2573710a88a48fa5da761d39a340974ba8bbfb6f1d5acdab9d8b2c7ceb86cd60ca7da608ea7e79c1659346cf59375847d48504b920364c08bf17d465c7eebc57aeefaa0f3312880108b954892aa76b5b70886e1ead98751950a4af8d5446481c7141c3351cedc596a3b132d471244df56c2a3c28a7a3e7d65762cb431a8e4c093401ad9f50f8366e6b24e9d0e6adaf1ccd219adb4e628eef8d033872c41ddb2a5436b91a8112df55813b5ad6bf96fe9a3b5b1860ee2e41f35873fc8141da0a6753120d91ebf1c4fc8b3b58d4bdbbf12449b1c48331d6e36ec303cdaeb58303eba7e478a2249bd6cf81c5e11018463ab8f5a4fca2813ce0eabef7d9dfb310060fc7b0267611463c81ec58753450ab7e7f58c7b3c7c286befcd33fc317c55c4401c1a1dc3617ffb7cd049998449927387e70d519b7d07ac617f193409e6a965ff20953978269c3e73dfeac852d3dd7a09a058d6a79fda1133992caa3c71ab2a85f857a05308b027b017d085d73fa9971e87e527e23299766a1079164e70d1ed7750ef7e25a976e69aee6e35e1e46802b958157043aab9f5b8132a250fa918cdbc69a8e1b191c06c2c433c10342e6f6e7422635058914c099ed0a435a8611e141b46053886315b8908a4ab6a0823aa1dae7329656270d54b9c9636205297171cf4e63c4db4e810078d93d765f78f224562a163a5d5770393bb54b666737a0a13fcd5e8024cf8e25973f36925e92823d81b4d6260365454dc01dab3a02b4190448549996fd8ce52a0cdac9ba702bc485d4a62d48a26650fc11c0eeb60232787508ecae3395529c41e86c024c40cd153474d8698f035e8fd450e41bfa57fedf841bcdf891e077c1c5893d7c5c8dcf0ae417f8d141f101a94ca97a859fca42e92f9db94cf11b70204cdefe9ca4e51934a1225d0820b59ab2209c7f1dab9df65e1bc80a3e9a862ec63f73cd38bc4b7794eec4c67691bdf18d1cf601da22bf100ea9883f7c079be1b45647b2685cabbc5f5ac0f43fc96ebbad1e3ce6c7ffe25e72387d0ec9f3efc81de04e8c6c1b3a900aa7aa9703394def15d532d649064b40ddd3fc1d71287bd5985667356034f8a39576b3492e9d6c4e1f685e159b40085473acf9bd1c9108d8b4471a62ef613d67fcf44b73f22ef17a03c9d10c310449479f710f7ffc66784d065beeea0977b451c98422f629da448a54bdc442b1e19a55e8bac544f6122b1b7d185ac3bd4340f93c3063dd337940b530c39c443d17f15f1bb7052402ea380961ee19a83271eb9c53341996a55ef77ba58a696e3cfd7c37b1b992047985be1a7bd26b053571d0dc84b1265a97d03614c2d45c0df3b61d09c790336d24226ba600c821d29f8d694bcdde887fe9f0c0fae0ee60ccbe55a520eba4ecfc7c9b734612dc9ca777571e63ea32b1738677fab634dd3f0e07d625b045142142d3e204ff5f937883c0fc6c9855a971421e7bdc38bca00cc9ad32f6a556ab243612d3964e30574bde4ed1abf7352fa1dd7ac0bdf387bcec1782ed6d1012886e81fd3e919a53c785cf0c28aae1248766ae9653ac43632c4f6d3123c240c6014ef90111248952452c5a8f19c98e1a97e9d856d7470df70046359900e01b3ac906fe305277d802781a7a02e5782bfea2fd290cbda2d367110ba39c1e3260a1b41d88126b921e1c34f8578a5715303d80d227de9aedf5337b602165972dc9676e40b9b118f8e797606271d736e42b518f74ae72a3333a847a79299b4de1db49f426260bdd5454fdf18b56daef690264e7e675b856fdade54fef5aac36c52657927c1afd0868c13b7ec29be409913cff2b9f357c7857b83321b3380396de09abe5517926ab23b40c68f8c971e6c357ac81e6694b5d23d2674711acc817b1dc6a1e9cab51bedb61eddd5b0d6502fc766505315e2993bf6cb0136f8fdeb9b9cb3ba5bae4d1a95275c1a78b159ee15bf47fc7ca1af3be779ef0c7a3f45e8b66b7c0f03cc8870272ddacef8efc3e9e1867e2ad2958a3d48800a8352a4a3de143f93254389db5330346705d7566c2a24e2a5c4eb5cc432d3e55e8aac37fe77903cf17a13e9e5da6e52febfb491528370980624db7427366cc841aba23a6680aaa39ee760f9c857541e6a6bcbf2a66e8197078b70361f465038bf9a1e44be41a48facc4c62972d2a2303dcf07f82b7ee979a31e292ad84009b529ff0512f13c9cf14ba87f5da317d0e3b468e9ab258fcc87c87c6cf0aaf7db05345edd6309e451704e85a52a2942736e69d0ff9a4ab7b35450ea9162286711d4906a5ce3ea7d3f79c95c93d772d10a39aaca284d118f31857213d9dfce4e0f2d80830c0816fa8c6850bb1f0a2a117879185361d7ca996ec4f94e21bfcf117e396de524f3e3778540bc06673decfc447b8536574bf8166febc99b876ffe55e6777e8ed486cebbcd594a307ba3d5da6e666dcb1ff95880614675aa92bc3f1dd7630ae7b84c07abdd42254b9f6961246f2f284b12e0e32265603d0df6d9b99184d8acd3b064a4bd22eb031e244d269308d4241b05d49a5ddd2d3ebad6701dc8eef502cf633d9892cf84e6c1bc2a53ef2121e8f791bf2fe36d631b5f3064c5ff47861c969c505b5d2041cc68d922bf12cfc6387d124b2ef3b22511481e07f601765930beb55e8781aa71cddc70856729453aa7350719d9cacc1e23f87b64c70b0ef52b421faf36b393f2a57889e42f59fbb16ec710fee23d770b5645160fd5194ce609b91291de4eeb49588ac272219fc701f29a2c3fc50dcdc0d2d01954a910b963313b61dc88260c7c598ab3bc79bddd57ca1d42cbf8f1f0d4b8186729ffbbeaa668550fc36e510fb3c5970804272f57c7622f51e63303ac3bf5b0ae45cb28b7c985889c39ccbe15b30c3909d093093aaeba34cd089bf87d16e07257cf21444863ec1d131a5e8a5724d02959e748919cc18bb8311d5c7452f390883f7b693d2a0b54519a6ca41f9f35443a85ca48e8481cb350851bea417ba42be4b3bffc76a7e71f1fbe9c9a8319f61a7abecbbf218c377c0ec1c5512ec379ab333cfef78a0f88bfa516e5b0dc37b2b9387107cd09c0a68454762f69d4601a500a0fbf1a5746c22efc2bda7fe595cc53263fb759eb0adf651ce221836c34c8e018a9d5cf7f11f0b49adbd2f8b844d6bc889a8a12d52f96543da3ac3d20f4f17509e76999212923d584a50626b54f4d50d0a389db3648d29371df62dc49ff938c4ad51d8e49805f266555bcf22bb261dc8a8efc0ca6f6d29aca55e110d92eaaae583d4cd784529f7998fbdff084dfc260eb1af5e1ed3a43993971a923b803bacb3cf3a493175152e8ea3af1e1862a467bd1d29add3a47f6911d651e4a526da163b8da718ff5ab6f95d7468cbd7d07b0323a75cdcbf7cd1170d185ab74e47fe508ffaa30fd847e38fa2b42bcb83cf67516db1b773c6c3d5a5cb22f425cb57d62734d1534e816c2fef0a7d30821beae76e216c251e9e55fc1db5096cd28dde7943de9858bae95b7e7032f2076cbcc2b7d934219ed0d3b29cd049ee94ec5ece7ea9f0c6fa2faf6615cfac2caa63424c72817baa90807bae132b06b21567393c8ab71827e00103f0b9cb2a6aa8e50f5260a301d36d6e2e29fe51d46f50b1a7fd7e89a790b98fe62bdae71b24981e1285ae27a8e2e4eeba9e629f477db6378aef7d68492553bf89a955b4ae84f96927035e374aafd9c7f49bc05de73089991669eab370d7a69bfa6f322134b78e67959ee7a2600efae6f37bddbe6c6aa49a068bcdcb92847dad27b4cff7b37bfaad5b7e441124e19eae304059ffe9fbe1fef5b0f153566c05ba49cbc75a057ef7f5f336a06ba58a4cce365cf207eac2ecae5abb2d9077bf252737abecc3cf30b9cbb68d66a69624eddf58e9c8d8e20f40cffc0905bbcfafb57c09571e635f3452e6a459dfa0d548658a9fb0b1837d10478c8b17c1300b42e8eb462eedfbdf85c5b7291c59a05e8bae729ca8fb7e9c32a00d8bf943f6412413f660c9807fc931294e5788ba2f184f2bf69e67703a868be8f0b7029284768f88634a6a185a37d1b4ae0d7b858837b2e23b07d9fd045d73849e5a8cfb279940ac515ca97131e703455ff844d211b281761c751ffbeb44059b32d6a8a8da2062e0a493db7cb050e3443d7f76e37ab19ddc5996828ae143c40e753f64a433b381424363dbd9ce965f84d001c686de80a04dd270d4d3e2c3a9ce3a5fd5e8c50e04280a3d3512f90759f2c4afe03dbbeb8cf183391ce2edae7bc81b62699ef006874cb0c95b8ba5ce0c5361c4e8ef358f106aff304c30acf17015144895b812b4a61b9ac841d8f4402f6484b275e18350278471fbd47981fca3a0be0e5740ec259867f4e88c716379f4fcc43dcd432904918a0e2a4e2615ec7cfc2584c202722413c8a843bc3625ed9fe76da0159d85ce5ba462c23d390f163e7b08c4c1f160e8b4989cad558d913696b06817912b730edef40ae3a1d727783ddfb5fbd0a8271d6d624253957b6209a3e2101afc2d2df082304be41b2141a6e5c38eb13df0874cf402c9cf57f6735dfcf0422e86efd775fc578d64f78bce8a0b1f367a0c7cb009935f30c13a7713b029f6ec3748334b3205c5d2ceca3abd81f032003cc90b6fb23cc284dd690d1be1c2bd3602b60891d3a52982858e275eb6a1ae5280145c34c207c556acd3eb36d771f10e13b1f3a1101c047328e40d4cf45bf7970f14d91c61811d24a852257d9bba4821db57af1b326100fe262b492fbd7f697fd86cf44b5a59c3e86d2c22608bffbd534846b9bedd97553d7a047e834249650679a7d018e9efa60eef00637439841e761b481cab5fc88fdf3c8d1d61e22005790c9b1b52da8160366b372087f3f7cb1eccc303a85a8879a10fd6cce12319c9f64b95a3367d885268d647a2ab5f43166b2d5f94516b919a55c6a03516207dec1c0e73ef454c3a52487552109cf635c1028883040af0969352b04f142c5ce8a2ac5a37531dd7b6a3557533c0ee7a25fb25eea77de284898a0e5b57066c1edcaa2292cefe1bf43960d7723c27f56b3d5054d037cf14508571a36ae42ba5f9eeda34bf5915907869bacc66ad83d2fda0ed5ca9e3b073ae8ec047d4add458669015850c248cac2f8b39f2da267264e7bef215c6ff4651b36cddef2f57453e5ab6de7ba7a7999fdc66fba3c60cf8c070dc2e0bd28c9f4cbfa049f4af736f80bfbc80d585831d544f961684a35b14a41dd40111c4274d356e9f2fffbb4eb77b0edd58a4490a34f5a6b834ae596f349ba131263b7e7318a4646c936475864fe6a14b0fcad82eabf7a355ef04ab0718a8a3cffa114c551f44a6a71b864420036885b89c998b7f47308426700b800176268b6b9cee4af3be48c003e6126cf4cab9ff061606686a373a21a7a4a61ffd7df5eb769063ff6bcc3682c5ec432757df673f9aff6c1a5e8f675790f8a6b8751d7c79f8db32b302c1d3a9b5108e24ff30c1f2e68b4801ad433b141a46e9c827c538600278e65a51f8ebeb8194c77fc99ab4c91a6fdf75c292554196b8eb006e652c7c97018db8ce3f7a21a73296bd269e6fc1c42d3d02bfb145a5e4202d6056f40562bddcab9e81e69add85439c933ccb2dee1b333181b2e174802c8cda0ce8bd936e20a418794fae6ed58c0e9b5ea91e61cedc091665bd7038d7af7cc9175e6457fd626c351aa03a5d76b86e8f090624dd7a6575c3f17994423f9d70677e3a84d2965ee6d4f70614d7c8998b741a9e9a81362a1b3f7746013f35ea2919966e3030799dfb7e263e63ed9a9a936a3775c17ddc139a2aa369d78777b53587088739a8ee9bcfe03f561541468090308e6d21db9bde1d40095d34a9e0a1513a7fabdade1309fa77f80d4f51bf8f92cd49cf74e48b80d0413fc9fe861e91c431838091e61bffe94a9a8f9b6448660dc7c3fb8ab8c6a9467c4b580fc6c588b702945a125368261312a9c40e781066b77dfd95afb2278b4a737a0ddec847b48045366688b9424a694390a111165ab4b28f2da525cffdd81f0e3624e10a52ba2f3891fffaa0ba1c650ffe4509794a404126470d811a81ddaf0464d5a8cf31b7238e75ddfa9999f975136353ac68eeb39d1a4f66a71170590e6ba91aba97ac7d039428c85fa425d6d707acf1411618a144f08549f74ac6938fdabc25e7b7a44edd8b3213fe6dfc62046da4aea5f4b85d48c09c01a994ddc9eb0c5a190416868476134b991eb66f16b224bc770cb2df36f42a33b413d36e3f02965f9a2c3bbfbca15be770786376e7b35e7c5a1c390ca07f98f358b981fa18a0a0bb6802d3a67c4d2545252e71ebfa6df775982ae70f9eb737ced39f1921263c16d261f5cb1b84dbf1a3a578fd9460cdc6122265527d34a19480ec6851cd28b0740a5535a9b45d15fe0f9fe60cfff4e8bc840a14ad0388df257375ef8c0729eeef028cd6aa863ea0cce6951d4a6adbd0052ea14349f4726ba763d366319da7e48191ae3faf38a03351e4a5af31c70e3e4f69cf995d783853ef70a9570ec0c7fa1893ddc28104bc29b905e66d618434d4a4c80e5e1503a771751e3f84836e63c020f7d264cd62cb39acac61b53609c3a399e2ed4436cbb5b83f185dcccea986e5371f030bb0e3a25316026166aa81c8a8a3154b2591c52552f1c30da447a2f8377058202dcd2dabc90976bc9b3a0fd1d782c2d9b3fcd68ee62dd5bcd2813c4d80025337a5dde84223aabeb91a12a52fe38fe7f2e5d689ae07233260783eb1720f652d20789dbdb794dba5c941da246396a4de7cf19fdf481ef78ff59be601f0a220b7e5991b25dcacf8edb5a637105fb139c8d7d04d9e88fe3559cf133aa38725b8a4cb00a491652676ca731513d7e03bca1fa57b648a25f1f7ec079b7a1aeec7598e1c0cd228930df20e2aaf0fb97c8cb8e4567d119d3ac25fee1c0e031575eb1e1e6cbdf7a6dafc444055ab1646ed0e0c63774b222b99e08096a0d6a09689dcf8b80271f0082babf29a6260a9ab5021edec8e6a3c7f915e0b742437e420443def7aa3f9aedbb3089fd0473200c31d7ca20e403d3bdcd40b6e73dd772610cd582a1d07d07500f8c043a1098fb3a120d93ddf836c3775a5997b9842bdfdc78615dc83d7bbe97ec7c1c3d4ec504158ab297b755facbc9ef00caaf5c6a4ac45e9dba22cc5b73350a107e123276b84d96601fed3f2e1af18ffa29517dc9cd046d273428627889fd18ddf6a8ac8901509d53bcb3026c62570a0370505ee1d6baeb689955c4b39bbff2fe875e5b9d3eef2a5f61b570ef043bf8d7b7d8090b37364cf01f7b5fcefb538998eff4fee8699e97fd0c91a62c4960b64e12454eb31fc19b3978baaff0c43bba5132c12c27a8817a3e2ac0bb37a74dbaf602504d61538ebcb03aeb277acc64760bf3e0ca2df55da1bcbd00187953c3cd968a90b74beddfe008f90be48bf959091b68f2ce78c0427705411b23fc2e764957cee78869647b67b61da29c33403df1c075730af2246ad2bbf059c962b84dcaaf2de43237578b2efb92b1f66cd6c29e5f5adc2304a87bc416bd71c53350541d444b768f9ebb50ffe3255001f0fc4fa804731710025f253bc005adf1aba619ef6168a5722b185d5075211abb9b09ed00db760dee50167d39777151d14bf12ae9826ddae793eaf601c8aac2f1603dd3b62fdb91ac326063c999e668d7171c98a91705a6fbd617041517afb93d322a823b06ea31a0d6129b0ff9d060305d6dffdd764d02efc129a666ecaa0f109c4a30209c4bbf2cc2156e984c9663ac4bbd655a4a9678e735cdd555c9b73e34480e7ff2878c5f0c29e6d2524ebdc6b67fbd291c3f8509500460649f3dce066879ef2c2884902790fb1309d3e3ecb6dd42179983bd11dc7c6180f27edf97a1563c385127d43166cedb710db3eb326355d00ac08aee1ae4b2b399f357695a41b25ee6dbca79d973e294a25eb06f5159c44f129e2a4068d1dc1eb8f1512dda907a11b911c85a54800f65d91e5dedb9cf1fe7aa027e3fef4c6de92c73e56f96e368acfb62fb156609c72dcf3fc882f9fb889b15b57840114d3709482805b02614c494e95cbc5e382c61857a1726ffa7a88cd135fb8e7ef8e8f24169aba8a356c0a1cb0bf90b26f0d6ea59bf882f653d7630503054c2e9785b21c83f9c93a33dc13c1cb3e7f3d8fd5f40e0e92af02cc4dc37bd1d49bb87dba6d410523b4031974279d9275920fcf8dd50b72e781161bd8a6f5a5b70b096d94c671a0bad05b3ece99921cc250884eaf550e685e12a6e00f59c8a8259c492973ed998444f5b9797b6c342a49aa808c54ef3dc1a65ae297db972936f7cb88fe731d572f423599630d979142643e263e5a773d30915fc2ed0d785197c6bf6bb86156607b328a58a4bbdbd8bb7eb4a2cca4b9ce799b20c8532751c2e088f3d0846326a69d42db34360f8e0a3c5ac1cc5dfb5ec065d68f2b4e5755f890491ca7e56b65a9e70817e50683241b2079fa9fe7f537f67e4434bd5dbe9b194d6913613143ec838a1ab8b219511124290a1d927944e270325cf7bbb21c3a01fe787364101d87777bfef36cc977e47f787d0c39e604f840834d9f086609a28b6b49ab83155ef32cb6193a9abddcb06a6993cb40a396c1e085f600347c2b7ea619eee2c5bb3eb816d2822c46b47d59f1b639dea69ad6a6fc19b2d5418eb624d5a92f26e550e71da463a9f0eba29510dec09e59977dbb9522c9eacda7a6ce1f07908bba9999b86087987c2c38f2c45f85a8de97716957581746b992239e0c96f6d275e9d07e36713de9a5a3becb94ec5621360f8d248a310075ff378af138703e50329bade76649dea85a90e5f07729a94cc8e4f48296f0a05c36c82e3500e6f46b9b1db46b420c39de4b7d1fb13e89bbe469876ee4b244f3778eec28e65f3a2c2e7b2b311e6f8d365d8988d5822feff28cab30b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8b9e0f2b3a223d82087ffe594d6d7829600273de919a96d0f2452c8716b0e2971dc02a61525f8694b8eba3679238b73ba37383d4718993a0646bfa1c85b7e36df79ae1261ff4ca2ce7b777e45a1a3517acff247e2222ba73f65befb42d94faa88a8c145af5154477f14b5a3cad90858143f159c5008cc5ae69a762298adf36ede7314fe0084538acb9229198e301e0ebb5ef62ece69eca57cd1fc0b905a662c98fa62a30bedbd22ff797add0a167e1e953918b132dd4cfcc8bf7b3ce1cf3002f8917dc4552848c9bc21771fdceb0fbd77dd7618123234b6743fd29dbb18c23b4eff50e38e0409f2a2cfe4bbe734ac85d85b5fc05191402986dc2d4a278956e4fadcc1d641158c05428f7128138c785bccc8c06c59ba5b8988c1c3e5fc92bf40a959662879fc2f4b00a462335ce971e7f7b7553261c798912ed9872328842a1394c84a2af5f1da00fd5dfaa87b37964b7ace8bd7e110aa7c7c65fce19a17c8049488e80d95cea228134b5f05d3f17cdbcba1887fb38279bb6864ec4ec191f1d8181784b135b363978b89358ab9bd8bf0848c1bfcc1934e2de2eaf3f5d2dc23d53bb0f415ee675bac37e5d1e48585a105c9478cd94ace5d1059fc3258f7cf8a197c9bd0ec4658f223053c53101240ca478c11bc6dd8b94462c1243807156080b7f827d94ec85674b703f5fcfecc7f90af2f65f9ba70bab70e474b37b2544a425df406dd0775a5d8719e2316963d53f13708b31a67d7a996ec0b1c4e320dfb25938a4d081e1009672e318779468ba2d5d507d924327919f0b7f76bd45a306cd4fbba5b2a0e945eab386caba321d452a62ce40d1398a7ca5e447329e657987178f006617ca5191dee1676d7a3a566f841c8b82cd9e89bf947c3fbee75125093190d512cb70bc167c29f62ce2c4d82c7279b27c011c3a1e5adb5dd8b5cf64a250c590a0f13be4f38ba4c688f6af4496c396c1ce97cd371499471e890f1a421b94d404192af783fcc4b7996a5753725731782f8b9cda9f82fb9a089c4bff3bda28a2baf48fd97443bfe8f95ed711efe9ccc4d2e1b65f5d67bc49503d8fcfeef5df2300b2f2df07382924451c22579bb55fca85f02e8fcdabf2a2ece3f429204423b39372379dc6d48b350b5c16e18ac78cf212b2655bd8795b21b689039e49820f4e6a0299d74ef23968ffce5c98393395d2833c092039a02861040a9253a0611f40ac89a828c9caa407cf9dc57d8b048d5a07341b8f9061fad1d678bcbe4988db97e9dbdb353e7a8ea5655554b9d7b5992d4983a6db77c5ec95a462354d0db9ca680e13ffd6ac07f75f52462151f914331f89b2dad85cd88d44bf800d4c6aea0fa9c48b7fe25b3ea46ecff43c89e285cbad27ad0ae245c46be7d0b9eb188bdabc3b9b501c4fd13998ff2498aa10cdb52f8e9aa2180b52dd722214560934856cdd413a0844682b450c072341c396fdb1e7232c83311f95461b43d907a6cf2052570cdcae75aec4ebc2d21e111223d0fc4d75df4d53d3bc893baa3fb91ee99b8009d76f49cdaa476894237758fd795f987ec95f88ebafc6e509a9c56c704d1e07772191bb0a9ea2974451471ff1131e8fb0880efec56f6bf6dedcabdc784ca30190db8aaccb5d972ee5227958df1586556fe6c9bb7fbfcc2dba5c2b9c78961327635d147f663cd76a5442dc54e0e1d3930f627c8fb36bd813d59c49a62f5c157c5b9250e58aa02851eea9f6a2fe14857750a558260552d504bb9039d777572fa71f52e88a1841ab10a54b7aebe94046a9a2c7621c4df3b6142fa3a1e2cda6332b927a484fb9578186e5e9f47438f4a2a123e3b7b34c88f5c51739649e5b87c5e0fe8ecd68a6278ce0afce79a7b82010fe7f41d71e73d804601364a3dee89b9b919d51e1b8f3fb696fb9787df427d46e75db528a051fddd1e4c314c3da0ca15e03c16be82a0816fc0840189b0ba45523e7fb1ae5a1c98b384689d8775ac7f675f7f1f4a28368032b30795986ed95033607aa72689c44551243416db292007da123b7700dac53ea18973b24c63e9f8e0331450d672b99d1a9bb7116444c01f46040997d6c720d836e0daa109368db89927d2d6280b22684f581cb129268295b281103746348c288f0e904989ff638892ddca22952fde2cc8cee6dcc4b3601f22e7c27f1f78427c324d57dd56437cb31462909da1a0e1485691a47858c36034ae13a2997b7569d8a81a62494bc56203c57a3c9a6bfa3684aea392df1a537ddaed992814dc81719e95e443a21a85d03f633438d152b2df343acd7c2c570f3b2bfdb0a057c86b3d800c827fc1d4d39a4f6b22f89c3774296da68ba5f37542753eccaf92a8d0742951dc2f4cf4a0d19de7456ad4f7cfeb1a0f6fcf9af6dabaf462b4ecced3d195fe1b2e82bae23af088ed48f9dcbe3704ff614adf382373dc8dd9432c39cdbd48f2730e08be81dcce2179494f98da010b7e6164ddd88f7604b1e813505b6803d9611fb22b86801b986ee8d72a5e6d25dadf9f13e4d7c558e045d6c9ec1f7a607414ed6726d08ac780a2dd5bf5cb03c8bbd896fb0d94aae4925eb2f24ca2783b7a061d9bed376b3724ad6393ed08c817aa5dd9ffbee22f3656d0948d312264976dae5c6b2dd5fe93dec513c13680c5371a6f742957e248ecedd5220472c28c930d2f2d863e52d15af9e1570a88b01c9632dcc7f038c4e264d83997f3694751f808788a7a652b5b00361b7588a0855f6fd123434766ef36128b2aed370199f1b98d62a7e8f75e6471e248cd7ad615d1cf5a0e037d894a007dd467211ed07f0564777b676f88de294c659b5b7ec9dc46f68529f518d85d5c9be6b82ecc73137a7c3a9192258d189ff7efb598d202c501c7606b48c899b5c9aba85aadabc1d67c055d998d2321016823e4dd6c2be473bcde5ad5c7f4264ecad21d7252bc5418e74c99d7db7675aa9b5383dddf1082eb6bbe1efbbd05487ef3a61315eef3933d32ddda3360712724cde070e4ed36349abb3f756881d3dfb7fc71e646277abc197662d1d81b24b70663b347c0e06a2c48fb23fb4ed42716a72c09033b386563a08968c5b55dc9a77c7789896ba14266d3023d388b1811b87d21454a90d8d5853183d3ba3d3d3f8af59167d120ea504acb005d73a8169f59c8c6cae07dd77458f9b28a11a6f08d65acd478c814d0eccd98ca43ba251804df69c446611a42977b6ef9c09cf906329317c0930a6e15832957e8e51f34ddb288408d57a55ccd6e9443cc17a81ad57bbc52928e855214afbf1fbe48138fbb25a71df3a1cb2abe803df77e7f7086ba591ecb7f098b0d96178c161a9ac146fa4666731ceb355c7c48baf392f2f02e3545d448c0237c4b552a6e6cf0cfcf28e130ae50e41a9c491bb05d6baba768677bbc68b682e136c6829fc30c93a93276ca96ab5170e3c41d47031a0c1de7fd5dd6da9730e79ecf095dda3ab815e3a7f451948a098bf915ca849de967d2a11ad8ff0376172e67b065364d3bb28f9ce095fd7f31df4c3e499d6129ac17d3e1a243937503878833ebc0280f781c3ac14164b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe950fc8893ce690c41c30bb1a9846adcef56fe53eeb84398327326ce74b71f9069214cebea7c0677ad4c1c530bb2516bab0ca560779be256a7260acf5d576b9b3118d409387e386ddf67b1f02a03542b092edfb32be734144f947a53916972e39d515f7bf0f4839e721dfbf7814e4a990deaf77cbc2517c38d54e651caf8a34dfe0d59daf186fbe30b578aa59f9add67080011d2b490316ec124cdf0f936282d5d0b3ee9c1c79fe5f6cb5d7a3359f607b62472ea5bdc75008d17e4e608e514be761c2" +]; pub struct UnstuckSnowbridge; @@ -53,23 +48,26 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { return RocksDbWeight::get().reads(1); } - log::info!(target: LOG_TARGET, "Updating beacon checkpoint set to unstuck bridge."); + log::info!(target: LOG_TARGET, "Updating beacon checkpoint to unstuck beacon clieny"); let checkpoint_update = checkpoint_update(); - CurrentSyncCommittee::::set(sync_committee_keys( - checkpoint_update.current_sync_committee, - )); + let sync_committee: SyncCommitteePrepared = (&checkpoint_update.current_sync_committee) + .try_into() + .expect("checked by tests; qed"); + let header_root = checkpoint_update.header.hash_tree_root().expect("checked by tests; qed"); + + CurrentSyncCommittee::::put(sync_committee); NextSyncCommittee::::kill(); - InitialCheckpointRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); - LatestExecutionState::::kill(); + InitialCheckpointRoot::::put(header_root); FinalizedBeaconStateBuffer::::insert( - NEW_CHECKPOINT_HEADER_ROOT.into(), + header_root, snowbridge_beacon_primitives::CompactBeaconState { slot: checkpoint_update.header.slot, block_roots_root: checkpoint_update.block_roots_root, }, ); - LatestFinalizedBlockRoot::::set(NEW_CHECKPOINT_HEADER_ROOT.into()); + LatestFinalizedBlockRoot::::put(header_root); + LatestExecutionState::::kill(); RocksDbWeight::get().reads_writes(6, 6) } @@ -99,24 +97,25 @@ fn checkpoint_update() -> CheckpointUpdate { CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") } -fn sync_committee_keys(sync_committee: SyncCommittee) -> SyncCommitteePrepared { - let prepared: SyncCommitteePrepared = - (&sync_committee).try_into().expect("checked by tests; qed"); - prepared -} +#[cfg(test)] +mod tests { + use super::*; -#[test] -fn header_hash_matches() { - assert_eq!( - checkpoint_update().header.hash_tree_root().expect("checked by tests; qed"), - NEW_CHECKPOINT_HEADER_ROOT.into() - ); -} -#[test] -fn decodes_checkpoint() { - let checkpoint_update = CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]); - assert_ok!(checkpoint_update.clone()); - let prepared_sync_committee: Result = - (&checkpoint_update.unwrap().current_sync_committee).try_into(); - assert!(prepared_sync_committee.is_ok()); + use snowbridge_beacon_primitives::BlsError; + use sp_core::H256; + + #[test] + fn validate_checkpoint() { + let checkpoint_update = CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).unwrap(); + let sync_committee: Result = + (&checkpoint_update.current_sync_committee).try_into(); + assert!(sync_committee.is_ok()); + + let header_root = checkpoint_update.header.hash_tree_root().unwrap(); + + // Header should match https://beaconscan.com/slot/9094528 + let expected_header_root: H256 = + hex!("84a581291c4a4fe66879c4647a1084ee584ea5c8ac82009aee323a66bf865e82").into(); + assert_eq!(expected_header_root, header_root); + } } From fd724f30c16181f626270ba538f266889f93a667 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 20:18:24 +0200 Subject: [PATCH 15/22] set weight to force checkpint --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 983354064d..9f5ac55ca0 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use crate::{weights::RocksDbWeight, Runtime}; +use crate::{weights::RocksDbWeight, Runtime, weights}; use codec::Decode; use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; use hex_literal::hex; @@ -22,7 +22,7 @@ use snowbridge_core::RingBufferMap; use snowbridge_pallet_ethereum_client::{ types::{CheckpointUpdate, FinalizedBeaconStateBuffer, SyncCommitteePrepared}, CurrentSyncCommittee, InitialCheckpointRoot, LatestExecutionState, LatestFinalizedBlockRoot, - NextSyncCommittee, + NextSyncCommittee, WeightInfo, }; #[cfg(feature = "try-runtime")] @@ -48,7 +48,7 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { return RocksDbWeight::get().reads(1); } - log::info!(target: LOG_TARGET, "Updating beacon checkpoint to unstuck beacon clieny"); + log::info!(target: LOG_TARGET, "Updating beacon checkpoint to unstuck beacon client"); let checkpoint_update = checkpoint_update(); let sync_committee: SyncCommitteePrepared = (&checkpoint_update.current_sync_committee) @@ -69,7 +69,7 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { LatestFinalizedBlockRoot::::put(header_root); LatestExecutionState::::kill(); - RocksDbWeight::get().reads_writes(6, 6) + weights::snowbridge_pallet_ethereum_client::WeightInfo::::force_checkpoint() } #[cfg(feature = "try-runtime")] From f5472d229e1c6d78d8ec11463ed58eea4d8dd374 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 20:21:46 +0200 Subject: [PATCH 16/22] fmt --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 9f5ac55ca0..41e348200e 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use crate::{weights::RocksDbWeight, Runtime, weights}; +use crate::{weights, weights::RocksDbWeight, Runtime}; use codec::Decode; use frame_support::{traits::OnRuntimeUpgrade, weights::Weight}; use hex_literal::hex; From c8eb5ee71818f13a7a3dca63980f6f54104b86f5 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 17 May 2024 20:50:00 +0200 Subject: [PATCH 17/22] fix if --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index 41e348200e..bf1586d53a 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -74,7 +74,7 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { - if !is_bridge_stuck() { + if is_bridge_stuck() { log::info!(target: LOG_TARGET, "Going to unstuck Snowbridge."); } else { log::info!(target: LOG_TARGET, "Snowbridge is not stuck."); From 5b08b34b2afa74b24433de983fd58982261e001d Mon Sep 17 00:00:00 2001 From: ron Date: Sat, 18 May 2024 08:32:18 +0800 Subject: [PATCH 18/22] Check is_bridge_upgraded at post_upgrade phase --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index bf1586d53a..de18fb91b0 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -35,6 +35,8 @@ const LOG_TARGET: &str = "runtime::snowbridge::migration"; /// Last successful imported beacon header const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); +const IMPORTED_BEACON_HEADER_AFTER_MIGRATION: [u8; 32] = + hex!("84a581291c4a4fe66879c4647a1084ee584ea5c8ac82009aee323a66bf865e82"); const NEW_CHECKPOINT: [u8; 25122] = hex![ "80c58a00000000009cde110000000000f118ba039276d46ba87cd50790e2547060aa6cd260476bdb499dc38ef834d618910884d25c9608dfe669a39ae64814db99553d82cd7a5bf5808240d2dbef04e6035075425a8cfe9d2bc194fa1ce245681e84909e4159e0c5cc1be7f876ff57d0af821d9b65aecbfd133c02eeecf2d8f64a164474274529f0a0fa9f8ab033cddc183b5dc028ccbc6c27887cbd65da8d4b8d6983ebcf4a910e6e2403b68f52628fb555e3486e21fd446483ed9df35377b07851e0e07803b7af34cc02494fe7a71fb32ec66a1c279dfa9e12b96b4a1e44fd1d3ca5db007ab2b953f6708514bc65ea545ad562b10a900bf3d9b25b5153d552ac07a256fe4f7761a5f9fe130c8e65b8f35ec53499db3a67c630148b7baf1ae8b79c00ed0c5f8f808bcb9e01cdeb963d8a6319e82af0f8a64b1819e2b21ddd3b07b74c8ef2bf01450a4bcb4180795b745f2f11c449223cb5590c155b284ef45ca108dd0c6e2ebeeb1e93bf710e1573e1cf7d2e3ce4c45cd5e5cc6aabfb110fc1c748b6a22677b333aa36d283f3d99eb09577cbd44b3fe69dea5d5651887877aac4f7f7eb0856e272144e187aeb92df3bc4b789b16ccc3b9f014b60b56159692db7f9ec5f2bbf753c0e19a5a22400b614c45da5ee07ff2a4558c2038f3772f2da1772070d65ecf063b908ad751a192cf1aafe980d1b628aff8bb34f7cead01aa4baf5d8be084e112f2cad65561c40a0932cbda6d5d37d6650500f14b7269575e1ac157dae537eab19abb957f40043c71954cde60e164200f453233a8b77fcf8ffe5d95463b486da0e6e873a1a00d3b04aa4f0672ad6b6d03180cc0a089adcf50b7e3688c68b47d1d5812972cfd5952b4197c414bfad6025d8c8f060f16edcf8ba8bb9075672310a1e10745e4e90fbbbc61f2fcecf5399045b103317086f544bef7b5414e373401b13893a7520fe0201de90c58991af476a86d9eec14cfd0baaad4278204b6d822cd32414da207ec86da840cefe31c5cbfa6ceff0546294c296e6aa5683093bf0a69ba502c89e50a6084b899a36f3d60db2dc9ba128210c4e75d76e83799132cbd4fdd9fd17eb704703cea9df391c83d66a2d7ab894cb5a15a575d1e71389b8c57d63ea48017254c02c106c64b3e8aa0c2f33b9af3ebc44e541aca5e69cfae22549ee562eb8e825d81830317e565d04563ed05fb8682f1ff79e0c855990e03a9d18ad8ce8983fc55deb5398b333a26db57d0e690ef6ad56d85512859d9bea389877d01d3fd8ce1a0517c87ca515b12ac524c47439b2c4c00b553f8a9a6831fccd0641f8eb33c0eeba8cb5ed88e035f5bfa079644258f5077483b45589d5cf4b53915bdab34d4030dfa8ad85af76e194db58d453df3411431cbbd8dd19e619ff613cc3cc9e88745bd1b3d24422d3dd4ebd82467bd232600401a39fa3134a2cc099b690158e52694b2141ce2979ee84416d8c89f55c23cfab2804e26fa2f58e96fa9d8e7f7fa8c33022247ca0cd1808fbccfa4f3dc4e70ed62e031598f4776745fee59bf0fd5369246ad97c2f2798e808fccf295ce5f8ad8e7e70268d6667508104ed10beb70a794196a3b7c7e7188e766d9a68d32ba7297f9f916e7e20f5afe0a758dcd16953dd81ed2ef48f4d8bc8190f601dd3da1df6f78ded9ced42b00a310957f65ae029e7e170d106e9593dc2df9b54d9d6692ab68e9d42688304fe8257fdade19bca9d162c83b3bac4b6626979a8fc77f49105f49103d55374bdf18e1638be1d8db2945dce2a9b7ca3c772605f9059f0754a06cd170268ed71a19419ec3c88bacb63bed8086c29322bf2d5ede197f3dc626dc83fcf7d3ad2aa959d28c9f659824abd2e7392a2658f1cda46be4fccca644292573c21ba76cd183817fe7d59641bb39a369f4b43237eb752ee6e0647a94c0cd1ee669010a851f133e7d674bf23e6ba23028bfcf6ead7d960833ddf004e335b83ee062938bf9183c99d97a411ee79b18725de81a5131e8c8f0e5dcac8837d036ed9c85cc02314994d865c8476e63100deeb615722ad6f8110b209ba9eff76fbcbff25b1d83f31e7439c00ba009d8ec4f87d32ed566e7f516e7dd48d085808641df325942b46d98b616d8bf622147f24e180a6be27fb74e042439e19ab3c73f833439a86dbbcd4e0ac43db4b891b67155ddb007d2475fbb070e847fa254273b63d0bad326ba60dd8c0849725be0496d270c2cb30804da546d94b3071e6de53a2ccd167acaa2439920e9c77e475fc120a12d91be2176a87f6c7f57061fba362e5c38ebd01f01c659c3631bccfd6973d68beecc3b363ba5ea9fe3918cc7629672fda8922852fdae18a99ca7536861c73a6f241440fb9116ffb3c9144d649d00255a4f15b1f6afa5c88e59885eae06fa271e0e1ab7b5a1b4ce2827d3e2cb309ae2d58e98a926d2ed525a8e8e1d4bb55f621eb6f688ba7184688819bc8aa9e95b114b78584247ab2f7e8c217ca0de8e219646f9c0184d03f292bb3138feebdd38de30ba4951cb1665a81994db24b5105ddd683075f6cf5f884ce7ee6525dcb09e04903424d7b8610a4be604a89d099d71d038091eca1a6317291e4fdbd84837621ae37182bb9eedc4182c1b3e3af35491cfa701ae2f55522c2042e7d8a93a54c2f505b62a748e1377789780f6fd9c54981e93f76b65a7c0010ce6f84bf03154c2d75b1da316b9dc62a2f62736944cb935f2f985da9f6fac23ea4d578136a1b3cd1ad29818cd02e9a72da1779f07c7a9f88b4e9fef6ae1db26de2946ba6edaa1b43fcb1c7e10ad49b9d84d060c6ffe0ee4f2fdcc34d27601a6bb3fc326b7dd600aed38ebdb605282d7346c990194aa7bc8775a1dd5f64c61abe8b375d61223917fc8427e659d431a27391ea0df523a25e96210e17ca85cf5a4f5f6fb6b5c4473b4b92c62609bf31e8bf8402e391e3a7ae63d4aff55a17ac1d97620b97983e3ca421a81ab97f811921df29e09948dddb325945e3a7c53fd68c9c9633321afd3873ce4ebb4a6856b4a4caf2e57a2e2532a20bd768404e84d2b2044b22f9b2e8f76946029db8b84290f6ed94df22c8596dd9c6bce3cdaadb43bc90d1f263e64bc00863fa218495994cd4b42025b22d257d3ab275ca382ee10231e8850ada2b50d0fd507b34c0b74b13d1794ea68c1d594d221ef84f9557bb43495f9652e3fdee490cd327116aba0bde4812a95c47955ea446dd6548aac044e14798beccee03b10a59ea6d9a5a2bf6e6bba2f2130128a29ead57203869d1fff9467d835cf8e7ad3f3d2fc077dfe11769982b2fa5e94379c3a2087edf3bc587d27987811204505bd74d8ef13acbec609ae24793f5a2b101eca199dcfaa4531a987b6524018fbe4c9ffc95985096a67bb041c37056498dc3733b5be3d6d03a001b418ab4c0ef72c609ff263136e14c16e9ffcc8a2c6ab4b3b1bb730feec0a1ae7c15fed5509ddef0e00b8de4dcfdb93be4e6ac902462ae732c20a79209499b9b87870e0476d016889a60ed361c5353020a3ec98e34e63b9f3182ac02fe66da7efbb1a3895c727cdca56fd43edd20bff709ce5f86fe5f9c880c11ec739b9485c0132efeca6f6014be637028ec04a36b57345d5680ca76837e1aa7f14999c928578daf668cea7358c4110d88abfbe25380352feba160638608ae27c8336fc4fccccf4eb0abe8942f11a77c6a39786aa8287ecff1af4732e63c834f325d0719e5870914a7ee8cd22592c42b6bbe86ece668f7b75ab921fb30979ea979d9a67dc6cd4b3ae2cb3751b35f51c7c8fcd75505d656d10fd54bb1afa2d24afe1502740275589f07b5371914d703690da14b54285e8943f0e6c532a977f5fc3c1564048b19d731cba84f69c076a823353ce020094fb46c5784c2098313f99c96c539258b59630de96d217795318faa7bbdc52aa37525c7091c8574c4a9a03b5cbf80963facc40ea68ec48cc24f71f3337c8f7871aea9a18aed2b1664c9c5f5af76dec55f74bb441abc21da357de621473325018aecc06917aff025087275ca4f964b8cd945c7c41964fea49386cb3ed22036e0474cc2def65a6a380f9a120e5560722b942f5b88369817d0a965d6482ab324b7af23bbf854a41fc2510c2898712f6177f9990a2587a2fc9d2cc0b7ff3c07b5ed0ea20c24bbaf58d5a29ab1c64f42e8d94ba4400c65a90a6ea0a7d2623dca1b2e4f74a4374faef87e0a77b09a1b45558a9b81b9402b933317fce57824dca4b911f066892672e667f37ad0a750e09802784f2a0f6ca3a675b5f6a6e76e96ed60a36cb09046b39975f8575adf33e2b0ec9eea1cc61ec6364a0ebae32e9902129aa3b174c0332bd338a33dd91cd8159b47b10883b32a4ba60759c14f12b8741582bce5cfa0f7d86743e0da364170d9677cf448d7fa3590256ea01dcf11905726b88b15056236d8b65ea63039efd66b7fb4f168e6ff46fc5f7d7dc734d2d406153340788216a5df6ec9fa169ac78540cedd4fd9a00382798ed054223ebbac19c32a0e02b9a27c5db531e507c1855fcb354bea4e484bb30bef99bcd63be47e4d3d4a4e0249f41588a18519584d6086e0b2039b5d14130a4b6aa53a088e98ac24da38b83b8f1801b612370c71613612bae8e5f1ec6e07260fa081bacbefc947bd612ab85eafe775db1aac43fd4abefc58d49aacb57307b29ac2ba517af4e7b26d6a836338d6c8941db0bbb9ea279d33bdb9632be5ffd687acd2b9003040d346aa947425b475d04333b54958b6f4600f7d7456050f160e2a078302e7011c634abff5e0dc08880d5cf6ec705f94951273125ee1886396fd14df2ebb8f39e6171876ad7eb0797e97facf88217ecb60eda8fb336efd13715928f1311606187e38e0d7a4cc94d9a1a0c36aca43f3a98440724e8704b935fb52a0d9aeb1b8861c6a7c4535af798f2d46a769f897bceceaf1f5fb55986a40567a8d13731b4274787ac1995b77d08d780fe788b45ac80dc136504f7e1f8a96f55add4bc347ebcadac13dc5f43436192b7ef765a23dd8a82083dafd346a8ed35890a855a0856abe09f943f27d2ae609efb77499ed7fbac5f5d6ebb58bc1aa061fe70397143434f1b318e3d9aa8f5daa5543f7af91f534d2193d7a09097c373ebbcd9982c24bb1ef2c3b6125466ed13ecf5776c032a3bdd2a77107d6a1323fed662ee74a8650bcf27ba22e9c5172c069b0db13a03a0aa7e689a0c6cccd03b894348e2b88a577921a1934a3888a13c4219057df4393158c7202ed74ba8ccce6491af1b143758cc25e4261cac346a38761c0a6a24f275e1fbb117e9fe566a555e86ec79072ab3e3c17471bd6fd429af98b00b8abe4cbb397660351dcdd941bd3c8b6f77ba9a6f7bfce57d1820273a8000b9a9cc23fb8536bdac8a3f780f0ad86964828ea9be5595640b4a7a6c14427d7cde445d1fa4985a032beaaa5ad2d47bf2a536f25fd855247c5e229f5084f4d3edce308fc0e3e92c00ce3ea6b6c81381cab6d769c81410b76120343202a0fe78b083c4b3da0a5a16d4169cbe2f18fd611cff69d75673dbb01dc2e288335644825e3297a6b94ef4407036fc2c15109ac307d8c83ab4d8029afd1213fc4c2df73da3eb545c6c55cdc003bbf6bd302c8a792263c2ffb1acff931957e761bd98ada159b91c5db7db9cc5708843bb0ff18b82d85d51f9227de4a5292d4cad152bee03e97007f40dff61b9f326121e4d533322a8a04cc5421aa4fbc8256bd21c37943bc25be49e8ada61e5f240c754dae5fb242b5f4e101317143d0f7da29a42dc81dac6987517ff085cc9b2eaf258fc97aba502d83e38247f5ed56a7eaacc68f850b3541a435304344f3b466925cdc531d54ea55988271c18f993ff6ac2f02a4c1f1aeedda7c20082dd5a7c2291e1ee60a449a6b8f66f2938af7b48a2ba01b453cc2d98baa4bb2449139c3cd4436daae2c1f637c8f7fee6e3897534250f313ddd3417bc92b0129c347c648d7773c79655b4aec68623b2924aee7da53e8ba56772cd6520a5c6d78b553627f3de75b056bc618ecb17a94b4d6b60a7164b024a693e526bb32e97f612b92e6a798b10b774f3cc7886a3bf419c0562801baa67fb28b3c02909bca1d542cd6da0f359d6a89aa73760b8d3642e3e688294ccf604369978ae4c9b220a9661205ba7a1fec3e96e2e10d73af9af284d7218dc9c249c6fd5f339ceb3380cea7f5b9ca305c04d9f0322c827bfd5ff8704d9a0b95c10ef7a4e3a332ac2e227beab26f367fd5a61ecdc228c73455890e935d949dfaa52ca8e65dfd5be9d73c4be0f8d2c0666c688de7e98de4f567627d3aedee8eb7fc75c4ab573e3fbdc7adf0d934a25d5312c8ff2cebb7959177aa440fb3a7cc8f4b85dbda4c65524df016c7e77ef90b11038e6da568d6c04bec1d53740d8d0e669d7a7f9ac3e979e816194cbdc54ae7fdee3d793a0006d415e048fe4e0f3f69c04bde7bf192686e53f7783fe7caaeee6019ceec793e54f3d0ec024e9feae6f643b8826dee65647b9f53a51509d36464685f44e1964eafb98b825d53ee3a8e9f85894ad6097a5cefe8daf6931ea7033400c7808d6be6cbbd244a6a694ec9bb3602a1bffaeeb3ac266ee3dafb4a0b8af48486c8c682e70597d5952e78a5fb01137dde04b8dc0af662de6b8a33a890f40e3c68c1c49dba60fa5e7e9d8d1414a36b0394acb7549bdd405732d118ce9e18899f897ada4be16a73a5d2f8e83b36d1370e0d71a3f0b1ab6e956ae959fd878374a31d52c8f6a5a30442652760c9de032cd6e1f621cd557b802777f290fa716771bd240f23217c2993a56aff4205f5b233e4403d73c719b6c483c0ee81c51056125793efd502e3b7be54138357335f7ed5370be3baf470ed7287a0da23815690ccd6d59c55ae1b272d46d2d57d7186e8b2550350b023b09cf34947fa86f24ca0b8b71a3ae3933cf8aa43afc46d87de82b57b3fa83e09e87ac43e362625ffddc02d4bf35f1514f755ebae9aea374dc7720319d4f80d4c9609d0970f16ab5b6ab96d10040777e2ba8dcac635a9358e636fe84a4c9794ee9f7c9e6b4682a4c9ec5b2a594071eb34a5c581d1288678dac0b525b459f96f377ba56a1eb1ae9275d70d33c3d4741e66144ea92f880fb154ce6d5dd8fc74fba41d12e9d66c859a8cb892df9a8d9398a80fd1a746ed19cda457c58fac722259a67573b7add86ce157cb3fd1e01c077e93a1560b2ff3c79c4cca88100a4cbd6e0a40fa3631d1de6e035bc197ab7573f10eddcca678433f231dd23ec2fe50652473af6133bc8c1033953baea90012e2878afa07e842f8b47a328ca9df0d21b58ace0fa8e7e501a5b03313764c81e2786e9489fdfe741521bd4fe299548e89bab19e8847ab274d0273f70f52e71e9003d42a7276521750e5c0792ee01cea2be884920f52075dcd02e9e25c8307dd499764fc029717c2ae5178607d17a730978a8896b6bb3b97b47cac98aba15ab24e1bfbefc5a2f8e2ac0c4eef44b26917de5e7d8b7330fca531689569fbe31003b760c6f4bf17460eb51d21c11b4cb8ac3bb28ba7e0c16d35104d92b1738e84b31cd27408d095984d8d0b20e0386e4e4670f34d0e8a0314500df98a568303486dac06ee4c6b14e1747062c34af8ae21b715a30e4654806717a334660155b8ef0d713e7cd2d0ab0386016b90eaaf8468e75bdedb81aa9f3467a86e012916afc5ed65ee4542016b22a6926c58962decf0319b73397e000a8ac83245564e5ba5adae8e0c76eb64bc4a82e05f9b376185aa44aa9ae831f3b2338badaff0436c57c38e9f3242aa9c9f7c00807a9ac8a97ed812c5ca69767766f87ab3711cfd478f6f60f9218c32a1c5d9d7b5bac1c1093b399c46f3270e26f035fee1e5b2c9680298b570a2db6fc8f2ed1c5b9eb65c8b915378db43893c9f4ad7026c4867f04e286d26c70e52fbfbd0420c4fddc0179675d2b2a5b7a7a3bc325967566662192b93e1fbec87f90e4861809e84e5a691bb1aed7b03797036c668fd07aea5d5586d1ed72df9fce56a6c599bff50a70086e689fe0d102e078358e4ebcf70746e7b86ba97ef46eda5927fcc5bd63564794ba207b1d85a2b38ec7a93e84768962ac23cadd9e4d66daf8f9772ffdf311a1d28fcd2187b8a5f83b03c64dc49660f630303ca5d8e37e4169dfdbddf490dd8f226b29774d95082314ff6112ae77869e72886c7a93bee730897b7d38ceb673d4030283a248b66c62c9554e3236655486c214baed7631a301fe780d283adb6fede12e43e848f81f16b36f97149263fa6bf54484c201f51665e2532f6b29d4037a19bb798d5d73aba460e78794afd7f3dc2efe998eacc597a27ae8c7d0378a6aa42dbbd2606b9a9f0045adc22ca004ac27a7e0b87d282c2102797566e215a456cd34e754c67258a067db1a6af16ee8dd50a863da3939ea8f26e89c5e87c3a35dfbe08a98c0f2a45b297609ae574173d9cd07955814ba24fd0810b686a6a6487a34bdadb76cbe8d7a100e29eb66a4d2ab72df6738d15092f519d8cd1ff5724e359d2cebc2ace815c4c11012aefe433e176b394315c6ff6b31d745b65de56fd842c78de07a1b22652fcd11a340caaf56626a999625d32d762c81e097f4d548d94eb075849beeed2d57c40ff9a545371ce9bd9f42caea334101a01afb0a73bfce8fa0c6ba88e9c159f8009701773f2b9d79f48bb793c04fedf8278efc1a54c1f77a1f8ac4e83e784054e76160e05af8b06e565a5eef9b06e5623f5c0dca6f2c741de8e71241d94055e0115056200cc5a5de25c4cc3a7507e3b153bddcd89bbd9faa0e13c30c6aa4f3b8b28e7436b0564625c15e7425ca2e1dfcdab8a721d5a01314e23358e991ae4eaee313c8efe723b19a22ea8f857667afd92267cca94bc82d6bd73f4a935c2f32d79dbff17f9e54b463911d81d80b3c9d98d45e7a93c3b6198ea8b8223f2223950196950dcd4f5f4d81423d61c682c040b2748e57dd3e51b207b4bb1658fa013f1f6ffcffb5a3df119753e65619a5dca4e507f510360721e37654b76771814fba673e1c8ef24ebcf91f2f7d08db30da1a1b0bf3300a66d992072f15daddfb5d08a08942f14e854dc29c3029f6c27968118aa2d23b528148a6e70f2438faacb3c4ce494dbeef03508206826ca8b0bada57796f4a4cace53a1339b41331dae0c6cd3f620ec58d04dfdb03d0710da8cbc876ba222b16ede82ec4f8839d42d8d92f4e67f804baf44790c00918f7e231d6b79016cccdb2efeb7858e1e9e4a1eaa67ce4bb608790b09894b06bd0803684ef706c0ccdea713ea7ee376d9d6c9f676efecc91ea317cccfebfe465edf03278410fb011e5fbf8d50192e98bc0f65aa4a8615e44660d3e047e2703d60f7a6d08d468611fc0b1a0f16d3293842c80a3fa7de450ef0ae47a084763780da1d7e9755b80fbb07ec7304d1c19a7f6dd3c2878ecbeb46706d9939922b92b3390dd918a11eedccee7188a65503c983b8804acec6bced9dfccde579891a1a884a4000adb864d8f9be54657d653713184a81225a83f314b07e32fad554ae49697d5cd9927761fb78eae1e8571efffc50072b44a3d229e07cd8cc57751a33537e66ddd2e4950793b39d471821a8bb26943e0307d924e82d3adb7fb04dfbbc1b1b832643d84362f465a8ba7bb8543ab793caea761c9986b845aa2ae3d99604185bc12c25019d5a981812348c662cae1795aacd0eea8609ea2dfaa0e772e9aea92d2d654305ab6a0068ad1475fe14f733483b03e768562e563739a412f4d3eff2ae6c19883681e3b22432943b32d9ebc6941674deb3920c52624605ad196bf1f8146689872672ddba241100425d7b73d8ce99f141de338f94e3e6e1a9bd8d6ccc8dc87e585ea8120121308ab58517549e87e8d9e358f7c653af923c2b56a0ab756afa52c2fc5b1133407ff0d088914f04adde7d8b9a840156135b5991dff05165e34974d92702d93d7027d56a6fe2a9004c05446ccb7283f2994cc064cbe6850dc82c9865738e9ee7bd205a50ae83128f007bb1b6e5f330fdb634e823fbb09c279609e9819df52bfd3214635c80c4fcfd47672cd7dcb05a7ffe0bb71867e7061764cb68fed668b00335d6d011be76c3545c4ffb3d54810fae5c498a29ead7fbf6d0c4e707308ad95103f9b9bcfd3e3a66c8cc66e506a650a9a2f55de7724254943e076a0aae77969219f0df9f7781278b9a7cf9960fb6ec69d05e819b3b448910a59f1eb3307135b469dce550594709cd9bd7e2ae8defb1526dba97db70b04c2d361f468a3193fd57d0fd328117d05bbbfed2a6d3ae4a555c332dc38fd74daaa6a8b3b55624836e41d8aad26be0982de48a98f93153b27ccb597b8f68f798789a9d46d84cb72ef3cebc064e428613757eb75c86f535b3dfb13f7abb8bd9216e70f04c67da84b6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651584b9a04a9fd73cde3a56904b09f6ae9f6a4bdcb0bab6c1e5b8e7e0eb5c8bc1d130cea0f4a6be6e364a28021fa476893e87e779022b6cf983dcb394fa936a2245cedf379642716df1a932d899e56a9d42ac668e783a910fa39284ec7ab00f08918acf9119f9e964cfea71404064417aa574c0416acfdbadca8ba43895bfff699cedc1603f781b4b7c353724019562a947afc7e7c30ffe6d9857346aaee04143e19d8429e486003243387444b718ddf52bf372f542a95e1280c4a54299d13e3879b8e479925aaa84368b47a69f9c1fe7598f0d0f5fa405ef3829299e970a8822e1885aa33e7eb400d538d335ab97b746bca8da82350e3d52a9833f010d9b998af92b54a67f6d906d12fdf22d64db5902452071bfc8fa65fa010d2a8ec2a1b8f3f38fe4c37fc95cdc46a8ccb9743534278d225a5ce233a15d503158e1db6e9d016db93b240aba04afdd7ed2f8f909f32d478b149569b768c13c4f9f7bc14fd5da12bec4692dd6119bb35693bc0ba09cca16c496164bf598d24e5fa641ca59d4b283a60b2a3d30f365014f6c8d79f0b3d878a5cff8f0ef98e48b5864c9e0a450fcc3467e19a3761ff916ff1e2a89f61bb73080cab649a91ad197fa3c3b17c6859b57f49a845fadf994fd36f575724226e32866725d8f641bbf052bcb41c96c6b7dfbb13324b10a801ae1314373b77b6cfc61580c46bfaef27b0b0446801d054be7f1e33266bbc267c09c6aba0c3b81ad54da83c0b627503d9462b75249569c8b97b6da662c18e2269b37ae6eb3e07e995d92466a990b3f8856bbe83a478a7f8725b49285b479e1cb89335af647463a4892216851668daeaadaffb0bb37d8dd651c509c3743274eaf7a2a51a0e1777fd21ef8a1555f625d5f21823aaf317e36369bd5c4976ff3c848256df750c421c9145f64a59a62218ae70d4684935b63ac3ff6f4a96aeb2910993aa02dffa434ee1ce52cc899089eac0c142a6d2ff99cec8107649c42b61a32e9e4b0541635191007ba47803c1c351ff2302104f39c4d5dd1614175cef07ca15cbd0a774dfbb79e897bcce54c4f49124d0abb171159eed866101f8bc4782c167ad4332e04d659c071fc7cfa8530854f8e6e93f21bc8152e672ee134b93e64eebe550f35e53691d1ea6993ad2158006191f1e2973efc194ca0ab66fc174758f0226dc531fb265a560e5e38a4225c01b2bc362af73af9cf446491578ecfd176663c471c60a613ad7a119659ee68c43a5a08cc7c737c58447668644f2444fdd978bda86c60bbfabd0098e7d29746440da19e9ec5c8cba161f299fb9a5a83ffe05ef8433746c7eb6e174b4f245bdd63973c76c73befd9b7230fc8f115813e6651f1cc7445c5622af346dacd00bd0d6d47f204caa07f54d4c8c3a6a1ffccf161038bb7e2184821427e2bc8fe3c8cfddd731c8d98b4e6386d70a6d9040a8a4993061e72773d1a82dadc8c9e0d0927d990916ecc59118eacb586294277fc8f63de585929d522e13f8e27331a96499ff0f1daa43e30176853767fa3362209f69dd13004e6e6f7e898182dcbd2c1cea23b682caf8d9139d4f0baa12592284c3569031f77d4cb3df039991d2d032f5fc61b035a0eb2f70f7cf1177be908cb8eaea47baccaa254a1533cf91f52c586e5648d1271cefe9633f39cdfce209e09530056123ddafaae6c8cf7cdc4a5ee592ba291292adaff17a97ed3de2ee575af0ed4b4705c90b30f42902f7f5591aebc1e5e9a25b103c16aadbae2682df90eddca8610025bcd0254fc55833850ce6b1121defec4a9e502ec46af0293dd87f90fabe7e8eb0d758cf4a6c2c6b4ea6bd2183ba734471c82f41105179d222f34b40dc1df7d4370be2d0b1c985ced4311a85479e7d5b520fad7ad6a30fdf272f3c6140487ce28a9b490c65e3976f35e51d1e5d3147a1fc418c8fb9b98dbb032af3193f1196689423632d92fa81302e998faa9b9964d0a92a7159bfb362749ae88dfcdbb7e3b87ea009a4fa76880b817aa55df06b1d2327b01c387a0b926d8ba31a32a3696402c64e0a02efbfc32af918129a4e2184833c3a763c9681092db63fa29ff811de4fb7f34211d7a05c5d46a890e5e058b18522565e89649c9e397b3c4a2a35065fc996469416425e3e59cf69fb886b9f89785c9c4bdd8c4c224bb826c0c2fe2928a66d78432d240c1aadee7acc061727d3ca44db2ba819cd401cb9404751d1f48f23184f3aca22245791be2ffe23c25a811adae614effe498d6f0c5cb0d2cdc6714b3f23a1c7858ffd43dc1d1be0f760cf28d2d3e64d6310854d6d54471d71e8a8d7f77f3098378ba1e5122eabbe0cb9d224ed4904429b2b275f5bdc45bd8eb71f9d243e5b7e55161ff23e35434e83cb38c3873c037f255995350869d8c06ddb813aef18bdafd7a280d92f25b5719a242000ebf0a89ca4589894f6aaf04e0288534f83560c53c82e472ae8ce54c5dd9812a6964174192b857f8144a77af9c6a86d4d301212ea8137352c14a002fbfcfa6c56d4df69fc9c235ae58b7fb11df3bfc2f087a051095beb722f58d1d1c6b644f989ebaf4bdf648b8addcc90ce1d8d080acd5ca2e6499bdac856177d8b121b77e7998ed394b47a5e6badbedb0e63207d84190b721b7a40037df1bcf45bfee6c953aa2dd319498200365a5518ef7815c71bdc88c1d8c317d9c1174c401cec7eef84e49fd2e13b60210d58cece2b3ef17b0fc0253c68c125cc18e028311623ba3f0ed6126e71e0af814fb5137bd5653b6fd923ce03df31addb6728df0932d710f876b87e4ec88b05fc406b2cb5ebf3a7097068a0a3edf583d44f7a52e042fecb083bc6bf8927b503fe23134d1fca2d7238e894606860ac772a3d371643acac90dd864107a046dcace6e1089135612040ed33ca50ccd15358813ea65077abf2da58b84891ecebd6856ec6da84e1aa05007db848d95b27246565d7fa46b2f4515fa38c33b0c190b343ac27e18779082eed3a54eb129c4e889f52779cfebf26b915227724e16bad10f4a2037128bc44c341f90418332f8037c34cf4e781a01bb9421922b747ac89ab2a8a3378709ed1c401e8445c2272d26ebd9b585127fb57d5d183e52b2e17861336cf9e10e34073a97a4880794a507bdc3c9dc553735787357eb8f726cd7ac0b56559fdbb1e3758ac97fda1c37419da24450c62eb6dad5e479608bbd4ed4296c6ebf812b6a57c379c796a5a6baa3045f715c0a7894427d314ef37f454c83cc888b165aca2a3eae11a768834b6b358bd399fed1dd302fd79ebf951527a448669c516cc2d0f63f7f968d138c3af179d42f02d3c0f627eb7dae2f4489baec3626c85116dc23072b4d9c59f35564137816b4ff91fa4988cca72f0583ccf80a5ce91edb8642758f49118ddd7cb598f92cde96e8cc7873c34c1d50988346307c7ad359a5fb1e2a8f21b54fc1f800d83a5db56f7d3c459500429346de68a1a049a610c86dcc5a7dd737a0b1525791d8712d4de313bf3e68fca59a38a43145074bd0235a4e599da5f58197d353bfa8c9432c709eb3a6a8b533930531b16388e0d9df67c46dd2199188be257c065c55091a1006ee6f8f93677f3f9ba7a7e0989b993fdd53a97b92b7a33d4ab0cda47ed4a26bb9e6f0ce3ce05f9cc563231e020fb655e76ac7276febba742c99f5928f17c2f5788f0f9bb4c3021dfcbe7b86cd1396aac2828455064d7cd2c56cab823e2e1b56e6f41db25ace49d092eddbb0913c13f9c8783bf986e7de6fc5f2db09ca04c6837730c7ecaed255c6147b6974a29fdd2e3b7140e3397fee402c9d478d879aeabb03f0f3362f5b5a2ee4d8b92aa97a0dc8c8465d0375d8e0eb3db05589a86dea8ee32ba2b040048f0ec7ed391691a1cf93c439737fee4445fc2750378f3c3dcef47310dee2ec95558e2fdcd69fbe4eed7fb4f804970c4afb7ea2f54486a6122bb870abac18656546f92efc00660503ed2ed25be1b43275cb454bf1cefe62865830ae736357dee7eb125ac93a308a7144662371d634c3ec003aca83647443cac5f8e8a324d2a8ff69722da02fdaf0f1ddcfbf836411cd5994f0c8f816fc8e5a738d6778d4afadbefd3eb830ca2168a1cd941d037f8f0889dcdbc7321b131c7bd6d6dedbef81e9162b8a6028696391a5f4d40d52e8bde21fc8f4df1396b58d6c9d125cf676a93029994d13255f14b6f7ef90fd6aab2e8d0e8297cb53d7faad0e361be240b127d5d275fb84759ab13a7ad8be346518eb425d471b2600b78fbe5218878aa6997cdee9baa4eb483c7d979162ab1418ba5d4de7c2609837607bfd9e24ba0aedecd13d0253aa10c91fa13cce0ea826bd9c4964e416f9d0ce064e8abe60dfdee2845d2c393196cc17f7f5cafcd2fe059b217ff9b97ee17b779401e701c971a99a378635cb6fa1389d6aa5ae5027d924743a3a4c68919efb780e4bae0b725df4e1b1d4f9a5c3efee2beecb428d4ea0b1232e073350c30d86ca6197b5d079bf1c9d0fcb1e705d2b54951027000245ba068b7c6d9af593e8ef64834d47489a673df93960b90c54ba259150e989c941fef9de78403bd7e8e6961811c5e824f43cf71e6a48ecb0c65f14d168fcab6eca03d7ce316f8b3a40c0cf4a5baab0ca4d339aef0b5d027c75daa258941cd6f6ad7260c1bc5c1ffc463b0be9a40ac7f96f90d269b60c8c583e624e0c11aa951a4542df0684fa5c699a5416067d5e2e26d9e28b90bc50b6f9ad2365f31cab40ec0e58d824e047914b97cab112ac35b49ec606d981c0c3083e013be7fdcaa80a2686bda1c58386aee9507801aec128641ac6c2fb6346aeef8ac2e86e122621b7e95131dbb576d6975ff0c12bd7990c3c94a19eb85efe8b682bb526e5ab6645767b9fc86cfe92101773fa7348076ec58c1991cb182a949b52178a353299114d4c20e389d4dee383d6750cad56fe52591635a8dc94af1208782bda71108f03d9a14a41310c4dae567c7dcb22f1f42c6475319cea9701834164fbe9418a9eb575b516e5c64b3ec3952fa51ba06685f0d79378e8e5e8c0b61c662f0dd48b1a9ad44ca7f94bca32ab8affc2d7f1f48301a491d0d61fb47a59e14cb84688f5d6b6a68052d4850d1490da9a0e764565c4c57f06ca7e23341dddf122499ac666eb2c9fb4cc9190ef9c7cfd595f49a12b383706b7b1424d77102738eaf01ed34326776776f3d69ca39b73ee4706e7bef37ab288554bb51e9050fd7d86540db0b550f463a17485483d5932a3962ba3be881298d314d25ff8716e670d2938f6cdb250fc4a05ee338c0977900498d1fe2b194b1e47b6b674ec87f43ca2d4dc70103395ed85b20574c5fe4c62c4fe092262cb3b06ec0fa3fb7eede7f0c9e7461835c73160998b03c3249eb465667b1363875db308e837ec4843a20773df183663ca92b1af0dbf790cf3d3ba94c95668fe939eaf2cba82006755730e94e86f3ef600bba835371552ec4258cd64920bc19e6618bbdfde8c600bfb842c054040fc9792403147d48ada0fad576b0535312225418dcb0c82334a3f14dcfbbc9fde1200e3ab2d7f3e3a993182af99213c0e00b4e4dd3581bdaced70e7116a7916e62bcf0a78668112d43d23291aa30b3acb4bab4d4bda8d2824192bffc4f7eaa5b8aa056f178b6ddeaedb7e38af6197ec370691a6e6819e6b4080aa8f51e412d504656ee70b782995848b1e7e5df415e86a646ce2c86fc126a21fc4b00d3f4927700c53615b79a72da6124854014aa16f6f8e05e316003bf4542bda9a03705c456d22c668f9d5f8cda0231785bac0986001de9d41aeb2b8b21f4996483d7bf61dac2618a42c329fd514eec5c80de4604269cd1f1f74cffba98acd54dbbacf938dd42c9564b145c5dcf21f8aaed19d238f2ee3519489898ad2bb00f235bfb6b34ed913871fc1ee5af2a832b01ad5be44ada3b1d53df21ea0145611688e1ecfc4579f5cd951a04aa8a5a1865b93fddff38aa6bd6f67b43680efa558192feb644672003e95ff12e9d7616108f4bebdccd422e0a46d4275ffbff3a7bba3b9ca3cf10a4202f71e0a24fb98874ea983b7e98de2dc70d3802fe2f9ac074335b1c002f429ed56645d532d8436cd9d068100d536416fd2b48796dd5bfea7048362d70ad1217f17090d388bcad7f7758079e1d0ec27442731e9ca09c5a9033860039617da07628933dd0dd5c8c98956ff072840ff2128749d747c70db6ece43f1a54d239eebac6b380b71437307bb78741da5f310bb10431164010b0729b55c1686427dfd6ce56e5a24c38d4c64f81f3b2ef7dda5a0e524e6302f2577af7bdc9f898ba5930528bb3380b8b57e60ab77ac5e6df651a89a7ce535fc5f615aa057624745d1be6611c591fa3c4ab2f6c235904063f7df82c374fede0ab2cfb983f4a63455889234e41716baebd9fa6d797ee58fa56bdb5b02e50594e1cf0c43744a26e0ccd230545d79656e6ee161f4a27b3acc65e472f89281f4c12bfe8f3c412fd5abc2c6593b6b8ac71c17dbaf42e639dd4b869792418fded79484e56b758531293cab094cf0895c922f57780ac7a27c7e92d6a8c1b859833ab9753b745bfb17c3e84430db225ad04abb9fd5fe5ab337773c3226c2934809fef9b2d9a6e981042508330551f0e7a248e1e546c42d79449ed43fbef745aae18f3d9745cb1d95669c521c1e1375a161209918ea32cb8cabee764637e7071f3b0d0fffab98672ea5bc3ff0e2418db5a76bb7aa28bc5095c487d12c42be09c7ec7c8030b54826af316d3782353d709c62b16d65e65af2d1f17a2655e46674a0bf82f38f2f53bfb8add3b43bd66041a346c9cb65e8d73d53d077c0fee758215942aea0af363b33f562b0614a186afa1cc5479fb797bff0957b49d1b5ca904307568d147e598869d72d9e9516cbebf153b427511c0b10c9792c62be54c51af4bf6a6fd90403aedbb67669e5f47ee010c2369d716774be289391ea80e07d756ba2669a6825ab425430cb9ca3ac1921997db50c424d7a6b9b829dbb3a4a13de16227ad16d62f820bcedd88aba5368bf9fc4f6206f186572898c0fe88509d87ec32f18108490f7404d856448393ae8440668b090146419e3b93008568800432213455cad46c504d51906674c602f1ef66d5a4caf76ec1ca319a80eddc66f438cc7aee775120210515b19107a01777e10cf23a7915bf2ec11f9e3d3defa70b77291670c5cb99d46bd5d89ba4a7019297cecb1014e78882ce25822dad5fa6b9671431bbf83539e7bf1537ce0b152a3e618c0b1285ce2955531e28c508b561b2e11757ad4c71e86e4f56b2f24d65acc5acacc3601f3d69d5622867eeb72d39c6b9860df450096f5fab66693662ca3e6e36d9e0ce8c486856243a9249c155dc6be52f09415d848af3444603e3e3e94e39b188641df7f548265c9f2b0741f275eb2210cbfa22d522b9cf1bd89424a644b97d1471a175cc7dc1a26a0f180dbf97316b8344a48d2063bafda91af0826a37b8e97c64317fefe2ad1c8bf7e80b78981ac14589c11daba097540122105e6e9a99554343f50ca6b9e6ab4a3ad3f005b5ec04c421e84e69feff6003c1e8492024595e31483ae9117cdaafc8b7db08d732618594c92ddcd2a0c84104291dc5e997ed9b4a149d99522ab2245bf225d848d790824e4630899e3e1dfe6f12e4afec92a1952fcc0d3a5ac8b02ef1c98b4735e4e478d34e0837779dbc3c32c7806e3922561605117e632eee86e250f64033a51b27d2e6fb36f9bea0dfa9931a0f76e4c98f142bedd160653a9b1072b258dcd9d5f86cf1c76f14afd79eef7e17709cbf259f94b7fd0cbd136d0ed5c5482fedbfecd845c0dc52b2fa674d51f26826b538ea62dfa20b4d8a41bd26c0b056b34eb1753281910cdc1c149c14da6cfa5d062fde59dde7f29c1a6a72ff8670e4ff6a7260f836ed9527fb64e8b0e925b0c83269fe58b07b5950bdf8cd209f5939713c5e24ef439b2020131c1fa10af61c4afcc81d49909d0a37441b9861bcf4babf7f490bf3c397298c4a475d1614be8a3897595f83cf1b96d56390dfda29304b1eef5acdcad0a15ab4a13c61ac03a9e08ca433aaf9329710c683a7faf2a613fa721c7ca98552a28b357277c30843222db2d54e033fc99a94c6c59111fdf18f54c287cf4259a00ced3653bf01a9f1941abed36a6bcb6f806662e0c82b94ccd760835ae922a81d0b01d7ae7987233e61320228d5393431362d430c8860c020bf2a43444fc05ec36b02d428a02669370ec6bb036dcfecbd3bba4acbb7d65e59a4fbd5580964e60e74476f6662cc58c5dfe8aabaa001e6ea5eee885c69523eba01118381dc608f4c2671e36f1abfcccea32fe08755bf203b6408fa4d982f729d571984902adae18fa71a15b363792a9e013b06a30def5db262d0ec542d933a02c6ed1d9f09d5240f7fbc23d4bcc1f4745f6ad256d37665a57888e9746d81d39edbf4cbecd2a5f4c219657b85885ee35b806685fb0e50e544ad151952ce1d5eb0fcaa05e1dffbb1bb82e407bd99cb5cb4b793f39ff10aa5f1c9e5c158606ec3eec64d60e4a7bcd228a8a2fe5807d68a4952cb29906c0fd627df3019a234f82ce9974c95cfcacbe6b9d6de25b5b1d425b985027967128fc1395e009acb2becb9f339a96345749ad459ff4a8fa749aa47b33ab7aa1b6a79e6d9cb73e46675235eb0a8b1b82ca8c5ec91b694f09c826243310558e062554423cb1d837bb4c06779fa47d7c88e1a5e71feb2c707dee677a5e07baca4001ed4ee9e2c165be2824291dd3f397edb022b03c5b49246a22eb669e3525c92a6faffd400dd53b66973343aed34c5b99480ee0980a8f611b5f5389869ec6b0f7020cc3f73bfed687c06ab5f23c3757c730309240d7840bbc20c4d09b9993a0706890b76d543d37e1c4741f44751ca3549de3f1d721c0a196424d1d2c62edec2172c155d522995c75776424d3ba9b4310ffc50a51863f5895829ec2909a0997d91d18cf8044b0722fa6487a27ab6cc0eb88b35102338c65a62427cc3cb212c045d2c659cfcb111becf2b71b9a2a6e93714b15132e7261dd821966e8dfcc09d86a65218801844f374afea830dc4107d38effe63ab01cc1d6505c8771fa0387a2726fe96094c24d048638e2ba9def73f70e0f0fea802cb733151c652e8c3f512cd5ec8d7c369c092075fbaae060f2ba8a1f0b7f1c6f505d908e5a302592446cb26737b57e038242b8daf06d6feeb2c9a4031654e7d9a8b07fcb529fd3c77bcea6c4fa97027fc292d32b5b834606412e1ab5a4cd25ab3af24db414cc35b6aaf4e2800dc1c3c655b0bbdc2a1501070f96a7839e5ca3653b4596d8210f725fc3f24fbf8e506953d9c2077dfdab76046dda37945acafa2326e00524321283b7d8de962c6babb6a4826ea24b8f6abbe18cf8cfc322f75f08b11eb612bdbbd6dbaad2314e3523ce196a4c7b7ed01a290526ca828b3886b36e316478aec8199cdd4c40dccd17e14c5b8a3743166a41bebf0099f2d38aa1817dfc0c54b04164992416718eed4563357bdea26e952ceacf2a4ce6cebccc3c188873e0b4628e90d2474632753bbe7373db04a528f06f04240f362cb9ca48e67a236309f82602cc62765aaba724d07f542fa0f42c537e8a772203e400f92f27f36f8cba341dfdb613d9bd81857f8fe530fac2c593d92b5138d92c36570d25f70b19dc4c1ea3f2cb60bd9d2cea7a80a3d2e624ef3c1aa8ac466a7ab494b123e4dc026cb1b4528df1593f58971b3f9f6f1b31083eb8b6c40365957e0b3c89b8efd120c6fd16e93915f989368492a44b759a47847e4190409e62b82ece30d1aa63f8a553a70829c7c60a3d627e7154a390b83b1ebe01156b00ba2b1153b924bc9fbde0e01c35b09fac0ab9fbf4e86c5a0cd7fe094a15da00d28532ed2eba4243893aaa7708d6e70519d25bcb2985bf2596086c4cdd020bf330f45bc5251b20723e71a1ff9ea6ba65b0548023690f7f3553bd483a338f45902d4a53dd319234012016748fb642eaf36265ba94010b3d544ebf355322a32836c4e7ffb140faf971018bda3e5352012db80b80fa10a8d287a4c6772f6dc258d933e8404d22387ad40d8a92ba731812f4d7c9f0cc7f02a70b496ef969a56f843312d0d57f71a2f36753ab37dee4059404eb8755e3831a6c3900bce4b25a6cc86a722c574fbf118ab60f5d93cd8dccb884cb06e5501eb332a69b5d90ca50cb328a4d3cd0a62fbf943a8ac87cedaa1b062dee70dc185f58e41e6f6930f77528485f715f5dcb2bac5d49f4d06e1501aedf675066a688af26c84448c114d1e8120ea68584d728067ec03ad23c75bd6caa3abe9c54d92c53924aaed4e2ed70b414e9b5c57f1ae35fb099856e24e7a9414c1d4c26f4b486d238c6304510ee3c4dd18bbbb8ba195dc9b63d0f357a33dc87373822fec9443a814606f44fa13324dce0e099921077b83edc9f19849dd0917e943dc721ae520bf2a1b15d29b8f12775ebc14b5be224c65f369e3d305f03fff87fb5e91b45ecbaea7571905ad14407d079898e7883b3e334880ab16a5bbed13d38e271357f03184d31fd55f66e6e1f1a9d49ce029841ba7672e103de0b0a48c3b71a8d626c578da391c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bc84e8db3ab29823469574c9b596e2e070b258640b33d402da3213cf53c7550243e3f5faca65791ccb4f456ad51adc0e1589df67d0ab448d486155b8b26be4dcbc2bddaf70383a6338fd234a532516647f6b6967a51d3b7f65fcc60af45f2d46028cded491058ead42e78f898a70468e9112d7085fb21792fc74ebaa7afe80267b33fb1e62fd1561b94ab2c94148f94e2a898d31c37ad5fdabbd3754dfba6e48db7979d808acdfa2b85ad4e4637d1bbbfb5add0f67aa31f709da8856ae5ec34235b5f9a170558b9ea06b9ab63b0014a800aa41c716a851bc9e4460348db50bd4c18293719c2f60a2442fb5eea3d33efee7b1134f3328161e67ca307316d44160e8e1257a4499f57d0e098429a13048a105d7d34bde433e8610ad4aaa237bff7271914e526b96564e7a3c210c88192a59f3bcdbf558a7a8e6a732472aaf6020d30821cd3a04a5f49ff7ed41549faf9ac8ce82a32650e1cab5a4bea50f749d51855f76d7a2ba7ecfa0026ef50d9002c1f455fb814ba024122311757feb22ab7c2723a1cd5efe2a55848b347f7b62aac34ff7369b0cb479714e97fc943a136b20fc1149e900e56a9e667b1ea9d2691ae9ec72a20e722d5a4c87ca9d51526d1a37b4dc0638abd12d1f58cb6e02d096514d8f4de73c8b989052e3eec5f7a7fc72a11cf6ac2cf20022b862b312fe4e4dce760ea7d75ec8f01e595966154033f30783402e9eeccee22712a78a8646ad493777177692910aa01e5f402b47d76c27f43b4824b03beb9996c39dec280b3e0ec0ab390c7e4cc00df6314984cec4b76750627afe99eeb998d02dafd64b9505dd39d889d2f0217095963e5f7e38aac3ac3f5531e285808609db23be1d1ff8d4a5999666b984b6bd0a865ef8e195343c8dc6a2fc3b34385ee72f83ec049991f6999fdcb8e1efebe92a71f2f9c788c6bc6b2ddd84658b1ca4a87c3fec78396311eb498d46d3a459ccc9dc5b8362597f9d67abc3ba900afd8bda4bd20d55d22d371f87bd32898b58eccb42dbc524c8294f00fbacc62fffa1e6e7c6b6707427f2121f9437811e72a7ac0da7563d81b0275429e4e15e5d80b67392bb1cf4a75ba0e4ff27c7eaf72681f41c5b94076ae263c0fa311547a1610fd4240ed106c5c5529ba611dc1155a4541562e4c4fff585ccfa3a425516ff917cab5ebd4d5b219795887362628789e9e996de906eeba05ed747c4a7c532b092be5e7c14750f6ef6dac5983ffab22709d942ecf807869653657e89a98eb298e2e24d3ae263fe4f25ac168a715d476c85d532eba1a43448019ab43754a5c0f72c620dc0856dd7bfdfea72ac7fa7d2ce9705c4ff0c6e91106f47dde089cd6796a8c6c5e585cea5d0744a53c28efa2b678e98817411e583191d64ad5c3896a9881cd6e642b104ceaba79a47ffada4851caa7abdfd8803597a4b4c8f38e278d6affd8934ef17c495cfd3382cd36504f10f3eed146539caea34aca98987dd6f6a2ab44f20346477238e09335fe9ecac88f385625b2573710a88a48fa5da761d39a340974ba8bbfb6f1d5acdab9d8b2c7ceb86cd60ca7da608ea7e79c1659346cf59375847d48504b920364c08bf17d465c7eebc57aeefaa0f3312880108b954892aa76b5b70886e1ead98751950a4af8d5446481c7141c3351cedc596a3b132d471244df56c2a3c28a7a3e7d65762cb431a8e4c093401ad9f50f8366e6b24e9d0e6adaf1ccd219adb4e628eef8d033872c41ddb2a5436b91a8112df55813b5ad6bf96fe9a3b5b1860ee2e41f35873fc8141da0a6753120d91ebf1c4fc8b3b58d4bdbbf12449b1c48331d6e36ec303cdaeb58303eba7e478a2249bd6cf81c5e11018463ab8f5a4fca2813ce0eabef7d9dfb310060fc7b0267611463c81ec58753450ab7e7f58c7b3c7c286befcd33fc317c55c4401c1a1dc3617ffb7cd049998449927387e70d519b7d07ac617f193409e6a965ff20953978269c3e73dfeac852d3dd7a09a058d6a79fda1133992caa3c71ab2a85f857a05308b027b017d085d73fa9971e87e527e23299766a1079164e70d1ed7750ef7e25a976e69aee6e35e1e46802b958157043aab9f5b8132a250fa918cdbc69a8e1b191c06c2c433c10342e6f6e7422635058914c099ed0a435a8611e141b46053886315b8908a4ab6a0823aa1dae7329656270d54b9c9636205297171cf4e63c4db4e810078d93d765f78f224562a163a5d5770393bb54b666737a0a13fcd5e8024cf8e25973f36925e92823d81b4d6260365454dc01dab3a02b4190448549996fd8ce52a0cdac9ba702bc485d4a62d48a26650fc11c0eeb60232787508ecae3395529c41e86c024c40cd153474d8698f035e8fd450e41bfa57fedf841bcdf891e077c1c5893d7c5c8dcf0ae417f8d141f101a94ca97a859fca42e92f9db94cf11b70204cdefe9ca4e51934a1225d0820b59ab2209c7f1dab9df65e1bc80a3e9a862ec63f73cd38bc4b7794eec4c67691bdf18d1cf601da22bf100ea9883f7c079be1b45647b2685cabbc5f5ac0f43fc96ebbad1e3ce6c7ffe25e72387d0ec9f3efc81de04e8c6c1b3a900aa7aa9703394def15d532d649064b40ddd3fc1d71287bd5985667356034f8a39576b3492e9d6c4e1f685e159b40085473acf9bd1c9108d8b4471a62ef613d67fcf44b73f22ef17a03c9d10c310449479f710f7ffc66784d065beeea0977b451c98422f629da448a54bdc442b1e19a55e8bac544f6122b1b7d185ac3bd4340f93c3063dd337940b530c39c443d17f15f1bb7052402ea380961ee19a83271eb9c53341996a55ef77ba58a696e3cfd7c37b1b992047985be1a7bd26b053571d0dc84b1265a97d03614c2d45c0df3b61d09c790336d24226ba600c821d29f8d694bcdde887fe9f0c0fae0ee60ccbe55a520eba4ecfc7c9b734612dc9ca777571e63ea32b1738677fab634dd3f0e07d625b045142142d3e204ff5f937883c0fc6c9855a971421e7bdc38bca00cc9ad32f6a556ab243612d3964e30574bde4ed1abf7352fa1dd7ac0bdf387bcec1782ed6d1012886e81fd3e919a53c785cf0c28aae1248766ae9653ac43632c4f6d3123c240c6014ef90111248952452c5a8f19c98e1a97e9d856d7470df70046359900e01b3ac906fe305277d802781a7a02e5782bfea2fd290cbda2d367110ba39c1e3260a1b41d88126b921e1c34f8578a5715303d80d227de9aedf5337b602165972dc9676e40b9b118f8e797606271d736e42b518f74ae72a3333a847a79299b4de1db49f426260bdd5454fdf18b56daef690264e7e675b856fdade54fef5aac36c52657927c1afd0868c13b7ec29be409913cff2b9f357c7857b83321b3380396de09abe5517926ab23b40c68f8c971e6c357ac81e6694b5d23d2674711acc817b1dc6a1e9cab51bedb61eddd5b0d6502fc766505315e2993bf6cb0136f8fdeb9b9cb3ba5bae4d1a95275c1a78b159ee15bf47fc7ca1af3be779ef0c7a3f45e8b66b7c0f03cc8870272ddacef8efc3e9e1867e2ad2958a3d48800a8352a4a3de143f93254389db5330346705d7566c2a24e2a5c4eb5cc432d3e55e8aac37fe77903cf17a13e9e5da6e52febfb491528370980624db7427366cc841aba23a6680aaa39ee760f9c857541e6a6bcbf2a66e8197078b70361f465038bf9a1e44be41a48facc4c62972d2a2303dcf07f82b7ee979a31e292ad84009b529ff0512f13c9cf14ba87f5da317d0e3b468e9ab258fcc87c87c6cf0aaf7db05345edd6309e451704e85a52a2942736e69d0ff9a4ab7b35450ea9162286711d4906a5ce3ea7d3f79c95c93d772d10a39aaca284d118f31857213d9dfce4e0f2d80830c0816fa8c6850bb1f0a2a117879185361d7ca996ec4f94e21bfcf117e396de524f3e3778540bc06673decfc447b8536574bf8166febc99b876ffe55e6777e8ed486cebbcd594a307ba3d5da6e666dcb1ff95880614675aa92bc3f1dd7630ae7b84c07abdd42254b9f6961246f2f284b12e0e32265603d0df6d9b99184d8acd3b064a4bd22eb031e244d269308d4241b05d49a5ddd2d3ebad6701dc8eef502cf633d9892cf84e6c1bc2a53ef2121e8f791bf2fe36d631b5f3064c5ff47861c969c505b5d2041cc68d922bf12cfc6387d124b2ef3b22511481e07f601765930beb55e8781aa71cddc70856729453aa7350719d9cacc1e23f87b64c70b0ef52b421faf36b393f2a57889e42f59fbb16ec710fee23d770b5645160fd5194ce609b91291de4eeb49588ac272219fc701f29a2c3fc50dcdc0d2d01954a910b963313b61dc88260c7c598ab3bc79bddd57ca1d42cbf8f1f0d4b8186729ffbbeaa668550fc36e510fb3c5970804272f57c7622f51e63303ac3bf5b0ae45cb28b7c985889c39ccbe15b30c3909d093093aaeba34cd089bf87d16e07257cf21444863ec1d131a5e8a5724d02959e748919cc18bb8311d5c7452f390883f7b693d2a0b54519a6ca41f9f35443a85ca48e8481cb350851bea417ba42be4b3bffc76a7e71f1fbe9c9a8319f61a7abecbbf218c377c0ec1c5512ec379ab333cfef78a0f88bfa516e5b0dc37b2b9387107cd09c0a68454762f69d4601a500a0fbf1a5746c22efc2bda7fe595cc53263fb759eb0adf651ce221836c34c8e018a9d5cf7f11f0b49adbd2f8b844d6bc889a8a12d52f96543da3ac3d20f4f17509e76999212923d584a50626b54f4d50d0a389db3648d29371df62dc49ff938c4ad51d8e49805f266555bcf22bb261dc8a8efc0ca6f6d29aca55e110d92eaaae583d4cd784529f7998fbdff084dfc260eb1af5e1ed3a43993971a923b803bacb3cf3a493175152e8ea3af1e1862a467bd1d29add3a47f6911d651e4a526da163b8da718ff5ab6f95d7468cbd7d07b0323a75cdcbf7cd1170d185ab74e47fe508ffaa30fd847e38fa2b42bcb83cf67516db1b773c6c3d5a5cb22f425cb57d62734d1534e816c2fef0a7d30821beae76e216c251e9e55fc1db5096cd28dde7943de9858bae95b7e7032f2076cbcc2b7d934219ed0d3b29cd049ee94ec5ece7ea9f0c6fa2faf6615cfac2caa63424c72817baa90807bae132b06b21567393c8ab71827e00103f0b9cb2a6aa8e50f5260a301d36d6e2e29fe51d46f50b1a7fd7e89a790b98fe62bdae71b24981e1285ae27a8e2e4eeba9e629f477db6378aef7d68492553bf89a955b4ae84f96927035e374aafd9c7f49bc05de73089991669eab370d7a69bfa6f322134b78e67959ee7a2600efae6f37bddbe6c6aa49a068bcdcb92847dad27b4cff7b37bfaad5b7e441124e19eae304059ffe9fbe1fef5b0f153566c05ba49cbc75a057ef7f5f336a06ba58a4cce365cf207eac2ecae5abb2d9077bf252737abecc3cf30b9cbb68d66a69624eddf58e9c8d8e20f40cffc0905bbcfafb57c09571e635f3452e6a459dfa0d548658a9fb0b1837d10478c8b17c1300b42e8eb462eedfbdf85c5b7291c59a05e8bae729ca8fb7e9c32a00d8bf943f6412413f660c9807fc931294e5788ba2f184f2bf69e67703a868be8f0b7029284768f88634a6a185a37d1b4ae0d7b858837b2e23b07d9fd045d73849e5a8cfb279940ac515ca97131e703455ff844d211b281761c751ffbeb44059b32d6a8a8da2062e0a493db7cb050e3443d7f76e37ab19ddc5996828ae143c40e753f64a433b381424363dbd9ce965f84d001c686de80a04dd270d4d3e2c3a9ce3a5fd5e8c50e04280a3d3512f90759f2c4afe03dbbeb8cf183391ce2edae7bc81b62699ef006874cb0c95b8ba5ce0c5361c4e8ef358f106aff304c30acf17015144895b812b4a61b9ac841d8f4402f6484b275e18350278471fbd47981fca3a0be0e5740ec259867f4e88c716379f4fcc43dcd432904918a0e2a4e2615ec7cfc2584c202722413c8a843bc3625ed9fe76da0159d85ce5ba462c23d390f163e7b08c4c1f160e8b4989cad558d913696b06817912b730edef40ae3a1d727783ddfb5fbd0a8271d6d624253957b6209a3e2101afc2d2df082304be41b2141a6e5c38eb13df0874cf402c9cf57f6735dfcf0422e86efd775fc578d64f78bce8a0b1f367a0c7cb009935f30c13a7713b029f6ec3748334b3205c5d2ceca3abd81f032003cc90b6fb23cc284dd690d1be1c2bd3602b60891d3a52982858e275eb6a1ae5280145c34c207c556acd3eb36d771f10e13b1f3a1101c047328e40d4cf45bf7970f14d91c61811d24a852257d9bba4821db57af1b326100fe262b492fbd7f697fd86cf44b5a59c3e86d2c22608bffbd534846b9bedd97553d7a047e834249650679a7d018e9efa60eef00637439841e761b481cab5fc88fdf3c8d1d61e22005790c9b1b52da8160366b372087f3f7cb1eccc303a85a8879a10fd6cce12319c9f64b95a3367d885268d647a2ab5f43166b2d5f94516b919a55c6a03516207dec1c0e73ef454c3a52487552109cf635c1028883040af0969352b04f142c5ce8a2ac5a37531dd7b6a3557533c0ee7a25fb25eea77de284898a0e5b57066c1edcaa2292cefe1bf43960d7723c27f56b3d5054d037cf14508571a36ae42ba5f9eeda34bf5915907869bacc66ad83d2fda0ed5ca9e3b073ae8ec047d4add458669015850c248cac2f8b39f2da267264e7bef215c6ff4651b36cddef2f57453e5ab6de7ba7a7999fdc66fba3c60cf8c070dc2e0bd28c9f4cbfa049f4af736f80bfbc80d585831d544f961684a35b14a41dd40111c4274d356e9f2fffbb4eb77b0edd58a4490a34f5a6b834ae596f349ba131263b7e7318a4646c936475864fe6a14b0fcad82eabf7a355ef04ab0718a8a3cffa114c551f44a6a71b864420036885b89c998b7f47308426700b800176268b6b9cee4af3be48c003e6126cf4cab9ff061606686a373a21a7a4a61ffd7df5eb769063ff6bcc3682c5ec432757df673f9aff6c1a5e8f675790f8a6b8751d7c79f8db32b302c1d3a9b5108e24ff30c1f2e68b4801ad433b141a46e9c827c538600278e65a51f8ebeb8194c77fc99ab4c91a6fdf75c292554196b8eb006e652c7c97018db8ce3f7a21a73296bd269e6fc1c42d3d02bfb145a5e4202d6056f40562bddcab9e81e69add85439c933ccb2dee1b333181b2e174802c8cda0ce8bd936e20a418794fae6ed58c0e9b5ea91e61cedc091665bd7038d7af7cc9175e6457fd626c351aa03a5d76b86e8f090624dd7a6575c3f17994423f9d70677e3a84d2965ee6d4f70614d7c8998b741a9e9a81362a1b3f7746013f35ea2919966e3030799dfb7e263e63ed9a9a936a3775c17ddc139a2aa369d78777b53587088739a8ee9bcfe03f561541468090308e6d21db9bde1d40095d34a9e0a1513a7fabdade1309fa77f80d4f51bf8f92cd49cf74e48b80d0413fc9fe861e91c431838091e61bffe94a9a8f9b6448660dc7c3fb8ab8c6a9467c4b580fc6c588b702945a125368261312a9c40e781066b77dfd95afb2278b4a737a0ddec847b48045366688b9424a694390a111165ab4b28f2da525cffdd81f0e3624e10a52ba2f3891fffaa0ba1c650ffe4509794a404126470d811a81ddaf0464d5a8cf31b7238e75ddfa9999f975136353ac68eeb39d1a4f66a71170590e6ba91aba97ac7d039428c85fa425d6d707acf1411618a144f08549f74ac6938fdabc25e7b7a44edd8b3213fe6dfc62046da4aea5f4b85d48c09c01a994ddc9eb0c5a190416868476134b991eb66f16b224bc770cb2df36f42a33b413d36e3f02965f9a2c3bbfbca15be770786376e7b35e7c5a1c390ca07f98f358b981fa18a0a0bb6802d3a67c4d2545252e71ebfa6df775982ae70f9eb737ced39f1921263c16d261f5cb1b84dbf1a3a578fd9460cdc6122265527d34a19480ec6851cd28b0740a5535a9b45d15fe0f9fe60cfff4e8bc840a14ad0388df257375ef8c0729eeef028cd6aa863ea0cce6951d4a6adbd0052ea14349f4726ba763d366319da7e48191ae3faf38a03351e4a5af31c70e3e4f69cf995d783853ef70a9570ec0c7fa1893ddc28104bc29b905e66d618434d4a4c80e5e1503a771751e3f84836e63c020f7d264cd62cb39acac61b53609c3a399e2ed4436cbb5b83f185dcccea986e5371f030bb0e3a25316026166aa81c8a8a3154b2591c52552f1c30da447a2f8377058202dcd2dabc90976bc9b3a0fd1d782c2d9b3fcd68ee62dd5bcd2813c4d80025337a5dde84223aabeb91a12a52fe38fe7f2e5d689ae07233260783eb1720f652d20789dbdb794dba5c941da246396a4de7cf19fdf481ef78ff59be601f0a220b7e5991b25dcacf8edb5a637105fb139c8d7d04d9e88fe3559cf133aa38725b8a4cb00a491652676ca731513d7e03bca1fa57b648a25f1f7ec079b7a1aeec7598e1c0cd228930df20e2aaf0fb97c8cb8e4567d119d3ac25fee1c0e031575eb1e1e6cbdf7a6dafc444055ab1646ed0e0c63774b222b99e08096a0d6a09689dcf8b80271f0082babf29a6260a9ab5021edec8e6a3c7f915e0b742437e420443def7aa3f9aedbb3089fd0473200c31d7ca20e403d3bdcd40b6e73dd772610cd582a1d07d07500f8c043a1098fb3a120d93ddf836c3775a5997b9842bdfdc78615dc83d7bbe97ec7c1c3d4ec504158ab297b755facbc9ef00caaf5c6a4ac45e9dba22cc5b73350a107e123276b84d96601fed3f2e1af18ffa29517dc9cd046d273428627889fd18ddf6a8ac8901509d53bcb3026c62570a0370505ee1d6baeb689955c4b39bbff2fe875e5b9d3eef2a5f61b570ef043bf8d7b7d8090b37364cf01f7b5fcefb538998eff4fee8699e97fd0c91a62c4960b64e12454eb31fc19b3978baaff0c43bba5132c12c27a8817a3e2ac0bb37a74dbaf602504d61538ebcb03aeb277acc64760bf3e0ca2df55da1bcbd00187953c3cd968a90b74beddfe008f90be48bf959091b68f2ce78c0427705411b23fc2e764957cee78869647b67b61da29c33403df1c075730af2246ad2bbf059c962b84dcaaf2de43237578b2efb92b1f66cd6c29e5f5adc2304a87bc416bd71c53350541d444b768f9ebb50ffe3255001f0fc4fa804731710025f253bc005adf1aba619ef6168a5722b185d5075211abb9b09ed00db760dee50167d39777151d14bf12ae9826ddae793eaf601c8aac2f1603dd3b62fdb91ac326063c999e668d7171c98a91705a6fbd617041517afb93d322a823b06ea31a0d6129b0ff9d060305d6dffdd764d02efc129a666ecaa0f109c4a30209c4bbf2cc2156e984c9663ac4bbd655a4a9678e735cdd555c9b73e34480e7ff2878c5f0c29e6d2524ebdc6b67fbd291c3f8509500460649f3dce066879ef2c2884902790fb1309d3e3ecb6dd42179983bd11dc7c6180f27edf97a1563c385127d43166cedb710db3eb326355d00ac08aee1ae4b2b399f357695a41b25ee6dbca79d973e294a25eb06f5159c44f129e2a4068d1dc1eb8f1512dda907a11b911c85a54800f65d91e5dedb9cf1fe7aa027e3fef4c6de92c73e56f96e368acfb62fb156609c72dcf3fc882f9fb889b15b57840114d3709482805b02614c494e95cbc5e382c61857a1726ffa7a88cd135fb8e7ef8e8f24169aba8a356c0a1cb0bf90b26f0d6ea59bf882f653d7630503054c2e9785b21c83f9c93a33dc13c1cb3e7f3d8fd5f40e0e92af02cc4dc37bd1d49bb87dba6d410523b4031974279d9275920fcf8dd50b72e781161bd8a6f5a5b70b096d94c671a0bad05b3ece99921cc250884eaf550e685e12a6e00f59c8a8259c492973ed998444f5b9797b6c342a49aa808c54ef3dc1a65ae297db972936f7cb88fe731d572f423599630d979142643e263e5a773d30915fc2ed0d785197c6bf6bb86156607b328a58a4bbdbd8bb7eb4a2cca4b9ce799b20c8532751c2e088f3d0846326a69d42db34360f8e0a3c5ac1cc5dfb5ec065d68f2b4e5755f890491ca7e56b65a9e70817e50683241b2079fa9fe7f537f67e4434bd5dbe9b194d6913613143ec838a1ab8b219511124290a1d927944e270325cf7bbb21c3a01fe787364101d87777bfef36cc977e47f787d0c39e604f840834d9f086609a28b6b49ab83155ef32cb6193a9abddcb06a6993cb40a396c1e085f600347c2b7ea619eee2c5bb3eb816d2822c46b47d59f1b639dea69ad6a6fc19b2d5418eb624d5a92f26e550e71da463a9f0eba29510dec09e59977dbb9522c9eacda7a6ce1f07908bba9999b86087987c2c38f2c45f85a8de97716957581746b992239e0c96f6d275e9d07e36713de9a5a3becb94ec5621360f8d248a310075ff378af138703e50329bade76649dea85a90e5f07729a94cc8e4f48296f0a05c36c82e3500e6f46b9b1db46b420c39de4b7d1fb13e89bbe469876ee4b244f3778eec28e65f3a2c2e7b2b311e6f8d365d8988d5822feff28cab30b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8b9e0f2b3a223d82087ffe594d6d7829600273de919a96d0f2452c8716b0e2971dc02a61525f8694b8eba3679238b73ba37383d4718993a0646bfa1c85b7e36df79ae1261ff4ca2ce7b777e45a1a3517acff247e2222ba73f65befb42d94faa88a8c145af5154477f14b5a3cad90858143f159c5008cc5ae69a762298adf36ede7314fe0084538acb9229198e301e0ebb5ef62ece69eca57cd1fc0b905a662c98fa62a30bedbd22ff797add0a167e1e953918b132dd4cfcc8bf7b3ce1cf3002f8917dc4552848c9bc21771fdceb0fbd77dd7618123234b6743fd29dbb18c23b4eff50e38e0409f2a2cfe4bbe734ac85d85b5fc05191402986dc2d4a278956e4fadcc1d641158c05428f7128138c785bccc8c06c59ba5b8988c1c3e5fc92bf40a959662879fc2f4b00a462335ce971e7f7b7553261c798912ed9872328842a1394c84a2af5f1da00fd5dfaa87b37964b7ace8bd7e110aa7c7c65fce19a17c8049488e80d95cea228134b5f05d3f17cdbcba1887fb38279bb6864ec4ec191f1d8181784b135b363978b89358ab9bd8bf0848c1bfcc1934e2de2eaf3f5d2dc23d53bb0f415ee675bac37e5d1e48585a105c9478cd94ace5d1059fc3258f7cf8a197c9bd0ec4658f223053c53101240ca478c11bc6dd8b94462c1243807156080b7f827d94ec85674b703f5fcfecc7f90af2f65f9ba70bab70e474b37b2544a425df406dd0775a5d8719e2316963d53f13708b31a67d7a996ec0b1c4e320dfb25938a4d081e1009672e318779468ba2d5d507d924327919f0b7f76bd45a306cd4fbba5b2a0e945eab386caba321d452a62ce40d1398a7ca5e447329e657987178f006617ca5191dee1676d7a3a566f841c8b82cd9e89bf947c3fbee75125093190d512cb70bc167c29f62ce2c4d82c7279b27c011c3a1e5adb5dd8b5cf64a250c590a0f13be4f38ba4c688f6af4496c396c1ce97cd371499471e890f1a421b94d404192af783fcc4b7996a5753725731782f8b9cda9f82fb9a089c4bff3bda28a2baf48fd97443bfe8f95ed711efe9ccc4d2e1b65f5d67bc49503d8fcfeef5df2300b2f2df07382924451c22579bb55fca85f02e8fcdabf2a2ece3f429204423b39372379dc6d48b350b5c16e18ac78cf212b2655bd8795b21b689039e49820f4e6a0299d74ef23968ffce5c98393395d2833c092039a02861040a9253a0611f40ac89a828c9caa407cf9dc57d8b048d5a07341b8f9061fad1d678bcbe4988db97e9dbdb353e7a8ea5655554b9d7b5992d4983a6db77c5ec95a462354d0db9ca680e13ffd6ac07f75f52462151f914331f89b2dad85cd88d44bf800d4c6aea0fa9c48b7fe25b3ea46ecff43c89e285cbad27ad0ae245c46be7d0b9eb188bdabc3b9b501c4fd13998ff2498aa10cdb52f8e9aa2180b52dd722214560934856cdd413a0844682b450c072341c396fdb1e7232c83311f95461b43d907a6cf2052570cdcae75aec4ebc2d21e111223d0fc4d75df4d53d3bc893baa3fb91ee99b8009d76f49cdaa476894237758fd795f987ec95f88ebafc6e509a9c56c704d1e07772191bb0a9ea2974451471ff1131e8fb0880efec56f6bf6dedcabdc784ca30190db8aaccb5d972ee5227958df1586556fe6c9bb7fbfcc2dba5c2b9c78961327635d147f663cd76a5442dc54e0e1d3930f627c8fb36bd813d59c49a62f5c157c5b9250e58aa02851eea9f6a2fe14857750a558260552d504bb9039d777572fa71f52e88a1841ab10a54b7aebe94046a9a2c7621c4df3b6142fa3a1e2cda6332b927a484fb9578186e5e9f47438f4a2a123e3b7b34c88f5c51739649e5b87c5e0fe8ecd68a6278ce0afce79a7b82010fe7f41d71e73d804601364a3dee89b9b919d51e1b8f3fb696fb9787df427d46e75db528a051fddd1e4c314c3da0ca15e03c16be82a0816fc0840189b0ba45523e7fb1ae5a1c98b384689d8775ac7f675f7f1f4a28368032b30795986ed95033607aa72689c44551243416db292007da123b7700dac53ea18973b24c63e9f8e0331450d672b99d1a9bb7116444c01f46040997d6c720d836e0daa109368db89927d2d6280b22684f581cb129268295b281103746348c288f0e904989ff638892ddca22952fde2cc8cee6dcc4b3601f22e7c27f1f78427c324d57dd56437cb31462909da1a0e1485691a47858c36034ae13a2997b7569d8a81a62494bc56203c57a3c9a6bfa3684aea392df1a537ddaed992814dc81719e95e443a21a85d03f633438d152b2df343acd7c2c570f3b2bfdb0a057c86b3d800c827fc1d4d39a4f6b22f89c3774296da68ba5f37542753eccaf92a8d0742951dc2f4cf4a0d19de7456ad4f7cfeb1a0f6fcf9af6dabaf462b4ecced3d195fe1b2e82bae23af088ed48f9dcbe3704ff614adf382373dc8dd9432c39cdbd48f2730e08be81dcce2179494f98da010b7e6164ddd88f7604b1e813505b6803d9611fb22b86801b986ee8d72a5e6d25dadf9f13e4d7c558e045d6c9ec1f7a607414ed6726d08ac780a2dd5bf5cb03c8bbd896fb0d94aae4925eb2f24ca2783b7a061d9bed376b3724ad6393ed08c817aa5dd9ffbee22f3656d0948d312264976dae5c6b2dd5fe93dec513c13680c5371a6f742957e248ecedd5220472c28c930d2f2d863e52d15af9e1570a88b01c9632dcc7f038c4e264d83997f3694751f808788a7a652b5b00361b7588a0855f6fd123434766ef36128b2aed370199f1b98d62a7e8f75e6471e248cd7ad615d1cf5a0e037d894a007dd467211ed07f0564777b676f88de294c659b5b7ec9dc46f68529f518d85d5c9be6b82ecc73137a7c3a9192258d189ff7efb598d202c501c7606b48c899b5c9aba85aadabc1d67c055d998d2321016823e4dd6c2be473bcde5ad5c7f4264ecad21d7252bc5418e74c99d7db7675aa9b5383dddf1082eb6bbe1efbbd05487ef3a61315eef3933d32ddda3360712724cde070e4ed36349abb3f756881d3dfb7fc71e646277abc197662d1d81b24b70663b347c0e06a2c48fb23fb4ed42716a72c09033b386563a08968c5b55dc9a77c7789896ba14266d3023d388b1811b87d21454a90d8d5853183d3ba3d3d3f8af59167d120ea504acb005d73a8169f59c8c6cae07dd77458f9b28a11a6f08d65acd478c814d0eccd98ca43ba251804df69c446611a42977b6ef9c09cf906329317c0930a6e15832957e8e51f34ddb288408d57a55ccd6e9443cc17a81ad57bbc52928e855214afbf1fbe48138fbb25a71df3a1cb2abe803df77e7f7086ba591ecb7f098b0d96178c161a9ac146fa4666731ceb355c7c48baf392f2f02e3545d448c0237c4b552a6e6cf0cfcf28e130ae50e41a9c491bb05d6baba768677bbc68b682e136c6829fc30c93a93276ca96ab5170e3c41d47031a0c1de7fd5dd6da9730e79ecf095dda3ab815e3a7f451948a098bf915ca849de967d2a11ad8ff0376172e67b065364d3bb28f9ce095fd7f31df4c3e499d6129ac17d3e1a243937503878833ebc0280f781c3ac14164b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe950fc8893ce690c41c30bb1a9846adcef56fe53eeb84398327326ce74b71f9069214cebea7c0677ad4c1c530bb2516bab0ca560779be256a7260acf5d576b9b3118d409387e386ddf67b1f02a03542b092edfb32be734144f947a53916972e39d515f7bf0f4839e721dfbf7814e4a990deaf77cbc2517c38d54e651caf8a34dfe0d59daf186fbe30b578aa59f9add67080011d2b490316ec124cdf0f936282d5d0b3ee9c1c79fe5f6cb5d7a3359f607b62472ea5bdc75008d17e4e608e514be761c2" @@ -85,6 +87,8 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { #[cfg(feature = "try-runtime")] fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { frame_support::ensure!(!is_bridge_stuck(), "Snowbridge is still stuck."); + frame_support::ensure!(is_bridge_upgraded(), "Snowbridge is not migrated."); + log::info!(target: LOG_TARGET, "Snowbridge is migrated."); Ok(()) } } @@ -93,6 +97,10 @@ fn is_bridge_stuck() -> bool { LatestFinalizedBlockRoot::::get() == LAST_IMPORTED_BEACON_HEADER.into() } +fn is_bridge_upgraded() -> bool { + LatestFinalizedBlockRoot::::get() == IMPORTED_BEACON_HEADER_AFTER_MIGRATION.into() +} + fn checkpoint_update() -> CheckpointUpdate { CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") } From 19dd36084f49eb9cf172849611b9f99374fe51a3 Mon Sep 17 00:00:00 2001 From: ron Date: Sat, 18 May 2024 10:30:47 +0800 Subject: [PATCH 19/22] Fix for clippy --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index de18fb91b0..c2423113f1 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -49,6 +49,9 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { if !is_bridge_stuck() { return RocksDbWeight::get().reads(1); } + if is_bridge_upgraded() { + return RocksDbWeight::get().reads(1); + } log::info!(target: LOG_TARGET, "Updating beacon checkpoint to unstuck beacon client"); From 44b985ffa3781115710f01579f8d81e731c87258 Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Sat, 18 May 2024 23:32:38 +0200 Subject: [PATCH 20/22] Revert "Merge pull request #11 from Snowfork/ron/unstuck-snowbridge" This reverts commit 7bb13b7ce050646a6caaaea0f1b3f17f81f28f8b, reversing changes made to c8eb5ee71818f13a7a3dca63980f6f54104b86f5. --- .../src/bridge_to_ethereum_unstuck.rs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index c2423113f1..bf1586d53a 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -35,8 +35,6 @@ const LOG_TARGET: &str = "runtime::snowbridge::migration"; /// Last successful imported beacon header const LAST_IMPORTED_BEACON_HEADER: [u8; 32] = hex!("8ea383d85a87a2e27b088571aaf219231c1f6b3510d7be3c160eb1bd93dacc25"); -const IMPORTED_BEACON_HEADER_AFTER_MIGRATION: [u8; 32] = - hex!("84a581291c4a4fe66879c4647a1084ee584ea5c8ac82009aee323a66bf865e82"); const NEW_CHECKPOINT: [u8; 25122] = hex![ "80c58a00000000009cde110000000000f118ba039276d46ba87cd50790e2547060aa6cd260476bdb499dc38ef834d618910884d25c9608dfe669a39ae64814db99553d82cd7a5bf5808240d2dbef04e6035075425a8cfe9d2bc194fa1ce245681e84909e4159e0c5cc1be7f876ff57d0af821d9b65aecbfd133c02eeecf2d8f64a164474274529f0a0fa9f8ab033cddc183b5dc028ccbc6c27887cbd65da8d4b8d6983ebcf4a910e6e2403b68f52628fb555e3486e21fd446483ed9df35377b07851e0e07803b7af34cc02494fe7a71fb32ec66a1c279dfa9e12b96b4a1e44fd1d3ca5db007ab2b953f6708514bc65ea545ad562b10a900bf3d9b25b5153d552ac07a256fe4f7761a5f9fe130c8e65b8f35ec53499db3a67c630148b7baf1ae8b79c00ed0c5f8f808bcb9e01cdeb963d8a6319e82af0f8a64b1819e2b21ddd3b07b74c8ef2bf01450a4bcb4180795b745f2f11c449223cb5590c155b284ef45ca108dd0c6e2ebeeb1e93bf710e1573e1cf7d2e3ce4c45cd5e5cc6aabfb110fc1c748b6a22677b333aa36d283f3d99eb09577cbd44b3fe69dea5d5651887877aac4f7f7eb0856e272144e187aeb92df3bc4b789b16ccc3b9f014b60b56159692db7f9ec5f2bbf753c0e19a5a22400b614c45da5ee07ff2a4558c2038f3772f2da1772070d65ecf063b908ad751a192cf1aafe980d1b628aff8bb34f7cead01aa4baf5d8be084e112f2cad65561c40a0932cbda6d5d37d6650500f14b7269575e1ac157dae537eab19abb957f40043c71954cde60e164200f453233a8b77fcf8ffe5d95463b486da0e6e873a1a00d3b04aa4f0672ad6b6d03180cc0a089adcf50b7e3688c68b47d1d5812972cfd5952b4197c414bfad6025d8c8f060f16edcf8ba8bb9075672310a1e10745e4e90fbbbc61f2fcecf5399045b103317086f544bef7b5414e373401b13893a7520fe0201de90c58991af476a86d9eec14cfd0baaad4278204b6d822cd32414da207ec86da840cefe31c5cbfa6ceff0546294c296e6aa5683093bf0a69ba502c89e50a6084b899a36f3d60db2dc9ba128210c4e75d76e83799132cbd4fdd9fd17eb704703cea9df391c83d66a2d7ab894cb5a15a575d1e71389b8c57d63ea48017254c02c106c64b3e8aa0c2f33b9af3ebc44e541aca5e69cfae22549ee562eb8e825d81830317e565d04563ed05fb8682f1ff79e0c855990e03a9d18ad8ce8983fc55deb5398b333a26db57d0e690ef6ad56d85512859d9bea389877d01d3fd8ce1a0517c87ca515b12ac524c47439b2c4c00b553f8a9a6831fccd0641f8eb33c0eeba8cb5ed88e035f5bfa079644258f5077483b45589d5cf4b53915bdab34d4030dfa8ad85af76e194db58d453df3411431cbbd8dd19e619ff613cc3cc9e88745bd1b3d24422d3dd4ebd82467bd232600401a39fa3134a2cc099b690158e52694b2141ce2979ee84416d8c89f55c23cfab2804e26fa2f58e96fa9d8e7f7fa8c33022247ca0cd1808fbccfa4f3dc4e70ed62e031598f4776745fee59bf0fd5369246ad97c2f2798e808fccf295ce5f8ad8e7e70268d6667508104ed10beb70a794196a3b7c7e7188e766d9a68d32ba7297f9f916e7e20f5afe0a758dcd16953dd81ed2ef48f4d8bc8190f601dd3da1df6f78ded9ced42b00a310957f65ae029e7e170d106e9593dc2df9b54d9d6692ab68e9d42688304fe8257fdade19bca9d162c83b3bac4b6626979a8fc77f49105f49103d55374bdf18e1638be1d8db2945dce2a9b7ca3c772605f9059f0754a06cd170268ed71a19419ec3c88bacb63bed8086c29322bf2d5ede197f3dc626dc83fcf7d3ad2aa959d28c9f659824abd2e7392a2658f1cda46be4fccca644292573c21ba76cd183817fe7d59641bb39a369f4b43237eb752ee6e0647a94c0cd1ee669010a851f133e7d674bf23e6ba23028bfcf6ead7d960833ddf004e335b83ee062938bf9183c99d97a411ee79b18725de81a5131e8c8f0e5dcac8837d036ed9c85cc02314994d865c8476e63100deeb615722ad6f8110b209ba9eff76fbcbff25b1d83f31e7439c00ba009d8ec4f87d32ed566e7f516e7dd48d085808641df325942b46d98b616d8bf622147f24e180a6be27fb74e042439e19ab3c73f833439a86dbbcd4e0ac43db4b891b67155ddb007d2475fbb070e847fa254273b63d0bad326ba60dd8c0849725be0496d270c2cb30804da546d94b3071e6de53a2ccd167acaa2439920e9c77e475fc120a12d91be2176a87f6c7f57061fba362e5c38ebd01f01c659c3631bccfd6973d68beecc3b363ba5ea9fe3918cc7629672fda8922852fdae18a99ca7536861c73a6f241440fb9116ffb3c9144d649d00255a4f15b1f6afa5c88e59885eae06fa271e0e1ab7b5a1b4ce2827d3e2cb309ae2d58e98a926d2ed525a8e8e1d4bb55f621eb6f688ba7184688819bc8aa9e95b114b78584247ab2f7e8c217ca0de8e219646f9c0184d03f292bb3138feebdd38de30ba4951cb1665a81994db24b5105ddd683075f6cf5f884ce7ee6525dcb09e04903424d7b8610a4be604a89d099d71d038091eca1a6317291e4fdbd84837621ae37182bb9eedc4182c1b3e3af35491cfa701ae2f55522c2042e7d8a93a54c2f505b62a748e1377789780f6fd9c54981e93f76b65a7c0010ce6f84bf03154c2d75b1da316b9dc62a2f62736944cb935f2f985da9f6fac23ea4d578136a1b3cd1ad29818cd02e9a72da1779f07c7a9f88b4e9fef6ae1db26de2946ba6edaa1b43fcb1c7e10ad49b9d84d060c6ffe0ee4f2fdcc34d27601a6bb3fc326b7dd600aed38ebdb605282d7346c990194aa7bc8775a1dd5f64c61abe8b375d61223917fc8427e659d431a27391ea0df523a25e96210e17ca85cf5a4f5f6fb6b5c4473b4b92c62609bf31e8bf8402e391e3a7ae63d4aff55a17ac1d97620b97983e3ca421a81ab97f811921df29e09948dddb325945e3a7c53fd68c9c9633321afd3873ce4ebb4a6856b4a4caf2e57a2e2532a20bd768404e84d2b2044b22f9b2e8f76946029db8b84290f6ed94df22c8596dd9c6bce3cdaadb43bc90d1f263e64bc00863fa218495994cd4b42025b22d257d3ab275ca382ee10231e8850ada2b50d0fd507b34c0b74b13d1794ea68c1d594d221ef84f9557bb43495f9652e3fdee490cd327116aba0bde4812a95c47955ea446dd6548aac044e14798beccee03b10a59ea6d9a5a2bf6e6bba2f2130128a29ead57203869d1fff9467d835cf8e7ad3f3d2fc077dfe11769982b2fa5e94379c3a2087edf3bc587d27987811204505bd74d8ef13acbec609ae24793f5a2b101eca199dcfaa4531a987b6524018fbe4c9ffc95985096a67bb041c37056498dc3733b5be3d6d03a001b418ab4c0ef72c609ff263136e14c16e9ffcc8a2c6ab4b3b1bb730feec0a1ae7c15fed5509ddef0e00b8de4dcfdb93be4e6ac902462ae732c20a79209499b9b87870e0476d016889a60ed361c5353020a3ec98e34e63b9f3182ac02fe66da7efbb1a3895c727cdca56fd43edd20bff709ce5f86fe5f9c880c11ec739b9485c0132efeca6f6014be637028ec04a36b57345d5680ca76837e1aa7f14999c928578daf668cea7358c4110d88abfbe25380352feba160638608ae27c8336fc4fccccf4eb0abe8942f11a77c6a39786aa8287ecff1af4732e63c834f325d0719e5870914a7ee8cd22592c42b6bbe86ece668f7b75ab921fb30979ea979d9a67dc6cd4b3ae2cb3751b35f51c7c8fcd75505d656d10fd54bb1afa2d24afe1502740275589f07b5371914d703690da14b54285e8943f0e6c532a977f5fc3c1564048b19d731cba84f69c076a823353ce020094fb46c5784c2098313f99c96c539258b59630de96d217795318faa7bbdc52aa37525c7091c8574c4a9a03b5cbf80963facc40ea68ec48cc24f71f3337c8f7871aea9a18aed2b1664c9c5f5af76dec55f74bb441abc21da357de621473325018aecc06917aff025087275ca4f964b8cd945c7c41964fea49386cb3ed22036e0474cc2def65a6a380f9a120e5560722b942f5b88369817d0a965d6482ab324b7af23bbf854a41fc2510c2898712f6177f9990a2587a2fc9d2cc0b7ff3c07b5ed0ea20c24bbaf58d5a29ab1c64f42e8d94ba4400c65a90a6ea0a7d2623dca1b2e4f74a4374faef87e0a77b09a1b45558a9b81b9402b933317fce57824dca4b911f066892672e667f37ad0a750e09802784f2a0f6ca3a675b5f6a6e76e96ed60a36cb09046b39975f8575adf33e2b0ec9eea1cc61ec6364a0ebae32e9902129aa3b174c0332bd338a33dd91cd8159b47b10883b32a4ba60759c14f12b8741582bce5cfa0f7d86743e0da364170d9677cf448d7fa3590256ea01dcf11905726b88b15056236d8b65ea63039efd66b7fb4f168e6ff46fc5f7d7dc734d2d406153340788216a5df6ec9fa169ac78540cedd4fd9a00382798ed054223ebbac19c32a0e02b9a27c5db531e507c1855fcb354bea4e484bb30bef99bcd63be47e4d3d4a4e0249f41588a18519584d6086e0b2039b5d14130a4b6aa53a088e98ac24da38b83b8f1801b612370c71613612bae8e5f1ec6e07260fa081bacbefc947bd612ab85eafe775db1aac43fd4abefc58d49aacb57307b29ac2ba517af4e7b26d6a836338d6c8941db0bbb9ea279d33bdb9632be5ffd687acd2b9003040d346aa947425b475d04333b54958b6f4600f7d7456050f160e2a078302e7011c634abff5e0dc08880d5cf6ec705f94951273125ee1886396fd14df2ebb8f39e6171876ad7eb0797e97facf88217ecb60eda8fb336efd13715928f1311606187e38e0d7a4cc94d9a1a0c36aca43f3a98440724e8704b935fb52a0d9aeb1b8861c6a7c4535af798f2d46a769f897bceceaf1f5fb55986a40567a8d13731b4274787ac1995b77d08d780fe788b45ac80dc136504f7e1f8a96f55add4bc347ebcadac13dc5f43436192b7ef765a23dd8a82083dafd346a8ed35890a855a0856abe09f943f27d2ae609efb77499ed7fbac5f5d6ebb58bc1aa061fe70397143434f1b318e3d9aa8f5daa5543f7af91f534d2193d7a09097c373ebbcd9982c24bb1ef2c3b6125466ed13ecf5776c032a3bdd2a77107d6a1323fed662ee74a8650bcf27ba22e9c5172c069b0db13a03a0aa7e689a0c6cccd03b894348e2b88a577921a1934a3888a13c4219057df4393158c7202ed74ba8ccce6491af1b143758cc25e4261cac346a38761c0a6a24f275e1fbb117e9fe566a555e86ec79072ab3e3c17471bd6fd429af98b00b8abe4cbb397660351dcdd941bd3c8b6f77ba9a6f7bfce57d1820273a8000b9a9cc23fb8536bdac8a3f780f0ad86964828ea9be5595640b4a7a6c14427d7cde445d1fa4985a032beaaa5ad2d47bf2a536f25fd855247c5e229f5084f4d3edce308fc0e3e92c00ce3ea6b6c81381cab6d769c81410b76120343202a0fe78b083c4b3da0a5a16d4169cbe2f18fd611cff69d75673dbb01dc2e288335644825e3297a6b94ef4407036fc2c15109ac307d8c83ab4d8029afd1213fc4c2df73da3eb545c6c55cdc003bbf6bd302c8a792263c2ffb1acff931957e761bd98ada159b91c5db7db9cc5708843bb0ff18b82d85d51f9227de4a5292d4cad152bee03e97007f40dff61b9f326121e4d533322a8a04cc5421aa4fbc8256bd21c37943bc25be49e8ada61e5f240c754dae5fb242b5f4e101317143d0f7da29a42dc81dac6987517ff085cc9b2eaf258fc97aba502d83e38247f5ed56a7eaacc68f850b3541a435304344f3b466925cdc531d54ea55988271c18f993ff6ac2f02a4c1f1aeedda7c20082dd5a7c2291e1ee60a449a6b8f66f2938af7b48a2ba01b453cc2d98baa4bb2449139c3cd4436daae2c1f637c8f7fee6e3897534250f313ddd3417bc92b0129c347c648d7773c79655b4aec68623b2924aee7da53e8ba56772cd6520a5c6d78b553627f3de75b056bc618ecb17a94b4d6b60a7164b024a693e526bb32e97f612b92e6a798b10b774f3cc7886a3bf419c0562801baa67fb28b3c02909bca1d542cd6da0f359d6a89aa73760b8d3642e3e688294ccf604369978ae4c9b220a9661205ba7a1fec3e96e2e10d73af9af284d7218dc9c249c6fd5f339ceb3380cea7f5b9ca305c04d9f0322c827bfd5ff8704d9a0b95c10ef7a4e3a332ac2e227beab26f367fd5a61ecdc228c73455890e935d949dfaa52ca8e65dfd5be9d73c4be0f8d2c0666c688de7e98de4f567627d3aedee8eb7fc75c4ab573e3fbdc7adf0d934a25d5312c8ff2cebb7959177aa440fb3a7cc8f4b85dbda4c65524df016c7e77ef90b11038e6da568d6c04bec1d53740d8d0e669d7a7f9ac3e979e816194cbdc54ae7fdee3d793a0006d415e048fe4e0f3f69c04bde7bf192686e53f7783fe7caaeee6019ceec793e54f3d0ec024e9feae6f643b8826dee65647b9f53a51509d36464685f44e1964eafb98b825d53ee3a8e9f85894ad6097a5cefe8daf6931ea7033400c7808d6be6cbbd244a6a694ec9bb3602a1bffaeeb3ac266ee3dafb4a0b8af48486c8c682e70597d5952e78a5fb01137dde04b8dc0af662de6b8a33a890f40e3c68c1c49dba60fa5e7e9d8d1414a36b0394acb7549bdd405732d118ce9e18899f897ada4be16a73a5d2f8e83b36d1370e0d71a3f0b1ab6e956ae959fd878374a31d52c8f6a5a30442652760c9de032cd6e1f621cd557b802777f290fa716771bd240f23217c2993a56aff4205f5b233e4403d73c719b6c483c0ee81c51056125793efd502e3b7be54138357335f7ed5370be3baf470ed7287a0da23815690ccd6d59c55ae1b272d46d2d57d7186e8b2550350b023b09cf34947fa86f24ca0b8b71a3ae3933cf8aa43afc46d87de82b57b3fa83e09e87ac43e362625ffddc02d4bf35f1514f755ebae9aea374dc7720319d4f80d4c9609d0970f16ab5b6ab96d10040777e2ba8dcac635a9358e636fe84a4c9794ee9f7c9e6b4682a4c9ec5b2a594071eb34a5c581d1288678dac0b525b459f96f377ba56a1eb1ae9275d70d33c3d4741e66144ea92f880fb154ce6d5dd8fc74fba41d12e9d66c859a8cb892df9a8d9398a80fd1a746ed19cda457c58fac722259a67573b7add86ce157cb3fd1e01c077e93a1560b2ff3c79c4cca88100a4cbd6e0a40fa3631d1de6e035bc197ab7573f10eddcca678433f231dd23ec2fe50652473af6133bc8c1033953baea90012e2878afa07e842f8b47a328ca9df0d21b58ace0fa8e7e501a5b03313764c81e2786e9489fdfe741521bd4fe299548e89bab19e8847ab274d0273f70f52e71e9003d42a7276521750e5c0792ee01cea2be884920f52075dcd02e9e25c8307dd499764fc029717c2ae5178607d17a730978a8896b6bb3b97b47cac98aba15ab24e1bfbefc5a2f8e2ac0c4eef44b26917de5e7d8b7330fca531689569fbe31003b760c6f4bf17460eb51d21c11b4cb8ac3bb28ba7e0c16d35104d92b1738e84b31cd27408d095984d8d0b20e0386e4e4670f34d0e8a0314500df98a568303486dac06ee4c6b14e1747062c34af8ae21b715a30e4654806717a334660155b8ef0d713e7cd2d0ab0386016b90eaaf8468e75bdedb81aa9f3467a86e012916afc5ed65ee4542016b22a6926c58962decf0319b73397e000a8ac83245564e5ba5adae8e0c76eb64bc4a82e05f9b376185aa44aa9ae831f3b2338badaff0436c57c38e9f3242aa9c9f7c00807a9ac8a97ed812c5ca69767766f87ab3711cfd478f6f60f9218c32a1c5d9d7b5bac1c1093b399c46f3270e26f035fee1e5b2c9680298b570a2db6fc8f2ed1c5b9eb65c8b915378db43893c9f4ad7026c4867f04e286d26c70e52fbfbd0420c4fddc0179675d2b2a5b7a7a3bc325967566662192b93e1fbec87f90e4861809e84e5a691bb1aed7b03797036c668fd07aea5d5586d1ed72df9fce56a6c599bff50a70086e689fe0d102e078358e4ebcf70746e7b86ba97ef46eda5927fcc5bd63564794ba207b1d85a2b38ec7a93e84768962ac23cadd9e4d66daf8f9772ffdf311a1d28fcd2187b8a5f83b03c64dc49660f630303ca5d8e37e4169dfdbddf490dd8f226b29774d95082314ff6112ae77869e72886c7a93bee730897b7d38ceb673d4030283a248b66c62c9554e3236655486c214baed7631a301fe780d283adb6fede12e43e848f81f16b36f97149263fa6bf54484c201f51665e2532f6b29d4037a19bb798d5d73aba460e78794afd7f3dc2efe998eacc597a27ae8c7d0378a6aa42dbbd2606b9a9f0045adc22ca004ac27a7e0b87d282c2102797566e215a456cd34e754c67258a067db1a6af16ee8dd50a863da3939ea8f26e89c5e87c3a35dfbe08a98c0f2a45b297609ae574173d9cd07955814ba24fd0810b686a6a6487a34bdadb76cbe8d7a100e29eb66a4d2ab72df6738d15092f519d8cd1ff5724e359d2cebc2ace815c4c11012aefe433e176b394315c6ff6b31d745b65de56fd842c78de07a1b22652fcd11a340caaf56626a999625d32d762c81e097f4d548d94eb075849beeed2d57c40ff9a545371ce9bd9f42caea334101a01afb0a73bfce8fa0c6ba88e9c159f8009701773f2b9d79f48bb793c04fedf8278efc1a54c1f77a1f8ac4e83e784054e76160e05af8b06e565a5eef9b06e5623f5c0dca6f2c741de8e71241d94055e0115056200cc5a5de25c4cc3a7507e3b153bddcd89bbd9faa0e13c30c6aa4f3b8b28e7436b0564625c15e7425ca2e1dfcdab8a721d5a01314e23358e991ae4eaee313c8efe723b19a22ea8f857667afd92267cca94bc82d6bd73f4a935c2f32d79dbff17f9e54b463911d81d80b3c9d98d45e7a93c3b6198ea8b8223f2223950196950dcd4f5f4d81423d61c682c040b2748e57dd3e51b207b4bb1658fa013f1f6ffcffb5a3df119753e65619a5dca4e507f510360721e37654b76771814fba673e1c8ef24ebcf91f2f7d08db30da1a1b0bf3300a66d992072f15daddfb5d08a08942f14e854dc29c3029f6c27968118aa2d23b528148a6e70f2438faacb3c4ce494dbeef03508206826ca8b0bada57796f4a4cace53a1339b41331dae0c6cd3f620ec58d04dfdb03d0710da8cbc876ba222b16ede82ec4f8839d42d8d92f4e67f804baf44790c00918f7e231d6b79016cccdb2efeb7858e1e9e4a1eaa67ce4bb608790b09894b06bd0803684ef706c0ccdea713ea7ee376d9d6c9f676efecc91ea317cccfebfe465edf03278410fb011e5fbf8d50192e98bc0f65aa4a8615e44660d3e047e2703d60f7a6d08d468611fc0b1a0f16d3293842c80a3fa7de450ef0ae47a084763780da1d7e9755b80fbb07ec7304d1c19a7f6dd3c2878ecbeb46706d9939922b92b3390dd918a11eedccee7188a65503c983b8804acec6bced9dfccde579891a1a884a4000adb864d8f9be54657d653713184a81225a83f314b07e32fad554ae49697d5cd9927761fb78eae1e8571efffc50072b44a3d229e07cd8cc57751a33537e66ddd2e4950793b39d471821a8bb26943e0307d924e82d3adb7fb04dfbbc1b1b832643d84362f465a8ba7bb8543ab793caea761c9986b845aa2ae3d99604185bc12c25019d5a981812348c662cae1795aacd0eea8609ea2dfaa0e772e9aea92d2d654305ab6a0068ad1475fe14f733483b03e768562e563739a412f4d3eff2ae6c19883681e3b22432943b32d9ebc6941674deb3920c52624605ad196bf1f8146689872672ddba241100425d7b73d8ce99f141de338f94e3e6e1a9bd8d6ccc8dc87e585ea8120121308ab58517549e87e8d9e358f7c653af923c2b56a0ab756afa52c2fc5b1133407ff0d088914f04adde7d8b9a840156135b5991dff05165e34974d92702d93d7027d56a6fe2a9004c05446ccb7283f2994cc064cbe6850dc82c9865738e9ee7bd205a50ae83128f007bb1b6e5f330fdb634e823fbb09c279609e9819df52bfd3214635c80c4fcfd47672cd7dcb05a7ffe0bb71867e7061764cb68fed668b00335d6d011be76c3545c4ffb3d54810fae5c498a29ead7fbf6d0c4e707308ad95103f9b9bcfd3e3a66c8cc66e506a650a9a2f55de7724254943e076a0aae77969219f0df9f7781278b9a7cf9960fb6ec69d05e819b3b448910a59f1eb3307135b469dce550594709cd9bd7e2ae8defb1526dba97db70b04c2d361f468a3193fd57d0fd328117d05bbbfed2a6d3ae4a555c332dc38fd74daaa6a8b3b55624836e41d8aad26be0982de48a98f93153b27ccb597b8f68f798789a9d46d84cb72ef3cebc064e428613757eb75c86f535b3dfb13f7abb8bd9216e70f04c67da84b6d684ba7bccc57b5d4b67aec5a1ccfa2c858017c579cbed366c29b6cd1ce009d5879ffba0c650dc18e683b9610e651584b9a04a9fd73cde3a56904b09f6ae9f6a4bdcb0bab6c1e5b8e7e0eb5c8bc1d130cea0f4a6be6e364a28021fa476893e87e779022b6cf983dcb394fa936a2245cedf379642716df1a932d899e56a9d42ac668e783a910fa39284ec7ab00f08918acf9119f9e964cfea71404064417aa574c0416acfdbadca8ba43895bfff699cedc1603f781b4b7c353724019562a947afc7e7c30ffe6d9857346aaee04143e19d8429e486003243387444b718ddf52bf372f542a95e1280c4a54299d13e3879b8e479925aaa84368b47a69f9c1fe7598f0d0f5fa405ef3829299e970a8822e1885aa33e7eb400d538d335ab97b746bca8da82350e3d52a9833f010d9b998af92b54a67f6d906d12fdf22d64db5902452071bfc8fa65fa010d2a8ec2a1b8f3f38fe4c37fc95cdc46a8ccb9743534278d225a5ce233a15d503158e1db6e9d016db93b240aba04afdd7ed2f8f909f32d478b149569b768c13c4f9f7bc14fd5da12bec4692dd6119bb35693bc0ba09cca16c496164bf598d24e5fa641ca59d4b283a60b2a3d30f365014f6c8d79f0b3d878a5cff8f0ef98e48b5864c9e0a450fcc3467e19a3761ff916ff1e2a89f61bb73080cab649a91ad197fa3c3b17c6859b57f49a845fadf994fd36f575724226e32866725d8f641bbf052bcb41c96c6b7dfbb13324b10a801ae1314373b77b6cfc61580c46bfaef27b0b0446801d054be7f1e33266bbc267c09c6aba0c3b81ad54da83c0b627503d9462b75249569c8b97b6da662c18e2269b37ae6eb3e07e995d92466a990b3f8856bbe83a478a7f8725b49285b479e1cb89335af647463a4892216851668daeaadaffb0bb37d8dd651c509c3743274eaf7a2a51a0e1777fd21ef8a1555f625d5f21823aaf317e36369bd5c4976ff3c848256df750c421c9145f64a59a62218ae70d4684935b63ac3ff6f4a96aeb2910993aa02dffa434ee1ce52cc899089eac0c142a6d2ff99cec8107649c42b61a32e9e4b0541635191007ba47803c1c351ff2302104f39c4d5dd1614175cef07ca15cbd0a774dfbb79e897bcce54c4f49124d0abb171159eed866101f8bc4782c167ad4332e04d659c071fc7cfa8530854f8e6e93f21bc8152e672ee134b93e64eebe550f35e53691d1ea6993ad2158006191f1e2973efc194ca0ab66fc174758f0226dc531fb265a560e5e38a4225c01b2bc362af73af9cf446491578ecfd176663c471c60a613ad7a119659ee68c43a5a08cc7c737c58447668644f2444fdd978bda86c60bbfabd0098e7d29746440da19e9ec5c8cba161f299fb9a5a83ffe05ef8433746c7eb6e174b4f245bdd63973c76c73befd9b7230fc8f115813e6651f1cc7445c5622af346dacd00bd0d6d47f204caa07f54d4c8c3a6a1ffccf161038bb7e2184821427e2bc8fe3c8cfddd731c8d98b4e6386d70a6d9040a8a4993061e72773d1a82dadc8c9e0d0927d990916ecc59118eacb586294277fc8f63de585929d522e13f8e27331a96499ff0f1daa43e30176853767fa3362209f69dd13004e6e6f7e898182dcbd2c1cea23b682caf8d9139d4f0baa12592284c3569031f77d4cb3df039991d2d032f5fc61b035a0eb2f70f7cf1177be908cb8eaea47baccaa254a1533cf91f52c586e5648d1271cefe9633f39cdfce209e09530056123ddafaae6c8cf7cdc4a5ee592ba291292adaff17a97ed3de2ee575af0ed4b4705c90b30f42902f7f5591aebc1e5e9a25b103c16aadbae2682df90eddca8610025bcd0254fc55833850ce6b1121defec4a9e502ec46af0293dd87f90fabe7e8eb0d758cf4a6c2c6b4ea6bd2183ba734471c82f41105179d222f34b40dc1df7d4370be2d0b1c985ced4311a85479e7d5b520fad7ad6a30fdf272f3c6140487ce28a9b490c65e3976f35e51d1e5d3147a1fc418c8fb9b98dbb032af3193f1196689423632d92fa81302e998faa9b9964d0a92a7159bfb362749ae88dfcdbb7e3b87ea009a4fa76880b817aa55df06b1d2327b01c387a0b926d8ba31a32a3696402c64e0a02efbfc32af918129a4e2184833c3a763c9681092db63fa29ff811de4fb7f34211d7a05c5d46a890e5e058b18522565e89649c9e397b3c4a2a35065fc996469416425e3e59cf69fb886b9f89785c9c4bdd8c4c224bb826c0c2fe2928a66d78432d240c1aadee7acc061727d3ca44db2ba819cd401cb9404751d1f48f23184f3aca22245791be2ffe23c25a811adae614effe498d6f0c5cb0d2cdc6714b3f23a1c7858ffd43dc1d1be0f760cf28d2d3e64d6310854d6d54471d71e8a8d7f77f3098378ba1e5122eabbe0cb9d224ed4904429b2b275f5bdc45bd8eb71f9d243e5b7e55161ff23e35434e83cb38c3873c037f255995350869d8c06ddb813aef18bdafd7a280d92f25b5719a242000ebf0a89ca4589894f6aaf04e0288534f83560c53c82e472ae8ce54c5dd9812a6964174192b857f8144a77af9c6a86d4d301212ea8137352c14a002fbfcfa6c56d4df69fc9c235ae58b7fb11df3bfc2f087a051095beb722f58d1d1c6b644f989ebaf4bdf648b8addcc90ce1d8d080acd5ca2e6499bdac856177d8b121b77e7998ed394b47a5e6badbedb0e63207d84190b721b7a40037df1bcf45bfee6c953aa2dd319498200365a5518ef7815c71bdc88c1d8c317d9c1174c401cec7eef84e49fd2e13b60210d58cece2b3ef17b0fc0253c68c125cc18e028311623ba3f0ed6126e71e0af814fb5137bd5653b6fd923ce03df31addb6728df0932d710f876b87e4ec88b05fc406b2cb5ebf3a7097068a0a3edf583d44f7a52e042fecb083bc6bf8927b503fe23134d1fca2d7238e894606860ac772a3d371643acac90dd864107a046dcace6e1089135612040ed33ca50ccd15358813ea65077abf2da58b84891ecebd6856ec6da84e1aa05007db848d95b27246565d7fa46b2f4515fa38c33b0c190b343ac27e18779082eed3a54eb129c4e889f52779cfebf26b915227724e16bad10f4a2037128bc44c341f90418332f8037c34cf4e781a01bb9421922b747ac89ab2a8a3378709ed1c401e8445c2272d26ebd9b585127fb57d5d183e52b2e17861336cf9e10e34073a97a4880794a507bdc3c9dc553735787357eb8f726cd7ac0b56559fdbb1e3758ac97fda1c37419da24450c62eb6dad5e479608bbd4ed4296c6ebf812b6a57c379c796a5a6baa3045f715c0a7894427d314ef37f454c83cc888b165aca2a3eae11a768834b6b358bd399fed1dd302fd79ebf951527a448669c516cc2d0f63f7f968d138c3af179d42f02d3c0f627eb7dae2f4489baec3626c85116dc23072b4d9c59f35564137816b4ff91fa4988cca72f0583ccf80a5ce91edb8642758f49118ddd7cb598f92cde96e8cc7873c34c1d50988346307c7ad359a5fb1e2a8f21b54fc1f800d83a5db56f7d3c459500429346de68a1a049a610c86dcc5a7dd737a0b1525791d8712d4de313bf3e68fca59a38a43145074bd0235a4e599da5f58197d353bfa8c9432c709eb3a6a8b533930531b16388e0d9df67c46dd2199188be257c065c55091a1006ee6f8f93677f3f9ba7a7e0989b993fdd53a97b92b7a33d4ab0cda47ed4a26bb9e6f0ce3ce05f9cc563231e020fb655e76ac7276febba742c99f5928f17c2f5788f0f9bb4c3021dfcbe7b86cd1396aac2828455064d7cd2c56cab823e2e1b56e6f41db25ace49d092eddbb0913c13f9c8783bf986e7de6fc5f2db09ca04c6837730c7ecaed255c6147b6974a29fdd2e3b7140e3397fee402c9d478d879aeabb03f0f3362f5b5a2ee4d8b92aa97a0dc8c8465d0375d8e0eb3db05589a86dea8ee32ba2b040048f0ec7ed391691a1cf93c439737fee4445fc2750378f3c3dcef47310dee2ec95558e2fdcd69fbe4eed7fb4f804970c4afb7ea2f54486a6122bb870abac18656546f92efc00660503ed2ed25be1b43275cb454bf1cefe62865830ae736357dee7eb125ac93a308a7144662371d634c3ec003aca83647443cac5f8e8a324d2a8ff69722da02fdaf0f1ddcfbf836411cd5994f0c8f816fc8e5a738d6778d4afadbefd3eb830ca2168a1cd941d037f8f0889dcdbc7321b131c7bd6d6dedbef81e9162b8a6028696391a5f4d40d52e8bde21fc8f4df1396b58d6c9d125cf676a93029994d13255f14b6f7ef90fd6aab2e8d0e8297cb53d7faad0e361be240b127d5d275fb84759ab13a7ad8be346518eb425d471b2600b78fbe5218878aa6997cdee9baa4eb483c7d979162ab1418ba5d4de7c2609837607bfd9e24ba0aedecd13d0253aa10c91fa13cce0ea826bd9c4964e416f9d0ce064e8abe60dfdee2845d2c393196cc17f7f5cafcd2fe059b217ff9b97ee17b779401e701c971a99a378635cb6fa1389d6aa5ae5027d924743a3a4c68919efb780e4bae0b725df4e1b1d4f9a5c3efee2beecb428d4ea0b1232e073350c30d86ca6197b5d079bf1c9d0fcb1e705d2b54951027000245ba068b7c6d9af593e8ef64834d47489a673df93960b90c54ba259150e989c941fef9de78403bd7e8e6961811c5e824f43cf71e6a48ecb0c65f14d168fcab6eca03d7ce316f8b3a40c0cf4a5baab0ca4d339aef0b5d027c75daa258941cd6f6ad7260c1bc5c1ffc463b0be9a40ac7f96f90d269b60c8c583e624e0c11aa951a4542df0684fa5c699a5416067d5e2e26d9e28b90bc50b6f9ad2365f31cab40ec0e58d824e047914b97cab112ac35b49ec606d981c0c3083e013be7fdcaa80a2686bda1c58386aee9507801aec128641ac6c2fb6346aeef8ac2e86e122621b7e95131dbb576d6975ff0c12bd7990c3c94a19eb85efe8b682bb526e5ab6645767b9fc86cfe92101773fa7348076ec58c1991cb182a949b52178a353299114d4c20e389d4dee383d6750cad56fe52591635a8dc94af1208782bda71108f03d9a14a41310c4dae567c7dcb22f1f42c6475319cea9701834164fbe9418a9eb575b516e5c64b3ec3952fa51ba06685f0d79378e8e5e8c0b61c662f0dd48b1a9ad44ca7f94bca32ab8affc2d7f1f48301a491d0d61fb47a59e14cb84688f5d6b6a68052d4850d1490da9a0e764565c4c57f06ca7e23341dddf122499ac666eb2c9fb4cc9190ef9c7cfd595f49a12b383706b7b1424d77102738eaf01ed34326776776f3d69ca39b73ee4706e7bef37ab288554bb51e9050fd7d86540db0b550f463a17485483d5932a3962ba3be881298d314d25ff8716e670d2938f6cdb250fc4a05ee338c0977900498d1fe2b194b1e47b6b674ec87f43ca2d4dc70103395ed85b20574c5fe4c62c4fe092262cb3b06ec0fa3fb7eede7f0c9e7461835c73160998b03c3249eb465667b1363875db308e837ec4843a20773df183663ca92b1af0dbf790cf3d3ba94c95668fe939eaf2cba82006755730e94e86f3ef600bba835371552ec4258cd64920bc19e6618bbdfde8c600bfb842c054040fc9792403147d48ada0fad576b0535312225418dcb0c82334a3f14dcfbbc9fde1200e3ab2d7f3e3a993182af99213c0e00b4e4dd3581bdaced70e7116a7916e62bcf0a78668112d43d23291aa30b3acb4bab4d4bda8d2824192bffc4f7eaa5b8aa056f178b6ddeaedb7e38af6197ec370691a6e6819e6b4080aa8f51e412d504656ee70b782995848b1e7e5df415e86a646ce2c86fc126a21fc4b00d3f4927700c53615b79a72da6124854014aa16f6f8e05e316003bf4542bda9a03705c456d22c668f9d5f8cda0231785bac0986001de9d41aeb2b8b21f4996483d7bf61dac2618a42c329fd514eec5c80de4604269cd1f1f74cffba98acd54dbbacf938dd42c9564b145c5dcf21f8aaed19d238f2ee3519489898ad2bb00f235bfb6b34ed913871fc1ee5af2a832b01ad5be44ada3b1d53df21ea0145611688e1ecfc4579f5cd951a04aa8a5a1865b93fddff38aa6bd6f67b43680efa558192feb644672003e95ff12e9d7616108f4bebdccd422e0a46d4275ffbff3a7bba3b9ca3cf10a4202f71e0a24fb98874ea983b7e98de2dc70d3802fe2f9ac074335b1c002f429ed56645d532d8436cd9d068100d536416fd2b48796dd5bfea7048362d70ad1217f17090d388bcad7f7758079e1d0ec27442731e9ca09c5a9033860039617da07628933dd0dd5c8c98956ff072840ff2128749d747c70db6ece43f1a54d239eebac6b380b71437307bb78741da5f310bb10431164010b0729b55c1686427dfd6ce56e5a24c38d4c64f81f3b2ef7dda5a0e524e6302f2577af7bdc9f898ba5930528bb3380b8b57e60ab77ac5e6df651a89a7ce535fc5f615aa057624745d1be6611c591fa3c4ab2f6c235904063f7df82c374fede0ab2cfb983f4a63455889234e41716baebd9fa6d797ee58fa56bdb5b02e50594e1cf0c43744a26e0ccd230545d79656e6ee161f4a27b3acc65e472f89281f4c12bfe8f3c412fd5abc2c6593b6b8ac71c17dbaf42e639dd4b869792418fded79484e56b758531293cab094cf0895c922f57780ac7a27c7e92d6a8c1b859833ab9753b745bfb17c3e84430db225ad04abb9fd5fe5ab337773c3226c2934809fef9b2d9a6e981042508330551f0e7a248e1e546c42d79449ed43fbef745aae18f3d9745cb1d95669c521c1e1375a161209918ea32cb8cabee764637e7071f3b0d0fffab98672ea5bc3ff0e2418db5a76bb7aa28bc5095c487d12c42be09c7ec7c8030b54826af316d3782353d709c62b16d65e65af2d1f17a2655e46674a0bf82f38f2f53bfb8add3b43bd66041a346c9cb65e8d73d53d077c0fee758215942aea0af363b33f562b0614a186afa1cc5479fb797bff0957b49d1b5ca904307568d147e598869d72d9e9516cbebf153b427511c0b10c9792c62be54c51af4bf6a6fd90403aedbb67669e5f47ee010c2369d716774be289391ea80e07d756ba2669a6825ab425430cb9ca3ac1921997db50c424d7a6b9b829dbb3a4a13de16227ad16d62f820bcedd88aba5368bf9fc4f6206f186572898c0fe88509d87ec32f18108490f7404d856448393ae8440668b090146419e3b93008568800432213455cad46c504d51906674c602f1ef66d5a4caf76ec1ca319a80eddc66f438cc7aee775120210515b19107a01777e10cf23a7915bf2ec11f9e3d3defa70b77291670c5cb99d46bd5d89ba4a7019297cecb1014e78882ce25822dad5fa6b9671431bbf83539e7bf1537ce0b152a3e618c0b1285ce2955531e28c508b561b2e11757ad4c71e86e4f56b2f24d65acc5acacc3601f3d69d5622867eeb72d39c6b9860df450096f5fab66693662ca3e6e36d9e0ce8c486856243a9249c155dc6be52f09415d848af3444603e3e3e94e39b188641df7f548265c9f2b0741f275eb2210cbfa22d522b9cf1bd89424a644b97d1471a175cc7dc1a26a0f180dbf97316b8344a48d2063bafda91af0826a37b8e97c64317fefe2ad1c8bf7e80b78981ac14589c11daba097540122105e6e9a99554343f50ca6b9e6ab4a3ad3f005b5ec04c421e84e69feff6003c1e8492024595e31483ae9117cdaafc8b7db08d732618594c92ddcd2a0c84104291dc5e997ed9b4a149d99522ab2245bf225d848d790824e4630899e3e1dfe6f12e4afec92a1952fcc0d3a5ac8b02ef1c98b4735e4e478d34e0837779dbc3c32c7806e3922561605117e632eee86e250f64033a51b27d2e6fb36f9bea0dfa9931a0f76e4c98f142bedd160653a9b1072b258dcd9d5f86cf1c76f14afd79eef7e17709cbf259f94b7fd0cbd136d0ed5c5482fedbfecd845c0dc52b2fa674d51f26826b538ea62dfa20b4d8a41bd26c0b056b34eb1753281910cdc1c149c14da6cfa5d062fde59dde7f29c1a6a72ff8670e4ff6a7260f836ed9527fb64e8b0e925b0c83269fe58b07b5950bdf8cd209f5939713c5e24ef439b2020131c1fa10af61c4afcc81d49909d0a37441b9861bcf4babf7f490bf3c397298c4a475d1614be8a3897595f83cf1b96d56390dfda29304b1eef5acdcad0a15ab4a13c61ac03a9e08ca433aaf9329710c683a7faf2a613fa721c7ca98552a28b357277c30843222db2d54e033fc99a94c6c59111fdf18f54c287cf4259a00ced3653bf01a9f1941abed36a6bcb6f806662e0c82b94ccd760835ae922a81d0b01d7ae7987233e61320228d5393431362d430c8860c020bf2a43444fc05ec36b02d428a02669370ec6bb036dcfecbd3bba4acbb7d65e59a4fbd5580964e60e74476f6662cc58c5dfe8aabaa001e6ea5eee885c69523eba01118381dc608f4c2671e36f1abfcccea32fe08755bf203b6408fa4d982f729d571984902adae18fa71a15b363792a9e013b06a30def5db262d0ec542d933a02c6ed1d9f09d5240f7fbc23d4bcc1f4745f6ad256d37665a57888e9746d81d39edbf4cbecd2a5f4c219657b85885ee35b806685fb0e50e544ad151952ce1d5eb0fcaa05e1dffbb1bb82e407bd99cb5cb4b793f39ff10aa5f1c9e5c158606ec3eec64d60e4a7bcd228a8a2fe5807d68a4952cb29906c0fd627df3019a234f82ce9974c95cfcacbe6b9d6de25b5b1d425b985027967128fc1395e009acb2becb9f339a96345749ad459ff4a8fa749aa47b33ab7aa1b6a79e6d9cb73e46675235eb0a8b1b82ca8c5ec91b694f09c826243310558e062554423cb1d837bb4c06779fa47d7c88e1a5e71feb2c707dee677a5e07baca4001ed4ee9e2c165be2824291dd3f397edb022b03c5b49246a22eb669e3525c92a6faffd400dd53b66973343aed34c5b99480ee0980a8f611b5f5389869ec6b0f7020cc3f73bfed687c06ab5f23c3757c730309240d7840bbc20c4d09b9993a0706890b76d543d37e1c4741f44751ca3549de3f1d721c0a196424d1d2c62edec2172c155d522995c75776424d3ba9b4310ffc50a51863f5895829ec2909a0997d91d18cf8044b0722fa6487a27ab6cc0eb88b35102338c65a62427cc3cb212c045d2c659cfcb111becf2b71b9a2a6e93714b15132e7261dd821966e8dfcc09d86a65218801844f374afea830dc4107d38effe63ab01cc1d6505c8771fa0387a2726fe96094c24d048638e2ba9def73f70e0f0fea802cb733151c652e8c3f512cd5ec8d7c369c092075fbaae060f2ba8a1f0b7f1c6f505d908e5a302592446cb26737b57e038242b8daf06d6feeb2c9a4031654e7d9a8b07fcb529fd3c77bcea6c4fa97027fc292d32b5b834606412e1ab5a4cd25ab3af24db414cc35b6aaf4e2800dc1c3c655b0bbdc2a1501070f96a7839e5ca3653b4596d8210f725fc3f24fbf8e506953d9c2077dfdab76046dda37945acafa2326e00524321283b7d8de962c6babb6a4826ea24b8f6abbe18cf8cfc322f75f08b11eb612bdbbd6dbaad2314e3523ce196a4c7b7ed01a290526ca828b3886b36e316478aec8199cdd4c40dccd17e14c5b8a3743166a41bebf0099f2d38aa1817dfc0c54b04164992416718eed4563357bdea26e952ceacf2a4ce6cebccc3c188873e0b4628e90d2474632753bbe7373db04a528f06f04240f362cb9ca48e67a236309f82602cc62765aaba724d07f542fa0f42c537e8a772203e400f92f27f36f8cba341dfdb613d9bd81857f8fe530fac2c593d92b5138d92c36570d25f70b19dc4c1ea3f2cb60bd9d2cea7a80a3d2e624ef3c1aa8ac466a7ab494b123e4dc026cb1b4528df1593f58971b3f9f6f1b31083eb8b6c40365957e0b3c89b8efd120c6fd16e93915f989368492a44b759a47847e4190409e62b82ece30d1aa63f8a553a70829c7c60a3d627e7154a390b83b1ebe01156b00ba2b1153b924bc9fbde0e01c35b09fac0ab9fbf4e86c5a0cd7fe094a15da00d28532ed2eba4243893aaa7708d6e70519d25bcb2985bf2596086c4cdd020bf330f45bc5251b20723e71a1ff9ea6ba65b0548023690f7f3553bd483a338f45902d4a53dd319234012016748fb642eaf36265ba94010b3d544ebf355322a32836c4e7ffb140faf971018bda3e5352012db80b80fa10a8d287a4c6772f6dc258d933e8404d22387ad40d8a92ba731812f4d7c9f0cc7f02a70b496ef969a56f843312d0d57f71a2f36753ab37dee4059404eb8755e3831a6c3900bce4b25a6cc86a722c574fbf118ab60f5d93cd8dccb884cb06e5501eb332a69b5d90ca50cb328a4d3cd0a62fbf943a8ac87cedaa1b062dee70dc185f58e41e6f6930f77528485f715f5dcb2bac5d49f4d06e1501aedf675066a688af26c84448c114d1e8120ea68584d728067ec03ad23c75bd6caa3abe9c54d92c53924aaed4e2ed70b414e9b5c57f1ae35fb099856e24e7a9414c1d4c26f4b486d238c6304510ee3c4dd18bbbb8ba195dc9b63d0f357a33dc87373822fec9443a814606f44fa13324dce0e099921077b83edc9f19849dd0917e943dc721ae520bf2a1b15d29b8f12775ebc14b5be224c65f369e3d305f03fff87fb5e91b45ecbaea7571905ad14407d079898e7883b3e334880ab16a5bbed13d38e271357f03184d31fd55f66e6e1f1a9d49ce029841ba7672e103de0b0a48c3b71a8d626c578da391c429db8766bd825f3b8ff98c76cee1a76105e2ff7685f4705499108d920dfe2389c2c65222f4ad435c78fa86ad94bc84e8db3ab29823469574c9b596e2e070b258640b33d402da3213cf53c7550243e3f5faca65791ccb4f456ad51adc0e1589df67d0ab448d486155b8b26be4dcbc2bddaf70383a6338fd234a532516647f6b6967a51d3b7f65fcc60af45f2d46028cded491058ead42e78f898a70468e9112d7085fb21792fc74ebaa7afe80267b33fb1e62fd1561b94ab2c94148f94e2a898d31c37ad5fdabbd3754dfba6e48db7979d808acdfa2b85ad4e4637d1bbbfb5add0f67aa31f709da8856ae5ec34235b5f9a170558b9ea06b9ab63b0014a800aa41c716a851bc9e4460348db50bd4c18293719c2f60a2442fb5eea3d33efee7b1134f3328161e67ca307316d44160e8e1257a4499f57d0e098429a13048a105d7d34bde433e8610ad4aaa237bff7271914e526b96564e7a3c210c88192a59f3bcdbf558a7a8e6a732472aaf6020d30821cd3a04a5f49ff7ed41549faf9ac8ce82a32650e1cab5a4bea50f749d51855f76d7a2ba7ecfa0026ef50d9002c1f455fb814ba024122311757feb22ab7c2723a1cd5efe2a55848b347f7b62aac34ff7369b0cb479714e97fc943a136b20fc1149e900e56a9e667b1ea9d2691ae9ec72a20e722d5a4c87ca9d51526d1a37b4dc0638abd12d1f58cb6e02d096514d8f4de73c8b989052e3eec5f7a7fc72a11cf6ac2cf20022b862b312fe4e4dce760ea7d75ec8f01e595966154033f30783402e9eeccee22712a78a8646ad493777177692910aa01e5f402b47d76c27f43b4824b03beb9996c39dec280b3e0ec0ab390c7e4cc00df6314984cec4b76750627afe99eeb998d02dafd64b9505dd39d889d2f0217095963e5f7e38aac3ac3f5531e285808609db23be1d1ff8d4a5999666b984b6bd0a865ef8e195343c8dc6a2fc3b34385ee72f83ec049991f6999fdcb8e1efebe92a71f2f9c788c6bc6b2ddd84658b1ca4a87c3fec78396311eb498d46d3a459ccc9dc5b8362597f9d67abc3ba900afd8bda4bd20d55d22d371f87bd32898b58eccb42dbc524c8294f00fbacc62fffa1e6e7c6b6707427f2121f9437811e72a7ac0da7563d81b0275429e4e15e5d80b67392bb1cf4a75ba0e4ff27c7eaf72681f41c5b94076ae263c0fa311547a1610fd4240ed106c5c5529ba611dc1155a4541562e4c4fff585ccfa3a425516ff917cab5ebd4d5b219795887362628789e9e996de906eeba05ed747c4a7c532b092be5e7c14750f6ef6dac5983ffab22709d942ecf807869653657e89a98eb298e2e24d3ae263fe4f25ac168a715d476c85d532eba1a43448019ab43754a5c0f72c620dc0856dd7bfdfea72ac7fa7d2ce9705c4ff0c6e91106f47dde089cd6796a8c6c5e585cea5d0744a53c28efa2b678e98817411e583191d64ad5c3896a9881cd6e642b104ceaba79a47ffada4851caa7abdfd8803597a4b4c8f38e278d6affd8934ef17c495cfd3382cd36504f10f3eed146539caea34aca98987dd6f6a2ab44f20346477238e09335fe9ecac88f385625b2573710a88a48fa5da761d39a340974ba8bbfb6f1d5acdab9d8b2c7ceb86cd60ca7da608ea7e79c1659346cf59375847d48504b920364c08bf17d465c7eebc57aeefaa0f3312880108b954892aa76b5b70886e1ead98751950a4af8d5446481c7141c3351cedc596a3b132d471244df56c2a3c28a7a3e7d65762cb431a8e4c093401ad9f50f8366e6b24e9d0e6adaf1ccd219adb4e628eef8d033872c41ddb2a5436b91a8112df55813b5ad6bf96fe9a3b5b1860ee2e41f35873fc8141da0a6753120d91ebf1c4fc8b3b58d4bdbbf12449b1c48331d6e36ec303cdaeb58303eba7e478a2249bd6cf81c5e11018463ab8f5a4fca2813ce0eabef7d9dfb310060fc7b0267611463c81ec58753450ab7e7f58c7b3c7c286befcd33fc317c55c4401c1a1dc3617ffb7cd049998449927387e70d519b7d07ac617f193409e6a965ff20953978269c3e73dfeac852d3dd7a09a058d6a79fda1133992caa3c71ab2a85f857a05308b027b017d085d73fa9971e87e527e23299766a1079164e70d1ed7750ef7e25a976e69aee6e35e1e46802b958157043aab9f5b8132a250fa918cdbc69a8e1b191c06c2c433c10342e6f6e7422635058914c099ed0a435a8611e141b46053886315b8908a4ab6a0823aa1dae7329656270d54b9c9636205297171cf4e63c4db4e810078d93d765f78f224562a163a5d5770393bb54b666737a0a13fcd5e8024cf8e25973f36925e92823d81b4d6260365454dc01dab3a02b4190448549996fd8ce52a0cdac9ba702bc485d4a62d48a26650fc11c0eeb60232787508ecae3395529c41e86c024c40cd153474d8698f035e8fd450e41bfa57fedf841bcdf891e077c1c5893d7c5c8dcf0ae417f8d141f101a94ca97a859fca42e92f9db94cf11b70204cdefe9ca4e51934a1225d0820b59ab2209c7f1dab9df65e1bc80a3e9a862ec63f73cd38bc4b7794eec4c67691bdf18d1cf601da22bf100ea9883f7c079be1b45647b2685cabbc5f5ac0f43fc96ebbad1e3ce6c7ffe25e72387d0ec9f3efc81de04e8c6c1b3a900aa7aa9703394def15d532d649064b40ddd3fc1d71287bd5985667356034f8a39576b3492e9d6c4e1f685e159b40085473acf9bd1c9108d8b4471a62ef613d67fcf44b73f22ef17a03c9d10c310449479f710f7ffc66784d065beeea0977b451c98422f629da448a54bdc442b1e19a55e8bac544f6122b1b7d185ac3bd4340f93c3063dd337940b530c39c443d17f15f1bb7052402ea380961ee19a83271eb9c53341996a55ef77ba58a696e3cfd7c37b1b992047985be1a7bd26b053571d0dc84b1265a97d03614c2d45c0df3b61d09c790336d24226ba600c821d29f8d694bcdde887fe9f0c0fae0ee60ccbe55a520eba4ecfc7c9b734612dc9ca777571e63ea32b1738677fab634dd3f0e07d625b045142142d3e204ff5f937883c0fc6c9855a971421e7bdc38bca00cc9ad32f6a556ab243612d3964e30574bde4ed1abf7352fa1dd7ac0bdf387bcec1782ed6d1012886e81fd3e919a53c785cf0c28aae1248766ae9653ac43632c4f6d3123c240c6014ef90111248952452c5a8f19c98e1a97e9d856d7470df70046359900e01b3ac906fe305277d802781a7a02e5782bfea2fd290cbda2d367110ba39c1e3260a1b41d88126b921e1c34f8578a5715303d80d227de9aedf5337b602165972dc9676e40b9b118f8e797606271d736e42b518f74ae72a3333a847a79299b4de1db49f426260bdd5454fdf18b56daef690264e7e675b856fdade54fef5aac36c52657927c1afd0868c13b7ec29be409913cff2b9f357c7857b83321b3380396de09abe5517926ab23b40c68f8c971e6c357ac81e6694b5d23d2674711acc817b1dc6a1e9cab51bedb61eddd5b0d6502fc766505315e2993bf6cb0136f8fdeb9b9cb3ba5bae4d1a95275c1a78b159ee15bf47fc7ca1af3be779ef0c7a3f45e8b66b7c0f03cc8870272ddacef8efc3e9e1867e2ad2958a3d48800a8352a4a3de143f93254389db5330346705d7566c2a24e2a5c4eb5cc432d3e55e8aac37fe77903cf17a13e9e5da6e52febfb491528370980624db7427366cc841aba23a6680aaa39ee760f9c857541e6a6bcbf2a66e8197078b70361f465038bf9a1e44be41a48facc4c62972d2a2303dcf07f82b7ee979a31e292ad84009b529ff0512f13c9cf14ba87f5da317d0e3b468e9ab258fcc87c87c6cf0aaf7db05345edd6309e451704e85a52a2942736e69d0ff9a4ab7b35450ea9162286711d4906a5ce3ea7d3f79c95c93d772d10a39aaca284d118f31857213d9dfce4e0f2d80830c0816fa8c6850bb1f0a2a117879185361d7ca996ec4f94e21bfcf117e396de524f3e3778540bc06673decfc447b8536574bf8166febc99b876ffe55e6777e8ed486cebbcd594a307ba3d5da6e666dcb1ff95880614675aa92bc3f1dd7630ae7b84c07abdd42254b9f6961246f2f284b12e0e32265603d0df6d9b99184d8acd3b064a4bd22eb031e244d269308d4241b05d49a5ddd2d3ebad6701dc8eef502cf633d9892cf84e6c1bc2a53ef2121e8f791bf2fe36d631b5f3064c5ff47861c969c505b5d2041cc68d922bf12cfc6387d124b2ef3b22511481e07f601765930beb55e8781aa71cddc70856729453aa7350719d9cacc1e23f87b64c70b0ef52b421faf36b393f2a57889e42f59fbb16ec710fee23d770b5645160fd5194ce609b91291de4eeb49588ac272219fc701f29a2c3fc50dcdc0d2d01954a910b963313b61dc88260c7c598ab3bc79bddd57ca1d42cbf8f1f0d4b8186729ffbbeaa668550fc36e510fb3c5970804272f57c7622f51e63303ac3bf5b0ae45cb28b7c985889c39ccbe15b30c3909d093093aaeba34cd089bf87d16e07257cf21444863ec1d131a5e8a5724d02959e748919cc18bb8311d5c7452f390883f7b693d2a0b54519a6ca41f9f35443a85ca48e8481cb350851bea417ba42be4b3bffc76a7e71f1fbe9c9a8319f61a7abecbbf218c377c0ec1c5512ec379ab333cfef78a0f88bfa516e5b0dc37b2b9387107cd09c0a68454762f69d4601a500a0fbf1a5746c22efc2bda7fe595cc53263fb759eb0adf651ce221836c34c8e018a9d5cf7f11f0b49adbd2f8b844d6bc889a8a12d52f96543da3ac3d20f4f17509e76999212923d584a50626b54f4d50d0a389db3648d29371df62dc49ff938c4ad51d8e49805f266555bcf22bb261dc8a8efc0ca6f6d29aca55e110d92eaaae583d4cd784529f7998fbdff084dfc260eb1af5e1ed3a43993971a923b803bacb3cf3a493175152e8ea3af1e1862a467bd1d29add3a47f6911d651e4a526da163b8da718ff5ab6f95d7468cbd7d07b0323a75cdcbf7cd1170d185ab74e47fe508ffaa30fd847e38fa2b42bcb83cf67516db1b773c6c3d5a5cb22f425cb57d62734d1534e816c2fef0a7d30821beae76e216c251e9e55fc1db5096cd28dde7943de9858bae95b7e7032f2076cbcc2b7d934219ed0d3b29cd049ee94ec5ece7ea9f0c6fa2faf6615cfac2caa63424c72817baa90807bae132b06b21567393c8ab71827e00103f0b9cb2a6aa8e50f5260a301d36d6e2e29fe51d46f50b1a7fd7e89a790b98fe62bdae71b24981e1285ae27a8e2e4eeba9e629f477db6378aef7d68492553bf89a955b4ae84f96927035e374aafd9c7f49bc05de73089991669eab370d7a69bfa6f322134b78e67959ee7a2600efae6f37bddbe6c6aa49a068bcdcb92847dad27b4cff7b37bfaad5b7e441124e19eae304059ffe9fbe1fef5b0f153566c05ba49cbc75a057ef7f5f336a06ba58a4cce365cf207eac2ecae5abb2d9077bf252737abecc3cf30b9cbb68d66a69624eddf58e9c8d8e20f40cffc0905bbcfafb57c09571e635f3452e6a459dfa0d548658a9fb0b1837d10478c8b17c1300b42e8eb462eedfbdf85c5b7291c59a05e8bae729ca8fb7e9c32a00d8bf943f6412413f660c9807fc931294e5788ba2f184f2bf69e67703a868be8f0b7029284768f88634a6a185a37d1b4ae0d7b858837b2e23b07d9fd045d73849e5a8cfb279940ac515ca97131e703455ff844d211b281761c751ffbeb44059b32d6a8a8da2062e0a493db7cb050e3443d7f76e37ab19ddc5996828ae143c40e753f64a433b381424363dbd9ce965f84d001c686de80a04dd270d4d3e2c3a9ce3a5fd5e8c50e04280a3d3512f90759f2c4afe03dbbeb8cf183391ce2edae7bc81b62699ef006874cb0c95b8ba5ce0c5361c4e8ef358f106aff304c30acf17015144895b812b4a61b9ac841d8f4402f6484b275e18350278471fbd47981fca3a0be0e5740ec259867f4e88c716379f4fcc43dcd432904918a0e2a4e2615ec7cfc2584c202722413c8a843bc3625ed9fe76da0159d85ce5ba462c23d390f163e7b08c4c1f160e8b4989cad558d913696b06817912b730edef40ae3a1d727783ddfb5fbd0a8271d6d624253957b6209a3e2101afc2d2df082304be41b2141a6e5c38eb13df0874cf402c9cf57f6735dfcf0422e86efd775fc578d64f78bce8a0b1f367a0c7cb009935f30c13a7713b029f6ec3748334b3205c5d2ceca3abd81f032003cc90b6fb23cc284dd690d1be1c2bd3602b60891d3a52982858e275eb6a1ae5280145c34c207c556acd3eb36d771f10e13b1f3a1101c047328e40d4cf45bf7970f14d91c61811d24a852257d9bba4821db57af1b326100fe262b492fbd7f697fd86cf44b5a59c3e86d2c22608bffbd534846b9bedd97553d7a047e834249650679a7d018e9efa60eef00637439841e761b481cab5fc88fdf3c8d1d61e22005790c9b1b52da8160366b372087f3f7cb1eccc303a85a8879a10fd6cce12319c9f64b95a3367d885268d647a2ab5f43166b2d5f94516b919a55c6a03516207dec1c0e73ef454c3a52487552109cf635c1028883040af0969352b04f142c5ce8a2ac5a37531dd7b6a3557533c0ee7a25fb25eea77de284898a0e5b57066c1edcaa2292cefe1bf43960d7723c27f56b3d5054d037cf14508571a36ae42ba5f9eeda34bf5915907869bacc66ad83d2fda0ed5ca9e3b073ae8ec047d4add458669015850c248cac2f8b39f2da267264e7bef215c6ff4651b36cddef2f57453e5ab6de7ba7a7999fdc66fba3c60cf8c070dc2e0bd28c9f4cbfa049f4af736f80bfbc80d585831d544f961684a35b14a41dd40111c4274d356e9f2fffbb4eb77b0edd58a4490a34f5a6b834ae596f349ba131263b7e7318a4646c936475864fe6a14b0fcad82eabf7a355ef04ab0718a8a3cffa114c551f44a6a71b864420036885b89c998b7f47308426700b800176268b6b9cee4af3be48c003e6126cf4cab9ff061606686a373a21a7a4a61ffd7df5eb769063ff6bcc3682c5ec432757df673f9aff6c1a5e8f675790f8a6b8751d7c79f8db32b302c1d3a9b5108e24ff30c1f2e68b4801ad433b141a46e9c827c538600278e65a51f8ebeb8194c77fc99ab4c91a6fdf75c292554196b8eb006e652c7c97018db8ce3f7a21a73296bd269e6fc1c42d3d02bfb145a5e4202d6056f40562bddcab9e81e69add85439c933ccb2dee1b333181b2e174802c8cda0ce8bd936e20a418794fae6ed58c0e9b5ea91e61cedc091665bd7038d7af7cc9175e6457fd626c351aa03a5d76b86e8f090624dd7a6575c3f17994423f9d70677e3a84d2965ee6d4f70614d7c8998b741a9e9a81362a1b3f7746013f35ea2919966e3030799dfb7e263e63ed9a9a936a3775c17ddc139a2aa369d78777b53587088739a8ee9bcfe03f561541468090308e6d21db9bde1d40095d34a9e0a1513a7fabdade1309fa77f80d4f51bf8f92cd49cf74e48b80d0413fc9fe861e91c431838091e61bffe94a9a8f9b6448660dc7c3fb8ab8c6a9467c4b580fc6c588b702945a125368261312a9c40e781066b77dfd95afb2278b4a737a0ddec847b48045366688b9424a694390a111165ab4b28f2da525cffdd81f0e3624e10a52ba2f3891fffaa0ba1c650ffe4509794a404126470d811a81ddaf0464d5a8cf31b7238e75ddfa9999f975136353ac68eeb39d1a4f66a71170590e6ba91aba97ac7d039428c85fa425d6d707acf1411618a144f08549f74ac6938fdabc25e7b7a44edd8b3213fe6dfc62046da4aea5f4b85d48c09c01a994ddc9eb0c5a190416868476134b991eb66f16b224bc770cb2df36f42a33b413d36e3f02965f9a2c3bbfbca15be770786376e7b35e7c5a1c390ca07f98f358b981fa18a0a0bb6802d3a67c4d2545252e71ebfa6df775982ae70f9eb737ced39f1921263c16d261f5cb1b84dbf1a3a578fd9460cdc6122265527d34a19480ec6851cd28b0740a5535a9b45d15fe0f9fe60cfff4e8bc840a14ad0388df257375ef8c0729eeef028cd6aa863ea0cce6951d4a6adbd0052ea14349f4726ba763d366319da7e48191ae3faf38a03351e4a5af31c70e3e4f69cf995d783853ef70a9570ec0c7fa1893ddc28104bc29b905e66d618434d4a4c80e5e1503a771751e3f84836e63c020f7d264cd62cb39acac61b53609c3a399e2ed4436cbb5b83f185dcccea986e5371f030bb0e3a25316026166aa81c8a8a3154b2591c52552f1c30da447a2f8377058202dcd2dabc90976bc9b3a0fd1d782c2d9b3fcd68ee62dd5bcd2813c4d80025337a5dde84223aabeb91a12a52fe38fe7f2e5d689ae07233260783eb1720f652d20789dbdb794dba5c941da246396a4de7cf19fdf481ef78ff59be601f0a220b7e5991b25dcacf8edb5a637105fb139c8d7d04d9e88fe3559cf133aa38725b8a4cb00a491652676ca731513d7e03bca1fa57b648a25f1f7ec079b7a1aeec7598e1c0cd228930df20e2aaf0fb97c8cb8e4567d119d3ac25fee1c0e031575eb1e1e6cbdf7a6dafc444055ab1646ed0e0c63774b222b99e08096a0d6a09689dcf8b80271f0082babf29a6260a9ab5021edec8e6a3c7f915e0b742437e420443def7aa3f9aedbb3089fd0473200c31d7ca20e403d3bdcd40b6e73dd772610cd582a1d07d07500f8c043a1098fb3a120d93ddf836c3775a5997b9842bdfdc78615dc83d7bbe97ec7c1c3d4ec504158ab297b755facbc9ef00caaf5c6a4ac45e9dba22cc5b73350a107e123276b84d96601fed3f2e1af18ffa29517dc9cd046d273428627889fd18ddf6a8ac8901509d53bcb3026c62570a0370505ee1d6baeb689955c4b39bbff2fe875e5b9d3eef2a5f61b570ef043bf8d7b7d8090b37364cf01f7b5fcefb538998eff4fee8699e97fd0c91a62c4960b64e12454eb31fc19b3978baaff0c43bba5132c12c27a8817a3e2ac0bb37a74dbaf602504d61538ebcb03aeb277acc64760bf3e0ca2df55da1bcbd00187953c3cd968a90b74beddfe008f90be48bf959091b68f2ce78c0427705411b23fc2e764957cee78869647b67b61da29c33403df1c075730af2246ad2bbf059c962b84dcaaf2de43237578b2efb92b1f66cd6c29e5f5adc2304a87bc416bd71c53350541d444b768f9ebb50ffe3255001f0fc4fa804731710025f253bc005adf1aba619ef6168a5722b185d5075211abb9b09ed00db760dee50167d39777151d14bf12ae9826ddae793eaf601c8aac2f1603dd3b62fdb91ac326063c999e668d7171c98a91705a6fbd617041517afb93d322a823b06ea31a0d6129b0ff9d060305d6dffdd764d02efc129a666ecaa0f109c4a30209c4bbf2cc2156e984c9663ac4bbd655a4a9678e735cdd555c9b73e34480e7ff2878c5f0c29e6d2524ebdc6b67fbd291c3f8509500460649f3dce066879ef2c2884902790fb1309d3e3ecb6dd42179983bd11dc7c6180f27edf97a1563c385127d43166cedb710db3eb326355d00ac08aee1ae4b2b399f357695a41b25ee6dbca79d973e294a25eb06f5159c44f129e2a4068d1dc1eb8f1512dda907a11b911c85a54800f65d91e5dedb9cf1fe7aa027e3fef4c6de92c73e56f96e368acfb62fb156609c72dcf3fc882f9fb889b15b57840114d3709482805b02614c494e95cbc5e382c61857a1726ffa7a88cd135fb8e7ef8e8f24169aba8a356c0a1cb0bf90b26f0d6ea59bf882f653d7630503054c2e9785b21c83f9c93a33dc13c1cb3e7f3d8fd5f40e0e92af02cc4dc37bd1d49bb87dba6d410523b4031974279d9275920fcf8dd50b72e781161bd8a6f5a5b70b096d94c671a0bad05b3ece99921cc250884eaf550e685e12a6e00f59c8a8259c492973ed998444f5b9797b6c342a49aa808c54ef3dc1a65ae297db972936f7cb88fe731d572f423599630d979142643e263e5a773d30915fc2ed0d785197c6bf6bb86156607b328a58a4bbdbd8bb7eb4a2cca4b9ce799b20c8532751c2e088f3d0846326a69d42db34360f8e0a3c5ac1cc5dfb5ec065d68f2b4e5755f890491ca7e56b65a9e70817e50683241b2079fa9fe7f537f67e4434bd5dbe9b194d6913613143ec838a1ab8b219511124290a1d927944e270325cf7bbb21c3a01fe787364101d87777bfef36cc977e47f787d0c39e604f840834d9f086609a28b6b49ab83155ef32cb6193a9abddcb06a6993cb40a396c1e085f600347c2b7ea619eee2c5bb3eb816d2822c46b47d59f1b639dea69ad6a6fc19b2d5418eb624d5a92f26e550e71da463a9f0eba29510dec09e59977dbb9522c9eacda7a6ce1f07908bba9999b86087987c2c38f2c45f85a8de97716957581746b992239e0c96f6d275e9d07e36713de9a5a3becb94ec5621360f8d248a310075ff378af138703e50329bade76649dea85a90e5f07729a94cc8e4f48296f0a05c36c82e3500e6f46b9b1db46b420c39de4b7d1fb13e89bbe469876ee4b244f3778eec28e65f3a2c2e7b2b311e6f8d365d8988d5822feff28cab30b95fa085e2410d5eb82f5480793a9e8fa27063706b5f011d5b7339c03975413b49ad48103dcd770ae60d693b954a07fa8b9e0f2b3a223d82087ffe594d6d7829600273de919a96d0f2452c8716b0e2971dc02a61525f8694b8eba3679238b73ba37383d4718993a0646bfa1c85b7e36df79ae1261ff4ca2ce7b777e45a1a3517acff247e2222ba73f65befb42d94faa88a8c145af5154477f14b5a3cad90858143f159c5008cc5ae69a762298adf36ede7314fe0084538acb9229198e301e0ebb5ef62ece69eca57cd1fc0b905a662c98fa62a30bedbd22ff797add0a167e1e953918b132dd4cfcc8bf7b3ce1cf3002f8917dc4552848c9bc21771fdceb0fbd77dd7618123234b6743fd29dbb18c23b4eff50e38e0409f2a2cfe4bbe734ac85d85b5fc05191402986dc2d4a278956e4fadcc1d641158c05428f7128138c785bccc8c06c59ba5b8988c1c3e5fc92bf40a959662879fc2f4b00a462335ce971e7f7b7553261c798912ed9872328842a1394c84a2af5f1da00fd5dfaa87b37964b7ace8bd7e110aa7c7c65fce19a17c8049488e80d95cea228134b5f05d3f17cdbcba1887fb38279bb6864ec4ec191f1d8181784b135b363978b89358ab9bd8bf0848c1bfcc1934e2de2eaf3f5d2dc23d53bb0f415ee675bac37e5d1e48585a105c9478cd94ace5d1059fc3258f7cf8a197c9bd0ec4658f223053c53101240ca478c11bc6dd8b94462c1243807156080b7f827d94ec85674b703f5fcfecc7f90af2f65f9ba70bab70e474b37b2544a425df406dd0775a5d8719e2316963d53f13708b31a67d7a996ec0b1c4e320dfb25938a4d081e1009672e318779468ba2d5d507d924327919f0b7f76bd45a306cd4fbba5b2a0e945eab386caba321d452a62ce40d1398a7ca5e447329e657987178f006617ca5191dee1676d7a3a566f841c8b82cd9e89bf947c3fbee75125093190d512cb70bc167c29f62ce2c4d82c7279b27c011c3a1e5adb5dd8b5cf64a250c590a0f13be4f38ba4c688f6af4496c396c1ce97cd371499471e890f1a421b94d404192af783fcc4b7996a5753725731782f8b9cda9f82fb9a089c4bff3bda28a2baf48fd97443bfe8f95ed711efe9ccc4d2e1b65f5d67bc49503d8fcfeef5df2300b2f2df07382924451c22579bb55fca85f02e8fcdabf2a2ece3f429204423b39372379dc6d48b350b5c16e18ac78cf212b2655bd8795b21b689039e49820f4e6a0299d74ef23968ffce5c98393395d2833c092039a02861040a9253a0611f40ac89a828c9caa407cf9dc57d8b048d5a07341b8f9061fad1d678bcbe4988db97e9dbdb353e7a8ea5655554b9d7b5992d4983a6db77c5ec95a462354d0db9ca680e13ffd6ac07f75f52462151f914331f89b2dad85cd88d44bf800d4c6aea0fa9c48b7fe25b3ea46ecff43c89e285cbad27ad0ae245c46be7d0b9eb188bdabc3b9b501c4fd13998ff2498aa10cdb52f8e9aa2180b52dd722214560934856cdd413a0844682b450c072341c396fdb1e7232c83311f95461b43d907a6cf2052570cdcae75aec4ebc2d21e111223d0fc4d75df4d53d3bc893baa3fb91ee99b8009d76f49cdaa476894237758fd795f987ec95f88ebafc6e509a9c56c704d1e07772191bb0a9ea2974451471ff1131e8fb0880efec56f6bf6dedcabdc784ca30190db8aaccb5d972ee5227958df1586556fe6c9bb7fbfcc2dba5c2b9c78961327635d147f663cd76a5442dc54e0e1d3930f627c8fb36bd813d59c49a62f5c157c5b9250e58aa02851eea9f6a2fe14857750a558260552d504bb9039d777572fa71f52e88a1841ab10a54b7aebe94046a9a2c7621c4df3b6142fa3a1e2cda6332b927a484fb9578186e5e9f47438f4a2a123e3b7b34c88f5c51739649e5b87c5e0fe8ecd68a6278ce0afce79a7b82010fe7f41d71e73d804601364a3dee89b9b919d51e1b8f3fb696fb9787df427d46e75db528a051fddd1e4c314c3da0ca15e03c16be82a0816fc0840189b0ba45523e7fb1ae5a1c98b384689d8775ac7f675f7f1f4a28368032b30795986ed95033607aa72689c44551243416db292007da123b7700dac53ea18973b24c63e9f8e0331450d672b99d1a9bb7116444c01f46040997d6c720d836e0daa109368db89927d2d6280b22684f581cb129268295b281103746348c288f0e904989ff638892ddca22952fde2cc8cee6dcc4b3601f22e7c27f1f78427c324d57dd56437cb31462909da1a0e1485691a47858c36034ae13a2997b7569d8a81a62494bc56203c57a3c9a6bfa3684aea392df1a537ddaed992814dc81719e95e443a21a85d03f633438d152b2df343acd7c2c570f3b2bfdb0a057c86b3d800c827fc1d4d39a4f6b22f89c3774296da68ba5f37542753eccaf92a8d0742951dc2f4cf4a0d19de7456ad4f7cfeb1a0f6fcf9af6dabaf462b4ecced3d195fe1b2e82bae23af088ed48f9dcbe3704ff614adf382373dc8dd9432c39cdbd48f2730e08be81dcce2179494f98da010b7e6164ddd88f7604b1e813505b6803d9611fb22b86801b986ee8d72a5e6d25dadf9f13e4d7c558e045d6c9ec1f7a607414ed6726d08ac780a2dd5bf5cb03c8bbd896fb0d94aae4925eb2f24ca2783b7a061d9bed376b3724ad6393ed08c817aa5dd9ffbee22f3656d0948d312264976dae5c6b2dd5fe93dec513c13680c5371a6f742957e248ecedd5220472c28c930d2f2d863e52d15af9e1570a88b01c9632dcc7f038c4e264d83997f3694751f808788a7a652b5b00361b7588a0855f6fd123434766ef36128b2aed370199f1b98d62a7e8f75e6471e248cd7ad615d1cf5a0e037d894a007dd467211ed07f0564777b676f88de294c659b5b7ec9dc46f68529f518d85d5c9be6b82ecc73137a7c3a9192258d189ff7efb598d202c501c7606b48c899b5c9aba85aadabc1d67c055d998d2321016823e4dd6c2be473bcde5ad5c7f4264ecad21d7252bc5418e74c99d7db7675aa9b5383dddf1082eb6bbe1efbbd05487ef3a61315eef3933d32ddda3360712724cde070e4ed36349abb3f756881d3dfb7fc71e646277abc197662d1d81b24b70663b347c0e06a2c48fb23fb4ed42716a72c09033b386563a08968c5b55dc9a77c7789896ba14266d3023d388b1811b87d21454a90d8d5853183d3ba3d3d3f8af59167d120ea504acb005d73a8169f59c8c6cae07dd77458f9b28a11a6f08d65acd478c814d0eccd98ca43ba251804df69c446611a42977b6ef9c09cf906329317c0930a6e15832957e8e51f34ddb288408d57a55ccd6e9443cc17a81ad57bbc52928e855214afbf1fbe48138fbb25a71df3a1cb2abe803df77e7f7086ba591ecb7f098b0d96178c161a9ac146fa4666731ceb355c7c48baf392f2f02e3545d448c0237c4b552a6e6cf0cfcf28e130ae50e41a9c491bb05d6baba768677bbc68b682e136c6829fc30c93a93276ca96ab5170e3c41d47031a0c1de7fd5dd6da9730e79ecf095dda3ab815e3a7f451948a098bf915ca849de967d2a11ad8ff0376172e67b065364d3bb28f9ce095fd7f31df4c3e499d6129ac17d3e1a243937503878833ebc0280f781c3ac14164b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe950fc8893ce690c41c30bb1a9846adcef56fe53eeb84398327326ce74b71f9069214cebea7c0677ad4c1c530bb2516bab0ca560779be256a7260acf5d576b9b3118d409387e386ddf67b1f02a03542b092edfb32be734144f947a53916972e39d515f7bf0f4839e721dfbf7814e4a990deaf77cbc2517c38d54e651caf8a34dfe0d59daf186fbe30b578aa59f9add67080011d2b490316ec124cdf0f936282d5d0b3ee9c1c79fe5f6cb5d7a3359f607b62472ea5bdc75008d17e4e608e514be761c2" @@ -49,9 +47,6 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { if !is_bridge_stuck() { return RocksDbWeight::get().reads(1); } - if is_bridge_upgraded() { - return RocksDbWeight::get().reads(1); - } log::info!(target: LOG_TARGET, "Updating beacon checkpoint to unstuck beacon client"); @@ -90,8 +85,6 @@ impl OnRuntimeUpgrade for UnstuckSnowbridge { #[cfg(feature = "try-runtime")] fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { frame_support::ensure!(!is_bridge_stuck(), "Snowbridge is still stuck."); - frame_support::ensure!(is_bridge_upgraded(), "Snowbridge is not migrated."); - log::info!(target: LOG_TARGET, "Snowbridge is migrated."); Ok(()) } } @@ -100,10 +93,6 @@ fn is_bridge_stuck() -> bool { LatestFinalizedBlockRoot::::get() == LAST_IMPORTED_BEACON_HEADER.into() } -fn is_bridge_upgraded() -> bool { - LatestFinalizedBlockRoot::::get() == IMPORTED_BEACON_HEADER_AFTER_MIGRATION.into() -} - fn checkpoint_update() -> CheckpointUpdate { CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") } From 8c6e2562b2b9fb846cb05028542ce2dd5b021d24 Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Sat, 18 May 2024 23:49:16 +0200 Subject: [PATCH 21/22] Box CheckpointUpdate --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index bf1586d53a..ac6d243300 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -93,8 +93,8 @@ fn is_bridge_stuck() -> bool { LatestFinalizedBlockRoot::::get() == LAST_IMPORTED_BEACON_HEADER.into() } -fn checkpoint_update() -> CheckpointUpdate { - CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed") +fn checkpoint_update() -> Box { + Box::new(CheckpointUpdate::decode(&mut &NEW_CHECKPOINT[..]).expect("checked by tests; qed")) } #[cfg(test)] From bf1b5c0129deb2eced3dcfeacb211a6fbecbd2ab Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Sun, 19 May 2024 11:13:33 +0200 Subject: [PATCH 22/22] Import Box --- .../bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs index ac6d243300..1b00e18b26 100644 --- a/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs +++ b/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_ethereum_unstuck.rs @@ -24,6 +24,7 @@ use snowbridge_pallet_ethereum_client::{ CurrentSyncCommittee, InitialCheckpointRoot, LatestExecutionState, LatestFinalizedBlockRoot, NextSyncCommittee, WeightInfo, }; +use sp_std::boxed::Box; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError;