Merge #5963: backport: bitcoin#16551, #20288, #20329, #20451, #20491, #20512, #20587, #20588, #20611, #21112

c8653387b1 Merge #21112: ci: use Focal for macOS cross builds (MarcoFalke)
1995d2e7ca Merge #20451: lint: run mypy over contrib/devtools (Wladimir J. van der Laan)
eba325d7a2 Merge #16551: test: Test that low difficulty chain fork is rejected (MarcoFalke)
b193c63fed Merge #20611: Move TX_MAX_STANDARD_VERSION to policy (Wladimir J. van der Laan)
41505e64aa Merge #20588: Remove unused and confusing CTransaction constructor (fanquake)
d186b3714a Merge #20587: [doc] Tidy up Tor doc (more stringent) (Wladimir J. van der Laan)
def356e2cb Merge #20512: doc: Add bash as an OpenBSD dependency (Jonas Schnelli)
d01973cc08 Merge #20491: refactor: Drop noop gcc version checks (fanquake)
455bb2e117 Merge #20329: docs/descriptors.md: Remove hardened marker in the path after xpub (MarcoFalke)
9eec4cc2e1 Merge #20288: script, doc: contrib/seeds updates (Wladimir J. van der Laan)

Pull request description:

  ## Issue being fixed or feature implemented
  Just regular backports from v19 and v22

  ## What was done?
   - bitcoin/bitcoin#20288
   - bitcoin/bitcoin#20329
   - bitcoin/bitcoin#20491
   - bitcoin/bitcoin#20512
   - bitcoin/bitcoin#20587
   - bitcoin/bitcoin#20588
   - bitcoin/bitcoin#20611
   - bitcoin/bitcoin#16551
   - bitcoin/bitcoin#20451
   - bitcoin/bitcoin#21112

  ## How Has This Been Tested?
  Run unit/functional tests

  ## Breaking Changes
  N/A

  ## Checklist:
  - [x] I have performed a self-review of my own code
  - [ ] I have commented my code, particularly in hard-to-understand areas
  - [ ] I have added or updated relevant unit/integration/functional/e2e tests
  - [ ] I have made corresponding changes to the documentation
  - [x] I have assigned this pull request to a milestone

ACKs for top commit:
  PastaPastaPasta:
    utACK c8653387b1

Tree-SHA512: 38e747a82091874f8cb87f35dc99aa8498e798f3818525c3fe99b2ed454fd8490d710c6eb7c3a0840105bb126503d301262d2f473a2502c66de8c32c8de94922
This commit is contained in:
pasta 2024-04-03 09:27:17 -05:00
commit 49e480f642
No known key found for this signature in database
GPG Key ID: 52527BEDABE87984
26 changed files with 406 additions and 54 deletions

View File

@ -149,7 +149,7 @@ task:
FILE_ENV: "./ci/test/00_setup_env_native_nowallet.sh"
task:
name: 'macOS 10.12 [gui, no tests] [bionic]'
name: 'macOS 10.12 [gui, no tests] [focal]'
<< : *GLOBAL_TASK_TEMPLATE
container:
image: ubuntu:focal

View File

@ -8,7 +8,7 @@ export LC_ALL=C.UTF-8
export CONTAINER_NAME=ci_macos_cross
export HOST=x86_64-apple-darwin
export PACKAGES="cmake libcap-dev libz-dev libbz2-dev python3-setuptools"
export PACKAGES="cmake libcap-dev libz-dev libbz2-dev libtinfo5 python3-setuptools"
export XCODE_VERSION=12.2
export XCODE_BUILD_ID=12B45b
export RUN_UNIT_TESTS=false

View File

@ -26,7 +26,12 @@ that the list is as expected.
## Dependencies
Ubuntu:
Ubuntu, Debian:
sudo apt-get install python3-pip
pip3 install dnspython
sudo apt-get install python3-dnspython
and/or for other operating systems:
pip3 install dnspython3
See https://dnspython.readthedocs.io/en/latest/installation.html for more information.

View File

@ -16,6 +16,7 @@ pkg_add autoconf # (select highest version, e.g. 2.69)
pkg_add automake # (select highest version, e.g. 1.15)
pkg_add python # (select highest version, e.g. 3.8)
pkg_add gmp
pkg_add bash
pkg_add boost
git clone https://github.com/dashpay/dash.git

View File

@ -40,7 +40,7 @@ Output descriptors currently support:
- `combo(0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)` describes any P2PK, P2PKH with the specified public key.
- `multi(1,022f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4,025cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc)` describes a bare *1-of-2* multisig with the specified public key.
- `sortedmulti(1,022f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4,025cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc)` describes a bare *1-of-2* multisig with keys sorted lexicographically in the resulting redeemScript.
- `pkh(xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw/1'/2)` describes a P2PKH output with child key *1'/2* of the specified xpub.
- `pkh(xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw/1/2)` describes a P2PKH output with child key *1/2* of the specified xpub.
- `pkh([d34db33f/44'/0'/0']xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL/1/*)` describes a set of P2PKH outputs, but additionally specifies that the specified xpub is a child of a master with fingerprint `d34db33f`, and derived using path `44'/0'/0'`.
## Reference

View File

