diff --git a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh index 1aedf049fabf5..cc1ffabd36597 100755 --- a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh +++ b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh @@ -5,9 +5,9 @@ set -euo pipefail # Generate the snapshots pnpm snapshots -# Check if the generated snapshots are different from the committed snapshots -if git diff --exit-code snapshots > /dev/null; then - [ -z "$(git ls-files --others --exclude-standard snapshots)" ] || exit 1 +# Check if the generated `snapshots` or `test/kontrol` files are different from the committed versions +if git diff --exit-code snapshots test/kontrol > /dev/null; then + [ -z "$(git ls-files --others --exclude-standard snapshots test/kontrol)" ] || exit 1 else exit 1 fi diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index a6b81d0fa8953..efd88082d1ea2 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -112,8 +112,8 @@ "sourceCodeHash": "0xea3872d8f196ae3c863363dfa4b57803cb2a24b0c100244d8f861891e901e03f" }, "src/Safe/LivenessModule.sol": { - "initCodeHash": "0xdf37345a47e176266f0ece4c624c7e9c2bd81661675f53cf07706dc44dafad27", - "sourceCodeHash": "0xdf17b5a6c068b2cf8fd24383066f0cc8e4ab0002f2470476beae594ca86879f3" + "initCodeHash": "0xde144889fe7d98dbf300a98f5331edd535086a4af8ae6d88ca190c7f4c754a2d", + "sourceCodeHash": "0x3ff4a3f21202478935412d47fd5ef7f94a170402ddc50e5c062013ce5544c83f" }, "src/cannon/MIPS.sol": { "initCodeHash": "0xa5d36fc67170ad87322f358f612695f642757bbf5280800d5d878da21402579a", diff --git a/packages/contracts-bedrock/snapshots/abi/LivenessModule.json b/packages/contracts-bedrock/snapshots/abi/LivenessModule.json index 16efd638bf7a6..5a0a46300725e 100644 --- a/packages/contracts-bedrock/snapshots/abi/LivenessModule.json +++ b/packages/contracts-bedrock/snapshots/abi/LivenessModule.json @@ -125,6 +125,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "ownershipTransferredToFallback", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json b/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json index 0637a088a01e8..305b77337959a 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/LivenessModule.json @@ -1 +1,9 @@ -[] \ No newline at end of file +[ + { + "bytes": "1", + "label": "ownershipTransferredToFallback", + "offset": 0, + "slot": "0", + "type": "bool" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/src/Safe/LivenessModule.sol b/packages/contracts-bedrock/src/Safe/LivenessModule.sol index 6038af883d574..17ec33f1a884e 100644 --- a/packages/contracts-bedrock/src/Safe/LivenessModule.sol +++ b/packages/contracts-bedrock/src/Safe/LivenessModule.sol @@ -23,6 +23,9 @@ contract LivenessModule is ISemver { /// @notice Emitted when the fallback owner takes ownership event OwnershipTransferredToFallback(); + /// @notice Flag to indicate if the module has been deactivated + bool public ownershipTransferredToFallback; + /// @notice The Safe contract instance Safe internal immutable SAFE; @@ -51,7 +54,7 @@ contract LivenessModule is ISemver { /// @notice Semantic version. /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + string public constant version = "1.2.0"; // Constructor to initialize the Safe and baseModule instances constructor( @@ -131,11 +134,16 @@ contract LivenessModule is ISemver { /// @param _ownersToRemove The owners to remove function removeOwners(address[] memory _previousOwners, address[] memory _ownersToRemove) external { require(_previousOwners.length == _ownersToRemove.length, "LivenessModule: arrays must be the same length"); + address[] memory currentOwners = SAFE.getOwners(); + require( + !ownershipTransferredToFallback, + "LivenessModule: The safe has been shutdown, the LivenessModule and LivenessGuard should be removed or replaced." + ); // Initialize the ownersCount count to the current number of owners, so that we can track the number of // owners in the Safe after each removal. The Safe will revert if an owner cannot be removed, so it is safe // keep a local count of the number of owners this way. - uint256 ownersCount = SAFE.getOwners().length; + uint256 ownersCount = currentOwners.length; for (uint256 i = 0; i < _previousOwners.length; i++) { // Validate that the owner can be removed, which means that either: // 1. the ownersCount is now less than MIN_OWNERS, in which case all owners should be removed regardless @@ -196,6 +204,9 @@ contract LivenessModule is ISemver { if (!success) { revert OwnerRemovalFailed(string(returnData)); } + + // Deactivate the module to prevent unintended behavior after the fallback owner has taken ownership. + ownershipTransferredToFallback = true; emit OwnershipTransferredToFallback(); } diff --git a/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol b/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol index 81a6c8d14f53c..f27e8aab4c508 100644 --- a/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol +++ b/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol @@ -115,6 +115,7 @@ contract LivenessModule_Getters_Test is LivenessModule_TestInit { assertEq(livenessModule.thresholdPercentage(), THRESHOLD_PERCENTAGE); assertEq(safeInstance.safe.getThreshold(), livenessModule.getRequiredThreshold(safeInstance.owners.length)); assertEq(livenessModule.fallbackOwner(), fallbackOwner); + assertFalse(livenessModule.ownershipTransferredToFallback()); } } @@ -400,6 +401,13 @@ contract LivenessModule_RemoveOwners_Test is LivenessModule_TestInit { assertEq(safeInstance.safe.getOwners().length, 1); assertEq(safeInstance.safe.getOwners()[0], fallbackOwner); assertEq(safeInstance.safe.getThreshold(), 1); + + // Ensure that the LivenessModule's removeOwners function is now disabled + assertTrue(livenessModule.ownershipTransferredToFallback()); + vm.expectRevert( + "LivenessModule: The safe has been shutdown, the LivenessModule and LivenessGuard should be removed or replaced." + ); + livenessModule.removeOwners(prevOwners, ownersToRemove); } } @@ -546,6 +554,12 @@ contract LivenessModule_RemoveOwnersFuzz_Test is LivenessModule_TestInit { assertEq(safeInstance.safe.getOwners().length, 1); assertEq(safeInstance.safe.getOwners()[0], fallbackOwner); assertEq(safeInstance.safe.getThreshold(), 1); + // Ensure that the LivenessModule's removeOwners function is now disabled + assertTrue(livenessModule.ownershipTransferredToFallback()); + vm.expectRevert( + "LivenessModule: The safe has been shutdown, the LivenessModule and LivenessGuard should be removed or replaced." + ); + livenessModule.removeOwners(prevOwners, ownersToRemove); } else { // For both of the incorrect behaviors, we need to calculate the number of owners to remove to // trigger that behavior. We initialize that value here then set it in the if statements below. diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol index 90bb61fed8991..14a177fa8e880 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol @@ -12,27 +12,27 @@ contract DeploymentSummary is DeploymentSummaryCode { address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); Vm private constant vm = Vm(VM_ADDRESS); - address internal constant addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4; + address internal constant addressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; address internal constant l1CrossDomainMessengerAddress = 0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99; - address internal constant l1CrossDomainMessengerProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; + address internal constant l1CrossDomainMessengerProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; address internal constant l1ERC721BridgeAddress = 0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586; - address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; + address internal constant l1ERC721BridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; address internal constant l1StandardBridgeAddress = 0x04c50B398Cd4182428E79f7186b7C919cF17e86F; - address internal constant l1StandardBridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; + address internal constant l1StandardBridgeProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60; - address internal constant l2OutputOracleProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant l2OutputOracleProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb; address internal constant optimismPortalAddress = 0xFc9AD479AC641888D36EE5Dc265bcD3ecceBDc58; - address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; + address internal constant optimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90; address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F; - address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1; - address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1; - address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496; - address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; + address internal constant protocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6; + address internal constant proxyAdminAddress = 0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76; + address internal constant safeProxyFactoryAddress = 0x34A1D3fff3958843C43aD80F30b94c510645C316; + address internal constant safeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1; address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A; - address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351; + address internal constant superchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809; address internal constant systemConfigAddress = 0x19E90dC1Fb905f20BB3A7eC537B5B812d5FFA682; - address internal constant systemConfigProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; - address internal constant systemOwnerSafeAddress = 0x96544c43aBcEe1c7FC04914953Bf0330e21a3c7d; + address internal constant systemConfigProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; + address internal constant systemOwnerSafeAddress = 0x7d039be7F9b5190147621b02e82B250e1D748e02; function recreateDeployment() public { bytes32 slot; @@ -44,7 +44,7 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(safeSingletonAddress, slot, value); vm.etch(systemOwnerSafeAddress, systemOwnerSafeCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + value = hex"00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -70,14 +70,14 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000096544c43abcee1c7fc04914953bf0330e21a3c7d"; + value = hex"0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02"; vm.store(proxyAdminAddress, slot, value); vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(superchainConfigProxyAddress, slot, value); vm.etch(superchainConfigAddress, superchainConfigCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -109,7 +109,7 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(superchainConfigProxyAddress, slot, value); vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(protocolVersionsAddress, protocolVersionsCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -140,7 +140,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -150,33 +150,33 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(optimismPortalProxyAddress, slot, value); vm.etch(l2OutputOracleProxyAddress, l2OutputOracleProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(l2OutputOracleProxyAddress, slot, value); vm.etch(systemConfigProxyAddress, systemConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(systemConfigProxyAddress, slot, value); vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(l1StandardBridgeProxyAddress, slot, value); vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); - slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58"; - value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; + slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); - slot = hex"ceb2ac3d439ba35adb9a3f2ba6c37d15a264e79156ee79334f5d4c00090812d2"; + slot = hex"4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(addressManagerAddress, slot, value); vm.etch(optimismPortalAddress, optimismPortalCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -290,7 +290,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -314,16 +314,16 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"000000000000000000000000ff00000000000000000000000000000000000000"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; - value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; - value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -337,7 +337,7 @@ contract DeploymentSummary is DeploymentSummaryCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000004"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; + slot = hex"a8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -353,13 +353,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; value = hex"0000000000000000000000004200000000000000000000000000000000000010"; @@ -380,10 +380,10 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; value = hex"0000000000000000000000004200000000000000000000000000000000000014"; @@ -394,13 +394,13 @@ contract DeploymentSummary is DeploymentSummaryCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000007"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58"; + slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000008"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"63c92109b91ecf3318ee316da9fdb1378fd8d900f912b2029945ff91daa463bf"; + slot = hex"17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -416,13 +416,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000001010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fb"; - value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fd"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -446,13 +446,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000036"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000035"; - value = hex"00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100"; + value = hex"0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol index 9cc6b94709e88..eb92d625cad71 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol @@ -12,35 +12,35 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { address private constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); Vm private constant vm = Vm(VM_ADDRESS); - address internal constant addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4; - address internal constant anchorStateRegistryAddress = 0x71f44B7281dFCd25D9a36798E1872F82942DD763; - address internal constant anchorStateRegistryProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; + address internal constant addressManagerAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; + address internal constant anchorStateRegistryAddress = 0xF74482139D1564B826994875cF6632eB5b134b25; + address internal constant anchorStateRegistryProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; address internal constant delayedWETHAddress = 0x49BBFf1629824A1e7993Ab5c17AFa45D24AB28c9; - address internal constant delayedWETHProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; + address internal constant delayedWETHProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; address internal constant disputeGameFactoryAddress = 0x20B168142354Cee65a32f6D8cf3033E592299765; - address internal constant disputeGameFactoryProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant disputeGameFactoryProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb; address internal constant l1CrossDomainMessengerAddress = 0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99; - address internal constant l1CrossDomainMessengerProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d; + address internal constant l1CrossDomainMessengerProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; address internal constant l1ERC721BridgeAddress = 0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586; - address internal constant l1ERC721BridgeProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99; + address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; address internal constant l1StandardBridgeAddress = 0x04c50B398Cd4182428E79f7186b7C919cF17e86F; - address internal constant l1StandardBridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; + address internal constant l1StandardBridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; address internal constant mipsAddress = 0xF698388BFCDbd3f9f2F13ebC3E01471B3cc7cE83; address internal constant optimismPortal2Address = 0xfcbb237388CaF5b08175C9927a37aB6450acd535; - address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; + address internal constant optimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90; address internal constant preimageOracleAddress = 0x3bd7E801E51d48c5d94Ea68e8B801DFFC275De75; address internal constant protocolVersionsAddress = 0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F; - address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1; - address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1; - address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496; - address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; + address internal constant protocolVersionsProxyAddress = 0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6; + address internal constant proxyAdminAddress = 0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76; + address internal constant safeProxyFactoryAddress = 0x34A1D3fff3958843C43aD80F30b94c510645C316; + address internal constant safeSingletonAddress = 0x90193C961A926261B756D1E5bb255e67ff9498A1; address internal constant superchainConfigAddress = 0x068E44eB31e111028c41598E4535be7468674D0A; - address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351; + address internal constant superchainConfigProxyAddress = 0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809; address internal constant systemConfigAddress = 0x19E90dC1Fb905f20BB3A7eC537B5B812d5FFA682; - address internal constant systemConfigProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; - address internal constant systemOwnerSafeAddress = 0x96544c43aBcEe1c7FC04914953Bf0330e21a3c7d; - address internal constant acc27Address = 0x2abb7CBB720020ee3C9ecf3915D14B6d1886A577; - address internal constant acc28Address = 0x91752891a019Fb365Df0F99Fa468Bf19F91C2Ac0; + address internal constant systemConfigProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; + address internal constant systemOwnerSafeAddress = 0x7d039be7F9b5190147621b02e82B250e1D748e02; + address internal constant acc27Address = 0x12e721c390F5728200a26BBEf206A5F4F7E991f3; + address internal constant acc28Address = 0x2abb7CBB720020ee3C9ecf3915D14B6d1886A577; function recreateDeployment() public { bytes32 slot; @@ -52,7 +52,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(safeSingletonAddress, slot, value); vm.etch(systemOwnerSafeAddress, systemOwnerSafeCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + value = hex"00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -78,14 +78,14 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000096544c43abcee1c7fc04914953bf0330e21a3c7d"; + value = hex"0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02"; vm.store(proxyAdminAddress, slot, value); vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(superchainConfigProxyAddress, slot, value); vm.etch(superchainConfigAddress, superchainConfigCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -117,7 +117,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(superchainConfigProxyAddress, slot, value); vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(protocolVersionsAddress, protocolVersionsCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -148,7 +148,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -158,41 +158,41 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(optimismPortalProxyAddress, slot, value); vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(disputeGameFactoryProxyAddress, slot, value); vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(anchorStateRegistryProxyAddress, slot, value); vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(delayedWETHProxyAddress, slot, value); vm.etch(systemConfigProxyAddress, systemConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(systemConfigProxyAddress, slot, value); vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(l1StandardBridgeProxyAddress, slot, value); vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); - slot = hex"67ba7d8bdda390f76c7887f0749c8ddd97a5488c0685a6600f6146d45a37e9e3"; - value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; + slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); - slot = hex"d99a7cb5c85ff45a31aa0b5f37f50c1e3e0ba7b502eb0a97c078a396df6e5fc4"; + slot = hex"ceb2ac3d439ba35adb9a3f2ba6c37d15a264e79156ee79334f5d4c00090812d2"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(addressManagerAddress, slot, value); vm.etch(optimismPortal2Address, optimismPortal2Code); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -382,7 +382,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -406,19 +406,19 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"000000000000000000000000ff00000000000000000000000000000000000000"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; - value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; + value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; - value = hex"00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99"; + value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; - value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -432,7 +432,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000004"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"9ab6929e7d0104b9744ecf48c9c83f65e34bb9eb80c70a88b6b8885e3bf62b15"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -448,13 +448,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; + value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; value = hex"0000000000000000000000004200000000000000000000000000000000000010"; @@ -475,10 +475,10 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; + value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; value = hex"0000000000000000000000004200000000000000000000000000000000000014"; @@ -489,13 +489,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000007"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"67ba7d8bdda390f76c7887f0749c8ddd97a5488c0685a6600f6146d45a37e9e3"; + slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58"; value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000008"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"d5dc64acc11f1f6863a0fcd1f905ec35afa9f95985626daaa4d59a538a25a7a8"; + slot = hex"63c92109b91ecf3318ee316da9fdb1378fd8d900f912b2029945ff91daa463bf"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; @@ -511,13 +511,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000001010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fb"; - value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fd"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -541,7 +541,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -562,13 +562,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; - value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -577,7 +577,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"000000000000000000000000000000000000000000000000000000000000000c"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"00000000000000000000000071f44b7281dfcd25d9a36798e1872f82942dd763"; + value = hex"000000000000000000000000f74482139d1564b826994875cf6632eb5b134b25"; vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -613,13 +613,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000038"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000035"; - value = hex"00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100"; + value = hex"0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900"; vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -635,11 +635,11 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(optimismPortalProxyAddress, slot, value); vm.etch(acc27Address, acc27Code); slot = hex"ffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b"; - value = hex"0000000000000000000000002abb7cbb720020ee3c9ecf3915d14b6d1886a577"; + value = hex"00000000000000000000000012e721c390f5728200a26bbef206a5f4f7e991f3"; vm.store(disputeGameFactoryProxyAddress, slot, value); vm.etch(acc28Address, acc28Code); slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e"; - value = hex"00000000000000000000000091752891a019fb365df0f99fa468bf19f91c2ac0"; + value = hex"0000000000000000000000002abb7cbb720020ee3c9ecf3915d14b6d1886a577"; vm.store(disputeGameFactoryProxyAddress, slot, value); } } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol index 5dbbc91865169..57bb7faa9aac5 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol @@ -57,9 +57,9 @@ contract DeploymentSummaryFaultProofsCode { bytes internal constant mipsCode = hex"608060405234801561001057600080fd5b506004361061004c5760003560e01c8063155633fe1461005157806354fd4d50146100765780637dc0d1d0146100bf578063e14ced3214610103575b600080fd5b61005c634000000081565b60405163ffffffff90911681526020015b60405180910390f35b6100b26040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161006d9190611e16565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de7516815260200161006d565b610116610111366004611ed2565b610124565b60405190815260200161006d565b600061012e611d8c565b6080811461013b57600080fd5b6040516106001461014b57600080fd5b6084871461015857600080fd5b6101a4851461016657600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a052605a880135901c6101c0526102006101e0819052606288019060005b602081101561021157823560e01c82526004909201916020909101906001016101ed565b5050508061012001511561022f5761022761066f565b915050610666565b6101408101805160010167ffffffffffffffff1690526060810151600090610257908261078b565b9050603f601a82901c16600281148061027657508063ffffffff166003145b156102cb5760006002836303ffffff1663ffffffff16901b846080015163f0000000161790506102c08263ffffffff166002146102b457601f6102b7565b60005b60ff1682610847565b945050505050610666565b6101608301516000908190601f601086901c81169190601587901c16602081106102f7576102f7611f46565b602002015192508063ffffffff8516158061031857508463ffffffff16601c145b1561034f578661016001518263ffffffff166020811061033a5761033a611f46565b6020020151925050601f600b86901c1661040b565b60208563ffffffff1610156103b1578463ffffffff16600c148061037957508463ffffffff16600d145b8061038a57508463ffffffff16600e145b1561039b578561ffff16925061040b565b6103aa8661ffff166010610938565b925061040b565b60288563ffffffff161015806103cd57508463ffffffff166022145b806103de57508463ffffffff166026145b1561040b578661016001518263ffffffff166020811061040057610400611f46565b602002015192508190505b60048563ffffffff1610158015610428575060088563ffffffff16105b8061043957508463ffffffff166001145b156104585761044a858784876109ab565b975050505050505050610666565b63ffffffff60006020878316106104bd576104788861ffff166010610938565b9095019463fffffffc861661048e81600161078b565b915060288863ffffffff16101580156104ae57508763ffffffff16603014155b156104bb57809250600093505b505b60006104cb89888885610bbb565b63ffffffff9081169150603f8a169089161580156104f0575060088163ffffffff1610155b80156105025750601c8163ffffffff16105b156105df578063ffffffff166008148061052257508063ffffffff166009145b15610559576105478163ffffffff1660081461053e5785610541565b60005b89610847565b9b505050505050505050505050610666565b8063ffffffff16600a0361057957610547858963ffffffff8a161561134b565b8063ffffffff16600b0361059a57610547858963ffffffff8a16151561134b565b8063ffffffff16600c036105b1576105478d611431565b60108163ffffffff16101580156105ce5750601c8163ffffffff16105b156105df5761054781898988611968565b8863ffffffff1660381480156105fa575063ffffffff861615155b1561062f5760018b61016001518763ffffffff166020811061061e5761061e611f46565b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff1461064c5761064c84600184611c3f565b6106588583600161134b565b9b5050505050505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a840152600092610200929091606283019190855b602081101561070e57601c86015184526020909501946004909301926001016106ea565b506000835283830384a060009450806001811461072e5760039550610756565b828015610746576001811461074f5760029650610754565b60009650610754565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b60008061079783611ce3565b905060038416156107a757600080fd5b6020810190358460051c8160005b601b81101561080d5760208501943583821c60011680156107dd57600181146107f257610803565b60008481526020839052604090209350610803565b600082815260208590526040902093505b50506001016107b5565b50608051915081811461082857630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b6000610851611d8c565b60809050806060015160040163ffffffff16816080015163ffffffff16146108da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b60608101805160808301805163ffffffff90811690935285831690529085161561093057806008018261016001518663ffffffff166020811061091f5761091f611f46565b63ffffffff90921660209290920201525b61066661066f565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610995576000610997565b815b90861663ffffffff16179250505092915050565b60006109b5611d8c565b608090506000816060015160040163ffffffff16826080015163ffffffff1614610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f7400000000000000000000000060448201526064016108d1565b8663ffffffff1660041480610a5657508663ffffffff166005145b15610ad25760008261016001518663ffffffff1660208110610a7a57610a7a611f46565b602002015190508063ffffffff168563ffffffff16148015610aa257508763ffffffff166004145b80610aca57508063ffffffff168563ffffffff1614158015610aca57508763ffffffff166005145b915050610b4f565b8663ffffffff16600603610aef5760008460030b13159050610b4f565b8663ffffffff16600703610b0b5760008460030b139050610b4f565b8663ffffffff16600103610b4f57601f601087901c166000819003610b345760008560030b1291505b8063ffffffff16600103610b4d5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b95576002610b7a8861ffff166010610938565b63ffffffff90811690911b8201600401166080840152610ba7565b60808301805160040163ffffffff1690525b610baf61066f565b98975050505050505050565b6000603f601a86901c16801580610bea575060088163ffffffff1610158015610bea5750600f8163ffffffff16105b1561104057603f86168160088114610c315760098114610c3a57600a8114610c4357600b8114610c4c57600c8114610c5557600d8114610c5e57600e8114610c6757610c6c565b60209150610c6c565b60219150610c6c565b602a9150610c6c565b602b9150610c6c565b60249150610c6c565b60259150610c6c565b602691505b508063ffffffff16600003610c935750505063ffffffff8216601f600686901c161b611343565b8063ffffffff16600203610cb95750505063ffffffff8216601f600686901c161c611343565b8063ffffffff16600303610cef57601f600688901c16610ce563ffffffff8716821c6020839003610938565b9350505050611343565b8063ffffffff16600403610d115750505063ffffffff8216601f84161b611343565b8063ffffffff16600603610d335750505063ffffffff8216601f84161c611343565b8063ffffffff16600703610d6657610d5d8663ffffffff168663ffffffff16901c87602003610938565b92505050611343565b8063ffffffff16600803610d7e578592505050611343565b8063ffffffff16600903610d96578592505050611343565b8063ffffffff16600a03610dae578592505050611343565b8063ffffffff16600b03610dc6578592505050611343565b8063ffffffff16600c03610dde578592505050611343565b8063ffffffff16600f03610df6578592505050611343565b8063ffffffff16601003610e0e578592505050611343565b8063ffffffff16601103610e26578592505050611343565b8063ffffffff16601203610e3e578592505050611343565b8063ffffffff16601303610e56578592505050611343565b8063ffffffff16601803610e6e578592505050611343565b8063ffffffff16601903610e86578592505050611343565b8063ffffffff16601a03610e9e578592505050611343565b8063ffffffff16601b03610eb6578592505050611343565b8063ffffffff16602003610ecf57505050828201611343565b8063ffffffff16602103610ee857505050828201611343565b8063ffffffff16602203610f0157505050818303611343565b8063ffffffff16602303610f1a57505050818303611343565b8063ffffffff16602403610f3357505050828216611343565b8063ffffffff16602503610f4c57505050828217611343565b8063ffffffff16602603610f6557505050828218611343565b8063ffffffff16602703610f7f5750505082821719611343565b8063ffffffff16602a03610fb0578460030b8660030b12610fa1576000610fa4565b60015b60ff1692505050611343565b8063ffffffff16602b03610fd8578463ffffffff168663ffffffff1610610fa1576000610fa4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e0000000000000000000000000060448201526064016108d1565b50610fd8565b8063ffffffff16601c036110c457603f8616600281900361106657505050828202611343565b8063ffffffff166020148061108157508063ffffffff166021145b1561103a578063ffffffff16602003611098579419945b60005b63800000008716156110ba576401fffffffe600197881b16960161109b565b9250611343915050565b8063ffffffff16600f036110e657505065ffffffff0000601083901b16611343565b8063ffffffff166020036111225761111a8560031660080260180363ffffffff168463ffffffff16901c60ff166008610938565b915050611343565b8063ffffffff166021036111575761111a8560021660080260100363ffffffff168463ffffffff16901c61ffff166010610938565b8063ffffffff1660220361118657505063ffffffff60086003851602811681811b198416918316901b17611343565b8063ffffffff1660230361119d5782915050611343565b8063ffffffff166024036111cf578460031660080260180363ffffffff168363ffffffff16901c60ff16915050611343565b8063ffffffff16602503611202578460021660080260100363ffffffff168363ffffffff16901c61ffff16915050611343565b8063ffffffff1660260361123457505063ffffffff60086003851602601803811681811c198416918316901c17611343565b8063ffffffff1660280361126a57505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611343565b8063ffffffff166029036112a157505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611343565b8063ffffffff16602a036112d057505063ffffffff60086003851602811681811c198316918416901c17611343565b8063ffffffff16602b036112e75783915050611343565b8063ffffffff16602e0361131957505063ffffffff60086003851602601803811681811b198316918416901b17611343565b8063ffffffff166030036113305782915050611343565b8063ffffffff16603803610fd857839150505b949350505050565b6000611355611d8c565b506080602063ffffffff8616106113c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c696420726567697374657200000000000000000000000000000000000060448201526064016108d1565b63ffffffff8516158015906113da5750825b1561140e57838161016001518663ffffffff16602081106113fd576113fd611f46565b63ffffffff90921660209290920201525b60808101805163ffffffff8082166060850152600490910116905261066661066f565b600061143b611d8c565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa036114b55781610fff81161561148457610fff811661100003015b8363ffffffff166000036114ab5760e08801805163ffffffff8382011690915295506114af565b8395505b50611927565b8563ffffffff16610fcd036114d05763400000009450611927565b8563ffffffff16611018036114e85760019450611927565b8563ffffffff166110960361151e57600161012088015260ff831661010088015261151161066f565b9998505050505050505050565b8563ffffffff16610fa30361178a5763ffffffff831615611927577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb63ffffffff8416016117445760006115798363fffffffc16600161078b565b60208901519091508060001a6001036115e857604080516000838152336020528d83526060902091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790505b6040808a015190517fe03110e10000000000000000000000000000000000000000000000000000000081526004810183905263ffffffff9091166024820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de75169063e03110e1906044016040805180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190611f75565b915091506003861680600403828110156116c5578092505b50818610156116d2578591505b8260088302610100031c9250826008828460040303021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119871617955050506117298663fffffffc16600186611c3f565b60408b018051820163ffffffff169052975061178592505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd63ffffffff84160161177957809450611927565b63ffffffff9450600993505b611927565b8563ffffffff16610fa40361187b5763ffffffff8316600114806117b4575063ffffffff83166002145b806117c5575063ffffffff83166004145b156117d257809450611927565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8416016117795760006118128363fffffffc16600161078b565b6020890151909150600384166004038381101561182d578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b17602088015260006040880152935083611927565b8563ffffffff16610fd703611927578163ffffffff1660030361191b5763ffffffff831615806118b1575063ffffffff83166005145b806118c2575063ffffffff83166003145b156118d05760009450611927565b63ffffffff8316600114806118eb575063ffffffff83166002145b806118fc575063ffffffff83166006145b8061190d575063ffffffff83166004145b156117795760019450611927565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261151161066f565b6000611972611d8c565b506080600063ffffffff8716601003611990575060c0810151611bd6565b8663ffffffff166011036119af5763ffffffff861660c0830152611bd6565b8663ffffffff166012036119c8575060a0810151611bd6565b8663ffffffff166013036119e75763ffffffff861660a0830152611bd6565b8663ffffffff16601803611a1b5763ffffffff600387810b9087900b02602081901c821660c08501521660a0830152611bd6565b8663ffffffff16601903611a4c5763ffffffff86811681871602602081901c821660c08501521660a0830152611bd6565b8663ffffffff16601a03611b0f578460030b600003611ac7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016108d1565b8460030b8660030b81611adc57611adc611f99565b0763ffffffff1660c0830152600385810b9087900b81611afe57611afe611f99565b0563ffffffff1660a0830152611bd6565b8663ffffffff16601b03611bd6578463ffffffff16600003611b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016108d1565b8463ffffffff168663ffffffff1681611ba857611ba8611f99565b0663ffffffff90811660c084015285811690871681611bc957611bc9611f99565b0463ffffffff1660a08301525b63ffffffff841615611c1157808261016001518563ffffffff1660208110611c0057611c00611f46565b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611c3461066f565b979650505050505050565b6000611c4a83611ce3565b90506003841615611c5a57600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b811015611cd85760208401933582821c6001168015611ca85760018114611cbd57611cce565b60008581526020839052604090209450611cce565b600082815260208690526040902094505b5050600101611c80565b505060805250505050565b60ff8116610380026101a4810190369061052401811015611d86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f617461000000000000000000000000000000000000000000000000000000000060648201526084016108d1565b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611df2611df7565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b81811015611e4357858101830151858201604001528201611e27565b81811115611e55576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f840112611e9b57600080fd5b50813567ffffffffffffffff811115611eb357600080fd5b602083019150836020828501011115611ecb57600080fd5b9250929050565b600080600080600060608688031215611eea57600080fd5b853567ffffffffffffffff80821115611f0257600080fd5b611f0e89838a01611e89565b90975095506020880135915080821115611f2757600080fd5b50611f3488828901611e89565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008060408385031215611f8857600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a"; bytes internal constant anchorStateRegistryCode = - hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa61681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa673ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; bytes internal constant acc27Code = - hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d73ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d1690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f9092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f1690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a"; + hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e473ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e41690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa69092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa61690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a"; bytes internal constant acc28Code = - hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d73ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f1690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d1690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f9092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a"; + hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e473ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa61690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e41690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa69092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a"; }