@ -164,7 +164,6 @@ versions of Tor see [Section 4](#4-automatically-listen-on-tor).*
HiddenServiceDir /var/lib/tor/dashcore-service/
HiddenServicePort 9999 127.0.0.1:9996
HiddenServicePort 19999 127.0.0.1:19996
The directory can be different of course, but virtual port numbers should be equal to
your dashd's P2P listen port (9999 by default), and target addresses and ports

View File

@ -44,7 +44,7 @@ static void DuplicateInputs(benchmark::Bench& bench)
naughtyTx.vout[0].nValue = 0;
naughtyTx.vout[0].scriptPubKey = SCRIPT_PUB;
uint64_t n_inputs = (((MaxBlockSize() / ::GetSerializeSize(CTransaction(), PROTOCOL_VERSION)) - (CTransaction(coinbaseTx).GetTotalSize() + CTransaction(naughtyTx).GetTotalSize())) / 41) - 100;
uint64_t n_inputs = (((MaxBlockSize() / ::GetSerializeSize(CMutableTransaction(), PROTOCOL_VERSION)) - (CTransaction(coinbaseTx).GetTotalSize() + CTransaction(naughtyTx).GetTotalSize())) / 41) - 100;
for (uint64_t x = 0; x < (n_inputs - 1); ++x) {
naughtyTx.vin.emplace_back(GetRandHash(), 0, CScript(), 0);
}

View File

@ -13,6 +13,7 @@
#include <consensus/consensus.h>
#include <core_io.h>
#include <key_io.h>
#include <policy/policy.h>
#include <primitives/transaction.h>
#include <script/script.h>
#include <script/sign.h>
@ -202,8 +203,9 @@ static CAmount ExtractAndValidateValue(const std::string& strValue)
static void MutateTxVersion(CMutableTransaction& tx, const std::string& cmdVal)
{
int64_t newVersion;
if (!ParseInt64(cmdVal, &newVersion) || newVersion < 1 || newVersion > CTransaction::MAX_STANDARD_VERSION)
if (!ParseInt64(cmdVal, &newVersion) || newVersion < 1 || newVersion > TX_MAX_STANDARD_VERSION) {
throw std::runtime_error("Invalid TX version requested: '" + cmdVal + "'");
}
tx.nVersion = (int) newVersion;
}

View File

@ -16,7 +16,7 @@
#include <unordered_map>
#define MIN_TRANSACTION_SIZE (::GetSerializeSize(CTransaction(), PROTOCOL_VERSION))
#define MIN_TRANSACTION_SIZE (::GetSerializeSize(CMutableTransaction(), PROTOCOL_VERSION))
CBlockHeaderAndShortTxIDs::CBlockHeaderAndShortTxIDs(const CBlock& block) :
nonce(GetRand(std::numeric_limits<uint64_t>::max())),

View File

@ -496,6 +496,7 @@ public:
checkpointData = {
{
{255, uint256S("0x0000080b600e06f4c07880673f027210f9314575f5f875fafe51971e268b886a")},
{261, uint256S("0x00000c26026d0815a7e2ce4fa270775f61403c040647ff2c3091f99e894a4618")},
{1999, uint256S("0x00000052e538d27fa53693efe6fb6892a0c1d26c0235f599171c48a3cce553b1")},
{2999, uint256S("0x0000024bc3f4f4cb30d29827c13d921ad77d2c6072e586c7f60d83c2722cdcc5")},

View File

@ -152,7 +152,7 @@ public:
CService addr;
CCoinJoinEntry() :
txCollateral(MakeTransactionRef())
txCollateral(MakeTransactionRef(CMutableTransaction{}))
{
}
@ -246,9 +246,8 @@ public:
uint256 m_protxHash;
std::vector<unsigned char> vchSig;
int64_t sigTime{0};
CCoinJoinBroadcastTx() :
tx(MakeTransactionRef())
tx(MakeTransactionRef(CMutableTransaction{}))
{
}

View File

@ -59,7 +59,7 @@ bool IsStandard(const CScript& scriptPubKey, TxoutType& whichType)
bool IsStandardTx(const CTransaction& tx, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason)
{
if (tx.nVersion > CTransaction::MAX_STANDARD_VERSION || tx.nVersion < 1) {
if (tx.nVersion > TX_MAX_STANDARD_VERSION || tx.nVersion < 1) {
reason = "version";
return false;
}

View File

@ -75,16 +75,23 @@ CAmount GetDustThreshold(const CTxOut& txout, const CFeeRate& dustRelayFee);
bool IsDust(const CTxOut& txout, const CFeeRate& dustRelayFee);
bool IsStandard(const CScript& scriptPubKey, TxoutType& whichType);
/**
* Check for standard transaction types
* @return True if all outputs (scriptPubKeys) use only standard transaction forms
*/
// Changing the default transaction version requires a two step process: first
// adapting relay policy by bumping TX_MAX_STANDARD_VERSION, and then later
// allowing the new transaction version in the wallet/RPC.
static constexpr decltype(CTransaction::nVersion) TX_MAX_STANDARD_VERSION{3};
/**
* Check for standard transaction types
* @return True if all outputs (scriptPubKeys) use only standard transaction forms
*/
bool IsStandardTx(const CTransaction& tx, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason);
/**
* Check for standard transaction types
* @param[in] mapInputs Map of previous transactions that have outputs we're spending
* @return True if all inputs (scriptSigs) use only standard transaction forms
*/
/**
* Check for standard transaction types
* @param[in] mapInputs Map of previous transactions that have outputs we're spending
* @return True if all inputs (scriptSigs) use only standard transaction forms
*/
bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
/** Compute the virtual transaction size (taking sigops into account). */

View File

@ -92,8 +92,6 @@ uint256 CTransaction::ComputeHash() const
return SerializeHash(*this);
}
/* For backward compatibility, the hash is initialized to 0. TODO: remove the need for this default constructor entirely. */
CTransaction::CTransaction() : vin(), vout(), nVersion(CTransaction::CURRENT_VERSION), nType(TRANSACTION_NORMAL), nLockTime(0), hash{} {}
CTransaction::CTransaction(const CMutableTransaction& tx) : vin(tx.vin), vout(tx.vout), nVersion(tx.nVersion), nType(tx.nType), nLockTime(tx.nLockTime), vExtraPayload(tx.vExtraPayload), hash{ComputeHash()} {}
CTransaction::CTransaction(CMutableTransaction&& tx) : vin(std::move(tx.vin)), vout(std::move(tx.vout)), nVersion(tx.nVersion), nType(tx.nType), nLockTime(tx.nLockTime), vExtraPayload(tx.vExtraPayload), hash{ComputeHash()} {}

View File

@ -187,12 +187,6 @@ public:
// Special transaction version
static const int32_t SPECIAL_VERSION = 3;
// Changing the default transaction version requires a two step process: first
// adapting relay policy by bumping MAX_STANDARD_VERSION, and then later date
// bumping the default CURRENT_VERSION at which point both CURRENT_VERSION and
// MAX_STANDARD_VERSION will be equal.
static const int32_t MAX_STANDARD_VERSION = SPECIAL_VERSION;
// The local variables are made const to prevent unintended modification
// without updating the cached hash value. However, CTransaction is not
// actually immutable; deserialization and assignment are implemented,
@ -212,12 +206,9 @@ private:
uint256 ComputeHash() const;
public:
/** Construct a CTransaction that qualifies as IsNull() */
CTransaction();
/** Convert a CMutableTransaction into a CTransaction. */
explicit CTransaction(const CMutableTransaction &tx);
CTransaction(CMutableTransaction &&tx);
explicit CTransaction(const CMutableTransaction& tx);
CTransaction(CMutableTransaction&& tx);
template <typename Stream>
inline void Serialize(Stream& s) const {
@ -319,7 +310,6 @@ struct CMutableTransaction
};
typedef std::shared_ptr<const CTransaction> CTransactionRef;
static inline CTransactionRef MakeTransactionRef() { return std::make_shared<const CTransaction>(); }
template <typename Tx> static inline CTransactionRef MakeTransactionRef(Tx&& txIn) { return std::make_shared<const CTransaction>(std::forward<Tx>(txIn)); }
/** Implementation of BIP69

View File

@ -15,7 +15,7 @@
#if __has_builtin(__builtin_add_overflow)
#define HAVE_BUILTIN_ADD_OVERFLOW
#endif
#elif defined(__GNUC__) && (__GNUC__ >= 5)
#elif defined(__GNUC__)
#define HAVE_BUILTIN_ADD_OVERFLOW
#endif

View File

@ -28,7 +28,7 @@ FUZZ_TARGET_INIT(script_sigcache, initialize_script_sigcache)
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
const std::optional<CMutableTransaction> mutable_transaction = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
const CTransaction tx = mutable_transaction ? CTransaction{*mutable_transaction} : CTransaction{};
const CTransaction tx{mutable_transaction ? *mutable_transaction : CMutableTransaction{}};
const unsigned int n_in = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
const CAmount amount = ConsumeMoney(fuzzed_data_provider);
const bool store = fuzzed_data_provider.ConsumeBool();

View File

@ -41,7 +41,7 @@ FUZZ_TARGET_INIT(transaction, initialize_transaction)
return CTransaction(deserialize, ds);
} catch (const std::ios_base::failure&) {
valid_tx = false;
return CTransaction();
return CTransaction{CMutableTransaction{}};
}
}();
bool valid_mutable_tx = true;

View File

@ -173,7 +173,6 @@ public:
CompactTallyItem GetTallyItem(const std::vector<CAmount>& vecAmounts)
{
CompactTallyItem tallyItem;
CTransactionRef tx;
ReserveDestination reserveDest(wallet.get());
CAmount nFeeRet;
int nChangePosRet = -1;
@ -185,6 +184,7 @@ public:
BOOST_CHECK(reserveDest.GetReservedDestination(tallyItem.txdest, false));
}
for (CAmount nAmount : vecAmounts) {
CTransactionRef tx;
BOOST_CHECK(wallet->CreateTransaction({{GetScriptForDestination(tallyItem.txdest), nAmount, false}}, tx, nFeeRet, nChangePosRet, strError, coinControl));
{
LOCK2(wallet->cs_wallet, cs_main);

View File

@ -3760,7 +3760,7 @@ bool CWallet::CreateTransaction(
int nExtraPayloadSize)
{
int nChangePosIn = nChangePosInOut;
CTransactionRef tx2 = tx;
Assert(!tx); // tx is an out-param. TODO change the return type from bool to tx (or nullptr)
bool res = CreateTransactionInternal(vecSend, tx, nFeeRet, nChangePosInOut, error, coin_control, sign, nExtraPayloadSize);
// try with avoidpartialspends unless it's enabled already
if (res && nFeeRet > 0 /* 0 means non-functional fee rate estimation */ && m_max_aps_fee > -1 && !coin_control.m_avoid_partial_spends) {
@ -3774,6 +3774,7 @@ bool CWallet::CreateTransaction(
}
CAmount nFeeRet2;
CTransactionRef tx2;
int nChangePosInOut2 = nChangePosIn;
bilingual_str error2; // fired and forgotten; if an error occurs, we discard the results
if (CreateTransactionInternal(vecSend, tx2, nFeeRet2, nChangePosInOut2, error2, tmp_cc, sign, nExtraPayloadSize)) {

View File

@ -0,0 +1,258 @@
fork:000000202cbcf83b62913d56f605c0e581a48872839428c92e5eb76cd7ad94bcaf0b0000c41f893a0d296b3b17730b42beb432aedc62473d0e6839910209d7f21af31a9bb9968054ffff0f1efd6b0e00
fork:000000201ed4bb12db90cfb7c68051d82f922b86b24c6a247de6168678c9a489ef020000e5968c16ea68f5f8d6ce1f1a987a7484986710c7cae2ac81ca1b5552f059aeceba968054f0ff0f1ef38f0c00
010000000000000000000000000000000000000000000000000000000000000000000000c762a6567f3cc092f0684bb62b7e00a84890b990f07cc71a6bb58d64b98e02e0dee1e352f0ff0f1ec3c927e6
020000002cbcf83b62913d56f605c0e581a48872839428c92e5eb76cd7ad94bcaf0b00007f11dcce14075520e8f74cc4ddf092b4e26ebd23b8d8665a1ae5bfc41b58fdb4c3a95e53ffff0f1ef37a0000
02000000c108f2910109954fcdec2f962f1a9094be266cb6aeaae37b345e63247d0400004d29e4f9b2e05a9ac97dd5ae4128b3c0104bdc95aabaa566cc8eeb682e336d0dc4a95e53f0ff0f1e7b190000
02000000c2cc6fa3fe4d9fb73476bc3cf02248aa762af4960399232dbab4fa64620c000058968247522cc488db01996de610d6f3b8c348e748198dc528a305941211c71cc6a95e53f0ff0f1ecacf0000
0200000011d8f461af04ac482c58e77386b1c1c12febbabb17bc76e4cb5a945c7d050000e2b34a4d7df928cd8788c0265ec0fa7dba0746c625e3b1ccf68b3057141b6b7ecea95e53f0ff0f1e87f20200
02000000426b38cf7bd078c9dba7d212bb3d107c4330c0ab82e2cdcdf48bd58b25020000162f3c2edcdb953ef93607bca655c507023479b2f30f9e7a84dce888b7f3f44cd0a95e53f0ff0f1e8fa00000
02000000fc438ab1e8a234d53ee7795b9bb715a3374431e273c1c448917f0006140b00004c4c0fc8012dcc980cac49acfa2f32040d114d6230b7577127a5c073135ec299d3a95e53f0ff0f1e57f30000
02000000445a5b9d4db990c9c2262d971139072a507cee7648320d55ec314bde930d0000f3b36042e4646c82de642ab6be2fd7d3723960f0693ffee473508edc73c49f76d9a95e53f0ff0f1e0bf30100
020000003d855028e9700d5d18566237c3037111ef1c545e96dc98629ded0db5540100009e66786e23f6e774e3763f6e7212205eff14e744789127bb36295d6732e74382dca95e53f0ff0f1e93f20000
0200000041a5d86d40fe5cc23e56afdded2e6c73402ca5c0dba41f06483ea3539e080000ee8409f147c6cc26edb0bb5d8281f7d9795e3a150d9abe9eba216470d6863724e2a95e53f0ff0f1e8bf40100
020000008529338d17c21274818dc44ede4014d88c9828ba0dd03e5e50b1b0a2980e000031fa1b05e6e76c3ae2e78e38248d9b00b6282d4464c22e7399921d445f3858b1e3a95e53f0ff0f1e9b5b0000
02000000780924780da4713999a453d916495162872bce7d38dc6e75b4ca248112010000d5d581a5006b06a1dffe9f32ab258ecd3539f3904f550813210fa96cdf6c961fe7a95e53f0ff0f1e18e50000
0200000002d0242c85c6ed668f663d8fdc7237edbaeb332eb045a1859c94de30e40c00001d4c82d75a5eade08ce99e5a4eee3f7d0c66f906374c74d89cba5f3b40603366f5a95e53f0ff0f1e2bc40400
0200000031b34bdcaa80cec1e81ff19930074a5a2e90d69012e4609270dfc9a0c30a00004f8f43f9998c0be360cfe401b6ff22e13a130a6fbbdf5923842b71e6a322edc2f5a95e53f0ff0f1e85200000
0200000001c5974ba8e17829cbc3c2877b70feee93ef4c1f6c702d5333e7346b520b00001bcf182d4605f116989efca26ac858a76d9bff678fd091a3be6b98d431e29489f8a95e53f0ff0f1ef3ec0000
02000000a8237bacf197066b754015a996e6081afc372740045e218a496369cc99070000d995c55abacd1a0df9780e9519381d2b63ed5abab7a855df3045cb55dd787af5f9a95e53f0ff0f1e90460000
020000004fc04469b20f772a9f34bd8e730a7337d7c28ddd2516493b9c8e70cc700100006de092da17b552a7eaab881d091554567a7d50c7b0d280ff164f0a580aa994542c516153ffff0f1ed3bb1700
020000002be29d2220a7b073f071fde0a4178fc822a0df135ae101c72827e26aab000000841a43b8cf82119d353a31ffe4a65767dbc99ca97c2095126d04473fa0f4030c0f3ec953ffff0f1e2fc21600
02000000d024f0078eb86f34674ba8061c5b6f4adb753387f37e4a6dc4ddefdf4105000090197e2f2f8cf35ad2d028e8e752db599222d003808d034fddb7c865b1d16a2d213ec953f0ff0f1e65be0e00
02000000d893cb8dafa7ac7047e6d4172b9bbe127ec96384358cbfe793dcd875d2000000f722d5168f23450f91afac88e75fc1ce6f3a1a1b91c0bfe5eb24c4f4042355e33e3ec953f0ff0f1ec05b1900
020000008a7cb19c4bdbe30b5980ccf43ced213fab8c95d4a6e3a22c81389b763a07000034b9f8fc1ef819ee60ac3bead38e64cc5c72a27dd508757e0ea8fb5f12010edd4d3ec953f0ff0f1e2da40c00
0200000053b1e69ec3b8ce3cb5d6aad4600d893f266ab764781c1615ead56ba4160800007e4641e1c8c72e090e3d839ab3ebfe11265333a8871ab9b6c0f8819c74d54728513ec953f0ff0f1ea7c50000
02000000dcad364557b8582f61f22df266850d00e884e6c2b7d5e32bb3bc99f976090000ee1eaf50f3e4aacaf8526b3a51d575040cd1f28ff61d39345c34192498b2d7785c3ec953f0ff0f1e5d5b0900
020000000d5d11269b791a2ddaadad4827c2c037163b63d597910bde3df2006e4f0a0000b4d9c6f54d4b509c4c2e3d61f7330d58d8f2bfe1c444d13da14dc94ba8f98abc6f3ec953f0ff0f1e5e071000
02000000ef607e4d01cbffe571e058e32698be01f9b259c399b467153bac604dd00a00003f9401369b261c5a1684ea8012635802c8bb6f246961b07377963bf47349bf3c873ec953f0ff0f1e1c131500
0200000061f6e5d25232bb4ffc9794a65ac67009b8f88c7cc38aa2ef30a566e6f10d0000dca66a6906e2c09dc91aa5ff29fed65e140eb381e4154da42d881d3b89c850408e3ec953f0ff0f1e55610500
020000007ad835393c079dba2298672267d0a1ea57134c57fbf75086b81de242710600002caf899d0b99dd054faa66e93501dd3e6d1e44c969f7c8994a58b312ff027dd6913ec953f0ff0f1e1d440200
02000000d160799a385be1c968328aa2f8c488c8db0b5a908ddd37171102a3a85300000013440ec308e8b69db21a9960e6d3d14b56d7c8660c0be7f6d49908d7004ee5409e3ec953f0ff0f1e094b0300
02000000999b7ed6bdf5aa964d461c26c21a51a62a7b2954ddf62de03982a9fc2201000060113ce6c394fb155b3c7ef653a9329c2b1d4b5ab16181a96fe554c32318a1adaa3ec953f0ff0f1e0fd80900
02000000aaf6cda39eeda63fb9f47d03a55257d1b46e253530bb12852f249ab52d0a000014fc57176256888ae97a1ae5325a46544f745819a1f785beeb0a59fe5b9ff6d6ad3ec953f0ff0f1e542f0200
02000000886dca1e1d85999f028299d84faf557aa5e4d033c8a0de508e337b96020d00003b1576afdfae95f791af01ef8c44f96ba6afe9b4cff8dc6acc795666720214ccb13ec953f0ff0f1ed5d70000
020000008fc2a4ea645b8f0bf49281f171aa4f5bf2c596fd8edb648671355e4f55080000a287eeebb4624e5a19a22b5a11cfaa24a4c4cd089a9555625d08cd585c513e92c03ec953f0ff0f1e7e900300
02000000ab1f3ff7709decd075d1f37d4e95c8d50dc4a151e0e551d675483726630100003fc82b967a8a9bfbc2d2ec8c4a49f45005759a23267298929cba005b065805b0c73ec953f0ff0f1ecd570500
02000000a422296ed4d35d429c09f675998c8a2c20812db130faf113b340aeba1f0d00005326fbc769c7067bf52430e8ca0089c0e6fa437c1229c567f98b1a78e444d1c3cf3ec953f0ff0f1e052e0700
0200000039a1a433827b67e40c1b8aa780ab094d148128dbfbb5bff80dc6c15a6d0d00004835e3d567a5312ecb6cfcfb853a581bfab61a4369a82b2dd39fa85329671b91d53ec953f0ff0f1ec0580500
02000000751192ac5d41d7414f2b024204f484b6494d07e6c4148c8901488f78160f0000478c0b03bfe1e2685a255902fa6207331ea74ce6efdcda4bf58a615405ebbb9ae43ec953f0ff0f1eac6c0300
020000008c168dc008c76dd242b662d751a8b43de32ec41c54a11b8984bd7f1550090000de4233697696679f76afd49a20af6bf74d9f2a950be5281108d91528c13e249ae53ec953f0ff0f1e98a40000
020000008f48755f2778402a7857f5ed970a14a731e1471a150a256cb97e4dfe9607000024c930e500c78cefa0b37d2506f120e68e5a496678c9220c115a2e03dc66e3aa0c3fc953f0ff0f1e74ea2000
0200000067ac3acd7d1c0d00948238c14d4a497e6353fe19c37e32a72398d1f3170d0000882e59d72fea00f0563f3c80411138d8633a80d5bcc67041c8c2dba02a41c769203fc953f0ff0f1e2daa0000
02000000979da9e4ea4fcfb6967502b66f9d89410c8d3b2178be8f3c09aa4b23f803000082d641514dacfce1bac3c9bbbc3358a8faaa89dc1d7a5b205b8022cc78f030f3243fc953f0ff0f1e5ea50100
02000000a08556b1aef5758ec1bb3ccc690b0d2e3bad913c1941e9c221413c4afc0300004b9956f8e9d38b48082f325a9222bfa97784ca5a248d46de7b7c40e1fde21111263fc953f0ff0f1e6bc80000
02000000b9b76c2b82dd415c4434efc93e4081c070f4711566f6ce5fef45beeab10f00003d1cd18a0042ae85d1dea63ca5c1550e49d55b5ef77a639db20060fa82f4e007313fc953f0ff0f1e5d430400
02000000bade9bbe1d805ea00fed36a051ba24e748065ff745e009b5cbde5316fd040000fe2087d0accc4a2f5282e34e0d3695dae3d440ec4fb87954b8cb988050790ac9323fc953f0ff0f1eb89c0000
02000000183c92e0c21e6eab0da773f6d5d9371019aed51bc9d520882474a047eb0f0000c756fd8aba9e4000320636d4a66618ada15ecc00af5716195398632770a410eb373fc953f0ff0f1e4bf10100
02000000fd50b6bc05839a891ae063afe23486c3c3e0f9986cf973ffb58231d2620b00009f482443cf1339621cbf9d94d0a5e8dd69312812b160d27fcd46a0d71573b4d04d3fc953f0ff0f1eb38c0800
0200000028358ee185479ae0488211d394be0a44ee929a3369be889c3043e2317c060000ff2540ab637a9327e3defab5eb68a005a206a9f3a543081e062b0768af2bce6d503fc953f0ff0f1ec2460100
02000000baa600ea9bd552ea56686a6cb0362e2f4766a49d6b67cf91847414ff570d0000d15140ac63af921c21d1001b5018127ccdc8c8473dd8dbf76a9ed2aebc38c39d533fc953f0ff0f1e47330100
02000000e06abb1efb3553e7de64517363008e38a6eb16373b9e00f97ddbf3b64107000097d03465f7804dfbaecf3a5c9d8fe812068ebba34c8dae5553cba03dd97fc059563fc953f0ff0f1e23f50000
020000009d8aba465508848988491bb13a72093a84a47533cc50807010bd5e2ef7010000b86ce8d74370ecb66b12c776e822f6b3c39d17c85ca5cfb308702e2a06b442d1583fc953f0ff0f1ec4eb0000
020000003c1d1daf5d63ca78a757de2e606a371cdc50e352bf99e8333730c2832c05000025fc2a12dc7e0ed93c7ff14b7301bdddc084a4aff26e268c66595373286e61ef5f3fc953f0ff0f1e2b2c0200
02000000f5f833d8987bd61c4d53e16524c5f9ecce64c6460cd3d3d66bb676b30a0700004ae3bb938af27b0df0cd646eab9d31c9d44b3ffbcb23ea9a178563d508e7b44b5f3fc953f0ff0f1e18290000
02000000f640b79037909316ce772ef4549f49cd2f124d7eec3871acf9fca2c61d0a0000d7aac1b3e8d5d5ca0d2ec56179d60c57dcfe9cffe91577365fa2e8d547d2d876603fc953f0ff0f1ea96c0000
0200000085ab1465557c78ad4e3a0602934e3ddf6ece9039628263a9968a9fd4c60200005386fe9036b75b636da86cda7f1e37687babd11b54fc5886e5e9a7b40cf323d3613fc953f0ff0f1e7e620000
02000000582299edbe8d8587e9082b25b62dddfc2bc593970a6720740f86aa6d210600009dbda4ef2031e56a6c6791699b8ae72a22c682a1b6cd875fd11eded350cf97ad623fc953f0ff0f1e1d8a0000
02000000fb0aae5863e5c0fb04a1c3855b0ccb35b2e3e871cf0b7cba75ee0b939f0d0000c55acdb755ea5bce4d3242f95cd5bbd6c9213673d5ff1edf548c47cb4675e302653fc953f0ff0f1ece0c0100
020000006d0c569be90a5a4a20e5e32212ea74328681ef51d3ef7689e93974aba7030000920a34627398af1a87253f95162810809e96c70943b82d76a275b0acb7c8b2576a3fc953f0ff0f1e84f20100
02000000638d3ae96fc86234bf34c4141e290284071274d4b225c779796b278fd20b000032960aa07731619bacfc3a8dc06e2eaf05e8ba9b857457707538d10e3a4324466d3fc953f0ff0f1e82450100
020000008d08605cfcd1bcd4c193e967652242c9bb1720a7685aa200471ef91dec0c0000bc954acfd83238d1065c8315eedd8fe70c4a953aa9f96f6f43dfd308a72db45e6f3fc953f0ff0f1edace0000
02000000cfb07b5231f34861dc9de2df33fdbc0a39e56abcc02a24b5aa74c2ad690d0000c1dae3cd2e0f14a4be19a7749b223da5ffb5317fdb0b9cbc263477d58254ab0e6f3fc953f0ff0f1e97130000
02000000efb0f0dddb9d868248aa83ec305a1c1f21d200a6bf4c8c02e42008e3cd000000991a494c391feea024f25fa16a5b3d878f214f2ad4955352f31f1ff7dfb5d9c8723fc953f0ff0f1ebb070100
020000004406cab2d6ef7bfbe4f0677381c54b51297fb874026242ca33442e14c3010000fd0878a17a3c769919f7b9625fef95c7f1440d556fac039aa187f479b557eaab7b3fc953f0ff0f1eeda30300
02000000f4173af11e9cb5a6374ed0bf188a5a1c14199df72e79f3b7455102d3b3060000d3e4ba3a853912890f412ff70401066774d9483cc2305eb888a98b7388b6fa10893fc953f0ff0f1e87e30500
0200000031933470f5bf341d3a7788688ce6f74850375dd2cbf72435ad370b2ec80a00001911a107d5276b1b4d13d7740c7ed730b3d06b07890677c54e2b91182e232449943fc953f0ff0f1e382a0400
0200000024561e70d58b0da4a4f11cfe32ef7cea55bb5395e119ab9f839d2f06360400006ab47c0a97cdbbe1ea92fce295224d03c335704489d05fcffc918ed4e786eb57953fc953f0ff0f1eedcb0000
02000000554fc65a1decd2dfa5cc21db3e81386dce771de4e09ef8fadbde9aed0d06000011313c10f332e831d4a584771229c5329fa234e8b087b455bbc60edad920f680983fc953f0ff0f1e18320100
020000000e74b389e8c53aa5ed38986ef8b80110c654a12291dd133c0e65d237570c000027cf13b726b250bc99d82d4ba1ae50eb694045f7696c7b14e90203adcab2174b9b3fc953f0ff0f1e95380100
0200000042f14a69c90029c93648c2d1e6cd94b3b0c369181b6387e50103b97fa2030000ecc34c4341840ea46d0927d2cd23502b370f625e4390402ec12ce884c258c4299c3fc953f0ff0f1edd760000
020000000552aa410c547e9630b69e93c0e8497745ac888cb48f19bec3815c9baf0c00004f1fa34c185e6273a4dd0d62166a6f449a8c536dad0f938f5df3ee63bcf0d9329e3fc953f0ff0f1e79a00000
02000000ec0f9300594b51370901fb7ced790fce35934cbf3248c1c54faa47b84007000082404232757b8e852845733935660435712aef11215851172637a04183166f18a73fc953f0ff0f1e77ac0300
02000000b2b5860a164376b4f677c3a030ad7bed89216b7492eaaeee018ae436bc0500005c30c486381c38f28d718f9b3953403b22573b4d9186ebfec2e592d3cedd950fac3fc953f0ff0f1e51060200
02000000f65bd308c9555eadc2d78d9abca2388ec1221fafe4960e87aa042d722e090000ef3a66be90272ff5d7e55917c3cd2e5b2c244c664bff18713f484ba264836d2baf3fc953f0ff0f1eef320100
0200000013d50709847a51318e1bd54e29da0f87198fbc7127a8cbb3f5e62f02010400005a0c9fda80a183fb315e9ff5689e326020f3700accbe4adcbe7150d21888c562b13fc953f0ff0f1eaddb0000
0200000098b97b04f24b3bd88532e9a682cb908d787c61c36f7277a337141a6dd60b00000583d381152bf525c1a080ef70a4f82b642e153653b594f126f0df77af00eabccb3fc953f0ff0f1ec78e0a00
02000000ce1eaa174331d90b593cc3489e324c6d3fa86de38bdd7958c156413caa0000002f52aad0e4890e664b5d7ef67207a7e596949c1be1091ce92d24df54e5eb1bf7cc3fc953f0ff0f1e96870000
02000000e117470ba7cf20ff4844f0ebcaeb89dfb4fe4eb82e71cc845771affc5d0e00001a4ce551d3ca01509f6c55ca5ea1b4dcc268237a6f7523b19268c7759f6eaa3bd73fc953f0ff0f1e8e350400
020000008193373a8a8b590f1897d293d59a110192427987069fcd5d778fdf15040e000049fba9ff6a1ff1fb16ccc05d8e0bcc9b84ae7e1182b1ca6e6ad8b5906291eee4d83fc953f0ff0f1ec42d0000
02000000982188d6b614c67b2128631d2d2d4707c5f6c8ff2d2771dcb3c667eb680d000083e08ce9abdbf550cb6eef202fb562e7c4f35024270017b6111a5587605553e3e83fc953f0ff0f1ee6c40600
02000000b6bcdc1deafb49ef3dc7c4eacf6a7c716757287572d197e89825dbb1eb0800002adaf0eee76b84ebd5b11f743d0ecfc74da5647a14857b1831912ca8c4497f4bf13fc953f0ff0f1eb15f0300
0200000075c0ec250041803727947dcbf5c2a8baa794a778d3d654080c413269900400001a4cc4a98c1b3e11e363eca33efdfbc9eec201e2bb2d0a2b2157eda737442b74f33fc953f0ff0f1e90c60000
020000004a2213f4dcaeaabf0252f1fb8b27927faabb08e7e9ffd6b7b471c868a10700006384bbabec622c3a74285c9896b7656e9f9fd6b59f97bb36e01467ff227d4c83f43fc953f0ff0f1e79670000
02000000603bd71268f37e05d6060765225f86b98c3442f376357341417749662201000011f3056267fb08072319a73279caf93587676f186ef23470d62ed5790a9ea50df53fc953f0ff0f1e025a0000
02000000bdf0d47a03246fb14194d838e8a72be401e9863e8fe0a6080d2638fe47020000ba1ec73fb60549aa7e2f484c4bf3d8101bea29781f01110603c5844faeeba627ff3fc953f0ff0f1e780a0400
0200000099ee6b84156a23d7a4033b6991126d4fc5fea7d73a895873cd38049c59070000222a1f0a66f798a32270cfbe31791aa01232c772ce261d673aa81f71c255dba80440c953f0ff0f1e41a10100
020000000410f03b95a2034f8fd14557fa95e59eee19bf50f3bb95cad996dccf080300009376d91c45f7a5c97ec651870385e23a63c7c5aa83d7f6ac7b46100080efe9e40a40c953f0ff0f1ed3af0200
0200000035b72d2b4c2e0b37db4adbe7bd45e6b3ad658bb7a924d40625de89c7ca0f0000ba149d2ddb60dec918586335a2c21b7049db26c184240b189d9ac7a2d2396fab0a40c953f0ff0f1ec1280000
02000000d3392388bbb446e2ef298d9c0f74179ca10daa3e8782c3fa8e60c914e9050000b17653643c19c1176b979107ff2abe0718a30711796bdcf8f4dc38163b1301050d40c953f0ff0f1e0cfd0000
0200000060277924c9d0e8069fd6c20827bba8ff079b773101d8317370ad6571420a0000185b3756f926c9a38af88c418a90d00a65be0f7fc1ebc161518d2ee45df9d94b1640c953f0ff0f1e0fc10300
020000007be8951e4298fa2f4a0b952352bff3ecae52e8bc6e00713396fb5f21fb0c00004bbad8a63dbe666683e3c528d52179996ef9cae8d7d4c8612cb0b07f156a73a71b40c953f0ff0f1e07070200
02000000fa8be7196acf946610b65c4f8d724274f1eda8e1acc86df8d0bfbabc550d0000e2294ef8ab6b925b4492f083aa7e3d7d67a308d3e2262c1a9d95c935af2a32291e40c953f0ff0f1eff460100
020000003d06a7e550fa1b10e57431338cc98ef1ef6bcd9d632a04311461413cb00d00003361d5deef1504671e95b3329f0b75efe4292f8ba7f71c6292f53132147e90142040c953f0ff0f1e21ee0000
02000000e030d50a6b285809efcdf0af80ea9546e7c82f15a079b1edaee6c9ef4006000023de9c8d64184b1dc8af4fa8aaf065e99ebf85b115af60c945836406b23b1c842340c953f0ff0f1e8fd60000
02000000e721067bc68daee7e58dccdac1cafa73097d8979312b180551c94ca24b0e0000b7478a6b0074c273baf8f724c6916cfdf923895a6b8f812d06465ae15f4823272340c953f0ff0f1e29190000
020000004a85d8f6286b4ba20563c2ddba3ee2caa682990ad7d40f6b2c00e5d31a0f00008fc25239b8675896a9d479cc950e979327e88710dac8285df72cab5fcd833c902e40c953f0ff0f1e31ec0400
020000007b12de9a3642a2126270c6b13f41a45fcc8b565c2d83882a54246275cc020000a925e76a9e6794134369e8b131410bf537e81a425a3739eddd3acd65ab0e32143640c953f0ff0f1ed30e0300
02000000ae0bba557a69554fac25dad8cd92a114d8390dc8f3d23323db3757263d070000e2bc85d4ab12811dfce74d00f1e3be2e9eb052f6ea4f52ff0a52f39f431ce3253940c953f0ff0f1eb6040100
02000000597f9d41a1e200a848a1c030a4f3121a10162e21fa050384361a1efc6001000065fc078e8d0cd24cad18d80c62a40d5478258f9972c360fce3059936b7f2af683e40c953f0ff0f1e254c0200
0200000024bf63694a86ee8a4155955c346d779d715024bddff57c6f57ae447de1010000d4c1af8227aeb3faceb141b8aa1656eb6c7a6ef515943157826add59f270d7104040c953f0ff0f1ead9f0000
020000009ec04b9cc0fabafa9af4498515989d2dd3e7a25d168d5f942d25ae9fe3020000d04f3d065e985e440ef9710f1a856036b6af46b7e92ab139e4861c071be617e54340c953f0ff0f1e9e320100
02000000cde8841a8e637a17b92b424911f61489f57a84d31b82a9c089ef69d196010000d252631d475b72553552528aa6c8c38b3ef156774660916c8e153feb9fe81dad4940c953f0ff0f1e90e80200
020000006697cf58c68539effe81246380cb038b6d16009ef1d43e0f7f23602ba903000046abe4da862fc3c72e50922db98a83a54f464ac638aa877983da35c9e4d53dbe4c40c953f0ff0f1ea4210100
02000000dd96834af0459eb96ff3ce88044eea7c855f2ec45ca1191a22519c7c150700001ba4984115e1c5c88ed04d83c9bb699fa09384d260ce3ef9ba0571b90ffbb9124e40c953f0ff0f1e94a20000
020000002d59914f00eb3ef0f8d3a8f75086ad64ca2b1863a75f50a893ec9d14020f0000ceba1de7595f472cfa24882f0733467987826b4eb6423710f98f56c900df9f0d5140c953f0ff0f1ecf250100
02000000f35a940989989ac5556c824c44b906cca3de469cff556e5c1764194b4e000000eb8ca1d88e259c9803f6ab780e3b51c123deb06593b6bc193f5f7d63535037e15240c953f0ff0f1ec6920000
02000000e7158e163d1f417b8a1685d701c9fa25f2bb468ab7e790e54dd87e645600000038cdb1398fd48bc1b3f4f3116f54e937599d9591b063e93f8f15b95b3c6023516040c953f0ff0f1ef9280500
02000000e5d82061a4301b1809942c5e7becddd66bead94e995f0d0be72147fd950a0000f93ea0cfdca53ce15a2376a00acd1035b6f2eaf77aaf5a2ccb87eb4c4536ebd96040c953f0ff0f1e79430000
0200000066a4245fecc94059104966c672e2a22ad59933bfd4ea1d05a6173358b400000023b98e250d2c9985ac5bcf60d014c9472fab3b291aa7b3b2b47c02a1693084096a40c953f0ff0f1e81e70300
02000000502ab89f76b889b0e84804d6141cb136999c16f4a679b3609aa0af27240d0000409fa1c3fd81ac9209f4367a1f8b116b6a24538573f5dd8a332a2032b2baa9f46b40c953f0ff0f1e13b10000
020000000d30d3bccaccaed4015bd9db06fda28661ef4bda7739024504da39dc5f0800001a20376a5b3b6c18e51c5e12a53f1a8bf117470272fcdeffbaa9d1180b6a7e3e7240c953f0ff0f1ed9000300
020000001c9948cb1e5f975aa032e421e2cf8f50b657c927ef334c8e24ae6b7ac50b00000f2da5209af80bdba4dd7450d4744087ec553d41ee47a6744cb5d5eb1eb488a77b40c953f0ff0f1e09350300
02000000037892cff5581a8611b901abe5f0c52af7b6f8baf839c99d1d21f7b568000000a1c24d70860e805bb83d1d597618eae4aa777d2e5b78762de7b2ea86d85c3c168240c953f0ff0f1ea39b0200
02000000b0007a43de8b3dcf1470b8c6417f6625c46bbcf618fdf6048b20aacdf60c0000c3cf31e400026e0944ec8c4996ff601ad01d4e988880e6fbecf79a34a7975c9b8a40c953f0ff0f1e62c70300
020000001f1b6592d9c7847e71a74f4fbfd84a38997660039c508ab5db849df7a90e0000e5a48dcf80f6d0cf7f6b5ccb9145060e54c8109047886cf5ffebdcd12fcf96ef8d40c953f0ff0f1ecf880100
020000002e5e570576471734ee55224e60b5bbbc6299cc694b0518f7cd0bdbd6cf0c0000624bb2ebb12a877cf7d76b5f2b779653f0c8cb9e8af184e6226316595b890fab9e40c953f0ff0f1eac6e0600
0200000068bbf6c15d4ace3af574fbc66b5ad6d3e117e18dd2f448845fcac092a30b00006af2756d3c280184bd7caa36eae125b345a1b561cbf85b06b5d9902d1777a9789f40c953f0ff0f1ea9760000
0200000054bd69e114b545eec8e3cf190bbe83f2dad52f12285a285c67a8e40a770a000093c94de7c17bc1568bc089b0abd4e4796ef5ca0eaeab91a0ceb65c527a06ab33a340c953f0ff0f1ea1a50100
02000000f9c3d0550f83dea57825a6bebd1645294fb0e6820a84bd45a4493a67ca00000003ab136c453b05e131891de23f5adabd4bab4c2433ddc65ca22a4564fc8a4abda840c953f0ff0f1e6efc0100
02000000cc371f40be0a40d66ef7109f9992f2c11e4f6a50fb213f2582ac8095d10800000f0b076feeefce04c9cdaaa4ed7c10591e8b0dc5b070cd5b3596cc6b81b554fdaa40c953f0ff0f1e9c060100
0200000025d042f28b8d29b3f49ecd20cb0ef8e6aec083ce03bae0aaba710b60d30d0000455dd74ae5c751fb8c6018fe32c5caa822ee3f3b8a64e581fa2ba11014c456a0ae40c953f0ff0f1ecf440100
0200000097e23e7c522797e4327ca454737637b2e1b200b3d7c79ee2674ab3d99003000076f7f532aba75b28d547b8ee4f826ada3d189fbc461c92176b60948b7e11196bb640c953f0ff0f1e4b850300
020000009c014f9622467dc4fca5298287de8a765df0c02b1ad18451f39ede4d99080000a69b3cddfaa0133195e04085ae5b990628104b9d43331c35986727e08581dadcbd40c953f0ff0f1e86250300
02000000b9f9b5ae61e9cb5d8d0f714bf0d2080db1c290c4cf92d3ef26ed7a0f1600000030055cb84ab86cee551a3651e0fa3e4212577c85d70b1b12de5273ecff44b7e2c440c953f0ff0f1ebaae0200
02000000cf9753fe43897e45654ca81b0a327a43461362d51638ed9e97a8086d6f0f000013edab6478d3e70789204ebd975de94cd36fed52061472fe84da24c77fb5ae0dc940c953f0ff0f1e1af10100
02000000f6d049fc8f23758960f22e872503d8506c05dbbac68172defc242873a8030000a8e32ff69b6ead79249713056aeae7c34279092e3c1c3331e52c7ac712f70426ce40c953f0ff0f1e37240100
02000000ca30a3f4853c302771a5e1d4b6b70ed4f3f58971207666aa0e596d83450700002150b6aa2254cd0b8d8b6204d20df2e8a12bc69a79005e0927415a30b1f2da5dcf40c953f0ff0f1ed43c0000
020000005e9687db58f40ef413810be1e788ba7e6865e8e334bd56cbec4de7f8a40800001a1dc48e39b2ee2581af01137abe19ffae28637e42ba716affc846af3c4731a7d840c953f0ff0f1edec30300
02000000d54350c7335c66406a379e01e0f02d9c3f01aba1cb7e502790da3448b3050000fad7692e9ce789f46b4d7a01e476e9d8e4920719cbc47dbe31407b6c2fa3e439de40c953f0ff0f1eb7950200
020000008a8d7d22119ad85360cbd7727f1b353e6de049a1d1b7c13461d165f25b0b0000628f2ebc07bb29cef9e5e5aba854b23456f1a5829b8d5aa6ec6f25847ce28f78e240c953f0ff0f1e94ab0100
020000005d790f0af3699c3e122e9e3d6783993f7a53abce2e4a0797469a5894150800000313aa101d915db30df39cc3d1cb1b863871e8c8d8ff5a3708896e4e5d6dbd62e440c953f0ff0f1ee8d80000
0200000063bde60d5c16060202c167cbcda100c448ccaee4076569ca54b4c3239b0e0000bfecc9c6cf3239e6782185158460728f450fe811716444badfe9b2feb8c198f3e640c953f0ff0f1e59aa0000
020000007e96f7dc141984a06bec9bd5c17c24cc73bd2d817f5567533c592916d80a00000b5559e79d9df8ee8464fb3211994e6ac79e59e8bbd57d6ede944f98ad45aadfea40c953f0ff0f1e1be00100
020000007dcab2ba2ae03b343247745969200d4c0a18780a3a2f4ec94a46b098700c0000f2a05902b15bef95eccfcc0ece5bad5aa77f3f1b1fa976a0265b3e47906fb098ee40c953f0ff0f1e81b60000
020000009f165e0851b0cb18228409654d511e7022c0c3273c8e1640fcb18e7b6f0b00006cd2a6c76d868a8d0bf07e3968ee47eeea18d575657394e2345a397708d3028bf540c953f0ff0f1e20980200
0200000020ac6b5f150904805fce03c26f05c3c1f2f7fc80476275bf5399295c9c090000f4a069fc64a61db03f168f94b5ba6dd1381141ab91a9d12f6fc1882a348477d0ff40c953f0ff0f1e1a3b0400
02000000a9aa77b7b3a63194c6e64227301e93b37491ae52f81737a86d0240ef9f0d000036e3710c890fabe83b09587b6da79af1209d45c60cc653e950f8fcfc1001a8720041c953f0ff0f1e34510000
02000000fdae9e5737565c4ce801b50027c8befbe6a1c535b34f61e0b18d8c86c10e000001036d3f90d9e5498383c07f47bd9e5a835fc26f8a2212357aca5f9ec5d242f30541c953f0ff0f1ec8190100
0200000054949ec154321cbc706f410abe674195a3d3cf3a59d0692cdaa60ec8ab060000ebaf8cefe53abe012baad402b0844bf15ea50121426876447b439291820161b50841c953f0ff0f1e90e40000
02000000e64636e03910886ec864b7c09f8cbf56df29f46ded57f92a5bf219d30c0200002604267131ee8f1db54c233fea24623c59dca6080fd7c616c4ec18a8effe28d11e41c953f0ff0f1e09460900
02000000ecf568bf6e78967728791e06dd5280658116e71709dc80fc5db1e975260a0000a5e5a819dd79b030d3edfa23e0f7f8d88800c252184320cf69aa9cf3a60087172141c953f0ff0f1eb4690100
02000000049f095989aa9c05eac98143fafd404f8f65d66ba8312fbd342c6899a8000000a28c85f0ccd8834423c6d491d450ea7cbf41f6e6192c60b2f94c9b285f576b722441c953f0ff0f1e244d0100
02000000324ad201ba687c00fc83cf97107f7f5e689aaf5a2d5ec9986c7ea49990060000912b7190e25c21f45905fed51396e1b93bffc76806ee6838b2b1d957fa7a51de3441c953f0ff0f1eb6560600
02000000717255ac2f2938cc88767877b2325fe131bc23bffc6f984e051f910b6e0b0000ad67c6723a5c31e11609cb82c4de1159587dcd76e71e16eb3567c9a1033e0ab83441c953f0ff0f1e2c450000
0200000097a3b06961fe71efaf209a9f24b3217f5dd545a2478c6f7a832d669e0f0800004db4a1882d43af8d94134b6f0d279cfeae6a5ef3a2bc54e7b8a90dd85343b1b33a41c953f0ff0f1ea1610200
02000000f5c6957469bf483d67c657a9fa29345876cd64029d8f0e7a637ee312b8090000eb1b05a06f2c275ec469895b05960d6438b32d634cab50223f204d77cd0adcb93c41c953f0ff0f1e02700000
02000000f334c1b81fffbdbf02e8557560429182fe97628f9feaff17d460200878090000adae2b969391d40e8d50a07fc7f846e7a9b39225fe55daf31b85d986f705a39f3f41c953f0ff0f1e69cd0000
020000005a44f2dacf8b78101a6dd9bba9182924fda1b7aab95cc89a083c9ec14f06000070294df6ac9905c50f24733d78a145ceaa0b385856ea6712a0121fd35a7f75e04341c953f0ff0f1e138c0100
020000000a036225b59407c82b2d570690530cc9b9b9ab0fc9b541d5696b557a94090000b5a728e7ae48e686303f87add0cd1b8e967c7573d04113fb5a436916ebee52b35741c953f0ff0f1ef5f10700
0200000090dde4eed5cd7c3db845432a676482e6f2676cd386ef90ddc3ab2ce8bc0e0000d0b46dca126d89493e86ab80e9b8268caa71e02c188abaa6cc47c78bea89aad95941c953f0ff0f1e3bc70000
020000002a0651361c9c6f771d8632217b38462873d00ffa70114fa0a4b83bc64b03000015965aa682db623e6f344f11787ecf42a9b71eebc11e19d0b453b9cc4d25098c5e41c953f0ff0f1e706d0200
020000000f9170921dc1ce614f4d7e446caaea90b12db8e9234dc0fe92de333ead0a0000aac78f9c04acf8df0f27c2423d203fe66a763d0245d046a32d6d3b3e7c4c81756a41c953f0ff0f1e19d80400
0200000023190911213a055be22ebc3b38e390582c4fd5cdd91a6e0680e7ec57b10100000e740d637faef0b856b484d070e03a202669ae9d9e0c4b5447e812edc990521c6c41c953f0ff0f1e69860000
02000000b6f079cfeb94eab117dee4d591a2c52b402ec9d3e04b3ca483ef46b3710c0000050715671d4befee783d65265ab820528a6a9c7a0b49b8912853195b9dca19496c41c953f0ff0f1ee5210000
02000000d3385b93e27bee94e668cadc9b8a71036b3aaf1a86258027245c1e17c70f0000cb480e817a0bed2eb5ddf12381d8eccae9bf3922eaad7ec020bc398f82f7ef6f7241c953f0ff0f1e13650200
02000000187d86bf84d519b6b761d00912d3a18e26e8b7fb6a13c85d3fac2e62ec0500004e58ffdba6396865332a6c160c1fcd6f9107b715125b5ab9fb7a4446cc0260bf7941c953f0ff0f1e3ed60200
020000004b961bcf8d485d8cb04b74d40e6730ca19bb40f4d747f3f93ba2d906370a000058a07dee9d0b57e22b721b18a2e72f2b5d47b10435b7b79a133f3eb595460ea17c41c953f0ff0f1e487d0100
020000008c1c7ab117b5d183ec8a31a51339934a865033ebee3d47134e878d32f80400004ff1f6b2623f08cf724d6a83b878a6f6bf50c6602a6a903b5d45edc0f305705b8841c953f0ff0f1e63de0400
02000000507387dacf2096ed817e5ccfa80ebf8b42bde95a13f7fcf86fa3ad4f070d00007c2bd53cd1b519e1a1a11151da3dd73619f73e4bc3c6f9190e8715da0782c9839041c953f0ff0f1e4a5e0300
02000000338de2c085efe759eaac997d4517058666f7059efbaa1e1c33fbe8455e0000004781c3169f1221dd66d26c9d15ab7346ff522795b7a15f8efd2dbfc2d7e3697b9041c953f0ff0f1e1e190000
02000000b24e6faebbdbf148e2485d5044ba396bcf4bfe068aa4fe6d09199d0db60a0000947c32ced84c1be25daf5ad1766113e6c8fbc77c842a65c6ad01775caccd04369541c953f0ff0f1eccf30100
02000000c780b5209198c05736f707090e89b0ca23ccde18190168aee52245d0d30d00005e0c6c6ec02fc23ccd8e38e6e556645c4621c8d0b05f98f847f0c1edcc92a1c39c41c953f0ff0f1e6ec30200
0200000062eb99808f2f50966c7bf65cbdd6662578fc81781cd230be1156884dc0050000957b11e89e1af053e99865aad2ad813e1f2d63570593cc35a504deff4cd85d06a141c953f0ff0f1e160f0200
0200000092bb8c184684c78839cad41d416a07438395195c04f307dcb68e8517550700002eae4da2f345273775667f528d2bde1ac9cb19429344953512067adc858c0ad4a141c953f0ff0f1e98350000
02000000cc0632e30c65a556e378a3c20d8d9cde8639ff2a6fca3ba815762e3d440b0000d440e01fe86c1c931e0fcc3a2435a633c94677779737cfef1fc3d371f2573f30bd41c953f0ff0f1ea5610e00
0200000083270e52258f243e75e143f0a00ea03af07a03f19473bffed58ab37d9d0d0000d985cbc073b4913d4c27d4d101614a43d02fc951060294f00c7d6ca6e479ef80ca41c953f0ff0f1e8f0d0b00
02000000f1c4ae9959bda91a8209239a5b983d8fdb96f4b6a9003193f9d01aafb40e00002070cbbe145b4c5c5e9de6cbff9c76438fb5de4df1669e1eb2c13ae20a305930d441c953f0ff0f1e4a390200
020000004db2f5f557ab57505e107effcc85d70582ffa3c537a43c4d11cb73ce5c0b00005c13b476bb0f16c70c2a619369d442cf9800b7495c124dfade84ed1569501844e341c953f0ff0f1edfdb0c00
020000001d55f14d72af15ea905cb970d5a1bc326cfc2155481f8f069b6505603e0a00004a8be540bbd42d5724cfdb818ebe71dbde5aa27024a9d6bfe2351a9d37f9e7a0e541c953f0ff0f1e2d8f0100
02000000cbd1500ce3a15550edf6b182daf1c933ee689b9c1f3dfd86b71b4ea3ae03000097aa048d0fb1d4df589492b9316e8d8526fe0c3dd8e4fad0a1f76f0114ddb126ec41c953f0ff0f1eb0040600
0200000078e3943bb812d9e42c5686f5a1046a35318138f48c7ff10fd39d702f85020000a750a710f0e9cf8f48355a62b5bb73013ea05159e3caae6965099f1ebc99dac2f641c953f0ff0f1e77350800
020000006378fa5c3ece857de2d6a81b87bd50aeba943229eeebf21e09ab1700fe0a00007e7bcb2199a9526c14b6e90c21cf16df6abd49603dc07abce0288a3c4750dff3ff41c953f0ff0f1e842a0800
0200000026a741a6190e2ac7cdda30f1096ab67d6b8534417d89cade30e681ee2c050000606c239276b8c04a62fa44ce859f5c9460433a44dd50b7b5ed7bd4cbfda2be710142c953f0ff0f1e15900100
0200000055960dc4a6cc6b8a319260dc812bc75eae0e768170baf9fd3df83a5aed090000716d1c5a135bdf6babd74a30e671224e3c9cfdc77b08188c503430f1e21bf6221442c953f0ff0f1e96ea0f00
02000000b8aafa5a96d52640b20f670d0186eef5aee4e784e788eee6bd849451130b0000dc24246856b7db796b51321cb33bf3571f652c12f40da064acf711f8481caeb01642c953f0ff0f1e39a80000
0200000024a189aa83711efd505d235ca9164616c28e3336685d7bfe438b6fdfc60c0000a12dd0a83ec6b36d2e78d755f5974a3a0efc24c2c274cb4ac52283ed1a64cea35242c953f0ff0f1e869f3100
020000002c87bb6d968338db892a547a5eae090e04bd26641ba3240f8ed857758c04000013377a4e5ce4d911a0c39f892beeea5ef7c377f000676b51e51b7a92d8e7ddfb5542c953f0ff0f1e4fbf0200
020000007b2d290e8d1dc729acb286fd50367eb241ef7004794561b996beccacbd0d000020b04d047781637139eec4383abf1e7cba28f248a4c404470380de47850f83a66142c953f0ff0f1eb5170a00
02000000bacb1529df48c42f6cc7053f2353caf0f23daea9c6f66afbf7404af6e20600002656c0f003794d204c55bcd90a57969dff704a7f00b7f2b9ef80564ee0619ed46242c953f0ff0f1e6d650100
020000001f51c844821f287daa471d00e6195b8d308a1c0036132fbe2367ead4d50800001d4c3c1bf3b5f4f7bf4200e18b4bf98aa7fee3fc3aeb79975279621cf55cada46c42c953f0ff0f1e72160800
0200000027c6449f2de5f4d73c54f7a6aacc98c563134ed9c18578c08718074ca3000000076c369f79cc5dc28fb2266044e21a0c90d45ea4c028bbd0449f47d86a5c3fba6d42c953f0ff0f1eb04b0000
02000000789fe8c7e6fa41304bdeb124d0302e2a2e87766a80282ea6d7b74c4e010100005f49e66cdecb84ec7e84e971c564bd56a604734c286bcc270d19a6aa4ba49916af42c953f0ff0f1e1b133800
02000000ced3bb23d0743a6375d7bd60a28789965d24e806f720e927cedfe42b19070000670c9d454cc2bdf4aa8ccd0cb4684cbc8e0a97e20cfa3194ba18db627433b82fb642c953f0ff0f1ebeb60500
02000000a02c230e8db40512e9a3de4afdb4b95fd62305dfab4e800a654a14e58507000035cf014636b089ad96f6445dccf27645694f09b86ce13317395ab0182a0abe3fe042c953f0ff0f1e75502400
02000000a96647a6114dcc6e68e729f3cc7317fd7063351aead7c7d1501c31fba30a00008dea5362583e7c294ef617a756340287a20a6fc307c76caf06fc2e5a4c064cd0e342c953f0ff0f1eff740200
02000000b32edb9fca803acba7e0770df78e6b38d1fb70b2eaf1cc9ec05ffade40040000ea946d60c1d474b12b956bc6a347cb58b08683ed20f50b9d242ab97573a7d506ff42c953f0ff0f1e69721800
020000004872c7d5cb674129b1c949a61d06a067b0b7a27c18825509dd274d1d750c0000cbed7deafec44931d672a45aeaba1a23fdb0b84335249138f43b07724710e1371543c953f0ff0f1e12e70300
0200000087ba5a4f787f43cb7a68342328a632c355e37e11520c12b133f5d1d4b700000019b32a4c6b393c11199eaf2b429235e2161b72b7cf61b31f67070e49ac3fefd72a43c953f0ff0f1e30441100
0200000030ddfe91ee6ec87b2ac880f59a8f8a6bf623d4b6a0f758cc1fcd58c6a8060000e38371fb1ad82353b94d36d0812e44c38f1a438ba8fef84f972d3a9cd9ac0afb2f43c953f0ff0f1e97480400
02000000ab97ad110b0a71b013ae25ec2a82a7a5abe7530de5cf51ed71cf717b0202000089ce134b1fcf3d88bbe589bd9e5d30e034ae3fe4823e6339c3a211d1e6cb9fb53143c953f0ff0f1ec8650100
02000000acc3823cfc5a1681e180740f3c9eadab3984f8c1b2b33f9872146f729a020000599cb0ea95acbd2ad841ff880ced8069b3375183127da18080555afd681e9c203e43c953f0ff0f1e98720b00
020000003696e3df5021dc7318215acccb516c51eafb0aa65fa5b4f8fecd1f686a050000ed89dea0c37eefc1139e2495aed5b1840795665c3a728328ffd04094eb98dbf94e43c953f0ff0f1edf090d00
020000000b8c7323f69d08dd99db4ecc8e26aaa4651a43712381ae2cf879e7de5d0600000a134eb55d852f77f7d53f921f1b5c6d29a023a4c2b10f3e923368fb4519af6a5443c953f0ff0f1ef14b0500
02000000d243f571c1dc695cf66d33ddcd8a4521f5cb1c441df8c26ebdaf1a09ec0f0000c33b95cc39e7d0c5ff844029197bdb05c731808738a7b35f6fa6e01c641622a25543c953f0ff0f1ed9840000
0200000085367de61c44c654a2601326541c7323b00a5636c7ef652cb6fdc15a760c000018d28342cfec27034cc12f7624c51f16eb67f66ff1e0fbd8fbf1a461205eed3c5b43c953f0ff0f1ea8e60400
02000000f9e189ea4b76c12e67bc3a9367ac299f18a266fbf1a338e2e7a94148fd0300005c7d533c8707c1c6901bb82a373d61c1eaa4afcf9275f284c960364ec90d7439be43c953f0ff0f1e76cd5500
02000000b26ee2eed0acf158f27770002c533438f23651ef26424a30a0e51bcbdb0e00004356707f0ec3b7389bcffa1a42169e5a45d68ff72135991e3e06d925113e4bc9ca43c953f0ff0f1e1d2b0a00
02000000493cef25afaccb5e8ef1d4a16fe8569fe6929175dc4b0dad8e28c0984b0b0000f946093d828b13a6e25f758bee7516d488f1cc57c8bf1b1c35bdfc40972687f4cf43c953f0ff0f1e11f60300
02000000997274ab625d25a4093fe16cd2ca2b738ad949874f44dba40f8c21bed70d000063bcd7c42d6a3414b4e6bbb9e18380dbc146c89f77f33651c159f09fab5b20a2ea43c953f0ff0f1e2dd91700
02000000a1875a78585a458d0b8fbc4c8200faa686ecb9e7807529149c80aa82010f0000cb99e4b2311ed6704e00e221021cc0d10e3dccfab92113e55c8ca2d25ef9bbffeb43c953f0ff0f1e99090000
020000000113b87c5fb78d438f7e8d6f8fca2b52a5656217bc9d752018741206e00600005d9017daa5ba3506469852e0b81d3a0fcaa59cf4044310aba0b2339a2d1ce02ef443c953f0ff0f1e8c250800
0200000063c83037b110158f34003ecf8e731bb688c7266bb2100b14b98517fc1903000020fbd1bf39fd5965aaab79c7b7e99412a9dfccfc6b97f59243b197f8edac8e11f643c953f0ff0f1e8a520100
020000006916120ddda79a25f83acfcee046f36edeb6adc19871fcc996cf2ce3440b0000bbf621f579d9ff111b01c779f850361b43542023ec25ff854f5f2c94988d3855a645c953ffff0f1e86590500
02000000ced1d6661f927c333568412dae96057d731c404b30938d23715cb02ba10f00005e32a653d884a8f70032b26c04af8ad96f23226f892a8b25da6107389c8c681db545c953f0ff0f1e0fa70300
02000000042390bf39d9ed3ed9692d6891eaf149c18df8733b95faa1e4bc3b32230800001e7e7c29555645328b73bcfd4d129862f2aa9c7385246cc959a66744c391e6220e46c953f0ff0f1e9d8e1500
02000000e81e58349aeadd82dafbd475aaf493a0642948c5e3168bfd81b3c2070f0b000071a27802cdeff39c07e0e8f8db7b02d3d7d2f43b6f811cb2faee5fba6c71cbaa5746c953f0ff0f1e75fb1100
02000000cc8a1941977b641478fd2cb5ac25b9c7e5722d335da36956bcee1236ae090000c8a34f97e1622315a44bac5266948c80cc17779b88164c69bfe5f69773da10a16946c953f0ff0f1e4f660400
02000000b41866b5a047bffd49b349a9eb8a8f390ab9e89a5da41ecd9dc604a68f0f0000f5843bff4c7dd182491f63f8c3e634320acff64455dd16f6e2d2d777dfe9cf3cdd46c953f0ff0f1eea4d1c00
02000000c16f3dca3ec5468424c51085ce32ab27bef1c2ae7aafd1d458593563a1030000a33016c9dde23ba05431941cd91e6355d2965fa254dcdbcbd9fd01093f3c33924647c953f0ff0f1edc881900
020000008da3101ef0cd3dcafdb5326d62b03c331e5751a8437ba320e5578efbe1010000ec19d7c63e261272926e3ce6275b7bdf7f25ca4f87751fd43bedd9508e0d6290a347c953f0ff0f1ec6a91600
020000006cdb7179577897f8853827d9bfbe12c677b092b6702ac3deef0b5afe94040000f317a31980a19cd2d439fd1ebde3bd0f1ed87401d6eda769017b56dcf6adc65f8348c953f0ff0f1e2a773600
020000006b8123b223585ddf45eaefc26700af8930fca2be521d04dbdfd746e6db0700002c9ecc63f95a736580a78423d55db591ac1b9ef2aecec52f3d6029a8235a115ea148c953f0ff0f1e665a0700
020000005817462f35d45a16fd5ed190b3e49994c08d487f8b7e3161a5ed393a580c00003bcfcb979963ff4333c9beb496b763e5cfd319b8632b4a66d39b09f958200768f548c953f0ff0f1e12671400
020000006bc49e3c1cb0595bf23a29b2e1a67ba43311ff88ac594d5e1e270653950100001f2cb7c9656b73c5c69f2aca447ec8fc0c71eb108b57ff34c8225e02c96c8c147749c953f0ff0f1e9b961f00
02000000d5ec41516f63763c8d5ec368a39e989e3d0e99993e79e95a8c056e3d79030000c894eb611034b7caaae01340896baace5211880fd969f7d9b22b185f4ae1111f9f49c953f0ff0f1e25bf0900
02000000731e4b42062b8b611b1365b54daf456c8c662bdf867a994f86046776d00a000000f72defe9ea8e76704d68b7cec4b8a015d820a1cb75792a9a8aeb12d6ab5b09c449c953f0ff0f1e49fd0800
02000000ad56a81cab14fb3d471097817d9df2778beb682feb25389c461237d5cd0f0000b1144c8ff279d06f305c870afaa6e9e80ba8d2495d8102a4ad46d82e77662f7b0f4ac953f0ff0f1e68331200
0200000093974b45473621737fc4625f56df3f247079ee813529d2981d9348e09d0d0000bced42b3c5189d633dc6fbca7dbea7ed2d6e6a1f066864bd4ad9e522da67ea17114ac953f0ff0f1e1ba30000
02000000fa375e5d9259716bb09b1383770fdd4297247ce3ca7d48e9915f161dd30000007c78a4178964e73fabfc114652491833ec64b0b001f37278352be837a1a5460a8f4ac953f0ff0f1eca821e00
02000000388a4e8cc530da952b919540e7f88125aa4194c58cfb5beeec39e4ddd50f0000d3ef18103d4d60b3bc9a96ccaf69b73ecea9a084dae1d012cd5e05c671701731a64ac953f0ff0f1e71b40500
02000000dc27fc3ccb45b173b3594ee78ba3b0fe3b7eaa834e75b9c8d38bb2cf60050000848f4fa29b3701cbe0c7937acd1eba209c5f5267eb2ccfd1b0552ec76637b6efb14ac953f0ff0f1e11980200
020000003acd9dfd1019ee4446e1a5e67a4420cc33c224d4723894599b6e17cf3705000042630299d04aaab7da9cbc2899ca4dc65c9ce769bb90ee5f63ab12dedf40340af44ac953f0ff0f1e00971000
020000004fcc761acb9b38f1faeb7435ede025c1b7becb472e08ba6e9465a358f70c000032be1d0e0f82f09f587dc23c3b8b00932d9a651488757a8e6d6793a003bc6806134bc953f0ff0f1e8fad0700
02000000f22d4c84f39aa6a6b858d764886931c5513834db1984776b4c8d9012ec010000f91c7eb48f8d49bd18ada4d7ea89770045f27d7639315b5455c28a62bc8698606c4bc953f0ff0f1e63931500
02000000d33fd09557c295b66954244c198e19bc1338564e5d3349df60ad4651dd0500009509bad4b70985bc1331cf63f8e3fc9664c3f3ccffe24f8c06ef530479925d92ff61c953ffff0f1ec7460500
02000000d5196ab946f6cc9bce5cd547bf46708b8970deb63b0748435e7a8342c70d000051d657213fdefcb6d5a6ea5012c1f3f071c403714d2ce7082ecc619a09f2a37e3a62c953f0ff0f1e71260000
02000000a61e4910e7c8816751fef31be88a4900cfe82f497aed941844dd570aa20c00001f57723fdabdd0932a4bab26777e9b436daed8562cdbf1f89c6e9089d9e4d8643f62c953f0ff0f1e8ff50100
02000000a26f89bd9363e68759398e035af1735cd5e8424dec9fdd7b6e2492799a0f0000782811f81aba1b64abe43ada15bd1260352bafbcd4cc93d00674edc260d361634262c953f0ff0f1efb260100
02000000390f1bf1d7058eae52e74514222f4e03a508bbda1377a64c3bfde1c4b8070000d36b8978321191883d92283a0125465f3cc90f595c31985955f4ece8c38f60b64662c953f0ff0f1e8d850100
020000007231d0eb018c5681a0ced92409431686924cd98768e7808fb9463cf64408000002432a1fb451dfb5b71a97b471760a97df985421749e3864440530de657098e45562c953f0ff0f1eaa090600
020000006e75f2263cb2b11aed68d364dcd7a292f6b97f51caadda2b5610e0be1d070000ed3a6f41c4bae8d1973704b90a22d213963f11e0cda0f669b0c9c4e045a8bdf45662c953f0ff0f1ef0350000
02000000c043725ffa3db86877fe7ce3f2aa1419636465c8f8800769b12152551e0f000016e032bb190e0eed06e7db77d540d5a305d5fb5bcf5000b26df01583ea3166cb5662c953f0ff0f1eae460000
020000008be3b1ba4848ae6d9b19844d69378e3613e4fc3b53062d70add58079420d000089e8780b1815b441ad82ffbc97cfc8ff37d3704f5fc3062bcce574004cd2ede66062c953f0ff0f1ee4d10300
0200000061c130c3f440fe78550a0baacd31d7985d1c2d5b6f2bf7ed58d6ad13c80c0000e6ac10a1d42c4def518a4daa00653fbd329ab63ab49757459b00d2ad3449b57f6262c953f0ff0f1e9dac0000
0200000064766c3aae9fc6ff02358fae8f888f2d16b7ed86679b8d16e553c5fcd7040000d1ae0b1663a51f18a7ae6578ec6bcfea25d009a76d70c366253dcfea4aa903ae6362c953f0ff0f1e6f440000
02000000411c6b6479d8469f6ca4df4e45cb0ea5cf3f0180ec1d71682a90713e1a070000c1527e5a3830e97f71f9a9977966e68c9f325888973e1513ce53bc44865696eb5762c953f0ff0f1e943e0000
020000005b1c62a8daf5cc7751e305978b665c23657c8f481cbc8986b0547850cd010000ab8e0b2776d159b8d2872801aaf88329b8f6c9d21408b6e82eb040c3904788536662c953f0ff0f1e30490000
02000000e9b189fe0762cfe04fdce04aeb7477007e3688850dd1f97dba1cacdec201000023c41ebded104baff1c9b83012480b2e749532e31bd09acb0e99e371ecd9e48f7562c953f0ff0f1ee0660600
0200000003538d1060bf83211af57f7c1e12d639d2f8d3d553bd1d61c25ea3a98a0c000093d33bf34b8189cf2f06aca337deacf8cb0ac9a908aa891e556c939123c9b6f06962c953f0ff0f1e7d5e0000
0200000071d748bdae8912c5fdf1d84ebce50b8ba3f19fded9f2bce5e13da6300f0f0000caf505a83cebdc30b478947d29d1bc100cb409fe9cff4d88e356e0157ca49bc16b62c953f0ff0f1e43310100
02000000ced02c1049c0d5cbe7cf73eb5d0582734d9ac691a1a29e80f5926c59610d00002605b6d303e169c36543a525c5721d713cfe4df850235c5d05f466e58f1a65117062c953f0ff0f1e30e80100
020000000b00565939d13e4dfd4a1623241a54b1ed0c1a737d1f85c2727992149d0b00004c6da3f78886f2dfdcfc248597b839249ca80d75e35e5c84539b879d6fb62c178062c953f0ff0f1e607b0600
02000000025389c3ec9061b07205efdcfab8247f823193528a57062dc1e6063c470700004b59fef9677190ffcb4fd04e93ac4fddea292fa1941abbf9249ed5af5eb597c58162c953f0ff0f1e4b5f0000
0200000096e3fd3471d6fcb46b0e3b6bd8191a487c8322a262daa83fbb10d57c7a030000afd658884f45b6820e3c7c0cd7212e744e1cad67cce83d71bf732faea9485b808362c953f0ff0f1eacae0000
0200000096927caaa931a4d64797b3a9e594bec491c2a416dabb5dab9402ac3d63060000eb911f13e36b407a8e7943d3dc62b2f02d567bb52f317f14a37420a7106e3da78662c953f0ff0f1e480b0100
0200000004d7ab4baf38ce49a1c665cd2211668004d1dcc4948c5543a47755e7b9010000e0805bc84ac5d1cf95d0044ce264e98eeda1aab510738bf159cecc6b476ac65a8862c953f0ff0f1e25e60000
02000000f41a134d0962b924e2e4bef5f476e6083ffc040c4975c1e4df49c3221108000070fff952728d60856ce6df7ff5179abb3199c5662c10f04fad72045bf6d100208f62c953f0ff0f1e3f9b0200
0200000056538dd7dce6df56d3711f5709df457f08adf470a2d52c13e6ca67eaef0700007b3347652642bb3c62e28662ad4da9816dd1f2dae4604e3d1e202789cdb9eff29662c953f0ff0f1ef61d0300
02000000b7c804aaa3ee6df81fa62738bef4011d7241eb2a17dabd3244500773b10f00001a10eaf03136f66c2fdce883c2af5252bea900e42db625a008820d8b1848077e9962c953f0ff0f1edd740000
020000004718dde6b85e0e918b6cd8e6a0acf4f3d916d3188f1b74b0544a5a90dd0e0000001099fe7dafa09fa1113cc0b141f32a96ddb36e6fdb9c7dd01099e3579ac7b1a062c953f0ff0f1ea2740200
0200000065d2ee28b6e0fdec64bd7eca4cbf3e253fa0c1af73f98be24e3ac463e5050000369d77e2f8b01445ed8ad896e130528900fb4d00375c7bc9cff84d52db78fbfca762c953f0ff0f1ee38a0100
02000000e6948d23cb278f87bf5bad14b8e404ded16d3475c9c8b91fafd41ce7e80100002379501ca2e451fddcc8aedeeae8751782c14371dcbae8df504c6b9d42c10beea862c953f0ff0f1e9b860000
0200000073e22a115252f84ef2202f955f0fc6fc425419cd50a3da9d5dddb2ac2c0a0000f277fa849f3a01bb35c6459638c331907133da5c5cadab30088456568672f16bb262c953f0ff0f1e9bee0300
020000009954b73d90b6d6af70948fe748409ee7bd3394a4ce829d37031dbeacd00f0000dd0ba4f8b208b2c9eef7495ba54925dd299c43cd7c4c56c49dc7b3235296c656bb62c953f0ff0f1ecc880300
0200000045f83bd027d85b1ea23bbc6aa96ab449449375a43ee0d1027ef9a9e99806000031f3df48792cd0a52046e32f12262c2b9d7dfe0d03524f433c7e82bbc7d034e5ce62c953f0ff0f1e46970700
0200000083513ae9e70b0daf7a9111176733452f3a430601470ce3784c689d8df90e0000fb76c5de29d4e11a154f7d0c4731161ae3926cb3a068a93aeb0f6d4bb45a5bb3688eca53ffff0f1e29510200
0200000057fab99d443f6c4c4d3f0f986afe92da1479b74a73fb902e34758281ca0a0000fb6f7efe0b00854c790f2cfabb5ccd576b931004a4525cc9afad025af1c28c5d718eca53f0ff0f1ebcc00300
020000000172588cc0148b9d48e19738a6afd40c830bfc5d3858d98b260124aae90a00006523c9dd6a6afc51ee86951efab764bdb98c43a6102f5714086dda3c1ffb0dc0778eca53f0ff0f1e4e0e0200
020000008b9b2fdc018ff57edcb0ae09127a449f447538e98d6ab3e1135db836820e00004fe375a3e0040bf22fa7883ed47e51a0886eda97d13f5a4b90f1da7ded7021947a8eca53f0ff0f1e449d0100

View File

@ -13,6 +13,7 @@ from decimal import Decimal
from test_framework.blocktools import (
create_coinbase,
filter_tip_keys,
NORMAL_GBT_REQUEST_PARAMS,
TIME_GENESIS_BLOCK,
)
@ -196,17 +197,6 @@ class MiningTest(BitcoinTestFramework):
block.nTime += 1
block.solve()
def filter_tip_keys(chaintips):
"""
Dash chaintips rpc returns extra info in each tip (difficulty, chainwork, and
forkpoint). Filter down to relevant ones checked in this test.
"""
check_keys = ["hash", "height", "branchlen", "status"]
filtered_tips = []
for tip in chaintips:
filtered_tips.append({k: tip[k] for k in check_keys})
return filtered_tips
def chain_tip(b_hash, *, status='headers-only', branchlen=1):
return {'hash': b_hash, 'height': 202, 'branchlen': branchlen, 'status': status}
assert chain_tip(block.hash) not in filter_tip_keys(node.getchaintips())

View File

@ -0,0 +1,89 @@
#!/usr/bin/env python3
# Copyright (c) 2019 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test that we reject low difficulty headers to prevent our block tree from filling up with useless bloat"""
from test_framework.blocktools import filter_tip_keys
from test_framework.messages import (
CBlockHeader,
from_hex,
)
from test_framework.p2p import (
P2PInterface,
msg_headers,
)
from test_framework.test_framework import BitcoinTestFramework
import os
class RejectLowDifficultyHeadersTest(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
self.chain = 'testnet3' # Use testnet chain because it has an early checkpoint
self.num_nodes = 2
def add_options(self, parser):
parser.add_argument(
'--datafile',
default='data/blockheader_testnet3.hex',
help='Test data file (default: %(default)s)',
)
def run_test(self):
self.log.info("Read headers data")
self.headers_file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), self.options.datafile)
with open(self.headers_file_path, encoding='utf-8') as headers_data:
h_lines = [l.strip() for l in headers_data.readlines()]
# The headers data is taken from testnet3 for early blocks from genesis until the first checkpoint. There are
# two headers with valid POW at height 1 and 2, forking off from genesis. They are indicated by the FORK_PREFIX.
FORK_PREFIX = 'fork:'
self.headers = [l for l in h_lines if not l.startswith(FORK_PREFIX)]
self.headers_fork = [l[len(FORK_PREFIX):] for l in h_lines if l.startswith(FORK_PREFIX)]
self.headers = [from_hex(CBlockHeader(), h) for h in self.headers]
self.headers_fork = [from_hex(CBlockHeader(), h) for h in self.headers_fork]
self.log.info("Feed all non-fork headers, including and up to the first checkpoint")
peer_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface())
peer_checkpoint.send_and_ping(msg_headers(self.headers))
assert {
'height': 255,
'hash': '0000080b600e06f4c07880673f027210f9314575f5f875fafe51971e268b886a',
'branchlen': 255,
'status': 'headers-only',
} in filter_tip_keys(self.nodes[0].getchaintips())
self.log.info("Feed all fork headers (fails due to checkpoint)")
with self.nodes[0].assert_debug_log(['bad-fork-prior-to-checkpoint']):
peer_checkpoint.send_message(msg_headers(self.headers_fork))
peer_checkpoint.wait_for_disconnect()
self.log.info("Feed all fork headers (succeeds without checkpoint)")
# On node 0 it succeeds because checkpoints are disabled
self.restart_node(0, extra_args=['-nocheckpoints'])
peer_no_checkpoint = self.nodes[0].add_p2p_connection(P2PInterface())
peer_no_checkpoint.send_and_ping(msg_headers(self.headers_fork))
assert {
"height": 2,
"hash": "00000d3aca6b09e1e0a91196f53654e08eb7bfc897ffbf24040c7686584f0209",
"branchlen": 2,
"status": "headers-only",
} in filter_tip_keys(self.nodes[0].getchaintips())
# On node 1 it succeeds because no checkpoint has been reached yet by a chain tip
peer_before_checkpoint = self.nodes[1].add_p2p_connection(P2PInterface())
peer_before_checkpoint.send_and_ping(msg_headers(self.headers_fork))
assert {
"height": 2,
"hash": "00000d3aca6b09e1e0a91196f53654e08eb7bfc897ffbf24040c7686584f0209",
"branchlen": 2,
"status": "headers-only",
} in filter_tip_keys(self.nodes[0].getchaintips())
if __name__ == '__main__':
RejectLowDifficultyHeadersTest().main()

View File

@ -246,6 +246,17 @@ def get_legacy_sigopcount_tx(tx, accurate=True):
count += CScript(j.scriptSig).GetSigOpCount(accurate)
return count
"""
Dash chaintips rpc returns extra info in each tip (difficulty, chainwork, and
forkpoint). Filter down to relevant ones checked in this test.
"""
def filter_tip_keys(chaintips):
check_keys = ["hash", "height", "branchlen", "status"]
filtered_tips = []
for tip in chaintips:
filtered_tips.append({k: tip[k] for k in check_keys})
return filtered_tips
# Identical to GetMasternodePayment in C++ code
def get_masternode_payment(nHeight, blockValue, fV20Active):
ret = int(blockValue / 5)

View File

@ -305,6 +305,7 @@ BASE_SCRIPTS = [
'wallet_coinbase_category.py --descriptors',
'feature_filelock.py',
'feature_loadblock.py',
'p2p_dos_header_tree.py',
'p2p_blockfilters.py',
'p2p_message_capture.py',
'feature_asmap.py',

View File

@ -111,7 +111,7 @@ if ! PYTHONWARNINGS="ignore" $FLAKECMD --ignore=B,C,E,F,I,N,W --select=$(IFS=","
EXIT_CODE=1
fi
if ! mypy --ignore-missing-imports $(git ls-files "test/functional/*.py"); then
if ! mypy --ignore-missing-imports $(git ls-files "test/functional/*.py" "contrib/devtools/*.py" | grep -v contrib/devtools/github-merge.py) ; then
EXIT_CODE=1
fi