From 3224c0a9a8c884718c66f3a2bf3ea31eb7fb5030 Mon Sep 17 00:00:00 2001 From: Roshan <48975233+Pythonberg1997@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:59:07 +0800 Subject: [PATCH 01/67] feat: implement BEP294 and BEP297 (#404) * feat: implement BEP294 * feat: add BSCGovernor and GovToken contracts for bc-fusion (#403) * feat: implement BEP294 --------- Co-authored-by: Ethan --- .gitignore | 1 + README.md | 7 +- abi/README.md | 9 +- abi/bscgovernor.abi | 1680 ++++++++++++++ abi/bsctimelock.abi | 922 ++++++++ abi/bscvalidatorset.abi | 205 +- abi/crosschain.abi | 26 + abi/govhub.abi | 49 + abi/govtoken.abi | 789 +++++++ abi/relayerhub.abi | 195 +- abi/relayerincentivize.abi | 26 + abi/slashindicator.abi | 146 +- abi/stakecredit.abi | 654 ++++++ abi/stakehub.abi | 1151 ++++++++++ abi/staking.abi | 26 + abi/systemreward.abi | 26 + abi/tendermintlightclient.abi | 202 +- abi/tokenhub.abi | 26 + abi/tokenmanager.abi | 26 + contracts/BC_fusion/BSCGovernor.sol | 232 ++ contracts/BC_fusion/BSCTimelock.sol | 35 + contracts/BC_fusion/GovToken.sol | 95 + contracts/BC_fusion/StakeCredit.sol | 235 ++ contracts/BC_fusion/StakeHub.sol | 802 +++++++ contracts/BC_fusion/System.sol | 68 + .../BC_fusion/interface/IBSCValidatorSet.sol | 6 + contracts/BC_fusion/interface/IGovToken.sol | 9 + .../BC_fusion/interface/IStakeCredit.sol | 18 + contracts/BC_fusion/interface/IStakeHub.sol | 7 + contracts/BC_fusion/lib/Utils.sol | 26 + contracts/BSCValidatorSet.sol | 246 +- contracts/CrossChain.sol | 2 +- contracts/GovHub.sol | 10 +- contracts/SlashIndicator.sol | 112 +- contracts/Staking.sol | 70 +- contracts/System.sol | 14 +- contracts/interface/ISlashIndicator.sol | 1 + contracts/interface/IStakeHub.sol | 11 + contracts/test/ABCToken.sol | 248 -- contracts/test/DEFToken.sol | 248 -- contracts/test/MaliciousToken.sol | 242 -- contracts/test/MiniToken.sol | 248 -- contracts/test/XYZToken.sol | 298 --- flatten.sh | 11 - foundry.toml | 10 +- genesis-template.json | 24 +- genesis.json | 46 +- lib/Deployer.sol | 161 -- lib/interface/IDEFToken.sol | 26 - lib/interface/IMaliciousToken.sol | 26 - lib/interface/IMiniToken.sol | 26 - lib/interface/IXYZToken.sol | 28 - package-lock.json | 33 +- package.json | 3 +- scripts/flatten.sh | 16 + scripts/generate-chainId.js | 7 + scripts/generate-crossChain.sh | 8 +- scripts/generate-genesis.js | 7 +- scripts/generate-initHolders.js | 8 +- scripts/generate-relayerHub.sh | 26 +- scripts/generate-slashIndicator.sh | 5 +- scripts/generate-system.sh | 12 +- scripts/generate-validatorSet.sh | 9 +- scripts/generate.sh | 56 +- scripts/init_holders.template | 8 +- scripts/validators.js | 4 +- scripts/validators.template | 2 - test/GovHub.t.sol | 353 ++- test/RelayerHub.t.sol | 278 ++- test/RelayerIncentivize.t.sol | 437 ++-- test/SlashIndicator.t.sol | 612 ++--- test/StakeHub.t.sol | 480 ++++ test/Staking.t.sol | 924 ++++---- test/SystemReward.t.sol | 112 +- test/TendermintLightClient.t.sol | 24 +- test/TokenHub.t.sol | 1993 +++++++++-------- test/ValidatorSet.t.sol | 1127 +++++----- test/ValidatorSetTool.t.sol | 29 +- test/utils/Deployer.sol | 218 ++ {lib => test/utils}/RLPDecode.sol | 126 +- {lib => test/utils}/RLPEncode.sol | 101 +- test/utils/interface/IBSCGovernor.sol | 183 ++ test/utils/interface/IBSCTimelock.sol | 89 + .../utils}/interface/IBSCValidatorSet.sol | 37 +- .../utils}/interface/IBSCValidatorSetTool.sol | 1 + {lib => test/utils}/interface/ICrossChain.sol | 45 +- {lib => test/utils}/interface/IGovHub.sol | 4 + test/utils/interface/IGovToken.sol | 61 + {lib => test/utils}/interface/IRelayerHub.sol | 18 +- .../utils}/interface/IRelayerIncentivize.sol | 18 +- .../utils}/interface/ISlashIndicator.sol | 26 +- test/utils/interface/IStakeCredit.sol | 47 + test/utils/interface/IStakeHub.sol | 120 + {lib => test/utils}/interface/IStaking.sol | 5 + {lib => test/utils}/interface/ISystem.sol | 3 + .../utils}/interface/ISystemReward.sol | 11 +- .../interface/ITendermintLightClient.sol | 7 +- .../utils/interface/ITestToken.sol | 12 +- {lib => test/utils}/interface/ITokenHub.sol | 20 +- .../utils}/interface/ITokenManager.sol | 3 + test/utils/test_token/ABCToken.sol | 248 ++ test/utils/test_token/DEFToken.sol | 248 ++ test/utils/test_token/MaliciousToken.sol | 242 ++ test/utils/test_token/MiniToken.sol | 248 ++ test/utils/test_token/XYZToken.sol | 297 +++ 105 files changed, 13868 insertions(+), 4950 deletions(-) create mode 100644 abi/bscgovernor.abi create mode 100644 abi/bsctimelock.abi create mode 100644 abi/govtoken.abi create mode 100644 abi/stakecredit.abi create mode 100644 abi/stakehub.abi create mode 100644 contracts/BC_fusion/BSCGovernor.sol create mode 100644 contracts/BC_fusion/BSCTimelock.sol create mode 100644 contracts/BC_fusion/GovToken.sol create mode 100644 contracts/BC_fusion/StakeCredit.sol create mode 100644 contracts/BC_fusion/StakeHub.sol create mode 100644 contracts/BC_fusion/System.sol create mode 100644 contracts/BC_fusion/interface/IBSCValidatorSet.sol create mode 100644 contracts/BC_fusion/interface/IGovToken.sol create mode 100644 contracts/BC_fusion/interface/IStakeCredit.sol create mode 100644 contracts/BC_fusion/interface/IStakeHub.sol create mode 100644 contracts/BC_fusion/lib/Utils.sol create mode 100644 contracts/interface/IStakeHub.sol delete mode 100644 contracts/test/ABCToken.sol delete mode 100644 contracts/test/DEFToken.sol delete mode 100644 contracts/test/MaliciousToken.sol delete mode 100644 contracts/test/MiniToken.sol delete mode 100644 contracts/test/XYZToken.sol delete mode 100644 flatten.sh delete mode 100644 lib/Deployer.sol delete mode 100644 lib/interface/IDEFToken.sol delete mode 100644 lib/interface/IMaliciousToken.sol delete mode 100644 lib/interface/IMiniToken.sol delete mode 100644 lib/interface/IXYZToken.sol create mode 100644 scripts/flatten.sh create mode 100644 scripts/generate-chainId.js create mode 100644 test/StakeHub.t.sol create mode 100644 test/utils/Deployer.sol rename {lib => test/utils}/RLPDecode.sol (70%) rename {lib => test/utils}/RLPEncode.sol (63%) create mode 100644 test/utils/interface/IBSCGovernor.sol create mode 100644 test/utils/interface/IBSCTimelock.sol rename {lib => test/utils}/interface/IBSCValidatorSet.sol (81%) rename {lib => test/utils}/interface/IBSCValidatorSetTool.sol (88%) rename {lib => test/utils}/interface/ICrossChain.sol (73%) rename {lib => test/utils}/interface/IGovHub.sol (89%) create mode 100644 test/utils/interface/IGovToken.sol rename {lib => test/utils}/interface/IRelayerHub.sol (91%) rename {lib => test/utils}/interface/IRelayerIncentivize.sol (89%) rename {lib => test/utils}/interface/ISlashIndicator.sol (81%) create mode 100644 test/utils/interface/IStakeCredit.sol create mode 100644 test/utils/interface/IStakeHub.sol rename {lib => test/utils}/interface/IStaking.sol (96%) rename {lib => test/utils}/interface/ISystem.sol (90%) rename {lib => test/utils}/interface/ISystemReward.sol (87%) rename {lib => test/utils}/interface/ITendermintLightClient.sol (91%) rename lib/interface/IABCToken.sol => test/utils/interface/ITestToken.sol (55%) rename {lib => test/utils}/interface/ITokenHub.sol (79%) rename {lib => test/utils}/interface/ITokenManager.sol (96%) create mode 100644 test/utils/test_token/ABCToken.sol create mode 100644 test/utils/test_token/DEFToken.sol create mode 100644 test/utils/test_token/MaliciousToken.sol create mode 100644 test/utils/test_token/MiniToken.sol create mode 100644 test/utils/test_token/XYZToken.sol diff --git a/.gitignore b/.gitignore index 2dfe4479..428cc4e1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ out/ pids/ logs/ cache/ +broadcast/ contracts/flattened/*.sol diff --git a/README.md b/README.md index de838a84..7533242e 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,13 @@ Install foundry: ```shell script curl -L https://foundry.paradigm.xyz | bash foundryup -forge install --no-git --no-commit foundry-rs/forge-std@v1.1.1 +forge install --no-git --no-commit foundry-rs/forge-std@v1.7.3 ``` Please make sure your dependency version is as follows: Node: v12.18.3 - Tips: You can manage multi version of Node: ```Shell ## Install nvm and node @@ -46,7 +45,7 @@ forge test ## Flatten all system contracts ```shell script -bash flatten.sh +bash scripts/flatten.sh ``` All system contracts will be flattened and output into `${workspace}/contracts/flattened/`. @@ -58,7 +57,7 @@ All system contracts will be flattened and output into `${workspace}/contracts/f 3. Run `bash scripts/generate-*.sh` to change system contracts setting. 4. Run `node scripts/generate-genesis.js` will generate genesis.json -## How to generate mainnet/testnet/QA genesis file +## How to generate mainnet/testnet/QA/local genesis file ```shell bash scripts/generate.sh mainnet diff --git a/abi/README.md b/abi/README.md index dbbf341d..60e60022 100644 --- a/abi/README.md +++ b/abi/README.md @@ -1,7 +1,7 @@ # ABI Files for Build-In System Contracts | Contract Name | Address | ABI file name | -|-----------------------|--------------------------------------------|----------------------------------------------------| +| --------------------- | ------------------------------------------ | -------------------------------------------------- | | BSCValidatorSet | 0x0000000000000000000000000000000000001000 | [bscvalidatorset](bscvalidatorset.abi) | | SlashIndicator | 0x0000000000000000000000000000000000001001 | [slashindicator](slashindicator.abi) | | SystemReward | 0x0000000000000000000000000000000000001002 | [systemreward](systemreward.abi) | @@ -12,4 +12,9 @@ | GovHub | 0x0000000000000000000000000000000000001007 | [govhub](govhub.abi) | | TokenManager | 0x0000000000000000000000000000000000001008 | [tokenmanager](tokenmanager.abi) | | CrossChain | 0x0000000000000000000000000000000000002000 | [crosschain](crosschain.abi) | -| Staking | 0x0000000000000000000000000000000000002001 | [staking](staking.abi) | \ No newline at end of file +| Staking | 0x0000000000000000000000000000000000002001 | [staking](staking.abi) | +| StakeHub | 0x0000000000000000000000000000000000002002 | [stakehub](staking.abi) | +| StakeCredit | 0x0000000000000000000000000000000000002003 | [stakecredit](stakecredit.abi) | +| BSCGovernor | 0x0000000000000000000000000000000000002004 | [bscgovernor](bscgovernor.abi) | +| GovToken | 0x0000000000000000000000000000000000002005 | [govtoken](govtoken.abi) | +| BSCTimelock | 0x0000000000000000000000000000000000002006 | [bsctimelock](bsctimelock.abi) | diff --git a/abi/bscgovernor.abi b/abi/bscgovernor.abi new file mode 100644 index 00000000..a92b50e2 --- /dev/null +++ b/abi/bscgovernor.abi @@ -0,0 +1,1680 @@ +[ + { + "inputs": [], + "name": "Empty", + "type": "error" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint64", + "name": "oldVoteExtension", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newVoteExtension", + "type": "uint64" + } + ], + "name": "LateQuorumVoteExtensionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ParamChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "voteStart", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "voteEnd", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "extendedDeadline", + "type": "uint64" + } + ], + "name": "ProposalExtended", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "ProposalQueued", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldProposalThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "ProposalThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldQuorumNumerator", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "QuorumNumeratorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldTimelock", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newTimelock", + "type": "address" + } + ], + "name": "TimelockChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "VoteCast", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "VoteCastWithParams", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingDelay", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "VotingDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingPeriod", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "VotingPeriodSet", + "type": "event" + }, + { + "inputs": [], + "name": "BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CLOCK_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "COUNTING_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "EXTENDED_BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "cancel", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + } + ], + "name": "castVote", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "castVoteWithReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteWithReasonAndParamsBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clock", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "getActions", + "outputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "voter", + "type": "address" + } + ], + "name": "getReceipt", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "hasVoted", + "type": "bool" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "uint96", + "name": "votes", + "type": "uint96" + } + ], + "internalType": "struct IGovernorCompatibilityBravoUpgradeable.Receipt", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "getVotesWithParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasVoted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "hashProposal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "lateQuorumVoteExtension", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalDeadline", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalEta", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalProposer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposals", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "eta", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "abstainVotes", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "canceled", + "type": "bool" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proposeStarted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "queue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "queue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "quorum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumDenominator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "relay", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "newVoteExtension", + "type": "uint64" + } + ], + "name": "setLateQuorumVoteExtension", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "setProposalThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "setVotingDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "setVotingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "state", + "outputs": [ + { + "internalType": "enum IGovernorUpgradeable.ProposalState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IERC5805Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "updateParam", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "updateQuorumNumerator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TimelockControllerUpgradeable", + "name": "newTimelock", + "type": "address" + } + ], + "name": "updateTimelock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "whitelistTargets", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/abi/bsctimelock.abi b/abi/bsctimelock.abi new file mode 100644 index 00000000..3300da24 --- /dev/null +++ b/abi/bsctimelock.abi @@ -0,0 +1,922 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "CallExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "CallSalt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "CallScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "Cancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldDuration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "MinDelayChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ParamChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "CANCELLER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXECUTOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROPOSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TIMELOCK_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "payload", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "executeBatch", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getMinDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "getTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperation", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperationBatch", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperation", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationDone", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationPending", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationReady", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "schedule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "scheduleBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "name": "updateDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "updateParam", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/abi/bscvalidatorset.abi b/abi/bscvalidatorset.abi index 207effaf..5226b4a2 100644 --- a/abi/bscvalidatorset.abi +++ b/abi/bscvalidatorset.abi @@ -519,6 +519,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -573,7 +586,7 @@ }, { "inputs": [], - "name": "INIT_FINALITY_REWARD_RATIO", + "name": "INIT_MAINTAIN_SLASH_SCALE", "outputs": [ { "internalType": "uint256", @@ -586,7 +599,7 @@ }, { "inputs": [], - "name": "INIT_MAINTAIN_SLASH_SCALE", + "name": "INIT_MAX_NUM_OF_MAINTAINING", "outputs": [ { "internalType": "uint256", @@ -599,7 +612,7 @@ }, { "inputs": [], - "name": "INIT_MAX_NUM_OF_MAINTAINING", + "name": "INIT_NUM_OF_CABINETS", "outputs": [ { "internalType": "uint256", @@ -612,7 +625,7 @@ }, { "inputs": [], - "name": "INIT_NUM_OF_CABINETS", + "name": "INIT_SYSTEM_REWARD_RATIO", "outputs": [ { "internalType": "uint256", @@ -675,6 +688,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "MAX_SYSTEM_REWARD_BALANCE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "PRECISION", @@ -727,6 +753,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", @@ -766,6 +805,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "SYSTEM_REWARD_RATIO_SCALE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "TOKEN_HUB_ADDR", @@ -978,6 +1030,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "currentVoteAddrFullSet", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1049,19 +1120,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "finalityRewardRatio", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -1248,6 +1306,38 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "voteAddr", + "type": "bytes" + } + ], + "name": "isMonitoredForMaliciousVote", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isSystemRewardIncluded", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1267,6 +1357,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + } + ], + "name": "jailValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "maintainSlashScale", @@ -1371,6 +1474,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "previousBalanceOfSystemReward", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "previousHeight", @@ -1384,6 +1500,38 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "previousVoteAddrFullSet", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "systemRewardRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "totalInComing", @@ -1415,6 +1563,29 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_consensusAddrs", + "type": "address[]" + }, + { + "internalType": "uint64[]", + "name": "_votingPowers", + "type": "uint64[]" + }, + { + "internalType": "bytes[]", + "name": "_voteAddrs", + "type": "bytes[]" + } + ], + "name": "updateValidatorSetV2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/crosschain.abi b/abi/crosschain.abi index d8f6c78a..8a276731 100644 --- a/abi/crosschain.abi +++ b/abi/crosschain.abi @@ -412,6 +412,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -568,6 +581,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", diff --git a/abi/govhub.abi b/abi/govhub.abi index cbd6ff0a..7ef0d844 100644 --- a/abi/govhub.abi +++ b/abi/govhub.abi @@ -135,6 +135,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -239,6 +252,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", @@ -428,5 +454,28 @@ ], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "updateParam", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ] \ No newline at end of file diff --git a/abi/govtoken.abi b/abi/govtoken.abi new file mode 100644 index 00000000..67f68af3 --- /dev/null +++ b/abi/govtoken.abi @@ -0,0 +1,789 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fromDelegate", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "toDelegate", + "type": "address" + } + ], + "name": "DelegateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegate", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "previousBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newBalance", + "type": "uint256" + } + ], + "name": "DelegateVotesChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ParamChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "CLOCK_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint32", + "name": "pos", + "type": "uint32" + } + ], + "name": "checkpoints", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "fromBlock", + "type": "uint32" + }, + { + "internalType": "uint224", + "name": "votes", + "type": "uint224" + } + ], + "internalType": "struct ERC20VotesUpgradeable.Checkpoint", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "clock", + "outputs": [ + { + "internalType": "uint48", + "name": "", + "type": "uint48" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "delegateBySig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "name": "delegateVote", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "delegates", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "getPastTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "timepoint", + "type": "uint256" + } + ], + "name": "getPastVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "mintedMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "numCheckpoints", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "stakeCredits", + "type": "address[]" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "sync", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/abi/relayerhub.abi b/abi/relayerhub.abi index b712a5c7..63ec8694 100644 --- a/abi/relayerhub.abi +++ b/abi/relayerhub.abi @@ -1,4 +1,30 @@ [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_addedManager", + "type": "address" + } + ], + "name": "managerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_removedManager", + "type": "address" + } + ], + "name": "managerRemoved", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -28,7 +54,7 @@ "type": "address" } ], - "name": "relayerRegister", + "name": "relayerAddedProvisionally", "type": "event" }, { @@ -44,6 +70,25 @@ "name": "relayerUnRegister", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_to", + "type": "address" + } + ], + "name": "relayerUpdated", + "type": "event" + }, { "inputs": [], "name": "BIND_CHANNELID", @@ -109,6 +154,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -226,6 +284,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", @@ -332,12 +403,12 @@ }, { "inputs": [], - "name": "alreadyInit", + "name": "WHITELIST_1", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], "stateMutability": "view", @@ -345,25 +416,51 @@ }, { "inputs": [], - "name": "bscChainID", + "name": "WHITELIST_2", "outputs": [ { - "internalType": "uint16", + "internalType": "address", "name": "", - "type": "uint16" + "type": "address" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "name": "acceptBeingRelayer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "dues", + "name": "alreadyInit", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bscChainID", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" } ], "stateMutability": "view", @@ -380,11 +477,11 @@ "inputs": [ { "internalType": "address", - "name": "sender", + "name": "managerAddress", "type": "address" } ], - "name": "isRelayer", + "name": "isManager", "outputs": [ { "internalType": "bool", @@ -396,25 +493,50 @@ "type": "function" }, { - "inputs": [], - "name": "register", - "outputs": [], - "stateMutability": "payable", + "inputs": [ + { + "internalType": "address", + "name": "relayerAddress", + "type": "address" + } + ], + "name": "isProvisionalRelayer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "requiredDeposit", + "inputs": [ + { + "internalType": "address", + "name": "relayerAddress", + "type": "address" + } + ], + "name": "isRelayer", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "removeManagerByHimself", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "unregister", @@ -439,5 +561,38 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "relayerToBeAdded", + "type": "address" + } + ], + "name": "updateRelayer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "whitelistInit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "whitelistInitDone", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" } ] \ No newline at end of file diff --git a/abi/relayerincentivize.abi b/abi/relayerincentivize.abi index 4cc97425..1abc3a1a 100644 --- a/abi/relayerincentivize.abi +++ b/abi/relayerincentivize.abi @@ -153,6 +153,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -296,6 +309,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", diff --git a/abi/slashindicator.abi b/abi/slashindicator.abi index 83152d12..d4612c70 100644 --- a/abi/slashindicator.abi +++ b/abi/slashindicator.abi @@ -30,6 +30,25 @@ "name": "failedFelony", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "voteAddrSlice", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "failReason", + "type": "bytes" + } + ], + "name": "failedMaliciousVoteSlash", + "type": "event" + }, { "anonymous": false, "inputs": [], @@ -49,6 +68,19 @@ "name": "knownResponse", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "voteAddrSlice", + "type": "bytes32" + } + ], + "name": "maliciousVoteSlashed", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -107,19 +139,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "BSC_RELAYER_REWARD", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "CODE_OK", @@ -198,6 +217,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -250,6 +282,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "INIT_MALICIOUS_VOTE_SLASH_SCOPE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "LIGHT_CLIENT_ADDR", @@ -315,6 +360,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", @@ -452,6 +510,37 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "name": "downtimeSlash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableMaliciousVoteSlash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "felonyThreshold", @@ -616,6 +705,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "maliciousVoteSlashScope", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "misdemeanorThreshold", @@ -668,6 +770,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "header1", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "header2", + "type": "bytes" + } + ], + "name": "submitDoubleSignEvidence", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/stakecredit.abi b/abi/stakecredit.abi new file mode 100644 index 00000000..ffebd6aa --- /dev/null +++ b/abi/stakecredit.abi @@ -0,0 +1,654 @@ +[ + { + "inputs": [], + "name": "Empty", + "type": "error" + }, + { + "inputs": [], + "name": "OutOfBounds", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ParamChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "rewardToAll", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "commission", + "type": "uint256" + } + ], + "name": "RewardReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "delegator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "number", + "type": "uint256" + } + ], + "name": "claim", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "delegate", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "commissionRate", + "type": "uint64" + } + ], + "name": "distributeReward", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getPooledBNB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "getPooledBNBByShares", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSelfDelegationBNB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + } + ], + "name": "getSharesByPooledBNB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_validator", + "type": "address" + }, + { + "internalType": "string", + "name": "_moniker", + "type": "string" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "lockedBNBs", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "slashBnbAmount", + "type": "uint256" + } + ], + "name": "slash", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalPooledBNB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "unbond", + "outputs": [ + { + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "unbondRequest", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "unlockTime", + "type": "uint256" + } + ], + "internalType": "struct StakeCredit.UnbondRequest", + "name": "", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "unbondSequence", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [ + { + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "validator", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/abi/stakehub.abi b/abi/stakehub.abi new file mode 100644 index 00000000..70605713 --- /dev/null +++ b/abi/stakehub.abi @@ -0,0 +1,1151 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + } + ], + "name": "Claimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "commissionRate", + "type": "uint64" + } + ], + "name": "CommissionRateEdited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newConsensusAddress", + "type": "address" + } + ], + "name": "ConsensusAddressEdited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + } + ], + "name": "Delegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "DescriptionEdited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "ParamChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "srcValidator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "dstValidator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + } + ], + "name": "Redelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "failReason", + "type": "bytes" + } + ], + "name": "RewardDistributeFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "reward", + "type": "uint256" + } + ], + "name": "RewardDistributed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bnbAmount", + "type": "uint256" + } + ], + "name": "Undelegated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "consensusAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "creditContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "voteAddress", + "type": "bytes" + } + ], + "name": "ValidatorCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "ValidatorEmptyJailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "ValidatorJailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "jailUntil", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "slashAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "enum StakeHub.SlashType", + "name": "slashType", + "type": "uint8" + } + ], + "name": "ValidatorSlashed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "ValidatorUnjailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "newVoteAddress", + "type": "bytes" + } + ], + "name": "VoteAddressEdited", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "addToBlackList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "assetProtector", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "blackList", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "requestNumber", + "type": "uint256" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "voteAddress", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "blsProof", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "uint64", + "name": "rate", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxRate", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxChangeRate", + "type": "uint64" + } + ], + "internalType": "struct StakeHub.Commission", + "name": "commission", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct StakeHub.Description", + "name": "description", + "type": "tuple" + } + ], + "name": "createValidator", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "delegateVotePower", + "type": "bool" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + } + ], + "name": "distributeReward", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + } + ], + "name": "doubleSignSlash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "downtimeJailTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + } + ], + "name": "downtimeSlash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "downtimeSlashAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint64", + "name": "commissionRate", + "type": "uint64" + } + ], + "name": "editCommissionRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newConsensusAddress", + "type": "address" + } + ], + "name": "editConsensusAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct StakeHub.Description", + "name": "description", + "type": "tuple" + } + ], + "name": "editDescription", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "newVoteAddress", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "blsProof", + "type": "bytes" + } + ], + "name": "editVoteAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "felonyJailTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "felonyPerDay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "felonySlashAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + } + ], + "name": "getOperatorAddressByConsensusAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "voteAddress", + "type": "bytes" + } + ], + "name": "getOperatorAddressByVoteAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "getValidatorBasicInfo", + "outputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "creditContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "voteAddress", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "jailUntil", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "getValidatorCommission", + "outputs": [ + { + "components": [ + { + "internalType": "uint64", + "name": "rate", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxRate", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "maxChangeRate", + "type": "uint64" + } + ], + "internalType": "struct StakeHub.Commission", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "getValidatorDescription", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "moniker", + "type": "string" + }, + { + "internalType": "string", + "name": "identity", + "type": "string" + }, + { + "internalType": "string", + "name": "website", + "type": "string" + }, + { + "internalType": "string", + "name": "details", + "type": "string" + } + ], + "internalType": "struct StakeHub.Description", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "limit", + "type": "uint256" + } + ], + "name": "getValidatorElectionInfo", + "outputs": [ + { + "internalType": "address[]", + "name": "consensusAddrs", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "votingPowers", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "voteAddrs", + "type": "bytes[]" + }, + { + "internalType": "uint256", + "name": "totalLength", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_voteAddr", + "type": "bytes" + } + ], + "name": "maliciousVoteSlash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "maxElectedValidators", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minDelegationBNBChange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minSelfDelegationBNB", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "numOfJailed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "srcValidator", + "type": "address" + }, + { + "internalType": "address", + "name": "dstValidator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateVotePower", + "type": "bool" + } + ], + "name": "redelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "removeFromBlackList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "operatorAddresses", + "type": "address[]" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "syncGovToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "transferGasLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unbondPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], + "name": "undelegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operatorAddress", + "type": "address" + } + ], + "name": "unjail", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "key", + "type": "string" + }, + { + "internalType": "bytes", + "name": "value", + "type": "bytes" + } + ], + "name": "updateParam", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] \ No newline at end of file diff --git a/abi/staking.abi b/abi/staking.abi index 495bd05b..6a4a03a9 100644 --- a/abi/staking.abi +++ b/abi/staking.abi @@ -580,6 +580,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -736,6 +749,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", diff --git a/abi/systemreward.abi b/abi/systemreward.abi index 352cd95f..321f4ca8 100644 --- a/abi/systemreward.abi +++ b/abi/systemreward.abi @@ -153,6 +153,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -257,6 +270,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", diff --git a/abi/tendermintlightclient.abi b/abi/tendermintlightclient.abi index 93dc47fc..d2fa7f17 100644 --- a/abi/tendermintlightclient.abi +++ b/abi/tendermintlightclient.abi @@ -112,6 +112,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "CROSS_STAKE_CHANNELID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "ERROR_FAIL_DECODE", @@ -125,6 +138,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -242,6 +268,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", @@ -255,6 +294,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKING_CONTRACT_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "SYSTEM_REWARD_ADDR", @@ -372,61 +424,20 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "initialHeight", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "latestHeight", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { "internalType": "uint64", - "name": "", + "name": "height", "type": "uint64" } ], - "name": "lightClientConsensusStates", + "name": "getAppHash", "outputs": [ - { - "internalType": "uint64", - "name": "preValidatorSetChangeHeight", - "type": "uint64" - }, - { - "internalType": "bytes32", - "name": "appHash", - "type": "bytes32" - }, { "internalType": "bytes32", - "name": "curValidatorSetHash", + "name": "", "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "nextValidatorSet", - "type": "bytes" } ], "stateMutability": "view", @@ -434,12 +445,12 @@ }, { "inputs": [], - "name": "rewardForValidatorSetChange", + "name": "getChainID", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], "stateMutability": "view", @@ -449,11 +460,11 @@ "inputs": [ { "internalType": "uint64", - "name": "", + "name": "height", "type": "uint64" } ], - "name": "submitters", + "name": "getSubmitter", "outputs": [ { "internalType": "address payable", @@ -472,27 +483,16 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "bytes", - "name": "header", - "type": "bytes" - }, - { - "internalType": "uint64", - "name": "height", - "type": "uint64" - } - ], - "name": "syncTendermintHeader", + "inputs": [], + "name": "initialHeight", "outputs": [ { - "internalType": "bool", + "internalType": "uint64", "name": "", - "type": "bool" + "type": "uint64" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -514,20 +514,61 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "latestHeight", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { "internalType": "uint64", - "name": "height", + "name": "", "type": "uint64" } ], - "name": "getAppHash", + "name": "lightClientConsensusStates", "outputs": [ + { + "internalType": "uint64", + "name": "preValidatorSetChangeHeight", + "type": "uint64" + }, { "internalType": "bytes32", - "name": "", + "name": "appHash", "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "curValidatorSetHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "nextValidatorSet", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rewardForValidatorSetChange", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" } ], "stateMutability": "view", @@ -537,11 +578,11 @@ "inputs": [ { "internalType": "uint64", - "name": "height", + "name": "", "type": "uint64" } ], - "name": "getSubmitter", + "name": "submitters", "outputs": [ { "internalType": "address payable", @@ -553,16 +594,27 @@ "type": "function" }, { - "inputs": [], - "name": "getChainID", + "inputs": [ + { + "internalType": "bytes", + "name": "header", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "height", + "type": "uint64" + } + ], + "name": "syncTendermintHeader", "outputs": [ { - "internalType": "string", + "internalType": "bool", "name": "", - "type": "string" + "type": "bool" } ], - "stateMutability": "view", + "stateMutability": "nonpayable", "type": "function" }, { diff --git a/abi/tokenhub.abi b/abi/tokenhub.abi index f8ede968..0a735463 100644 --- a/abi/tokenhub.abi +++ b/abi/tokenhub.abi @@ -390,6 +390,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -598,6 +611,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", diff --git a/abi/tokenmanager.abi b/abi/tokenmanager.abi index 11d7ea2a..93058047 100644 --- a/abi/tokenmanager.abi +++ b/abi/tokenmanager.abi @@ -350,6 +350,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GOVERNOR_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "GOV_CHANNELID", @@ -558,6 +571,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "STAKE_HUB_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_CHANNELID", diff --git a/contracts/BC_fusion/BSCGovernor.sol b/contracts/BC_fusion/BSCGovernor.sol new file mode 100644 index 00000000..5efee91a --- /dev/null +++ b/contracts/BC_fusion/BSCGovernor.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +import "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorSettingsUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/governance/compatibility/GovernorCompatibilityBravoUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol"; + +import "./System.sol"; +import "./lib/Utils.sol"; +import "./interface/IGovToken.sol"; + +contract BSCGovernor is + System, + Initializable, + GovernorUpgradeable, + GovernorSettingsUpgradeable, + GovernorCompatibilityBravoUpgradeable, + GovernorVotesUpgradeable, + GovernorTimelockControlUpgradeable, + GovernorVotesQuorumFractionUpgradeable, + GovernorPreventLateQuorumUpgradeable +{ + using Utils for bytes; + using Utils for string; + + /*----------------- constants -----------------*/ + uint256 private constant INIT_VOTING_DELAY = 24 hours; + uint256 private constant INIT_VOTING_PERIOD = 14 days; + uint256 private constant INIT_PROPOSAL_THRESHOLD = 100 ether; // = 100 BNB + uint256 private constant INIT_QUORUM_NUMERATOR = 10; // for >= 10% + + // starting propose requires totalSupply of GovBNB >= 10000000 * 1e18 + uint256 private constant PROPOSE_START_GOVBNB_SUPPLY_THRESHOLD = 10_000_000 ether; + // ensures there is a minimum voting period (1 days) after quorum is reached + uint64 private constant INIT_MIN_PERIOD_AFTER_QUORUM = uint64(1 days); + + /*----------------- errors -----------------*/ + error NotWhitelisted(); + error TotalSupplyNotEnough(); + + /*----------------- storage -----------------*/ + // target contract => is whitelisted for governance + mapping(address => bool) public whitelistTargets; + + bool public proposeStarted; + + /*----------------- init -----------------*/ + function initialize() external initializer onlyCoinbase onlyZeroGasPrice { + __Governor_init("BSCGovernor"); + __GovernorSettings_init(INIT_VOTING_DELAY, INIT_VOTING_PERIOD, INIT_PROPOSAL_THRESHOLD); + __GovernorCompatibilityBravo_init(); + __GovernorVotes_init(IVotesUpgradeable(GOV_TOKEN_ADDR)); + __GovernorTimelockControl_init(TimelockControllerUpgradeable(payable(TIMELOCK_ADDR))); + __GovernorVotesQuorumFraction_init(INIT_QUORUM_NUMERATOR); + __GovernorPreventLateQuorum_init(INIT_MIN_PERIOD_AFTER_QUORUM); + + whitelistTargets[VALIDATOR_CONTRACT_ADDR] = true; + whitelistTargets[SLASH_CONTRACT_ADDR] = true; + whitelistTargets[SYSTEM_REWARD_ADDR] = true; + whitelistTargets[LIGHT_CLIENT_ADDR] = true; + whitelistTargets[TOKEN_HUB_ADDR] = true; + whitelistTargets[INCENTIVIZE_ADDR] = true; + whitelistTargets[RELAYERHUB_CONTRACT_ADDR] = true; + whitelistTargets[GOV_HUB_ADDR] = true; + whitelistTargets[TOKEN_MANAGER_ADDR] = true; + whitelistTargets[CROSS_CHAIN_CONTRACT_ADDR] = true; + whitelistTargets[STAKING_CONTRACT_ADDR] = true; + whitelistTargets[STAKE_HUB_ADDR] = true; + whitelistTargets[GOVERNOR_ADDR] = true; + whitelistTargets[GOV_TOKEN_ADDR] = true; + whitelistTargets[TIMELOCK_ADDR] = true; + } + + /*----------------- external functions -----------------*/ + function propose( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + string memory description + ) + public + override(GovernorUpgradeable, GovernorCompatibilityBravoUpgradeable, IGovernorUpgradeable) + returns (uint256) + { + _checkAndStartPropose(); + + for (uint256 i = 0; i < targets.length; i++) { + if (!whitelistTargets[targets[i]]) revert NotWhitelisted(); + } + + return GovernorCompatibilityBravoUpgradeable.propose(targets, values, calldatas, description); + } + + function cancel( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) + public + override(GovernorUpgradeable, GovernorCompatibilityBravoUpgradeable, IGovernorUpgradeable) + returns (uint256) + { + return GovernorCompatibilityBravoUpgradeable.cancel(targets, values, calldatas, descriptionHash); + } + + /*----------------- system functions -----------------*/ + function updateParam(string calldata key, bytes calldata value) external onlyGov { + if (key.compareStrings("votingDelay")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newVotingDelay = value.bytesToUint256(32); + if (newVotingDelay == 0) revert InvalidValue(key, value); + _setVotingDelay(newVotingDelay); + } else if (key.compareStrings("votingPeriod")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newVotingPeriod = value.bytesToUint256(32); + if (newVotingPeriod == 0) revert InvalidValue(key, value); + _setVotingPeriod(newVotingPeriod); + } else if (key.compareStrings("proposalThreshold")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newProposalThreshold = value.bytesToUint256(32); + if (newProposalThreshold == 0) revert InvalidValue(key, value); + _setProposalThreshold(newProposalThreshold); + } else if (key.compareStrings("quorumNumerator")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newQuorumNumerator = value.bytesToUint256(32); + if (newQuorumNumerator == 0) revert InvalidValue(key, value); + _updateQuorumNumerator(newQuorumNumerator); + } else if (key.compareStrings("minPeriodAfterQuorum")) { + if (value.length != 8) revert InvalidValue(key, value); + uint64 newMinPeriodAfterQuorum = value.bytesToUint64(8); + if (newMinPeriodAfterQuorum == 0) revert InvalidValue(key, value); + _setLateQuorumVoteExtension(newMinPeriodAfterQuorum); + } else { + revert UnknownParam(key, value); + } + emit ParamChange(key, value); + } + + /*----------------- view functions -----------------*/ + function supportsInterface(bytes4 interfaceId) + public + view + override(GovernorUpgradeable, IERC165Upgradeable, GovernorTimelockControlUpgradeable) + returns (bool) + { + return GovernorTimelockControlUpgradeable.supportsInterface(interfaceId); + } + + function state(uint256 proposalId) + public + view + override(GovernorUpgradeable, IGovernorUpgradeable, GovernorTimelockControlUpgradeable) + returns (ProposalState) + { + return GovernorTimelockControlUpgradeable.state(proposalId); + } + + function proposalThreshold() + public + view + override(GovernorSettingsUpgradeable, GovernorUpgradeable) + returns (uint256) + { + return GovernorSettingsUpgradeable.proposalThreshold(); + } + + function proposalDeadline(uint256 proposalId) + public + view + override(IGovernorUpgradeable, GovernorUpgradeable, GovernorPreventLateQuorumUpgradeable) + returns (uint256) + { + return GovernorPreventLateQuorumUpgradeable.proposalDeadline(proposalId); + } + + /*----------------- internal functions -----------------*/ + function _checkAndStartPropose() internal { + if (!proposeStarted) { + if (IGovToken(GOV_TOKEN_ADDR).totalSupply() < PROPOSE_START_GOVBNB_SUPPLY_THRESHOLD) { + revert TotalSupplyNotEnough(); + } + proposeStarted = true; + } + } + + function _execute( + uint256 proposalId, + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) { + for (uint256 i = 0; i < targets.length; i++) { + if (!whitelistTargets[targets[i]]) revert NotWhitelisted(); + } + + GovernorTimelockControlUpgradeable._execute(proposalId, targets, values, calldatas, descriptionHash); + } + + function _cancel( + address[] memory targets, + uint256[] memory values, + bytes[] memory calldatas, + bytes32 descriptionHash + ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (uint256) { + return GovernorTimelockControlUpgradeable._cancel(targets, values, calldatas, descriptionHash); + } + + function _castVote( + uint256 proposalId, + address account, + uint8 support, + string memory reason, + bytes memory params + ) internal override(GovernorUpgradeable, GovernorPreventLateQuorumUpgradeable) returns (uint256) { + return GovernorPreventLateQuorumUpgradeable._castVote(proposalId, account, support, reason, params); + } + + function _executor() + internal + view + override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) + returns (address) + { + return GovernorTimelockControlUpgradeable._executor(); + } +} diff --git a/contracts/BC_fusion/BSCTimelock.sol b/contracts/BC_fusion/BSCTimelock.sol new file mode 100644 index 00000000..fef9dd1f --- /dev/null +++ b/contracts/BC_fusion/BSCTimelock.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +import "@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol"; + +import "./System.sol"; +import "./lib/Utils.sol"; + +contract BSCTimelock is System, Initializable, TimelockControllerUpgradeable { + using Utils for bytes; + using Utils for string; + + /*----------------- constants -----------------*/ + uint256 private constant INIT_MINIMAL_DELAY = 24 hours; + + /*----------------- init -----------------*/ + function initialize() external initializer onlyCoinbase onlyZeroGasPrice { + address[] memory _governor = new address[](1); + _governor[0] = GOVERNOR_ADDR; + __TimelockController_init(INIT_MINIMAL_DELAY, _governor, _governor, GOVERNOR_ADDR); + } + + /*----------------- system functions -----------------*/ + function updateParam(string calldata key, bytes calldata value) external onlyGov { + if (key.compareStrings("minDelay")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newMinDelay = value.bytesToUint256(32); + if (newMinDelay == 0 || newMinDelay > 14 days) revert InvalidValue(key, value); + this.updateDelay(newMinDelay); + } else { + revert UnknownParam(key, value); + } + emit ParamChange(key, value); + } +} diff --git a/contracts/BC_fusion/GovToken.sol b/contracts/BC_fusion/GovToken.sol new file mode 100644 index 00000000..4009cceb --- /dev/null +++ b/contracts/BC_fusion/GovToken.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol"; + +import "./System.sol"; +import "./interface/IStakeCredit.sol"; + +contract GovToken is + System, + Initializable, + ERC20Upgradeable, + ERC20BurnableUpgradeable, + ERC20PermitUpgradeable, + ERC20VotesUpgradeable +{ + /*----------------- constants -----------------*/ + string private constant NAME = "BSC Governance Token"; + string private constant SYMBOL = "govBNB"; + + /*----------------- errors -----------------*/ + error TransferNotAllowed(); + error ApproveNotAllowed(); + + /*----------------- storage -----------------*/ + // validator StakeCredit contract => user => amount + mapping(address => mapping(address => uint256)) public mintedMap; + + /*----------------- init -----------------*/ + function initialize() public initializer onlyCoinbase onlyZeroGasPrice { + __ERC20_init(NAME, SYMBOL); + __ERC20Burnable_init(); + __ERC20Permit_init(NAME); + __ERC20Votes_init(); + } + + /*----------------- external functions -----------------*/ + function sync(address stakeCredit, address account) external onlyStakeHub { + _sync(stakeCredit, account); + } + + function syncBatch(address[] calldata stakeCredits, address account) external onlyStakeHub { + uint256 _length = stakeCredits.length; + for (uint256 i = 0; i < _length; ++i) { + _sync(stakeCredits[i], account); + } + } + + function delegateVote(address delegator, address delegatee) external onlyStakeHub { + _delegate(delegator, delegatee); + } + + /*----------------- internal functions -----------------*/ + function _sync(address stakeCredit, address account) internal { + uint256 latestBNBAmount = IStakeCredit(stakeCredit).getPooledBNB(account); + uint256 _mintedAmount = mintedMap[stakeCredit][account]; + + if (_mintedAmount < latestBNBAmount) { + uint256 _needMint = latestBNBAmount - _mintedAmount; + mintedMap[stakeCredit][account] = latestBNBAmount; + _mint(account, _needMint); + } else if (_mintedAmount > latestBNBAmount) { + uint256 _needBurn = _mintedAmount - latestBNBAmount; + mintedMap[stakeCredit][account] = latestBNBAmount; + _burn(account, _needBurn); + } + } + + function _transfer(address, address, uint256) internal pure override { + revert TransferNotAllowed(); + } + + function _approve(address, address, uint256) internal pure override { + revert ApproveNotAllowed(); + } + + function _afterTokenTransfer( + address from, + address to, + uint256 amount + ) internal override(ERC20Upgradeable, ERC20VotesUpgradeable) { + ERC20VotesUpgradeable._afterTokenTransfer(from, to, amount); + } + + function _mint(address to, uint256 amount) internal override(ERC20Upgradeable, ERC20VotesUpgradeable) { + ERC20VotesUpgradeable._mint(to, amount); + } + + function _burn(address account, uint256 amount) internal override(ERC20Upgradeable, ERC20VotesUpgradeable) { + ERC20VotesUpgradeable._burn(account, amount); + } +} diff --git a/contracts/BC_fusion/StakeCredit.sol b/contracts/BC_fusion/StakeCredit.sol new file mode 100644 index 00000000..de708bf5 --- /dev/null +++ b/contracts/BC_fusion/StakeCredit.sol @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"; + +import "./System.sol"; +import "./interface/IStakeHub.sol"; + +contract StakeCredit is System, Initializable, ReentrancyGuardUpgradeable, ERC20Upgradeable { + using CountersUpgradeable for CountersUpgradeable.Counter; + using DoubleEndedQueueUpgradeable for DoubleEndedQueueUpgradeable.Bytes32Deque; + + /*----------------- constants -----------------*/ + uint256 private constant COMMISSION_RATE_BASE = 10_000; // 100% + + /*----------------- errors -----------------*/ + error TransferNotAllowed(); + error ApproveNotAllowed(); + error WrongInitContext(); + error TransferFailed(); + error ZeroAmount(); + error InsufficientBalance(); + error NoUnbondRequest(); + error NoClaimableUnbondRequest(); + + /*----------------- storage -----------------*/ + address public validator; // validator's operator address + uint256 public totalPooledBNB; // total reward plus total BNB staked in the pool + + // hash of the unbond request => unbond request + mapping(bytes32 => UnbondRequest) private _unbondRequests; + // delegator address => unbond request queue(hash of the request) + mapping(address => DoubleEndedQueueUpgradeable.Bytes32Deque) private _unbondRequestsQueue; + // delegator address => personal unbond sequence + mapping(address => CountersUpgradeable.Counter) private _unbondSequence; + + /*----------------- structs and events -----------------*/ + struct UnbondRequest { + uint256 shares; + uint256 bnbAmount; + uint256 unlockTime; + } + + event RewardReceived(uint256 rewardToAll, uint256 commission); + + /*----------------- init -----------------*/ + function initialize(address _validator, string calldata _moniker) external payable initializer onlyStakeHub { + string memory name_ = string.concat("Stake ", _moniker, " Credit"); + string memory symbol_ = string.concat("st", _moniker); + __ERC20_init_unchained(name_, symbol_); + + validator = _validator; + + _bootstrapInitialHolder(msg.value); + } + + /*----------------- external functions -----------------*/ + function delegate(address delegator) external payable onlyStakeHub returns (uint256 shares) { + if (msg.value == 0) revert ZeroAmount(); + shares = _mintAndSync(delegator, msg.value); + } + + function undelegate(address delegator, uint256 shares) external onlyStakeHub returns (uint256 bnbAmount) { + if (shares == 0) revert ZeroAmount(); + if (shares > balanceOf(delegator)) revert InsufficientBalance(); + + // add to the queue + bnbAmount = _burnAndSync(delegator, shares); + uint256 unlockTime = block.timestamp + IStakeHub(STAKE_HUB_ADDR).unbondPeriod(); + UnbondRequest memory request = UnbondRequest({ shares: shares, bnbAmount: bnbAmount, unlockTime: unlockTime }); + bytes32 hash = keccak256(abi.encodePacked(delegator, _useSequence(delegator))); + _unbondRequests[hash] = request; + _unbondRequestsQueue[delegator].pushBack(hash); + } + + /** + * @dev Unbond immediately without adding to the queue. + * Only for redelegate process. + */ + function unbond(address delegator, uint256 shares) external onlyStakeHub returns (uint256 bnbAmount) { + if (shares == 0) revert ZeroAmount(); + if (shares > balanceOf(delegator)) revert InsufficientBalance(); + + bnbAmount = _burnAndSync(delegator, shares); + + (bool success,) = STAKE_HUB_ADDR.call{ value: bnbAmount }(""); + if (!success) revert TransferFailed(); + } + + function claim(address payable delegator, uint256 number) external onlyStakeHub nonReentrant returns (uint256) { + // number == 0 means claim all + // number should not exceed the length of the queue + if (_unbondRequestsQueue[delegator].length() == 0) revert NoUnbondRequest(); + number = (number == 0 || number > _unbondRequestsQueue[delegator].length()) + ? _unbondRequestsQueue[delegator].length() + : number; + + uint256 _totalBnbAmount; + while (number != 0) { + bytes32 hash = _unbondRequestsQueue[delegator].front(); + UnbondRequest memory request = _unbondRequests[hash]; + if (block.timestamp < request.unlockTime) { + break; + } + + // remove from the queue + _unbondRequestsQueue[delegator].popFront(); + delete _unbondRequests[hash]; + + _totalBnbAmount += request.bnbAmount; + --number; + } + if (_totalBnbAmount == 0) revert NoClaimableUnbondRequest(); + + uint256 _gasLimit = IStakeHub(STAKE_HUB_ADDR).transferGasLimit(); + (bool success,) = delegator.call{ gas: _gasLimit, value: _totalBnbAmount }(""); + if (!success) revert TransferFailed(); + + return _totalBnbAmount; + } + + function distributeReward(uint64 commissionRate) external payable onlyStakeHub { + uint256 bnbAmount = msg.value; + uint256 _commission = (bnbAmount * uint256(commissionRate)) / COMMISSION_RATE_BASE; + uint256 _reward = bnbAmount - _commission; + totalPooledBNB += _reward; + + // mint commission to the validator + _mintAndSync(validator, _commission); + + emit RewardReceived(_reward, _commission); + } + + function slash(uint256 slashBnbAmount) external onlyStakeHub returns (uint256) { + uint256 selfDelegation = balanceOf(validator); + uint256 slashShares = getSharesByPooledBNB(slashBnbAmount); + + slashShares = slashShares > selfDelegation ? selfDelegation : slashShares; + uint256 realSlashBnbAmount = _burnAndSync(validator, slashShares); + + (bool success,) = SYSTEM_REWARD_ADDR.call{ value: realSlashBnbAmount }(""); + if (!success) revert TransferFailed(); + + return realSlashBnbAmount; + } + + /*----------------- view functions -----------------*/ + /** + * @return the amount of shares that corresponds to `_bnbAmount` protocol-controlled BNB. + */ + function getSharesByPooledBNB(uint256 bnbAmount) public view returns (uint256) { + if (totalPooledBNB == 0) { + return 0; + } + return (bnbAmount * totalSupply()) / totalPooledBNB; + } + + /** + * @return the amount of BNB that corresponds to `_sharesAmount` token shares. + */ + function getPooledBNBByShares(uint256 shares) public view returns (uint256) { + if (totalSupply() == 0) { + return 0; + } + return (shares * totalPooledBNB) / totalSupply(); + } + + function unbondRequest(address delegator, uint256 _index) public view returns (UnbondRequest memory, uint256) { + bytes32 hash = _unbondRequestsQueue[delegator].at(_index); + return (_unbondRequests[hash], _unbondRequestsQueue[delegator].length()); + } + + function lockedBNBs(address delegator) public view returns (uint256) { + uint256 length = _unbondRequestsQueue[delegator].length(); + if (length == 0) { + return 0; + } + + uint256 _totalBnbAmount; + for (uint256 i; i < length; ++i) { + bytes32 hash = _unbondRequestsQueue[delegator].front(); + UnbondRequest memory request = _unbondRequests[hash]; + _totalBnbAmount += request.bnbAmount; + } + return _totalBnbAmount; + } + + function unbondSequence(address delegator) public view returns (uint256) { + return _unbondSequence[delegator].current(); + } + + function getPooledBNB(address account) public view returns (uint256) { + return getPooledBNBByShares(balanceOf(account)); + } + + /*----------------- internal functions -----------------*/ + function _bootstrapInitialHolder(uint256 initAmount) internal onlyInitializing { + // check before mint + if (initAmount == 0 || validator == address(0) || totalSupply() != 0) revert WrongInitContext(); + + // mint initial tokens to the validator + // shares is equal to the amount of BNB staked + _mint(validator, initAmount); + totalPooledBNB = initAmount; + } + + function _mintAndSync(address account, uint256 bnbAmount) internal returns (uint256 shares) { + shares = getSharesByPooledBNB(bnbAmount); + _mint(account, shares); + totalPooledBNB += bnbAmount; + } + + function _burnAndSync(address account, uint256 shares) internal returns (uint256 bnbAmount) { + bnbAmount = getPooledBNBByShares(shares); + _burn(account, shares); + totalPooledBNB -= bnbAmount; + } + + function _useSequence(address delegator) internal returns (uint256 current) { + CountersUpgradeable.Counter storage sequence = _unbondSequence[delegator]; + current = sequence.current(); + sequence.increment(); + } + + function _transfer(address, address, uint256) internal pure override { + revert TransferNotAllowed(); + } + + function _approve(address, address, uint256) internal pure override { + revert ApproveNotAllowed(); + } +} diff --git a/contracts/BC_fusion/StakeHub.sol b/contracts/BC_fusion/StakeHub.sol new file mode 100644 index 00000000..96a185c3 --- /dev/null +++ b/contracts/BC_fusion/StakeHub.sol @@ -0,0 +1,802 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +import "./System.sol"; +import "./lib/Utils.sol"; +import "./interface/IBSCValidatorSet.sol"; +import "./interface/IGovToken.sol"; +import "./interface/IStakeCredit.sol"; + +contract StakeHub is System, Initializable { + using Utils for string; + using Utils for bytes; + using EnumerableSet for EnumerableSet.AddressSet; + + /*----------------- constants -----------------*/ + uint256 private constant BLS_PUBKEY_LENGTH = 48; + uint256 private constant BLS_SIG_LENGTH = 96; + + address private constant DEAD_ADDRESS = address(0xdead); + + //TODO + bytes private constant INIT_BC_CONSENSUS_ADDRESSES = + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000"; + bytes private constant INIT_BC_VOTE_ADDRESSES = + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000"; + + /*----------------- errors -----------------*/ + error StakeHubPaused(); + error InBlackList(); + error OnlyAssetProtector(); + error ValidatorExisted(); + error ValidatorNotExist(); + error ValidatorNotJailed(); + error DuplicateConsensusAddress(); + error DuplicateVoteAddress(); + error SelfDelegationNotEnough(); + error InvalidCommission(); + error InvalidMoniker(); + error InvalidVoteAddress(); + error InvalidConsensusAddress(); + error UpdateTooFrequently(); + error JailTimeNotExpired(); + error DelegationAmountTooSmall(); + error OnlySelfDelegation(); + error ZeroShares(); + error SameValidator(); + error NoMoreFelonyToday(); + error AlreadySlashed(); + + /*----------------- storage -----------------*/ + bool private _paused; + uint8 private _isRedelegating; + uint256 public transferGasLimit; + + // stake params + uint256 public minSelfDelegationBNB; + uint256 public minDelegationBNBChange; + uint256 public maxElectedValidators; + uint256 public unbondPeriod; + + // slash params + uint256 public downtimeSlashAmount; + uint256 public felonySlashAmount; + uint256 public downtimeJailTime; + uint256 public felonyJailTime; + + // validator operator address set + EnumerableSet.AddressSet private _validatorSet; + // validator operator address => validator info + mapping(address => Validator) private _validators; + // validator vote address => validator operator address + mapping(bytes => address) private _voteToOperator; + // validator consensus address => validator operator address + mapping(address => address) private _consensusToOperator; + // slash key => slash jail time + mapping(bytes32 => uint256) private _felonyRecords; + + // legacy addresses of BC + mapping(address => bool) private _legacyConsensusAddress; + mapping(bytes => bool) private _legacyVoteAddress; + + // total number of current jailed validators + uint256 public numOfJailed; + // max number of jailed validators per day(only for malicious vote and double sign) + uint256 private felonyPerDay; + // day => number of malicious vote and double sign slash + mapping(uint256 => uint256) private _felonyMap; + + address public assetProtector; + mapping(address => bool) public blackList; + + /*----------------- structs and events -----------------*/ + struct Validator { + address consensusAddress; + address operatorAddress; + address creditContract; + bytes voteAddress; + Description description; + Commission commission; + bool jailed; + uint256 jailUntil; + uint256 updateTime; + uint256[20] __reservedSlots; + } + + struct Description { + string moniker; + string identity; + string website; + string details; + } + + struct Commission { + uint64 rate; // the commission rate charged to delegators(10000 is 100%) + uint64 maxRate; // maximum commission rate which validator can ever charge + uint64 maxChangeRate; // maximum daily increase of the validator commission + } + + enum SlashType { + DoubleSign, + DownTime, + MaliciousVote + } + + event ValidatorCreated( + address indexed consensusAddress, + address indexed operatorAddress, + address indexed creditContract, + bytes voteAddress + ); + event ConsensusAddressEdited(address indexed operatorAddress, address indexed newConsensusAddress); + event CommissionRateEdited(address indexed operatorAddress, uint64 commissionRate); + event DescriptionEdited(address indexed operatorAddress); + event VoteAddressEdited(address indexed operatorAddress, bytes newVoteAddress); + event Delegated(address indexed operatorAddress, address indexed delegator, uint256 shares, uint256 bnbAmount); + event Undelegated(address indexed operatorAddress, address indexed delegator, uint256 shares, uint256 bnbAmount); + event Redelegated( + address indexed srcValidator, + address indexed dstValidator, + address indexed delegator, + uint256 oldShares, + uint256 newShares, + uint256 bnbAmount + ); + event RewardDistributed(address indexed operatorAddress, uint256 reward); + event RewardDistributeFailed(address indexed operatorAddress, bytes failReason); + event ValidatorSlashed( + address indexed operatorAddress, uint256 jailUntil, uint256 slashAmount, SlashType slashType + ); + event ValidatorJailed(address indexed operatorAddress); + event ValidatorEmptyJailed(address indexed operatorAddress); + event ValidatorUnjailed(address indexed operatorAddress); + event Claimed(address indexed operatorAddress, address indexed delegator, uint256 bnbAmount); + event Paused(); + event Resumed(); + + /*----------------- modifiers -----------------*/ + modifier validatorExist(address operatorAddress) { + if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExist(); + _; + } + + modifier whenNotPaused() { + if (_paused) revert StakeHubPaused(); + _; + } + + modifier onlyAssetProtector() { + if (msg.sender != assetProtector) revert OnlyAssetProtector(); + _; + } + + modifier notInBlackList() { + if (blackList[msg.sender]) revert InBlackList(); + _; + } + + receive() external payable { + // to prevent BNB from being lost + if (_isRedelegating != 1) revert(); + } + + /*----------------- init -----------------*/ + function initialize() external initializer onlyCoinbase onlyZeroGasPrice { + transferGasLimit = 5000; + minSelfDelegationBNB = 2_000 ether; + minDelegationBNBChange = 1 ether; + maxElectedValidators = 29; + unbondPeriod = 7 days; + downtimeSlashAmount = 10 ether; + felonySlashAmount = 200 ether; + downtimeJailTime = 2 days; + felonyJailTime = 30 days; + felonyPerDay = 2; + + address[] memory bcConsensusAddress; + bytes[] memory bcVoteAddress; + bcConsensusAddress = abi.decode(INIT_BC_CONSENSUS_ADDRESSES, (address[])); + bcVoteAddress = abi.decode(INIT_BC_VOTE_ADDRESSES, (bytes[])); + for (uint256 i; i < bcConsensusAddress.length; ++i) { + _legacyConsensusAddress[bcConsensusAddress[i]] = true; + } + for (uint256 i; i < bcVoteAddress.length; ++i) { + _legacyVoteAddress[bcVoteAddress[i]] = true; + } + + assetProtector = 0xdF87F0e2B8519Ea2DD4aBd8B639cdD628497eD25; // TODO + } + + /*----------------- external functions -----------------*/ + function createValidator( + address consensusAddress, + bytes calldata voteAddress, + bytes calldata blsProof, + Commission calldata commission, + Description calldata description + ) external payable whenNotPaused notInBlackList { + // basic check + address operatorAddress = msg.sender; + if (_validatorSet.contains(operatorAddress)) revert ValidatorExisted(); + if (_consensusToOperator[consensusAddress] != address(0) || _legacyConsensusAddress[consensusAddress]) { + revert DuplicateConsensusAddress(); + } + if (_voteToOperator[voteAddress] != address(0) || _legacyVoteAddress[voteAddress]) { + revert DuplicateVoteAddress(); + } + + uint256 delegation = msg.value; + if (delegation < minSelfDelegationBNB) revert SelfDelegationNotEnough(); + + if ( + commission.maxRate > 5_000 || commission.rate > commission.maxRate + || commission.maxChangeRate > commission.maxRate + ) revert InvalidCommission(); + if (!_checkMoniker(description.moniker)) revert InvalidMoniker(); + if (!_checkVoteAddress(voteAddress, blsProof)) revert InvalidVoteAddress(); + + // deploy stake credit proxy contract + address creditContract = _deployStakeCredit(operatorAddress, description.moniker); + + _validatorSet.add(operatorAddress); + Validator storage valInfo = _validators[operatorAddress]; + valInfo.consensusAddress = consensusAddress; + valInfo.operatorAddress = operatorAddress; + valInfo.creditContract = creditContract; + valInfo.voteAddress = voteAddress; + valInfo.description = description; + valInfo.commission = commission; + valInfo.updateTime = block.timestamp; + _consensusToOperator[consensusAddress] = operatorAddress; + _voteToOperator[voteAddress] = operatorAddress; + + emit ValidatorCreated(consensusAddress, operatorAddress, creditContract, voteAddress); + } + + function editConsensusAddress(address newConsensusAddress) + external + whenNotPaused + notInBlackList + validatorExist(msg.sender) + { + if (newConsensusAddress == address(0)) revert InvalidConsensusAddress(); + if (_consensusToOperator[newConsensusAddress] != address(0) || _legacyConsensusAddress[newConsensusAddress]) { + revert DuplicateConsensusAddress(); + } + + address operatorAddress = msg.sender; + Validator storage valInfo = _validators[operatorAddress]; + if (valInfo.updateTime + 1 days > block.timestamp) revert UpdateTooFrequently(); + + valInfo.consensusAddress = newConsensusAddress; + valInfo.updateTime = block.timestamp; + _consensusToOperator[newConsensusAddress] = operatorAddress; + + emit ConsensusAddressEdited(operatorAddress, newConsensusAddress); + } + + function editCommissionRate(uint64 commissionRate) + external + whenNotPaused + notInBlackList + validatorExist(msg.sender) + { + address operatorAddress = msg.sender; + Validator storage valInfo = _validators[operatorAddress]; + if (valInfo.updateTime + 1 days > block.timestamp) revert UpdateTooFrequently(); + + if (commissionRate > valInfo.commission.maxRate) revert InvalidCommission(); + uint256 changeRate = commissionRate >= valInfo.commission.rate + ? commissionRate - valInfo.commission.rate + : valInfo.commission.rate - commissionRate; + if (changeRate > valInfo.commission.maxChangeRate) revert InvalidCommission(); + + valInfo.commission.rate = commissionRate; + valInfo.updateTime = block.timestamp; + + emit CommissionRateEdited(operatorAddress, commissionRate); + } + + function editDescription(Description calldata description) + external + whenNotPaused + notInBlackList + validatorExist(msg.sender) + { + if (!_checkMoniker(description.moniker)) revert InvalidMoniker(); + + address operatorAddress = msg.sender; + Validator storage valInfo = _validators[operatorAddress]; + if (valInfo.updateTime + 1 days > block.timestamp) revert UpdateTooFrequently(); + + valInfo.description = description; + valInfo.updateTime = block.timestamp; + + emit DescriptionEdited(operatorAddress); + } + + function editVoteAddress( + bytes calldata newVoteAddress, + bytes calldata blsProof + ) external whenNotPaused notInBlackList validatorExist(msg.sender) { + if (!_checkVoteAddress(newVoteAddress, blsProof)) revert InvalidVoteAddress(); + if (_voteToOperator[newVoteAddress] != address(0) || _legacyVoteAddress[newVoteAddress]) { + revert DuplicateVoteAddress(); + } + + address operatorAddress = msg.sender; + Validator storage valInfo = _validators[operatorAddress]; + if (valInfo.updateTime + 1 days > block.timestamp) revert UpdateTooFrequently(); + + valInfo.voteAddress = newVoteAddress; + valInfo.updateTime = block.timestamp; + _voteToOperator[newVoteAddress] = operatorAddress; + + emit VoteAddressEdited(operatorAddress, newVoteAddress); + } + + function unjail(address operatorAddress) external whenNotPaused validatorExist(operatorAddress) { + Validator storage valInfo = _validators[operatorAddress]; + if (!valInfo.jailed) revert ValidatorNotJailed(); + + if (IStakeCredit(valInfo.creditContract).getPooledBNB(operatorAddress) < minSelfDelegationBNB) { + revert SelfDelegationNotEnough(); + } + if (valInfo.jailUntil > block.timestamp) revert JailTimeNotExpired(); + + valInfo.jailed = false; + numOfJailed -= 1; + emit ValidatorUnjailed(operatorAddress); + } + + function delegate( + address operatorAddress, + bool delegateVotePower + ) external payable whenNotPaused notInBlackList validatorExist(operatorAddress) { + uint256 bnbAmount = msg.value; + if (bnbAmount < minDelegationBNBChange) revert DelegationAmountTooSmall(); + + address delegator = msg.sender; + Validator memory valInfo = _validators[operatorAddress]; + if (valInfo.jailed && delegator != operatorAddress) revert OnlySelfDelegation(); + + uint256 shares = IStakeCredit(valInfo.creditContract).delegate{ value: bnbAmount }(delegator); + emit Delegated(operatorAddress, delegator, shares, bnbAmount); + + IGovToken(GOV_TOKEN_ADDR).sync(valInfo.creditContract, delegator); + if (delegateVotePower) { + IGovToken(GOV_TOKEN_ADDR).delegateVote(delegator, operatorAddress); + } + } + + function undelegate( + address operatorAddress, + uint256 shares + ) external whenNotPaused notInBlackList validatorExist(operatorAddress) { + if (shares == 0) revert ZeroShares(); + + address delegator = msg.sender; + Validator memory valInfo = _validators[operatorAddress]; + + uint256 bnbAmount = IStakeCredit(valInfo.creditContract).undelegate(delegator, shares); + emit Undelegated(operatorAddress, delegator, shares, bnbAmount); + + if (delegator == operatorAddress) { + _checkValidatorSelfDelegation(operatorAddress); + } + + IGovToken(GOV_TOKEN_ADDR).sync(valInfo.creditContract, delegator); + } + + function redelegate( + address srcValidator, + address dstValidator, + uint256 shares, + bool delegateVotePower + ) external whenNotPaused notInBlackList validatorExist(srcValidator) validatorExist(dstValidator) { + if (shares == 0) revert ZeroShares(); + if (srcValidator == dstValidator) revert SameValidator(); + + address delegator = msg.sender; + Validator memory srcValInfo = _validators[srcValidator]; + Validator memory dstValInfo = _validators[dstValidator]; + if (dstValInfo.jailed && delegator != dstValidator) revert OnlySelfDelegation(); + + _isRedelegating = 1; + uint256 bnbAmount = IStakeCredit(srcValInfo.creditContract).unbond(delegator, shares); + if (bnbAmount < minDelegationBNBChange) revert DelegationAmountTooSmall(); + uint256 newShares = IStakeCredit(dstValInfo.creditContract).delegate{ value: bnbAmount }(delegator); + _isRedelegating = 0; + emit Redelegated(srcValidator, dstValidator, delegator, shares, newShares, bnbAmount); + + if (delegator == srcValidator) { + _checkValidatorSelfDelegation(srcValidator); + } + + address[] memory stakeCredits = new address[](2); + stakeCredits[0] = srcValInfo.creditContract; + stakeCredits[1] = dstValInfo.creditContract; + IGovToken(GOV_TOKEN_ADDR).syncBatch(stakeCredits, delegator); + if (delegateVotePower) { + IGovToken(GOV_TOKEN_ADDR).delegateVote(delegator, dstValidator); + } + } + + /** + * @dev Claim the undelegated BNB from the pool after unbondPeriod + */ + function claim( + address operatorAddress, + uint256 requestNumber + ) external whenNotPaused notInBlackList validatorExist(operatorAddress) { + uint256 bnbAmount = IStakeCredit(_validators[operatorAddress].creditContract).claim(msg.sender, requestNumber); + emit Claimed(operatorAddress, msg.sender, bnbAmount); + } + + function syncGovToken( + address[] calldata operatorAddresses, + address account + ) external whenNotPaused notInBlackList { + uint256 _length = operatorAddresses.length; + address[] memory stakeCredits = new address[](_length); + address credit; + for (uint256 i = 0; i < _length; ++i) { + if (!_validatorSet.contains(operatorAddresses[i])) revert ValidatorNotExist(); // should never happen + credit = _validators[operatorAddresses[i]].creditContract; + stakeCredits[i] = credit; + } + + IGovToken(GOV_TOKEN_ADDR).syncBatch(stakeCredits, account); + } + + /*----------------- system functions -----------------*/ + /** + * @dev This function will be called by consensus engine. So it should never revert. + */ + function distributeReward(address consensusAddress) external payable onlyValidatorContract { + address operatorAddress = _consensusToOperator[consensusAddress]; + Validator memory valInfo = _validators[operatorAddress]; + if (valInfo.creditContract == address(0) || valInfo.jailed) { + emit RewardDistributeFailed(operatorAddress, "INVALID_VALIDATOR"); + return; + } + + IStakeCredit(valInfo.creditContract).distributeReward{ value: msg.value }(valInfo.commission.rate); + emit RewardDistributed(operatorAddress, msg.value); + } + + function downtimeSlash(address consensusAddress) external onlySlash { + address operatorAddress = _consensusToOperator[consensusAddress]; + if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExist(); // should never happen + Validator storage valInfo = _validators[operatorAddress]; + + // slash + uint256 slashAmount = IStakeCredit(valInfo.creditContract).slash(downtimeSlashAmount); + uint256 jailUntil = block.timestamp + downtimeJailTime; + _jailValidator(valInfo, jailUntil); + + emit ValidatorSlashed(operatorAddress, jailUntil, slashAmount, SlashType.DownTime); + + IGovToken(GOV_TOKEN_ADDR).sync(valInfo.creditContract, operatorAddress); + } + + function maliciousVoteSlash(bytes calldata _voteAddr) external onlySlash { + address operatorAddress = _voteToOperator[_voteAddr]; + if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExist(); // should never happen + Validator storage valInfo = _validators[operatorAddress]; + + uint256 dayIndex = block.timestamp / 1 days; + if (_felonyMap[dayIndex] >= felonyPerDay) revert NoMoreFelonyToday(); + _felonyMap[dayIndex] += 1; + + // slash + (bool canSlash, uint256 jailUntil) = _checkFelonyRecord(operatorAddress, SlashType.MaliciousVote); + if (!canSlash) revert AlreadySlashed(); + uint256 slashAmount = IStakeCredit(valInfo.creditContract).slash(felonySlashAmount); + _jailValidator(valInfo, jailUntil); + + emit ValidatorSlashed(operatorAddress, jailUntil, slashAmount, SlashType.MaliciousVote); + + IGovToken(GOV_TOKEN_ADDR).sync(valInfo.creditContract, operatorAddress); + } + + function doubleSignSlash(address consensusAddress) external onlySlash { + address operatorAddress = _consensusToOperator[consensusAddress]; + if (!_validatorSet.contains(operatorAddress)) revert ValidatorNotExist(); // should never happen + Validator storage valInfo = _validators[operatorAddress]; + + uint256 dayIndex = block.timestamp; + if (_felonyMap[dayIndex] >= felonyPerDay) revert NoMoreFelonyToday(); + _felonyMap[dayIndex] += 1; + + // slash + (bool canSlash, uint256 jailUntil) = _checkFelonyRecord(operatorAddress, SlashType.DoubleSign); + if (!canSlash) revert AlreadySlashed(); + uint256 slashAmount = IStakeCredit(valInfo.creditContract).slash(felonySlashAmount); + _jailValidator(valInfo, jailUntil); + + emit ValidatorSlashed(operatorAddress, jailUntil, slashAmount, SlashType.DoubleSign); + + IGovToken(GOV_TOKEN_ADDR).sync(valInfo.creditContract, operatorAddress); + } + + function pause() external onlyAssetProtector { + _paused = true; + emit Paused(); + } + + function resume() external onlyAssetProtector { + _paused = false; + emit Resumed(); + } + + function addToBlackList(address account) external onlyAssetProtector { + blackList[account] = true; + } + + function removeFromBlackList(address account) external onlyAssetProtector { + blackList[account] = false; + } + + function updateParam(string calldata key, bytes calldata value) external onlyGov { + if (key.compareStrings("transferGasLimit")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newTransferGasLimit = value.bytesToUint256(32); + if (newTransferGasLimit < 2300) revert InvalidValue(key, value); + transferGasLimit = newTransferGasLimit; + } else if (key.compareStrings("minSelfDelegationBNB")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newMinSelfDelegationBNB = value.bytesToUint256(32); + if (newMinSelfDelegationBNB < 1000 ether) revert InvalidValue(key, value); + minSelfDelegationBNB = newMinSelfDelegationBNB; + } else if (key.compareStrings("minDelegationBNBChange")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newMinDelegationBNBChange = value.bytesToUint256(32); + if (newMinDelegationBNBChange < 0.1 ether) revert InvalidValue(key, value); + minDelegationBNBChange = newMinDelegationBNBChange; + } else if (key.compareStrings("maxElectedValidators")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newMaxElectedValidators = value.bytesToUint256(32); + if (newMaxElectedValidators < 1 || newMaxElectedValidators > 500) revert InvalidValue(key, value); + maxElectedValidators = newMaxElectedValidators; + } else if (key.compareStrings("unbondPeriod")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newUnbondPeriod = value.bytesToUint256(32); + if (newUnbondPeriod < 3 days) revert InvalidValue(key, value); + unbondPeriod = newUnbondPeriod; + } else if (key.compareStrings("downtimeSlashAmount")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newDowntimeSlashAmount = value.bytesToUint256(32); + if (newDowntimeSlashAmount < 5 ether || newDowntimeSlashAmount > felonySlashAmount) { + revert InvalidValue(key, value); + } + downtimeSlashAmount = newDowntimeSlashAmount; + } else if (key.compareStrings("felonySlashAmount")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newFelonySlashAmount = value.bytesToUint256(32); + if (newFelonySlashAmount < 100 ether || newFelonySlashAmount <= downtimeSlashAmount) { + revert InvalidValue(key, value); + } + felonySlashAmount = newFelonySlashAmount; + } else if (key.compareStrings("downtimeJailTime")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newDowntimeJailTime = value.bytesToUint256(32); + if (newDowntimeJailTime < 2 days || newDowntimeJailTime >= felonyJailTime) revert InvalidValue(key, value); + downtimeJailTime = newDowntimeJailTime; + } else if (key.compareStrings("felonyJailTime")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newFelonyJailTime = value.bytesToUint256(32); + if (newFelonyJailTime < 10 days || newFelonyJailTime <= downtimeJailTime) revert InvalidValue(key, value); + felonyJailTime = newFelonyJailTime; + } else if (key.compareStrings("felonyPerDay")) { + if (value.length != 32) revert InvalidValue(key, value); + uint256 newJailedPerDay = value.bytesToUint256(32); + if (newJailedPerDay == 0) revert InvalidValue(key, value); + felonyPerDay = newJailedPerDay; + } else if (key.compareStrings("assetProtector")) { + if (value.length != 20) revert InvalidValue(key, value); + address newAssetProtector = value.bytesToAddress(20); + if (newAssetProtector == address(0)) revert InvalidValue(key, value); + assetProtector = newAssetProtector; + } else { + revert UnknownParam(key, value); + } + emit ParamChange(key, value); + } + + /*----------------- view functions -----------------*/ + function isPaused() external view returns (bool) { + return _paused; + } + + function getValidatorBasicInfo(address operatorAddress) + external + view + validatorExist(operatorAddress) + returns ( + address consensusAddress, + address creditContract, + bytes memory voteAddress, + bool jailed, + uint256 jailUntil + ) + { + Validator memory valInfo = _validators[operatorAddress]; + consensusAddress = valInfo.consensusAddress; + creditContract = valInfo.creditContract; + voteAddress = valInfo.voteAddress; + jailed = valInfo.jailed; + jailUntil = valInfo.jailUntil; + } + + function getValidatorDescription(address operatorAddress) + external + view + validatorExist(operatorAddress) + returns (Description memory) + { + return _validators[operatorAddress].description; + } + + function getValidatorCommission(address operatorAddress) + external + view + validatorExist(operatorAddress) + returns (Commission memory) + { + return _validators[operatorAddress].commission; + } + + function getValidatorElectionInfo( + uint256 offset, + uint256 limit + ) + external + view + returns ( + address[] memory consensusAddrs, + uint256[] memory votingPowers, + bytes[] memory voteAddrs, + uint256 totalLength + ) + { + totalLength = _validatorSet.length(); + if (offset >= totalLength) { + return (consensusAddrs, votingPowers, voteAddrs, totalLength); + } + + limit = limit == 0 ? totalLength : limit; + uint256 count = (totalLength - offset) > limit ? limit : (totalLength - offset); + consensusAddrs = new address[](count); + votingPowers = new uint256[](count); + voteAddrs = new bytes[](count); + for (uint256 i; i < count; ++i) { + address operatorAddress = _validatorSet.at(offset + i); + Validator memory valInfo = _validators[operatorAddress]; + consensusAddrs[i] = valInfo.consensusAddress; + votingPowers[i] = valInfo.jailed ? 0 : IStakeCredit(valInfo.creditContract).totalPooledBNB(); + voteAddrs[i] = valInfo.voteAddress; + } + } + + function getOperatorAddressByVoteAddress(bytes calldata voteAddress) external view returns (address) { + return _voteToOperator[voteAddress]; + } + + function getOperatorAddressByConsensusAddress(address consensusAddress) external view returns (address) { + return _consensusToOperator[consensusAddress]; + } + + /*----------------- internal functions -----------------*/ + function _checkMoniker(string memory moniker) internal pure returns (bool) { + bytes memory bz = bytes(moniker); + + // 1. moniker length should be between 3 and 9 + if (bz.length < 3 || bz.length > 9) { + return false; + } + + // 2. first character should be uppercase + if (uint8(bz[0]) < 65 || uint8(bz[0]) > 90) { + return false; + } + + // 3. only alphanumeric characters are allowed + for (uint256 i = 1; i < bz.length; ++i) { + // Check if the ASCII value of the character falls outside the range of alphanumeric characters + if ( + (uint8(bz[i]) < 48 || uint8(bz[i]) > 57) && (uint8(bz[i]) < 65 || uint8(bz[i]) > 90) + && (uint8(bz[i]) < 97 || uint8(bz[i]) > 122) + ) { + // Character is a special character + return false; + } + } + + // No special characters found + return true; + } + + function _checkVoteAddress(bytes calldata voteAddress, bytes calldata blsProof) internal view returns (bool) { + if (voteAddress.length != BLS_PUBKEY_LENGTH || blsProof.length != BLS_SIG_LENGTH) { + return false; + } + + // get msg hash + bytes32 msgHash = keccak256(abi.encodePacked(voteAddress, block.chainid)); + bytes memory msgBz = new bytes(32); + assembly { + mstore(add(msgBz, 32), msgHash) + } + + // call the precompiled contract to verify the BLS signature + // the precompiled contract's address is 0x66 + bytes memory input = bytes.concat(msgBz, blsProof, voteAddress); // length: 32 + 96 + 48 = 176 + bytes memory output = new bytes(1); + assembly { + let len := mload(input) + if iszero(staticcall(not(0), 0x66, add(input, 0x20), len, add(output, 0x20), 0x01)) { revert(0, 0) } + } + uint8 result = uint8(output[0]); + if (result != uint8(1)) { + return false; + } + return true; + } + + function _deployStakeCredit(address operatorAddress, string memory moniker) internal returns (address) { + address creditProxy = address(new TransparentUpgradeableProxy(STAKE_CREDIT_ADDR, DEAD_ADDRESS, "")); + IStakeCredit(creditProxy).initialize{ value: msg.value }(operatorAddress, moniker); + + return creditProxy; + } + + function _checkValidatorSelfDelegation(address operatorAddress) internal { + Validator storage valInfo = _validators[operatorAddress]; + if (valInfo.jailed) { + return; + } + if (IStakeCredit(valInfo.creditContract).getPooledBNB(operatorAddress) < minSelfDelegationBNB) { + _jailValidator(valInfo, 0); + // need to inform BSCValidatorSet contract to remove the validator + IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).jailValidator(valInfo.consensusAddress); + } + } + + function _checkFelonyRecord(address operatorAddress, SlashType slashType) internal returns (bool, uint256) { + bytes32 slashKey = keccak256(abi.encodePacked(operatorAddress, slashType)); + uint256 jailUntil = _felonyRecords[slashKey]; + // for double sign and malicious vote slash + // if the validator is already jailed, no need to slash again + if (jailUntil > block.timestamp) { + return (false, 0); + } + jailUntil = block.timestamp + felonyJailTime; + _felonyRecords[slashKey] = jailUntil; + return (true, jailUntil); + } + + function _jailValidator(Validator storage valInfo, uint256 jailUntil) internal { + // keep the last eligible validator + bool isLast = (numOfJailed >= _validatorSet.length() - 1); + if (isLast) { + emit ValidatorEmptyJailed(valInfo.operatorAddress); + return; + } + + if (jailUntil > valInfo.jailUntil) { + valInfo.jailUntil = jailUntil; + } + + if (!valInfo.jailed) { + valInfo.jailed = true; + numOfJailed += 1; + + emit ValidatorJailed(valInfo.operatorAddress); + } + } +} diff --git a/contracts/BC_fusion/System.sol b/contracts/BC_fusion/System.sol new file mode 100644 index 00000000..66d64e08 --- /dev/null +++ b/contracts/BC_fusion/System.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +contract System { + /*----------------- constants -----------------*/ + address internal constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000; + address internal constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001; + address internal constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002; + address internal constant LIGHT_CLIENT_ADDR = 0x0000000000000000000000000000000000001003; + address internal constant TOKEN_HUB_ADDR = 0x0000000000000000000000000000000000001004; + address internal constant INCENTIVIZE_ADDR = 0x0000000000000000000000000000000000001005; + address internal constant RELAYERHUB_CONTRACT_ADDR = 0x0000000000000000000000000000000000001006; + address internal constant GOV_HUB_ADDR = 0x0000000000000000000000000000000000001007; + address internal constant TOKEN_MANAGER_ADDR = 0x0000000000000000000000000000000000001008; + address internal constant CROSS_CHAIN_CONTRACT_ADDR = 0x0000000000000000000000000000000000002000; + address internal constant STAKING_CONTRACT_ADDR = 0x0000000000000000000000000000000000002001; + address internal constant STAKE_HUB_ADDR = 0x0000000000000000000000000000000000002002; + address internal constant STAKE_CREDIT_ADDR = 0x0000000000000000000000000000000000002003; + address internal constant GOVERNOR_ADDR = 0x0000000000000000000000000000000000002004; + address internal constant GOV_TOKEN_ADDR = 0x0000000000000000000000000000000000002005; + address internal constant TIMELOCK_ADDR = 0x0000000000000000000000000000000000002006; + + /*----------------- errors -----------------*/ + error UnknownParam(string key, bytes value); + error InvalidValue(string key, bytes value); + error OnlyCoinbase(); + error OnlyZeroGasPrice(); + error OnlySystemContract(address systemContract); + + /*----------------- events -----------------*/ + event ParamChange(string key, bytes value); + + /*----------------- modifiers -----------------*/ + modifier onlyCoinbase() { + if (msg.sender != block.coinbase) revert OnlyCoinbase(); + _; + } + + modifier onlyZeroGasPrice() { + if (tx.gasprice != 0) revert OnlyZeroGasPrice(); + _; + } + + modifier onlyValidatorContract() { + if (msg.sender != VALIDATOR_CONTRACT_ADDR) revert OnlySystemContract(VALIDATOR_CONTRACT_ADDR); + _; + } + + modifier onlySlash() { + if (msg.sender != SLASH_CONTRACT_ADDR) revert OnlySystemContract(SLASH_CONTRACT_ADDR); + _; + } + + modifier onlyGov() { + if (msg.sender != GOV_HUB_ADDR) revert OnlySystemContract(GOV_HUB_ADDR); + _; + } + + modifier onlyGovernor() { + if (msg.sender != GOVERNOR_ADDR) revert OnlySystemContract(GOVERNOR_ADDR); + _; + } + + modifier onlyStakeHub() { + if (msg.sender != STAKE_HUB_ADDR) revert OnlySystemContract(STAKE_HUB_ADDR); + _; + } +} diff --git a/contracts/BC_fusion/interface/IBSCValidatorSet.sol b/contracts/BC_fusion/interface/IBSCValidatorSet.sol new file mode 100644 index 00000000..bb9a4f94 --- /dev/null +++ b/contracts/BC_fusion/interface/IBSCValidatorSet.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +interface IBSCValidatorSet { + function jailValidator(address consensusAddress) external; +} diff --git a/contracts/BC_fusion/interface/IGovToken.sol b/contracts/BC_fusion/interface/IGovToken.sol new file mode 100644 index 00000000..ce1f4c7e --- /dev/null +++ b/contracts/BC_fusion/interface/IGovToken.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +interface IGovToken { + function totalSupply() external view returns (uint256); + function delegateVote(address delegator, address delegatee) external; + function sync(address stakeCredit, address account) external; + function syncBatch(address[] calldata stakeCredits, address account) external; +} diff --git a/contracts/BC_fusion/interface/IStakeCredit.sol b/contracts/BC_fusion/interface/IStakeCredit.sol new file mode 100644 index 00000000..6a0b1c0b --- /dev/null +++ b/contracts/BC_fusion/interface/IStakeCredit.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +interface IStakeCredit { + function initialize(address operatorAddress, string memory moniker) external payable; + function claim(address delegator, uint256 requestNumber) external returns (uint256); + function totalPooledBNB() external view returns (uint256); + function getPooledBNBByShares(uint256 shares) external view returns (uint256); + function getSharesByPooledBNB(uint256 bnbAmount) external view returns (uint256); + function delegate(address delegator) external payable returns (uint256); + function undelegate(address delegator, uint256 shares) external returns (uint256); + function unbond(address delegator, uint256 shares) external returns (uint256); + function distributeReward(uint64 commissionRate) external payable; + function slash(uint256 slashBnbAmount) external returns (uint256); + function balanceOf(address delegator) external view returns (uint256); + function totalSupply() external view returns (uint256); + function getPooledBNB(address account) external view returns (uint256); +} diff --git a/contracts/BC_fusion/interface/IStakeHub.sol b/contracts/BC_fusion/interface/IStakeHub.sol new file mode 100644 index 00000000..20ea1dc3 --- /dev/null +++ b/contracts/BC_fusion/interface/IStakeHub.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +interface IStakeHub { + function unbondPeriod() external view returns (uint256); + function transferGasLimit() external view returns (uint256); +} diff --git a/contracts/BC_fusion/lib/Utils.sol b/contracts/BC_fusion/lib/Utils.sol new file mode 100644 index 00000000..602cce4c --- /dev/null +++ b/contracts/BC_fusion/lib/Utils.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.17; + +library Utils { + function compareStrings(string memory a, string memory b) internal pure returns (bool) { + return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); + } + + function bytesToAddress(bytes memory _input, uint256 _offset) internal pure returns (address _output) { + assembly { + _output := mload(add(_input, _offset)) + } + } + + function bytesToUint256(bytes memory _input, uint256 _offset) internal pure returns (uint256 _output) { + assembly { + _output := mload(add(_input, _offset)) + } + } + + function bytesToUint64(bytes memory _input, uint256 _offset) internal pure returns (uint64 _output) { + assembly { + _output := mload(add(_input, _offset)) + } + } +} diff --git a/contracts/BSCValidatorSet.sol b/contracts/BSCValidatorSet.sol index 7f4d78db..584001fc 100644 --- a/contracts/BSCValidatorSet.sol +++ b/contracts/BSCValidatorSet.sol @@ -12,10 +12,14 @@ import "./interface/IRelayerHub.sol"; import "./interface/IParamSubscriber.sol"; import "./interface/IBSCValidatorSet.sol"; import "./interface/IApplication.sol"; +import "./interface/IStakeHub.sol"; import "./lib/SafeMath.sol"; import "./lib/RLPDecode.sol"; import "./lib/CmnPkg.sol"; +interface ICrossChain { + function registeredContractChannelMap(address, uint8) external view returns (bool); +} contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplication { @@ -88,6 +92,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica bytes[] public currentVoteAddrFullSet; bool public isSystemRewardIncluded; + // BEP-294 BC-fusion + Validator[] private _tmpMigratedValidatorSet; + bytes[] private _tmpMigratedVoteAddrs; + struct Validator { address consensusAddress; address payable feeAddress; @@ -181,7 +189,8 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica receive() external payable {} /*********************** Cross Chain App Implement **************************/ - function handleSynPackage(uint8, bytes calldata msgBytes) onlyInit onlyCrossChainContract initValidatorExtraSet external override returns(bytes memory responsePayload) { + // TODO: add `onlyCrossChainContract` + function handleSynPackage(uint8, bytes calldata msgBytes) onlyInit initValidatorExtraSet external override returns(bytes memory responsePayload) { (IbcValidatorSetPackage memory validatorSetPackage, bool ok) = decodeValidatorSetSynPackage(msgBytes); if (!ok) { return CmnPkg.encodeCommonAckPackage(ERROR_FAIL_DECODE); @@ -194,7 +203,13 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica emit failReasonWithStr("length of jail validators must be one"); resCode = ERROR_LEN_OF_VAL_MISMATCH; } else { - resCode = jailValidator(validatorSetPackage.validatorSet[0]); + uint256 index = currentValidatorSetMap[validatorSetPackage.validatorSet[0].consensusAddress]; + if (index==0 || currentValidatorSet[index-1].jailed) { + emit validatorEmptyJailed(validatorSetPackage.validatorSet[0].consensusAddress); + resCode = CODE_OK; + } else { + resCode = _jailValidator(index); + } } } else { resCode = ERROR_UNKNOWN_PACKAGE_TYPE; @@ -217,6 +232,83 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica } /*********************** External Functions **************************/ + /** + * @dev Update validator set method after fusion fork. + */ + function updateValidatorSetV2( + address[] memory _consensusAddrs, + uint64[] memory _votingPowers, + bytes[] memory _voteAddrs + ) public onlyCoinbase onlyZeroGasPrice { + uint256 _length = _consensusAddrs.length; + Validator[] memory _validatorSet = new Validator[](_length); + for (uint256 i; i < _length; ++i) { + _validatorSet[i] = Validator({ + consensusAddress: _consensusAddrs[i], + feeAddress: payable(address(0)), + BBCFeeAddress: address(0), + votingPower: _votingPowers[i], + jailed: false, + incoming: 0 + }); + } + + // if staking channel is not closed, store the migrated validator set and return + if (ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).registeredContractChannelMap(VALIDATOR_CONTRACT_ADDR, STAKING_CHANNELID)) { + uint256 newLength = _validatorSet.length; + if (newLength == 0) { + return; + } + uint256 oldLength = _tmpMigratedValidatorSet.length; + if (oldLength > newLength) { + for (uint256 i = newLength; i < oldLength; ++i) { + _tmpMigratedValidatorSet.pop(); + _tmpMigratedVoteAddrs.pop(); + } + } + + for (uint256 i; i < newLength; ++i) { + if (i >= oldLength) { + _tmpMigratedValidatorSet.push(_validatorSet[i]); + _tmpMigratedVoteAddrs.push(_voteAddrs[i]); + } else { + _tmpMigratedValidatorSet[i] = _validatorSet[i]; + _tmpMigratedVoteAddrs[i] = _voteAddrs[i]; + } + } + return; + } + + // step 0: force all maintaining validators to exit `Temporary Maintenance` + // - 1. validators exit maintenance + // - 2. clear all maintainInfo + // - 3. get unjailed validators from validatorSet + (Validator[] memory validatorSetTemp, bytes[] memory voteAddrsTemp) = _forceMaintainingValidatorsExit(_validatorSet, _voteAddrs); + + // step 1: distribute incoming + for (uint i; i < currentValidatorSet.length; ++i) { + if (currentValidatorSet[i].incoming != 0) { + IStakeHub(STAKE_HUB_ADDR).distributeReward{value : currentValidatorSet[i].incoming}(currentValidatorSet[i].consensusAddress); + } + } + + // step 2: do dusk transfer + if (address(this).balance>0) { + emit systemTransfer(address(this).balance); + address(uint160(SYSTEM_REWARD_ADDR)).transfer(address(this).balance); + } + + // step 3: do update validator set state + totalInComing = 0; + numOfJailed = 0; + if (validatorSetTemp.length != 0) { + doUpdateState(validatorSetTemp, voteAddrsTemp); + } + + // step 3: clean slash contract + ISlashIndicator(SLASH_CONTRACT_ADDR).clean(); + emit validatorSetUpdated(); + } /** * @dev Collect all fee of transactions from the current block and deposit it to the contract @@ -265,22 +357,33 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica } } - function jailValidator(Validator memory v) internal returns (uint32) { - uint256 index = currentValidatorSetMap[v.consensusAddress]; + function jailValidator(address consensusAddress) external onlyStakeHub { + for (uint256 i; i < _tmpMigratedValidatorSet.length; ++i) { + if (_tmpMigratedValidatorSet[i].consensusAddress == consensusAddress) { + _tmpMigratedValidatorSet[i].jailed = true; + break; + } + } + + uint256 index = currentValidatorSetMap[consensusAddress]; if (index==0 || currentValidatorSet[index-1].jailed) { - emit validatorEmptyJailed(v.consensusAddress); - return CODE_OK; + emit validatorEmptyJailed(consensusAddress); + } else { + _jailValidator(index); } + } + + function _jailValidator(uint256 index) internal returns (uint32) { uint n = currentValidatorSet.length; bool shouldKeep = (numOfJailed >= n-1); // will not jail if it is the last valid validator if (shouldKeep) { - emit validatorEmptyJailed(v.consensusAddress); + emit validatorEmptyJailed(currentValidatorSet[index-1].consensusAddress); return CODE_OK; } ++numOfJailed; currentValidatorSet[index-1].jailed = true; - emit validatorJailed(v.consensusAddress); + emit validatorJailed(currentValidatorSet[index-1].consensusAddress); return CODE_OK; } @@ -305,18 +408,36 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica // - 1. validators exit maintenance // - 2. clear all maintainInfo // - 3. get unjailed validators from validatorSet - (Validator[] memory validatorSetTemp, bytes[] memory voteAddrsTemp) = _forceMaintainingValidatorsExit(validatorSet, voteAddrs); + Validator[] memory validatorSetTemp; + bytes[] memory voteAddrsTemp; + { + // get migrated validators + Validator[] memory bscValidatorSet = _tmpMigratedValidatorSet; + bytes[] memory bscVoteAddrs = _tmpMigratedVoteAddrs; + for (uint256 i; i < bscValidatorSet.length; ++i) { + bscValidatorSet[i].votingPower = bscValidatorSet[i].votingPower * 2; // double the voting power + } + (Validator[] memory mergedValidators, bytes[] memory mergedVoteAddrs) = _mergeValidatorSet(validatorSet, voteAddrs, bscValidatorSet, bscVoteAddrs); + + (validatorSetTemp, voteAddrsTemp) = _forceMaintainingValidatorsExit(mergedValidators, mergedVoteAddrs); + } { //step 1: do calculate distribution, do not make it as an internal function for saving gas. uint crossSize; uint directSize; uint validatorsNum = currentValidatorSet.length; + uint8[] memory isMigrated = new uint8[](validatorsNum); for (uint i; i= DUSTY_INCOMING) { - ++crossSize; - } else if (currentValidatorSet[i].incoming > 0) { - ++directSize; + if (IStakeHub(STAKE_HUB_ADDR).getOperatorAddressByConsensusAddress(currentValidatorSet[i].consensusAddress) != address(0)) { + isMigrated[i] = 1; + if (currentValidatorSet[i].incoming != 0) { + ++ directSize; + } + } else if (currentValidatorSet[i].incoming >= DUSTY_INCOMING) { + ++ crossSize; + } else if (currentValidatorSet[i].incoming != 0) { + ++ directSize; } } @@ -336,8 +457,15 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica emit failReasonWithStr("fee is larger than DUSTY_INCOMING"); return ERROR_RELAYFEE_TOO_LARGE; } - for (uint i; i= DUSTY_INCOMING) { + for (uint i; i < validatorsNum; ++i) { + if (isMigrated[i] == 1) { + if (currentValidatorSet[i].incoming != 0) { + directAddrs[directSize] = payable(currentValidatorSet[i].consensusAddress); + directAmounts[directSize] = currentValidatorSet[i].incoming; + isMigrated[directSize] = 1; // directSize must be less than i. so we can use directSize as index + ++directSize; + } + } else if (currentValidatorSet[i].incoming >= DUSTY_INCOMING) { crossAddrs[crossSize] = currentValidatorSet[i].BBCFeeAddress; uint256 value = currentValidatorSet[i].incoming - currentValidatorSet[i].incoming % PRECISION; crossAmounts[crossSize] = value.sub(relayFee); @@ -345,9 +473,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica crossIndexes[crossSize] = i; crossTotal = crossTotal.add(value); ++crossSize; - } else if (currentValidatorSet[i].incoming > 0) { + } else if (currentValidatorSet[i].incoming != 0) { directAddrs[directSize] = currentValidatorSet[i].feeAddress; directAmounts[directSize] = currentValidatorSet[i].incoming; + isMigrated[directSize] = 0; ++directSize; } } @@ -383,13 +512,17 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica } // step 3: direct transfer - if (directAddrs.length>0) { - for (uint i; i 0) { + for (uint i; i < directAddrs.length; ++i) { + if (isMigrated[i] == 1) { + IStakeHub(STAKE_HUB_ADDR).distributeReward{value : directAmounts[i]}(directAddrs[i]); } else { - emit directTransferFail(directAddrs[i], directAmounts[i]); + bool success = directAddrs[i].send(directAmounts[i]); + if (success) { + emit directTransfer(directAddrs[i], directAmounts[i]); + } else { + emit directTransferFail(directAddrs[i], directAmounts[i]); + } } } } @@ -400,10 +533,11 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica emit systemTransfer(address(this).balance); address(uint160(SYSTEM_REWARD_ADDR)).transfer(address(this).balance); } + // step 5: do update validator set state totalInComing = 0; numOfJailed = 0; - if (validatorSetTemp.length>0) { + if (validatorSetTemp.length > 0) { doUpdateState(validatorSetTemp, voteAddrsTemp); } @@ -554,7 +688,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica uint256 totalValue; uint256 balanceOfSystemReward = address(SYSTEM_REWARD_ADDR).balance; if (balanceOfSystemReward > MAX_SYSTEM_REWARD_BALANCE) { - // when a slash happens, theres will no rewards in some epoches, + // when a slash happens, theres will no rewards in some epochs, // it's tolerated because slash happens rarely totalValue = balanceOfSystemReward.sub(MAX_SYSTEM_REWARD_BALANCE); } else { @@ -609,6 +743,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica workingValidatorCount = 1; } } + /*********************** For slash **************************/ function misdemeanor(address validator) external onlySlash initValidatorExtraSet override { uint256 validatorIndex = _misdemeanor(validator); @@ -660,7 +795,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica return true; } - /** * @dev Enter maintenance for current validators. refer to https://github.com/bnb-chain/BEPs/blob/master/BEP127.md * @@ -790,6 +924,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica validatorExtraSet[i].voteAddress = newVoteAddrs[i]; } currentValidatorSet[i].incoming = 0; + currentValidatorSet[i].jailed = newValidatorSet[i].jailed; } } @@ -960,6 +1095,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica currentValidatorSet.pop(); validatorExtraSet.pop(); + // averageDistribute*rest may less than income, but it is ok, the dust income will go to system reward eventually. uint256 averageDistribute = income / rest; if (averageDistribute != 0) { uint n = currentValidatorSet.length; @@ -967,7 +1103,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica currentValidatorSet[i].incoming = currentValidatorSet[i].incoming + averageDistribute; } } - // averageDistribute*rest may less than income, but it is ok, the dust income will go to system reward eventually. return true; } @@ -1054,7 +1189,11 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica isFelony = false; if (slashCount >= felonyThreshold) { _felony(validator, index); - ISlashIndicator(SLASH_CONTRACT_ADDR).sendFelonyPackage(validator); + if (IStakeHub(STAKE_HUB_ADDR).getOperatorAddressByConsensusAddress(validator) != address(0)) { + ISlashIndicator(SLASH_CONTRACT_ADDR).downtimeSlash(validator, slashCount); + } else { + ISlashIndicator(SLASH_CONTRACT_ADDR).sendFelonyPackage(validator); + } isFelony = true; } else if (slashCount >= misdemeanorThreshold) { _misdemeanor(validator); @@ -1063,6 +1202,59 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica emit validatorExitMaintenance(validator); } + function _mergeValidatorSet(Validator[] memory validatorSet1, bytes[] memory voteAddrSet1, Validator[] memory validatorSet2, bytes[] memory voteAddrSet2) internal view returns (Validator[] memory, bytes[] memory) { + uint256 _length = IStakeHub(STAKE_HUB_ADDR).maxElectedValidators(); + if (validatorSet1.length + validatorSet2.length < _length) { + _length = validatorSet1.length + validatorSet2.length; + } + Validator[] memory mergedValidatorSet = new Validator[](_length); + bytes[] memory mergedVoteAddrSet = new bytes[](_length); + + uint256 i; + uint256 j; + uint256 k; + while ((i < validatorSet1.length || j < validatorSet2.length) && k < _length) { + if (i == validatorSet1.length) { + mergedValidatorSet[k] = validatorSet2[j]; + mergedVoteAddrSet[k] = voteAddrSet2[j]; + ++j; + ++k; + continue; + } + + if (j == validatorSet2.length) { + mergedValidatorSet[k] = validatorSet1[i]; + mergedVoteAddrSet[k] = voteAddrSet1[i]; + ++i; + ++k; + continue; + } + + if (validatorSet1[i].votingPower > validatorSet2[j].votingPower) { + mergedValidatorSet[k] = validatorSet1[i]; + mergedVoteAddrSet[k] = voteAddrSet1[i]; + ++i; + } else if (validatorSet1[i].votingPower < validatorSet2[j].votingPower) { + mergedValidatorSet[k] = validatorSet2[j]; + mergedVoteAddrSet[k] = voteAddrSet2[j]; + ++j; + } else { + if (validatorSet1[i].consensusAddress < validatorSet2[j].consensusAddress) { + mergedValidatorSet[k] = validatorSet1[i]; + mergedVoteAddrSet[k] = voteAddrSet1[i]; + ++i; + } else { + mergedValidatorSet[k] = validatorSet2[j]; + mergedVoteAddrSet[k] = voteAddrSet2[j]; + ++j; + } + } + ++k; + } + + return (mergedValidatorSet, mergedVoteAddrSet); + } + //rlp encode & decode function function decodeValidatorSetSynPackage(bytes memory msgBytes) internal pure returns(IbcValidatorSetPackage memory, bool) { IbcValidatorSetPackage memory validatorSetPkg; diff --git a/contracts/CrossChain.sol b/contracts/CrossChain.sol index 45ce3d0d..63127701 100644 --- a/contracts/CrossChain.sol +++ b/contracts/CrossChain.sol @@ -17,7 +17,7 @@ contract CrossChain is System, ICrossChain, IParamSubscriber{ // constant variables string constant public STORE_NAME = "ibc"; - uint256 constant public CROSS_CHAIN_KEY_PREFIX = 0x0102ca00; // last 6 bytes + uint256 constant public CROSS_CHAIN_KEY_PREFIX = 0x01003800; // last 6 bytes uint8 constant public SYN_PACKAGE = 0x00; uint8 constant public ACK_PACKAGE = 0x01; uint8 constant public FAIL_ACK_PACKAGE = 0x02; diff --git a/contracts/GovHub.sol b/contracts/GovHub.sol index ddc3abf4..c05382c4 100644 --- a/contracts/GovHub.sol +++ b/contracts/GovHub.sol @@ -27,7 +27,8 @@ contract GovHub is System, IApplication{ address target; } - function handleSynPackage(uint8, bytes calldata msgBytes) onlyCrossChainContract external override returns(bytes memory responsePayload) { + //TODO: add onlyCrossChainContract + function handleSynPackage(uint8, bytes calldata msgBytes) external override returns(bytes memory responsePayload) { (ParamChangePackage memory proposal, bool success) = decodeSynPackage(msgBytes); if (!success) { return CmnPkg.encodeCommonAckPackage(ERROR_FAIL_DECODE); @@ -50,6 +51,11 @@ contract GovHub is System, IApplication{ require(false, "receive unexpected fail ack package"); } + function updateParam(string calldata key, bytes calldata value, address target) external onlyGovernor { + ParamChangePackage memory proposal = ParamChangePackage(key, value, target); + notifyUpdates(proposal); + } + function notifyUpdates(ParamChangePackage memory proposal) internal returns(uint32) { if (!isContract(proposal.target)) { @@ -89,4 +95,4 @@ contract GovHub is System, IApplication{ } return (pkg, success); } -} \ No newline at end of file +} diff --git a/contracts/SlashIndicator.sol b/contracts/SlashIndicator.sol index a2056d55..f13ba975 100644 --- a/contracts/SlashIndicator.sol +++ b/contracts/SlashIndicator.sol @@ -12,15 +12,18 @@ import "./interface/IBSCValidatorSet.sol"; import "./interface/IParamSubscriber.sol"; import "./interface/ICrossChain.sol"; import "./interface/ISystemReward.sol"; +import "./interface/IStakeHub.sol"; import "./lib/CmnPkg.sol"; import "./lib/RLPEncode.sol"; contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication{ using RLPEncode for *; - uint256 public constant MISDEMEANOR_THRESHOLD = 50; - uint256 public constant FELONY_THRESHOLD = 150; - uint256 public constant BSC_RELAYER_REWARD = 1e16; + // TODO: revert to 50 and 150 + // uint256 public constant MISDEMEANOR_THRESHOLD = 50; + // uint256 public constant FELONY_THRESHOLD = 150; + uint256 public constant MISDEMEANOR_THRESHOLD = 5; + uint256 public constant FELONY_THRESHOLD = 10; uint256 public constant DECREASE_RATE = 4; // State of the contract @@ -40,7 +43,7 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication bool public enableMaliciousVoteSlash; uint256 public constant INIT_MALICIOUS_VOTE_SLASH_SCOPE = 86400; // 3 days - + uint256 public maliciousVoteSlashScope; event validatorSlashed(address indexed validator); @@ -81,7 +84,7 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication _; previousHeight = block.number; } - + function init() external onlyNotInit{ misdemeanorThreshold = MISDEMEANOR_THRESHOLD; felonyThreshold = FELONY_THRESHOLD; @@ -130,8 +133,13 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication if (indicator.count % felonyThreshold == 0) { indicator.count = 0; IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(validator); - try ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(SLASH_CHANNELID, encodeSlashPackage(validator), 0) {} catch (bytes memory reason) { - emit failedFelony(validator, indicator.count, reason); + if (IStakeHub(STAKE_HUB_ADDR).getOperatorAddressByConsensusAddress(validator) != address(0)) { + _downtimeSlash(validator, indicator.count); + } else { + // send slash msg to bc if validator is not migrated + try ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(SLASH_CHANNELID, encodeSlashPackage(validator), 0) {} catch (bytes memory reason) { + emit failedFelony(validator, indicator.count, reason); + } } } else if (indicator.count % misdemeanorThreshold == 0) { IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).misdemeanor(validator); @@ -194,7 +202,21 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication emit indicatorCleaned(); } - function submitFinalityViolationEvidence(FinalityEvidence memory _evidence) public onlyInit onlyRelayer { + function downtimeSlash(address validator, uint256 count) external override onlyValidatorContract { + _downtimeSlash(validator, count); + } + + function _downtimeSlash(address validator, uint256 count) internal { + try IStakeHub(STAKE_HUB_ADDR).downtimeSlash(validator) { + } catch Error(string memory reason) { + emit failedFelony(validator, count, bytes(reason)); + } catch (bytes memory lowLevelData) { + emit failedFelony(validator, count, lowLevelData); + } + } + + //TODO: add onlyRelayer + function submitFinalityViolationEvidence(FinalityEvidence memory _evidence) public onlyInit { require(enableMaliciousVoteSlash, "malicious vote slash not enabled"); if (finalitySlashRewardRatio == 0) { finalitySlashRewardRatio = INIT_FINALITY_SLASH_REWARD_RATIO; @@ -220,8 +242,8 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication require(IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).isMonitoredForMaliciousVote(_evidence.voteAddr),"voteAddr is not found"); // BLS verification - require(verifyBLSSignature(_evidence.voteA, _evidence.voteAddr) && - verifyBLSSignature(_evidence.voteB, _evidence.voteAddr), "verify signature failed"); + require(_verifyBLSSignature(_evidence.voteA, _evidence.voteAddr) && + _verifyBLSSignature(_evidence.voteB, _evidence.voteAddr), "verify signature failed"); // reward sender and felony validator if validator found (address[] memory vals, bytes[] memory voteAddrs) = IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).getLivingValidators(); @@ -229,18 +251,64 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication if (BytesLib.equal(voteAddrs[i], _evidence.voteAddr)) { uint256 amount = (address(SYSTEM_REWARD_ADDR).balance * finalitySlashRewardRatio) / 100; ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(msg.sender, amount); - IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony( vals[i]); + IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(vals[i]); break; } } - // send slash msg to bc - bytes32 voteAddrSlice = BytesLib.toBytes32(_evidence.voteAddr,0); - try ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(SLASH_CHANNELID, encodeVoteSlashPackage(_evidence.voteAddr), 0) { - emit maliciousVoteSlashed(voteAddrSlice); - } catch (bytes memory reason) { - emit failedMaliciousVoteSlash(voteAddrSlice, reason); + if (IStakeHub(STAKE_HUB_ADDR).getOperatorAddressByVoteAddress(_evidence.voteAddr) != address(0)) { + IStakeHub(STAKE_HUB_ADDR).maliciousVoteSlash(_evidence.voteAddr); + } else { + // send slash msg to bc if the validator not migrated + bytes32 voteAddrSlice = BytesLib.toBytes32(_evidence.voteAddr,0); + try ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(SLASH_CHANNELID, encodeVoteSlashPackage(_evidence.voteAddr), 0) { + emit maliciousVoteSlashed(voteAddrSlice); + } catch (bytes memory reason) { + emit failedMaliciousVoteSlash(voteAddrSlice, reason); + } + } + } + + //TODO: add onlyRelayer + function submitDoubleSignEvidence(bytes memory header1, bytes memory header2) public onlyInit { + require(header1.length != 0 && header2.length != 0, "empty header"); + + bytes[] memory elements = new bytes[](3); + elements[0] = bscChainID.encodeUint(); + elements[1] = header1.encodeBytes(); + elements[2] = header2.encodeBytes(); + + // call precompile contract to verify evidence + bytes memory input = elements.encodeList(); + bytes memory output = new bytes(52); + assembly { + let len := mload(input) + if iszero(staticcall(not(0), 0x68, add(input, 0x20), len, add(output, 0x20), 0x34)) { + revert(0, 0) + } + } + + address signer; + uint256 evidenceTime; + assembly { + signer := mload(add(output, 0x14)) + evidenceTime := mload(add(output, 0x34)) } + require(IStakeHub(STAKE_HUB_ADDR).getOperatorAddressByConsensusAddress(signer) != address(0), "validator not migrated"); + require(evidenceTime + 21 days >= block.timestamp, "evidence too old"); + + // reward sender and felony validator if validator found + (address[] memory vals, ) = IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).getLivingValidators(); + for (uint i; i < vals.length; ++i) { + if (signer == vals[i]) { + uint256 amount = (address(SYSTEM_REWARD_ADDR).balance * finalitySlashRewardRatio) / 100; + ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(msg.sender, amount); + IBSCValidatorSet(VALIDATOR_CONTRACT_ADDR).felony(vals[i]); + break; + } + } + + IStakeHub(STAKE_HUB_ADDR).doubleSignSlash(signer); } /** @@ -252,7 +320,7 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(SLASH_CHANNELID, encodeSlashPackage(validator), 0); } - function verifyBLSSignature(VoteData memory vote, bytes memory voteAddr) internal view returns(bool) { + function _verifyBLSSignature(VoteData memory vote, bytes memory voteAddr) internal view returns(bool) { bytes[] memory elements = new bytes[](4); bytes memory _bytes = new bytes(32); elements[0] = vote.srcNum.encodeUint(); @@ -266,9 +334,9 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication // assemble input data bytes memory input = new bytes(176); - bytesConcat(input, _bytes, 0, 32); - bytesConcat(input, vote.sig, 32, 96); - bytesConcat(input, voteAddr, 128, 48); + _bytesConcat(input, _bytes, 0, 32); + _bytesConcat(input, vote.sig, 32, 96); + _bytesConcat(input, voteAddr, 128, 48); // call the precompiled contract to verify the BLS signature // the precompiled contract's address is 0x66 @@ -285,7 +353,7 @@ contract SlashIndicator is ISlashIndicator,System,IParamSubscriber, IApplication return true; } - function bytesConcat(bytes memory data, bytes memory _bytes, uint256 index, uint256 len) internal pure { + function _bytesConcat(bytes memory data, bytes memory _bytes, uint256 index, uint256 len) internal pure { for (uint i; i= minDelegation, "invalid delegate amount"); - require(msg.value >= amount.add(relayerFee), "not enough msg value"); - (bool success,) = msg.sender.call{gas: transferGas}(""); - require(success, "invalid delegator"); // the msg sender must be payable - - uint256 convertedAmount = amount.div(TEN_DECIMALS); // native bnb decimals is 8 on BBC, while the native bnb decimals on BSC is 18 - uint256 _relayerFee = (msg.value).sub(amount); - uint256 oracleRelayerFee = _relayerFee.sub(bSCRelayerFee); - - bytes[] memory elements = new bytes[](3); - elements[0] = msg.sender.encodeAddress(); - elements[1] = validator.encodeAddress(); - elements[2] = convertedAmount.encodeUint(); - bytes memory msgBytes = _RLPEncode(EVENT_DELEGATE, elements.encodeList()); - packageQueue[rightIndex] = keccak256(msgBytes); - ++rightIndex; - delegateInFly[msg.sender] += 1; - - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(CROSS_STAKE_CHANNELID, msgBytes, oracleRelayerFee.div(TEN_DECIMALS)); - payable(TOKEN_HUB_ADDR).transfer(amount.add(oracleRelayerFee)); - payable(SYSTEM_REWARD_ADDR).transfer(bSCRelayerFee); - - emit delegateSubmitted(msg.sender, validator, amount, oracleRelayerFee); + function delegate(address, uint256) override external payable { + revert("not supported"); } /** @@ -266,43 +241,10 @@ contract Staking is IStaking, System, IParamSubscriber, IApplication { } /** - * @dev Redelegate from validatorSrc to validatorDst on BC - * - * @param amount Amount that the user redelegates + * @dev Deprecated after fusion */ - function redelegate(address validatorSrc, address validatorDst, uint256 amount) override external noReentrant payable tenDecimalPrecision(amount) initParams { - require(validatorSrc != validatorDst, "invalid redelegation"); - require(msg.value >= relayerFee, "not enough relay fee"); - require(amount >= minDelegation, "invalid amount"); - require(block.timestamp >= pendingRedelegateTime[msg.sender][validatorSrc][validatorDst] && - block.timestamp >= pendingRedelegateTime[msg.sender][validatorDst][validatorSrc], "pending redelegation exist"); - uint256 remainBalance = delegatedOfValidator[msg.sender][validatorSrc].sub(amount, "not enough funds"); - if (remainBalance != 0) { - require(remainBalance > bSCRelayerFee, "insufficient balance after redelegate"); - } - - uint256 convertedAmount = amount.div(TEN_DECIMALS);// native bnb decimals is 8 on BBC, while the native bnb decimals on BSC is 18 - uint256 _relayerFee = msg.value; - uint256 oracleRelayerFee = _relayerFee.sub(bSCRelayerFee); - - bytes[] memory elements = new bytes[](4); - elements[0] = msg.sender.encodeAddress(); - elements[1] = validatorSrc.encodeAddress(); - elements[2] = validatorDst.encodeAddress(); - elements[3] = convertedAmount.encodeUint(); - bytes memory msgBytes = _RLPEncode(EVENT_REDELEGATE, elements.encodeList()); - packageQueue[rightIndex] = keccak256(msgBytes); - ++rightIndex; - redelegateInFly[msg.sender] += 1; - - pendingRedelegateTime[msg.sender][validatorDst][validatorSrc] = block.timestamp.add(LOCK_TIME); - pendingRedelegateTime[msg.sender][validatorSrc][validatorDst] = block.timestamp.add(LOCK_TIME); - - ICrossChain(CROSS_CHAIN_CONTRACT_ADDR).sendSynPackage(CROSS_STAKE_CHANNELID, msgBytes, oracleRelayerFee.div(TEN_DECIMALS)); - payable(TOKEN_HUB_ADDR).transfer(oracleRelayerFee); - payable(SYSTEM_REWARD_ADDR).transfer(bSCRelayerFee); - - emit redelegateSubmitted(msg.sender, validatorSrc, validatorDst, amount, oracleRelayerFee); + function redelegate(address, address, uint256) override external payable { + revert("not supported"); } /** diff --git a/contracts/System.sol b/contracts/System.sol index ad6d285d..984ada45 100644 --- a/contracts/System.sol +++ b/contracts/System.sol @@ -18,7 +18,7 @@ contract System { uint8 constant public GOV_CHANNELID = 0x09; uint8 constant public SLASH_CHANNELID = 0x0b; uint8 constant public CROSS_STAKE_CHANNELID = 0x10; - uint16 constant public bscChainID = 0x02ca; + uint16 constant public bscChainID = 0x0038; address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000; address public constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001; @@ -31,6 +31,8 @@ contract System { address public constant TOKEN_MANAGER_ADDR = 0x0000000000000000000000000000000000001008; address public constant CROSS_CHAIN_CONTRACT_ADDR = 0x0000000000000000000000000000000000002000; address public constant STAKING_CONTRACT_ADDR = 0x0000000000000000000000000000000000002001; + address public constant STAKE_HUB_ADDR = 0x0000000000000000000000000000000000002002; + address public constant GOVERNOR_ADDR = 0x0000000000000000000000000000000000002004; modifier onlyCoinbase() { require(msg.sender == block.coinbase, "the message sender must be the block producer"); @@ -92,6 +94,16 @@ contract System { _; } + modifier onlyStakeHub() { + require(msg.sender == STAKE_HUB_ADDR, "the msg sender must be stakeHub"); + _; + } + + modifier onlyGovernor() { + require(msg.sender == GOVERNOR_ADDR, "the msg sender must be governor contract"); + _; + } + // Not reliable, do not use when need strong verify function isContract(address addr) internal view returns (bool) { uint size; diff --git a/contracts/interface/ISlashIndicator.sol b/contracts/interface/ISlashIndicator.sol index 04f12b7d..879ad287 100644 --- a/contracts/interface/ISlashIndicator.sol +++ b/contracts/interface/ISlashIndicator.sol @@ -2,6 +2,7 @@ pragma solidity 0.6.4; interface ISlashIndicator { function clean() external; + function downtimeSlash(address validator, uint256 count) external; function sendFelonyPackage(address validator) external; function getSlashThresholds() external view returns (uint256, uint256); } diff --git a/contracts/interface/IStakeHub.sol b/contracts/interface/IStakeHub.sol new file mode 100644 index 00000000..c928e74e --- /dev/null +++ b/contracts/interface/IStakeHub.sol @@ -0,0 +1,11 @@ +pragma solidity 0.6.4; + +interface IStakeHub { + function downtimeSlash(address validator) external; + function maliciousVoteSlash(bytes calldata voteAddress) external; + function doubleSignSlash(address validator) external; + function getOperatorAddressByVoteAddress(bytes calldata voteAddress) external view returns (address); + function getOperatorAddressByConsensusAddress(address validator) external view returns (address); + function maxElectedValidators() external view returns (uint256); + function distributeReward(address validator) external payable; +} diff --git a/contracts/test/ABCToken.sol b/contracts/test/ABCToken.sol deleted file mode 100644 index 0e676b93..00000000 --- a/contracts/test/ABCToken.sol +++ /dev/null @@ -1,248 +0,0 @@ -pragma solidity 0.6.4; - -import "../interface/IBEP20.sol"; -import "openzeppelin-solidity/contracts/GSN/Context.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/access/Ownable.sol"; - -contract ABCToken is Context, IBEP20, Ownable { - using SafeMath for uint256; - - mapping (address => uint256) private _balances; - - mapping (address => mapping (address => uint256)) private _allowances; - - uint256 private _totalSupply; - uint8 public _decimals; - string public _symbol; - string public _name; - - constructor() public { - _name = "ABC token"; - _symbol = "ABC"; - _decimals = 18; - _totalSupply = 100000000000000000000000000; - _balances[msg.sender] = _totalSupply; - - emit Transfer(address(0), msg.sender, _totalSupply); - } - - /** - * @dev Returns the bep token owner. - */ - function getOwner() external override view returns (address) { - return owner(); - } - - /** - * @dev Returns the token decimals. - */ - function decimals() external override view returns (uint8) { - return _decimals; - } - - /** - * @dev Returns the token symbol. - */ - function symbol() external override view returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the token name. - */ - function name() external override view returns (string memory) { - return _name; - } - - /** - * @dev See {BEP20-totalSupply}. - */ - function totalSupply() external override view returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {BEP20-balanceOf}. - */ - function balanceOf(address account) external override view returns (uint256) { - return _balances[account]; - } - - /** - * @dev See {BEP20-transfer}. - * - * Requirements: - * - * - `recipient` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer(address recipient, uint256 amount) external override returns (bool) { - _transfer(_msgSender(), recipient, amount); - return true; - } - - /** - * @dev See {BEP20-allowance}. - */ - function allowance(address owner, address spender) external override view returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {BEP20-approve}. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) external override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /** - * @dev See {BEP20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {BEP20}; - * - * Requirements: - * - `sender` and `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - * - the caller must have allowance for `sender`'s tokens of at least - * `amount`. - */ - function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { - _transfer(sender, recipient, amount); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance")); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero")); - return true; - } - - /** - * @dev Moves tokens `amount` from `sender` to `recipient`. - * - * This is internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `sender` cannot be the zero address. - * - `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - */ - function _transfer(address sender, address recipient, uint256 amount) internal { - require(sender != address(0), "BEP20: transfer from the zero address"); - require(recipient != address(0), "BEP20: transfer to the zero address"); - - _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance"); - _balances[recipient] = _balances[recipient].add(amount); - emit Transfer(sender, recipient, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements - * - * - `to` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal { - require(account != address(0), "BEP20: mint to the zero address"); - - _totalSupply = _totalSupply.add(amount); - _balances[account] = _balances[account].add(amount); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal { - require(account != address(0), "BEP20: burn from the zero address"); - - _balances[account] = _balances[account].sub(amount, "BEP20: burn amount exceeds balance"); - _totalSupply = _totalSupply.sub(amount); - emit Transfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. - * - * This is internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve(address owner, address spender, uint256 amount) internal { - require(owner != address(0), "BEP20: approve from the zero address"); - require(spender != address(0), "BEP20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`.`amount` is then deducted - * from the caller's allowance. - * - * See {_burn} and {_approve}. - */ - function _burnFrom(address account, uint256 amount) internal { - _burn(account, amount); - _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance")); - } -} \ No newline at end of file diff --git a/contracts/test/DEFToken.sol b/contracts/test/DEFToken.sol deleted file mode 100644 index 25a71945..00000000 --- a/contracts/test/DEFToken.sol +++ /dev/null @@ -1,248 +0,0 @@ -pragma solidity 0.6.4; - -import "../interface/IBEP20.sol"; -import "openzeppelin-solidity/contracts/GSN/Context.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/access/Ownable.sol"; - -contract DEFToken is Context, IBEP20, Ownable { - using SafeMath for uint256; - - mapping (address => uint256) private _balances; - - mapping (address => mapping (address => uint256)) private _allowances; - - uint256 private _totalSupply; - uint8 public _decimals; - string public _symbol; - string public _name; - - constructor() public { - _name = "DEF token"; - _symbol = "DEF"; - _decimals = 18; - _totalSupply = 100000000000000000000000000; - _balances[msg.sender] = _totalSupply; - - emit Transfer(address(0), msg.sender, _totalSupply); - } - - /** - * @dev Returns the bep token owner. - */ - function getOwner() external override view returns (address) { - return owner(); - } - - /** - * @dev Returns the token decimals. - */ - function decimals() external override view returns (uint8) { - return _decimals; - } - - /** - * @dev Returns the token symbol. - */ - function symbol() external override view returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the token name. - */ - function name() external override view returns (string memory) { - return _name; - } - - /** - * @dev See {BEP20-totalSupply}. - */ - function totalSupply() external override view returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {BEP20-balanceOf}. - */ - function balanceOf(address account) external override view returns (uint256) { - return _balances[account]; - } - - /** - * @dev See {BEP20-transfer}. - * - * Requirements: - * - * - `recipient` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer(address recipient, uint256 amount) external override returns (bool) { - _transfer(_msgSender(), recipient, amount); - return true; - } - - /** - * @dev See {BEP20-allowance}. - */ - function allowance(address owner, address spender) external override view returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {BEP20-approve}. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) external override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /** - * @dev See {BEP20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {BEP20}; - * - * Requirements: - * - `sender` and `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - * - the caller must have allowance for `sender`'s tokens of at least - * `amount`. - */ - function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { - _transfer(sender, recipient, amount); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance")); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero")); - return true; - } - - /** - * @dev Moves tokens `amount` from `sender` to `recipient`. - * - * This is internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `sender` cannot be the zero address. - * - `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - */ - function _transfer(address sender, address recipient, uint256 amount) internal { - require(sender != address(0), "BEP20: transfer from the zero address"); - require(recipient != address(0), "BEP20: transfer to the zero address"); - - _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance"); - _balances[recipient] = _balances[recipient].add(amount); - emit Transfer(sender, recipient, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements - * - * - `to` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal { - require(account != address(0), "BEP20: mint to the zero address"); - - _totalSupply = _totalSupply.add(amount); - _balances[account] = _balances[account].add(amount); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal { - require(account != address(0), "BEP20: burn from the zero address"); - - _balances[account] = _balances[account].sub(amount, "BEP20: burn amount exceeds balance"); - _totalSupply = _totalSupply.sub(amount); - emit Transfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. - * - * This is internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve(address owner, address spender, uint256 amount) internal { - require(owner != address(0), "BEP20: approve from the zero address"); - require(spender != address(0), "BEP20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`.`amount` is then deducted - * from the caller's allowance. - * - * See {_burn} and {_approve}. - */ - function _burnFrom(address account, uint256 amount) internal { - _burn(account, amount); - _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance")); - } -} \ No newline at end of file diff --git a/contracts/test/MaliciousToken.sol b/contracts/test/MaliciousToken.sol deleted file mode 100644 index e4e09984..00000000 --- a/contracts/test/MaliciousToken.sol +++ /dev/null @@ -1,242 +0,0 @@ -pragma solidity 0.6.4; - -import "../interface/IBEP20.sol"; -import "openzeppelin-solidity/contracts/GSN/Context.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/access/Ownable.sol"; - -contract MaliciousToken is Context, IBEP20, Ownable { - using SafeMath for uint256; - - mapping (address => uint256) private _balances; - - mapping (address => mapping (address => uint256)) private _allowances; - - uint256 private _totalSupply; - uint8 public _decimals; - string public _symbol; - string public _name; - - constructor() public { - _name = "Malicious token"; - _symbol = "MALICIOU"; - _decimals = 18; - _totalSupply = 100000000000000000000000000; - _balances[msg.sender] = _totalSupply; - - emit Transfer(address(0), msg.sender, _totalSupply); - } - - /** - * @dev Returns the bep token owner. - */ - function getOwner() external override view returns (address) { - return owner(); - } - - /** - * @dev Returns the token decimals. - */ - function decimals() external override view returns (uint8) { - return _decimals; - } - - /** - * @dev Returns the token symbol. - */ - function symbol() external override view returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the token name. - */ - function name() external override view returns (string memory) { - return _name; - } - - /** - * @dev See {BEP20-totalSupply}. - */ - function totalSupply() external override view returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {BEP20-balanceOf}. - */ - function balanceOf(address account) external override view returns (uint256) { - return _balances[account]; - } - - /** - * @dev This is a malicious method. It is intended to stuck the transferIn channel - */ - function transfer(address, uint256) external override returns (bool) { - revert("malicious method"); - } - - /** - * @dev See {BEP20-allowance}. - */ - function allowance(address owner, address spender) external override view returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {BEP20-approve}. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) external override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /** - * @dev See {BEP20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {BEP20}; - * - * Requirements: - * - `sender` and `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - * - the caller must have allowance for `sender`'s tokens of at least - * `amount`. - */ - function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { - _transfer(sender, recipient, amount); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance")); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero")); - return true; - } - - /** - * @dev Moves tokens `amount` from `sender` to `recipient`. - * - * This is internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `sender` cannot be the zero address. - * - `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - */ - function _transfer(address sender, address recipient, uint256 amount) internal { - require(sender != address(0), "BEP20: transfer from the zero address"); - require(recipient != address(0), "BEP20: transfer to the zero address"); - - _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance"); - _balances[recipient] = _balances[recipient].add(amount); - emit Transfer(sender, recipient, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements - * - * - `to` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal { - require(account != address(0), "BEP20: mint to the zero address"); - - _totalSupply = _totalSupply.add(amount); - _balances[account] = _balances[account].add(amount); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal { - require(account != address(0), "BEP20: burn from the zero address"); - - _balances[account] = _balances[account].sub(amount, "BEP20: burn amount exceeds balance"); - _totalSupply = _totalSupply.sub(amount); - emit Transfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. - * - * This is internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve(address owner, address spender, uint256 amount) internal { - require(owner != address(0), "BEP20: approve from the zero address"); - require(spender != address(0), "BEP20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`.`amount` is then deducted - * from the caller's allowance. - * - * See {_burn} and {_approve}. - */ - function _burnFrom(address account, uint256 amount) internal { - _burn(account, amount); - _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance")); - } -} \ No newline at end of file diff --git a/contracts/test/MiniToken.sol b/contracts/test/MiniToken.sol deleted file mode 100644 index 5b71daa3..00000000 --- a/contracts/test/MiniToken.sol +++ /dev/null @@ -1,248 +0,0 @@ -pragma solidity 0.6.4; - -import "../interface/IBEP20.sol"; -import "openzeppelin-solidity/contracts/GSN/Context.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/access/Ownable.sol"; - -contract MiniToken is Context, IBEP20, Ownable { - using SafeMath for uint256; - - mapping (address => uint256) private _balances; - - mapping (address => mapping (address => uint256)) private _allowances; - - uint256 private _totalSupply; - uint8 public _decimals; - string public _symbol; - string public _name; - - constructor() public { - _name = "XYZ token"; - _symbol = "XYZ"; - _decimals = 18; - _totalSupply = 10000000000000000000000; - _balances[msg.sender] = _totalSupply; - - emit Transfer(address(0), msg.sender, _totalSupply); - } - - /** - * @dev Returns the bep token owner. - */ - function getOwner() external override view returns (address) { - return owner(); - } - - /** - * @dev Returns the token decimals. - */ - function decimals() external override view returns (uint8) { - return _decimals; - } - - /** - * @dev Returns the token symbol. - */ - function symbol() external override view returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the token name. - */ - function name() external override view returns (string memory) { - return _name; - } - - /** - * @dev See {BEP20-totalSupply}. - */ - function totalSupply() external override view returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {BEP20-balanceOf}. - */ - function balanceOf(address account) external override view returns (uint256) { - return _balances[account]; - } - - /** - * @dev See {BEP20-transfer}. - * - * Requirements: - * - * - `recipient` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer(address recipient, uint256 amount) external override returns (bool) { - _transfer(_msgSender(), recipient, amount); - return true; - } - - /** - * @dev See {BEP20-allowance}. - */ - function allowance(address owner, address spender) external override view returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {BEP20-approve}. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) external override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /** - * @dev See {BEP20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {BEP20}; - * - * Requirements: - * - `sender` and `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - * - the caller must have allowance for `sender`'s tokens of at least - * `amount`. - */ - function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { - _transfer(sender, recipient, amount); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance")); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero")); - return true; - } - - /** - * @dev Moves tokens `amount` from `sender` to `recipient`. - * - * This is internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `sender` cannot be the zero address. - * - `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - */ - function _transfer(address sender, address recipient, uint256 amount) internal { - require(sender != address(0), "BEP20: transfer from the zero address"); - require(recipient != address(0), "BEP20: transfer to the zero address"); - - _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance"); - _balances[recipient] = _balances[recipient].add(amount); - emit Transfer(sender, recipient, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements - * - * - `to` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal { - require(account != address(0), "BEP20: mint to the zero address"); - - _totalSupply = _totalSupply.add(amount); - _balances[account] = _balances[account].add(amount); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal { - require(account != address(0), "BEP20: burn from the zero address"); - - _balances[account] = _balances[account].sub(amount, "BEP20: burn amount exceeds balance"); - _totalSupply = _totalSupply.sub(amount); - emit Transfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. - * - * This is internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve(address owner, address spender, uint256 amount) internal { - require(owner != address(0), "BEP20: approve from the zero address"); - require(spender != address(0), "BEP20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`.`amount` is then deducted - * from the caller's allowance. - * - * See {_burn} and {_approve}. - */ - function _burnFrom(address account, uint256 amount) internal { - _burn(account, amount); - _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance")); - } -} \ No newline at end of file diff --git a/contracts/test/XYZToken.sol b/contracts/test/XYZToken.sol deleted file mode 100644 index 47c16900..00000000 --- a/contracts/test/XYZToken.sol +++ /dev/null @@ -1,298 +0,0 @@ -pragma solidity 0.6.4; - -import "../interface/IBEP20.sol"; -import "openzeppelin-solidity/contracts/GSN/Context.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/access/Ownable.sol"; - -contract XYZToken is Context, IBEP20, Ownable { - using SafeMath for uint256; - - mapping (address => uint256) private _balances; - - mapping (address => mapping (address => uint256)) private _allowances; - - uint256 private _totalSupply; - uint8 private _decimals; - string private _symbol; - string private _name; - - constructor() public { - _name = "XYZ token"; - _symbol = "XYZ"; - _decimals = 18; - _totalSupply = 100000000000000000000000000; - _balances[msg.sender] = _totalSupply; - - emit Transfer(address(0), msg.sender, _totalSupply); - } - - /** - * @dev Just for test - * - * - `newName` new name - */ - function setName(string calldata newName) external { - _name = newName; - } - - /** - * @dev Just for test - * - * - `newDecimals` new decimals - */ - function setDecimals(uint8 newDecimals) external { - _decimals = newDecimals; - } - - /** - * @dev Just for test - * - * - `newTotalSupply` new totalSupply - */ - function setTotalSupply(uint256 newTotalSupply) external { - _totalSupply = newTotalSupply; - } - - - /** - * @dev Just for test - * - * - `newSymbol` new symbol - */ - function setSymbol(string calldata newSymbol) external { - _symbol = newSymbol; - } - - /** - * @dev Returns the bep token owner. - */ - function getOwner() external override view returns (address) { - return owner(); - } - - /** - * @dev Returns the token decimals. - */ - function decimals() external override view returns (uint8) { - return _decimals; - } - - /** - * @dev Returns the token symbol. - */ - function symbol() external override view returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the token name. - */ - function name() external override view returns (string memory) { - return _name; - } - - /** - * @dev See {BEP20-totalSupply}. - */ - function totalSupply() external override view returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {BEP20-balanceOf}. - */ - function balanceOf(address account) external override view returns (uint256) { - return _balances[account]; - } - - /** - * @dev See {BEP20-transfer}. - * - * Requirements: - * - * - `recipient` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer(address recipient, uint256 amount) external override returns (bool) { - _transfer(_msgSender(), recipient, amount); - return true; - } - - /** - * @dev See {BEP20-allowance}. - */ - function allowance(address owner, address spender) external override view returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {BEP20-approve}. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) external override returns (bool) { - _approve(_msgSender(), spender, amount); - return true; - } - - /** - * @dev See {BEP20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {BEP20}; - * - * Requirements: - * - `sender` and `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - * - the caller must have allowance for `sender`'s tokens of at least - * `amount`. - */ - function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { - _transfer(sender, recipient, amount); - _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance")); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {BEP20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { - _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero")); - return true; - } - - /** - * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing - * the total supply. - * - * Requirements - * - * - `msg.sender` must be the token owner - */ - function mint(uint256 amount) public onlyOwner returns (bool) { - _mint(_msgSender(), amount); - return true; - } - - /** - * @dev Moves tokens `amount` from `sender` to `recipient`. - * - * This is internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `sender` cannot be the zero address. - * - `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - */ - function _transfer(address sender, address recipient, uint256 amount) internal { - require(sender != address(0), "BEP20: transfer from the zero address"); - require(recipient != address(0), "BEP20: transfer to the zero address"); - - _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance"); - _balances[recipient] = _balances[recipient].add(amount); - emit Transfer(sender, recipient, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements - * - * - `to` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal { - require(account != address(0), "BEP20: mint to the zero address"); - - _totalSupply = _totalSupply.add(amount); - _balances[account] = _balances[account].add(amount); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal { - require(account != address(0), "BEP20: burn from the zero address"); - - _balances[account] = _balances[account].sub(amount, "BEP20: burn amount exceeds balance"); - _totalSupply = _totalSupply.sub(amount); - emit Transfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. - * - * This is internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve(address owner, address spender, uint256 amount) internal { - require(owner != address(0), "BEP20: approve from the zero address"); - require(spender != address(0), "BEP20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`.`amount` is then deducted - * from the caller's allowance. - * - * See {_burn} and {_approve}. - */ - function _burnFrom(address account, uint256 amount) internal { - _burn(account, amount); - _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance")); - } -} \ No newline at end of file diff --git a/flatten.sh b/flatten.sh deleted file mode 100644 index c1bbebcd..00000000 --- a/flatten.sh +++ /dev/null @@ -1,11 +0,0 @@ -forge flatten contracts/BSCValidatorSet.sol > contracts/flattened/BSCValidatorSet.sol -forge flatten contracts/GovHub.sol > contracts/flattened/GovHub.sol -forge flatten contracts/RelayerHub.sol > contracts/flattened/RelayerHub.sol -forge flatten contracts/RelayerIncentivize.sol > contracts/flattened/RelayerIncentivize.sol -forge flatten contracts/SlashIndicator.sol > contracts/flattened/SlashIndicator.sol -forge flatten contracts/SystemReward.sol > contracts/flattened/SystemReward.sol -forge flatten contracts/TendermintLightClient.sol > contracts/flattened/TendermintLightClient.sol -forge flatten contracts/TokenHub.sol > contracts/flattened/TokenHub.sol -forge flatten contracts/CrossChain.sol > contracts/flattened/CrossChain.sol -forge flatten contracts/TokenManager.sol > contracts/flattened/TokenManager.sol -forge flatten contracts/Staking.sol > contracts/flattened/Staking.sol \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index c088dcf3..61c52666 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,14 +1,13 @@ [profile.default] src = 'contracts' test = 'test' -script = 'script' +script = 'foundry-script' out = 'out' fs_permissions = [{ access = "read-write", path = "./out" }] libs = ['lib', 'node_modules'] remappings = [ 'ds-test/=lib/forge-std/lib/ds-test/src/', 'forge-std/=lib/forge-std/src/', - 'openzeppelin-solidity/=node_modules/openzeppelin-solidity/', ] cache = true cache_path = 'cache' @@ -16,7 +15,7 @@ auto_detect_solc = true optimizer = true optimizer_runs = 200 verbosity = 3 -ignored_error_codes = [1878, 5574, 5667] +ignored_error_codes = [1878, 5574] ffi = true initial_balance = '0xffffffffffffffffffffffff' bytecode_hash = 'none' @@ -26,16 +25,17 @@ chains = 'all' endpoints = 'all' [fuzz] -runs = 1024 +runs = 512 [fmt] line_length = 120 tab_width = 4 -bracket_spacing = false +bracket_spacing = true int_types = 'long' func_attrs_with_params_multiline = true quote_style = 'double' number_underscore = 'preserve' +multiline_func_header = 'params_first' [rpc_endpoints] bsc = "${RPC_BSC}" # set by .env diff --git a/genesis-template.json b/genesis-template.json index 6c5f8ad6..47433d3e 100644 --- a/genesis-template.json +++ b/genesis-template.json @@ -24,7 +24,9 @@ "berlinBlock": 8, "londonBlock": 8, "hertzBlock": 8, - "fusionBlock": 9, + "shanghaiTime": 0, + "keplerTime": 0, + "fusionTime": 0, "parlia": { "period": 3, "epoch": 200 @@ -85,6 +87,26 @@ "balance": "0x0", "code": "{{staking}}" }, + "0x0000000000000000000000000000000000002002": { + "balance": "0x0", + "code": "{{stakeHub}}" + }, + "0x0000000000000000000000000000000000002003": { + "balance": "0x0", + "code": "{{stakeCredit}}" + }, + "0x0000000000000000000000000000000000002004": { + "balance": "0x0", + "code": "{{governor}}" + }, + "0x0000000000000000000000000000000000002005": { + "balance": "0x0", + "code": "{{govToken}}" + }, + "0x0000000000000000000000000000000000002006": { + "balance": "0x0", + "code": "{{timelock}}" + }, "0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD": { "balance": "0x100000000000000000000" }, diff --git a/genesis.json b/genesis.json index 48f9562c..48daed6a 100644 --- a/genesis.json +++ b/genesis.json @@ -24,7 +24,9 @@ "berlinBlock": 8, "londonBlock": 8, "hertzBlock": 8, - "fusionBlock": 9, + "shanghaiTime": 0, + "keplerTime": 0, + "fusionTime": 0, "parlia": { "period": 3, "epoch": 200 @@ -43,47 +45,67 @@ }, "0x0000000000000000000000000000000000001000": { "balance": "0x0", - "code": "0x60806040526004361061048d5760003560e01c806388b32f1111610255578063c81b166211610144578063e40716a1116100c1578063f92eb86b11610085578063f92eb86b14610bec578063f9a2bbc714610c01578063fc3e590814610c16578063fccc281314610c2b578063fd4ad81f14610c40578063fd6a687914610c6f57610494565b8063e40716a114610b6f578063ea321e4914610b84578063eb57e20214610ba4578063eda5868c14610bc4578063f340fa0114610bd957610494565b8063d86222d511610108578063d86222d514610b06578063daacdb6614610b1b578063dc927faf14610b30578063e086c7b114610b45578063e1c7392a14610b5a57610494565b8063c81b166214610aa7578063c8509d81146108a0578063ce910b0c14610abc578063d04aa99614610adc578063d68fb56a14610af157610494565b8063a78abc16116101d2578063aef198a911610196578063aef198a914610a46578063b7ab4db514610a5b578063b8cf4ef114610a7d578063bf9f499514610650578063c6d3394514610a9257610494565b8063a78abc16146109c7578063aaf5eb68146109dc578063ab51bb96146109f1578063ac43175114610a06578063ad3c9da614610a2657610494565b80639dc09262116102195780639dc092621461095e5780639fe0f81614610973578063a0dc275814610988578063a1a11bf51461099d578063a5422d5c146109b257610494565b806388b32f11146108ea5780638b5ad0c9146108ff5780638d19a410146109145780639369d7de1461093457806396713da91461094957610494565b80635192c82c1161037c5780636e47b482116102f95780637942fd05116102bd5780637942fd05146108615780637a84ca2a1461087657806381650b621461088b578063831d65d1146108a0578063853230aa146108c057806386249882146108d557610494565b80636e47b482146107f857806370fd5bad1461080d578063718a8aa81461082257806375d47a0a1461083757806378dfed4a1461084c57610494565b80635667515a116103405780635667515a146107675780635d77156c1461077c57806360eba4fe1461079157806362b72cf5146107b15780636969a25c146107c657610494565b80635192c82c146106e857806351e80672146106fd578063549b03f21461071257806355614fcc14610727578063565c56b31461074757610494565b80633365af3a1161040a57806343756e5c116103ce57806343756e5c1461067257806345cf9daf14610687578063493279b11461069c5780634bf6c882146106be5780634df6e0c3146106d357610494565b80633365af3a146105d857806335409f7f146105f85780633b071dcc146106185780633de0f0d81461063b5780633dffc3871461065057610494565b8063152ad3b811610451578063152ad3b81461054c5780631ff180691461056e578063219f22d514610583578063300c356714610598578063321d398a146105b857610494565b806304c4fec61461049957806307a56847146104b05780630bee7a67146104db5780630e2374a5146104fd5780631182b8751461051f57610494565b3661049457005b600080fd5b3480156104a557600080fd5b506104ae610c84565b005b3480156104bc57600080fd5b506104c5610cf6565b6040516104d291906175a0565b60405180910390f35b3480156104e757600080fd5b506104f0610cfc565b6040516104d291906175ca565b34801561050957600080fd5b50610512610d01565b6040516104d291906169a7565b34801561052b57600080fd5b5061053f61053a36600461688d565b610d07565b6040516104d29190616b1e565b34801561055857600080fd5b50610561610f3f565b6040516104d29190616b13565b34801561057a57600080fd5b506104c5610f48565b34801561058f57600080fd5b506104f0610f4e565b3480156105a457600080fd5b506104ae6105b3366004616717565b610f53565b3480156105c457600080fd5b506105616105d336600461683a565b6112d7565b3480156105e457600080fd5b506105616105f336600461683a565b6113a6565b34801561060457600080fd5b506104ae6106133660046166f0565b611457565b34801561062457600080fd5b5061062d6115b0565b6040516104d2929190616a29565b34801561064757600080fd5b506104c561188c565b34801561065c57600080fd5b50610665611892565b6040516104d291906175db565b34801561067e57600080fd5b50610512611897565b34801561069357600080fd5b506104c561189d565b3480156106a857600080fd5b506106b16118a3565b6040516104d29190617591565b3480156106ca57600080fd5b506106656118a9565b3480156106df57600080fd5b5061062d6118ae565b3480156106f457600080fd5b506104c5611a2c565b34801561070957600080fd5b50610512611a32565b34801561071e57600080fd5b506104c5611a38565b34801561073357600080fd5b506105616107423660046166f0565b611a3e565b34801561075357600080fd5b506104c56107623660046166f0565b611a73565b34801561077357600080fd5b50610665611ac4565b34801561078857600080fd5b506104f0611ac9565b34801561079d57600080fd5b5061053f6107ac36600461683a565b611ace565b3480156107bd57600080fd5b506104c5611b74565b3480156107d257600080fd5b506107e66107e136600461683a565b611b7a565b6040516104d2969594939291906169d4565b34801561080457600080fd5b50610512611bde565b34801561081957600080fd5b50610665611be4565b34801561082e57600080fd5b50610665611be9565b34801561084357600080fd5b50610512611bee565b34801561085857600080fd5b506104c5611ac4565b34801561086d57600080fd5b50610665611bf4565b34801561088257600080fd5b506104c5611bf9565b34801561089757600080fd5b506104f0611bff565b3480156108ac57600080fd5b506104ae6108bb36600461688d565b611c04565b3480156108cc57600080fd5b506104c5611c65565b3480156108e157600080fd5b506104c5611c6b565b3480156108f657600080fd5b506104c5611c71565b34801561090b57600080fd5b506104c5611c77565b34801561092057600080fd5b506104c561092f3660046166f0565b611c7d565b34801561094057600080fd5b506104ae611cbd565b34801561095557600080fd5b50610665611dd1565b34801561096a57600080fd5b50610512611dd6565b34801561097f57600080fd5b506104c5611ddc565b34801561099457600080fd5b506104c5611de1565b3480156109a957600080fd5b50610512611de6565b3480156109be57600080fd5b5061053f611dec565b3480156109d357600080fd5b50610561611e08565b3480156109e857600080fd5b506104c5611e11565b3480156109fd57600080fd5b506104f0611ac4565b348015610a1257600080fd5b506104ae610a213660046167de565b611e1a565b348015610a3257600080fd5b506104c5610a413660046166f0565b6126c6565b348015610a5257600080fd5b506104c56126d8565b348015610a6757600080fd5b50610a706126e5565b6040516104d29190616a16565b348015610a8957600080fd5b506104c56127d1565b348015610a9e57600080fd5b506104c5611be4565b348015610ab357600080fd5b506105126127d6565b348015610ac857600080fd5b5061053f610ad736600461683a565b6127dc565b348015610ae857600080fd5b506104c56127e9565b348015610afd57600080fd5b506104c56127ee565b348015610b1257600080fd5b506104c561282d565b348015610b2757600080fd5b506104c5612839565b348015610b3c57600080fd5b5061051261283f565b348015610b5157600080fd5b506104c5612845565b348015610b6657600080fd5b506104ae61284a565b348015610b7b57600080fd5b506104c56129f6565b348015610b9057600080fd5b50610561610b9f36600461679f565b6129fc565b348015610bb057600080fd5b506104ae610bbf3660046166f0565b612b82565b348015610bd057600080fd5b506104f0612c8a565b6104ae610be73660046166f0565b612c8f565b348015610bf857600080fd5b506104c5612f13565b348015610c0d57600080fd5b50610512612f19565b348015610c2257600080fd5b50610665611ddc565b348015610c3757600080fd5b50610512612f1f565b348015610c4c57600080fd5b50610c60610c5b36600461683a565b612f25565b6040516104d2939291906175a9565b348015610c7b57600080fd5b50610512612fe7565b6000610c8f33611c7d565b9050600b8181548110610c9e57fe5b600091825260209091206001601690920201015460ff16610cda5760405162461bcd60e51b8152600401610cd190617249565b60405180910390fd5b6000610ce46127ee565b9050610cf1338383612fed565b505050565b60095481565b606481565b61200181565b60005460609060ff16610d2c5760405162461bcd60e51b8152600401610cd190616cdd565b3361200014610d4d5760405162461bcd60e51b8152600401610cd190617428565b600b54610e0b57610d5c6163dc565b60015460005b81811015610e0757600b8054600181018255600091909152835160008051602061765383398151915260169092029182019081556020808601516000805160206176938339815191528401805460ff1916911515919091179055604086015180518794610de39360008051602061767383398151915290910192019061640b565b506060820151610df99060038301906013616485565b505050806001019050610d62565b5050505b610e136164b2565b6000610e5485858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506131d992505050565b9150915080610e7057610e676064613395565b92505050610f38565b815160009060ff16610e9557610e8e836020015184604001516133f6565b9050610f04565b825160ff1660011415610f0057826020015151600114610eda57600080516020617633833981519152604051610eca90617130565b60405180910390a1506067610efb565b610e8e8360200151600081518110610eee57fe5b602002602001015161404a565b610f04565b5060655b63ffffffff8116610f295750506040805160008152602081019091529150610f389050565b610f3281613395565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b334114610f725760405162461bcd60e51b8152600401610cd190617477565b6010544311610f935760405162461bcd60e51b8152600401610cd190616e39565b60005460ff16610fb55760405162461bcd60e51b8152600401610cd190616cdd565b600f54610fcd576032600f55611002316011556112cd565b60006110023168056bc75e2d63100000811115610ffc57610ff581606463ffffffff6141c116565b9150611045565b60115481111561103e57610ff56064611032600f546110266011548661420390919063ffffffff16565b9063ffffffff61424516565b9063ffffffff6141c116565b50506112cd565b6040516309a99b4f60e41b815261100290639a99b4f09061106c90309086906004016169bb565b602060405180830381600087803b15801561108657600080fd5b505af115801561109a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110be9190616852565b611002316011559150816110d35750506112cd565b6000805b84811015611101578585828181106110eb57fe5b90506020020135820191508060010190506110d7565b508061110f575050506112cd565b6000806000805b898110156112c5578489898381811061112b57fe5b9050602002013588028161113b57fe5b0493508a8a8281811061114a57fe5b905060200201602081019061115f91906166f0565b6001600160a01b0381166000908152600460205260409020549093509150811561127b57600060018084038154811061119457fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561120157836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516111f491906175a0565b60405180910390a2611275565b600354611214908663ffffffff61427f16565b600390815581015461122c908663ffffffff61427f16565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b29061126c9088906175a0565b60405180910390a25b506112bd565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516112b491906175a0565b60405180910390a25b600101611116565b505050505050505b5050436010555050565b60015460009082106112eb575060006113a1565b60006001600160a01b03166001838154811061130357fe5b60009182526020909120600490910201546001600160a01b03161480611333575060085415806113335750600a54155b80611342575060085460095410155b806113535750611351826113a6565b155b8061137c57506000600b838154811061136857fe5b906000526020600020906016020160000154115b806113905750600161138c6126e5565b5111155b1561139d575060006113a1565b5060015b919050565b60015460009082106113ba575060006113a1565b600b5482106113f757600182815481106113d057fe5b9060005260206000209060040201600201601c9054906101000a900460ff161590506113a1565b6001828154811061140457fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156114515750600b828154811061143857fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146114785760405162461bcd60e51b8152600401610cd190617548565b600b54611536576114876163dc565b60015460005b8181101561153257600b8054600181018255600091909152835160008051602061765383398151915260169092029182019081556020808601516000805160206176938339815191528401805460ff191691151591909117905560408601518051879461150e9360008051602061767383398151915290910192019061640b565b5060608201516115249060038301906013616485565b50505080600101905061148d565b5050505b6001600160a01b0381166000908152600460205260409020548061155a57506115ad565b6001810390506000600b828154811061156f57fe5b600091825260209091206001601690920201015460ff16905061159283836142a4565b801561159b5750805b15610cf1576009805460001901905550505b50565b60015460609081906000805b8281101561160357600181815481106115d157fe5b9060005260206000209060040201600201601c9054906101000a900460ff166115fb576001909101905b6001016115bc565b50606081604051908082528060200260200182016040528015611630578160200160208202803683370190505b50905060608260405190808252806020026020018201604052801561166957816020015b60608152602001906001900390816116545790505b50600b54600094509091508414156117e45760005b848110156117de576001818154811061169357fe5b9060005260206000209060040201600201601c9054906101000a900460ff166117d657600181815481106116c357fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106116ee57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061171b57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156117b35780601f10611788576101008083540402835291602001916117b3565b820191906000526020600020905b81548152906001019060200180831161179657829003601f168201915b50505050508285815181106117c457fe5b60209081029190910101526001909301925b60010161167e565b50611880565b60005b8481101561187e57600181815481106117fc57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611876576001818154811061182c57fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061185757fe5b6001600160a01b03909216602092830291909101909101526001909301925b6001016117e7565b505b909450925050505b9091565b61271081565b600181565b61100181565b60085481565b6102ca81565b600881565b600e54600c546060918291806118c2575060155b60606118cc6126e5565b905060606118d982614657565b9050828251116118f0579094509250611888915050565b83838351031015611902578282510393505b83156119385760c8430461191e83838388880360008a8a6147c5565b6119368383838888038989038a8b8b8b5103016147c5565b505b606083604051908082528060200260200182016040528015611964578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561199d57816020015b60608152602001906001900390816119885790505b50905060005b85811015611a1e578481815181106119b757fe5b60200260200101518382815181106119cb57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106119f757fe5b6020026020010151828281518110611a0b57fe5b60209081029190910101526001016119a3565b509096509450505050509091565b60065481565b61200081565b600f5481565b6001600160a01b03811660009081526004602052604081205480611a665760009150506113a1565b60001901610f38816113a6565b6001600160a01b03811660009081526004602052604081205480611a9b5760009150506113a1565b600180820381548110611aaa57fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60128181548110611adb57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015611b6c5780601f10611b4157610100808354040283529160200191611b6c565b820191906000526020600020905b815481529060010190602001808311611b4f57829003601f168201915b505050505081565b60105481565b60018181548110611b8757fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b600b81565b600c5481565b606681565b3361200014611c255760405162461bcd60e51b8152600401610cd190617428565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051611c58939291906175e9565b60405180910390a1505050565b6103e881565b60025481565b60115481565b600a5481565b6001600160a01b03811660009081526004602052604081205480611cb35760405162461bcd60e51b8152600401610cd1906173b0565b6000190192915050565b600b54611d7b57611ccc6163dc565b60015460005b81811015611d7757600b8054600181018255600091909152835160008051602061765383398151915260169092029182019081556020808601516000805160206176938339815191528401805460ff1916911515919091179055604086015180518794611d539360008051602061767383398151915290910192019061640b565b506060820151611d699060038301906013616485565b505050806001019050611cd2565b5050505b600854611d885760036008555b600a54611d95576002600a555b6000611da033611c7d565b9050611dab816112d7565b611dc75760405162461bcd60e51b8152600401610cd1906170ed565b6115ad338261491c565b600981565b61100781565b600381565b60c881565b61100681565b6040518060a00160405280607881526020016176b36078913981565b60005460ff1681565b6402540be40081565b60005460ff16611e3c5760405162461bcd60e51b8152600401610cd190616cdd565b3361100714611e5d5760405162461bcd60e51b8152600401610cd1906171b6565b611ec784848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506149b49050565b15611f645760208114611eec5760405162461bcd60e51b8152600401610cd19061736a565b604080516020601f8401819004810282018101909252828152600091611f2a91858580838501838280828437600092019190915250614a0d92505050565b905060648110158015611f405750620186a08111155b611f5c5760405162461bcd60e51b8152600401610cd190616f96565b600255612683565b611fc484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506149b49050565b156120605760208114611fe95760405162461bcd60e51b8152600401610cd190616b63565b604080516020601f840181900481028201810190925282815260009161202791858580838501838280828437600092019190915250614a0d92505050565b905061271081111561204b5760405162461bcd60e51b8152600401610cd190616e7b565b6006556007805460ff19166001179055612683565b6120ca84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506149b49050565b1561216457602081146120ef5760405162461bcd60e51b8152600401610cd190616b9a565b604080516020601f840181900481028201810190925282815260009161212d91858580838501838280828437600092019190915250614a0d92505050565b600c549091508061213c575060155b80821061215b5760405162461bcd60e51b8152600401610cd190616eee565b50600855612683565b6121cd84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506149b49050565b1561226657602081146121f25760405162461bcd60e51b8152600401610cd190616c63565b604080516020601f840181900481028201810190925282815260009161223091858580838501838280828437600092019190915250614a0d92505050565b90506000811180156122425750600a81105b61225e5760405162461bcd60e51b8152600401610cd1906174c4565b600a55612683565b6122da84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506149b49050565b1561236957602081146122ff5760405162461bcd60e51b8152600401610cd190616c17565b604080516020601f840181900481028201810190925282815260009161233d91858580838501838280828437600092019190915250614a0d92505050565b9050600d548111156123615760405162461bcd60e51b8152600401610cd19061700c565b600e55612683565b6123d284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506149b49050565b1561245457602081146123f75760405162461bcd60e51b8152600401610cd190617204565b604080516020601f840181900481028201810190925282815260009161243591858580838501838280828437600092019190915250614a0d92505050565b600d819055600e5490915081101561244e57600d54600e555b50612683565b6124b884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506149b49050565b1561256657602081146124dd5760405162461bcd60e51b8152600401610cd190616ca8565b604080516020601f840181900481028201810190925282815260009161251b91858580838501838280828437600092019190915250614a0d92505050565b90506000811161253d5760405162461bcd60e51b8152600401610cd190616d4b565b602981111561255e5760405162461bcd60e51b8152600401610cd190616d93565b600c55612683565b6125d084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527266696e616c697479526577617264526174696f60681b602082015291506149b49050565b1561266b57602081146125f55760405162461bcd60e51b8152600401610cd1906172ed565b604080516020601f840181900481028201810190925282815260009161263391858580838501838280828437600092019190915250614a0d92505050565b905060018110158015612647575060648111155b6126635760405162461bcd60e51b8152600401610cd19061707b565b600f55612683565b60405162461bcd60e51b8152600401610cd190617521565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040516126b89493929190616b31565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b8281101561271457612700816113a6565b1561270c578160010191505b6001016126ef565b50606081604051908082528060200260200182016040528015612741578160200160208202803683370190505b5090506000915060005b838110156127c85761275c816113a6565b156127c0576001818154811061276e57fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061279957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b60010161274b565b50925050505b90565b601581565b61100281565b60138181548110611adb57fe5b603281565b60006127f86126e5565b519050600080600c541161280d576015612811565b600c545b90508082111561281f578091505b8161282957600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561286d5760405162461bcd60e51b8152600401610cd1906172b6565b6128756164b2565b60006128986040518060a00160405280607881526020016176b3607891396131d9565b91509150806128b95760405162461bcd60e51b8152600401610cd1906173e7565b60005b8260200151518110156129de576001836020015182815181106128db57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106129b157fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016128bc565b50506103e8600255506000805460ff19166001179055565b600d5481565b601354600090815b81811015612b0557612aed85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601380549092508591508110612a5557fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ae35780601f10612ab857610100808354040283529160200191612ae3565b820191906000526020600020905b815481529060010190602001808311612ac657829003601f168201915b5050505050614a12565b15612afd57600192505050611451565b600101612a04565b5060125460005b81811015612b7657612b5d86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050601280549092508591508110612a5557fe5b15612b6e5760019350505050611451565b600101612b0c565b50600095945050505050565b3361100114612ba35760405162461bcd60e51b8152600401610cd190617548565b600b54612c6157612bb26163dc565b60015460005b81811015612c5d57600b8054600181018255600091909152835160008051602061765383398151915260169092029182019081556020808601516000805160206176938339815191528401805460ff1916911515919091179055604086015180518794612c399360008051602061767383398151915290910192019061640b565b506060820151612c4f9060038301906013616485565b505050806001019050612bb8565b5050505b6000612c6c82614a76565b9050612c77816112d7565b15612c8657612c86828261491c565b5050565b606581565b334114612cae5760405162461bcd60e51b8152600401610cd190617477565b60005460ff16612cd05760405162461bcd60e51b8152600401610cd190616cdd565b60003411612cf05760405162461bcd60e51b8152600401610cd190616fdd565b6001600160a01b03811660009081526004602052604081205460075434929060ff1615612d1c57506006545b600083118015612d2c5750600081115b15612dcd576000612d49612710611032868563ffffffff61424516565b90508015612dcb5760405161dead9082156108fc029083906000818181858888f19350505050158015612d80573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee581604051612db091906175a0565b60405180910390a1612dc8848263ffffffff61420316565b93505b505b8115612ecb576000600180840381548110612de457fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615612e5157846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051612e4491906175a0565b60405180910390a2612ec5565b600354612e64908563ffffffff61427f16565b6003908155810154612e7c908563ffffffff61427f16565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590612ebc9087906175a0565b60405180910390a25b50612f0d565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051612f0491906175a0565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612f3257fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015612fdd5780601f10612fb257610100808354040283529160200191612fdd565b820191906000526020600020905b815481529060010190602001808311612fc057829003601f168201915b5050505050905083565b61100481565b6000600a5460001480612ffe575081155b806130095750600954155b1561301657506000610f38565b60096000815460019003919050819055506000613061600a5461103285611032600b898154811061304357fe5b6000918252602090912060169091020154439063ffffffff61420316565b90506000600b858154811061307257fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b1580156130d757600080fd5b505afa1580156130eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310f919061686a565b91509150600093508083106131895761312887876142a4565b506040516305bfb49960e41b815261100190635bfb49909061314e908a906004016169a7565b600060405180830381600087803b15801561316857600080fd5b505af115801561317c573d6000803e3d6000fd5b505050506001935061319b565b81831061319b5761319987614a76565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b6131e16164b2565b60006131eb6164b2565b6131f36164d6565b6132046131ff86614c19565b614c3e565b90506000805b61321383614c88565b1561338757806132385761322e61322984614ca9565b614cf7565b60ff16845261337f565b806001141561337a57606061325461324f85614ca9565b614d77565b9050805160405190808252806020026020018201604052801561329157816020015b61327e6164f6565b8152602001906001900390816132765790505b50856020018190525080516040519080825280602002602001820160405280156132cf57816020015b60608152602001906001900390816132ba5790505b50604086015260005b815181101561336f576132e96164f6565b606060006133098585815181106132fc57fe5b6020026020010151614e48565b92509250925080613329578860009a509a50505050505050505050613390565b828960200151858151811061333a57fe5b6020026020010181905250818960400151858151811061335657fe5b60200260200101819052505050508060010190506132d8565b50600192505061337f565b613387565b60010161320a565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816133af5790505090506133d58363ffffffff16614f62565b816000815181106133e257fe5b6020026020010181905250610f3881614f75565b600060298351111561342d5760008051602061763383398151915260405161341d90616df0565b60405180910390a1506066611451565b60005b83518110156134cb5760005b818110156134c25784818151811061345057fe5b6020026020010151600001516001600160a01b031685838151811061347157fe5b6020026020010151600001516001600160a01b031614156134ba576000805160206176338339815191526040516134a790616f4b565b60405180910390a1606692505050611451565b60010161343c565b50600101613430565b506060806134d98585614fff565b60015491935091506000908190815b8181101561355e5767016345785d8a00006001828154811061350657fe5b9060005260206000209060040201600301541061352857836001019350613556565b60006001828154811061353757fe5b9060005260206000209060040201600301541115613556578260010192505b6001016134e8565b5060608360405190808252806020026020018201604052801561358b578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156135ba578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156135e9578160200160208202803683370190505b509050606086604051908082528060200260200182016040528015613618578160200160208202803683370190505b5090506000606087604051908082528060200260200182016040528015613649578160200160208202803683370190505b509050606088604051908082528060200260200182016040528015613678578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156136c057600080fd5b505afa1580156136d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136f89190616852565b905067016345785d8a00008111156137435760008051602061763383398151915260405161372590617275565b60405180910390a160689d5050505050505050505050505050611451565b60005b898110156139b45767016345785d8a00006001828154811061376457fe5b906000526020600020906004020160030154106138e9576001818154811061378857fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d815181106137b957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106137ee57fe5b9060005260206000209060040201600301548161380757fe5b066001838154811061381557fe5b90600052602060002090600402016003015403905061383d838261420390919063ffffffff16565b898e8151811061384957fe5b6020026020010181815250506001828154811061386257fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316878e8151811061389357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e815181106138c057fe5b60209081029190910101526138db868263ffffffff61427f16565b95508c6001019c50506139ac565b6000600182815481106138f857fe5b90600052602060002090600402016003015411156139ac576001818154811061391d57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c8151811061394e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061397b57fe5b906000526020600020906004020160030154838c8151811061399957fe5b6020026020010181815250508a6001019a505b600101613746565b5060008415613c2a576002546040516303702b2960e51b815261100491636e0565209188916139ee918e918e918d91420190600401616a99565b6020604051808303818588803b158015613a0757600080fd5b505af193505050508015613a38575060408051601f3d908101601f19168201909252613a359181019061677f565b60015b613baf576040516000815260443d1015613a5457506000613aef565b60046000803e60005160e01c6308c379a08114613a75576000915050613aef565b60043d036004833e81513d60248201116001600160401b0382111715613aa057600092505050613aef565b80830180516001600160401b03811115613ac1576000945050505050613aef565b8060208301013d8601811115613adf57600095505050505050613aef565b601f01601f191660405250925050505b80613afa5750613b3c565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf28082604051613b2e9190616b1e565b60405180910390a250613baa565b3d808015613b66576040519150601f19603f3d011682016040523d82523d6000602084013e613b6b565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a4582604051613ba09190616b1e565b60405180910390a2505b613c2a565b8015613bf1577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b7086604051613be491906175a0565b60405180910390a1613c28565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280604051613c1f90616be0565b60405180910390a25b505b8015613de05760005b8751811015613dde576000888281518110613c4a57fe5b60200260200101519050600060018281548110613c6357fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110613c9457fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015613d505760018281548110613cd557fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110613d2457fe5b906000526020600020906004020160030154604051613d4391906175a0565b60405180910390a2613dd4565b60018281548110613d5d57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110613dac57fe5b906000526020600020906004020160030154604051613dcb91906175a0565b60405180910390a25b5050600101613c33565b505b835115613f2a5760005b8451811015613f28576000858281518110613e0157fe5b60200260200101516001600160a01b03166108fc868481518110613e2157fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613eb757858281518110613e5757fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613e9557fe5b6020026020010151604051613eaa91906175a0565b60405180910390a2613f1f565b858281518110613ec357fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613f0157fe5b6020026020010151604051613f1691906175a0565b60405180910390a25b50600101613dea565b505b5050505050505050505050506000471115613fa6577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d47604051613f6e91906175a0565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015613fa4573d6000803e3d6000fd5b505b60006003819055600555815115613fc157613fc18282615238565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613ffe57600080fd5b505af1158015614012573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b80516001600160a01b031660009081526004602052604081205480158061409b575060018082038154811061407b57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b156140e15782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009150506113a1565b6001546005546000198201118015906141375784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a2600093505050506113a1565b60058054600190810190915580548190600019860190811061415557fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000610f3883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506159f2565b6000610f3883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615a29565b60008261425457506000611451565b8282028284828161426157fe5b0414610f385760405162461bcd60e51b8152600401610cd190617175565b600082820183811015610f385760405162461bcd60e51b8152600401610cd190616d14565b600080600183815481106142b457fe5b906000526020600020906004020160030154905060006001808054905003905060016142de6126e5565b5111614313576000600185815481106142f357fe5b906000526020600020906004020160030181905550600092505050611451565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a708360405161434c91906175a0565b60405180910390a26001600160a01b038516600090815260046020526040812055835b60015460001901811015614539576001816001018154811061438d57fe5b9060005260206000209060040201600182815481106143a857fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b80549091830190811061446957fe5b9060005260206000209060160201600b828154811061448457fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff19909216919091179055600280840180546144db93838601939082161561010002600019019091160461652b565b506144ee600382810190840160136165a0565b5090505080600101600460006001848154811061450757fe5b600091825260208083206004909202909101546001600160a01b0316835282019290925260400190205560010161436f565b50600180548061454557fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b80548061459857fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906145ca60028301826165ca565b6145d860038301600061660e565b5050905560008183816145e757fe5b049050801561464b5760015460005b8181101561464857826001828154811061460c57fe5b906000526020600020906004020160030154016001828154811061462c57fe5b60009182526020909120600360049092020101556001016145f6565b50505b50600195945050505050565b60015481516040805182815260208084028201019091526060929190839082801561469657816020015b60608152602001906001900390816146815790505b50600b5490915083146146ad5792506113a1915050565b60005b828110156147bc57600b6001600460008985815181106146cc57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054038154811061470057fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156147985780601f1061476d57610100808354040283529160200191614798565b820191906000526020600020905b81548152906001019060200180831161477b57829003601f168201915b50505050508282815181106147a957fe5b60209081029190910101526001016146b0565b50949350505050565b60005b8281101561491257600082878388016040516020016147e8929190616999565b6040516020818303038152906040528051906020012060001c8161480857fe5b06905080850182870114614909576000898388018151811061482657fe5b602002602001015190506060898489018151811061484057fe5b602002602001015190508a8388018151811061485857fe5b60200260200101518b858a018151811061486e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b8489018151811061489d57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505089838801815181106148cb57fe5b60200260200101518a858a01815181106148e157fe5b6020026020010181905250808a848901815181106148fb57fe5b602002602001018190525050505b506001016147c8565b5050505050505050565b600980546001908101909155600b80548390811061493657fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b828154811061496c57fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b6000816040516020016149c7919061697d565b60405160208183030381529060405280519060200120836040516020016149ee919061697d565b6040516020818303038152906040528051906020012014905092915050565b015190565b815181516000916001918114808314614a2e5760009250614a6c565b600160208701838101602088015b600284838510011415614a67578051835114614a5b5760009650600093505b60209283019201614a3c565b505050505b5090949350505050565b6001600160a01b03811660009081526004602052604081205480614a9f575060001990506113a1565b600181039050600060018281548110614ab457fe5b9060005260206000209060040201600301549050600060018381548110614ad757fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614b309085906175a0565b60405180910390a280614b48578293505050506113a1565b6000818381614b5357fe5b0490508015614c0f5760005b84811015614bb1578160018281548110614b7557fe5b9060005260206000209060040201600301540160018281548110614b9557fe5b6000918252602090912060036004909202010155600101614b5f565b50600180549085015b81811015614c0c578260018281548110614bd057fe5b9060005260206000209060040201600301540160018281548110614bf057fe5b6000918252602090912060036004909202010155600101614bba565b50505b5091949350505050565b614c2161661d565b506040805180820190915281518152602082810190820152919050565b614c466164d6565b614c4f82615a55565b614c5857600080fd5b6000614c678360200151615a8f565b60208085015160408051808201909152868152920190820152915050919050565b6000614c9261661d565b505080518051602091820151919092015191011190565b614cb161661d565b614cba82614c88565b614cc357600080fd5b60208201516000614cd382615af2565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590614d0c57508151602110155b614d1557600080fd5b6000614d248360200151615a8f565b90508083600001511015614d4a5760405162461bcd60e51b8152600401610cd190617333565b8251602080850151830180519284900392918310156147bc57506020919091036101000a90049392505050565b6060614d8282615a55565b614d8b57600080fd5b6000614d9683615bd3565b9050606081604051908082528060200260200182016040528015614dd457816020015b614dc161661d565b815260200190600190039081614db95790505b5090506000614de68560200151615a8f565b60208601510190506000805b84811015614e3d57614e0383615af2565b9150604051806040016040528083815260200184815250848281518110614e2657fe5b602090810291909101015291810191600101614df2565b509195945050505050565b614e506164f6565b60606000614e5c6164f6565b6060614e666164d6565b614e6f87614c3e565b90506000805b614e7e83614c88565b15614f535780614ea957614e99614e9484614ca9565b615c2f565b6001600160a01b03168552614f4b565b8060011415614ed157614ebe614e9484614ca9565b6001600160a01b03166020860152614f4b565b8060021415614ef957614ee6614e9484614ca9565b6001600160a01b03166040860152614f4b565b8060031415614f2557614f0e61322984614ca9565b6001600160401b0316606086015260019150614f4b565b8060041415614f4657614f3f614f3a84614ca9565b615c49565b9350614f4b565b614f53565b600101614e75565b50929791965091945092505050565b6060611451614f7083615cb9565b615d9f565b6060815160001415614f9657506040805160008152602081019091526113a1565b606082600081518110614fa557fe5b602002602001015190506000600190505b8351811015614fe657614fdc82858381518110614fcf57fe5b6020026020010151615df1565b9150600101614fb6565b50610f38614ff9825160c060ff16615e6e565b82615df1565b6060806000808080806150106127ee565b6001549091505b801561511e57600181039250600b838154811061503057fe5b600091825260209091206001601690920201015460ff1661505057615115565b6001838154811061505d57fe5b60009182526020909120600490910201546001600160a01b03169450615084858484612fed565b9350831580615097575060018a51038610155b156150a157615115565b60005b8a5181101561511357856001600160a01b03168b82815181106150c357fe5b6020026020010151600001516001600160a01b0316141561510b5760018b82815181106150ec57fe5b6020908102919091010151901515608090910152600190960195615113565b6001016150a4565b505b60001901615017565b508489510360405190808252806020026020018201604052801561515c57816020015b6151496164f6565b8152602001906001900390816151415790505b5096508489510360405190808252806020026020018201604052801561519657816020015b60608152602001906001900390816151815790505b5095506000915060005b895181101561522a578981815181106151b557fe5b602002602001015160800151615222578981815181106151d157fe5b60200260200101518884815181106151e557fe5b60200260200101819052508881815181106151fc57fe5b602002602001015187848151811061521057fe5b60200260200101819052508260010192505b6001016151a0565b5050505050505b9250929050565b600154825160005b828110156153555760016152526164f6565b6001838154811061525f57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015615329578781815181106152ef57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156153215760009250615329565b6001016152db565b50811561534b5780516001600160a01b03166000908152600460205260408120555b5050600101615240565b508082111561541457805b8281101561541257600180548061537357fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806153c657fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906153f860028301826165ca565b61540660038301600061660e565b50509055600101615360565b505b60008183106154235781615425565b825b905060005b81811015615794576154d786828151811061544157fe5b60200260200101516001838154811061545657fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152615f40565b61568b5780600101600460008884815181106154ef57fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061552b57fe5b60200260200101516001828154811061554057fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106155fb57fe5b6020026020010151600b828154811061561057fe5b9060005260206000209060160201600201908051906020019061563492919061640b565b506000600b828154811061564457fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061567557fe5b600091825260209091206016909102015561578c565b61571c85828151811061569a57fe5b6020026020010151600b83815481106156af57fe5b600091825260209182902060026016909202018101805460408051601f600019610100600186161502019093169490940491820185900485028401850190528083529192909190830182828015612ae35780601f10612ab857610100808354040283529160200191612ae3565b6157675784818151811061572c57fe5b6020026020010151600b828154811061574157fe5b9060005260206000209060160201600201908051906020019061576592919061640b565b505b60006001828154811061577657fe5b9060005260206000209060040201600301819055505b60010161542a565b508282111561596c576157a56163dc565b835b83811015615969578581815181106157bb57fe5b6020026020010151826040018190525060018782815181106157d957fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b80549283018155909352845160169091026000805160206176538339815191528101918255858301516000805160206176938339815191528201805491151560ff199092169190911790559285015180518694929361590f936000805160206176738339815191520192019061640b565b5060608201516159259060038301906013616485565b505050806001016004600089848151811061593c57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016157a7565b50505b615974615fc1565b61597c6161a3565b6000600981905560015493505b838110156159ea576000600b82815481106159a057fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106159d157fe5b6000918252602090912060169091020155600101615989565b505050505050565b60008183615a135760405162461bcd60e51b8152600401610cd19190616b1e565b506000838581615a1f57fe5b0495945050505050565b60008184841115615a4d5760405162461bcd60e51b8152600401610cd19190616b1e565b505050900390565b8051600090615a66575060006113a1565b6020820151805160001a9060c0821015615a85576000925050506113a1565b5060019392505050565b8051600090811a6080811015615aa95760009150506113a1565b60b8811080615ac4575060c08110801590615ac4575060f881105b15615ad35760019150506113a1565b60c0811015615ae75760b5190190506113a1565b60f5190190506113a1565b80516000908190811a6080811015615b0d5760019150615bcc565b60b8811015615b2257607e1981019150615bcc565b60c0811015615b7357600060b78203600186019550806020036101000a865104915060018101820193505080831015615b6d5760405162461bcd60e51b8152600401610cd1906170c2565b50615bcc565b60f8811015615b885760be1981019150615bcc565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615bca5760405162461bcd60e51b8152600401610cd1906170c2565b505b5092915050565b8051600090615be4575060006113a1565b60008090506000615bf88460200151615a8f565b602085015185519181019250015b80821015615c2657615c1782615af2565b82019150826001019250615c06565b50909392505050565b8051600090601514615c4057600080fd5b61145182614cf7565b8051606090615c5757600080fd5b6000615c668360200151615a8f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015615c9d576020820181803683370190505b50905060008160200190506147bc848760200151018285616391565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615cfd57506018615d21565b6fffffffffffffffffffffffffffffffff198416615d1d57506010615d21565b5060005b6020811015615d5757818181518110615d3657fe5b01602001516001600160f81b03191615615d4f57615d57565b600101615d21565b60008160200390506060816040519080825280601f01601f191660200182016040528015615d8c576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015615dd15750607f60f81b82600081518110615dbf57fe5b01602001516001600160f81b03191611155b15615ddd5750806113a1565b611451615def8351608060ff16615e6e565b835b6060806040519050835180825260208201818101602087015b81831015615e22578051835260209283019201615e0a565b50855184518101855292509050808201602086015b81831015615e4f578051835260209283019201615e37565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310615e985760405162461bcd60e51b8152600401610cd190616ec6565b60408051600180825281830190925260609160208201818036833701905050905060378411615ef25782840160f81b81600081518110615ed457fe5b60200101906001600160f81b031916908160001a9053509050611451565b6060615efd85615cb9565b90508381510160370160f81b82600081518110615f1657fe5b60200101906001600160f81b031916908160001a905350615f378282615df1565b95945050505050565b805182516000916001600160a01b039182169116148015615f7a575081602001516001600160a01b031683602001516001600160a01b0316145b8015615f9f575081604001516001600160a01b031683604001516001600160a01b0316145b8015610f385750506060908101519101516001600160401b0390811691161490565b6012546013548082111561600c57805b8281101561600a576012805480615fe457fe5b60019003818190600052602060002001600061600091906165ca565b9055600101615fd1565b505b600081831061601b578161601d565b825b905060005b81811015616135576160da6012828154811061603a57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156160c85780601f1061609d576101008083540402835291602001916160c8565b820191906000526020600020905b8154815290600101906020018083116160ab57829003601f168201915b505050505060138381548110612a5557fe5b61612d57601381815481106160eb57fe5b906000526020600020016012828154811061610257fe5b90600052602060002001908054600181600116156101000203166002900461612b92919061652b565b505b600101616022565b5082821115610cf157825b82811015612f0d5760126013828154811061615757fe5b600091825260208083208454600181810187559585529190932092909101805461619a94939092019290916002610100928216159290920260001901160461652b565b50600101616140565b601354600b54808211156161ee57805b828110156161ec5760138054806161c657fe5b6001900381819060005260206000200160006161e291906165ca565b90556001016161b3565b505b60008183106161fd57816161ff565b825b905060005b8181101561631e576162bc6013828154811061621c57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156162aa5780601f1061627f576101008083540402835291602001916162aa565b820191906000526020600020905b81548152906001019060200180831161628d57829003601f168201915b5050505050600b83815481106156af57fe5b61631657600b81815481106162cd57fe5b9060005260206000209060160201600201601382815481106162eb57fe5b90600052602060002001908054600181600116156101000203166002900461631492919061652b565b505b600101616204565b5082821115610cf157825b82811015612f0d576013600b828154811061634057fe5b6000918252602080832084546001808201875595855291909320601692909202909201600290810180546163889593909401939092600019908216156101000201160461652b565b50600101616329565b8061639b57610cf1565b5b602081106163bb578251825260209283019290910190601f190161639c565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001616406616637565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061644c57805160ff1916838001178555616479565b82800160010185558215616479579182015b8281111561647957825182559160200191906001019061645e565b50612829929150616656565b8260138101928215616479579160200282018281111561647957825182559160200191906001019061645e565b6040518060600160405280600060ff16815260200160608152602001606081525090565b60405180604001604052806164e961661d565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106165645780548555616479565b8280016001018555821561647957600052602060002091601f016020900482015b82811115616479578254825591600101919060010190616585565b82601381019282156164795791820182811115616479578254825591600101919060010190616585565b50805460018160011615610100020316600290046000825580601f106165f057506115ad565b601f0160209004906000526020600020908101906115ad9190616656565b506115ad906013810190616656565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b6127ce91905b80821115612829576000815560010161665c565b60008083601f840112616681578182fd5b5081356001600160401b03811115616697578182fd5b602083019150836020808302850101111561523157600080fd5b60008083601f8401126166c2578182fd5b5081356001600160401b038111156166d8578182fd5b60208301915083602082850101111561523157600080fd5b600060208284031215616701578081fd5b81356001600160a01b0381168114610f38578182fd5b6000806000806040858703121561672c578283fd5b84356001600160401b0380821115616742578485fd5b61674e88838901616670565b90965094506020870135915080821115616766578384fd5b5061677387828801616670565b95989497509550505050565b600060208284031215616790578081fd5b81518015158114610f38578182fd5b600080602083850312156167b1578182fd5b82356001600160401b038111156167c6578283fd5b6167d2858286016166b1565b90969095509350505050565b600080600080604085870312156167f3578384fd5b84356001600160401b0380821115616809578586fd5b616815888389016166b1565b9096509450602087013591508082111561682d578384fd5b50616773878288016166b1565b60006020828403121561684b578081fd5b5035919050565b600060208284031215616863578081fd5b5051919050565b6000806040838503121561687c578182fd5b505080516020909101519092909150565b6000806000604084860312156168a1578283fd5b833560ff811681146168b1578384fd5b925060208401356001600160401b038111156168cb578283fd5b6168d7868287016166b1565b9497909650939450505050565b6000815180845260208085019450808401835b8381101561691c5781516001600160a01b0316875295820195908201906001016168f7565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452616969816020860160208601617606565b601f01601f19169290920160200192915050565b6000825161698f818460208701617606565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b600060208252610f3860208301846168e4565b600060408252616a3c60408301856168e4565b602083820381850152818551808452828401915082838202850101838801865b83811015616a8a57601f19878403018552616a78838351616951565b94860194925090850190600101616a5c565b50909998505050505050505050565b600060808252616aac60808301876168e4565b828103602084810191909152865180835287820192820190845b81811015616ae257845183529383019391830191600101616ac6565b50508481036040860152616af681886168e4565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b600060208252610f386020830184616951565b600060408252616b45604083018688616927565b8281036020840152616b58818587616927565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252602b908201527f746865206275726e526174696f206d757374206265206e6f206772656174657260408201526a0207468616e2031303030360ac1b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b60208082526027908201527f7468652066696e616c697479526577617264526174696f206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662066696e616c697479526577617264526174696f206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152615f376060830184616951565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152615f37604083018486616927565b60005b83811015617621578181015183820152602001617609565b83811115612f0d575050600091015256fe70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaf87680f873f871949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d79164b085e6972fc98cd3c81d64d40e325acfed44365b97a7567a27939c14dbc7512ddcf54cb1284eb637cfa308ae4e00cb5588a164736f6c6343000604000a" + "code": "0x60806040526004361061046c5760003560e01c8063862498821161024a578063c6d3394511610139578063e40716a1116100b6578063f9a2bbc71161007a578063f9a2bbc714610b80578063fc3e590814610b95578063fccc281314610baa578063fd4ad81f14610bbf578063fd6a687914610bee57610473565b8063e40716a114610b0e578063eb57e20214610b23578063eda5868c14610b43578063f340fa0114610b58578063f92eb86b14610b6b57610473565b8063d86222d5116100fd578063d86222d514610aa5578063daacdb6614610aba578063dc927faf14610acf578063e086c7b114610ae4578063e1c7392a14610af957610473565b8063c6d3394514610a51578063c81b166214610a66578063c8509d811461085f578063d04aa99614610a7b578063d68fb56a14610a9057610473565b8063a5422d5c116101c7578063ad3c9da61161018b578063ad3c9da6146109e5578063aef198a914610a05578063b7ab4db514610a1a578063b8cf4ef114610a3c578063bf9f49951461062f57610473565b8063a5422d5c14610971578063a78abc1614610986578063aaf5eb681461099b578063ab51bb96146109b0578063ac431751146109c557610473565b806396713da91161020e57806396713da9146109085780639dc092621461091d5780639fe0f81614610932578063a0dc275814610947578063a1a11bf51461095c57610473565b8063862498821461089457806388b32f11146108a95780638b5ad0c9146108be5780638d19a410146108d35780639369d7de146108f357610473565b80634df6e0c3116103665780636e47b482116102e35780637942fd05116102a75780637942fd05146108205780637a84ca2a1461083557806381650b621461084a578063831d65d11461085f578063853230aa1461087f57610473565b80636e47b482146107b757806370fd5bad146107cc578063718a8aa8146107e157806375d47a0a146107f657806378dfed4a1461080b57610473565b8063565c56b31161032a578063565c56b3146107265780635667515a146107465780635d77156c1461075b57806362b72cf5146107705780636969a25c1461078557610473565b80634df6e0c3146106b25780635192c82c146106c757806351e80672146106dc578063549b03f2146106f157806355614fcc1461070657610473565b8063321d398a116103f45780633dffc387116103b85780633dffc3871461062f57806343756e5c1461065157806345cf9daf14610666578063493279b11461067b5780634bf6c8821461069d57610473565b8063321d398a146105975780633365af3a146105b757806335409f7f146105d75780633b071dcc146105f75780633de0f0d81461061a57610473565b80631182b8751161043b5780631182b875146104fe578063152ad3b81461052b5780631ff180691461054d578063219f22d514610562578063300c35671461057757610473565b806304c4fec61461047857806307a568471461048f5780630bee7a67146104ba5780630e2374a5146104dc57610473565b3661047357005b600080fd5b34801561048457600080fd5b5061048d610c03565b005b34801561049b57600080fd5b506104a4610c75565b6040516104b19190616efb565b60405180910390f35b3480156104c657600080fd5b506104cf610c7b565b6040516104b19190616f25565b3480156104e857600080fd5b506104f1610c80565b6040516104b19190616302565b34801561050a57600080fd5b5061051e6105193660046161e8565b610c86565b6040516104b19190616479565b34801561053757600080fd5b50610540610ebe565b6040516104b1919061646e565b34801561055957600080fd5b506104a4610ec7565b34801561056e57600080fd5b506104cf610ecd565b34801561058357600080fd5b5061048d6105923660046160b1565b610ed2565b3480156105a357600080fd5b506105406105b2366004616195565b611256565b3480156105c357600080fd5b506105406105d2366004616195565b611325565b3480156105e357600080fd5b5061048d6105f236600461608a565b6113d6565b34801561060357600080fd5b5061060c61152f565b6040516104b1929190616384565b34801561062657600080fd5b506104a461180b565b34801561063b57600080fd5b50610644611811565b6040516104b19190616f36565b34801561065d57600080fd5b506104f1611816565b34801561067257600080fd5b506104a461181c565b34801561068757600080fd5b50610690611822565b6040516104b19190616eec565b3480156106a957600080fd5b50610644611827565b3480156106be57600080fd5b5061060c61182c565b3480156106d357600080fd5b506104a46119aa565b3480156106e857600080fd5b506104f16119b0565b3480156106fd57600080fd5b506104a46119b6565b34801561071257600080fd5b5061054061072136600461608a565b6119bc565b34801561073257600080fd5b506104a461074136600461608a565b6119f1565b34801561075257600080fd5b50610644611a42565b34801561076757600080fd5b506104cf611a47565b34801561077c57600080fd5b506104a4611a4c565b34801561079157600080fd5b506107a56107a0366004616195565b611a52565b6040516104b19695949392919061632f565b3480156107c357600080fd5b506104f1611ab6565b3480156107d857600080fd5b50610644611abc565b3480156107ed57600080fd5b50610644611ac1565b34801561080257600080fd5b506104f1611ac6565b34801561081757600080fd5b506104a4611a42565b34801561082c57600080fd5b50610644611acc565b34801561084157600080fd5b506104a4611ad1565b34801561085657600080fd5b506104cf611ad7565b34801561086b57600080fd5b5061048d61087a3660046161e8565b611adc565b34801561088b57600080fd5b506104a4611b3d565b3480156108a057600080fd5b506104a4611b43565b3480156108b557600080fd5b506104a4611b49565b3480156108ca57600080fd5b506104a4611b4f565b3480156108df57600080fd5b506104a46108ee36600461608a565b611b55565b3480156108ff57600080fd5b5061048d611b95565b34801561091457600080fd5b50610644611ca9565b34801561092957600080fd5b506104f1611cae565b34801561093e57600080fd5b506104a4611cb4565b34801561095357600080fd5b506104a4611cb9565b34801561096857600080fd5b506104f1611cbe565b34801561097d57600080fd5b5061051e611cc4565b34801561099257600080fd5b50610540611ce0565b3480156109a757600080fd5b506104a4611ce9565b3480156109bc57600080fd5b506104cf611a42565b3480156109d157600080fd5b5061048d6109e0366004616139565b611cf2565b3480156109f157600080fd5b506104a4610a0036600461608a565b61259e565b348015610a1157600080fd5b506104a46125b0565b348015610a2657600080fd5b50610a2f6125bd565b6040516104b19190616371565b348015610a4857600080fd5b506104a46126a9565b348015610a5d57600080fd5b506104a4611abc565b348015610a7257600080fd5b506104f16126ae565b348015610a8757600080fd5b506104a46126b4565b348015610a9c57600080fd5b506104a46126b9565b348015610ab157600080fd5b506104a46126f8565b348015610ac657600080fd5b506104a4612704565b348015610adb57600080fd5b506104f161270a565b348015610af057600080fd5b506104a4612710565b348015610b0557600080fd5b5061048d612715565b348015610b1a57600080fd5b506104a46128c1565b348015610b2f57600080fd5b5061048d610b3e36600461608a565b6128c7565b348015610b4f57600080fd5b506104cf6129cf565b61048d610b6636600461608a565b6129d4565b348015610b7757600080fd5b506104a4612c58565b348015610b8c57600080fd5b506104f1612c5e565b348015610ba157600080fd5b50610644611cb4565b348015610bb657600080fd5b506104f1612c64565b348015610bcb57600080fd5b50610bdf610bda366004616195565b612c6a565b6040516104b193929190616f04565b348015610bfa57600080fd5b506104f1612d2c565b6000610c0e33611b55565b9050600b8181548110610c1d57fe5b600091825260209091206001601690920201015460ff16610c595760405162461bcd60e51b8152600401610c5090616ba4565b60405180910390fd5b6000610c636126b9565b9050610c70338383612d32565b505050565b60095481565b606481565b61200181565b60005460609060ff16610cab5760405162461bcd60e51b8152600401610c5090616638565b3361200014610ccc5760405162461bcd60e51b8152600401610c5090616d83565b600b54610d8a57610cdb615d76565b60015460005b81811015610d8657600b80546001810182556000919091528351600080516020616fae8339815191526016909202918201908155602080860151600080516020616fee8339815191528401805460ff1916911515919091179055604086015180518794610d6293600080516020616fce833981519152909101920190615da5565b506060820151610d789060038301906013615e1f565b505050806001019050610ce1565b5050505b610d92615e4c565b6000610dd385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f1e92505050565b9150915080610def57610de660646130da565b92505050610eb7565b815160009060ff16610e1457610e0d8360200151846040015161313b565b9050610e83565b825160ff1660011415610e7f57826020015151600114610e5957600080516020616f8e833981519152604051610e4990616a8b565b60405180910390a1506067610e7a565b610e0d8360200151600081518110610e6d57fe5b6020026020010151613d8f565b610e83565b5060655b63ffffffff8116610ea85750506040805160008152602081019091529150610eb79050565b610eb1816130da565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b334114610ef15760405162461bcd60e51b8152600401610c5090616dd2565b6010544311610f125760405162461bcd60e51b8152600401610c5090616794565b60005460ff16610f345760405162461bcd60e51b8152600401610c5090616638565b600f54610f4c576032600f556110023160115561124c565b60006110023168056bc75e2d63100000811115610f7b57610f7481606463ffffffff613f0616565b9150610fc4565b601154811115610fbd57610f746064610fb1600f54610fa560115486613f4890919063ffffffff16565b9063ffffffff613f8a16565b9063ffffffff613f0616565b505061124c565b6040516309a99b4f60e41b815261100290639a99b4f090610feb9030908690600401616316565b602060405180830381600087803b15801561100557600080fd5b505af1158015611019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103d91906161ad565b6110023160115591508161105257505061124c565b6000805b848110156110805785858281811061106a57fe5b9050602002013582019150806001019050611056565b508061108e5750505061124c565b6000806000805b8981101561124457848989838181106110aa57fe5b905060200201358802816110ba57fe5b0493508a8a828181106110c957fe5b90506020020160208101906110de919061608a565b6001600160a01b038116600090815260046020526040902054909350915081156111fa57600060018084038154811061111357fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff161561118057836001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85866040516111739190616efb565b60405180910390a26111f4565b600354611193908663ffffffff613fc416565b60039081558101546111ab908663ffffffff613fc416565b60038201556040516001600160a01b038516907fcb0aad6cf9cd03bdf6137e359f541c42f38b39f007cae8e89e88aa7d8c6617b2906111eb908890616efb565b60405180910390a25b5061123c565b826001600160a01b03167fb9c75cbbfde137c4281689580799ef5f52144e78858f776a5979b2b212137d85856040516112339190616efb565b60405180910390a25b600101611095565b505050505050505b5050436010555050565b600154600090821061126a57506000611320565b60006001600160a01b03166001838154811061128257fe5b60009182526020909120600490910201546001600160a01b031614806112b2575060085415806112b25750600a54155b806112c1575060085460095410155b806112d257506112d082611325565b155b806112fb57506000600b83815481106112e757fe5b906000526020600020906016020160000154115b8061130f5750600161130b6125bd565b5111155b1561131c57506000611320565b5060015b919050565b600154600090821061133957506000611320565b600b548210611376576001828154811061134f57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16159050611320565b6001828154811061138357fe5b9060005260206000209060040201600201601c9054906101000a900460ff161580156113d05750600b82815481106113b757fe5b600091825260209091206001601690920201015460ff16155b92915050565b33611001146113f75760405162461bcd60e51b8152600401610c5090616ea3565b600b546114b557611406615d76565b60015460005b818110156114b157600b80546001810182556000919091528351600080516020616fae8339815191526016909202918201908155602080860151600080516020616fee8339815191528401805460ff191691151591909117905560408601518051879461148d93600080516020616fce833981519152909101920190615da5565b5060608201516114a39060038301906013615e1f565b50505080600101905061140c565b5050505b6001600160a01b038116600090815260046020526040902054806114d9575061152c565b6001810390506000600b82815481106114ee57fe5b600091825260209091206001601690920201015460ff1690506115118383613fe9565b801561151a5750805b15610c70576009805460001901905550505b50565b60015460609081906000805b82811015611582576001818154811061155057fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661157a576001909101905b60010161153b565b506060816040519080825280602002602001820160405280156115af578160200160208202803683370190505b5090506060826040519080825280602002602001820160405280156115e857816020015b60608152602001906001900390816115d35790505b50600b54600094509091508414156117635760005b8481101561175d576001818154811061161257fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611755576001818154811061164257fe5b600091825260209091206004909102015483516001600160a01b039091169084908690811061166d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600b818154811061169a57fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156117325780601f1061170757610100808354040283529160200191611732565b820191906000526020600020905b81548152906001019060200180831161171557829003601f168201915b505050505082858151811061174357fe5b60209081029190910101526001909301925b6001016115fd565b506117ff565b60005b848110156117fd576001818154811061177b57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166117f557600181815481106117ab57fe5b600091825260209091206004909102015483516001600160a01b03909116908490869081106117d657fe5b6001600160a01b03909216602092830291909101909101526001909301925b600101611766565b505b909450925050505b9091565b61271081565b600181565b61100181565b60085481565b606081565b600881565b600e54600c54606091829180611840575060155b606061184a6125bd565b905060606118578261439c565b90508282511161186e579094509250611807915050565b83838351031015611880578282510393505b83156118b65760c8430461189c83838388880360008a8a61450a565b6118b48383838888038989038a8b8b8b51030161450a565b505b6060836040519080825280602002602001820160405280156118e2578160200160208202803683370190505b50905060608460405190808252806020026020018201604052801561191b57816020015b60608152602001906001900390816119065790505b50905060005b8581101561199c5784818151811061193557fe5b602002602001015183828151811061194957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083818151811061197557fe5b602002602001015182828151811061198957fe5b6020908102919091010152600101611921565b509096509450505050509091565b60065481565b61200081565b600f5481565b6001600160a01b038116600090815260046020526040812054806119e4576000915050611320565b60001901610eb781611325565b6001600160a01b03811660009081526004602052604081205480611a19576000915050611320565b600180820381548110611a2857fe5b906000526020600020906004020160030154915050919050565b600081565b606781565b60105481565b60018181548110611a5f57fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b601081565b61100881565b600b81565b600c5481565b606681565b3361200014611afd5760405162461bcd60e51b8152600401610c5090616d83565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051611b3093929190616f44565b60405180910390a1505050565b6103e881565b60025481565b60115481565b600a5481565b6001600160a01b03811660009081526004602052604081205480611b8b5760405162461bcd60e51b8152600401610c5090616d0b565b6000190192915050565b600b54611c5357611ba4615d76565b60015460005b81811015611c4f57600b80546001810182556000919091528351600080516020616fae8339815191526016909202918201908155602080860151600080516020616fee8339815191528401805460ff1916911515919091179055604086015180518794611c2b93600080516020616fce833981519152909101920190615da5565b506060820151611c419060038301906013615e1f565b505050806001019050611baa565b5050505b600854611c605760036008555b600a54611c6d576002600a555b6000611c7833611b55565b9050611c8381611256565b611c9f5760405162461bcd60e51b8152600401610c5090616a48565b61152c3382614661565b600981565b61100781565b600381565b60c881565b61100681565b6040518060a001604052806078815260200161700e6078913981565b60005460ff1681565b6402540be40081565b60005460ff16611d145760405162461bcd60e51b8152600401610c5090616638565b3361100714611d355760405162461bcd60e51b8152600401610c5090616b11565b611d9f84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b602082015291506146f99050565b15611e3c5760208114611dc45760405162461bcd60e51b8152600401610c5090616cc5565b604080516020601f8401819004810282018101909252828152600091611e029185858083850183828082843760009201919091525061475292505050565b905060648110158015611e185750620186a08111155b611e345760405162461bcd60e51b8152600401610c50906168f1565b60025561255b565b611e9c84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b602082015291506146f99050565b15611f385760208114611ec15760405162461bcd60e51b8152600401610c50906164be565b604080516020601f8401819004810282018101909252828152600091611eff9185858083850183828082843760009201919091525061475292505050565b9050612710811115611f235760405162461bcd60e51b8152600401610c50906167d6565b6006556007805460ff1916600117905561255b565b611fa284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260138152726d61784e756d4f664d61696e7461696e696e6760681b602082015291506146f99050565b1561203c5760208114611fc75760405162461bcd60e51b8152600401610c50906164f5565b604080516020601f84018190048102820181019092528281526000916120059185858083850183828082843760009201919091525061475292505050565b600c5490915080612014575060155b8082106120335760405162461bcd60e51b8152600401610c5090616849565b5060085561255b565b6120a584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61696e7461696e536c6173685363616c6560701b602082015291506146f99050565b1561213e57602081146120ca5760405162461bcd60e51b8152600401610c50906165be565b604080516020601f84018190048102820181019092528281526000916121089185858083850183828082843760009201919091525061475292505050565b905060008111801561211a5750600a81105b6121365760405162461bcd60e51b8152600401610c5090616e1f565b600a5561255b565b6121b284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601981527f6d61784e756d4f66576f726b696e6743616e6469646174657300000000000000602082015291506146f99050565b1561224157602081146121d75760405162461bcd60e51b8152600401610c5090616572565b604080516020601f84018190048102820181019092528281526000916122159185858083850183828082843760009201919091525061475292505050565b9050600d548111156122395760405162461bcd60e51b8152600401610c5090616967565b600e5561255b565b6122aa84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260128152716d61784e756d4f6643616e6469646174657360701b602082015291506146f99050565b1561232c57602081146122cf5760405162461bcd60e51b8152600401610c5090616b5f565b604080516020601f840181900481028201810190925282815260009161230d9185858083850183828082843760009201919091525061475292505050565b600d819055600e5490915081101561232657600d54600e555b5061255b565b61239084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c6e756d4f66436162696e65747360981b602082015291506146f99050565b1561243e57602081146123b55760405162461bcd60e51b8152600401610c5090616603565b604080516020601f84018190048102820181019092528281526000916123f39185858083850183828082843760009201919091525061475292505050565b9050600081116124155760405162461bcd60e51b8152600401610c50906166a6565b60298111156124365760405162461bcd60e51b8152600401610c50906166ee565b600c5561255b565b6124a884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601381527266696e616c697479526577617264526174696f60681b602082015291506146f99050565b1561254357602081146124cd5760405162461bcd60e51b8152600401610c5090616c48565b604080516020601f840181900481028201810190925282815260009161250b9185858083850183828082843760009201919091525061475292505050565b90506001811015801561251f575060648111155b61253b5760405162461bcd60e51b8152600401610c50906169d6565b600f5561255b565b60405162461bcd60e51b8152600401610c5090616e7c565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051612590949392919061648c565b60405180910390a150505050565b60046020526000908152604090205481565b68056bc75e2d6310000081565b6001546060906000805b828110156125ec576125d881611325565b156125e4578160010191505b6001016125c7565b50606081604051908082528060200260200182016040528015612619578160200160208202803683370190505b5090506000915060005b838110156126a05761263481611325565b15612698576001818154811061264657fe5b600091825260209091206004909102015482516001600160a01b039091169083908590811061267157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508260010192505b600101612623565b50925050505b90565b601581565b61100281565b603281565b60006126c36125bd565b519050600080600c54116126d85760156126dc565b600c545b9050808211156126ea578091505b816126f457600191505b5090565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff16156127385760405162461bcd60e51b8152600401610c5090616c11565b612740615e4c565b60006127636040518060a001604052806078815260200161700e60789139612f1e565b91509150806127845760405162461bcd60e51b8152600401610c5090616d42565b60005b8260200151518110156128a9576001836020015182815181106127a657fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a09093015160039093019290925591860151805191850193918590811061287c57fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101612787565b50506103e8600255506000805460ff19166001179055565b600d5481565b33611001146128e85760405162461bcd60e51b8152600401610c5090616ea3565b600b546129a6576128f7615d76565b60015460005b818110156129a257600b80546001810182556000919091528351600080516020616fae8339815191526016909202918201908155602080860151600080516020616fee8339815191528401805460ff191691151591909117905560408601518051879461297e93600080516020616fce833981519152909101920190615da5565b5060608201516129949060038301906013615e1f565b5050508060010190506128fd565b5050505b60006129b182614757565b90506129bc81611256565b156129cb576129cb8282614661565b5050565b606581565b3341146129f35760405162461bcd60e51b8152600401610c5090616dd2565b60005460ff16612a155760405162461bcd60e51b8152600401610c5090616638565b60003411612a355760405162461bcd60e51b8152600401610c5090616938565b6001600160a01b03811660009081526004602052604081205460075434929060ff1615612a6157506006545b600083118015612a715750600081115b15612b12576000612a8e612710610fb1868563ffffffff613f8a16565b90508015612b105760405161dead9082156108fc029083906000818181858888f19350505050158015612ac5573d6000803e3d6000fd5b507f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee581604051612af59190616efb565b60405180910390a1612b0d848263ffffffff613f4816565b93505b505b8115612c10576000600180840381548110612b2957fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615612b9657846001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b485604051612b899190616efb565b60405180910390a2612c0a565b600354612ba9908563ffffffff613fc416565b6003908155810154612bc1908563ffffffff613fc416565b60038201556040516001600160a01b038616907f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc05590612c01908790616efb565b60405180910390a25b50612c52565b836001600160a01b03167ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b484604051612c499190616efb565b60405180910390a25b50505050565b600e5481565b61100081565b61dead81565b600b8181548110612c7757fe5b6000918252602091829020601691909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f810188900488028501880190925281845293965060ff90911694919291830182828015612d225780601f10612cf757610100808354040283529160200191612d22565b820191906000526020600020905b815481529060010190602001808311612d0557829003601f168201915b5050505050905083565b61100481565b6000600a5460001480612d43575081155b80612d4e5750600954155b15612d5b57506000610eb7565b60096000815460019003919050819055506000612da6600a54610fb185610fb1600b8981548110612d8857fe5b6000918252602090912060169091020154439063ffffffff613f4816565b90506000600b8581548110612db757fe5b906000526020600020906016020160010160006101000a81548160ff0219169083151502179055506000806110016001600160a01b0316638256ace66040518163ffffffff1660e01b8152600401604080518083038186803b158015612e1c57600080fd5b505afa158015612e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5491906161c5565b9150915060009350808310612ece57612e6d8787613fe9565b506040516305bfb49960e41b815261100190635bfb499090612e93908a90600401616302565b600060405180830381600087803b158015612ead57600080fd5b505af1158015612ec1573d6000803e3d6000fd5b5050505060019350612ee0565b818310612ee057612ede87614757565b505b6040516001600160a01b038816907fb9d38178dc641ff1817967a63c9078cbcd955a9f1fcd75e0e3636de615d44d3b90600090a25050509392505050565b612f26615e4c565b6000612f30615e4c565b612f38615e70565b612f49612f44866148fa565b61491f565b90506000805b612f5883614969565b156130cc5780612f7d57612f73612f6e8461498a565b6149d8565b60ff1684526130c4565b80600114156130bf576060612f99612f948561498a565b614a58565b90508051604051908082528060200260200182016040528015612fd657816020015b612fc3615e90565b815260200190600190039081612fbb5790505b508560200181905250805160405190808252806020026020018201604052801561301457816020015b6060815260200190600190039081612fff5790505b50604086015260005b81518110156130b45761302e615e90565b6060600061304e85858151811061304157fe5b6020026020010151614b29565b9250925092508061306e578860009a509a505050505050505050506130d5565b828960200151858151811061307f57fe5b6020026020010181905250818960400151858151811061309b57fe5b602002602001018190525050505080600101905061301d565b5060019250506130c4565b6130cc565b600101612f4f565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816130f457905050905061311a8363ffffffff16614c43565b8160008151811061312757fe5b6020026020010181905250610eb781614c56565b600060298351111561317257600080516020616f8e8339815191526040516131629061674b565b60405180910390a15060666113d0565b60005b83518110156132105760005b818110156132075784818151811061319557fe5b6020026020010151600001516001600160a01b03168583815181106131b657fe5b6020026020010151600001516001600160a01b031614156131ff57600080516020616f8e8339815191526040516131ec906168a6565b60405180910390a16066925050506113d0565b600101613181565b50600101613175565b5060608061321e8585614ce0565b60015491935091506000908190815b818110156132a35767016345785d8a00006001828154811061324b57fe5b9060005260206000209060040201600301541061326d5783600101935061329b565b60006001828154811061327c57fe5b906000526020600020906004020160030154111561329b578260010192505b60010161322d565b506060836040519080825280602002602001820160405280156132d0578160200160208202803683370190505b5090506060846040519080825280602002602001820160405280156132ff578160200160208202803683370190505b50905060608560405190808252806020026020018201604052801561332e578160200160208202803683370190505b50905060608660405190808252806020026020018201604052801561335d578160200160208202803683370190505b509050600060608760405190808252806020026020018201604052801561338e578160200160208202803683370190505b5090506060886040519080825280602002602001820160405280156133bd578160200160208202803683370190505b509050600099506000985060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561340557600080fd5b505afa158015613419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343d91906161ad565b905067016345785d8a000081111561348857600080516020616f8e83398151915260405161346a90616bd0565b60405180910390a160689d50505050505050505050505050506113d0565b60005b898110156136f95767016345785d8a0000600182815481106134a957fe5b9060005260206000209060040201600301541061362e57600181815481106134cd57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316898d815181106134fe57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be4006001838154811061353357fe5b9060005260206000209060040201600301548161354c57fe5b066001838154811061355a57fe5b9060005260206000209060040201600301540390506135828382613f4890919063ffffffff16565b898e8151811061358e57fe5b602002602001018181525050600182815481106135a757fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316878e815181106135d857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081888e8151811061360557fe5b6020908102919091010152613620868263ffffffff613fc416565b95508c6001019c50506136f1565b60006001828154811061363d57fe5b90600052602060002090600402016003015411156136f1576001818154811061366257fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316848c8151811061369357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600181815481106136c057fe5b906000526020600020906004020160030154838c815181106136de57fe5b6020026020010181815250508a6001019a505b60010161348b565b506000841561396f576002546040516303702b2960e51b815261100491636e056520918891613733918e918e918d914201906004016163f4565b6020604051808303818588803b15801561374c57600080fd5b505af19350505050801561377d575060408051601f3d908101601f1916820190925261377a91810190616119565b60015b6138f4576040516000815260443d101561379957506000613834565b60046000803e60005160e01c6308c379a081146137ba576000915050613834565b60043d036004833e81513d60248201116001600160401b03821117156137e557600092505050613834565b80830180516001600160401b03811115613806576000945050505050613834565b8060208301013d860181111561382457600095505050505050613834565b601f01601f191660405250925050505b8061383f5750613881565b60019150857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040516138739190616479565b60405180910390a2506138ef565b3d8080156138ab576040519150601f19603f3d011682016040523d82523d6000602084013e6138b0565b606091505b5060019150857fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040516138e59190616479565b60405180910390a2505b61396f565b8015613936577fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b70866040516139299190616efb565b60405180910390a161396d565b857fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf2806040516139649061653b565b60405180910390a25b505b8015613b255760005b8751811015613b2357600088828151811061398f57fe5b602002602001015190506000600182815481106139a857fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc91859081106139d957fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015613a955760018281548110613a1a57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110613a6957fe5b906000526020600020906004020160030154604051613a889190616efb565b60405180910390a2613b19565b60018281548110613aa257fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110613af157fe5b906000526020600020906004020160030154604051613b109190616efb565b60405180910390a25b5050600101613978565b505b835115613c6f5760005b8451811015613c6d576000858281518110613b4657fe5b60200260200101516001600160a01b03166108fc868481518110613b6657fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015613bfc57858281518110613b9c57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d868481518110613bda57fe5b6020026020010151604051613bef9190616efb565b60405180910390a2613c64565b858281518110613c0857fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d868481518110613c4657fe5b6020026020010151604051613c5b9190616efb565b60405180910390a25b50600101613b2f565b505b5050505050505050505050506000471115613ceb577f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d47604051613cb39190616efb565b60405180910390a1604051611002904780156108fc02916000818181858888f19350505050158015613ce9573d6000803e3d6000fd5b505b60006003819055600555815115613d0657613d068282614f19565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613d4357600080fd5b505af1158015613d57573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a1506000949350505050565b80516001600160a01b0316600090815260046020526040812054801580613de05750600180820381548110613dc057fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15613e265782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611320565b600154600554600019820111801590613e7c5784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611320565b600580546001908101909155805481906000198601908110613e9a57fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000610eb783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506156f8565b6000610eb783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061572f565b600082613f99575060006113d0565b82820282848281613fa657fe5b0414610eb75760405162461bcd60e51b8152600401610c5090616ad0565b600082820183811015610eb75760405162461bcd60e51b8152600401610c509061666f565b60008060018381548110613ff957fe5b906000526020600020906004020160030154905060006001808054905003905060016140236125bd565b51116140585760006001858154811061403857fe5b9060005260206000209060040201600301819055506000925050506113d0565b846001600160a01b03167f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70836040516140919190616efb565b60405180910390a26001600160a01b038516600090815260046020526040812055835b6001546000190181101561427e57600181600101815481106140d257fe5b9060005260206000209060040201600182815481106140ed57fe5b60009182526020909120825460049092020180546001600160a01b03199081166001600160a01b0393841617825560018085015481840180548416918616919091179055600280860180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b19909416939093179055600392830154920191909155600b8054909183019081106141ae57fe5b9060005260206000209060160201600b82815481106141c957fe5b600091825260209091208254601690920201908155600180830154818301805460ff909216151560ff1990921691909117905560028084018054614220938386019390821615610100026000190190911604615ec5565b5061423360038281019084016013615f3a565b5090505080600101600460006001848154811061424c57fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020556001016140b4565b50600180548061428a57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806142dd57fe5b60008281526020812060166000199093019283020181815560018101805460ff191690559061430f6002830182615f64565b61431d600383016000615fa8565b50509055600081838161432c57fe5b04905080156143905760015460005b8181101561438d57826001828154811061435157fe5b906000526020600020906004020160030154016001828154811061437157fe5b600091825260209091206003600490920201015560010161433b565b50505b50600195945050505050565b6001548151604080518281526020808402820101909152606092919083908280156143db57816020015b60608152602001906001900390816143c65790505b50600b5490915083146143f2579250611320915050565b60005b8281101561450157600b60016004600089858151811061441157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054038154811061444557fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156144dd5780601f106144b2576101008083540402835291602001916144dd565b820191906000526020600020905b8154815290600101906020018083116144c057829003601f168201915b50505050508282815181106144ee57fe5b60209081029190910101526001016143f5565b50949350505050565b60005b82811015614657576000828783880160405160200161452d9291906162f4565b6040516020818303038152906040528051906020012060001c8161454d57fe5b0690508085018287011461464e576000898388018151811061456b57fe5b602002602001015190506060898489018151811061458557fe5b602002602001015190508a8388018151811061459d57fe5b60200260200101518b858a01815181106145b357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818b848901815181106145e257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050898388018151811061461057fe5b60200260200101518a858a018151811061462657fe5b6020026020010181905250808a8489018151811061464057fe5b602002602001018190525050505b5060010161450d565b5050505050505050565b600980546001908101909155600b80548390811061467b57fe5b906000526020600020906016020160010160006101000a81548160ff02191690831515021790555043600b82815481106146b157fe5b600091825260208220601690910201919091556040516001600160a01b038416917ff62981a567ec3cec866c6fa93c55bcdf841d6292d18b8d522ececa769375d82d91a25050565b60008160405160200161470c91906162d8565b604051602081830303815290604052805190602001208360405160200161473391906162d8565b6040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b0381166000908152600460205260408120548061478057506000199050611320565b60018103905060006001828154811061479557fe5b90600052602060002090600402016003015490506000600183815481106147b857fe5b6000918252602090912060036004909202010155600154604051600019909101906001600160a01b038616907f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d90614811908590616efb565b60405180910390a28061482957829350505050611320565b600081838161483457fe5b04905080156148f05760005b8481101561489257816001828154811061485657fe5b906000526020600020906004020160030154016001828154811061487657fe5b6000918252602090912060036004909202010155600101614840565b50600180549085015b818110156148ed5782600182815481106148b157fe5b90600052602060002090600402016003015401600182815481106148d157fe5b600091825260209091206003600490920201015560010161489b565b50505b5091949350505050565b614902615fb7565b506040805180820190915281518152602082810190820152919050565b614927615e70565b6149308261575b565b61493957600080fd5b60006149488360200151615795565b60208085015160408051808201909152868152920190820152915050919050565b6000614973615fb7565b505080518051602091820151919092015191011190565b614992615fb7565b61499b82614969565b6149a457600080fd5b602082015160006149b4826157f8565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906149ed57508151602110155b6149f657600080fd5b6000614a058360200151615795565b90508083600001511015614a2b5760405162461bcd60e51b8152600401610c5090616c8e565b82516020808501518301805192849003929183101561450157506020919091036101000a90049392505050565b6060614a638261575b565b614a6c57600080fd5b6000614a77836158d9565b9050606081604051908082528060200260200182016040528015614ab557816020015b614aa2615fb7565b815260200190600190039081614a9a5790505b5090506000614ac78560200151615795565b60208601510190506000805b84811015614b1e57614ae4836157f8565b9150604051806040016040528083815260200184815250848281518110614b0757fe5b602090810291909101015291810191600101614ad3565b509195945050505050565b614b31615e90565b60606000614b3d615e90565b6060614b47615e70565b614b508761491f565b90506000805b614b5f83614969565b15614c345780614b8a57614b7a614b758461498a565b615935565b6001600160a01b03168552614c2c565b8060011415614bb257614b9f614b758461498a565b6001600160a01b03166020860152614c2c565b8060021415614bda57614bc7614b758461498a565b6001600160a01b03166040860152614c2c565b8060031415614c0657614bef612f6e8461498a565b6001600160401b0316606086015260019150614c2c565b8060041415614c2757614c20614c1b8461498a565b61594f565b9350614c2c565b614c34565b600101614b56565b50929791965091945092505050565b60606113d0614c51836159bf565b615aa5565b6060815160001415614c775750604080516000815260208101909152611320565b606082600081518110614c8657fe5b602002602001015190506000600190505b8351811015614cc757614cbd82858381518110614cb057fe5b6020026020010151615af7565b9150600101614c97565b50610eb7614cda825160c060ff16615b74565b82615af7565b606080600080808080614cf16126b9565b6001549091505b8015614dff57600181039250600b8381548110614d1157fe5b600091825260209091206001601690920201015460ff16614d3157614df6565b60018381548110614d3e57fe5b60009182526020909120600490910201546001600160a01b03169450614d65858484612d32565b9350831580614d78575060018a51038610155b15614d8257614df6565b60005b8a51811015614df457856001600160a01b03168b8281518110614da457fe5b6020026020010151600001516001600160a01b03161415614dec5760018b8281518110614dcd57fe5b6020908102919091010151901515608090910152600190960195614df4565b600101614d85565b505b60001901614cf8565b5084895103604051908082528060200260200182016040528015614e3d57816020015b614e2a615e90565b815260200190600190039081614e225790505b50965084895103604051908082528060200260200182016040528015614e7757816020015b6060815260200190600190039081614e625790505b5095506000915060005b8951811015614f0b57898181518110614e9657fe5b602002602001015160800151614f0357898181518110614eb257fe5b6020026020010151888481518110614ec657fe5b6020026020010181905250888181518110614edd57fe5b6020026020010151878481518110614ef157fe5b60200260200101819052508260010192505b600101614e81565b5050505050505b9250929050565b600154825160005b82811015615036576001614f33615e90565b60018381548110614f4057fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b8481101561500a57878181518110614fd057fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b03161415615002576000925061500a565b600101614fbc565b50811561502c5780516001600160a01b03166000908152600460205260408120555b5050600101614f21565b50808211156150f557805b828110156150f357600180548061505457fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055600b8054806150a757fe5b60008281526020812060166000199093019283020181815560018101805460ff19169055906150d96002830182615f64565b6150e7600383016000615fa8565b50509055600101615041565b505b60008183106151045781615106565b825b905060005b818110156154aa576151b886828151811061512257fe5b60200260200101516001838154811061513757fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152615c46565b61536c5780600101600460008884815181106151d057fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555085818151811061520c57fe5b60200260200101516001828154811061522157fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015584518590829081106152dc57fe5b6020026020010151600b82815481106152f157fe5b90600052602060002090601602016002019080519060200190615315929190615da5565b506000600b828154811061532557fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b80548390811061535657fe5b60009182526020909120601690910201556154a2565b61543285828151811061537b57fe5b6020026020010151600b838154811061539057fe5b600091825260209182902060026016909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156154285780601f106153fd57610100808354040283529160200191615428565b820191906000526020600020905b81548152906001019060200180831161540b57829003601f168201915b5050505050615cc7565b61547d5784818151811061544257fe5b6020026020010151600b828154811061545757fe5b9060005260206000209060160201600201908051906020019061547b929190615da5565b505b60006001828154811061548c57fe5b9060005260206000209060040201600301819055505b60010161510b565b5082821115615682576154bb615d76565b835b8381101561567f578581815181106154d157fe5b6020026020010151826040018190525060018782815181106154ef57fe5b6020908102919091018101518254600181810185556000948552838520835160049093020180546001600160a01b039384166001600160a01b0319918216178255848601518284018054918616918316919091179055604080860151600284018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909a1692909616919091179290921696909617169190911790935560a090930151600390930192909255600b8054928301815590935284516016909102600080516020616fae833981519152810191825585830151600080516020616fee8339815191528201805491151560ff199092169190911790559285015180518694929361562593600080516020616fce83398151915201920190615da5565b50606082015161563b9060038301906013615e1f565b505050806001016004600089848151811061565257fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016154bd565b50505b6000600981905560015493505b838110156156f0576000600b82815481106156a657fe5b60009182526020822060169190910201600101805460ff191692151592909217909155600b8054839081106156d757fe5b600091825260209091206016909102015560010161568f565b505050505050565b600081836157195760405162461bcd60e51b8152600401610c509190616479565b50600083858161572557fe5b0495945050505050565b600081848411156157535760405162461bcd60e51b8152600401610c509190616479565b505050900390565b805160009061576c57506000611320565b6020820151805160001a9060c082101561578b57600092505050611320565b5060019392505050565b8051600090811a60808110156157af576000915050611320565b60b88110806157ca575060c081108015906157ca575060f881105b156157d9576001915050611320565b60c08110156157ed5760b519019050611320565b60f519019050611320565b80516000908190811a608081101561581357600191506158d2565b60b881101561582857607e19810191506158d2565b60c081101561587957600060b78203600186019550806020036101000a8651049150600181018201935050808310156158735760405162461bcd60e51b8152600401610c5090616a1d565b506158d2565b60f881101561588e5760be19810191506158d2565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156158d05760405162461bcd60e51b8152600401610c5090616a1d565b505b5092915050565b80516000906158ea57506000611320565b600080905060006158fe8460200151615795565b602085015185519181019250015b8082101561592c5761591d826157f8565b8201915082600101925061590c565b50909392505050565b805160009060151461594657600080fd5b6113d0826149d8565b805160609061595d57600080fd5b600061596c8360200151615795565b83516040805191839003808352601f19601f82011683016020019091529192506060908280156159a3576020820181803683370190505b5090506000816020019050614501848760200151018285615d2b565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615a0357506018615a27565b6fffffffffffffffffffffffffffffffff198416615a2357506010615a27565b5060005b6020811015615a5d57818181518110615a3c57fe5b01602001516001600160f81b03191615615a5557615a5d565b600101615a27565b60008160200390506060816040519080825280601f01601f191660200182016040528015615a92576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015615ad75750607f60f81b82600081518110615ac557fe5b01602001516001600160f81b03191611155b15615ae3575080611320565b6113d0615af58351608060ff16615b74565b835b6060806040519050835180825260208201818101602087015b81831015615b28578051835260209283019201615b10565b50855184518101855292509050808201602086015b81831015615b55578051835260209283019201615b3d565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310615b9e5760405162461bcd60e51b8152600401610c5090616821565b60408051600180825281830190925260609160208201818036833701905050905060378411615bf85782840160f81b81600081518110615bda57fe5b60200101906001600160f81b031916908160001a90535090506113d0565b6060615c03856159bf565b90508381510160370160f81b82600081518110615c1c57fe5b60200101906001600160f81b031916908160001a905350615c3d8282615af7565b95945050505050565b805182516000916001600160a01b039182169116148015615c80575081602001516001600160a01b031683602001516001600160a01b0316145b8015615ca5575081604001516001600160a01b031683604001516001600160a01b0316145b8015610eb75750506060908101519101516001600160401b0390811691161490565b815181516000916001918114808314615ce35760009250615d21565b600160208701838101602088015b600284838510011415615d1c578051835114615d105760009650600093505b60209283019201615cf1565b505050505b5090949350505050565b80615d3557610c70565b5b60208110615d55578251825260209283019290910190601f1901615d36565b915181516020939093036101000a6000190180199091169216919091179052565b60405180608001604052806000815260200160001515815260200160608152602001615da0615fd1565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615de657805160ff1916838001178555615e13565b82800160010185558215615e13579182015b82811115615e13578251825591602001919060010190615df8565b506126f4929150615ff0565b8260138101928215615e135791602002820182811115615e13578251825591602001919060010190615df8565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060400160405280615e83615fb7565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615efe5780548555615e13565b82800160010185558215615e1357600052602060002091601f016020900482015b82811115615e13578254825591600101919060010190615f1f565b8260138101928215615e135791820182811115615e13578254825591600101919060010190615f1f565b50805460018160011615610100020316600290046000825580601f10615f8a575061152c565b601f01602090049060005260206000209081019061152c9190615ff0565b5061152c906013810190615ff0565b604051806040016040528060008152602001600081525090565b6040518061026001604052806013906020820280368337509192915050565b6126a691905b808211156126f45760008155600101615ff6565b60008083601f84011261601b578182fd5b5081356001600160401b03811115616031578182fd5b6020830191508360208083028501011115614f1257600080fd5b60008083601f84011261605c578182fd5b5081356001600160401b03811115616072578182fd5b602083019150836020828501011115614f1257600080fd5b60006020828403121561609b578081fd5b81356001600160a01b0381168114610eb7578182fd5b600080600080604085870312156160c6578283fd5b84356001600160401b03808211156160dc578485fd5b6160e88883890161600a565b90965094506020870135915080821115616100578384fd5b5061610d8782880161600a565b95989497509550505050565b60006020828403121561612a578081fd5b81518015158114610eb7578182fd5b6000806000806040858703121561614e578384fd5b84356001600160401b0380821115616164578586fd5b6161708883890161604b565b90965094506020870135915080821115616188578384fd5b5061610d8782880161604b565b6000602082840312156161a6578081fd5b5035919050565b6000602082840312156161be578081fd5b5051919050565b600080604083850312156161d7578182fd5b505080516020909101519092909150565b6000806000604084860312156161fc578283fd5b833560ff8116811461620c578384fd5b925060208401356001600160401b03811115616226578283fd5b6162328682870161604b565b9497909650939450505050565b6000815180845260208085019450808401835b838110156162775781516001600160a01b031687529582019590820190600101616252565b509495945050505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526162c4816020860160208601616f61565b601f01601f19169290920160200192915050565b600082516162ea818460208701616f61565b9190910192915050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03968716815294861660208601529290941660408401526001600160401b03166060830152911515608082015260a081019190915260c00190565b600060208252610eb7602083018461623f565b600060408252616397604083018561623f565b602083820381850152818551808452828401915082838202850101838801865b838110156163e557601f198784030185526163d38383516162ac565b948601949250908501906001016163b7565b50909998505050505050505050565b600060808252616407608083018761623f565b828103602084810191909152865180835287820192820190845b8181101561643d57845183529383019391830191600101616421565b50508481036040860152616451818861623f565b93505050506001600160401b038316606083015295945050505050565b901515815260200190565b600060208252610eb760208301846162ac565b6000604082526164a0604083018688616282565b82810360208401526164b3818587616282565b979650505050505050565b6020808252601c908201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604082015260600190565b60208082526026908201527f6c656e677468206f66206d61784e756d4f664d61696e7461696e696e67206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601b908201527f6261746368207472616e736665722072657475726e2066616c73650000000000604082015260600190565b6020808252602c908201527f6c656e677468206f66206d61784e756d4f66576f726b696e6743616e6469646160408201526b0e8cae640dad2e6dac2e8c6d60a31b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61696e7461696e536c6173685363616c65206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252818101527f6c656e677468206f66206e756d4f66436162696e657473206d69736d61746368604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f746865206e756d4f66436162696e657473206d75737420626520677265617465604082015267072207468616e20360c41b606082015260800190565b60208082526039908201527f746865206e756d4f66436162696e657473206d757374206265206c657373207460408201527f68616e204d41585f4e554d5f4f465f56414c494441544f525300000000000000606082015260800190565b60208082526029908201527f746865206e756d626572206f662076616c696461746f727320657863656564206040820152681d1a19481b1a5b5a5d60ba1b606082015260800190565b60208082526022908201527f63616e206e6f7420646f207468697320747769636520696e206f6e6520626c6f604082015261636b60f01b606082015260800190565b6020808252602b908201527f746865206275726e526174696f206d757374206265206e6f206772656174657260408201526a0207468616e2031303030360ac1b606082015260800190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526037908201527f746865206d61784e756d4f664d61696e7461696e696e67206d7573742062652060408201527f6c657373207468616e206e756d4f66436162696e657473000000000000000000606082015260800190565b6020808252602b908201527f6475706c696361746520636f6e73656e7375732061646472657373206f66207660408201526a185b1a59185d1bdc94d95d60aa1b606082015260800190565b60208082526027908201527f7468652065787069726554696d655365636f6e64476170206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601590820152746465706f7369742076616c7565206973207a65726f60581b604082015260600190565b60208082526049908201527f746865206d61784e756d4f66576f726b696e6743616e64696461746573206d7560408201527f7374206265206e6f742067726561746572207468616e206d61784e756d4f6643606082015268616e6469646174657360b81b608082015260a00190565b60208082526027908201527f7468652066696e616c697479526577617264526174696f206973206f7574206f604082015266662072616e676560c81b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b60208082526023908201527f63616e206e6f7420656e7465722054656d706f72617279204d61696e74656e616040820152626e636560e81b606082015260800190565b60208082526025908201527f6c656e677468206f66206a61696c2076616c696461746f7273206d757374206260408201526465206f6e6560d81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526025908201527f6c656e677468206f66206d61784e756d4f6643616e64696461746573206d69736040820152640dac2e8c6d60db1b606082015260800190565b6020808252601290820152716e6f7420696e206d61696e74656e616e636560701b604082015260600190565b60208082526021908201527f666565206973206c6172676572207468616e2044555354595f494e434f4d494e6040820152604760f81b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662066696e616c697479526577617264526174696f206d696040820152650e6dac2e8c6d60d31b606082015260800190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526026908201527f6c656e677468206f662065787069726554696d655365636f6e64476170206d696040820152650e6dac2e8c6d60d31b606082015260800190565b60208082526017908201527f6f6e6c792063757272656e742076616c696461746f7273000000000000000000604082015260600190565b60208082526021908201527f6661696c656420746f20706172736520696e69742076616c696461746f7253656040820152601d60fa1b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252603e908201527f746865206d61696e7461696e536c6173685363616c65206d757374206265206760408201527f726561746572207468616e203020616e64206c657373207468616e2031300000606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b61ffff91909116815260200190565b90815260200190565b6000848252831515602083015260606040830152615c3d60608301846162ac565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff8516825260406020830152615c3d604083018486616282565b60005b83811015616f7c578181015183820152602001616f64565b83811115612c52575050600091015256fe70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb20175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbaf87680f873f871949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d791949fb29aac15b9a4b7f17c3385939b007540f4d79164b085e6972fc98cd3c81d64d40e325acfed44365b97a7567a27939c14dbc7512ddcf54cb1284eb637cfa308ae4e00cb5588a2646970667358221220f131585f67d7c2ce7f1233cba285837a95359e755ac1bd9f6c884f2024f7190564736f6c63430006040033" }, "0x0000000000000000000000000000000000001001": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80637942fd051161015c578063c80d4b8f116100ce578063dc927faf11610087578063dc927faf146104ad578063e1c7392a146104b5578063f9a2bbc7146104bd578063fc3e5908146104c5578063fc4333cd146104cd578063fd6a6879146104d55761027f565b8063c80d4b8f1461045c578063c81b166214610464578063c8509d811461046c578063c96be4cb1461047f578063cc844b7314610492578063d2a42e4b146104a55761027f565b80639dc09262116101205780639dc0926214610421578063a1a11bf514610429578063a78abc1614610431578063ab51bb9614610439578063ac0af62914610441578063ac431751146104495761027f565b80637942fd05146103ee5780638256ace6146103f6578063831d65d1146103fe57806396713da9146104115780639bc8e4f2146104195761027f565b8063493279b1116101f557806362b72cf5116101b957806362b72cf5146103be5780636e47b482146103c657806370fd5bad146103ce578063718a8aa8146103d657806375d47a0a146103de5780637912a65d146103e65761027f565b8063493279b11461037c5780634bf6c8821461039157806351e8067214610399578063567a372d146103a15780635bfb4990146103a95761027f565b806335aa2e441161024757806335aa2e441461030e57806337c8dab914610321578063389f4f71146103425780633a63f4b1146103575780633dffc3871461035f57806343756e5c146103745761027f565b80630bee7a67146102845780630e2374a5146102a25780631182b875146102b757806322d1e80b146102d757806323bac5a2146102ec575b600080fd5b61028c6104dd565b604051610299919061336c565b60405180910390f35b6102aa6104e2565b6040516102999190612c1d565b6102ca6102c5366004612b53565b6104e8565b6040516102999190612c55565b6102df61054e565b6040516102999190612c4a565b6102ff6102fa366004612901565b610557565b60405161029993929190613354565b6102aa61031c366004612b23565b61057a565b61033461032f366004612901565b6105a1565b604051610299929190613346565b61034a6105f8565b604051610299919061331c565b61034a6105fe565b610367610604565b604051610299919061337d565b6102aa610609565b61038461060f565b604051610299919061330d565b610367610615565b6102aa61061a565b61034a610620565b6103bc6103b7366004612901565b610626565b005b61034a6106d1565b6102aa6106d7565b6103676106dd565b6103676106e2565b6102aa6106e7565b61034a6106ed565b6103676106f2565b6103346106f7565b6103bc61040c366004612b53565b610701565b610367610813565b61034a610818565b6102aa610823565b6102aa610829565b6102df61082f565b61028c610838565b61034a61083d565b6103bc610457366004612a07565b610842565b61034a610ce1565b6102aa610ce6565b6103bc61047a366004612b53565b610cec565b6103bc61048d366004612901565b610d5d565b6103bc6104a0366004612a70565b61114e565b61034a611734565b6102aa611739565b6103bc61173f565b6102aa61177b565b610367611781565b6103bc611786565b6102aa611bcf565b606481565b61200181565b606033612000146105145760405162461bcd60e51b815260040161050b90613165565b60405180910390fd5b60005460ff166105365760405162461bcd60e51b815260040161050b90612d06565b60405162461bcd60e51b815260040161050b90613256565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061058757fe5b6000918252602090912001546001600160a01b0316905081565b6000806105ac6126e8565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b60065481565b600181565b61100181565b6102ca81565b600881565b61200081565b60045481565b33611000146106475760405162461bcd60e51b815260040161050b90612f4a565b60005460ff166106695760405162461bcd60e51b815260040161050b90612d06565b61200063f7a251d7600b61067c84611bd5565b60006040518463ffffffff1660e01b815260040161069c9392919061338b565b600060405180830381600087803b1580156106b657600080fd5b505af11580156106ca573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b6004546005549091565b33612000146107225760405162461bcd60e51b815260040161050b90613165565b60005460ff166107445760405162461bcd60e51b815260040161050b90612d06565b61074c61270b565b600061078d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ca892505050565b9150915080156107d45781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e629967916107c79161336c565b60405180910390a16106ca565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e7916108049161336c565b60405180910390a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff166108645760405162461bcd60e51b815260040161050b90612d06565b33611007146108855760405162461bcd60e51b815260040161050b90613022565b6108f084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611d289050565b1561098b57602081146109155760405162461bcd60e51b815260040161050b90612ed6565b604080516020601f840181900481028201810190925282815260009161095391858580838501838280828437600092019190915250611d8292505050565b905060018110158015610967575060055481105b6109835760405162461bcd60e51b815260040161050b90613120565b600455610c9e565b6109f184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611d289050565b15610a8d5760208114610a165760405162461bcd60e51b815260040161050b90613070565b604080516020601f8401819004810282018101909252828152600091610a5491858580838501838280828437600092019190915250611d8292505050565b90506103e88111158015610a69575060045481115b610a855760405162461bcd60e51b815260040161050b90612d74565b600555610c9e565b610b0184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f66696e616c697479536c617368526577617264526174696f000000000000000060208201529150611d289050565b15610b9b5760208114610b265760405162461bcd60e51b815260040161050b9061328d565b604080516020601f8401819004810282018101909252828152600091610b6491858580838501838280828437600092019190915250611d8292505050565b9050600a8110158015610b775750606481105b610b935760405162461bcd60e51b815260040161050b90612e8a565b600655610c9e565b610c0f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c617368000000000000000060208201529150611d289050565b15610c865760208114610c345760405162461bcd60e51b815260040161050b90612da9565b604080516020601f8401819004810282018101909252828152610c709190848480838501838280828437600092019190915250611d8792505050565b6007805460ff1916911515919091179055610c9e565b60405162461bcd60e51b815260040161050b90613201565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051610cd39493929190612c68565b60405180910390a150505050565b609681565b61100281565b3361200014610d0d5760405162461bcd60e51b815260040161050b90613165565b60005460ff16610d2f5760405162461bcd60e51b815260040161050b90612d06565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610d7c5760405162461bcd60e51b815260040161050b906131b4565b60005460ff16610d9e5760405162461bcd60e51b815260040161050b90612d06565b6003544311610dbf5760405162461bcd60e51b815260040161050b906132d8565b3a15610ddd5760405162461bcd60e51b815260040161050b90612fc5565b60405163155853f360e21b8152611000906355614fcc90610e02908490600401612c1d565b60206040518083038186803b158015610e1a57600080fd5b505afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5291906129e7565b610e5b57611147565b610e636126e8565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610ebe576020810180516001019052610f17565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b438152600554602082015181610f2957fe5b0661107557600060208201526040516335409f7f60e01b8152611000906335409f7f90610f5a908590600401612c1d565b600060405180830381600087803b158015610f7457600080fd5b505af1158015610f88573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610fa885611bd5565b60006040518463ffffffff1660e01b8152600401610fc89392919061338b565b600060405180830381600087803b158015610fe257600080fd5b505af1925050508015610ff3575060015b611070573d808015611021576040519150601f19603f3d011682016040523d82523d6000602084013e611026565b606091505b50826001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c836020015183604051611066929190613325565b60405180910390a2505b6110e1565b60045481602001518161108457fe5b066110e1576040516375abf10160e11b81526110009063eb57e202906110ae908590600401612c1d565b600060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff166111705760405162461bcd60e51b815260040161050b90612d06565b604051630a83aaa960e31b81526110069063541d554890611195903390600401612c1d565b60206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e591906129e7565b6112015760405162461bcd60e51b815260040161050b90612c9a565b60075460ff166112235760405162461bcd60e51b815260040161050b90612cd1565b6006546112305760146006555b438160000151604001516101000111801561125657504381602001516040015161010001115b6112725760405162461bcd60e51b815260040161050b90613228565b8060200151602001518160000151602001511480156112a05750806020015160600151816000015160600151145b156112bd5760405162461bcd60e51b815260040161050b90612f1d565b8051604081015190511080156112dc5750602081015160408101519051105b6112f85760405162461bcd60e51b815260040161050b90612e53565b60208101515181515110801561131d5750806000015160400151816020015160400151105b8061134857508051516020820151511080156113485750806020015160400151816000015160400151105b806113625750806020015160400151816000015160400151145b61137e5760405162461bcd60e51b815260040161050b90612d3d565b604080820151905163ea321e4960e01b81526110009163ea321e49916113a79190600401612c55565b60206040518083038186803b1580156113bf57600080fd5b505afa1580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f791906129e7565b6114135760405162461bcd60e51b815260040161050b90612ff3565b61142581600001518260400151611daf565b801561143e575061143e81602001518260400151611daf565b61145a5760405162461bcd60e51b815260040161050b90612df4565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b15801561149857600080fd5b505afa1580156114ac573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114d49190810190612924565b9150915060005b8151811015611611576115058282815181106114f357fe5b60200260200101518560400151611f87565b15611609576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f09061153d9033908590600401612c31565b602060405180830381600087803b15801561155757600080fd5b505af115801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f9190612b3b565b506110006001600160a01b03166335409f7f8584815181106115ad57fe5b60200260200101516040518263ffffffff1660e01b81526004016115d19190612c1d565b600060405180830381600087803b1580156115eb57600080fd5b505af11580156115ff573d6000803e3d6000fd5b5050505050611611565b6001016114db565b50600061162384604001516000611feb565b90506120006001600160a01b031663f7a251d7600b6116458760400151612007565b60006040518463ffffffff1660e01b81526004016116659392919061338b565b600060405180830381600087803b15801561167f57600080fd5b505af1925050508015611690575060015b611702573d8080156116be576040519150601f19603f3d011682016040523d82523d6000602084013e6116c3565b606091505b50817fd58d1183100bd0932c0588f31c4205d6bc6168909765a96c41adbed3115f3628826040516116f49190612c55565b60405180910390a25061172e565b60405181907f7b78aadacff901d8b63d0dba4f86283d4db8aef27f9ed70413dd860f1c9532b690600090a25b50505050565b601481565b61100381565b60005460ff16156117625760405162461bcd60e51b815260040161050b906130b2565b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146117a75760405162461bcd60e51b815260040161050b90612f4a565b60005460ff166117c95760405162461bcd60e51b815260040161050b90612d06565b6001546117d557611bcd565b600154600090600019015b808211611ba1576000805b82841015611904576117fb6126e8565b600260006001878154811061180c57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff1615159082015260055490915060049004816020015111156118ee5760046005548161187957fe5b0481602001510381602001818152505080600260006001888154811061189b57fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff19169115159190911790556118f8565b6001925050611904565b508360010193506117eb565b828411611a9b576119136126e8565b600260006001868154811061192457fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611a0c5760046005548161199157fe5b048160200151038160200181815250508060026000600187815481106119b357fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611a9b9050565b6002600060018681548110611a1d57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805480611a6157fe5b600082815260209020810160001990810180546001600160a01b031916905501905583611a8e5750611a9b565b5060001990920191611904565b818015611aa55750805b15611b84576002600060018681548110611abb57fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611b0257fe5b600091825260209091200154600180546001600160a01b039092169186908110611b2857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611b6157fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611b90575050611ba1565b5050600190910190600019016117e0565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611bf0579050509050611c19836001600160a01b0316612042565b81600081518110611c2657fe5b6020026020010181905250611c3a43612065565b81600181518110611c4757fe5b6020908102919091010152611c5d6102ca612065565b81600281518110611c6a57fe5b6020026020010181905250611c7e42612065565b81600381518110611c8b57fe5b6020026020010181905250611c9f81612078565b9150505b919050565b611cb061270b565b6000611cba61270b565b611cc261271d565b611cd3611cce86612102565b612127565b90506000805b611ce283612171565b15611d1b5780611d0e57611cfd611cf884612192565b6121e0565b63ffffffff16845260019150611d13565b611d1b565b600101611cd9565b5091935090915050915091565b600081604051602001611d3b9190612c01565b6040516020818303038152906040528051906020012083604051602001611d629190612c01565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615611da1576001915081611da7565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b6060815260200190600190039081611dcb575050604080516020808252818301909252919250606091908082018180368337019050509050611e108560000151612065565b82600081518110611e1d57fe5b6020026020010181905250611e386020866020015183612262565b611e4181612272565b82600181518110611e4e57fe5b6020026020010181905250611e668560400151612065565b82600281518110611e7357fe5b6020026020010181905250611e8e6020866060015183612262565b611e9781612272565b82600381518110611ea457fe5b6020026020010181905250611eca6020611ebd84612078565b8051906020012083612262565b6040805160b080825260e08201909252606091602082018180368337019050509050611efa8183600060206122c8565b611f0c818760800151602060606122c8565b611f1a8186608060306122c8565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa611f5757600080fd5b506001611f6582600061231b565b60ff1614611f7a576000945050505050611d7c565b5060019695505050505050565b815181516000916001918114808314611fa35760009250611fe1565b600160208701838101602088015b600284838510011415611fdc578051835114611fd05760009650600093505b60209283019201611fb1565b505050505b5090949350505050565b60008160200183511015611ffe57600080fd5b50016020015190565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081612022579050509050611c1983612272565b60408051600560a21b8318601482015260348101909152606090611c9f81612272565b6060611d7c61207383612337565b612272565b60608151600014156120995750604080516000815260208101909152611ca3565b6060826000815181106120a857fe5b602002602001015190506000600190505b83518110156120e9576120df828583815181106120d257fe5b602002602001015161241d565b91506001016120b9565b50611c9f6120fc825160c060ff1661249a565b8261241d565b61210a61273d565b506040805180820190915281518152602082810190820152919050565b61212f61271d565b6121388261256c565b61214157600080fd5b600061215083602001516125a6565b60208085015160408051808201909152868152920190820152915050919050565b600061217b61273d565b505080518051602091820151919092015191011190565b61219a61273d565b6121a382612171565b6121ac57600080fd5b602082015160006121bc82612609565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906121f557508151602110155b6121fe57600080fd5b600061220d83602001516125a6565b905080836000015110156122335760405162461bcd60e51b815260040161050b906130e9565b82516020808501518301805192849003929183101561225957826020036101000a820491505b50949350505050565b9091018181526020918201910152565b6060815160011480156122a45750607f60f81b8260008151811061229257fe5b01602001516001600160f81b03191611155b156122b0575080611ca3565b611d7c6122c28351608060ff1661249a565b8361241d565b60005b818110156106ca578381815181106122df57fe5b602001015160f81c60f81b8584806001019550815181106122fc57fe5b60200101906001600160f81b031916908160001a9053506001016122cb565b6000816001018351101561232e57600080fd5b50016001015190565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661237b5750601861239f565b6fffffffffffffffffffffffffffffffff19841661239b5750601061239f565b5060005b60208110156123d5578181815181106123b457fe5b01602001516001600160f81b031916156123cd576123d5565b60010161239f565b60008160200390506060816040519080825280601f01601f19166020018201604052801561240a576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561244e578051835260209283019201612436565b50855184518101855292509050808201602086015b8183101561247b578051835260209283019201612463565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106124c45760405162461bcd60e51b815260040161050b90612e2b565b6040805160018082528183019092526060916020820181803683370190505090506037841161251e5782840160f81b8160008151811061250057fe5b60200101906001600160f81b031916908160001a9053509050611d7c565b606061252985612337565b90508381510160370160f81b8260008151811061254257fe5b60200101906001600160f81b031916908160001a905350612563828261241d565b95945050505050565b805160009061257d57506000611ca3565b6020820151805160001a9060c082101561259c57600092505050611ca3565b5060019392505050565b8051600090811a60808110156125c0576000915050611ca3565b60b88110806125db575060c081108015906125db575060f881105b156125ea576001915050611ca3565b60c08110156125fe5760b519019050611ca3565b60f519019050611ca3565b80516000908190811a608081101561262457600191506126e1565b60b881101561263957607e19810191506126e1565b60c081101561268a57600060b78203600186019550806020036101000a8651049150600181018201935050808310156126845760405162461bcd60e51b815260040161050b90612f9a565b506126e1565b60f881101561269f5760be19810191506126e1565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611da75760405162461bcd60e51b815260040161050b90612f9a565b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061273061273d565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f830112612767578081fd5b815161277a612775826133de565b6133b7565b818152915060208083019084810160005b848110156127f0578151870188603f8201126127a657600080fd5b838101516127b6612775826133fe565b81815260408b818486010111156127cc57600080fd5b6127db83888401838701613422565b5086525050928201929082019060010161278b565b505050505092915050565b60008083601f84011261280c578182fd5b50813567ffffffffffffffff811115612823578182fd5b60208301915083602082850101111561283b57600080fd5b9250929050565b600082601f830112612852578081fd5b8135612860612775826133fe565b915080825283602082850101111561287757600080fd5b8060208401602084013760009082016020015292915050565b600060a082840312156128a1578081fd5b6128ab60a06133b7565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff8111156128e957600080fd5b6128f584828501612842565b60808301525092915050565b600060208284031215612912578081fd5b813561291d8161344e565b9392505050565b60008060408385031215612936578081fd5b825167ffffffffffffffff8082111561294d578283fd5b81850186601f82011261295e578384fd5b8051925061296e612775846133de565b80848252602080830192508084018a82838902870101111561298e578788fd5b8794505b868510156129b95780516129a58161344e565b845260019490940193928101928101612992565b5088015190965093505050808211156129d0578283fd5b506129dd85828601612757565b9150509250929050565b6000602082840312156129f8578081fd5b8151801515811461291d578182fd5b60008060008060408587031215612a1c578182fd5b843567ffffffffffffffff80821115612a33578384fd5b612a3f888389016127fb565b90965094506020870135915080821115612a57578384fd5b50612a64878288016127fb565b95989497509550505050565b600060208284031215612a81578081fd5b813567ffffffffffffffff80821115612a98578283fd5b81840160608187031215612aaa578384fd5b612ab460606133b7565b9250803582811115612ac4578485fd5b612ad087828401612890565b845250602081013582811115612ae4578485fd5b612af087828401612890565b602085015250604081013582811115612b07578485fd5b612b1387828401612842565b6040850152509195945050505050565b600060208284031215612b34578081fd5b5035919050565b600060208284031215612b4c578081fd5b5051919050565b600080600060408486031215612b67578283fd5b833560ff81168114612b77578384fd5b9250602084013567ffffffffffffffff811115612b92578283fd5b612b9e868287016127fb565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612bed816020860160208601613422565b601f01601f19169290920160200192915050565b60008251612c13818460208701613422565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825261291d6020830184612bd5565b600060408252612c7c604083018688612bab565b8281036020840152612c8f818587612bab565b979650505050505050565b6020808252601f908201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b6020808252602c908201527f7468652066696e616c69747920736c6173682072657761726420726174696f2060408201526b6f7574206f662072616e676560a01b606082015260800190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252601590820152741d9bdd195059191c881a5cc81b9bdd08199bdd5b99605a1b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601490820152731d185c99d95d08189b1bd8dac81d1bdbc81bdb1960621b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252602b908201527f6c656e677468206f662066696e616c697479536c61736852657761726452617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b60008382526040602083015261333e6040830184612bd5565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff85168252606060208301526133a76060830185612bd5565b9050826040830152949350505050565b60405181810167ffffffffffffffff811182821017156133d657600080fd5b604052919050565b600067ffffffffffffffff8211156133f4578081fd5b5060209081020190565b600067ffffffffffffffff821115613414578081fd5b50601f01601f191660200190565b60005b8381101561343d578181015183820152602001613425565b8381111561172e5750506000910152565b6001600160a01b038116811461346357600080fd5b5056fea164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80637942fd051161015c578063c80d4b8f116100ce578063dc927faf11610087578063dc927faf146104ad578063e1c7392a146104b5578063f9a2bbc7146104bd578063fc3e5908146104c5578063fc4333cd146104cd578063fd6a6879146104d55761027f565b8063c80d4b8f1461045c578063c81b166214610464578063c8509d811461046c578063c96be4cb1461047f578063cc844b7314610492578063d2a42e4b146104a55761027f565b80639dc09262116101205780639dc0926214610421578063a1a11bf514610429578063a78abc1614610431578063ab51bb9614610439578063ac0af62914610441578063ac431751146104495761027f565b80637942fd05146103ee5780638256ace6146103f6578063831d65d1146103fe57806396713da9146104115780639bc8e4f2146104195761027f565b8063493279b1116101f557806362b72cf5116101b957806362b72cf5146103be5780636e47b482146103c657806370fd5bad146103ce578063718a8aa8146103d657806375d47a0a146103de5780637912a65d146103e65761027f565b8063493279b11461037c5780634bf6c8821461039157806351e8067214610399578063567a372d146103a15780635bfb4990146103a95761027f565b806335aa2e441161024757806335aa2e441461030e57806337c8dab914610321578063389f4f71146103425780633a63f4b1146103575780633dffc3871461035f57806343756e5c146103745761027f565b80630bee7a67146102845780630e2374a5146102a25780631182b875146102b757806322d1e80b146102d757806323bac5a2146102ec575b600080fd5b61028c6104dd565b60405161029991906132a4565b60405180910390f35b6102aa6104e2565b6040516102999190612b82565b6102ca6102c5366004612ab8565b6104e8565b6040516102999190612bba565b6102df61054e565b6040516102999190612baf565b6102ff6102fa366004612866565b610557565b6040516102999392919061328c565b6102aa61031c366004612a88565b61057a565b61033461032f366004612866565b6105a1565b60405161029992919061327e565b61034a6105f8565b6040516102999190613254565b61034a6105fe565b610367610604565b60405161029991906132b5565b6102aa610609565b61038461060f565b6040516102999190613245565b610367610614565b6102aa610619565b61034a61061f565b6103bc6103b7366004612866565b610625565b005b61034a6106d0565b6102aa6106d6565b6103676106dc565b6103676106e1565b6102aa6106e6565b61034a6106ec565b6103676106f1565b6103346106f6565b6103bc61040c366004612ab8565b610700565b610367610812565b61034a610817565b6102aa610822565b6102aa610828565b6102df61082e565b61028c610837565b61034a61083c565b6103bc61045736600461296c565b610841565b61034a610ce0565b6102aa610ce5565b6103bc61047a366004612ab8565b610ceb565b6103bc61048d366004612866565b610d5c565b6103bc6104a03660046129d5565b61114d565b61034a61169a565b6102aa61169f565b6103bc6116a5565b6102aa6116e1565b6103676116e7565b6103bc6116ec565b6102aa611b35565b606481565b61200181565b606033612000146105145760405162461bcd60e51b815260040161050b906130cb565b60405180910390fd5b60005460ff166105365760405162461bcd60e51b815260040161050b90612c9b565b60405162461bcd60e51b815260040161050b9061318e565b60075460ff1681565b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061058757fe5b6000918252602090912001546001600160a01b0316905081565b6000806105ac61264d565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b60065481565b600181565b61100181565b606081565b600881565b61200081565b60045481565b33611000146106465760405162461bcd60e51b815260040161050b90612edf565b60005460ff166106685760405162461bcd60e51b815260040161050b90612c9b565b61200063f7a251d7600b61067b84611b3b565b60006040518463ffffffff1660e01b815260040161069b939291906132c3565b600060405180830381600087803b1580156106b557600080fd5b505af11580156106c9573d6000803e3d6000fd5b5050505050565b60035481565b61100581565b600281565b601081565b61100881565b603281565b600b81565b6004546005549091565b33612000146107215760405162461bcd60e51b815260040161050b906130cb565b60005460ff166107435760405162461bcd60e51b815260040161050b90612c9b565b61074b612670565b600061078c84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c0d92505050565b9150915080156107d35781516040517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e629967916107c6916132a4565b60405180910390a16106c9565b81516040517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e791610803916132a4565b60405180910390a15050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff166108635760405162461bcd60e51b815260040161050b90612c9b565b33611007146108845760405162461bcd60e51b815260040161050b90612f88565b6108ef84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b60208201529150611c8d9050565b1561098a57602081146109145760405162461bcd60e51b815260040161050b90612e6b565b604080516020601f840181900481028201810190925282815260009161095291858580838501838280828437600092019190915250611ce792505050565b905060018110158015610966575060055481105b6109825760405162461bcd60e51b815260040161050b90613086565b600455610c9d565b6109f084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b60208201529150611c8d9050565b15610a8c5760208114610a155760405162461bcd60e51b815260040161050b90612fd6565b604080516020601f8401819004810282018101909252828152600091610a5391858580838501838280828437600092019190915250611ce792505050565b90506103e88111158015610a68575060045481115b610a845760405162461bcd60e51b815260040161050b90612d09565b600555610c9d565b610b0084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f66696e616c697479536c617368526577617264526174696f000000000000000060208201529150611c8d9050565b15610b9a5760208114610b255760405162461bcd60e51b815260040161050b906131c5565b604080516020601f8401819004810282018101909252828152600091610b6391858580838501838280828437600092019190915250611ce792505050565b9050600a8110158015610b765750606481105b610b925760405162461bcd60e51b815260040161050b90612e1f565b600655610c9d565b610c0e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f656e61626c654d616c6963696f7573566f7465536c617368000000000000000060208201529150611c8d9050565b15610c855760208114610c335760405162461bcd60e51b815260040161050b90612d3e565b604080516020601f8401819004810282018101909252828152610c6f9190848480838501838280828437600092019190915250611cec92505050565b6007805460ff1916911515919091179055610c9d565b60405162461bcd60e51b815260040161050b90613167565b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a84848484604051610cd29493929190612bcd565b60405180910390a150505050565b609681565b61100281565b3361200014610d0c5760405162461bcd60e51b815260040161050b906130cb565b60005460ff16610d2e5760405162461bcd60e51b815260040161050b90612c9b565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610d7b5760405162461bcd60e51b815260040161050b9061311a565b60005460ff16610d9d5760405162461bcd60e51b815260040161050b90612c9b565b6003544311610dbe5760405162461bcd60e51b815260040161050b90613210565b3a15610ddc5760405162461bcd60e51b815260040161050b90612f5a565b60405163155853f360e21b8152611000906355614fcc90610e01908490600401612b82565b60206040518083038186803b158015610e1957600080fd5b505afa158015610e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e51919061294c565b610e5a57611146565b610e6261264d565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610ebd576020810180516001019052610f16565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b438152600554602082015181610f2857fe5b0661107457600060208201526040516335409f7f60e01b8152611000906335409f7f90610f59908590600401612b82565b600060405180830381600087803b158015610f7357600080fd5b505af1158015610f87573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610fa785611b3b565b60006040518463ffffffff1660e01b8152600401610fc7939291906132c3565b600060405180830381600087803b158015610fe157600080fd5b505af1925050508015610ff2575060015b61106f573d808015611020576040519150601f19603f3d011682016040523d82523d6000602084013e611025565b606091505b50826001600160a01b03167fd7bc86ff5d08c8ab043edec743302aba2520e6635172a428bc956721db9e2d1c83602001518360405161106592919061325d565b60405180910390a2505b6110e0565b60045481602001518161108357fe5b066110e0576040516375abf10160e11b81526110009063eb57e202906110ad908590600401612b82565b600060405180830381600087803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505b5043600355565b60005460ff1661116f5760405162461bcd60e51b815260040161050b90612c9b565b604051630a83aaa960e31b81526110069063541d554890611194903390600401612b82565b60206040518083038186803b1580156111ac57600080fd5b505afa1580156111c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e4919061294c565b6112005760405162461bcd60e51b815260040161050b90612bff565b60075460ff166112225760405162461bcd60e51b815260040161050b90612c66565b60065461122f5760146006555b8051514361010090910111801561125157504381602001516000015161010001115b61126d5760405162461bcd60e51b815260040161050b90612c36565b80602001516020015181600001516020015114801561129b5750806020015160600151816000015160600151145b156112b85760405162461bcd60e51b815260040161050b90612eb2565b8051604081015190511080156112d75750602081015160408101519051105b6112f35760405162461bcd60e51b815260040161050b90612de8565b6020810151518151511080156113185750806000015160400151816020015160400151105b8061134357508051516020820151511080156113435750806020015160400151816000015160400151105b8061135d5750806020015160400151816000015160400151145b6113795760405162461bcd60e51b815260040161050b90612cd2565b61138b81600001518260400151611d14565b80156113a457506113a481602001518260400151611d14565b6113c05760405162461bcd60e51b815260040161050b90612d89565b6060806110006001600160a01b0316633b071dcc6040518163ffffffff1660e01b815260040160006040518083038186803b1580156113fe57600080fd5b505afa158015611412573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261143a9190810190612889565b9150915060005b81518110156115775761146b82828151811061145957fe5b60200260200101518560400151611eec565b1561156f576006546040516309a99b4f60e41b815260646110028031909302049190639a99b4f0906114a39033908590600401612b96565b602060405180830381600087803b1580156114bd57600080fd5b505af11580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f59190612aa0565b506110006001600160a01b03166335409f7f85848151811061151357fe5b60200260200101516040518263ffffffff1660e01b81526004016115379190612b82565b600060405180830381600087803b15801561155157600080fd5b505af1158015611565573d6000803e3d6000fd5b5050505050611577565b600101611441565b50600061158984604001516000611f50565b90506120006001600160a01b031663f7a251d7600b6115ab8760400151611f6c565b60006040518463ffffffff1660e01b81526004016115cb939291906132c3565b600060405180830381600087803b1580156115e557600080fd5b505af19250505080156115f6575060015b611668573d808015611624576040519150601f19603f3d011682016040523d82523d6000602084013e611629565b606091505b50817fd58d1183100bd0932c0588f31c4205d6bc6168909765a96c41adbed3115f36288260405161165a9190612bba565b60405180910390a250611694565b60405181907f7b78aadacff901d8b63d0dba4f86283d4db8aef27f9ed70413dd860f1c9532b690600090a25b50505050565b601481565b61100381565b60005460ff16156116c85760405162461bcd60e51b815260040161050b90613018565b603260045560966005556000805460ff19166001179055565b61100081565b600381565b336110001461170d5760405162461bcd60e51b815260040161050b90612edf565b60005460ff1661172f5760405162461bcd60e51b815260040161050b90612c9b565b60015461173b57611b33565b600154600090600019015b808211611b07576000805b8284101561186a5761176161264d565b600260006001878154811061177257fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611854576004600554816117df57fe5b0481602001510381602001818152505080600260006001888154811061180157fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff191691151591909117905561185e565b600192505061186a565b50836001019350611751565b828411611a015761187961264d565b600260006001868154811061188a57fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611972576004600554816118f757fe5b0481602001510381602001818152505080600260006001878154811061191957fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff19169115159190911790559150611a019050565b600260006001868154811061198357fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806119c757fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836119f45750611a01565b506000199092019161186a565b818015611a0b5750805b15611aea576002600060018681548110611a2157fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff19169055805484908110611a6857fe5b600091825260209091200154600180546001600160a01b039092169186908110611a8e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001805480611ac757fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b82611af6575050611b07565b505060019091019060001901611746565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611b56579050509050611b7f836001600160a01b0316611fa7565b81600081518110611b8c57fe5b6020026020010181905250611ba043611fca565b81600181518110611bad57fe5b6020908102919091010152611bc26060611fca565b81600281518110611bcf57fe5b6020026020010181905250611be342611fca565b81600381518110611bf057fe5b6020026020010181905250611c0481611fdd565b9150505b919050565b611c15612670565b6000611c1f612670565b611c27612682565b611c38611c3386612067565b61208c565b90506000805b611c47836120d6565b15611c805780611c7357611c62611c5d846120f7565b612145565b63ffffffff16845260019150611c78565b611c80565b600101611c3e565b5091935090915050915091565b600081604051602001611ca09190612b66565b6040516020818303038152906040528051906020012083604051602001611cc79190612b66565b604051602081830303815290604052805190602001201490505b92915050565b015190565b8082015160009060ff811615611d06576001915081611d0c565b60009150815b505092915050565b60408051600480825260a0820190925260009160609190816020015b6060815260200190600190039081611d30575050604080516020808252818301909252919250606091908082018180368337019050509050611d758560000151611fca565b82600081518110611d8257fe5b6020026020010181905250611d9d60208660200151836121c7565b611da6816121d7565b82600181518110611db357fe5b6020026020010181905250611dcb8560400151611fca565b82600281518110611dd857fe5b6020026020010181905250611df360208660600151836121c7565b611dfc816121d7565b82600381518110611e0957fe5b6020026020010181905250611e2f6020611e2284611fdd565b80519060200120836121c7565b6040805160b080825260e08201909252606091602082018180368337019050509050611e5f81836000602061222d565b611e718187608001516020606061222d565b611e7f81866080603061222d565b604080516001808252818301909252606091602082018180368337019050509050815160016020830182602086016066600019fa611ebc57600080fd5b506001611eca826000612280565b60ff1614611edf576000945050505050611ce1565b5060019695505050505050565b815181516000916001918114808314611f085760009250611f46565b600160208701838101602088015b600284838510011415611f41578051835114611f355760009650600093505b60209283019201611f16565b505050505b5090949350505050565b60008160200183511015611f6357600080fd5b50016020015190565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081611f87579050509050611b7f836121d7565b60408051600560a21b8318601482015260348101909152606090611c04816121d7565b6060611ce1611fd88361229c565b6121d7565b6060815160001415611ffe5750604080516000815260208101909152611c08565b60608260008151811061200d57fe5b602002602001015190506000600190505b835181101561204e576120448285838151811061203757fe5b6020026020010151612382565b915060010161201e565b50611c04612061825160c060ff166123ff565b82612382565b61206f6126a2565b506040805180820190915281518152602082810190820152919050565b612094612682565b61209d826124d1565b6120a657600080fd5b60006120b5836020015161250b565b60208085015160408051808201909152868152920190820152915050919050565b60006120e06126a2565b505080518051602091820151919092015191011190565b6120ff6126a2565b612108826120d6565b61211157600080fd5b602082015160006121218261256e565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061215a57508151602110155b61216357600080fd5b6000612172836020015161250b565b905080836000015110156121985760405162461bcd60e51b815260040161050b9061304f565b8251602080850151830180519284900392918310156121be57826020036101000a820491505b50949350505050565b9091018181526020918201910152565b6060815160011480156122095750607f60f81b826000815181106121f757fe5b01602001516001600160f81b03191611155b15612215575080611c08565b611ce16122278351608060ff166123ff565b83612382565b60005b818110156106c95783818151811061224457fe5b602001015160f81c60f81b85848060010195508151811061226157fe5b60200101906001600160f81b031916908160001a905350600101612230565b6000816001018351101561229357600080fd5b50016001015190565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166122e057506018612304565b6fffffffffffffffffffffffffffffffff19841661230057506010612304565b5060005b602081101561233a5781818151811061231957fe5b01602001516001600160f81b031916156123325761233a565b600101612304565b60008160200390506060816040519080825280601f01601f19166020018201604052801561236f576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b818310156123b357805183526020928301920161239b565b50855184518101855292509050808201602086015b818310156123e05780518352602092830192016123c8565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106124295760405162461bcd60e51b815260040161050b90612dc0565b604080516001808252818301909252606091602082018180368337019050509050603784116124835782840160f81b8160008151811061246557fe5b60200101906001600160f81b031916908160001a9053509050611ce1565b606061248e8561229c565b90508381510160370160f81b826000815181106124a757fe5b60200101906001600160f81b031916908160001a9053506124c88282612382565b95945050505050565b80516000906124e257506000611c08565b6020820151805160001a9060c082101561250157600092505050611c08565b5060019392505050565b8051600090811a6080811015612525576000915050611c08565b60b8811080612540575060c08110801590612540575060f881105b1561254f576001915050611c08565b60c08110156125635760b519019050611c08565b60f519019050611c08565b80516000908190811a60808110156125895760019150612646565b60b881101561259e57607e1981019150612646565b60c08110156125ef57600060b78203600186019550806020036101000a8651049150600181018201935050808310156125e95760405162461bcd60e51b815260040161050b90612f2f565b50612646565b60f88110156126045760be1981019150612646565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611d0c5760405162461bcd60e51b815260040161050b90612f2f565b5092915050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b60405180604001604052806126956126a2565b8152602001600081525090565b604051806040016040528060008152602001600081525090565b600082601f8301126126cc578081fd5b81516126df6126da82613316565b6132ef565b818152915060208083019084810160005b84811015612755578151870188603f82011261270b57600080fd5b8381015161271b6126da82613336565b81815260408b8184860101111561273157600080fd5b6127408388840183870161335a565b508652505092820192908201906001016126f0565b505050505092915050565b60008083601f840112612771578182fd5b50813567ffffffffffffffff811115612788578182fd5b6020830191508360208285010111156127a057600080fd5b9250929050565b600082601f8301126127b7578081fd5b81356127c56126da82613336565b91508082528360208285010111156127dc57600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215612806578081fd5b61281060a06132ef565b905081358152602082013560208201526040820135604082015260608201356060820152608082013567ffffffffffffffff81111561284e57600080fd5b61285a848285016127a7565b60808301525092915050565b600060208284031215612877578081fd5b813561288281613386565b9392505050565b6000806040838503121561289b578081fd5b825167ffffffffffffffff808211156128b2578283fd5b81850186601f8201126128c3578384fd5b805192506128d36126da84613316565b80848252602080830192508084018a8283890287010111156128f3578788fd5b8794505b8685101561291e57805161290a81613386565b8452600194909401939281019281016128f7565b508801519096509350505080821115612935578283fd5b50612942858286016126bc565b9150509250929050565b60006020828403121561295d578081fd5b81518015158114612882578182fd5b60008060008060408587031215612981578182fd5b843567ffffffffffffffff80821115612998578384fd5b6129a488838901612760565b909650945060208701359150808211156129bc578384fd5b506129c987828801612760565b95989497509550505050565b6000602082840312156129e6578081fd5b813567ffffffffffffffff808211156129fd578283fd5b81840160608187031215612a0f578384fd5b612a1960606132ef565b9250803582811115612a29578485fd5b612a35878284016127f5565b845250602081013582811115612a49578485fd5b612a55878284016127f5565b602085015250604081013582811115612a6c578485fd5b612a78878284016127a7565b6040850152509195945050505050565b600060208284031215612a99578081fd5b5035919050565b600060208284031215612ab1578081fd5b5051919050565b600080600060408486031215612acc578283fd5b833560ff81168114612adc578384fd5b9250602084013567ffffffffffffffff811115612af7578283fd5b612b0386828701612760565b9497909650939450505050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612b5281602086016020860161335a565b601f01601f19169290920160200192915050565b60008251612b7881846020870161335a565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526128826020830184612b3a565b600060408252612be1604083018688612b10565b8281036020840152612bf4818587612b10565b979650505050505050565b6020808252601f908201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604082015260600190565b6020808252601690820152751d1bdbc81bdb1908189b1bd8dac81a5b9d9bdb1d995960521b604082015260600190565b6020808252818101527f6d616c6963696f757320766f746520736c617368206e6f7420656e61626c6564604082015260600190565b60208082526019908201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604082015260600190565b6020808252601a908201527f6e6f2076696f6c6174696f6e206f6620766f74652072756c6573000000000000604082015260600190565b6020808252818101527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604082015260600190565b6020808252602b908201527f6c656e677468206f6620656e61626c654d616c6963696f7573566f7465536c6160408201526a0e6d040dad2e6dac2e8c6d60ab1b606082015260800190565b60208082526017908201527f766572696679207369676e6174757265206661696c6564000000000000000000604082015260600190565b6020808252600e908201526d696e70757420746f6f206c6f6e6760901b604082015260600190565b60208082526019908201527f7372634e756d20626967676572207468616e207461724e756d00000000000000604082015260600190565b6020808252602c908201527f7468652066696e616c69747920736c6173682072657761726420726174696f2060408201526b6f7574206f662072616e676560a01b606082015260800190565b60208082526027908201527f6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d6040820152660d2e6dac2e8c6d60cb1b606082015260800190565b60208082526013908201527274776f206964656e746963616c20766f74657360681b604082015260600190565b60208082526030908201527f746865206d6573736167652073656e646572206d7573742062652076616c696460408201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b606082015260800190565b6020808252601190820152706164646974696f6e206f766572666c6f7760781b604082015260600190565b6020808252601490820152736761737072696365206973206e6f74207a65726f60601b604082015260600190565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b60208082526022908201527f6c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746040820152610c6d60f31b606082015260800190565b60208082526019908201527f74686520636f6e747261637420616c726561647920696e697400000000000000604082015260600190565b6020808252601a908201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604082015260600190565b60208082526025908201527f746865206d697364656d65616e6f725468726573686f6c64206f7574206f662060408201526472616e676560d81b606082015260800190565b6020808252602f908201527f746865206d6573736167652073656e646572206d7573742062652063726f737360408201526e0818da185a5b8818dbdb9d1c9858dd608a1b606082015260800190565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b6020808252600d908201526c756e6b6e6f776e20706172616d60981b604082015260600190565b6020808252601e908201527f7265636569766520756e65787065637465642073796e207061636b6167650000604082015260600190565b6020808252602b908201527f6c656e677468206f662066696e616c697479536c61736852657761726452617460408201526a0d2de40dad2e6dac2e8c6d60ab1b606082015260800190565b6020808252818101527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604082015260600190565b61ffff91909116815260200190565b90815260200190565b6000838252604060208301526132766040830184612b3a565b949350505050565b918252602082015260400190565b92835260208301919091521515604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b600060ff85168252606060208301526132df6060830185612b3a565b9050826040830152949350505050565b60405181810167ffffffffffffffff8111828210171561330e57600080fd5b604052919050565b600067ffffffffffffffff82111561332c578081fd5b5060209081020190565b600067ffffffffffffffff82111561334c578081fd5b50601f01601f191660200190565b60005b8381101561337557818101518382015260200161335d565b838111156116945750506000910152565b6001600160a01b038116811461339b57600080fd5b5056fea2646970667358221220f9624a55cd7567dfdf2912f3b19a9eed5550ab287f0ada9e2b9c05bfc43611df64736f6c63430006040033" }, "0x0000000000000000000000000000000000001002": { "balance": "0x0", - "code": "0x6080604052600436106101a05760003560e01c80637942fd05116100ec578063ac4317511161008a578063f9a2bbc711610064578063f9a2bbc714610550578063fb5478b314610565578063fc3e59081461057a578063fd6a68791461058f576101e4565b8063ac43175114610457578063c81b166214610526578063dc927faf1461053b576101e4565b80639dc09262116100c65780639dc0926214610403578063a1a11bf514610418578063a78abc161461042d578063ab51bb9614610442576101e4565b80637942fd05146103a057806396713da9146103b55780639a99b4f0146103ca576101e4565b80634bf6c882116101595780636e47b482116101335780636e47b4821461034c57806370fd5bad14610361578063718a8aa81461037657806375d47a0a1461038b576101e4565b80634bf6c882146102db57806351e80672146102f05780636d70f7ae14610305576101e4565b80630bee7a67146101e95780630e2374a5146102175780633a0b0eff146102485780633dffc3871461026f57806343756e5c1461029a578063493279b1146102af576101e4565b366101e45734156101e25760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101f557600080fd5b506101fe6105a4565b6040805163ffffffff9092168252519081900360200190f35b34801561022357600080fd5b5061022c6105a9565b604080516001600160a01b039092168252519081900360200190f35b34801561025457600080fd5b5061025d6105af565b60408051918252519081900360200190f35b34801561027b57600080fd5b506102846105b5565b6040805160ff9092168252519081900360200190f35b3480156102a657600080fd5b5061022c6105ba565b3480156102bb57600080fd5b506102c46105c0565b6040805161ffff9092168252519081900360200190f35b3480156102e757600080fd5b506102846105c6565b3480156102fc57600080fd5b5061022c6105cb565b34801561031157600080fd5b506103386004803603602081101561032857600080fd5b50356001600160a01b03166105d1565b604080519115158252519081900360200190f35b34801561035857600080fd5b5061022c6105ef565b34801561036d57600080fd5b506102846105f5565b34801561038257600080fd5b506102846105fa565b34801561039757600080fd5b5061022c6105ff565b3480156103ac57600080fd5b50610284610605565b3480156103c157600080fd5b5061028461060a565b3480156103d657600080fd5b5061025d600480360360408110156103ed57600080fd5b506001600160a01b03813516906020013561060f565b34801561040f57600080fd5b5061022c610823565b34801561042457600080fd5b5061022c610829565b34801561043957600080fd5b5061033861082f565b34801561044e57600080fd5b506101fe610838565b34801561046357600080fd5b506101e26004803603604081101561047a57600080fd5b81019060208101813564010000000081111561049557600080fd5b8201836020820111156104a757600080fd5b803590602001918460018302840111640100000000831117156104c957600080fd5b9193909290916020810190356401000000008111156104e757600080fd5b8201836020820111156104f957600080fd5b8035906020019184600183028401116401000000008311171561051b57600080fd5b50909250905061083d565b34801561053257600080fd5b5061022c610bc0565b34801561054757600080fd5b5061022c610bc6565b34801561055c57600080fd5b5061022c610bcc565b34801561057157600080fd5b5061025d610bd2565b34801561058657600080fd5b50610284610bde565b34801561059b57600080fd5b5061022c610be3565b606481565b61200181565b60015481565b600181565b61100181565b6102ca81565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b600b81565b600981565b6000805460ff166106f55760026020527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff1991821681179092557fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548216831790557ffcc09d5775472c6fa988b216f5ce189894c14e093527f732b9b65da0880b5f8180547fd5856b6520af3fbaacead8d875ff5c4db19c2ad37c909e14d0ea394740e2ebc880549184168517841685178416851790925561100160009081529083168417831684178316841790915560048355805490911690911790555b3360009081526002602052604090205460ff166107435760405162461bcd60e51b815260040180806020018281038252602b815260200180610cd1602b913960400191505060405180910390fd5b60004783106107525747610754565b825b9050670de0b6b3a76400008111156107715750670de0b6b3a76400005b80156107f2576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156107ad573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261081c565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b336110071461087d5760405162461bcd60e51b815260040180806020018281038252602e815260200180610d2b602e913960400191505060405180910390fd5b6108df84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a30b23227b832b930ba37b960a91b60208201529150610be99050565b156109b757606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506109625760405162461bcd60e51b815260040180806020018281038252602c815260200180610d59602c913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517f9870d7fe5d112134c55844951dedf365363006d9c588db07c4c85af6322a06199190a25050610b2e565b610a1c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3232b632ba32a7b832b930ba37b960911b60208201529150610be99050565b15610af157606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060149091149050610a9f5760405162461bcd60e51b815260040180806020018281038252602f815260200180610cfc602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19169055517fb40992a19dba61ea600e87fce607102bf5908dc89076217b6ca6ae195224f7029190a25050610b2e565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b61100481565b6000816040516020018082805190602001908083835b60208310610c1e5780518252601f199092019160209182019101610bff565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610c8c5780518252601f199092019160209182019101610c6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f646c656e677468206f662076616c756520666f722064656c6574654f70657261746f722073686f756c64206265203230746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72206164644f70657261746f722073686f756c64206265203230a164736f6c6343000604000a" + "code": "0x6080604052600436106101a05760003560e01c80637942fd05116100ec578063ac4317511161008a578063f9a2bbc711610064578063f9a2bbc714610550578063fb5478b314610565578063fc3e59081461057a578063fd6a68791461058f576101e4565b8063ac43175114610457578063c81b166214610526578063dc927faf1461053b576101e4565b80639dc09262116100c65780639dc0926214610403578063a1a11bf514610418578063a78abc161461042d578063ab51bb9614610442576101e4565b80637942fd05146103a057806396713da9146103b55780639a99b4f0146103ca576101e4565b80634bf6c882116101595780636e47b482116101335780636e47b4821461034c57806370fd5bad14610361578063718a8aa81461037657806375d47a0a1461038b576101e4565b80634bf6c882146102db57806351e80672146102f05780636d70f7ae14610305576101e4565b80630bee7a67146101e95780630e2374a5146102175780633a0b0eff146102485780633dffc3871461026f57806343756e5c1461029a578063493279b1146102af576101e4565b366101e45734156101e25760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101f557600080fd5b506101fe6105a4565b6040805163ffffffff9092168252519081900360200190f35b34801561022357600080fd5b5061022c6105a9565b604080516001600160a01b039092168252519081900360200190f35b34801561025457600080fd5b5061025d6105af565b60408051918252519081900360200190f35b34801561027b57600080fd5b506102846105b5565b6040805160ff9092168252519081900360200190f35b3480156102a657600080fd5b5061022c6105ba565b3480156102bb57600080fd5b506102c46105c0565b6040805161ffff9092168252519081900360200190f35b3480156102e757600080fd5b506102846105c5565b3480156102fc57600080fd5b5061022c6105ca565b34801561031157600080fd5b506103386004803603602081101561032857600080fd5b50356001600160a01b03166105d0565b604080519115158252519081900360200190f35b34801561035857600080fd5b5061022c6105ee565b34801561036d57600080fd5b506102846105f4565b34801561038257600080fd5b506102846105f9565b34801561039757600080fd5b5061022c6105fe565b3480156103ac57600080fd5b50610284610604565b3480156103c157600080fd5b50610284610609565b3480156103d657600080fd5b5061025d600480360360408110156103ed57600080fd5b506001600160a01b03813516906020013561060e565b34801561040f57600080fd5b5061022c6107b9565b34801561042457600080fd5b5061022c6107bf565b34801561043957600080fd5b506103386107c5565b34801561044e57600080fd5b506101fe6107ce565b34801561046357600080fd5b506101e26004803603604081101561047a57600080fd5b81019060208101813564010000000081111561049557600080fd5b8201836020820111156104a757600080fd5b803590602001918460018302840111640100000000831117156104c957600080fd5b9193909290916020810190356401000000008111156104e757600080fd5b8201836020820111156104f957600080fd5b8035906020019184600183028401116401000000008311171561051b57600080fd5b5090925090506107d3565b34801561053257600080fd5b5061022c610b56565b34801561054757600080fd5b5061022c610b5c565b34801561055c57600080fd5b5061022c610b62565b34801561057157600080fd5b5061025d610b68565b34801561058657600080fd5b50610284610b74565b34801561059b57600080fd5b5061022c610b79565b606481565b61200181565b60015481565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b600b81565b600981565b6000805460ff1661068b57600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166106d95760405162461bcd60e51b815260040180806020018281038252602b815260200180610c67602b913960400191505060405180910390fd5b60004783106106e857476106ea565b825b9050670de0b6b3a76400008111156107075750670de0b6b3a76400005b8015610788576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610743573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a26107b2565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b33611007146108135760405162461bcd60e51b815260040180806020018281038252602e815260200180610cc1602e913960400191505060405180910390fd5b61087584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a30b23227b832b930ba37b960a91b60208201529150610b7f9050565b1561094d57606082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050601490911490506108f85760405162461bcd60e51b815260040180806020018281038252602c815260200180610cef602c913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19166001179055517f9870d7fe5d112134c55844951dedf365363006d9c588db07c4c85af6322a06199190a25050610ac4565b6109b284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600e81526d3232b632ba32a7b832b930ba37b960911b60208201529150610b7f9050565b15610a8757606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060149091149050610a355760405162461bcd60e51b815260040180806020018281038252602f815260200180610c92602f913960400191505060405180910390fd5b60148101516001600160a01b038116600081815260026020526040808220805460ff19169055517fb40992a19dba61ea600e87fce607102bf5908dc89076217b6ca6ae195224f7029190a25050610ac4565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b61100481565b6000816040516020018082805190602001908083835b60208310610bb45780518252601f199092019160209182019101610b95565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610c225780518252601f199092019160209182019101610c03565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490509291505056fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f646c656e677468206f662076616c756520666f722064656c6574654f70657261746f722073686f756c64206265203230746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f72206164644f70657261746f722073686f756c64206265203230a264697066735822122064a66faa65c8309ee7282ad7adc62378a4d347b120dbf4793adac977101f891864736f6c63430006040033" }, "0x0000000000000000000000000000000000001003": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063a1a11bf511610130578063dc927faf116100b8578063e405bbc31161007c578063e405bbc3146106a7578063ea54b2aa146106af578063f9a2bbc7146106b7578063fc3e5908146106bf578063fd6a6879146106c757610227565b8063dc927faf14610627578063dda831481461062f578063df5fe70414610655578063e1c7392a1461067b578063e2761af01461068357610227565b8063adc879e9116100ff578063adc879e914610552578063c81b16621461055a578063cba510a914610562578063d816987914610588578063da8d08f01461060157610227565b8063a1a11bf514610462578063a78abc161461046a578063ab51bb9614610486578063ac4317511461048e57610227565b8063564b81ef116101b3578063718a8aa811610182578063718a8aa81461043a57806375d47a0a146104425780637942fd051461044a57806396713da9146104525780639dc092621461045a57610227565b8063564b81ef146102e85780635c5ae8db146103655780636e47b4821461042a57806370fd5bad1461043257610227565b80633dffc387116101fa5780633dffc3871461029357806343756e5c146102b1578063493279b1146102b95780634bf6c882146102d857806351e80672146102e057610227565b80630bee7a671461022c5780630e2374a51461024d5780632657e9b61461027157806333f7798d1461028b575b600080fd5b6102346106cf565b6040805163ffffffff9092168252519081900360200190f35b6102556106d4565b604080516001600160a01b039092168252519081900360200190f35b6102796106da565b60408051918252519081900360200190f35b6102796106e5565b61029b6106eb565b6040805160ff9092168252519081900360200190f35b6102556106f0565b6102c16106f6565b6040805161ffff9092168252519081900360200190f35b61029b6106fc565b610255610701565b6102f0610707565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032a578181015183820152602001610312565b50505050905090810190601f1680156103575780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61038b6004803603602081101561037b57600080fd5b50356001600160401b0316610813565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ec5781810151838201526020016103d4565b50505050905090810190601f1680156104195780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102556108ce565b61029b6108d4565b61029b6108d9565b6102556108de565b61029b6108e4565b61029b6108e9565b6102556108ee565b6102556108f4565b6104726108fa565b604080519115158252519081900360200190f35b610234610903565b610550600480360360408110156104a457600080fd5b8101906020810181356401000000008111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460018302840111640100000000831117156104f357600080fd5b91939092909160208101903564010000000081111561051157600080fd5b82018360208201111561052357600080fd5b8035906020019184600183028401116401000000008311171561054557600080fd5b509092509050610908565b005b610279610bc1565b610255610bc7565b6102796004803603602081101561057857600080fd5b50356001600160401b0316610bcd565b6104726004803603604081101561059e57600080fd5b8101906020810181356401000000008111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460018302840111640100000000831117156105ed57600080fd5b9193509150356001600160401b0316610bec565b6102556004803603602081101561061757600080fd5b50356001600160401b03166113cd565b6102556113e8565b6102556004803603602081101561064557600080fd5b50356001600160401b03166113ee565b6104726004803603602081101561066b57600080fd5b50356001600160401b0316611412565b610550611454565b61068b6115f8565b604080516001600160401b039092168252519081900360200190f35b61068b611607565b6102f061161d565b610255611639565b61029b61163f565b610255611644565b606481565b61200181565b662386f26fc1000081565b60055481565b600181565b61100181565b6102ca81565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561077d57828160ff168151811061075157fe5b01602001516001600160f81b0319161561077057816001019150610775565b61077d565b600101610736565b5060608160ff166040519080825280601f01601f1916602001820160405280156107ae576020820181803683370190505b50905060005b8260ff168160ff16101561080a57838160ff16815181106107d157fe5b602001015160f81c60f81b828260ff16815181106107eb57fe5b60200101906001600160f81b031916908160001a9053506001016107b4565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108c45780601f10610899576101008083540402835291602001916108c4565b820191906000526020600020905b8154815290600101906020018083116108a757829003601f168201915b5050505050905084565b61100581565b600281565b601081565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661095f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461099f5760405162461bcd60e51b815260040180806020018281038252602e815260200180611a16602e913960400191505060405180910390fd5b610a1384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e676500000000006020820152915061164a9050565b15610af25760208114610a575760405162461bcd60e51b815260040180806020018281038252602e8152602001806119b5602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a959185858083850183828082843760009201919091525061173192505050565b9050600081118015610aaf5750670de0b6b3a76400008111155b610aea5760405162461bcd60e51b815260040180806020018281038252602f815260200180611a44602f913960400191505060405180910390fd5b600555610b2f565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610c2f57600080fd5b505afa158015610c43573d6000803e3d6000fd5b505050506040513d6020811015610c5957600080fd5b5051610cac576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610d20576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d6d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b036026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d88611893565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e4e5780601f10610e2357610100808354040283529160200191610e4e565b820191906000526020600020905b815481529060010190602001808311610e3157829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e8b57506003546001600160401b0390811690831610155b15610f6c5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f5c5780601f10610f3157610100808354040283529160200191610f5c565b820191906000526020600020905b815481529060010190602001808311610f3f57829003601f168201915b5050505050815250509050610e5a565b6060810151516110635780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f81018390048302840183019094528383529395509092919083018282801561101b5780601f10610ff05761010080835404028352916020019161101b565b820191906000526020600020905b815481529060010190602001808311610ffe57829003601f168201915b505050506060830182905250516110635760405162461bcd60e51b81526004018080602001828103825260218152602001806119946021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f1916602001820160405280156110a2576020820181803683370190505b50905060006110b082611736565b90506110be8486838661173c565b6110f95760405162461bcd60e51b81526004018080602001828103825260238152602001806119716023913960400191505060405180910390fd5b6000838201915061113f8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117a892505050565b9450905061114e8183866117b2565b8251602001935061115d6118b9565b6110008186866064600019fa61117257600080fd5b805194506000600160f81b8616156112015750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111d457600080fd5b505af11580156111e8573d6000803e3d6000fd5b505050506040513d60208110156111fe57600080fd5b50505b856001600160401b031695506020820193506000611221858884156117f3565b90985090506001600160401b03808216908c16146112705760405162461bcd60e51b81526004018080602001828103825260338152602001806119e36033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112f79260038501929101906118d8565b50506003546001600160401b03600160401b9091048116908d161115905061133f576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061144e57506003546001600160401b038381169116145b92915050565b60005460ff16156114ac576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b6000806114d06040518060c0016040528060908152602001611a73609091396117a8565b815160045590925090506114e2611893565b60006114f0848460006117f3565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261155c9260038501929101906118d8565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b6040518060c0016040528060908152602001611a736090913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b6020831061167f5780518252601f199092019160209182019101611660565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116ed5780518252601f1990920191602091820191016116ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061175a87606001516117a8565b909250905061176a8286836117b2565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117d2578251825260209283019290910190601f19016117b3565b915181516020939093036101000a6000190180199091169216919091179052565b6117fb611893565b600884015160288501516048909501805190956000929161181a611893565b6020810183905260408101829052866118855760008060688a036040519080825280601f01601f19166020018201604052801561185e576020820181803683370190505b506060840181905261186f906117a8565b909250905061188260208c0183836117b2565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061191957805160ff1916838001178555611946565b82800160010185558215611946579182015b8281111561194657825182559160200191906001019061192b565b50611952929150611956565b5090565b61081091905b80821115611952576000815560010161195c56fe6661696c656420746f2073657269616c697a6520636f6e73656e7375732073746174656661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676542696e616e63652d436861696e2d4e696c650000000000000000000000000000000000000000000229eca254b3859bffefaf85f4c95da9fbd26527766b784272789c30ec56b380b6eb96442aaab207bc59978ba3dd477690f5c5872334fc39e627723daa97e441e88ba4515150ec3182bc82593df36f8abb25a619187fcfab7e552b94e64ed2deed000000e8d4a5100063616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063a1a11bf511610130578063dc927faf116100b8578063e405bbc31161007c578063e405bbc3146106a7578063ea54b2aa146106af578063f9a2bbc7146106b7578063fc3e5908146106bf578063fd6a6879146106c757610227565b8063dc927faf14610627578063dda831481461062f578063df5fe70414610655578063e1c7392a1461067b578063e2761af01461068357610227565b8063adc879e9116100ff578063adc879e914610552578063c81b16621461055a578063cba510a914610562578063d816987914610588578063da8d08f01461060157610227565b8063a1a11bf514610462578063a78abc161461046a578063ab51bb9614610486578063ac4317511461048e57610227565b8063564b81ef116101b3578063718a8aa811610182578063718a8aa81461043a57806375d47a0a146104425780637942fd051461044a57806396713da9146104525780639dc092621461045a57610227565b8063564b81ef146102e85780635c5ae8db146103655780636e47b4821461042a57806370fd5bad1461043257610227565b80633dffc387116101fa5780633dffc3871461029357806343756e5c146102b1578063493279b1146102b95780634bf6c882146102d857806351e80672146102e057610227565b80630bee7a671461022c5780630e2374a51461024d5780632657e9b61461027157806333f7798d1461028b575b600080fd5b6102346106cf565b6040805163ffffffff9092168252519081900360200190f35b6102556106d4565b604080516001600160a01b039092168252519081900360200190f35b6102796106da565b60408051918252519081900360200190f35b6102796106e5565b61029b6106eb565b6040805160ff9092168252519081900360200190f35b6102556106f0565b6102c16106f6565b6040805161ffff9092168252519081900360200190f35b61029b6106fb565b610255610700565b6102f0610706565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032a578181015183820152602001610312565b50505050905090810190601f1680156103575780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61038b6004803603602081101561037b57600080fd5b50356001600160401b0316610812565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ec5781810151838201526020016103d4565b50505050905090810190601f1680156104195780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b6102556108cd565b61029b6108d3565b61029b6108d8565b6102556108dd565b61029b6108e3565b61029b6108e8565b6102556108ed565b6102556108f3565b6104726108f9565b604080519115158252519081900360200190f35b610234610902565b610550600480360360408110156104a457600080fd5b8101906020810181356401000000008111156104bf57600080fd5b8201836020820111156104d157600080fd5b803590602001918460018302840111640100000000831117156104f357600080fd5b91939092909160208101903564010000000081111561051157600080fd5b82018360208201111561052357600080fd5b8035906020019184600183028401116401000000008311171561054557600080fd5b509092509050610907565b005b610279610bc0565b610255610bc6565b6102796004803603602081101561057857600080fd5b50356001600160401b0316610bcc565b6104726004803603604081101561059e57600080fd5b8101906020810181356401000000008111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460018302840111640100000000831117156105ed57600080fd5b9193509150356001600160401b0316610beb565b6102556004803603602081101561061757600080fd5b50356001600160401b03166113cc565b6102556113e7565b6102556004803603602081101561064557600080fd5b50356001600160401b03166113ed565b6104726004803603602081101561066b57600080fd5b50356001600160401b0316611411565b610550611453565b61068b6115f7565b604080516001600160401b039092168252519081900360200190f35b61068b611606565b6102f061161c565b610255611638565b61029b61163e565b610255611643565b606481565b61200181565b662386f26fc1000081565b60055481565b600181565b61100181565b606081565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561077c57828160ff168151811061075057fe5b01602001516001600160f81b0319161561076f57816001019150610774565b61077c565b600101610735565b5060608160ff166040519080825280601f01601f1916602001820160405280156107ad576020820181803683370190505b50905060005b8260ff168160ff16101561080957838160ff16815181106107d057fe5b602001015160f81c60f81b828260ff16815181106107ea57fe5b60200101906001600160f81b031916908160001a9053506001016107b3565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905084565b61100581565b600281565b601081565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661095e576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461099e5760405162461bcd60e51b815260040180806020018281038252602e815260200180611a15602e913960400191505060405180910390fd5b610a1284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e67650000000000602082015291506116499050565b15610af15760208114610a565760405162461bcd60e51b815260040180806020018281038252602e8152602001806119b4602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a949185858083850183828082843760009201919091525061173092505050565b9050600081118015610aae5750670de0b6b3a76400008111155b610ae95760405162461bcd60e51b815260040180806020018281038252602f815260200180611a43602f913960400191505060405180910390fd5b600555610b2e565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610c2e57600080fd5b505afa158015610c42573d6000803e3d6000fd5b505050506040513d6020811015610c5857600080fd5b5051610cab576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610d1f576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d6c5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b026026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d87611892565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e4d5780601f10610e2257610100808354040283529160200191610e4d565b820191906000526020600020905b815481529060010190602001808311610e3057829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e8a57506003546001600160401b0390811690831610155b15610f6b5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f5b5780601f10610f3057610100808354040283529160200191610f5b565b820191906000526020600020905b815481529060010190602001808311610f3e57829003601f168201915b5050505050815250509050610e59565b6060810151516110625780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f81018390048302840183019094528383529395509092919083018282801561101a5780601f10610fef5761010080835404028352916020019161101a565b820191906000526020600020905b815481529060010190602001808311610ffd57829003601f168201915b505050506060830182905250516110625760405162461bcd60e51b81526004018080602001828103825260218152602001806119936021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f1916602001820160405280156110a1576020820181803683370190505b50905060006110af82611735565b90506110bd8486838661173b565b6110f85760405162461bcd60e51b81526004018080602001828103825260238152602001806119706023913960400191505060405180910390fd5b6000838201915061113e8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117a792505050565b9450905061114d8183866117b1565b8251602001935061115c6118b8565b6110008186866064600019fa61117157600080fd5b805194506000600160f81b8616156112005750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111d357600080fd5b505af11580156111e7573d6000803e3d6000fd5b505050506040513d60208110156111fd57600080fd5b50505b856001600160401b031695506020820193506000611220858884156117f2565b90985090506001600160401b03808216908c161461126f5760405162461bcd60e51b81526004018080602001828103825260338152602001806119e26033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112f69260038501929101906118d7565b50506003546001600160401b03600160401b9091048116908d161115905061133e576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061144d57506003546001600160401b038381169116145b92915050565b60005460ff16156114ab576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b6000806114cf6040518060c0016040528060908152602001611a72609091396117a7565b815160045590925090506114e1611892565b60006114ef848460006117f2565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261155b9260038501929101906118d7565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b6040518060c0016040528060908152602001611a726090913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b6020831061167e5780518252601f19909201916020918201910161165f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116ec5780518252601f1990920191602091820191016116cd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061175987606001516117a7565b90925090506117698286836117b1565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117d1578251825260209283019290910190601f19016117b2565b915181516020939093036101000a6000190180199091169216919091179052565b6117fa611892565b6008840151602885015160489095018051909560009291611819611892565b6020810183905260408101829052866118845760008060688a036040519080825280601f01601f19166020018201604052801561185d576020820181803683370190505b506060840181905261186e906117a7565b909250905061188160208c0183836117b1565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061191857805160ff1916838001178555611945565b82800160010185558215611945579182015b8281111561194557825182559160200191906001019061192a565b50611951929150611955565b5090565b61080f91905b80821115611951576000815560010161195b56fe6661696c656420746f2073657269616c697a6520636f6e73656e7375732073746174656661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676542696e616e63652d436861696e2d4e696c650000000000000000000000000000000000000000000229eca254b3859bffefaf85f4c95da9fbd26527766b784272789c30ec56b380b6eb96442aaab207bc59978ba3dd477690f5c5872334fc39e627723daa97e441e88ba4515150ec3182bc82593df36f8abb25a619187fcfab7e552b94e64ed2deed000000e8d4a5100063616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a264697066735822122083a775098c3e6568c71f17756d397ab2b3564e826f07c52718c6674aee9e270d64736f6c63430006040033" }, "0x0000000000000000000000000000000000001004": { "balance": "176405560900000000000000000", - "code": "0x6080604052600436106103c75760003560e01c806396713da9116101f2578063c81b16621161010d578063f0148472116100a0578063fc1a598f1161006f578063fc1a598f14610f25578063fc3e590814610b85578063fd6a687914610f58578063ff9c0027146107fd5761040f565b8063f014847214610ed1578063f9a2bbc714610ee6578063fa9e915914610efb578063fb063e8f14610f105761040f565b8063dc927faf116100dc578063dc927faf14610e5f578063e1c7392a14610e74578063e8f35cea14610e89578063ebf71d5314610ebc5761040f565b8063c81b166214610d8a578063c8509d8114610d9f578063cf41984414610e24578063d9e6dae91461077f5761040f565b8063aa7415f511610185578063b9fd21e311610154578063b9fd21e314610cfa578063ba35ead614610d0f578063bbface1f14610d24578063bd46646114610d575761040f565b8063aa7415f514610b9a578063ab51bb9614610be1578063ac43175114610bf6578063b99328c514610cc15761040f565b8063a1a11bf5116101c1578063a1a11bf514610b46578063a496fba214610b5b578063a78abc1614610b70578063a7c9f02d14610b855761040f565b806396713da914610ace5780639a854bbd14610ae35780639a99b4f014610af85780639dc0926214610b315761040f565b806359b92789116102e257806371d3086311610275578063831d65d111610244578063831d65d1146109d15780638b87b21f146106d45780638eff336c14610a565780639509b98014610a955761040f565b806371d3086314610968578063727be1f81461097d57806375d47a0a146109a75780637942fd05146109bc5761040f565b80636e056520116102b15780636e056520146108125780636e47b4821461093e57806370fd5bad146107fd578063718a8aa8146109535761040f565b806359b92789146107be5780635d499b1b146107e8578063613684751461077f57806366dea52a146107fd5761040f565b80633fd8b02f1161035a5780634a3acdf4116103295780634a3acdf41461076a5780634bf6c8821461077f57806350432d321461079457806351e80672146107a95761040f565b80633fd8b02f146106ff57806343756e5c1461071457806343a368b914610729578063493279b11461073e5761040f565b8063149d14d911610396578063149d14d9146105a85780632ae45483146105cf5780633d713223146106235780633dffc387146106d45761040f565b80630bee7a67146104145780630e2374a5146104425780631182b87514610473578063122345821461056d5761040f565b3661040f57341561040d576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561042057600080fd5b50610429610f6d565b6040805163ffffffff9092168252519081900360200190f35b34801561044e57600080fd5b50610457610f72565b604080516001600160a01b039092168252519081900360200190f35b34801561047f57600080fd5b506104f86004803603604081101561049657600080fd5b60ff8235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460018302840111600160201b831117156104ed57600080fd5b509092509050610f78565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561053257818101518382015260200161051a565b50505050905090810190601f16801561055f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561057957600080fd5b5061040d6004803603604081101561059057600080fd5b506001600160a01b03813581169160200135166110a6565b3480156105b457600080fd5b506105bd6111a0565b60408051918252519081900360200190f35b3480156105db57600080fd5b5061060a600480360360408110156105f257600080fd5b506001600160a01b03813581169160200135166111a6565b6040805192835260208301919091528051918290030190f35b34801561062f57600080fd5b506104576004803603602081101561064657600080fd5b810190602081018135600160201b81111561066057600080fd5b82018360208201111561067257600080fd5b803590602001918460018302840111600160201b8311171561069357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506111ca945050505050565b3480156106e057600080fd5b506106e96111ee565b6040805160ff9092168252519081900360200190f35b34801561070b57600080fd5b506105bd6111f3565b34801561072057600080fd5b506104576111f9565b34801561073557600080fd5b506105bd6111ff565b34801561074a57600080fd5b5061075361120b565b6040805161ffff9092168252519081900360200190f35b34801561077657600080fd5b506105bd611211565b34801561078b57600080fd5b506106e9611217565b3480156107a057600080fd5b506105bd61121c565b3480156107b557600080fd5b50610457611227565b3480156107ca57600080fd5b50610457600480360360208110156107e157600080fd5b503561122d565b3480156107f457600080fd5b506105bd611248565b34801561080957600080fd5b506106e9611251565b61092a6004803603608081101561082857600080fd5b810190602081018135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460208302840111600160201b8311171561087557600080fd5b919390929091602081019035600160201b81111561089257600080fd5b8201836020820111156108a457600080fd5b803590602001918460208302840111600160201b831117156108c557600080fd5b919390929091602081019035600160201b8111156108e257600080fd5b8201836020820111156108f457600080fd5b803590602001918460208302840111600160201b8311171561091557600080fd5b91935091503567ffffffffffffffff16611256565b604080519115158252519081900360200190f35b34801561094a57600080fd5b5061045761172b565b34801561095f57600080fd5b506106e9611731565b34801561097457600080fd5b506105bd611736565b34801561098957600080fd5b5061092a600480360360208110156109a057600080fd5b503561173c565b3480156109b357600080fd5b506104576117bd565b3480156109c857600080fd5b506106e96117c3565b3480156109dd57600080fd5b5061040d600480360360408110156109f457600080fd5b60ff8235169190810190604081016020820135600160201b811115610a1857600080fd5b820183602082011115610a2a57600080fd5b803590602001918460018302840111600160201b83111715610a4b57600080fd5b5090925090506117c8565b348015610a6257600080fd5b5061040d60048036036060811015610a7957600080fd5b508035906001600160a01b036020820135169060400135611911565b348015610aa157600080fd5b5061040d60048036036040811015610ab857600080fd5b506001600160a01b038135169060200135611997565b348015610ada57600080fd5b506106e9611b54565b348015610aef57600080fd5b506105bd611b59565b348015610b0457600080fd5b506105bd60048036036040811015610b1b57600080fd5b506001600160a01b038135169060200135611b65565b348015610b3d57600080fd5b50610457611ca3565b348015610b5257600080fd5b50610457611ca9565b348015610b6757600080fd5b506106e9611caf565b348015610b7c57600080fd5b5061092a611cb4565b348015610b9157600080fd5b506106e9611cbd565b61092a60048036036080811015610bb057600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16611cc2565b348015610bed57600080fd5b50610429611caf565b348015610c0257600080fd5b5061040d60048036036040811015610c1957600080fd5b810190602081018135600160201b811115610c3357600080fd5b820183602082011115610c4557600080fd5b803590602001918460018302840111600160201b83111715610c6657600080fd5b919390929091602081019035600160201b811115610c8357600080fd5b820183602082011115610c9557600080fd5b803590602001918460018302840111600160201b83111715610cb657600080fd5b509092509050612383565b348015610ccd57600080fd5b5061040d60048036036040811015610ce457600080fd5b50803590602001356001600160a01b031661282b565b348015610d0657600080fd5b506105bd6128ab565b348015610d1b57600080fd5b506105bd6128b5565b348015610d3057600080fd5b506105bd60048036036020811015610d4757600080fd5b50356001600160a01b03166128bb565b348015610d6357600080fd5b506105bd60048036036020811015610d7a57600080fd5b50356001600160a01b03166128cd565b348015610d9657600080fd5b506104576128e8565b348015610dab57600080fd5b5061040d60048036036040811015610dc257600080fd5b60ff8235169190810190604081016020820135600160201b811115610de657600080fd5b820183602082011115610df857600080fd5b803590602001918460018302840111600160201b83111715610e1957600080fd5b5090925090506128ee565b348015610e3057600080fd5b5061040d60048036036040811015610e4757600080fd5b506001600160a01b03813581169160200135166129be565b348015610e6b57600080fd5b50610457612c92565b348015610e8057600080fd5b5061040d612c98565b348015610e9557600080fd5b506105bd60048036036020811015610eac57600080fd5b50356001600160a01b0316612d38565b348015610ec857600080fd5b506106e9612d4a565b348015610edd57600080fd5b506106e9612d4f565b348015610ef257600080fd5b50610457612d54565b348015610f0757600080fd5b506105bd612d5a565b348015610f1c57600080fd5b506105bd612d60565b348015610f3157600080fd5b506104f860048036036020811015610f4857600080fd5b50356001600160a01b0316612d6e565b348015610f6457600080fd5b50610457612e95565b606481565b61200181565b60005460609060ff16610fc0576040805162461bcd60e51b8152602060048201526019602482015260008051602061558d833981519152604482015290519081900360640190fd5b33612000146110005760405162461bcd60e51b815260040180806020018281038252602f81526020018061553b602f913960400191505060405180910390fd5b60ff8416600214156110525761104b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9b92505050565b905061109f565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b33612000146110e65760405162461bcd60e51b815260040180806020018281038252602f81526020018061553b602f913960400191505060405180910390fd5b6001600160a01b0380831660009081526007602090815260408083209385168352929052208054611151576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b0380861692908716917f152fb15aa5d80f843e1e4bd5f2fc9161714f169945024decec7e84fb910fdd519181900360200190a350505050565b60015490565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b6102ca81565b61a8c081565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661129c576040805162461bcd60e51b8152602060048201526019602482015260008051602061558d833981519152604482015290519081900360640190fd5b8685146112da5760405162461bcd60e51b815260040180806020018281038252603b815260200180615500603b913960400191505060405180910390fd5b8683146113185760405162461bcd60e51b815260040180806020018281038252603f8152602001806153d3603f913960400191505060405180910390fd5b426078018267ffffffffffffffff1610156113645760405162461bcd60e51b81526004018080602001828103825260248152602001806152c36024913960400191505060405180910390fd5b6402540be4003406156113a85760405162461bcd60e51b81526004018080602001828103825260408152602001806156036040913960400191505060405180910390fd5b604080518681526020808802820101909152859060009081906060908480156113db578160200160208202803683370190505b50905060005b848110156114b6576402540be4008b8b838181106113fb57fe5b905060200201358161140957fe5b06156114465760405162461bcd60e51b815260040180806020018281038252603c815260200180615412603c913960400191505060405180910390fd5b61146b8b8b8381811061145557fe5b9050602002013585612fbf90919063ffffffff16565b93506114976402540be4008c8c8481811061148257fe5b9050602002013561301990919063ffffffff16565b8282815181106114a357fe5b60209081029190910101526001016113e1565b506001546114db906114ce908663ffffffff61305b16565b849063ffffffff612fbf16565b3410156115195760405162461bcd60e51b81526004018080602001828103825260568152602001806155ad6056913960600191505060405180910390fd5b611529348463ffffffff6130b416565b91506115336150c7565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036115f7846130f6565b61160c876402540be40063ffffffff61301916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561166a578181015183820152602001611652565b50505050905090810190601f1680156116975780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156116b857600080fd5b505af11580156116cc573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b601081565b60015481565b6000336120011461177e5760405162461bcd60e51b81526004018080602001828103825260338152602001806151e16033913960400191505060405180910390fd5b81156117b5576040516120019083156108fc029084906000818181858888f193505050501580156117b3573d6000803e3d6000fd5b505b506001919050565b61100881565b600b81565b60005460ff1661180d576040805162461bcd60e51b8152602060048201526019602482015260008051602061558d833981519152604482015290519081900360640190fd5b336120001461184d5760405162461bcd60e51b815260040180806020018281038252602f81526020018061553b602f913960400191505060405180910390fd5b60ff83166003141561189d5761189882828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133b192505050565b61190c565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146119515760405162461bcd60e51b815260040180806020018281038252602381526020018061556a6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156119d157600080fd5b505afa1580156119e5573d6000803e3d6000fd5b505050506040513d60208110156119fb57600080fd5b50516001600160a01b03163314611a59576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b60008211611aa7576040805162461bcd60e51b81526020600482015260166024820152751e995c9bc81b1a5b5a5d081b9bdd08185b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b038316600090815260036020526040902054611afd576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b038316600081815260066020908152604091829020859055815185815291513393927f9df3a90730dbf23b5cc18dbbd5f4af3fa94a0dffb6ff6841f98a9a9a6ac626a892908290030190a3505050565b600981565b677ce66c50e284000081565b6000805460ff16611bab576040805162461bcd60e51b8152602060048201526019602482015260008051602061558d833981519152604482015290519081900360640190fd5b3361100514611beb5760405162461bcd60e51b815260040180806020018281038252602f815260200180615214602f913960400191505060405180910390fd5b6000478310611bfa5747611bfc565b825b9050670de0b6b3a7640000811115611c18576000915050611c9d565b8015611c9a576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611c54573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611d08576040805162461bcd60e51b8152602060048201526019602482015260008051602061558d833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff161015611d545760405162461bcd60e51b81526004018080602001828103825260248152602001806152c36024913960400191505060405180910390fd5b6402540be400340615611d985760405162461bcd60e51b81526004018080602001828103825260408152602001806156036040913960400191505060405180910390fd5b600080806001600160a01b038816611e7757600154611dbe90879063ffffffff612fbf16565b341015611dfc5760405162461bcd60e51b815260040180806020018281038252606181526020018061534d6061913960800191505060405180910390fd5b6402540be400860615611e405760405162461bcd60e51b815260040180806020018281038252603c815260200180615412603c913960400191505060405180910390fd5b611e50348763ffffffff6130b416565b9050611e67866402540be40063ffffffff61301916565b6221272160e91b9350915061211a565b6001600160a01b038816600090815260036020526040902054925082611ece5760405162461bcd60e51b815260040180806020018281038252603181526020018061531c6031913960400191505060405180910390fd5b600154341015611f0f5760405162461bcd60e51b815260040180806020018281038252603f81526020018061546f603f913960400191505060405180910390fd5b506001600160a01b0387166000908152600260205260409020543490600881111580611f5a5750600881118015611f5a5750611f58876007198301600a0a63ffffffff61340d16565b155b611f955760405162461bcd60e51b815260040180806020018281038252603c815260200180615412603c913960400191505060405180910390fd5b611f9f878261344f565b9250611faa8461348f565b15611ff2576305f5e100831015611ff25760405162461bcd60e51b815260040180806020018281038252603a815260200180615265603a913960400191505060405180910390fd5b60088110158061200c575060088110801561200c57508683115b6120475760405162461bcd60e51b81526004018080602001828103825260258152602001806153ae6025913960400191505060405180910390fd5b677ce66c50e284000083111561208e5760405162461bcd60e51b81526004018080602001828103825260358152602001806152e76035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b505050506040513d602081101561210d57600080fd5b505161211857600080fd5b505b6121226150c7565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff1681525090508281604001516000815181106121d057fe5b6020026020010181815250508781606001516000815181106121ee57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505033816080015160008151811061222057fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d7600361224b846130f6565b612260866402540be40063ffffffff61301916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156122be5781810151838201526020016122a6565b50505050905090810190601f1680156122eb5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561230c57600080fd5b505af1158015612320573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b33611007146123c35760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ae602e913960400191505060405180910390fd5b60208114612418576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415612520576020820151670de0b6b3a764000081118015906124c757506402540be4008106155b612518576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155612796565b61259487878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601781527f6c617267655472616e736665724c6f636b506572696f64000000000000000000602082015291506135959050565b1561263057604080516020601f87018190048102820181019092528581526000916125d79188888083850183828082843760009201919091525061367c92505050565b905062093a80811115612628576040805162461bcd60e51b81526020600482015260146024820152736c6f636b20706572696f6420746f6f206c6f6e6760601b604482015290519081900360640190fd5b600555612796565b61269c87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526015815274189b9893185c99d9551c985b9cd9995c931a5b5a5d605a1b602082015291506135959050565b1561275957604080516020601f87018190048102820181019092528581526000916126df9188888083850183828082843760009201919091525061367c92505050565b905068056bc75e2d631000008110156127295760405162461bcd60e51b81526004018080602001828103825260228152602001806152436022913960400191505060405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855612796565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461286b5760405162461bcd60e51b815260040180806020018281038252602381526020018061556a6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b039290921683526003815281832083905560029052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff16612933576040805162461bcd60e51b8152602060048201526019602482015260008051602061558d833981519152604482015290519081900360640190fd5b33612000146129735760405162461bcd60e51b815260040180806020018281038252602f81526020018061553b602f913960400191505060405180910390fd5b60ff83166003141561189d5761189882828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061368192505050565b60085460ff1660021415612a0a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054612a82576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015612adb576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516612b4e576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114612b3e576040519150601f19603f3d011682016040523d82523d6000602084013e612b43565b606091505b505080915050612be1565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612bb157600080fd5b5087f1158015612bc5573d6000803e3d6000fd5b50505050506040513d6020811015612bdc57600080fd5b505190505b80612c33576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b60005460ff1615612cf0576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015612dfe57828160ff1681518110612dd257fe5b01602001516001600160f81b03191615612df157816001019150612df6565b612dfe565b600101612db7565b5060608160ff166040519080825280601f01601f191660200182016040528015612e2f576020820181803683370190505b50905060005b8260ff168160ff161015612e8b57838160ff1681518110612e5257fe5b602001015160f81c60f81b828260ff1681518110612e6c57fe5b60200101906001600160f81b031916908160001a905350600101612e35565b5095945050505050565b61100481565b6060612ea5615113565b6000612eb08461377f565b9150915080612f06576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b6000612f11836138be565b905063ffffffff811615612fa5576040808401516020808601516001600160a01b03166000908152600290915291822054612f4c919061344f565b9050612f56615148565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff168152509050612f9981613c24565b955050505050506111e9565b505060408051600081526020810190915291506111e99050565b600082820183811015611c9a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611c9a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d00565b60008261306a57506000611c9d565b8282028284828161307757fe5b0414611c9a5760405162461bcd60e51b815260040180806020018281038252602181526020018061544e6021913960400191505060405180910390fd5b6000611c9a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613da2565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613111575050835190915061313390613dfc565b8160008151811061314057fe5b602002602001018190525061316183602001516001600160a01b0316613e0f565b8160018151811061316e57fe5b6020026020010181905250600083604001515190506060816040519080825280602002602001820160405280156131b957816020015b60608152602001906001900390816131a45790505b50905060005b82811015613206576131e7866040015182815181106131da57fe5b6020026020010151613dfc565b8282815181106131f357fe5b60209081029190910101526001016131bf565b5061321081613e32565b8360028151811061321d57fe5b602002602001018190525060608260405190808252806020026020018201604052801561325e57816020015b60608152602001906001900390816132495790505b50905060005b838110156132b4576132958760600151828151811061327f57fe5b60200260200101516001600160a01b0316613e0f565b8282815181106132a157fe5b6020908102919091010152600101613264565b506132be81613e32565b846003815181106132cb57fe5b602002602001018190525060608360405190808252806020026020018201604052801561330c57816020015b60608152602001906001900390816132f75790505b50905060005b8481101561334c5761332d8860800151828151811061327f57fe5b82828151811061333957fe5b6020908102919091010152600101613312565b5061335681613e32565b8560048151811061336357fe5b60200260200101819052506133858760a0015167ffffffffffffffff16613dfc565b8560058151811061339257fe5b60200260200101819052506133a685613e32565b979650505050505050565b6133b961516f565b60006133c483613ebc565b91509150806134045760405162461bcd60e51b81526004018080602001828103825260248152602001806154dc6024913960400191505060405180910390fd5b61190c82614087565b6000611c9a83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f000000000000000081525061450b565b6000600882111561347857613471836007198401600a0a63ffffffff61301916565b9050611c9d565b611c9a836008849003600a0a63ffffffff61305b16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff16101561350557828160ff16815181106134d957fe5b01602001516001600160f81b031916156134f8578160010191506134fd565b613505565b6001016134be565b50600760ff8216101561351d576000925050506111e9565b816005820360ff168151811061352f57fe5b6020910101516001600160f81b031916602d60f81b14613554576000925050506111e9565b816001820360ff168151811061356657fe5b6020910101516001600160f81b031916604d60f81b1461358b576000925050506111e9565b5060019392505050565b6000816040516020018082805190602001908083835b602083106135ca5780518252601f1990920191602091820191016135ab565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106136385780518252601f199092019160209182019101613619565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6136896150c7565b60006136948361456d565b91509150806136d45760405162461bcd60e51b815260040180806020018281038252602481526020018061529f6024913960400191505060405180910390fd5b6136dc61516f565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b84604001515181101561375d5761373a8560400151828151811061372c57fe5b6020026020010151836147d1565b8560400151828151811061374a57fe5b602090810291909101015260010161370c565b50608084015160408301526005606083015261377882614087565b5050505050565b613787615113565b6000613791615113565b6137996151a6565b6137aa6137a58661480a565b61482f565b90506000805b6137b983614879565b156138b157806137db576137d46137cf8461489a565b6148e8565b84526138a9565b8060011415613808576137f56137f08461489a565b61499f565b6001600160a01b031660208501526138a9565b80600214156138275761381d6137cf8461489a565b60408501526138a9565b806003141561384f5761383c6137f08461489a565b6001600160a01b031660608501526138a9565b8060041415613877576138646137f08461489a565b6001600160a01b031660808501526138a9565b80600514156138a45761388c6137cf8461489a565b67ffffffffffffffff1660a0850152600191506138a9565b6138b1565b6001016137b0565b5091935090915050915091565b60208101516000906001600160a01b0316613a02578160a0015167ffffffffffffffff164211156138f1575060016111e9565b8160400151471015613905575060036111e9565b61390e826149b9565b61398357606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114613969576040519150601f19603f3d011682016040523d82523d6000602084013e61396e565b606091505b50509050806139815750600490506111e9565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5982602001518360600151846040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060006111e9565b8160a0015167ffffffffffffffff16421115613a20575060016111e9565b81516020808401516001600160a01b031660009081526003909152604090205414613a4d575060026111e9565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015613a9d57600080fd5b5086fa158015613ab1573d6000803e3d6000fd5b50505050506040513d6020811015613ac857600080fd5b50516040840151909150811015613ae35750600390506111e9565b613aec836149b9565b613ba357600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015613b6157600080fd5b5087f1158015613b75573d6000803e3d6000fd5b50505050506040513d6020811015613b8c57600080fd5b5051905080613ba15750600591506111e99050565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a150600090506111e9565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081613c3f5750508351909150613c6190613dfc565b81600081518110613c6e57fe5b6020026020010181905250613c868360200151613dfc565b81600181518110613c9357fe5b6020026020010181905250613cb483604001516001600160a01b0316613e0f565b81600281518110613cc157fe5b6020026020010181905250613cdf836060015163ffffffff16613dfc565b81600381518110613cec57fe5b602002602001018190525061109f81613e32565b60008183613d8c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d51578181015183820152602001613d39565b50505050905090810190601f168015613d7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d9857fe5b0495945050505050565b60008184841115613df45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d51578181015183820152602001613d39565b505050900390565b6060611c9d613e0a83614b27565b614c0d565b60408051600560a21b831860148201526034810190915260609061109f81614c0d565b6060815160001415613e5357506040805160008152602081019091526111e9565b606082600081518110613e6257fe5b602002602001015190506000600190505b8351811015613ea357613e9982858381518110613e8c57fe5b6020026020010151614c5f565b9150600101613e73565b5061109f613eb6825160c060ff16614cdc565b82614c5f565b613ec461516f565b6000613ece61516f565b613ed66151a6565b613ee26137a58661480a565b90506000805b613ef183614879565b156138b15780613f1757613f076137f08461489a565b6001600160a01b0316845261407f565b8060011415613fb8576060613f33613f2e8561489a565b614dd4565b90508051604051908082528060200260200182016040528015613f60578160200160208202803683370190505b50602086015260005b8151811015613fb157613f8e828281518110613f8157fe5b60200260200101516148e8565b86602001518281518110613f9e57fe5b6020908102919091010152600101613f69565b505061407f565b806002141561405a576060613fcf613f2e8561489a565b90508051604051908082528060200260200182016040528015613ffc578160200160208202803683370190505b50604086015260005b8151811015613fb15761402a82828151811061401d57fe5b602002602001015161499f565b8660400151828151811061403a57fe5b6001600160a01b0390921660209283029190910190910152600101614005565b80600314156138a45761406f6137cf8461489a565b63ffffffff166060850152600191505b600101613ee8565b80516001600160a01b03166142b15760005b8160200151518110156142ab576000826040015182815181106140b857fe5b60200260200101516001600160a01b0316612710846020015184815181106140dc57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114614124576040519150601f19603f3d011682016040523d82523d6000602084013e614129565b606091505b50509050806141ec577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061416857fe5b60200260200101518560200151858151811061418057fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16142a2565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061422257fe5b60200260200101518560200151858151811061423a57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101614099565b50614508565b60005b81602001515181101561450657600082600001516001600160a01b031663a9059cbb61c350856040015185815181106142e957fe5b60200260200101518660200151868151811061430157fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561435857600080fd5b5087f115801561436c573d6000803e3d6000fd5b50505050506040513d602081101561438357600080fd5b505190508015614447577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106143c357fe5b6020026020010151856020015185815181106143db57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16144fd565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061447d57fe5b60200260200101518560200151858151811061449557fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b506001016142b4565b505b50565b6000818361455a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d51578181015183820152602001613d39565b5082848161456457fe5b06949350505050565b6145756150c7565b600061457f6150c7565b6145876151a6565b6145936137a58661480a565b90506000805b6145a283614879565b156138b157806145bf576145b86137cf8461489a565b84526147c9565b80600114156145e7576145d46137f08461489a565b6001600160a01b031660208501526147c9565b80600214156146765760606145fe613f2e8561489a565b9050805160405190808252806020026020018201604052801561462b578160200160208202803683370190505b50604086015260005b815181101561466f5761464c828281518110613f8157fe5b8660400151828151811061465c57fe5b6020908102919091010152600101614634565b50506147c9565b806003141561470b57606061468d613f2e8561489a565b905080516040519080825280602002602001820160405280156146ba578160200160208202803683370190505b50606086015260005b815181101561466f576146db82828151811061401d57fe5b866060015182815181106146eb57fe5b6001600160a01b03909216602092830291909101909101526001016146c3565b80600414156147a0576060614722613f2e8561489a565b9050805160405190808252806020026020018201604052801561474f578160200160208202803683370190505b50608086015260005b815181101561466f5761477082828151811061401d57fe5b8660800151828151811061478057fe5b6001600160a01b0390921660209283029190910190910152600101614758565b80600514156138a4576147b56137cf8461489a565b67ffffffffffffffff1660a0850152600191505b600101614599565b600060088211156147f357613471836007198401600a0a63ffffffff61305b16565b611c9a836008849003600a0a63ffffffff61301916565b6148126151c6565b506040805180820190915281518152602082810190820152919050565b6148376151a6565b61484082614ea5565b61484957600080fd5b60006148588360200151614ed5565b60208085015160408051808201909152868152920190820152915050919050565b60006148836151c6565b505080518051602091820151919092015191011190565b6148a26151c6565b6148ab82614879565b6148b457600080fd5b602082015160006148c482614f38565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906148fd57508151602110155b61490657600080fd5b60006149158360200151614ed5565b90508083600001511015614970576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561499657826020036101000a820491505b50949350505050565b80516000906015146149b057600080fd5b611c9d826148e8565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8541580156149f25750600554155b15614a345760008052600660205269021e19e0c9bab24000007f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85561a8c06005555b6020808301516001600160a01b0316600090815260069091526040902054801580614a625750808360400151105b15614a715760009150506111e9565b6020808401516001600160a01b039081166000908152600783526040808220606088015190931682529190925290819020908401518154614ab79163ffffffff612fbf16565b8155600554420160018201819055606085015160208087015160408089015181519081529283019490945283516001600160a01b039384169493909116927f3fb83143cd331170da18fb1e8564d97e8ec39264b6ecb1ba248ea7596ab07258928290030190a35060019392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614b6b57506018614b8f565b6fffffffffffffffffffffffffffffffff198416614b8b57506010614b8f565b5060005b6020811015614bc557818181518110614ba457fe5b01602001516001600160f81b03191615614bbd57614bc5565b600101614b8f565b60008160200390506060816040519080825280601f01601f191660200182016040528015614bfa576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015614c3f5750607f60f81b82600081518110614c2d57fe5b01602001516001600160f81b03191611155b15614c4b5750806111e9565b611c9d614c5d8351608060ff16614cdc565b835b6060806040519050835180825260208201818101602087015b81831015614c90578051835260209283019201614c78565b50855184518101855292509050808201602086015b81831015614cbd578051835260209283019201614ca5565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614d2c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614d865782840160f81b81600081518110614d6857fe5b60200101906001600160f81b031916908160001a9053509050611c9d565b6060614d9185614b27565b90508381510160370160f81b82600081518110614daa57fe5b60200101906001600160f81b031916908160001a905350614dcb8282614c5f565b95945050505050565b6060614ddf82614ea5565b614de857600080fd5b6000614df38361506b565b9050606081604051908082528060200260200182016040528015614e3157816020015b614e1e6151c6565b815260200190600190039081614e165790505b5090506000614e438560200151614ed5565b60208601510190506000805b84811015614e9a57614e6083614f38565b9150604051806040016040528083815260200184815250848281518110614e8357fe5b602090810291909101015291810191600101614e4f565b509195945050505050565b8051600090614eb6575060006111e9565b6020820151805160001a9060c082101561358b576000925050506111e9565b8051600090811a6080811015614eef5760009150506111e9565b60b8811080614f0a575060c08110801590614f0a575060f881105b15614f195760019150506111e9565b60c0811015614f2d5760b5190190506111e9565b60f5190190506111e9565b80516000908190811a6080811015614f535760019150615064565b60b8811015614f6857607e1981019150615064565b60c0811015614fe257600060b78203600186019550806020036101000a865104915060018101820193505080831015614fdc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615064565b60f8811015614ff75760be1981019150615064565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615062576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061507c575060006111e9565b600080905060006150908460200151614ed5565b602085015185519181019250015b808210156150be576150af82614f38565b8201915082600101925061509e565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b60405180604001604052806151b96151c6565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79207374616b696e672073797374656d20636f6e74726163742063616e2063616c6c20746869732066756e6374696f6e746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374626e62206c61726765207472616e73666572206c696d697420746f6f20736d616c6c466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea164736f6c6343000604000a" + "code": "0x6080604052600436106103c75760003560e01c806396713da9116101f2578063c81b16621161010d578063f0148472116100a0578063fc1a598f1161006f578063fc1a598f14610f25578063fc3e590814610b85578063fd6a687914610f58578063ff9c0027146107fd5761040f565b8063f014847214610ed1578063f9a2bbc714610ee6578063fa9e915914610efb578063fb063e8f14610f105761040f565b8063dc927faf116100dc578063dc927faf14610e5f578063e1c7392a14610e74578063e8f35cea14610e89578063ebf71d5314610ebc5761040f565b8063c81b166214610d8a578063c8509d8114610d9f578063cf41984414610e24578063d9e6dae91461077f5761040f565b8063aa7415f511610185578063b9fd21e311610154578063b9fd21e314610cfa578063ba35ead614610d0f578063bbface1f14610d24578063bd46646114610d575761040f565b8063aa7415f514610b9a578063ab51bb9614610be1578063ac43175114610bf6578063b99328c514610cc15761040f565b8063a1a11bf5116101c1578063a1a11bf514610b46578063a496fba214610b5b578063a78abc1614610b70578063a7c9f02d14610b855761040f565b806396713da914610ace5780639a854bbd14610ae35780639a99b4f014610af85780639dc0926214610b315761040f565b806359b92789116102e257806371d3086311610275578063831d65d111610244578063831d65d1146109d15780638b87b21f146106d45780638eff336c14610a565780639509b98014610a955761040f565b806371d3086314610968578063727be1f81461097d57806375d47a0a146109a75780637942fd05146109bc5761040f565b80636e056520116102b15780636e056520146108125780636e47b4821461093e57806370fd5bad146107fd578063718a8aa8146109535761040f565b806359b92789146107be5780635d499b1b146107e8578063613684751461077f57806366dea52a146107fd5761040f565b80633fd8b02f1161035a5780634a3acdf4116103295780634a3acdf41461076a5780634bf6c8821461077f57806350432d321461079457806351e80672146107a95761040f565b80633fd8b02f146106ff57806343756e5c1461071457806343a368b914610729578063493279b11461073e5761040f565b8063149d14d911610396578063149d14d9146105a85780632ae45483146105cf5780633d713223146106235780633dffc387146106d45761040f565b80630bee7a67146104145780630e2374a5146104425780631182b87514610473578063122345821461056d5761040f565b3661040f57341561040d576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561042057600080fd5b50610429610f6d565b6040805163ffffffff9092168252519081900360200190f35b34801561044e57600080fd5b50610457610f72565b604080516001600160a01b039092168252519081900360200190f35b34801561047f57600080fd5b506104f86004803603604081101561049657600080fd5b60ff8235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460018302840111600160201b831117156104ed57600080fd5b509092509050610f78565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561053257818101518382015260200161051a565b50505050905090810190601f16801561055f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561057957600080fd5b5061040d6004803603604081101561059057600080fd5b506001600160a01b03813581169160200135166110a6565b3480156105b457600080fd5b506105bd6111a0565b60408051918252519081900360200190f35b3480156105db57600080fd5b5061060a600480360360408110156105f257600080fd5b506001600160a01b03813581169160200135166111a6565b6040805192835260208301919091528051918290030190f35b34801561062f57600080fd5b506104576004803603602081101561064657600080fd5b810190602081018135600160201b81111561066057600080fd5b82018360208201111561067257600080fd5b803590602001918460018302840111600160201b8311171561069357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506111ca945050505050565b3480156106e057600080fd5b506106e96111ee565b6040805160ff9092168252519081900360200190f35b34801561070b57600080fd5b506105bd6111f3565b34801561072057600080fd5b506104576111f9565b34801561073557600080fd5b506105bd6111ff565b34801561074a57600080fd5b5061075361120b565b6040805161ffff9092168252519081900360200190f35b34801561077657600080fd5b506105bd611210565b34801561078b57600080fd5b506106e9611216565b3480156107a057600080fd5b506105bd61121b565b3480156107b557600080fd5b50610457611226565b3480156107ca57600080fd5b50610457600480360360208110156107e157600080fd5b503561122c565b3480156107f457600080fd5b506105bd611247565b34801561080957600080fd5b506106e9611250565b61092a6004803603608081101561082857600080fd5b810190602081018135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460208302840111600160201b8311171561087557600080fd5b919390929091602081019035600160201b81111561089257600080fd5b8201836020820111156108a457600080fd5b803590602001918460208302840111600160201b831117156108c557600080fd5b919390929091602081019035600160201b8111156108e257600080fd5b8201836020820111156108f457600080fd5b803590602001918460208302840111600160201b8311171561091557600080fd5b91935091503567ffffffffffffffff16611255565b604080519115158252519081900360200190f35b34801561094a57600080fd5b5061045761172a565b34801561095f57600080fd5b506106e9611730565b34801561097457600080fd5b506105bd611735565b34801561098957600080fd5b5061092a600480360360208110156109a057600080fd5b503561173b565b3480156109b357600080fd5b506104576117bc565b3480156109c857600080fd5b506106e96117c2565b3480156109dd57600080fd5b5061040d600480360360408110156109f457600080fd5b60ff8235169190810190604081016020820135600160201b811115610a1857600080fd5b820183602082011115610a2a57600080fd5b803590602001918460018302840111600160201b83111715610a4b57600080fd5b5090925090506117c7565b348015610a6257600080fd5b5061040d60048036036060811015610a7957600080fd5b508035906001600160a01b036020820135169060400135611910565b348015610aa157600080fd5b5061040d60048036036040811015610ab857600080fd5b506001600160a01b038135169060200135611996565b348015610ada57600080fd5b506106e9611b53565b348015610aef57600080fd5b506105bd611b58565b348015610b0457600080fd5b506105bd60048036036040811015610b1b57600080fd5b506001600160a01b038135169060200135611b64565b348015610b3d57600080fd5b50610457611ca2565b348015610b5257600080fd5b50610457611ca8565b348015610b6757600080fd5b506106e9611cae565b348015610b7c57600080fd5b5061092a611cb3565b348015610b9157600080fd5b506106e9611cbc565b61092a60048036036080811015610bb057600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16611cc1565b348015610bed57600080fd5b50610429611cae565b348015610c0257600080fd5b5061040d60048036036040811015610c1957600080fd5b810190602081018135600160201b811115610c3357600080fd5b820183602082011115610c4557600080fd5b803590602001918460018302840111600160201b83111715610c6657600080fd5b919390929091602081019035600160201b811115610c8357600080fd5b820183602082011115610c9557600080fd5b803590602001918460018302840111600160201b83111715610cb657600080fd5b509092509050612382565b348015610ccd57600080fd5b5061040d60048036036040811015610ce457600080fd5b50803590602001356001600160a01b031661282a565b348015610d0657600080fd5b506105bd6128aa565b348015610d1b57600080fd5b506105bd6128b4565b348015610d3057600080fd5b506105bd60048036036020811015610d4757600080fd5b50356001600160a01b03166128ba565b348015610d6357600080fd5b506105bd60048036036020811015610d7a57600080fd5b50356001600160a01b03166128cc565b348015610d9657600080fd5b506104576128e7565b348015610dab57600080fd5b5061040d60048036036040811015610dc257600080fd5b60ff8235169190810190604081016020820135600160201b811115610de657600080fd5b820183602082011115610df857600080fd5b803590602001918460018302840111600160201b83111715610e1957600080fd5b5090925090506128ed565b348015610e3057600080fd5b5061040d60048036036040811015610e4757600080fd5b506001600160a01b03813581169160200135166129bd565b348015610e6b57600080fd5b50610457612c91565b348015610e8057600080fd5b5061040d612c97565b348015610e9557600080fd5b506105bd60048036036020811015610eac57600080fd5b50356001600160a01b0316612d37565b348015610ec857600080fd5b506106e9612d49565b348015610edd57600080fd5b506106e9612d4e565b348015610ef257600080fd5b50610457612d53565b348015610f0757600080fd5b506105bd612d59565b348015610f1c57600080fd5b506105bd612d5f565b348015610f3157600080fd5b506104f860048036036020811015610f4857600080fd5b50356001600160a01b0316612d6d565b348015610f6457600080fd5b50610457612e94565b606481565b61200181565b60005460609060ff16610fc0576040805162461bcd60e51b8152602060048201526019602482015260008051602061558c833981519152604482015290519081900360640190fd5b33612000146110005760405162461bcd60e51b815260040180806020018281038252602f81526020018061553a602f913960400191505060405180910390fd5b60ff8416600214156110525761104b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9a92505050565b905061109f565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b33612000146110e65760405162461bcd60e51b815260040180806020018281038252602f81526020018061553a602f913960400191505060405180910390fd5b6001600160a01b0380831660009081526007602090815260408083209385168352929052208054611151576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8054600082556040805182815290516001600160a01b0380861692908716917f152fb15aa5d80f843e1e4bd5f2fc9161714f169945024decec7e84fb910fdd519181900360200190a350505050565b60015490565b60076020908152600092835260408084209091529082529020805460019091015482565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b60055481565b61100181565b670de0b6b3a764000081565b606081565b61a8c081565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff1661129b576040805162461bcd60e51b8152602060048201526019602482015260008051602061558c833981519152604482015290519081900360640190fd5b8685146112d95760405162461bcd60e51b815260040180806020018281038252603b8152602001806154ff603b913960400191505060405180910390fd5b8683146113175760405162461bcd60e51b815260040180806020018281038252603f8152602001806153d2603f913960400191505060405180910390fd5b426078018267ffffffffffffffff1610156113635760405162461bcd60e51b81526004018080602001828103825260248152602001806152c26024913960400191505060405180910390fd5b6402540be4003406156113a75760405162461bcd60e51b81526004018080602001828103825260408152602001806156026040913960400191505060405180910390fd5b604080518681526020808802820101909152859060009081906060908480156113da578160200160208202803683370190505b50905060005b848110156114b5576402540be4008b8b838181106113fa57fe5b905060200201358161140857fe5b06156114455760405162461bcd60e51b815260040180806020018281038252603c815260200180615411603c913960400191505060405180910390fd5b61146a8b8b8381811061145457fe5b9050602002013585612fbe90919063ffffffff16565b93506114966402540be4008c8c8481811061148157fe5b9050602002013561301890919063ffffffff16565b8282815181106114a257fe5b60209081029190910101526001016113e0565b506001546114da906114cd908663ffffffff61305a16565b849063ffffffff612fbe16565b3410156115185760405162461bcd60e51b81526004018080602001828103825260568152602001806155ac6056913960600191505060405180910390fd5b611528348463ffffffff6130b316565b91506115326150c6565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036115f6846130f5565b61160b876402540be40063ffffffff61301816565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611669578181015183820152602001611651565b50505050905090810190601f1680156116965780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156116b757600080fd5b505af11580156116cb573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b601081565b60015481565b6000336120011461177d5760405162461bcd60e51b81526004018080602001828103825260338152602001806151e06033913960400191505060405180910390fd5b81156117b4576040516120019083156108fc029084906000818181858888f193505050501580156117b2573d6000803e3d6000fd5b505b506001919050565b61100881565b600b81565b60005460ff1661180c576040805162461bcd60e51b8152602060048201526019602482015260008051602061558c833981519152604482015290519081900360640190fd5b336120001461184c5760405162461bcd60e51b815260040180806020018281038252602f81526020018061553a602f913960400191505060405180910390fd5b60ff83166003141561189c5761189782828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133b092505050565b61190b565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146119505760405162461bcd60e51b81526004018080602001828103825260238152602001806155696023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b81806001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156119d057600080fd5b505afa1580156119e4573d6000803e3d6000fd5b505050506040513d60208110156119fa57600080fd5b50516001600160a01b03163314611a58576040805162461bcd60e51b815260206004820152601860248201527f6e6f74206f776e6572206f6620424550323020746f6b656e0000000000000000604482015290519081900360640190fd5b60008211611aa6576040805162461bcd60e51b81526020600482015260166024820152751e995c9bc81b1a5b5a5d081b9bdd08185b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b038316600090815260036020526040902054611afc576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b038316600081815260066020908152604091829020859055815185815291513393927f9df3a90730dbf23b5cc18dbbd5f4af3fa94a0dffb6ff6841f98a9a9a6ac626a892908290030190a3505050565b600981565b677ce66c50e284000081565b6000805460ff16611baa576040805162461bcd60e51b8152602060048201526019602482015260008051602061558c833981519152604482015290519081900360640190fd5b3361100514611bea5760405162461bcd60e51b815260040180806020018281038252602f815260200180615213602f913960400191505060405180910390fd5b6000478310611bf95747611bfb565b825b9050670de0b6b3a7640000811115611c17576000915050611c9c565b8015611c99576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611c53573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611d07576040805162461bcd60e51b8152602060048201526019602482015260008051602061558c833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff161015611d535760405162461bcd60e51b81526004018080602001828103825260248152602001806152c26024913960400191505060405180910390fd5b6402540be400340615611d975760405162461bcd60e51b81526004018080602001828103825260408152602001806156026040913960400191505060405180910390fd5b600080806001600160a01b038816611e7657600154611dbd90879063ffffffff612fbe16565b341015611dfb5760405162461bcd60e51b815260040180806020018281038252606181526020018061534c6061913960800191505060405180910390fd5b6402540be400860615611e3f5760405162461bcd60e51b815260040180806020018281038252603c815260200180615411603c913960400191505060405180910390fd5b611e4f348763ffffffff6130b316565b9050611e66866402540be40063ffffffff61301816565b6221272160e91b93509150612119565b6001600160a01b038816600090815260036020526040902054925082611ecd5760405162461bcd60e51b815260040180806020018281038252603181526020018061531b6031913960400191505060405180910390fd5b600154341015611f0e5760405162461bcd60e51b815260040180806020018281038252603f81526020018061546e603f913960400191505060405180910390fd5b506001600160a01b0387166000908152600260205260409020543490600881111580611f595750600881118015611f595750611f57876007198301600a0a63ffffffff61340c16565b155b611f945760405162461bcd60e51b815260040180806020018281038252603c815260200180615411603c913960400191505060405180910390fd5b611f9e878261344e565b9250611fa98461348e565b15611ff1576305f5e100831015611ff15760405162461bcd60e51b815260040180806020018281038252603a815260200180615264603a913960400191505060405180910390fd5b60088110158061200b575060088110801561200b57508683115b6120465760405162461bcd60e51b81526004018080602001828103825260258152602001806153ad6025913960400191505060405180910390fd5b677ce66c50e284000083111561208d5760405162461bcd60e51b81526004018080602001828103825260358152602001806152e66035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b1580156120e257600080fd5b505af11580156120f6573d6000803e3d6000fd5b505050506040513d602081101561210c57600080fd5b505161211757600080fd5b505b6121216150c6565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff1681525090508281604001516000815181106121cf57fe5b6020026020010181815250508781606001516000815181106121ed57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505033816080015160008151811061221f57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d7600361224a846130f5565b61225f866402540be40063ffffffff61301816565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156122bd5781810151838201526020016122a5565b50505050905090810190601f1680156122ea5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561230b57600080fd5b505af115801561231f573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b33611007146123c25760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ad602e913960400191505060405180910390fd5b60208114612417576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b81141561251f576020820151670de0b6b3a764000081118015906124c657506402540be4008106155b612517576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155612795565b61259387878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601781527f6c617267655472616e736665724c6f636b506572696f64000000000000000000602082015291506135949050565b1561262f57604080516020601f87018190048102820181019092528581526000916125d69188888083850183828082843760009201919091525061367b92505050565b905062093a80811115612627576040805162461bcd60e51b81526020600482015260146024820152736c6f636b20706572696f6420746f6f206c6f6e6760601b604482015290519081900360640190fd5b600555612795565b61269b87878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526015815274189b9893185c99d9551c985b9cd9995c931a5b5a5d605a1b602082015291506135949050565b1561275857604080516020601f87018190048102820181019092528581526000916126de9188888083850183828082843760009201919091525061367b92505050565b905068056bc75e2d631000008110156127285760405162461bcd60e51b81526004018080602001828103825260228152602001806152426022913960400191505060405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855612795565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461286a5760405162461bcd60e51b81526004018080602001828103825260238152602001806155696023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b039290921683526003815281832083905560029052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff16612932576040805162461bcd60e51b8152602060048201526019602482015260008051602061558c833981519152604482015290519081900360640190fd5b33612000146129725760405162461bcd60e51b815260040180806020018281038252602f81526020018061553a602f913960400191505060405180910390fd5b60ff83166003141561189c5761189782828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061368092505050565b60085460ff1660021415612a09576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6008805460ff191660021790556001600160a01b0380831660009081526007602090815260408083209385168352929052208054612a81576040805162461bcd60e51b815260206004820152601060248201526f1b9bc81b1bd8dad95908185b5bdd5b9d60821b604482015290519081900360640190fd5b8060010154421015612ada576040805162461bcd60e51b815260206004820152601760248201527f7374696c6c206f6e206c6f636b696e6720706572696f64000000000000000000604482015290519081900360640190fd5b805460008083556001600160a01b038516612b4d576040516001600160a01b038516906127109084906000818181858888f193505050503d8060008114612b3d576040519150601f19603f3d011682016040523d82523d6000602084013e612b42565b606091505b505080915050612be0565b846001600160a01b031663a9059cbb61c35086856040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612bb057600080fd5b5087f1158015612bc4573d6000803e3d6000fd5b50505050506040513d6020811015612bdb57600080fd5b505190505b80612c32576040805162461bcd60e51b815260206004820152601e60248201527f776974686472617720756e6c6f636b656420746f6b656e206661696c65640000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03167f832fc3e25f2b3e6fb0eb59419a73cba405f2a249fce75f7e31ea5a457a0323f1846040518082815260200191505060405180910390a350506008805460ff19166001179055505050565b61100381565b60005460ff1615612cef576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b60066020526000908152604090205481565b600481565b600581565b61100081565b61271081565b69021e19e0c9bab240000081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff161015612dfd57828160ff1681518110612dd157fe5b01602001516001600160f81b03191615612df057816001019150612df5565b612dfd565b600101612db6565b5060608160ff166040519080825280601f01601f191660200182016040528015612e2e576020820181803683370190505b50905060005b8260ff168160ff161015612e8a57838160ff1681518110612e5157fe5b602001015160f81c60f81b828260ff1681518110612e6b57fe5b60200101906001600160f81b031916908160001a905350600101612e34565b5095945050505050565b61100481565b6060612ea4615112565b6000612eaf8461377e565b9150915080612f05576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b6000612f10836138bd565b905063ffffffff811615612fa4576040808401516020808601516001600160a01b03166000908152600290915291822054612f4b919061344e565b9050612f55615147565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff168152509050612f9881613c23565b955050505050506111e9565b505060408051600081526020810190915291506111e99050565b600082820183811015611c99576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000611c9983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613cff565b60008261306957506000611c9c565b8282028284828161307657fe5b0414611c995760405162461bcd60e51b815260040180806020018281038252602181526020018061544d6021913960400191505060405180910390fd5b6000611c9983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613da1565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613110575050835190915061313290613dfb565b8160008151811061313f57fe5b602002602001018190525061316083602001516001600160a01b0316613e0e565b8160018151811061316d57fe5b6020026020010181905250600083604001515190506060816040519080825280602002602001820160405280156131b857816020015b60608152602001906001900390816131a35790505b50905060005b82811015613205576131e6866040015182815181106131d957fe5b6020026020010151613dfb565b8282815181106131f257fe5b60209081029190910101526001016131be565b5061320f81613e31565b8360028151811061321c57fe5b602002602001018190525060608260405190808252806020026020018201604052801561325d57816020015b60608152602001906001900390816132485790505b50905060005b838110156132b3576132948760600151828151811061327e57fe5b60200260200101516001600160a01b0316613e0e565b8282815181106132a057fe5b6020908102919091010152600101613263565b506132bd81613e31565b846003815181106132ca57fe5b602002602001018190525060608360405190808252806020026020018201604052801561330b57816020015b60608152602001906001900390816132f65790505b50905060005b8481101561334b5761332c8860800151828151811061327e57fe5b82828151811061333857fe5b6020908102919091010152600101613311565b5061335581613e31565b8560048151811061336257fe5b60200260200101819052506133848760a0015167ffffffffffffffff16613dfb565b8560058151811061339157fe5b60200260200101819052506133a585613e31565b979650505050505050565b6133b861516e565b60006133c383613ebb565b91509150806134035760405162461bcd60e51b81526004018080602001828103825260248152602001806154db6024913960400191505060405180910390fd5b61190b82614086565b6000611c9983836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f000000000000000081525061450a565b6000600882111561347757613470836007198401600a0a63ffffffff61301816565b9050611c9c565b611c99836008849003600a0a63ffffffff61305a16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff16101561350457828160ff16815181106134d857fe5b01602001516001600160f81b031916156134f7578160010191506134fc565b613504565b6001016134bd565b50600760ff8216101561351c576000925050506111e9565b816005820360ff168151811061352e57fe5b6020910101516001600160f81b031916602d60f81b14613553576000925050506111e9565b816001820360ff168151811061356557fe5b6020910101516001600160f81b031916604d60f81b1461358a576000925050506111e9565b5060019392505050565b6000816040516020018082805190602001908083835b602083106135c95780518252601f1990920191602091820191016135aa565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106136375780518252601f199092019160209182019101613618565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6136886150c6565b60006136938361456c565b91509150806136d35760405162461bcd60e51b815260040180806020018281038252602481526020018061529e6024913960400191505060405180910390fd5b6136db61516e565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b84604001515181101561375c576137398560400151828151811061372b57fe5b6020026020010151836147d0565b8560400151828151811061374957fe5b602090810291909101015260010161370b565b50608084015160408301526005606083015261377782614086565b5050505050565b613786615112565b6000613790615112565b6137986151a5565b6137a96137a486614809565b61482e565b90506000805b6137b883614878565b156138b057806137da576137d36137ce84614899565b6148e7565b84526138a8565b8060011415613807576137f46137ef84614899565b61499e565b6001600160a01b031660208501526138a8565b80600214156138265761381c6137ce84614899565b60408501526138a8565b806003141561384e5761383b6137ef84614899565b6001600160a01b031660608501526138a8565b8060041415613876576138636137ef84614899565b6001600160a01b031660808501526138a8565b80600514156138a35761388b6137ce84614899565b67ffffffffffffffff1660a0850152600191506138a8565b6138b0565b6001016137af565b5091935090915050915091565b60208101516000906001600160a01b0316613a01578160a0015167ffffffffffffffff164211156138f0575060016111e9565b8160400151471015613904575060036111e9565b61390d826149b8565b61398257606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114613968576040519150601f19603f3d011682016040523d82523d6000602084013e61396d565b606091505b50509050806139805750600490506111e9565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5982602001518360600151846040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060006111e9565b8160a0015167ffffffffffffffff16421115613a1f575060016111e9565b81516020808401516001600160a01b031660009081526003909152604090205414613a4c575060026111e9565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015613a9c57600080fd5b5086fa158015613ab0573d6000803e3d6000fd5b50505050506040513d6020811015613ac757600080fd5b50516040840151909150811015613ae25750600390506111e9565b613aeb836149b8565b613ba257600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015613b6057600080fd5b5087f1158015613b74573d6000803e3d6000fd5b50505050506040513d6020811015613b8b57600080fd5b5051905080613ba05750600591506111e99050565b505b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a150600090506111e9565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081613c3e5750508351909150613c6090613dfb565b81600081518110613c6d57fe5b6020026020010181905250613c858360200151613dfb565b81600181518110613c9257fe5b6020026020010181905250613cb383604001516001600160a01b0316613e0e565b81600281518110613cc057fe5b6020026020010181905250613cde836060015163ffffffff16613dfb565b81600381518110613ceb57fe5b602002602001018190525061109f81613e31565b60008183613d8b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d50578181015183820152602001613d38565b50505050905090810190601f168015613d7d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613d9757fe5b0495945050505050565b60008184841115613df35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d50578181015183820152602001613d38565b505050900390565b6060611c9c613e0983614b26565b614c0c565b60408051600560a21b831860148201526034810190915260609061109f81614c0c565b6060815160001415613e5257506040805160008152602081019091526111e9565b606082600081518110613e6157fe5b602002602001015190506000600190505b8351811015613ea257613e9882858381518110613e8b57fe5b6020026020010151614c5e565b9150600101613e72565b5061109f613eb5825160c060ff16614cdb565b82614c5e565b613ec361516e565b6000613ecd61516e565b613ed56151a5565b613ee16137a486614809565b90506000805b613ef083614878565b156138b05780613f1657613f066137ef84614899565b6001600160a01b0316845261407e565b8060011415613fb7576060613f32613f2d85614899565b614dd3565b90508051604051908082528060200260200182016040528015613f5f578160200160208202803683370190505b50602086015260005b8151811015613fb057613f8d828281518110613f8057fe5b60200260200101516148e7565b86602001518281518110613f9d57fe5b6020908102919091010152600101613f68565b505061407e565b8060021415614059576060613fce613f2d85614899565b90508051604051908082528060200260200182016040528015613ffb578160200160208202803683370190505b50604086015260005b8151811015613fb05761402982828151811061401c57fe5b602002602001015161499e565b8660400151828151811061403957fe5b6001600160a01b0390921660209283029190910190910152600101614004565b80600314156138a35761406e6137ce84614899565b63ffffffff166060850152600191505b600101613ee7565b80516001600160a01b03166142b05760005b8160200151518110156142aa576000826040015182815181106140b757fe5b60200260200101516001600160a01b0316612710846020015184815181106140db57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114614123576040519150601f19603f3d011682016040523d82523d6000602084013e614128565b606091505b50509050806141eb577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061416757fe5b60200260200101518560200151858151811061417f57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16142a1565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061422157fe5b60200260200101518560200151858151811061423957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101614098565b50614507565b60005b81602001515181101561450557600082600001516001600160a01b031663a9059cbb61c350856040015185815181106142e857fe5b60200260200101518660200151868151811061430057fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561435757600080fd5b5087f115801561436b573d6000803e3d6000fd5b50505050506040513d602081101561438257600080fd5b505190508015614446577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106143c257fe5b6020026020010151856020015185815181106143da57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16144fc565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061447c57fe5b60200260200101518560200151858151811061449457fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b506001016142b3565b505b50565b600081836145595760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613d50578181015183820152602001613d38565b5082848161456357fe5b06949350505050565b6145746150c6565b600061457e6150c6565b6145866151a5565b6145926137a486614809565b90506000805b6145a183614878565b156138b057806145be576145b76137ce84614899565b84526147c8565b80600114156145e6576145d36137ef84614899565b6001600160a01b031660208501526147c8565b80600214156146755760606145fd613f2d85614899565b9050805160405190808252806020026020018201604052801561462a578160200160208202803683370190505b50604086015260005b815181101561466e5761464b828281518110613f8057fe5b8660400151828151811061465b57fe5b6020908102919091010152600101614633565b50506147c8565b806003141561470a57606061468c613f2d85614899565b905080516040519080825280602002602001820160405280156146b9578160200160208202803683370190505b50606086015260005b815181101561466e576146da82828151811061401c57fe5b866060015182815181106146ea57fe5b6001600160a01b03909216602092830291909101909101526001016146c2565b806004141561479f576060614721613f2d85614899565b9050805160405190808252806020026020018201604052801561474e578160200160208202803683370190505b50608086015260005b815181101561466e5761476f82828151811061401c57fe5b8660800151828151811061477f57fe5b6001600160a01b0390921660209283029190910190910152600101614757565b80600514156138a3576147b46137ce84614899565b67ffffffffffffffff1660a0850152600191505b600101614598565b600060088211156147f257613470836007198401600a0a63ffffffff61305a16565b611c99836008849003600a0a63ffffffff61301816565b6148116151c5565b506040805180820190915281518152602082810190820152919050565b6148366151a5565b61483f82614ea4565b61484857600080fd5b60006148578360200151614ed4565b60208085015160408051808201909152868152920190820152915050919050565b60006148826151c5565b505080518051602091820151919092015191011190565b6148a16151c5565b6148aa82614878565b6148b357600080fd5b602082015160006148c382614f37565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906148fc57508151602110155b61490557600080fd5b60006149148360200151614ed4565b9050808360000151101561496f576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561499557826020036101000a820491505b50949350505050565b80516000906015146149af57600080fd5b611c9c826148e7565b600080805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8541580156149f15750600554155b15614a335760008052600660205269021e19e0c9bab24000007f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85561a8c06005555b6020808301516001600160a01b0316600090815260069091526040902054801580614a615750808360400151105b15614a705760009150506111e9565b6020808401516001600160a01b039081166000908152600783526040808220606088015190931682529190925290819020908401518154614ab69163ffffffff612fbe16565b8155600554420160018201819055606085015160208087015160408089015181519081529283019490945283516001600160a01b039384169493909116927f3fb83143cd331170da18fb1e8564d97e8ec39264b6ecb1ba248ea7596ab07258928290030190a35060019392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614b6a57506018614b8e565b6fffffffffffffffffffffffffffffffff198416614b8a57506010614b8e565b5060005b6020811015614bc457818181518110614ba357fe5b01602001516001600160f81b03191615614bbc57614bc4565b600101614b8e565b60008160200390506060816040519080825280601f01601f191660200182016040528015614bf9576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015614c3e5750607f60f81b82600081518110614c2c57fe5b01602001516001600160f81b03191611155b15614c4a5750806111e9565b611c9c614c5c8351608060ff16614cdb565b835b6060806040519050835180825260208201818101602087015b81831015614c8f578051835260209283019201614c77565b50855184518101855292509050808201602086015b81831015614cbc578051835260209283019201614ca4565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614d2b576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614d855782840160f81b81600081518110614d6757fe5b60200101906001600160f81b031916908160001a9053509050611c9c565b6060614d9085614b26565b90508381510160370160f81b82600081518110614da957fe5b60200101906001600160f81b031916908160001a905350614dca8282614c5e565b95945050505050565b6060614dde82614ea4565b614de757600080fd5b6000614df28361506a565b9050606081604051908082528060200260200182016040528015614e3057816020015b614e1d6151c5565b815260200190600190039081614e155790505b5090506000614e428560200151614ed4565b60208601510190506000805b84811015614e9957614e5f83614f37565b9150604051806040016040528083815260200184815250848281518110614e8257fe5b602090810291909101015291810191600101614e4e565b509195945050505050565b8051600090614eb5575060006111e9565b6020820151805160001a9060c082101561358a576000925050506111e9565b8051600090811a6080811015614eee5760009150506111e9565b60b8811080614f09575060c08110801590614f09575060f881105b15614f185760019150506111e9565b60c0811015614f2c5760b5190190506111e9565b60f5190190506111e9565b80516000908190811a6080811015614f525760019150615063565b60b8811015614f6757607e1981019150615063565b60c0811015614fe157600060b78203600186019550806020036101000a865104915060018101820193505080831015614fdb576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615063565b60f8811015614ff65760be1981019150615063565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615061576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061507b575060006111e9565b6000809050600061508f8460200151614ed4565b602085015185519181019250015b808210156150bd576150ae82614f37565b8201915082600101925061509d565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b60405180604001604052806151b86151c5565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79207374616b696e672073797374656d20636f6e74726163742063616e2063616c6c20746869732066756e6374696f6e746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374626e62206c61726765207472616e73666572206c696d697420746f6f20736d616c6c466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea26469706673582212202719512d26e3553572d5406facdd3144e28675637d8cd4ec8f0723c72689034364736f6c63430006040033" }, "0x0000000000000000000000000000000000001005": { "balance": "0x0", - "code": "0x6080604052600436106102975760003560e01c80637e146cc51161015a578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107f5578063e89a302014610828578063f9a2bbc714610852578063fc3e590814610867578063fd6a68791461087c578063fdd31fcd146108915761029e565b8063bd4cc83014610762578063c81b16621461078c578063d0ab528a146107a1578063dc927faf146107b6578063dcae76ab146107cb578063e1c7392a146107e05761029e565b8063a78abc1611610113578063a78abc1614610613578063a7c6a59d14610628578063ab51bb961461063d578063ac43175114610652578063ace9fcc214610723578063af400681146107385761029e565b80637e146cc514610577578063930e1b091461058c57806396713da9146105bf5780639dc09262146105d4578063a1a11bf5146105e9578063a3c3c0ad146105fe5761029e565b806343756e5c116101fe5780636f93d2e6116101b75780636f93d2e6146104af57806370fd5bad1461050e578063718a8aa81461052357806374f2272d1461053857806375d47a0a1461054d5780637942fd05146105625761029e565b806343756e5c1461041a578063493279b11461042f5780634bf6c8821461045b57806351e806721461047057806354133307146104855780636e47b4821461049a5761029e565b806312950c461161025057806312950c46146103685780631b20087c1461037d5780631c643312146103925780633a975612146102a35780633dffc387146103bc57806340bb43c0146103e75761029e565b8063081e9d13146102a357806308f2ec06146102ca578063093f2fc4146102df5780630bee7a67146102f45780630e2374a51461032257806310e06a76146103535761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86108c4565b60408051918252519081900360200190f35b3480156102d657600080fd5b506102b86108c9565b3480156102eb57600080fd5b506102b86108ce565b34801561030057600080fd5b506103096108d3565b6040805163ffffffff9092168252519081900360200190f35b34801561032e57600080fd5b506103376108d8565b604080516001600160a01b039092168252519081900360200190f35b34801561035f57600080fd5b506102b86108de565b34801561037457600080fd5b506102b86108e4565b34801561038957600080fd5b506102b86108ea565b34801561039e57600080fd5b50610337600480360360208110156103b557600080fd5b50356108f0565b3480156103c857600080fd5b506103d16108c4565b6040805160ff9092168252519081900360200190f35b3480156103f357600080fd5b506102b86004803603602081101561040a57600080fd5b50356001600160a01b0316610917565b34801561042657600080fd5b50610337610929565b34801561043b57600080fd5b5061044461092f565b6040805161ffff9092168252519081900360200190f35b34801561046757600080fd5b506103d1610935565b34801561047c57600080fd5b5061033761093a565b34801561049157600080fd5b506102b86108d3565b3480156104a657600080fd5b50610337610940565b3480156104bb57600080fd5b506104fa600480360360808110156104d257600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610946565b604080519115158252519081900360200190f35b34801561051a57600080fd5b506103d1610dd8565b34801561052f57600080fd5b506103d1610ddd565b34801561054457600080fd5b506102b8610de2565b34801561055957600080fd5b50610337610de8565b34801561056e57600080fd5b506103d1610dee565b34801561058357600080fd5b506102b8610df3565b34801561059857600080fd5b506102b8600480360360208110156105af57600080fd5b50356001600160a01b0316610df8565b3480156105cb57600080fd5b506103d1610e0a565b3480156105e057600080fd5b50610337610e0f565b3480156105f557600080fd5b50610337610e15565b34801561060a57600080fd5b506102b8610e1b565b34801561061f57600080fd5b506104fa610e21565b34801561063457600080fd5b506102b8610e2a565b34801561064957600080fd5b50610309610e30565b34801561065e57600080fd5b506107216004803603604081101561067557600080fd5b81019060208101813564010000000081111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111640100000000831117156106c457600080fd5b9193909290916020810190356401000000008111156106e257600080fd5b8201836020820111156106f457600080fd5b8035906020019184600183028401116401000000008311171561071657600080fd5b509092509050610e35565b005b34801561072f57600080fd5b506102b8611583565b34801561074457600080fd5b506102b86004803603602081101561075b57600080fd5b5035611589565b34801561076e57600080fd5b506102b86004803603602081101561078557600080fd5b50356115e4565b34801561079857600080fd5b506103376115fd565b3480156107ad57600080fd5b506102b8611603565b3480156107c257600080fd5b50610337611609565b3480156107d757600080fd5b506102b861160f565b3480156107ec57600080fd5b50610721611615565b34801561080157600080fd5b506107216004803603602081101561081857600080fd5b50356001600160a01b03166116de565b34801561083457600080fd5b506103376004803603602081101561084b57600080fd5b5035611837565b34801561085e57600080fd5b50610337611844565b34801561087357600080fd5b506103d161184a565b34801561088857600080fd5b5061033761184f565b34801561089d57600080fd5b506102b8600480360360208110156108b457600080fd5b50356001600160a01b0316611855565b600181565b602881565b605081565b606481565b61200181565b600b5481565b60015481565b600c5481565b600681815481106108fd57fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b6102ca81565b600881565b61200081565b61100581565b6000805460ff1661099e576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109de5760405162461bcd60e51b815260040180806020018281038252602f8152602001806123d8602f913960400191505060405180910390fd5b60008215610a91576110026001600160a01b0316639a99b4f0611005610a0f600e548861186790919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a5e57600080fd5b505af1158015610a72573d6000803e3d6000fd5b505050506040513d6020811015610a8857600080fd5b50519050610ba0565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610adb57600080fd5b505af1158015610aef573d6000803e3d6000fd5b505050506040513d6020811015610b0557600080fd5b5051600e5490915015610ba057600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b9d9161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b6457600080fd5b505af1158015610b78573d6000803e3d6000fd5b505050506040513d6020811015610b8e57600080fd5b5051829063ffffffff61186716565b90505b600c805460010190556000610bb4826118ca565b600954909150610bca908263ffffffff61186716565b600955600a54610bf2908290610be6908563ffffffff61186716565b9063ffffffff6118f316565b600a556001600160a01b038716600090815260056020526040902054610c5e57600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610cdc57600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610dcb57600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d56611935565b90506000610d62611c25565b6001600160a01b0389166000908152600d6020526040902054909150610da0908290610d94908563ffffffff61186716565b9063ffffffff61186716565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b601081565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e755760405162461bcd60e51b815260040180806020018281038252602e81526020018061231d602e913960400191505060405180910390fd5b60005460ff16610eb65760405162461bcd60e51b815260040180806020018281038252602181526020018061234b6021913960400191505060405180910390fd5b610f2a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611eac9050565b15610ff75760208114610f6e5760405162461bcd60e51b81526004018080602001828103825260328152602001806124076032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fac91858580838501838280828437600092019190915250611f9392505050565b9050600254811115610fef5760405162461bcd60e51b81526004018080602001828103825260608152602001806121f66060913960600191505060405180910390fd5b6001556114f1565b61105084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506122fb6020830139611eac565b1561112857602081146110945760405162461bcd60e51b815260040180806020018281038252602e8152602001806122ac602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110d291858580838501838280828437600092019190915250611f9392505050565b905080158015906110e557506001548110155b6111205760405162461bcd60e51b815260040180806020018281038252606c81526020018061236c606c913960800191505060405180910390fd5b6002556114f1565b61119c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611eac9050565b1561126957602081146111e05760405162461bcd60e51b815260040180806020018281038252602e8152602001806122ac602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161121e91858580838501838280828437600092019190915250611f9392505050565b90506004548111156112615760405162461bcd60e51b81526004018080602001828103825260568152602001806122566056913960600191505060405180910390fd5b6003556114f1565b6112dd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611eac9050565b156113b557602081146113215760405162461bcd60e51b815260040180806020018281038252602e8152602001806122ac602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161135f91858580838501838280828437600092019190915250611f9392505050565b9050801580159061137257506003548110155b6113ad5760405162461bcd60e51b81526004018080602001828103825260618152602001806121676061913960800191505060405180910390fd5b6004556114f1565b61142984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611eac9050565b156114b4576020811461146d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c8602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916114ab91858580838501838280828437600092019190915250611f9392505050565b600e55506114f1565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161159a5750806115df565b8160281080156115ab575060508211155b156115b8575060286115df565b6050821180156115c95750606e8211155b156115d9575060788190036115df565b50600481045b919050565b6000602882116115f55750806115df565b5060286115df565b61100281565b600e5481565b61100381565b60095481565b60005460ff161561166d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff16156116bb576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d60205260409020548061173d576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117ed5760405161100290819084156108fc029085906000818181858888f193505050501580156117a7573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050611834565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108fd57fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b6000828201838110156118c1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60006118c46002546118e760015485611f9890919063ffffffff16565b9063ffffffff611ff116565b60006118c183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612033565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561199157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611973575b50505050509050606081516040519080825280602002602001820160405280156119c5578160200160208202803683370190505b50905060005b8251811015611a555760008382815181106119e257fe5b602002602001015190506000611a1c60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546115e4565b905080848481518110611a2b57fe5b6020908102919091010152611a46868263ffffffff61186716565b955050508060010190506119cb565b506000611a736004546118e760035488611f9890919063ffffffff16565b9050611a85858263ffffffff6118f316565b94508460015b8451811015611b5c576000611ac0876118e78a888681518110611aaa57fe5b6020026020010151611f9890919063ffffffff16565b9050611b0d81600d6000898681518110611ad657fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461186790919063ffffffff16565b600d6000888581518110611b1d57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b51838263ffffffff6118f316565b925050600101611a8b565b50611b7281600d600087600081518110611ad657fe5b600d600086600081518110611b8357fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611c0d5760056000868381518110611bd657fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009055806001019050611bbd565b50611c1a6006600061212f565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c8157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c63575b5050505050905060608151604051908082528060200260200182016040528015611cb5578160200160208202803683370190505b50905060005b8251811015611d34576000838281518110611cd257fe5b602002602001015190506000611d0c60076000846001600160a01b03166001600160a01b0316815260200190815260200160002054611589565b905080848481518110611d1b57fe5b6020908102919091010152949094019350600101611cbb565b506000611d526004546118e760035488611f9890919063ffffffff16565b9050611d64858263ffffffff6118f316565b94508460015b8451811015611dee576000611d89876118e78a888681518110611aaa57fe5b9050611d9f81600d6000898681518110611ad657fe5b600d6000888581518110611daf57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611de3838263ffffffff6118f316565b925050600101611d6a565b50611e0481600d600087600081518110611ad657fe5b600d600086600081518110611e1557fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e9f5760076000868381518110611e6857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009055806001019050611e4f565b50611c1a6008600061212f565b6000816040516020018082805190602001908083835b60208310611ee15780518252601f199092019160209182019101611ec2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611f4f5780518252601f199092019160209182019101611f30565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611fa7575060006118c4565b82820282848281611fb457fe5b04146118c15760405162461bcd60e51b81526004018080602001828103825260218152602001806122da6021913960400191505060405180910390fd5b60006118c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120ca565b600081848411156120c25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561208757818101518382015260200161206f565b50505050905090810190601f1680156120b45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836121195760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561208757818101518382015260200161206f565b50600083858161212557fe5b0495945050505050565b50805460008255906000526020600020908101906118349190611c2291905b80821115612162576000815560010161214e565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a164736f6c6343000604000a" + "code": "0x6080604052600436106102975760003560e01c80637e146cc51161015a578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107f5578063e89a302014610828578063f9a2bbc714610852578063fc3e590814610867578063fd6a68791461087c578063fdd31fcd146108915761029e565b8063bd4cc83014610762578063c81b16621461078c578063d0ab528a146107a1578063dc927faf146107b6578063dcae76ab146107cb578063e1c7392a146107e05761029e565b8063a78abc1611610113578063a78abc1614610613578063a7c6a59d14610628578063ab51bb961461063d578063ac43175114610652578063ace9fcc214610723578063af400681146107385761029e565b80637e146cc514610577578063930e1b091461058c57806396713da9146105bf5780639dc09262146105d4578063a1a11bf5146105e9578063a3c3c0ad146105fe5761029e565b806343756e5c116101fe5780636f93d2e6116101b75780636f93d2e6146104af57806370fd5bad1461050e578063718a8aa81461052357806374f2272d1461053857806375d47a0a1461054d5780637942fd05146105625761029e565b806343756e5c1461041a578063493279b11461042f5780634bf6c8821461045b57806351e806721461047057806354133307146104855780636e47b4821461049a5761029e565b806312950c461161025057806312950c46146103685780631b20087c1461037d5780631c643312146103925780633a975612146102a35780633dffc387146103bc57806340bb43c0146103e75761029e565b8063081e9d13146102a357806308f2ec06146102ca578063093f2fc4146102df5780630bee7a67146102f45780630e2374a51461032257806310e06a76146103535761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86108c4565b60408051918252519081900360200190f35b3480156102d657600080fd5b506102b86108c9565b3480156102eb57600080fd5b506102b86108ce565b34801561030057600080fd5b506103096108d3565b6040805163ffffffff9092168252519081900360200190f35b34801561032e57600080fd5b506103376108d8565b604080516001600160a01b039092168252519081900360200190f35b34801561035f57600080fd5b506102b86108de565b34801561037457600080fd5b506102b86108e4565b34801561038957600080fd5b506102b86108ea565b34801561039e57600080fd5b50610337600480360360208110156103b557600080fd5b50356108f0565b3480156103c857600080fd5b506103d16108c4565b6040805160ff9092168252519081900360200190f35b3480156103f357600080fd5b506102b86004803603602081101561040a57600080fd5b50356001600160a01b0316610917565b34801561042657600080fd5b50610337610929565b34801561043b57600080fd5b5061044461092f565b6040805161ffff9092168252519081900360200190f35b34801561046757600080fd5b506103d1610934565b34801561047c57600080fd5b50610337610939565b34801561049157600080fd5b506102b86108d3565b3480156104a657600080fd5b5061033761093f565b3480156104bb57600080fd5b506104fa600480360360808110156104d257600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610945565b604080519115158252519081900360200190f35b34801561051a57600080fd5b506103d1610dd7565b34801561052f57600080fd5b506103d1610ddc565b34801561054457600080fd5b506102b8610de1565b34801561055957600080fd5b50610337610de7565b34801561056e57600080fd5b506103d1610ded565b34801561058357600080fd5b506102b8610df2565b34801561059857600080fd5b506102b8600480360360208110156105af57600080fd5b50356001600160a01b0316610df7565b3480156105cb57600080fd5b506103d1610e09565b3480156105e057600080fd5b50610337610e0e565b3480156105f557600080fd5b50610337610e14565b34801561060a57600080fd5b506102b8610e1a565b34801561061f57600080fd5b506104fa610e20565b34801561063457600080fd5b506102b8610e29565b34801561064957600080fd5b50610309610e2f565b34801561065e57600080fd5b506107216004803603604081101561067557600080fd5b81019060208101813564010000000081111561069057600080fd5b8201836020820111156106a257600080fd5b803590602001918460018302840111640100000000831117156106c457600080fd5b9193909290916020810190356401000000008111156106e257600080fd5b8201836020820111156106f457600080fd5b8035906020019184600183028401116401000000008311171561071657600080fd5b509092509050610e34565b005b34801561072f57600080fd5b506102b8611582565b34801561074457600080fd5b506102b86004803603602081101561075b57600080fd5b5035611588565b34801561076e57600080fd5b506102b86004803603602081101561078557600080fd5b50356115e3565b34801561079857600080fd5b506103376115fc565b3480156107ad57600080fd5b506102b8611602565b3480156107c257600080fd5b50610337611608565b3480156107d757600080fd5b506102b861160e565b3480156107ec57600080fd5b50610721611614565b34801561080157600080fd5b506107216004803603602081101561081857600080fd5b50356001600160a01b03166116dd565b34801561083457600080fd5b506103376004803603602081101561084b57600080fd5b5035611836565b34801561085e57600080fd5b50610337611843565b34801561087357600080fd5b506103d1611849565b34801561088857600080fd5b5061033761184e565b34801561089d57600080fd5b506102b8600480360360208110156108b457600080fd5b50356001600160a01b0316611854565b600181565b602881565b605081565b606481565b61200181565b600b5481565b60015481565b600c5481565b600681815481106108fd57fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606081565b600881565b61200081565b61100581565b6000805460ff1661099d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109dd5760405162461bcd60e51b815260040180806020018281038252602f8152602001806123d7602f913960400191505060405180910390fd5b60008215610a90576110026001600160a01b0316639a99b4f0611005610a0e600e548861186690919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a5d57600080fd5b505af1158015610a71573d6000803e3d6000fd5b505050506040513d6020811015610a8757600080fd5b50519050610b9f565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610ada57600080fd5b505af1158015610aee573d6000803e3d6000fd5b505050506040513d6020811015610b0457600080fd5b5051600e5490915015610b9f57600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b9c9161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b6357600080fd5b505af1158015610b77573d6000803e3d6000fd5b505050506040513d6020811015610b8d57600080fd5b5051829063ffffffff61186616565b90505b600c805460010190556000610bb3826118c9565b600954909150610bc9908263ffffffff61186616565b600955600a54610bf1908290610be5908563ffffffff61186616565b9063ffffffff6118f216565b600a556001600160a01b038716600090815260056020526040902054610c5d57600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610cdb57600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610dca57600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d55611934565b90506000610d61611c24565b6001600160a01b0389166000908152600d6020526040902054909150610d9f908290610d93908563ffffffff61186616565b9063ffffffff61186616565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b601081565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e745760405162461bcd60e51b815260040180806020018281038252602e81526020018061231c602e913960400191505060405180910390fd5b60005460ff16610eb55760405162461bcd60e51b815260040180806020018281038252602181526020018061234a6021913960400191505060405180910390fd5b610f2984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611eab9050565b15610ff65760208114610f6d5760405162461bcd60e51b81526004018080602001828103825260328152602001806124066032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fab91858580838501838280828437600092019190915250611f9292505050565b9050600254811115610fee5760405162461bcd60e51b81526004018080602001828103825260608152602001806121f56060913960600191505060405180910390fd5b6001556114f0565b61104f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506122fa6020830139611eab565b1561112757602081146110935760405162461bcd60e51b815260040180806020018281038252602e8152602001806122ab602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110d191858580838501838280828437600092019190915250611f9292505050565b905080158015906110e457506001548110155b61111f5760405162461bcd60e51b815260040180806020018281038252606c81526020018061236b606c913960800191505060405180910390fd5b6002556114f0565b61119b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611eab9050565b1561126857602081146111df5760405162461bcd60e51b815260040180806020018281038252602e8152602001806122ab602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161121d91858580838501838280828437600092019190915250611f9292505050565b90506004548111156112605760405162461bcd60e51b81526004018080602001828103825260568152602001806122556056913960600191505060405180910390fd5b6003556114f0565b6112dc84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611eab9050565b156113b457602081146113205760405162461bcd60e51b815260040180806020018281038252602e8152602001806122ab602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161135e91858580838501838280828437600092019190915250611f9292505050565b9050801580159061137157506003548110155b6113ac5760405162461bcd60e51b81526004018080602001828103825260618152602001806121666061913960800191505060405180910390fd5b6004556114f0565b61142884848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611eab9050565b156114b3576020811461146c5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121c7602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916114aa91858580838501838280828437600092019190915250611f9292505050565b600e55506114f0565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b6000602882116115995750806115de565b8160281080156115aa575060508211155b156115b7575060286115de565b6050821180156115c85750606e8211155b156115d8575060788190036115de565b50600481045b919050565b6000602882116115f45750806115de565b5060286115de565b61100281565b600e5481565b61100381565b60095481565b60005460ff161561166c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff16156116ba576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d60205260409020548061173c576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117ec5760405161100290819084156108fc029085906000818181858888f193505050501580156117a6573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050611833565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108fd57fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b6000828201838110156118c0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60006118c36002546118e660015485611f9790919063ffffffff16565b9063ffffffff611ff016565b60006118c083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612032565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561199057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611972575b50505050509050606081516040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b8251811015611a545760008382815181106119e157fe5b602002602001015190506000611a1b60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546115e3565b905080848481518110611a2a57fe5b6020908102919091010152611a45868263ffffffff61186616565b955050508060010190506119ca565b506000611a726004546118e660035488611f9790919063ffffffff16565b9050611a84858263ffffffff6118f216565b94508460015b8451811015611b5b576000611abf876118e68a888681518110611aa957fe5b6020026020010151611f9790919063ffffffff16565b9050611b0c81600d6000898681518110611ad557fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461186690919063ffffffff16565b600d6000888581518110611b1c57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b50838263ffffffff6118f216565b925050600101611a8a565b50611b7181600d600087600081518110611ad557fe5b600d600086600081518110611b8257fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611c0c5760056000868381518110611bd557fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009055806001019050611bbc565b50611c196006600061212e565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c8057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c62575b5050505050905060608151604051908082528060200260200182016040528015611cb4578160200160208202803683370190505b50905060005b8251811015611d33576000838281518110611cd157fe5b602002602001015190506000611d0b60076000846001600160a01b03166001600160a01b0316815260200190815260200160002054611588565b905080848481518110611d1a57fe5b6020908102919091010152949094019350600101611cba565b506000611d516004546118e660035488611f9790919063ffffffff16565b9050611d63858263ffffffff6118f216565b94508460015b8451811015611ded576000611d88876118e68a888681518110611aa957fe5b9050611d9e81600d6000898681518110611ad557fe5b600d6000888581518110611dae57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611de2838263ffffffff6118f216565b925050600101611d69565b50611e0381600d600087600081518110611ad557fe5b600d600086600081518110611e1457fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e9e5760076000868381518110611e6757fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009055806001019050611e4e565b50611c196008600061212e565b6000816040516020018082805190602001908083835b60208310611ee05780518252601f199092019160209182019101611ec1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611f4e5780518252601f199092019160209182019101611f2f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611fa6575060006118c3565b82820282848281611fb357fe5b04146118c05760405162461bcd60e51b81526004018080602001828103825260218152602001806122d96021913960400191505060405180910390fd5b60006118c083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120c9565b600081848411156120c15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561208657818101518382015260200161206e565b50505050905090810190601f1680156120b35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836121185760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561208657818101518382015260200161206e565b50600083858161212457fe5b0495945050505050565b50805460008255906000526020600020908101906118339190611c2191905b80821115612161576000815560010161214d565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a264697066735822122034e64053897e657341bfa0edc917cbef052658814f8b7d8bbc1f6a5acff6ca6a64736f6c63430006040033" }, "0x0000000000000000000000000000000000001006": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102275760003560e01c80638f83ab1311610130578063c81b1662116100b8578063f3ae24151161007c578063f3ae2415146104e8578063f9a2bbc71461050e578063fc3e590814610516578063fd30d9b81461051e578063fd6a68791461052657610227565b8063c81b1662146104c0578063dc927faf146104c8578063dd91d1c5146104d0578063e1c7392a146104d8578063e79a198f146104e057610227565b8063a1a11bf5116100ff578063a1a11bf5146103de578063a74b83ca146103e6578063a78abc16146103ee578063ab51bb96146103f6578063ac431751146103fe57610227565b80638f83ab13146103a057806395468d26146103c657806396713da9146103ce5780639dc09262146103d657610227565b8063541d5548116101b3578063718a8aa811610182578063718a8aa81461034857806375d47a0a1461035057806378beee67146103585780637942fd051461037e5780637ae230881461038657610227565b8063541d5548146102d85780636a6a419e146103125780636e47b4821461033857806370fd5bad1461034057610227565b80633dffc387116101fa5780633dffc3871461028357806343756e5c146102a1578063493279b1146102a95780634bf6c882146102c857806351e80672146102d057610227565b806303aff02b1461022c578063049a5716146102365780630bee7a671461025a5780630e2374a51461027b575b600080fd5b61023461052e565b005b61023e610539565b604080516001600160a01b039092168252519081900360200190f35b610262610551565b6040805163ffffffff9092168252519081900360200190f35b61023e610556565b61028b61055c565b6040805160ff9092168252519081900360200190f35b61023e610561565b6102b1610567565b6040805161ffff9092168252519081900360200190f35b61028b61056d565b61023e610572565b6102fe600480360360208110156102ee57600080fd5b50356001600160a01b0316610578565b604080519115158252519081900360200190f35b6102fe6004803603602081101561032857600080fd5b50356001600160a01b0316610596565b61023e6105b4565b61028b6105ba565b61028b6105bf565b61023e6105c4565b6102346004803603602081101561036e57600080fd5b50356001600160a01b03166105ca565b61028b6107b2565b61038e6107b7565b60408051918252519081900360200190f35b610234600480360360208110156103b657600080fd5b50356001600160a01b03166107c4565b61038e610a03565b61028b610a0f565b61023e610a14565b61023e610a1a565b61023e610a20565b6102fe610a38565b610262610a41565b6102346004803603604081101561041457600080fd5b81019060208101813564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b91939092909160208101903564010000000081111561048157600080fd5b82018360208201111561049357600080fd5b803590602001918460018302840111640100000000831117156104b557600080fd5b509092509050610a46565b61023e610d97565b61023e610d9d565b610234610da3565b610234610e44565b610234610ec6565b6102fe600480360360208110156104fe57600080fd5b50356001600160a01b031661107f565b61023e61109d565b61028b6110a3565b6102fe6110a8565b61023e6110b1565b610537336110b7565b565b73b005741528b86f5952469d80a8614591e3c5b63281565b606481565b61200181565b600181565b61100181565b6102ca81565b600881565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b3360009081526008602052604090205460ff166106185760405162461bcd60e51b81526004018080602001828103825260248152602001806115c36024913960400191505060405180910390fd5b61062133611219565b1561065d5760405162461bcd60e51b81526004018080602001828103825260218152602001806115806021913960400191505060405180910390fd5b3233146106b1576040805162461bcd60e51b815260206004820152601e60248201527f70726f766973696f6e616c2072656c6179657220697320612070726f78790000604482015290519081900360640190fd5b6001600160a01b038181166000908152600960205260409020541633146107095760405162461bcd60e51b815260040180806020018281038252602781526020018061163c6027913960400191505060405180910390fd5b6001600160a01b03818116600081815260066020908152604080832080543380865260078086528487208054600160ff199182161790915584546001600160a01b031990811684179095556008875285882080548216905597875260098652848720805490941690935596168085529083529281902080549094169093558251828152908101939093528151909260008051602061166383398151915292908290030190a15050565b600b81565b68056bc75e2d6310000081565b3360009081526005602052604090205460ff16610821576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b61082a81611219565b156108665760405162461bcd60e51b81526004018080602001828103825260278152602001806115e76027913960400191505060405180910390fd5b6001600160a01b03811615610922576001600160a01b03811660009081526007602052604090205460ff16156108dc576040805162461bcd60e51b815260206004820152601660248201527572656c6179657220616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b0381166000818152600860209081526040808320805460ff191660011790553383526009909152902080546001600160a01b03191690911790556109c3565b3360008181526006602090815260408083208054600980855283862080546001600160a01b03198085169095556001600160a01b0393841680895260078852868920805460ff19908116909155918516808a5260088952878a20805490931690925598909752908552805490921690915581518581529086169281019290925280516000805160206116638339815191529281900390910190a15050610a00565b604080516001600160a01b038316815290517ffba56633276570c7d3120d4535bf3bce26523da53958e40734210b9fd99b36939181900360200190a15b50565b67016345785d8a000081565b600981565b61100781565b61100681565b73446aa6e0dc65690403df3f127750da1322941f3e81565b60005460ff1681565b600081565b60005460ff16610a99576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361100714610ad95760405162461bcd60e51b815260040180806020018281038252602e81526020018061160e602e913960400191505060405180910390fd5b610b3a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526930b23226b0b730b3b2b960b11b6020820152915061121f9050565b15610bd25760148114610b7e5760405162461bcd60e51b81526004018080602001828103825260228152602001806115a16022913960400191505060405180910390fd5b6000610bc1601484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061130692505050565b9050610bcc8161130b565b50610d05565b610c3684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c3932b6b7bb32a6b0b730b3b2b960991b6020820152915061121f9050565b15610cc85760148114610c7a5760405162461bcd60e51b81526004018080602001828103825260228152602001806115a16022913960400191505060405180910390fd5b6000610cbd601484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061130692505050565b9050610bcc816110b7565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b600a5460ff1615610dfb576040805162461bcd60e51b815260206004820152601e60248201527f7468652077686974656c6973747320616c726561647920757064617465640000604482015290519081900360640190fd5b610e1873b005741528b86f5952469d80a8614591e3c5b6326113cd565b610e3573446aa6e0dc65690403df3f127750da1322941f3e6113cd565b600a805460ff19166001179055565b60005460ff1615610e9c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610f21576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610f74576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610f7c611565565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610fc0919063ffffffff61148516565b6040518115909202916000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f1935050505015801561101e573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600381565b600a5460ff1681565b61100481565b6001600160a01b03811660009081526005602052604090205460ff1661111c576040805162461bcd60e51b81526020600482015260156024820152741b585b9859d95c88191bd95cdb89dd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b038082166000818152600660209081526040808320805460058452828520805460ff1990811690915582546001600160a01b0319908116909355600980865284872080548a16885260088752858820805490931690925595879052948452845490911690935580519384525191909316927f2002866d443ac6c241fecaaa2af4895828c7de2cc423b9d01f7969650f557c76928290030190a16001600160a01b03811615611215576001600160a01b0381166000818152600760209081526040808320805460ff1916905580519384529083019190915280516000805160206116638339815191529281900390910190a15b5050565b3b151590565b6000816040516020018082805190602001908083835b602083106112545780518252601f199092019160209182019101611235565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106112c25780518252601f1990920191602091820191016112a3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b03811660009081526005602052604090205460ff1615611372576040805162461bcd60e51b81526020600482015260166024820152756d616e6167657220616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020908152604091829020805460ff19166001179055815192835290517fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575179281900390910190a150565b6001600160a01b03811660008181526005602090815260408083208054600160ff1991821681179092556006845282852080546001600160a01b031916871790556007845293829020805490941617909255815192835290517fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575179281900390910190a160408051600081526001600160a01b03831660208201528151600080516020611663833981519152929181900390910190a150565b60006114c783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114ce565b9392505050565b6000818484111561155d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561152257818101518382015260200161150a565b50505050905090810190601f16801561154f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe70726f766973696f6e616c2072656c61796572206973206120636f6e74726163746c656e677468206f66206d616e616765722061646472657373206d69736d6174636872656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637470726f766973696f6e616c206973206e6f742073657420666f722074686973206d616e61676572a5a19d7e9dab30a215022382d7abe782b579986fcbedec9942ecd0db9510a148a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106102275760003560e01c80638f83ab1311610130578063c81b1662116100b8578063f3ae24151161007c578063f3ae2415146104e8578063f9a2bbc71461050e578063fc3e590814610516578063fd30d9b81461051e578063fd6a68791461052657610227565b8063c81b1662146104c0578063dc927faf146104c8578063dd91d1c5146104d0578063e1c7392a146104d8578063e79a198f146104e057610227565b8063a1a11bf5116100ff578063a1a11bf5146103de578063a74b83ca146103e6578063a78abc16146103ee578063ab51bb96146103f6578063ac431751146103fe57610227565b80638f83ab13146103a057806395468d26146103c657806396713da9146103ce5780639dc09262146103d657610227565b8063541d5548116101b3578063718a8aa811610182578063718a8aa81461034857806375d47a0a1461035057806378beee67146103585780637942fd051461037e5780637ae230881461038657610227565b8063541d5548146102d85780636a6a419e146103125780636e47b4821461033857806370fd5bad1461034057610227565b80633dffc387116101fa5780633dffc3871461028357806343756e5c146102a1578063493279b1146102a95780634bf6c882146102c857806351e80672146102d057610227565b806303aff02b1461022c578063049a5716146102365780630bee7a671461025a5780630e2374a51461027b575b600080fd5b61023461052e565b005b61023e610539565b604080516001600160a01b039092168252519081900360200190f35b610262610551565b6040805163ffffffff9092168252519081900360200190f35b61023e610556565b61028b61055c565b6040805160ff9092168252519081900360200190f35b61023e610561565b6102b1610567565b6040805161ffff9092168252519081900360200190f35b61028b61056c565b61023e610571565b6102fe600480360360208110156102ee57600080fd5b50356001600160a01b0316610577565b604080519115158252519081900360200190f35b6102fe6004803603602081101561032857600080fd5b50356001600160a01b0316610595565b61023e6105b3565b61028b6105b9565b61028b6105be565b61023e6105c3565b6102346004803603602081101561036e57600080fd5b50356001600160a01b03166105c9565b61028b6107b1565b61038e6107b6565b60408051918252519081900360200190f35b610234600480360360208110156103b657600080fd5b50356001600160a01b03166107c3565b61038e610a02565b61028b610a0e565b61023e610a13565b61023e610a19565b61023e610a1f565b6102fe610a37565b610262610a40565b6102346004803603604081101561041457600080fd5b81019060208101813564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b91939092909160208101903564010000000081111561048157600080fd5b82018360208201111561049357600080fd5b803590602001918460018302840111640100000000831117156104b557600080fd5b509092509050610a45565b61023e610d96565b61023e610d9c565b610234610da2565b610234610e43565b610234610ec5565b6102fe600480360360208110156104fe57600080fd5b50356001600160a01b031661107e565b61023e61109c565b61028b6110a2565b6102fe6110a7565b61023e6110b0565b610537336110b6565b565b73b005741528b86f5952469d80a8614591e3c5b63281565b606481565b61200181565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526007602052604090205460ff1690565b6001600160a01b031660009081526008602052604090205460ff1690565b61100581565b600281565b601081565b61100881565b3360009081526008602052604090205460ff166106175760405162461bcd60e51b81526004018080602001828103825260248152602001806115c26024913960400191505060405180910390fd5b61062033611218565b1561065c5760405162461bcd60e51b815260040180806020018281038252602181526020018061157f6021913960400191505060405180910390fd5b3233146106b0576040805162461bcd60e51b815260206004820152601e60248201527f70726f766973696f6e616c2072656c6179657220697320612070726f78790000604482015290519081900360640190fd5b6001600160a01b038181166000908152600960205260409020541633146107085760405162461bcd60e51b815260040180806020018281038252602781526020018061163b6027913960400191505060405180910390fd5b6001600160a01b03818116600081815260066020908152604080832080543380865260078086528487208054600160ff199182161790915584546001600160a01b031990811684179095556008875285882080548216905597875260098652848720805490941690935596168085529083529281902080549094169093558251828152908101939093528151909260008051602061166283398151915292908290030190a15050565b600b81565b68056bc75e2d6310000081565b3360009081526005602052604090205460ff16610820576040805162461bcd60e51b81526020600482015260166024820152751b585b9859d95c88191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b61082981611218565b156108655760405162461bcd60e51b81526004018080602001828103825260278152602001806115e66027913960400191505060405180910390fd5b6001600160a01b03811615610921576001600160a01b03811660009081526007602052604090205460ff16156108db576040805162461bcd60e51b815260206004820152601660248201527572656c6179657220616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b0381166000818152600860209081526040808320805460ff191660011790553383526009909152902080546001600160a01b03191690911790556109c2565b3360008181526006602090815260408083208054600980855283862080546001600160a01b03198085169095556001600160a01b0393841680895260078852868920805460ff19908116909155918516808a5260088952878a20805490931690925598909752908552805490921690915581518581529086169281019290925280516000805160206116628339815191529281900390910190a150506109ff565b604080516001600160a01b038316815290517ffba56633276570c7d3120d4535bf3bce26523da53958e40734210b9fd99b36939181900360200190a15b50565b67016345785d8a000081565b600981565b61100781565b61100681565b73446aa6e0dc65690403df3f127750da1322941f3e81565b60005460ff1681565b600081565b60005460ff16610a98576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361100714610ad85760405162461bcd60e51b815260040180806020018281038252602e81526020018061160d602e913960400191505060405180910390fd5b610b3984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526930b23226b0b730b3b2b960b11b6020820152915061121e9050565b15610bd15760148114610b7d5760405162461bcd60e51b81526004018080602001828103825260228152602001806115a06022913960400191505060405180910390fd5b6000610bc0601484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061130592505050565b9050610bcb8161130a565b50610d04565b610c3584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c3932b6b7bb32a6b0b730b3b2b960991b6020820152915061121e9050565b15610cc75760148114610c795760405162461bcd60e51b81526004018080602001828103825260228152602001806115a06022913960400191505060405180910390fd5b6000610cbc601484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061130592505050565b9050610bcb816110b6565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b600a5460ff1615610dfa576040805162461bcd60e51b815260206004820152601e60248201527f7468652077686974656c6973747320616c726561647920757064617465640000604482015290519081900360640190fd5b610e1773b005741528b86f5952469d80a8614591e3c5b6326113cc565b610e3473446aa6e0dc65690403df3f127750da1322941f3e6113cc565b600a805460ff19166001179055565b60005460ff1615610e9b576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610f20576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610f73576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610f7b611564565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610fbf919063ffffffff61148416565b6040518115909202916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f1935050505015801561101d573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b61100081565b600381565b600a5460ff1681565b61100481565b6001600160a01b03811660009081526005602052604090205460ff1661111b576040805162461bcd60e51b81526020600482015260156024820152741b585b9859d95c88191bd95cdb89dd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b038082166000818152600660209081526040808320805460058452828520805460ff1990811690915582546001600160a01b0319908116909355600980865284872080548a16885260088752858820805490931690925595879052948452845490911690935580519384525191909316927f2002866d443ac6c241fecaaa2af4895828c7de2cc423b9d01f7969650f557c76928290030190a16001600160a01b03811615611214576001600160a01b0381166000818152600760209081526040808320805460ff1916905580519384529083019190915280516000805160206116628339815191529281900390910190a15b5050565b3b151590565b6000816040516020018082805190602001908083835b602083106112535780518252601f199092019160209182019101611234565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106112c15780518252601f1990920191602091820191016112a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6001600160a01b03811660009081526005602052604090205460ff1615611371576040805162461bcd60e51b81526020600482015260166024820152756d616e6167657220616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020908152604091829020805460ff19166001179055815192835290517fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575179281900390910190a150565b6001600160a01b03811660008181526005602090815260408083208054600160ff1991821681179092556006845282852080546001600160a01b031916871790556007845293829020805490941617909255815192835290517fe0de8e71a22c046647f4ef744348fa126ad6d052d4ce070999481f69d45575179281900390910190a160408051600081526001600160a01b03831660208201528151600080516020611662833981519152929181900390910190a150565b60006114c683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114cd565b9392505050565b6000818484111561155c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611521578181015183820152602001611509565b50505050905090810190601f16801561154e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe70726f766973696f6e616c2072656c61796572206973206120636f6e74726163746c656e677468206f66206d616e616765722061646472657373206d69736d6174636872656c61796572206973206e6f7420612070726f766973696f6e616c2072656c61796572636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e747261637470726f766973696f6e616c206973206e6f742073657420666f722074686973206d616e61676572a5a19d7e9dab30a215022382d7abe782b579986fcbedec9942ecd0db9510a148a2646970667358221220a420083a467e36f47ef08cc3303891cba6ae7ea09e3af0dce81d9277374f643164736f6c63430006040033" }, "0x0000000000000000000000000000000000001007": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637942fd05116100f9578063ab51bb9611610097578063dc927faf11610071578063dc927faf146104cc578063f9a2bbc7146104d4578063fc3e5908146104dc578063fd6a6879146104e4576101c4565b8063ab51bb9614610442578063c81b16621461044a578063c8509d8114610452576101c4565b80639ab1a373116100d35780639ab1a3731461040e5780639dc0926214610416578063a1a11bf51461041e578063a78abc1614610426576101c4565b80637942fd0514610382578063831d65d11461038a57806396713da914610406576101c4565b8063493279b1116101665780636e47b482116101405780636e47b4821461036257806370fd5bad1461036a578063718a8aa81461037257806375d47a0a1461037a576101c4565b8063493279b1146103335780634bf6c8821461035257806351e806721461035a576101c4565b80633a21baae116101a25780633a21baae146102fd5780633dffc3871461030557806343756e5c146103235780634900c4ea1461032b576101c4565b80630bee7a67146101c95780630e2374a5146101ea5780631182b8751461020e575b600080fd5b6101d16104ec565b6040805163ffffffff9092168252519081900360200190f35b6101f26104f1565b604080516001600160a01b039092168252519081900360200190f35b6102886004803603604081101561022457600080fd5b60ff823516919081019060408101602082013564010000000081111561024957600080fd5b82018360208201111561025b57600080fd5b8035906020019184600183028401116401000000008311171561027d57600080fd5b5090925090506104f7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c25781810151838201526020016102aa565b50505050905090810190601f1680156102ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101d16105e6565b61030d6105eb565b6040805160ff9092168252519081900360200190f35b6101f26105f0565b61030d6105f6565b61033b6105fb565b6040805161ffff9092168252519081900360200190f35b61030d610601565b6101f2610606565b6101f261060c565b61030d610612565b61030d610617565b6101f261061c565b61030d610622565b610404600480360360408110156103a057600080fd5b60ff82351691908101906040810160208201356401000000008111156103c557600080fd5b8201836020820111156103d757600080fd5b803590602001918460018302840111640100000000831117156103f957600080fd5b509092509050610627565b005b61030d6106b9565b6101d16106be565b6101f26106c3565b6101f26106c9565b61042e6106cf565b604080519115158252519081900360200190f35b6101d16105f6565b6101f26106d8565b6104046004803603604081101561046857600080fd5b60ff823516919081019060408101602082013564010000000081111561048d57600080fd5b82018360208201111561049f57600080fd5b803590602001918460018302840111640100000000831117156104c157600080fd5b5090925090506106de565b6101f2610755565b6101f261075b565b61030d610761565b6101f2610766565b606481565b61200181565b606033612000146105395760405162461bcd60e51b815260040180806020018281038252602f815260200180611439602f913960400191505060405180910390fd5b6105416113d4565b600061058285858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061076c92505050565b915091508061059e576105956064610832565b925050506105df565b60006105a98361089c565b905063ffffffff81166105d057505060408051600081526020810190915291506105df9050565b6105d981610832565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b6102ca81565b600881565b61200081565b61100581565b600281565b601081565b61100881565b600b81565b33612000146106675760405162461bcd60e51b815260040180806020018281038252602f815260200180611439602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b336120001461071e5760405162461bcd60e51b815260040180806020018281038252602f815260200180611439602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114686023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b6107746113d4565b600061077e6113d4565b6107866113fe565b61079761079286610c3d565b610c62565b90506000805b6107a683610cac565b1561082557806107c8576107c16107bc84610ccd565b610d1b565b845261081d565b80600114156107e7576107dd6107bc84610ccd565b602085015261081d565b8060021415610818576108016107fc84610ccd565b610d94565b6001600160a01b031660408501526001915061081d565b610825565b60010161079d565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b606081526020019060019003908161084c5790505090506108728363ffffffff16610db4565b8160008151811061087f57fe5b602002602001018190525061089381610dc7565b9150505b919050565b60006108ab8260400151610e51565b61091757604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610897565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561098457818101518382015260200161096c565b50505050905090810190601f1680156109b15780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156109e45781810151838201526020016109cc565b50505050905090810190601f168015610a115780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610a3257600080fd5b505af1925050508015610a43575060015b610c35576040516000815260443d1015610a5f57506000610afc565b60046000803e60005160e01c6308c379a08114610a80576000915050610afc565b60043d036004833e81513d602482011167ffffffffffffffff82111715610aac57600092505050610afc565b808301805167ffffffffffffffff811115610ace576000945050505050610afc565b8060208301013d8601811115610aec57600095505050505050610afc565b601f01601f191660405250925050505b80610b075750610baa565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b66578181015183820152602001610b4e565b50505050905090810190601f168015610b935780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610897565b3d808015610bd4576040519150601f19603f3d011682016040523d82523d6000602084013e610bd9565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b66578181015183820152602001610b4e565b506000919050565b610c4561141e565b506040805180820190915281518152602082810190820152919050565b610c6a6113fe565b610c7382610e57565b610c7c57600080fd5b6000610c8b8360200151610e91565b60208085015160408051808201909152868152920190820152915050919050565b6000610cb661141e565b505080518051602091820151919092015191011190565b610cd561141e565b610cde82610cac565b610ce757600080fd5b60208201516000610cf782610ef4565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610d2957600080fd5b6000610d388360200151610e91565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d6f576020820181803683370190505b5090506000816020019050610d8b848760200151018285611027565b50949350505050565b8051600090601514610da557600080fd5b610dae82611072565b92915050565b6060610dae610dc283611127565b61120d565b6060815160001415610de85750604080516000815260208101909152610897565b606082600081518110610df757fe5b602002602001015190506000600190505b8351811015610e3857610e2e82858381518110610e2157fe5b602002602001015161125f565b9150600101610e08565b50610893610e4b825160c060ff166112dc565b8261125f565b3b151590565b8051600090610e6857506000610897565b6020820151805160001a9060c0821015610e8757600092505050610897565b5060019392505050565b8051600090811a6080811015610eab576000915050610897565b60b8811080610ec6575060c08110801590610ec6575060f881105b15610ed5576001915050610897565b60c0811015610ee95760b519019050610897565b60f519019050610897565b80516000908190811a6080811015610f0f5760019150611020565b60b8811015610f2457607e1981019150611020565b60c0811015610f9e57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f98576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611020565b60f8811015610fb35760be1981019150611020565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561101e576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80611031576106b4565b5b60208110611051578251825260209283019290910190601f1901611032565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061108757508151602110155b61109057600080fd5b600061109f8360200151610e91565b905080836000015110156110fa576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d8b57506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661116b5750601861118f565b6fffffffffffffffffffffffffffffffff19841661118b5750601061118f565b5060005b60208110156111c5578181815181106111a457fe5b01602001516001600160f81b031916156111bd576111c5565b60010161118f565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111fa576020820181803683370190505b5080830196909652508452509192915050565b60608151600114801561123f5750607f60f81b8260008151811061122d57fe5b01602001516001600160f81b03191611155b1561124b575080610897565b610dae61125d8351608060ff166112dc565b835b6060806040519050835180825260208201818101602087015b81831015611290578051835260209283019201611278565b50855184518101855292509050808201602086015b818310156112bd5780518352602092830192016112a5565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061132c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113865782840160f81b8160008151811061136857fe5b60200101906001600160f81b031916908160001a9053509050610dae565b606061139185611127565b90508381510160370160f81b826000815181106113aa57fe5b60200101906001600160f81b031916908160001a9053506113cb828261125f565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b604051806040016040528061141161141e565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80637942fd05116100f9578063ab51bb9611610097578063dc927faf11610071578063dc927faf146104cc578063f9a2bbc7146104d4578063fc3e5908146104dc578063fd6a6879146104e4576101c4565b8063ab51bb9614610442578063c81b16621461044a578063c8509d8114610452576101c4565b80639ab1a373116100d35780639ab1a3731461040e5780639dc0926214610416578063a1a11bf51461041e578063a78abc1614610426576101c4565b80637942fd0514610382578063831d65d11461038a57806396713da914610406576101c4565b8063493279b1116101665780636e47b482116101405780636e47b4821461036257806370fd5bad1461036a578063718a8aa81461037257806375d47a0a1461037a576101c4565b8063493279b1146103335780634bf6c8821461035257806351e806721461035a576101c4565b80633a21baae116101a25780633a21baae146102fd5780633dffc3871461030557806343756e5c146103235780634900c4ea1461032b576101c4565b80630bee7a67146101c95780630e2374a5146101ea5780631182b8751461020e575b600080fd5b6101d16104ec565b6040805163ffffffff9092168252519081900360200190f35b6101f26104f1565b604080516001600160a01b039092168252519081900360200190f35b6102886004803603604081101561022457600080fd5b60ff823516919081019060408101602082013564010000000081111561024957600080fd5b82018360208201111561025b57600080fd5b8035906020019184600183028401116401000000008311171561027d57600080fd5b5090925090506104f7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c25781810151838201526020016102aa565b50505050905090810190601f1680156102ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101d16105e6565b61030d6105eb565b6040805160ff9092168252519081900360200190f35b6101f26105f0565b61030d6105f6565b61033b6105fb565b6040805161ffff9092168252519081900360200190f35b61030d610600565b6101f2610605565b6101f261060b565b61030d610611565b61030d610616565b6101f261061b565b61030d610621565b610404600480360360408110156103a057600080fd5b60ff82351691908101906040810160208201356401000000008111156103c557600080fd5b8201836020820111156103d757600080fd5b803590602001918460018302840111640100000000831117156103f957600080fd5b509092509050610626565b005b61030d6106b8565b6101d16106bd565b6101f26106c2565b6101f26106c8565b61042e6106ce565b604080519115158252519081900360200190f35b6101d16105f6565b6101f26106d7565b6104046004803603604081101561046857600080fd5b60ff823516919081019060408101602082013564010000000081111561048d57600080fd5b82018360208201111561049f57600080fd5b803590602001918460018302840111640100000000831117156104c157600080fd5b5090925090506106dd565b6101f2610754565b6101f261075a565b61030d610760565b6101f2610765565b606481565b61200181565b606033612000146105395760405162461bcd60e51b815260040180806020018281038252602f815260200180611438602f913960400191505060405180910390fd5b6105416113d3565b600061058285858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061076b92505050565b915091508061059e576105956064610831565b925050506105df565b60006105a98361089b565b905063ffffffff81166105d057505060408051600081526020810190915291506105df9050565b6105d981610831565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b606081565b600881565b61200081565b61100581565b600281565b601081565b61100881565b600b81565b33612000146106665760405162461bcd60e51b815260040180806020018281038252602f815260200180611438602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b336120001461071d5760405162461bcd60e51b815260040180806020018281038252602f815260200180611438602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114676023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b6107736113d3565b600061077d6113d3565b6107856113fd565b61079661079186610c3c565b610c61565b90506000805b6107a583610cab565b1561082457806107c7576107c06107bb84610ccc565b610d1a565b845261081c565b80600114156107e6576107dc6107bb84610ccc565b602085015261081c565b8060021415610817576108006107fb84610ccc565b610d93565b6001600160a01b031660408501526001915061081c565b610824565b60010161079c565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b606081526020019060019003908161084b5790505090506108718363ffffffff16610db3565b8160008151811061087e57fe5b602002602001018190525061089281610dc6565b9150505b919050565b60006108aa8260400151610e50565b61091657604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610896565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561098357818101518382015260200161096b565b50505050905090810190601f1680156109b05780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156109e35781810151838201526020016109cb565b50505050905090810190601f168015610a105780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015610a3157600080fd5b505af1925050508015610a42575060015b610c34576040516000815260443d1015610a5e57506000610afb565b60046000803e60005160e01c6308c379a08114610a7f576000915050610afb565b60043d036004833e81513d602482011167ffffffffffffffff82111715610aab57600092505050610afb565b808301805167ffffffffffffffff811115610acd576000945050505050610afb565b8060208301013d8601811115610aeb57600095505050505050610afb565b601f01601f191660405250925050505b80610b065750610ba9565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b65578181015183820152602001610b4d565b50505050905090810190601f168015610b925780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610896565b3d808015610bd3576040519150601f19603f3d011682016040523d82523d6000602084013e610bd8565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b65578181015183820152602001610b4d565b506000919050565b610c4461141d565b506040805180820190915281518152602082810190820152919050565b610c696113fd565b610c7282610e56565b610c7b57600080fd5b6000610c8a8360200151610e90565b60208085015160408051808201909152868152920190820152915050919050565b6000610cb561141d565b505080518051602091820151919092015191011190565b610cd461141d565b610cdd82610cab565b610ce657600080fd5b60208201516000610cf682610ef3565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610d2857600080fd5b6000610d378360200151610e90565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d6e576020820181803683370190505b5090506000816020019050610d8a848760200151018285611026565b50949350505050565b8051600090601514610da457600080fd5b610dad82611071565b92915050565b6060610dad610dc183611126565b61120c565b6060815160001415610de75750604080516000815260208101909152610896565b606082600081518110610df657fe5b602002602001015190506000600190505b8351811015610e3757610e2d82858381518110610e2057fe5b602002602001015161125e565b9150600101610e07565b50610892610e4a825160c060ff166112db565b8261125e565b3b151590565b8051600090610e6757506000610896565b6020820151805160001a9060c0821015610e8657600092505050610896565b5060019392505050565b8051600090811a6080811015610eaa576000915050610896565b60b8811080610ec5575060c08110801590610ec5575060f881105b15610ed4576001915050610896565b60c0811015610ee85760b519019050610896565b60f519019050610896565b80516000908190811a6080811015610f0e576001915061101f565b60b8811015610f2357607e198101915061101f565b60c0811015610f9d57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f97576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b5061101f565b60f8811015610fb25760be198101915061101f565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561101d576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80611030576106b3565b5b60208110611050578251825260209283019290910190601f1901611031565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061108657508151602110155b61108f57600080fd5b600061109e8360200151610e90565b905080836000015110156110f9576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d8a57506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff19841661116a5750601861118e565b6fffffffffffffffffffffffffffffffff19841661118a5750601061118e565b5060005b60208110156111c4578181815181106111a357fe5b01602001516001600160f81b031916156111bc576111c4565b60010161118e565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111f9576020820181803683370190505b5080830196909652508452509192915050565b60608151600114801561123e5750607f60f81b8260008151811061122c57fe5b01602001516001600160f81b03191611155b1561124a575080610896565b610dad61125c8351608060ff166112db565b835b6060806040519050835180825260208201818101602087015b8183101561128f578051835260209283019201611277565b50855184518101855292509050808201602086015b818310156112bc5780518352602092830192016112a4565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061132b576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113855782840160f81b8160008151811061136757fe5b60200101906001600160f81b031916908160001a9053509050610dad565b606061139085611126565b90508381510160370160f81b826000815181106113a957fe5b60200101906001600160f81b031916908160001a9053506113ca828261125e565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b604051806040016040528061141061141d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a2646970667358221220894cc213a7cdbdc71ce4c57d348416dad5ef566948fa816df1afa7f57257b66964736f6c63430006040033" }, "0x0000000000000000000000000000000000001008": { "balance": "0x0", - "code": "0x6080604052600436106103975760003560e01c80637942fd05116101dc578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d78578063fc3e5908146105f9578063fd6a687914610d8d578063fe3a2af514610da257610397565b8063d9e6dae914610727578063dc927faf14610d39578063e605bca014610d4e578063f9a2bbc714610d6357610397565b8063c8509d81116100dc578063c8509d8114610c1f578063c8e704a4146105f9578063d117a11014610ca4578063d7109ce614610d2457610397565b8063b795031714610766578063bd32d3f914610520578063c81b166214610c0a57610397565b806396713da91161017a578063a78abc1611610149578063a78abc1614610b15578063ab51bb9614610b2a578063ab67a48514610766578063ac43175114610b3f57610397565b806396713da914610ac15780639a854bbd14610ad65780639dc0926214610aeb578063a1a11bf514610b0057610397565b8063831d65d1116101b6578063831d65d1146109f0578063859180fb1461071257806394553a4e14610a7757806395b9ad2614610aac57610397565b80637942fd05146109c65780637d078e13146105355780637ec816dd146109db57610397565b8063493279b1116102c157806366dea52a1161025f578063718a8aa81161022e578063718a8aa81461084457806372c4e0861461085957806375d47a0a146108fd57806377d9dae81461091257610397565b806366dea52a146107665780636b3f13071461077b5780636e47b4821461082f57806370fd5bad1461076657610397565b806351e806721161029b57806351e806721461073c5780635d499b1b146107515780635f558f8614610766578063613684751461072757610397565b8063493279b1146106e65780634bc81c00146107125780634bf6c8821461072757610397565b80632d89ac3211610339578063401809f911610308578063401809f9146105f957806343756e5c1461060e578063445fcefe14610623578063487c88ac1461053557610397565b80632d89ac32146105355780632e02d7761461059357806337e6ecda146105c65780633dffc3871461053557610397565b80631182b875116103755780631182b875146104265780631f91600b1461052057806323996b531461053557806325c751b71461054a57610397565b80630bee7a671461039c5780630e2374a5146103ca5780630f212b1b146103fb575b600080fd5b3480156103a857600080fd5b506103b1610db7565b6040805163ffffffff9092168252519081900360200190f35b3480156103d657600080fd5b506103df610dbc565b604080516001600160a01b039092168252519081900360200190f35b34801561040757600080fd5b50610410610dc2565b6040805160ff9092168252519081900360200190f35b34801561043257600080fd5b506104ab6004803603604081101561044957600080fd5b60ff8235169190810190604081016020820135600160201b81111561046d57600080fd5b82018360208201111561047f57600080fd5b803590602001918460018302840111600160201b831117156104a057600080fd5b509092509050610dc7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104e55781810151838201526020016104cd565b50505050905090810190601f1680156105125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561052c57600080fd5b50610410610ee1565b34801561054157600080fd5b50610410610ee6565b61057f6004803603604081101561056057600080fd5b5080356001600160a01b031690602001356001600160401b0316610eeb565b604080519115158252519081900360200190f35b34801561059f57600080fd5b5061057f600480360360208110156105b657600080fd5b50356001600160a01b0316611437565b3480156105d257600080fd5b5061057f600480360360208110156105e957600080fd5b50356001600160a01b031661144c565b34801561060557600080fd5b50610410611461565b34801561061a57600080fd5b506103df611466565b34801561062f57600080fd5b506106d46004803603602081101561064657600080fd5b810190602081018135600160201b81111561066057600080fd5b82018360208201111561067257600080fd5b803590602001918460018302840111600160201b8311171561069357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061146c945050505050565b60408051918252519081900360200190f35b3480156106f257600080fd5b506106fb6115ca565b6040805161ffff9092168252519081900360200190f35b34801561071e57600080fd5b506104106115d0565b34801561073357600080fd5b506104106115d5565b34801561074857600080fd5b506103df6115da565b34801561075d57600080fd5b506106d46115e0565b34801561077257600080fd5b506104106115e9565b61057f6004803603604081101561079157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156107bb57600080fd5b8201836020820111156107cd57600080fd5b803590602001918460018302840111600160201b831117156107ee57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115ee945050505050565b34801561083b57600080fd5b506103df611ec4565b34801561085057600080fd5b50610410611eca565b61057f6004803603602081101561086f57600080fd5b810190602081018135600160201b81111561088957600080fd5b82018360208201111561089b57600080fd5b803590602001918460018302840111600160201b831117156108bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ecf945050505050565b34801561090957600080fd5b506103df61231b565b61057f6004803603604081101561092857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460018302840111600160201b8311171561098557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612321945050505050565b3480156109d257600080fd5b50610410612827565b3480156109e757600080fd5b506106d461282c565b3480156109fc57600080fd5b50610a7560048036036040811015610a1357600080fd5b60ff8235169190810190604081016020820135600160201b811115610a3757600080fd5b820183602082011115610a4957600080fd5b803590602001918460018302840111600160201b83111715610a6a57600080fd5b509092509050612832565b005b61057f60048036036040811015610a8d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612981565b348015610ab857600080fd5b50610410613378565b348015610acd57600080fd5b5061041061337d565b348015610ae257600080fd5b506106d4613382565b348015610af757600080fd5b506103df61338e565b348015610b0c57600080fd5b506103df613394565b348015610b2157600080fd5b5061057f61339a565b348015610b3657600080fd5b506103b16133a3565b348015610b4b57600080fd5b50610a7560048036036040811015610b6257600080fd5b810190602081018135600160201b811115610b7c57600080fd5b820183602082011115610b8e57600080fd5b803590602001918460018302840111600160201b83111715610baf57600080fd5b919390929091602081019035600160201b811115610bcc57600080fd5b820183602082011115610bde57600080fd5b803590602001918460018302840111600160201b83111715610bff57600080fd5b5090925090506133a8565b348015610c1657600080fd5b506103df61367d565b348015610c2b57600080fd5b50610a7560048036036040811015610c4257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c6657600080fd5b820183602082011115610c7857600080fd5b803590602001918460018302840111600160201b83111715610c9957600080fd5b509092509050613683565b348015610cb057600080fd5b50610cce60048036036020811015610cc757600080fd5b5035613759565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610d3057600080fd5b506106d46137b0565b348015610d4557600080fd5b506103df6137b5565b348015610d5a57600080fd5b506106d46137bb565b348015610d6f57600080fd5b506103df6137c1565b348015610d8457600080fd5b506106d46137c7565b348015610d9957600080fd5b506103df6137cd565b348015610dae57600080fd5b506104106133a3565b606481565b61200181565b600681565b60603361200014610e095760405162461bcd60e51b815260040180806020018281038252602f815260200180615bd5602f913960400191505060405180910390fd5b60ff841660011415610e5b57610e5483838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506137d392505050565b9050610eda565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d6020811015610f6257600080fd5b5051905080610fa4576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16611007576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561104457600080fd5b505afa158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b505190506402540be40034061580156110995750600554611095908263ffffffff613a6316565b3410155b6110d45760405162461bcd60e51b8152600401808060200182810382526046815260200180615b616046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110fe5750426201518001846001600160401b031611155b6111395760405162461bcd60e51b8152600401808060200182810382526038815260200180615a5e6038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561117457600080fd5b505afa158015611188573d6000803e3d6000fd5b505050506040513d602081101561119e57600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111e657600080fd5b505afa1580156111fa573d6000803e3d6000fd5b505050506040513d602081101561121057600080fd5b50519050677ce66c50e284000061122a8360ff8416613abd565b1115611276576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061129290349063ffffffff613b4c16565b6040518115909202916000818181858888f193505050501580156112ba573d6000803e3d6000fd5b506112c36158b5565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016113126402540be400600554613b8e90919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d7600561133984613bd0565b6113636402540be40061135760055434613b4c90919063ffffffff16565b9063ffffffff613b8e16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113c15781810151838201526020016113a9565b50505050905090810190601f1680156113ee5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561140f57600080fd5b505af1158015611423573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061147c6158ea565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c082015290611503576000925050506115c5565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561156157600080fd5b505afa158015611575573d6000803e3d6000fd5b505050506040513d602081101561158b57600080fd5b5051608083015160608401519192506000916115ac9163ffffffff613b4c16565b90506115be818363ffffffff613b4c16565b9450505050505b919050565b6102ca81565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156116465760405162461bcd60e51b815260040180806020018281038252602b815260200180615c04602b913960400191505060405180910390fd5b600061165183613d05565b905061165b6158ea565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611720576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b600061173d82608001518360600151613b4c90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b0316146117935760405162461bcd60e51b8152600401808060200182810382526045815260200180615acd6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156117d657600080fd5b505afa1580156117ea573d6000803e3d6000fd5b505050506040513d602081101561180057600080fd5b50516001600160a01b0316146118475760405162461bcd60e51b815260040180806020018281038252602e815260200180615a30602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d60208110156118bd57600080fd5b505160408051636eb1769f60e11b81523360048201523060248201529051919250839161194e9184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b15801561191657600080fd5b505afa15801561192a573d6000803e3d6000fd5b505050506040513d602081101561194057600080fd5b50519063ffffffff613a6316565b10156119a1576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e357600080fd5b505afa1580156119f7573d6000803e3d6000fd5b505050506040513d6020811015611a0d57600080fd5b50519050808210801590611a2657506402540be4008206155b611a615760405162461bcd60e51b8152600401808060200182810382526037815260200180615a966037913960400191505060405180910390fd5b6000611a6d868b613d0c565b905063ffffffff8116611c6c576001600160a01b038a166323b872dd33611004611a9d898963ffffffff613b4c16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0557600080fd5b505af1158015611b19573d6000803e3d6000fd5b505050506040513d6020811015611b2f57600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611c2b578181015183820152602001611c13565b50505050905090810190601f168015611c585780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611d24565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ce8578181015183820152602001611cd0565b50505050905090810190601f168015611d155780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d7e615926565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611dc6573d6000803e3d6000fd5b5061200063f7a251d76001611dda84614166565b611def886402540be40063ffffffff613b8e16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e4d578181015183820152602001611e35565b50505050905090810190601f168015611e7a5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e9b57600080fd5b505af1158015611eaf573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b601081565b600080611edb83613d05565b9050611ee56158ea565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611faa576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b03161061200b576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d602081101561207757600080fd5b5051905080821080159061209057506402540be4008206155b6120cb5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a966037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055612125615926565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015612168573d6000803e3d6000fd5b5061200063f7a251d7600161217c84614166565b612191876402540be40063ffffffff613b8e16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121ef5781810151838201526020016121d7565b50505050905090810190601f16801561221c5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561223d57600080fd5b505af1158015612251573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156122d35781810151838201526020016122bb565b50505050905090810190601f1680156123005780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b60008061232d83613d05565b90506123376158ea565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123fc576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146124505760405162461bcd60e51b8152600401808060200182810382526045815260200180615acd6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561249357600080fd5b505afa1580156124a7573d6000803e3d6000fd5b505050506040513d60208110156124bd57600080fd5b50516001600160a01b03161461251a576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561255c57600080fd5b505afa158015612570573d6000803e3d6000fd5b505050506040513d602081101561258657600080fd5b5051905080821080159061259f57506402540be4008206155b6125da5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a966037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055612634615926565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015612677573d6000803e3d6000fd5b5061200063f7a251d7600161268b84614166565b6126a0876402540be40063ffffffff613b8e16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126fe5781810151838201526020016126e6565b50505050905090810190601f16801561272b5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561274c57600080fd5b505af1158015612760573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156127de5781810151838201526020016127c6565b50505050905090810190601f16801561280b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128725760405162461bcd60e51b815260040180806020018281038252602f815260200180615bd5602f913960400191505060405180910390fd5b60ff8316600414156128c2576128bd82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141dc92505050565b61297c565b60ff83166005141561290d576128bd82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061448992505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b1580156129ce57600080fd5b505afa1580156129e2573d6000803e3d6000fd5b505050506040513d60208110156129f857600080fd5b505114612a3c576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a9b576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612ad857600080fd5b505afa158015612aec573d6000803e3d6000fd5b505050506040513d6020811015612b0257600080fd5b505190506402540be4003406158015612b2d5750600454612b29908263ffffffff613a6316565b3410155b612b685760405162461bcd60e51b815260040180806020018281038252604d8152602001806159e3604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b925750426201518001836001600160401b031611155b612bcd5760405162461bcd60e51b8152600401808060200182810382526038815260200180615a5e6038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612c0857600080fd5b505afa158015612c1c573d6000803e3d6000fd5b505050506040513d6020811015612c3257600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c7a57600080fd5b505afa158015612c8e573d6000803e3d6000fd5b505050506040513d6020811015612ca457600080fd5b50519050677ce66c50e2840000612cbe8260ff8516613abd565b1115612d0a576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612d4557600080fd5b505afa158015612d59573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d8257600080fd5b8101908080516040519392919084600160201b821115612da157600080fd5b908301906020820185811115612db657600080fd5b8251600160201b811182820188101715612dcf57600080fd5b82525081516020918201929091019080838360005b83811015612dfc578181015183820152602001612de4565b50505050905090810190601f168015612e295780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612e4b57506020815111155b612e9c576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612ed757600080fd5b505afa158015612eeb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612f1457600080fd5b8101908080516040519392919084600160201b821115612f3357600080fd5b908301906020820185811115612f4857600080fd5b8251600160201b811182820188101715612f6157600080fd5b82525081516020918201929091019080838360005b83811015612f8e578181015183820152602001612f76565b50505050905090810190601f168015612fbb5780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612fdb57508051600810155b61302c576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561318057604160f81b828260ff168151811061304f57fe5b01602001516001600160f81b0319161080159061308d5750602d60f91b828260ff168151811061307b57fe5b01602001516001600160f81b03191611155b806130e55750606160f81b828260ff16815181106130a757fe5b01602001516001600160f81b031916108015906130e55750603d60f91b828260ff16815181106130d357fe5b01602001516001600160f81b03191611155b8061313d5750600360fc1b828260ff16815181106130ff57fe5b01602001516001600160f81b0319161080159061313d5750603960f81b828260ff168151811061312b57fe5b01602001516001600160f81b03191611155b6131785760405162461bcd60e51b815260040180806020018281038252602e815260200180615b12602e913960400191505060405180910390fd5b60010161302f565b50600454611004906108fc9061319d90349063ffffffff613b4c16565b6040518115909202916000818181858888f193505050501580156131c5573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131fc61593d565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161325b6402540be400600454613b8e90919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461328284614654565b6132a06402540be40061135760045434613b4c90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132fe5781810151838201526020016132e6565b50505050905090810190601f16801561332b5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561334c57600080fd5b505af1158015613360573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b33611007146133e85760405162461bcd60e51b815260040180806020018281038252602e815260200180615ba7602e913960400191505060405180910390fd5b6020811461343d576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156135325760208201516402540be40081061561352a576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b6004556135e8565b6673796e6346656560c81b8114156135ab5760208201516402540be4008106156135a3576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b6005556135e8565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136c35760405162461bcd60e51b815260040180806020018281038252602f815260200180615bd5602f913960400191505060405180910390fd5b60ff83166004141561370e576128bd82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147c692505050565b60ff83166005141561290d576128bd82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061490592505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b60606137dd6158ea565b60006137e8846149ff565b915091508061383e576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138f1576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b0390921691909102179055613a48565b815160ff16600114156139fb5760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561394a57600080fd5b505afa15801561395e573d6000803e3d6000fd5b505050506040513d602081101561397457600080fd5b505190506001600160a01b038116156139f55760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b1580156139dc57600080fd5b505af11580156139f0573d6000803e3d6000fd5b505050505b50613a48565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610eda576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613b3557604d60071983011115613b17576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613b2e836007198401600a0a63ffffffff613b8e16565b9050611431565b610eda836008849003600a0a63ffffffff614b5016565b6000610eda83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614ba9565b6000610eda83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614c40565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613beb5750508351909150613c16906001600160a01b0316614ca5565b81600081518110613c2357fe5b6020026020010181905250613c4483602001516001600160a01b0316614ca5565b81600181518110613c5157fe5b6020026020010181905250613c6c836040015160001c614cc8565b81600281518110613c7957fe5b6020026020010181905250613c918360600151614cc8565b81600381518110613c9e57fe5b6020026020010181905250613cb68360800151614cc8565b81600481518110613cc357fe5b6020026020010181905250613ce48360a001516001600160401b0316614cc8565b81600581518110613cf157fe5b6020026020010181905250610eda81614cdb565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613d4857600080fd5b505afa158015613d5c573d6000803e3d6000fd5b505050506040513d6020811015613d7257600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613dbe57600080fd5b505afa158015613dd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613dfb57600080fd5b8101908080516040519392919084600160201b821115613e1a57600080fd5b908301906020820185811115613e2f57600080fd5b8251600160201b811182820188101715613e4857600080fd5b82525081516020918201929091019080838360005b83811015613e75578181015183820152602001613e5d565b50505050905090810190601f168015613ea25780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ef257600080fd5b505afa158015613f06573d6000803e3d6000fd5b505050506040513d6020811015613f1c57600080fd5b505160808701516060880151919250600091613f3d9163ffffffff613b4c16565b9050428760c001516001600160401b03161015613f6257506001935061143192505050565b613f70838860200151614d65565b613f8257506002935061143192505050565b80821115613f9857506003935061143192505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b50511461401957506004935061143192505050565b8660a0015160ff16841461403557506005935061143192505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561407a57600080fd5b505afa15801561408e573d6000803e3d6000fd5b505050506040513d60208110156140a457600080fd5b50516001600160a01b031614158061414657506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561411757600080fd5b505afa15801561412b573d6000803e3d6000fd5b505050506040513d602081101561414157600080fd5b505114155b1561415957506006935061143192505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b606081526020019060019003908161417f57505083519091506141a79063ffffffff16614cc8565b816000815181106141b457fe5b60200260200101819052506141cf836020015160001c614cc8565b81600181518110613cf157fe5b6141e46158b5565b60006141ef83614e4d565b915091508061423c576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff1661439d5760808201516040516110049180156108fc02916000818181858888f1935050505015801561429f573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b15801561431957600080fd5b505af115801561432d573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a25050614486565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143f1576040519150601f19603f3d011682016040523d82523d6000602084013e6143f6565b606091505b50509050806144335760808301516040516110029180156108fc02916000818181858888f19350505050158015614431573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614491615981565b600061449c83614f5a565b91509150806144e9576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff166145695760408083015190516110049180156108fc02916000818181858888f19350505050158015614527573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a25050614486565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d806000811461460c576040519150601f19603f3d011682016040523d82523d6000602084013e614611565b606091505b505090508061464e5760408084015190516110029180156108fc02916000818181858888f1935050505015801561464c573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b6060815260200190600190039081614670575050835190915061469b906001600160a01b0316614ca5565b816000815181106146a857fe5b60200260200101819052506146c983602001516001600160a01b0316614ca5565b816001815181106146d657fe5b60200260200101819052506146f1836040015160001c614cc8565b816002815181106146fe57fe5b6020026020010181905250614719836060015160001c614cc8565b8160038151811061472657fe5b602002602001018190525061473e8360800151614cc8565b8160048151811061474b57fe5b60200260200101819052506147668360a0015160ff16614cc8565b8160058151811061477357fe5b602002602001018190525061478b8360c00151614cc8565b8160068151811061479857fe5b60200260200101819052506147b98360e001516001600160401b0316614cc8565b81600781518110613cf157fe5b6147ce61593d565b60006147d983615026565b9150915080614826576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614870906402540be40063ffffffff614b5016565b6040516000818181858888f193505050503d80600081146148ad576040519150601f19603f3d011682016040523d82523d6000602084013e6148b2565b606091505b505090508061464e5760c0830151611002906108fc906148dd906402540be40063ffffffff614b5016565b6040518115909202916000818181858888f1935050505015801561464c573d6000803e3d6000fd5b61490d6158b5565b600061491883615177565b9150915080614965576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614992906402540be40063ffffffff614b5016565b6040516000818181858888f193505050503d80600081146149cf576040519150601f19603f3d011682016040523d82523d6000602084013e6149d4565b606091505b505090508061464e576080830151611002906108fc906148dd906402540be40063ffffffff614b5016565b614a076158ea565b6000614a116158ea565b614a196159a8565b614a2a614a2586615287565b6152ac565b90506000805b614a39836152f6565b15614b435780614a5e57614a54614a4f84615317565b615365565b60ff168452614b3b565b8060011415614a7d57614a73614a4f84615317565b6020850152614b3b565b8060021415614aaa57614a97614a9284615317565b61541a565b6001600160a01b03166040850152614b3b565b8060031415614ac957614abf614a4f84615317565b6060850152614b3b565b8060041415614ae857614ade614a4f84615317565b6080850152614b3b565b8060051415614b0a57614afd614a4f84615317565b60ff1660a0850152614b3b565b8060061415614b3657614b1f614a4f84615317565b6001600160401b031660c085015260019150614b3b565b614b43565b600101614a30565b5091935090915050915091565b600082614b5f57506000611431565b82820282848281614b6c57fe5b0414610eda5760405162461bcd60e51b8152600401808060200182810382526021815260200180615b406021913960400191505060405180910390fd5b60008184841115614c385760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bfd578181015183820152602001614be5565b50505050905090810190601f168015614c2a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c8f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bfd578181015183820152602001614be5565b506000838581614c9b57fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610eda81615434565b6060611431614cd68361548a565b615434565b6060815160001415614cfc57506040805160008152602081019091526115c5565b606082600081518110614d0b57fe5b602002602001015190506000600190505b8351811015614d4c57614d4282858381518110614d3557fe5b6020026020010151615570565b9150600101614d1c565b50610eda614d5f825160c060ff166155ed565b82615570565b8151600090839060081080614d7b575080516002115b15614d8a576000915050611431565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614dbe57fe5b6020910101516001600160f81b031916602d60f81b14614de357600092505050611431565b600160005b8351811015614e4357828181518110614dfd57fe5b602001015160f81c60f81b6001600160f81b031916848281518110614e1e57fe5b01602001516001600160f81b03191614614e3b5760009150614e43565b600101614de8565b5095945050505050565b614e556158b5565b6000614e5f6158b5565b614e676159a8565b614e73614a2586615287565b90506000805b614e82836152f6565b15614b435780614ea857614e98614a9284615317565b6001600160a01b03168452614f52565b8060011415614ed057614ebd614a9284615317565b6001600160a01b03166020850152614f52565b8060021415614ef257614ee5614a4f84615317565b60ff166040850152614f52565b8060031415614f1157614f07614a4f84615317565b6060850152614f52565b8060041415614f3057614f26614a4f84615317565b6080850152614f52565b8060051415614b3657614f45614a4f84615317565b60ff1660a0850152600191505b600101614e79565b614f62615981565b6000614f6c615981565b614f746159a8565b614f80614a2586615287565b90506000805b614f8f836152f6565b15614b435780614fb557614fa5614a9284615317565b6001600160a01b0316845261501e565b8060011415614fdd57614fca614a9284615317565b6001600160a01b0316602085015261501e565b8060021415614ffc57614ff2614a4f84615317565b604085015261501e565b8060031415614b3657615011614a4f84615317565b60ff166060850152600191505b600101614f86565b61502e61593d565b600061503861593d565b6150406159a8565b61504c614a2586615287565b90506000805b61505b836152f6565b15614b43578061508157615071614a9284615317565b6001600160a01b0316845261516f565b80600114156150a957615096614a9284615317565b6001600160a01b0316602085015261516f565b80600214156150c8576150be614a4f84615317565b604085015261516f565b80600314156150e7576150dd614a4f84615317565b606085015261516f565b8060041415615106576150fc614a4f84615317565b608085015261516f565b80600514156151285761511b614a4f84615317565b60ff1660a085015261516f565b80600614156151475761513d614a4f84615317565b60c085015261516f565b8060071415614b365761515c614a4f84615317565b6001600160401b031660e0850152600191505b600101615052565b61517f6158b5565b60006151896158b5565b6151916159a8565b61519d614a2586615287565b90506000805b6151ac836152f6565b15614b4357806151d2576151c2614a9284615317565b6001600160a01b0316845261527f565b80600114156151fa576151e7614a9284615317565b6001600160a01b0316602085015261527f565b80600214156152195761520f614a4f84615317565b604085015261527f565b80600314156152385761522e614a4f84615317565b606085015261527f565b80600414156152575761524d614a4f84615317565b608085015261527f565b8060051415614b365761526c614a4f84615317565b6001600160401b031660a0850152600191505b6001016151a3565b61528f6159c8565b506040805180820190915281518152602082810190820152919050565b6152b46159a8565b6152bd826156e5565b6152c657600080fd5b60006152d5836020015161571f565b60208085015160408051808201909152868152920190820152915050919050565b60006153006159c8565b505080518051602091820151919092015191011190565b61531f6159c8565b615328826152f6565b61533157600080fd5b6020820151600061534182615782565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061537a57508151602110155b61538357600080fd5b6000615392836020015161571f565b905080836000015110156153ed576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a5a57506020919091036101000a90049392505050565b805160009060151461542b57600080fd5b61143182615365565b6060815160011480156154665750607f60f81b8260008151811061545457fe5b01602001516001600160f81b03191611155b156154725750806115c5565b6114316154848351608060ff166155ed565b83615570565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166154ce575060186154f2565b6fffffffffffffffffffffffffffffffff1984166154ee575060106154f2565b5060005b60208110156155285781818151811061550757fe5b01602001516001600160f81b0319161561552057615528565b6001016154f2565b60008160200390506060816040519080825280601f01601f19166020018201604052801561555d576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b818310156155a1578051835260209283019201615589565b50855184518101855292509050808201602086015b818310156155ce5780518352602092830192016155b6565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061563d576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116156975782840160f81b8160008151811061567957fe5b60200101906001600160f81b031916908160001a9053509050611431565b60606156a28561548a565b90508381510160370160f81b826000815181106156bb57fe5b60200101906001600160f81b031916908160001a9053506156dc8282615570565b95945050505050565b80516000906156f6575060006115c5565b6020820151805160001a9060c0821015615715576000925050506115c5565b5060019392505050565b8051600090811a60808110156157395760009150506115c5565b60b8811080615754575060c08110801590615754575060f881105b156157635760019150506115c5565b60c08110156157775760b5190190506115c5565b60f5190190506115c5565b80516000908190811a608081101561579d57600191506158ae565b60b88110156157b257607e19810191506158ae565b60c081101561582c57600060b78203600186019550806020036101000a865104915060018101820193505080831015615826576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506158ae565b60f88110156158415760be19810191506158ae565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156158ac576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b60405180604001604052806159bb6159c8565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a164736f6c6343000604000a" + "code": "0x6080604052600436106103975760003560e01c80637942fd05116101dc578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d78578063fc3e5908146105f9578063fd6a687914610d8d578063fe3a2af514610da257610397565b8063d9e6dae914610727578063dc927faf14610d39578063e605bca014610d4e578063f9a2bbc714610d6357610397565b8063c8509d81116100dc578063c8509d8114610c1f578063c8e704a4146105f9578063d117a11014610ca4578063d7109ce614610d2457610397565b8063b795031714610766578063bd32d3f914610520578063c81b166214610c0a57610397565b806396713da91161017a578063a78abc1611610149578063a78abc1614610b15578063ab51bb9614610b2a578063ab67a48514610766578063ac43175114610b3f57610397565b806396713da914610ac15780639a854bbd14610ad65780639dc0926214610aeb578063a1a11bf514610b0057610397565b8063831d65d1116101b6578063831d65d1146109f0578063859180fb1461071257806394553a4e14610a7757806395b9ad2614610aac57610397565b80637942fd05146109c65780637d078e13146105355780637ec816dd146109db57610397565b8063493279b1116102c157806366dea52a1161025f578063718a8aa81161022e578063718a8aa81461084457806372c4e0861461085957806375d47a0a146108fd57806377d9dae81461091257610397565b806366dea52a146107665780636b3f13071461077b5780636e47b4821461082f57806370fd5bad1461076657610397565b806351e806721161029b57806351e806721461073c5780635d499b1b146107515780635f558f8614610766578063613684751461072757610397565b8063493279b1146106e65780634bc81c00146107125780634bf6c8821461072757610397565b80632d89ac3211610339578063401809f911610308578063401809f9146105f957806343756e5c1461060e578063445fcefe14610623578063487c88ac1461053557610397565b80632d89ac32146105355780632e02d7761461059357806337e6ecda146105c65780633dffc3871461053557610397565b80631182b875116103755780631182b875146104265780631f91600b1461052057806323996b531461053557806325c751b71461054a57610397565b80630bee7a671461039c5780630e2374a5146103ca5780630f212b1b146103fb575b600080fd5b3480156103a857600080fd5b506103b1610db7565b6040805163ffffffff9092168252519081900360200190f35b3480156103d657600080fd5b506103df610dbc565b604080516001600160a01b039092168252519081900360200190f35b34801561040757600080fd5b50610410610dc2565b6040805160ff9092168252519081900360200190f35b34801561043257600080fd5b506104ab6004803603604081101561044957600080fd5b60ff8235169190810190604081016020820135600160201b81111561046d57600080fd5b82018360208201111561047f57600080fd5b803590602001918460018302840111600160201b831117156104a057600080fd5b509092509050610dc7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104e55781810151838201526020016104cd565b50505050905090810190601f1680156105125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561052c57600080fd5b50610410610ee1565b34801561054157600080fd5b50610410610ee6565b61057f6004803603604081101561056057600080fd5b5080356001600160a01b031690602001356001600160401b0316610eeb565b604080519115158252519081900360200190f35b34801561059f57600080fd5b5061057f600480360360208110156105b657600080fd5b50356001600160a01b0316611437565b3480156105d257600080fd5b5061057f600480360360208110156105e957600080fd5b50356001600160a01b031661144c565b34801561060557600080fd5b50610410611461565b34801561061a57600080fd5b506103df611466565b34801561062f57600080fd5b506106d46004803603602081101561064657600080fd5b810190602081018135600160201b81111561066057600080fd5b82018360208201111561067257600080fd5b803590602001918460018302840111600160201b8311171561069357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061146c945050505050565b60408051918252519081900360200190f35b3480156106f257600080fd5b506106fb6115ca565b6040805161ffff9092168252519081900360200190f35b34801561071e57600080fd5b506104106115cf565b34801561073357600080fd5b506104106115d4565b34801561074857600080fd5b506103df6115d9565b34801561075d57600080fd5b506106d46115df565b34801561077257600080fd5b506104106115e8565b61057f6004803603604081101561079157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156107bb57600080fd5b8201836020820111156107cd57600080fd5b803590602001918460018302840111600160201b831117156107ee57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115ed945050505050565b34801561083b57600080fd5b506103df611ec3565b34801561085057600080fd5b50610410611ec9565b61057f6004803603602081101561086f57600080fd5b810190602081018135600160201b81111561088957600080fd5b82018360208201111561089b57600080fd5b803590602001918460018302840111600160201b831117156108bc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ece945050505050565b34801561090957600080fd5b506103df61231a565b61057f6004803603604081101561092857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460018302840111600160201b8311171561098557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612320945050505050565b3480156109d257600080fd5b50610410612826565b3480156109e757600080fd5b506106d461282b565b3480156109fc57600080fd5b50610a7560048036036040811015610a1357600080fd5b60ff8235169190810190604081016020820135600160201b811115610a3757600080fd5b820183602082011115610a4957600080fd5b803590602001918460018302840111600160201b83111715610a6a57600080fd5b509092509050612831565b005b61057f60048036036040811015610a8d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612980565b348015610ab857600080fd5b50610410613377565b348015610acd57600080fd5b5061041061337c565b348015610ae257600080fd5b506106d4613381565b348015610af757600080fd5b506103df61338d565b348015610b0c57600080fd5b506103df613393565b348015610b2157600080fd5b5061057f613399565b348015610b3657600080fd5b506103b16133a2565b348015610b4b57600080fd5b50610a7560048036036040811015610b6257600080fd5b810190602081018135600160201b811115610b7c57600080fd5b820183602082011115610b8e57600080fd5b803590602001918460018302840111600160201b83111715610baf57600080fd5b919390929091602081019035600160201b811115610bcc57600080fd5b820183602082011115610bde57600080fd5b803590602001918460018302840111600160201b83111715610bff57600080fd5b5090925090506133a7565b348015610c1657600080fd5b506103df61367c565b348015610c2b57600080fd5b50610a7560048036036040811015610c4257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c6657600080fd5b820183602082011115610c7857600080fd5b803590602001918460018302840111600160201b83111715610c9957600080fd5b509092509050613682565b348015610cb057600080fd5b50610cce60048036036020811015610cc757600080fd5b5035613758565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610d3057600080fd5b506106d46137af565b348015610d4557600080fd5b506103df6137b4565b348015610d5a57600080fd5b506106d46137ba565b348015610d6f57600080fd5b506103df6137c0565b348015610d8457600080fd5b506106d46137c6565b348015610d9957600080fd5b506103df6137cc565b348015610dae57600080fd5b506104106133a2565b606481565b61200181565b600681565b60603361200014610e095760405162461bcd60e51b815260040180806020018281038252602f815260200180615bd4602f913960400191505060405180910390fd5b60ff841660011415610e5b57610e5483838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506137d292505050565b9050610eda565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d6020811015610f6257600080fd5b5051905080610fa4576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16611007576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561104457600080fd5b505afa158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b505190506402540be40034061580156110995750600554611095908263ffffffff613a6216565b3410155b6110d45760405162461bcd60e51b8152600401808060200182810382526046815260200180615b606046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110fe5750426201518001846001600160401b031611155b6111395760405162461bcd60e51b8152600401808060200182810382526038815260200180615a5d6038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561117457600080fd5b505afa158015611188573d6000803e3d6000fd5b505050506040513d602081101561119e57600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111e657600080fd5b505afa1580156111fa573d6000803e3d6000fd5b505050506040513d602081101561121057600080fd5b50519050677ce66c50e284000061122a8360ff8416613abc565b1115611276576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061129290349063ffffffff613b4b16565b6040518115909202916000818181858888f193505050501580156112ba573d6000803e3d6000fd5b506112c36158b4565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016113126402540be400600554613b8d90919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d7600561133984613bcf565b6113636402540be40061135760055434613b4b90919063ffffffff16565b9063ffffffff613b8d16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113c15781810151838201526020016113a9565b50505050905090810190601f1680156113ee5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561140f57600080fd5b505af1158015611423573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061147c6158e9565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c082015290611503576000925050506115c5565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561156157600080fd5b505afa158015611575573d6000803e3d6000fd5b505050506040513d602081101561158b57600080fd5b5051608083015160608401519192506000916115ac9163ffffffff613b4b16565b90506115be818363ffffffff613b4b16565b9450505050505b919050565b606081565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156116455760405162461bcd60e51b815260040180806020018281038252602b815260200180615c03602b913960400191505060405180910390fd5b600061165083613d04565b905061165a6158e9565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c083015261171f576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b600061173c82608001518360600151613b4b90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b0316146117925760405162461bcd60e51b8152600401808060200182810382526045815260200180615acc6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b50516001600160a01b0316146118465760405162461bcd60e51b815260040180806020018281038252602e815260200180615a2f602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561189257600080fd5b505afa1580156118a6573d6000803e3d6000fd5b505050506040513d60208110156118bc57600080fd5b505160408051636eb1769f60e11b81523360048201523060248201529051919250839161194d9184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d602081101561193f57600080fd5b50519063ffffffff613a6216565b10156119a0576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e257600080fd5b505afa1580156119f6573d6000803e3d6000fd5b505050506040513d6020811015611a0c57600080fd5b50519050808210801590611a2557506402540be4008206155b611a605760405162461bcd60e51b8152600401808060200182810382526037815260200180615a956037913960400191505060405180910390fd5b6000611a6c868b613d0b565b905063ffffffff8116611c6b576001600160a01b038a166323b872dd33611004611a9c898963ffffffff613b4b16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611b0457600080fd5b505af1158015611b18573d6000803e3d6000fd5b505050506040513d6020811015611b2e57600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b9757600080fd5b505af1158015611bab573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611c2a578181015183820152602001611c12565b50505050905090810190601f168015611c575780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611d23565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ce7578181015183820152602001611ccf565b50505050905090810190601f168015611d145780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d7d615925565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611dc5573d6000803e3d6000fd5b5061200063f7a251d76001611dd984614165565b611dee886402540be40063ffffffff613b8d16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e4c578181015183820152602001611e34565b50505050905090810190601f168015611e795780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e9a57600080fd5b505af1158015611eae573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b601081565b600080611eda83613d04565b9050611ee46158e9565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611fa9576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b03161061200a576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561204c57600080fd5b505afa158015612060573d6000803e3d6000fd5b505050506040513d602081101561207657600080fd5b5051905080821080159061208f57506402540be4008206155b6120ca5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a956037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055612124615925565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015612167573d6000803e3d6000fd5b5061200063f7a251d7600161217b84614165565b612190876402540be40063ffffffff613b8d16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121ee5781810151838201526020016121d6565b50505050905090810190601f16801561221b5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561223c57600080fd5b505af1158015612250573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156122d25781810151838201526020016122ba565b50505050905090810190601f1680156122ff5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b60008061232c83613d04565b90506123366158e9565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123fb576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b03161461244f5760405162461bcd60e51b8152600401808060200182810382526045815260200180615acc6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561249257600080fd5b505afa1580156124a6573d6000803e3d6000fd5b505050506040513d60208110156124bc57600080fd5b50516001600160a01b031614612519576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561255b57600080fd5b505afa15801561256f573d6000803e3d6000fd5b505050506040513d602081101561258557600080fd5b5051905080821080159061259e57506402540be4008206155b6125d95760405162461bcd60e51b8152600401808060200182810382526037815260200180615a956037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055612633615925565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015612676573d6000803e3d6000fd5b5061200063f7a251d7600161268a84614165565b61269f876402540be40063ffffffff613b8d16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126fd5781810151838201526020016126e5565b50505050905090810190601f16801561272a5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561274b57600080fd5b505af115801561275f573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156127dd5781810151838201526020016127c5565b50505050905090810190601f16801561280a5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128715760405162461bcd60e51b815260040180806020018281038252602f815260200180615bd4602f913960400191505060405180910390fd5b60ff8316600414156128c1576128bc82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506141db92505050565b61297b565b60ff83166005141561290c576128bc82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061448892505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b505114612a3b576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a9a576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612ad757600080fd5b505afa158015612aeb573d6000803e3d6000fd5b505050506040513d6020811015612b0157600080fd5b505190506402540be4003406158015612b2c5750600454612b28908263ffffffff613a6216565b3410155b612b675760405162461bcd60e51b815260040180806020018281038252604d8152602001806159e2604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b915750426201518001836001600160401b031611155b612bcc5760405162461bcd60e51b8152600401808060200182810382526038815260200180615a5d6038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612c0757600080fd5b505afa158015612c1b573d6000803e3d6000fd5b505050506040513d6020811015612c3157600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c7957600080fd5b505afa158015612c8d573d6000803e3d6000fd5b505050506040513d6020811015612ca357600080fd5b50519050677ce66c50e2840000612cbd8260ff8516613abc565b1115612d09576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612d4457600080fd5b505afa158015612d58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d8157600080fd5b8101908080516040519392919084600160201b821115612da057600080fd5b908301906020820185811115612db557600080fd5b8251600160201b811182820188101715612dce57600080fd5b82525081516020918201929091019080838360005b83811015612dfb578181015183820152602001612de3565b50505050905090810190601f168015612e285780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612e4a57506020815111155b612e9b576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612ed657600080fd5b505afa158015612eea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612f1357600080fd5b8101908080516040519392919084600160201b821115612f3257600080fd5b908301906020820185811115612f4757600080fd5b8251600160201b811182820188101715612f6057600080fd5b82525081516020918201929091019080838360005b83811015612f8d578181015183820152602001612f75565b50505050905090810190601f168015612fba5780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612fda57508051600810155b61302b576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561317f57604160f81b828260ff168151811061304e57fe5b01602001516001600160f81b0319161080159061308c5750602d60f91b828260ff168151811061307a57fe5b01602001516001600160f81b03191611155b806130e45750606160f81b828260ff16815181106130a657fe5b01602001516001600160f81b031916108015906130e45750603d60f91b828260ff16815181106130d257fe5b01602001516001600160f81b03191611155b8061313c5750600360fc1b828260ff16815181106130fe57fe5b01602001516001600160f81b0319161080159061313c5750603960f81b828260ff168151811061312a57fe5b01602001516001600160f81b03191611155b6131775760405162461bcd60e51b815260040180806020018281038252602e815260200180615b11602e913960400191505060405180910390fd5b60010161302e565b50600454611004906108fc9061319c90349063ffffffff613b4b16565b6040518115909202916000818181858888f193505050501580156131c4573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131fb61593c565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161325a6402540be400600454613b8d90919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461328184614653565b61329f6402540be40061135760045434613b4b90919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132fd5781810151838201526020016132e5565b50505050905090810190601f16801561332a5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561334b57600080fd5b505af115801561335f573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b33611007146133e75760405162461bcd60e51b815260040180806020018281038252602e815260200180615ba6602e913960400191505060405180910390fd5b6020811461343c576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156135315760208201516402540be400810615613529576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b6004556135e7565b6673796e6346656560c81b8114156135aa5760208201516402540be4008106156135a2576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b6005556135e7565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136c25760405162461bcd60e51b815260040180806020018281038252602f815260200180615bd4602f913960400191505060405180910390fd5b60ff83166004141561370d576128bc82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506147c592505050565b60ff83166005141561290c576128bc82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061490492505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b60606137dc6158e9565b60006137e7846149fe565b915091508061383d576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138f0576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b0390921691909102179055613a47565b815160ff16600114156139fa5760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561394957600080fd5b505afa15801561395d573d6000803e3d6000fd5b505050506040513d602081101561397357600080fd5b505190506001600160a01b038116156139f45760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b1580156139db57600080fd5b505af11580156139ef573d6000803e3d6000fd5b505050505b50613a47565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610eda576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613b3457604d60071983011115613b16576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613b2d836007198401600a0a63ffffffff613b8d16565b9050611431565b610eda836008849003600a0a63ffffffff614b4f16565b6000610eda83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614ba8565b6000610eda83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614c3f565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613bea5750508351909150613c15906001600160a01b0316614ca4565b81600081518110613c2257fe5b6020026020010181905250613c4383602001516001600160a01b0316614ca4565b81600181518110613c5057fe5b6020026020010181905250613c6b836040015160001c614cc7565b81600281518110613c7857fe5b6020026020010181905250613c908360600151614cc7565b81600381518110613c9d57fe5b6020026020010181905250613cb58360800151614cc7565b81600481518110613cc257fe5b6020026020010181905250613ce38360a001516001600160401b0316614cc7565b81600581518110613cf057fe5b6020026020010181905250610eda81614cda565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613d4757600080fd5b505afa158015613d5b573d6000803e3d6000fd5b505050506040513d6020811015613d7157600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613dbd57600080fd5b505afa158015613dd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613dfa57600080fd5b8101908080516040519392919084600160201b821115613e1957600080fd5b908301906020820185811115613e2e57600080fd5b8251600160201b811182820188101715613e4757600080fd5b82525081516020918201929091019080838360005b83811015613e74578181015183820152602001613e5c565b50505050905090810190601f168015613ea15780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ef157600080fd5b505afa158015613f05573d6000803e3d6000fd5b505050506040513d6020811015613f1b57600080fd5b505160808701516060880151919250600091613f3c9163ffffffff613b4b16565b9050428760c001516001600160401b03161015613f6157506001935061143192505050565b613f6f838860200151614d64565b613f8157506002935061143192505050565b80821115613f9757506003935061143192505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613fd957600080fd5b505afa158015613fed573d6000803e3d6000fd5b505050506040513d602081101561400357600080fd5b50511461401857506004935061143192505050565b8660a0015160ff16841461403457506005935061143192505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561407957600080fd5b505afa15801561408d573d6000803e3d6000fd5b505050506040513d60208110156140a357600080fd5b50516001600160a01b031614158061414557506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561411657600080fd5b505afa15801561412a573d6000803e3d6000fd5b505050506040513d602081101561414057600080fd5b505114155b1561415857506006935061143192505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b606081526020019060019003908161417e57505083519091506141a69063ffffffff16614cc7565b816000815181106141b357fe5b60200260200101819052506141ce836020015160001c614cc7565b81600181518110613cf057fe5b6141e36158b4565b60006141ee83614e4c565b915091508061423b576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff1661439c5760808201516040516110049180156108fc02916000818181858888f1935050505015801561429e573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b15801561431857600080fd5b505af115801561432c573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a25050614485565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143f0576040519150601f19603f3d011682016040523d82523d6000602084013e6143f5565b606091505b50509050806144325760808301516040516110029180156108fc02916000818181858888f19350505050158015614430573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614490615980565b600061449b83614f59565b91509150806144e8576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff166145685760408083015190516110049180156108fc02916000818181858888f19350505050158015614526573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a25050614485565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d806000811461460b576040519150601f19603f3d011682016040523d82523d6000602084013e614610565b606091505b505090508061464d5760408084015190516110029180156108fc02916000818181858888f1935050505015801561464b573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b606081526020019060019003908161466f575050835190915061469a906001600160a01b0316614ca4565b816000815181106146a757fe5b60200260200101819052506146c883602001516001600160a01b0316614ca4565b816001815181106146d557fe5b60200260200101819052506146f0836040015160001c614cc7565b816002815181106146fd57fe5b6020026020010181905250614718836060015160001c614cc7565b8160038151811061472557fe5b602002602001018190525061473d8360800151614cc7565b8160048151811061474a57fe5b60200260200101819052506147658360a0015160ff16614cc7565b8160058151811061477257fe5b602002602001018190525061478a8360c00151614cc7565b8160068151811061479757fe5b60200260200101819052506147b88360e001516001600160401b0316614cc7565b81600781518110613cf057fe5b6147cd61593c565b60006147d883615025565b9150915080614825576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c08501519116906127109061486f906402540be40063ffffffff614b4f16565b6040516000818181858888f193505050503d80600081146148ac576040519150601f19603f3d011682016040523d82523d6000602084013e6148b1565b606091505b505090508061464d5760c0830151611002906108fc906148dc906402540be40063ffffffff614b4f16565b6040518115909202916000818181858888f1935050505015801561464b573d6000803e3d6000fd5b61490c6158b4565b600061491783615176565b9150915080614964576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614991906402540be40063ffffffff614b4f16565b6040516000818181858888f193505050503d80600081146149ce576040519150601f19603f3d011682016040523d82523d6000602084013e6149d3565b606091505b505090508061464d576080830151611002906108fc906148dc906402540be40063ffffffff614b4f16565b614a066158e9565b6000614a106158e9565b614a186159a7565b614a29614a2486615286565b6152ab565b90506000805b614a38836152f5565b15614b425780614a5d57614a53614a4e84615316565b615364565b60ff168452614b3a565b8060011415614a7c57614a72614a4e84615316565b6020850152614b3a565b8060021415614aa957614a96614a9184615316565b615419565b6001600160a01b03166040850152614b3a565b8060031415614ac857614abe614a4e84615316565b6060850152614b3a565b8060041415614ae757614add614a4e84615316565b6080850152614b3a565b8060051415614b0957614afc614a4e84615316565b60ff1660a0850152614b3a565b8060061415614b3557614b1e614a4e84615316565b6001600160401b031660c085015260019150614b3a565b614b42565b600101614a2f565b5091935090915050915091565b600082614b5e57506000611431565b82820282848281614b6b57fe5b0414610eda5760405162461bcd60e51b8152600401808060200182810382526021815260200180615b3f6021913960400191505060405180910390fd5b60008184841115614c375760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bfc578181015183820152602001614be4565b50505050905090810190601f168015614c295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c8e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bfc578181015183820152602001614be4565b506000838581614c9a57fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610eda81615433565b6060611431614cd583615489565b615433565b6060815160001415614cfb57506040805160008152602081019091526115c5565b606082600081518110614d0a57fe5b602002602001015190506000600190505b8351811015614d4b57614d4182858381518110614d3457fe5b602002602001015161556f565b9150600101614d1b565b50610eda614d5e825160c060ff166155ec565b8261556f565b8151600090839060081080614d7a575080516002115b15614d89576000915050611431565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614dbd57fe5b6020910101516001600160f81b031916602d60f81b14614de257600092505050611431565b600160005b8351811015614e4257828181518110614dfc57fe5b602001015160f81c60f81b6001600160f81b031916848281518110614e1d57fe5b01602001516001600160f81b03191614614e3a5760009150614e42565b600101614de7565b5095945050505050565b614e546158b4565b6000614e5e6158b4565b614e666159a7565b614e72614a2486615286565b90506000805b614e81836152f5565b15614b425780614ea757614e97614a9184615316565b6001600160a01b03168452614f51565b8060011415614ecf57614ebc614a9184615316565b6001600160a01b03166020850152614f51565b8060021415614ef157614ee4614a4e84615316565b60ff166040850152614f51565b8060031415614f1057614f06614a4e84615316565b6060850152614f51565b8060041415614f2f57614f25614a4e84615316565b6080850152614f51565b8060051415614b3557614f44614a4e84615316565b60ff1660a0850152600191505b600101614e78565b614f61615980565b6000614f6b615980565b614f736159a7565b614f7f614a2486615286565b90506000805b614f8e836152f5565b15614b425780614fb457614fa4614a9184615316565b6001600160a01b0316845261501d565b8060011415614fdc57614fc9614a9184615316565b6001600160a01b0316602085015261501d565b8060021415614ffb57614ff1614a4e84615316565b604085015261501d565b8060031415614b3557615010614a4e84615316565b60ff166060850152600191505b600101614f85565b61502d61593c565b600061503761593c565b61503f6159a7565b61504b614a2486615286565b90506000805b61505a836152f5565b15614b42578061508057615070614a9184615316565b6001600160a01b0316845261516e565b80600114156150a857615095614a9184615316565b6001600160a01b0316602085015261516e565b80600214156150c7576150bd614a4e84615316565b604085015261516e565b80600314156150e6576150dc614a4e84615316565b606085015261516e565b8060041415615105576150fb614a4e84615316565b608085015261516e565b80600514156151275761511a614a4e84615316565b60ff1660a085015261516e565b80600614156151465761513c614a4e84615316565b60c085015261516e565b8060071415614b355761515b614a4e84615316565b6001600160401b031660e0850152600191505b600101615051565b61517e6158b4565b60006151886158b4565b6151906159a7565b61519c614a2486615286565b90506000805b6151ab836152f5565b15614b4257806151d1576151c1614a9184615316565b6001600160a01b0316845261527e565b80600114156151f9576151e6614a9184615316565b6001600160a01b0316602085015261527e565b80600214156152185761520e614a4e84615316565b604085015261527e565b80600314156152375761522d614a4e84615316565b606085015261527e565b80600414156152565761524c614a4e84615316565b608085015261527e565b8060051415614b355761526b614a4e84615316565b6001600160401b031660a0850152600191505b6001016151a2565b61528e6159c7565b506040805180820190915281518152602082810190820152919050565b6152b36159a7565b6152bc826156e4565b6152c557600080fd5b60006152d4836020015161571e565b60208085015160408051808201909152868152920190820152915050919050565b60006152ff6159c7565b505080518051602091820151919092015191011190565b61531e6159c7565b615327826152f5565b61533057600080fd5b6020820151600061534082615781565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061537957508151602110155b61538257600080fd5b6000615391836020015161571e565b905080836000015110156153ec576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a5957506020919091036101000a90049392505050565b805160009060151461542a57600080fd5b61143182615364565b6060815160011480156154655750607f60f81b8260008151811061545357fe5b01602001516001600160f81b03191611155b156154715750806115c5565b6114316154838351608060ff166155ec565b8361556f565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166154cd575060186154f1565b6fffffffffffffffffffffffffffffffff1984166154ed575060106154f1565b5060005b60208110156155275781818151811061550657fe5b01602001516001600160f81b0319161561551f57615527565b6001016154f1565b60008160200390506060816040519080825280601f01601f19166020018201604052801561555c576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b818310156155a0578051835260209283019201615588565b50855184518101855292509050808201602086015b818310156155cd5780518352602092830192016155b5565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061563c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116156965782840160f81b8160008151811061567857fe5b60200101906001600160f81b031916908160001a9053509050611431565b60606156a185615489565b90508381510160370160f81b826000815181106156ba57fe5b60200101906001600160f81b031916908160001a9053506156db828261556f565b95945050505050565b80516000906156f5575060006115c5565b6020820151805160001a9060c0821015615714576000925050506115c5565b5060019392505050565b8051600090811a60808110156157385760009150506115c5565b60b8811080615753575060c08110801590615753575060f881105b156157625760019150506115c5565b60c08110156157765760b5190190506115c5565b60f5190190506115c5565b80516000908190811a608081101561579c57600191506158ad565b60b88110156157b157607e19810191506158ad565b60c081101561582b57600060b78203600186019550806020036101000a865104915060018101820193505080831015615825576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506158ad565b60f88110156158405760be19810191506158ad565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156158ab576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b60405180604001604052806159ba6159c7565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a264697066735822122007d4017570910928573077240d411c54e819b9b077eb568ff17cd428af43ee2664736f6c63430006040033" }, "0x0000000000000000000000000000000000002000": { "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106103995760003560e01c8063718a8aa8116101e9578063c27cdcfb1161010f578063dc927faf116100ad578063f7a251d71161007c578063f7a251d714610b2f578063f9a2bbc714610ba7578063fc3e590814610baf578063fd6a687914610bb757610399565b8063dc927faf14610af7578063e1c7392a14610aff578063e3b0480514610b07578063e6400bbe14610b2757610399565b8063ccc108d7116100e9578063ccc108d714610ab0578063d31f968d14610ab8578063d76a867514610ae7578063dc40433114610aef57610399565b8063c27cdcfb14610a80578063c780e9de14610aa0578063c81b166214610aa857610399565b80638cc8f56111610187578063a78abc1611610156578063a78abc16146109b2578063ab51bb96146109ba578063ac431751146109c2578063b0355f5b1461078157610399565b80638cc8f5611461088757806396713da91461099a5780639dc09262146109a2578063a1a11bf5146109aa57610399565b806375d47a0a116101c357806375d47a0a146108a75780637942fd05146108af57806384013b6a146108b7578063863fe4ab1461099257610399565b8063718a8aa81461088f578063719482d51461089757806374f079b81461089f57610399565b8063422f9050116102ce57806363e1394e1161026c5780636de380bd1161023b5780636de380bd146108575780636e47a51a1461085f5780636e47b4821461087f57806370fd5bad1461088757610399565b806363e1394e146107ff5780636a3cb34d146108075780636bacff2c1461080f5780636c46aa681461080757610399565b80634bf6c882116102a85780634bf6c882146107b957806351e80672146107c15780635692ddd3146107c95780635f832177146107d157610399565b8063422f90501461078957806343756e5c146107a9578063493279b1146107b157610399565b8063299b533d1161033b578063308325f411610315578063308325f4146106155780633a648b151461061d5780633bdc47a6146106595780633dffc3871461078157610399565b8063299b533d146105a35780632af6f399146105d75780632ff32aea146105f457610399565b806314b3023b1161037757806314b3023b146104015780631d1309351461041b5780631e275ae11461043757806322556cdc1461059b57610399565b806305e682581461039e5780630bee7a67146103bc5780630e2374a5146103dd575b600080fd5b6103a6610bbf565b6040805160ff9092168252519081900360200190f35b6103c4610bc4565b6040805163ffffffff9092168252519081900360200190f35b6103e5610bc9565b604080516001600160a01b039092168252519081900360200190f35b610409610bcf565b60408051918252519081900360200190f35b610423610bd5565b604080519115158252519081900360200190f35b610599600480360361010081101561044e57600080fd5b81018160a081016080820135600160201b81111561046b57600080fd5b82018360208201111561047d57600080fd5b803590602001918460018302840111600160201b8311171561049e57600080fd5b919390929091602081019035600160201b8111156104bb57600080fd5b8201836020820111156104cd57600080fd5b803590602001918460018302840111600160201b831117156104ee57600080fd5b919390929091602081019035600160201b81111561050b57600080fd5b82018360208201111561051d57600080fd5b803590602001918460018302840111600160201b8311171561053e57600080fd5b919390929091602081019035600160201b81111561055b57600080fd5b82018360208201111561056d57600080fd5b803590602001918460018302840111600160201b8311171561058e57600080fd5b509092509050610bde565b005b6104096112c2565b6105c0600480360360208110156105b957600080fd5b50356112c7565b6040805161ffff9092168252519081900360200190f35b610423600480360360208110156105ed57600080fd5b50356112dd565b6105fc6112f2565b60408051600792830b90920b8252519081900360200190f35b6104096112fb565b61063d6004803603602081101561063357600080fd5b503560ff16611301565b604080516001600160401b039092168252519081900360200190f35b61070c6004803603606081101561066f57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561069857600080fd5b8201836020820111156106aa57600080fd5b803590602001918460018302840111600160201b831117156106cb57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061131c945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561074657818101518382015260200161072e565b50505050905090810190601f1680156107735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103a6611392565b6104236004803603602081101561079f57600080fd5b503560ff16611397565b6103e56113ac565b6105c06113b2565b6103a66113b8565b6103e56113bd565b6104096113c3565b610599600480360360408110156107e757600080fd5b506001600160a01b03813581169160200135166113f3565b610409611653565b6105c061167b565b61082c6004803603602081101561082557600080fd5b5035611680565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b6104096116af565b6103e56004803603602081101561087557600080fd5b503560ff166116d6565b6103e56116f1565b6103a661167b565b6103a66116f7565b6105c0611392565b6104096116fc565b6103e5611702565b6103a6611708565b610599600480360360a08110156108cd57600080fd5b810190602081018135600160201b8111156108e757600080fd5b8201836020820111156108f957600080fd5b803590602001918460018302840111600160201b8311171561091a57600080fd5b919390929091602081019035600160201b81111561093757600080fd5b82018360208201111561094957600080fd5b803590602001918460018302840111600160201b8311171561096a57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff1661170d565b6104096129c7565b6103a66129cf565b6103e56129d4565b6103e56129da565b6104236129e0565b6103c4610bbf565b610599600480360360408110156109d857600080fd5b810190602081018135600160201b8111156109f257600080fd5b820183602082011115610a0457600080fd5b803590602001918460018302840111600160201b83111715610a2557600080fd5b919390929091602081019035600160201b811115610a4257600080fd5b820183602082011115610a5457600080fd5b803590602001918460018302840111600160201b83111715610a7557600080fd5b5090925090506129e9565b61063d60048036036020811015610a9657600080fd5b503560ff166134ad565b6104096134c8565b6103e56134ec565b6105996134f2565b61042360048036036040811015610ace57600080fd5b5080356001600160a01b0316906020013560ff16613746565b61070c613766565b610409613785565b6103e561378b565b610599613791565b61063d60048036036020811015610b1d57600080fd5b503560ff16613b48565b610599613b63565b61059960048036036060811015610b4557600080fd5b60ff8235169190810190604081016020820135600160201b811115610b6957600080fd5b820183602082011115610b7b57600080fd5b803590602001918460018302840111600160201b83111715610b9c57600080fd5b919350915035613d82565b6103e5613ec5565b6103a6613ecb565b6103e5613ed0565b600081565b606481565b61200181565b60015481565b600b5460ff1681565b60005460ff16610c23576040805162461bcd60e51b815260206004820152601960248201526000805160206149b4833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b158015610c6e57600080fd5b505afa158015610c82573d6000803e3d6000fd5b505050506040513d6020811015610c9857600080fd5b5051610cd55760405162461bcd60e51b81526004018080602001828103825260238152602001806149d46023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610d2157600080fd5b505afa158015610d35573d6000803e3d6000fd5b505050506040513d6020811015610d4b57600080fd5b5051610d885760405162461bcd60e51b81526004018080602001828103825260238152602001806149d46023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610e01576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610e45576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b8888604051808383808284376040519201829003822094508f93508e9250819050838380828437808301925050509250505060405180910390201415610ec1576040805162461bcd60e51b815260206004820152600c60248201526b1cd85b59481c185e5b1bd85960a21b604482015290519081900360640190fd5b60606001600160401b0360408e01358116908e83013516610ee28282613ed6565b80516020808301919091206000818152600e9092526040909120549194509060ff1615610f4b576040805162461bcd60e51b8152602060048201526012602482015271185b1c9958591e4818da185b1b195b99d95960721b604482015290519081900360640190fd5b6000908152600e60205260408120805460ff191660011790558f8160200201356001600160401b0316905060608f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b15801561104157600080fd5b505afa158015611055573d6000803e3d6000fd5b505050506040513d602081101561106b57600080fd5b505160408051808201909152600381526269626360e81b6020820152909150611098908290898686613f1e565b6110e1576040805162461bcd60e51b81526020600482015260156024820152740696e76616c6964206d65726b6c652070726f6f663605c1b604482015290519081900360640190fd5b5050505060008f6001600481106110f457fe5b60200201356001600160401b0316905060608d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815293945060609392508d91508c908190840183828082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b1580156111c057600080fd5b505afa1580156111d4573d6000803e3d6000fd5b505050506040513d60208110156111ea57600080fd5b505160408051808201909152600381526269626360e81b6020820152909150611217908290898686613f1e565b611260576040805162461bcd60e51b8152602060048201526015602482015274696e76616c6964206d65726b6c652070726f6f663160581b604482015290519081900360640190fd5b5050505061126c61401b565b604080516001600160401b038416815260ff83166020820152815133927f039eb91179ffd7d3b6e97f8ea106e748e827f910b872375dbc9c14a362319c3c928290030190a2505050505050505050505050505050565b603281565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015611354576020820181803683370190505b506021810186905260018101879052828152905060418101600061137786614099565b509050611386818388516140a3565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b6102ca81565b600881565b61200081565b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b8152905190819003601801902081565b60005460ff16611438576040805162461bcd60e51b815260206004820152601960248201526000805160206149b4833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561147b57600080fd5b505afa15801561148f573d6000803e3d6000fd5b505050506040513d60208110156114a557600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156114e657600080fd5b505afa1580156114fa573d6000803e3d6000fd5b505050506040513d602081101561151057600080fd5b505190508061151d575060155b60008211801561152d5750808211155b61156c576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b604080516001600160a01b038087166020808401919091529086168284015282518083038401815260608301808552815191909201207710d05390d15317d514905394d1915497d41493d413d4d05360421b90915291519081900360780190206000906115d990836140e4565b9050801561164b5760408051630911a2c160e11b81526001600160a01b03888116600483015287166024820152905161100491631223458291604480830192600092919082900301818387803b15801561163257600080fd5b505af1158015611646573d6000803e3d6000fd5b505050505b505050505050565b604080516f14d554d411539117d41493d413d4d05360821b8152905190819003601001902081565b600281565b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f01902081565b6005602052600090815260409020546001600160a01b031681565b61100581565b601081565b60035481565b61100881565b600b81565b60005460ff16611752576040805162461bcd60e51b815260206004820152601960248201526000805160206149b4833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561179157600080fd5b505afa1580156117a5573d6000803e3d6000fd5b505050506040513d60208110156117bb57600080fd5b505161180e576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b03908116908316811461187e576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b1580156118f357600080fd5b505afa158015611907573d6000803e3d6000fd5b505050506040513d602081101561191d57600080fd5b505161195a5760405162461bcd60e51b81526004018080602001828103825260238152602001806149d46023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b03166119c4576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b039081169083161015611a2d576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614611a7f5760ff81166000908152600a60205260409020805467ffffffffffffffff19166001600160401b0384161790555b600b5460ff1615611ac3576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b60608e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050611c076110036001600160a01b031663cba510a98e6040518263ffffffff1660e01b815260040180826001600160401b03166001600160401b0316815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b505160408051808201909152600381526269626360e81b6020820152611c008e8e613ed6565b8585613f1e565b611c4f576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038e16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015611c9b57600080fd5b505afa158015611caf573d6000803e3d6000fd5b505050506040513d6020811015611cc557600080fd5b505190508b8b600080806060611cda896143c9565b935093509350935083611d9c578460ff16866001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d54578181015183820152602001611d3c565b50505050905090810190601f168015611d815780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050506129b7565b6040805160ff85811682529151918716916001600160401b038916917f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad40919081900360200190a360ff83166123215760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015611e69578181015183820152602001611e51565b50505050905090810190601f168015611e965780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015611eb657600080fd5b505af1925050508015611f9a57506040513d6000823e601f3d908101601f191682016040526020811015611ee957600080fd5b8101908080516040519392919084600160201b821115611f0857600080fd5b908301906020820185811115611f1d57600080fd5b8251600160201b811182820188101715611f3657600080fd5b82525081516020918201929091019080838360005b83811015611f63578181015183820152602001611f4b565b50505050905090810190601f168015611f905780820380516001836020036101000a031916815260200191505b5060405250505060015b6122ac576040516000815260443d1015611fb657506000612051565b60046000803e60005160e01c6308c379a08114611fd7576000915050612051565b60043d036004833e81513d60248201116001600160401b038211171561200257600092505050612051565b80830180516001600160401b03811115612023576000945050505050612051565b8060208301013d860181111561204157600095505050505050612051565b601f01601f191660405250925050505b8061205c575061216e565b60ff8716600090815260076020526040812054612093916001600160401b0390911690899061208e906002908861131c565b614479565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b8381101561212e578181015183820152602001612116565b50505050905090810190601f16801561215b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506122a7565b3d808015612198576040519150601f19603f3d011682016040523d82523d6000602084013e61219d565b606091505b5060ff87166000908152600760205260408120546121d0916001600160401b0390911690899061208e906002908861131c565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561226b578181015183820152602001612253565b50505050905090810190601f1680156122985780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b61231b565b8051156123195760ff87166000908152600760205260408120546122e5916001600160401b0390911690899061208e906001908661131c565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506128ef565b60ff8316600114156125c55760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b838110156123ab578181015183820152602001612393565b50505050905090810190601f1680156123d85780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156123f857600080fd5b505af1925050508015612409575060015b61231b576040516000815260443d1015612425575060006124c0565b60046000803e60005160e01c6308c379a081146124465760009150506124c0565b60043d036004833e81513d60248201116001600160401b0382111715612471576000925050506124c0565b80830180516001600160401b038111156124925760009450505050506124c0565b8060208301013d86018111156124b0576000955050505050506124c0565b601f01601f191660405250925050505b806124cb5750612530565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf938693909283928301918501908083836000831561212e578181015183820152602001612116565b3d80801561255a576040519150601f19603f3d011682016040523d82523d6000602084013e61255f565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561226b578181015183820152602001612253565b60ff8316600214156128ef5760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b8381101561264f578181015183820152602001612637565b50505050905090810190601f16801561267c5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561269c57600080fd5b505af19250505080156126ad575060015b6128ed576040516000815260443d10156126c957506000612764565b60046000803e60005160e01c6308c379a081146126ea576000915050612764565b60043d036004833e81513d60248201116001600160401b038211171561271557600092505050612764565b80830180516001600160401b03811115612736576000945050505050612764565b8060208301013d860181111561275457600095505050505050612764565b601f01601f191660405250925050505b8061276f5750612818565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127d85781810151838201526020016127c0565b50505050905090810190601f1680156128055780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506128ed565b3d808015612842576040519150601f19603f3d011682016040523d82523d6000602084013e612847565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b838110156128b1578181015183820152602001612899565b50505050905090810190601f1680156128de5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e6918a91339187911680612921575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b15801561298157600080fd5b505af1158015612995573d6000803e3d6000fd5b505050506040513d60208110156129ab57600080fd5b50505050505050505050505b5050505050505050505050505050565b630102ca0081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714612a295760405162461bcd60e51b815260040180806020018281038252602e81526020018061490a602e913960400191505060405180910390fd5b600b5460ff1615612a6d576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b612ad684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506146149050565b15612b7157604080516020601f8401819004810282018101909252828152600091612b19918585808385018382808284376000920191909152506146fb92505050565b90506127108111158015612b2e5750600a8110155b612b695760405162461bcd60e51b81526004018080602001828103825260328152602001806149826032913960400191505060405180910390fd5b60015561341b565b612bda84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506146149050565b15612d6257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050612c5d5760405162461bcd60e51b815260040180806020018281038252605a815260200180614823605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590612c7b81614700565b612ccc576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a3505050505061341b565b612dcf84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506146149050565b15612f0057606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050612e525760405162461bcd60e51b815260040180806020018281038252604a815260200180614938604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015612ef6576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b505050505061341b565b612f6484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c73757370656e6451756f72756d60981b602082015291506146149050565b156130995760028114612fa85760405162461bcd60e51b815260040180806020018281038252602d8152602001806148b1602d913960400191505060405180910390fd5b6000612feb600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506146fb92505050565b905060008161ffff16118015613005575060648161ffff16105b61304f576040805162461bcd60e51b8152602060048201526016602482015275696e76616c69642073757370656e642071756f72756d60501b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100190206000908152600d60205220805461ffff90921661ffff1990921691909117905561341b565b6130fc84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81526b72656f70656e51756f72756d60a01b602082015291506146149050565b1561322f57600281146131405760405162461bcd60e51b815260040180806020018281038252602c8152602001806148de602c913960400191505060405180910390fd5b6000613183600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506146fb92505050565b905060008161ffff1611801561319d575060648161ffff16105b6131e6576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642072656f70656e2071756f72756d60581b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152815190819003600f0190206000908152600d60205220805461ffff90921661ffff1990921691909117905561341b565b61329a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601481527363616e63656c5472616e7366657251756f72756d60601b602082015291506146149050565b156133de57600281146132de5760405162461bcd60e51b815260040180806020018281038252603481526020018061487d6034913960400191505060405180910390fd5b6000613321600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506146fb92505050565b905060008161ffff1611801561333b575060648161ffff16105b61338c576040805162461bcd60e51b815260206004820152601e60248201527f696e76616c69642063616e63656c207472616e736665722071756f72756d0000604482015290519081900360640190fd5b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b815281519081900360180190206000908152600d60205220805461ffff90921661ffff1990921691909117905561341b565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081565b61100281565b60005460ff16613537576040805162461bcd60e51b815260206004820152601960248201526000805160206149b4833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561357a57600080fd5b505afa15801561358e573d6000803e3d6000fd5b505050506040513d60208110156135a457600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156135e557600080fd5b505afa1580156135f9573d6000803e3d6000fd5b505050506040513d602081101561360f57600080fd5b505190508061361c575060155b60008211801561362c5750808211155b61366b576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff166136b2576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f019020600090613703907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706140e4565b9050801561374157600b805460ff1916905560405133907f899fe8c37dc61708a3aaa99c4bf143346c1d1da69af79be9e8920c0a6785b75290600090a25b505050565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b610e1081565b61100381565b60005460ff16156137e9576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16613ba8576040805162461bcd60e51b815260206004820152601960248201526000805160206149b4833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015613beb57600080fd5b505afa158015613bff573d6000803e3d6000fd5b505050506040513d6020811015613c1557600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015613c5657600080fd5b505afa158015613c6a573d6000803e3d6000fd5b505050506040513d6020811015613c8057600080fd5b5051905080613c8d575060155b600082118015613c9d5750808211155b613cdc576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff1615613d20576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b81529051908190036010019020600090613d72907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706140e4565b905080156137415761374161401b565b60005460ff16613dc7576040805162461bcd60e51b815260206004820152601960248201526000805160206149b4833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116613e245760405162461bcd60e51b81526004018080602001828103825260318152602001806147f26031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b031692613e899284928a9261208e92909189918c908c908190840183828082843760009201919091525061131c92505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b60408051600e808252818301909252606091630102ca0060ff851617918391602082018180368337505050600e81810187905260068201939093529182525090505b92915050565b600085613f2d57506000614012565b606082518451865160800101016040519080825280601f01601f191660200182016040528015613f64576020820181803683370190505b5090506000613f7282614706565b602080890151825201905086600080613f8a89614099565b8086526020909501949092509050613fa38285836140a3565b92830192613fb088614099565b8086526020909501949092509050613fc98285836140a3565b9283018a815260200192613fdc87614099565b9092509050613fec8285836140a3565b508351602001613ffa61470c565b60208183886065600019fa5051600114955050505050505b95945050505050565b600b5460ff161561405f576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b600b805460ff1916600117905560405133907f6f123d3d54c84a7960a573b31c221dcd86e13fd849c5adb0c6ca851468cc1ae490600090a2565b8051602090910191565b5b602081106140c3578251825260209283019290910190601f19016140a4565b915181516020939093036101000a6000190180199091169216919091179052565b6000828152600d602052604081205461ffff166141ad57604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100181206000908152600d6020818152848320805461ffff199081166001179091556e149153d4115397d41493d413d4d053608a1b8552855194859003600f01852084528282528584208054821660029081179091557710d05390d15317d514905394d1915497d41493d413d4d05360421b8652865195869003601801909520845291905292902080549092161790555b6000838152600c6020526040902080546201000090046001600160801b0316421015806141de575082816001015414155b156142b1576000848152600d602090815260409182902054835461ffff90911661ffff199091161771ffffffffffffffffffffffffffffffff0000191662010000610e1042016001600160801b031602178355600180840186905582519182019092523381526142539160028401919061472a565b5080546040805161ffff83168152620100009092046001600160801b0316602083015281810185905251339186917f9e109f0e55ef32e99e4880be2ec357f1ddb3469c79d0747ef4762da6e89fabe5916060908290030190a3614365565b60005b600282015481101561433c57336001600160a01b03168260020182815481106142d957fe5b6000918252602090912001546001600160a01b03161415614334576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001016142b4565b50600281018054600181018255600091825260209091200180546001600160a01b031916331790555b8054600282015461ffff909116116143bf576000848152600c60205260408120805471ffffffffffffffffffffffffffffffffffff1916815560018101829055906143b3600283018261478f565b50506001915050613f18565b5060009392505050565b600080600060606021855110156143f9575050604080516000808252602082019092529092508291508190614472565b600185015160218601518651604080516020198301808252601f1960011990940193909316810160200190915260418901939291606091908015614444576020820181803683370190505b509050600061445282614099565b509050614464858260218d51036140a3565b506001975091955093509150505b9193509193565b600b5460ff16156144bd576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6002544311156144fc576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003554360025561453d565b6003805460019081019182905554101561453d576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe6102ca85604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156145d45781810151838201526020016145bc565b50505050905090810190601f1680156146015780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106146495780518252601f19909201916020918201910161462a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106146b75780518252601f199092019160209182019101614698565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b60405180602001604052806001906020820280368337509192915050565b82805482825590600052602060002090810192821561477f579160200282015b8281111561477f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061474a565b5061478b9291506147b0565b5090565b50805460008255906000526020600020908101906147ad91906147d7565b50565b6147d491905b8082111561478b5780546001600160a01b03191681556001016147b6565b90565b6147d491905b8082111561478b57600081556001016147dd56fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c6572416464726573736c656e677468206f662076616c756520666f722063616e63656c5472616e7366657251756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722073757370656e6451756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722072656f70656e51756f72756d2073686f756c642062652032746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d74686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a164736f6c6343000604000a" + "code": "0x608060405234801561001057600080fd5b50600436106103995760003560e01c8063718a8aa8116101e9578063c27cdcfb1161010f578063dc927faf116100ad578063f7a251d71161007c578063f7a251d714610b2f578063f9a2bbc714610ba7578063fc3e590814610baf578063fd6a687914610bb757610399565b8063dc927faf14610af7578063e1c7392a14610aff578063e3b0480514610b07578063e6400bbe14610b2757610399565b8063ccc108d7116100e9578063ccc108d714610ab0578063d31f968d14610ab8578063d76a867514610ae7578063dc40433114610aef57610399565b8063c27cdcfb14610a80578063c780e9de14610aa0578063c81b166214610aa857610399565b80638cc8f56111610187578063a78abc1611610156578063a78abc16146109b2578063ab51bb96146109ba578063ac431751146109c2578063b0355f5b1461078157610399565b80638cc8f5611461088757806396713da91461099a5780639dc09262146109a2578063a1a11bf5146109aa57610399565b806375d47a0a116101c357806375d47a0a146108a75780637942fd05146108af57806384013b6a146108b7578063863fe4ab1461099257610399565b8063718a8aa81461088f578063719482d51461089757806374f079b81461089f57610399565b8063422f9050116102ce57806363e1394e1161026c5780636de380bd1161023b5780636de380bd146108575780636e47a51a1461085f5780636e47b4821461087f57806370fd5bad1461088757610399565b806363e1394e146107ff5780636a3cb34d146108075780636bacff2c1461080f5780636c46aa681461080757610399565b80634bf6c882116102a85780634bf6c882146107b957806351e80672146107c15780635692ddd3146107c95780635f832177146107d157610399565b8063422f90501461078957806343756e5c146107a9578063493279b1146107b157610399565b8063299b533d1161033b578063308325f411610315578063308325f4146106155780633a648b151461061d5780633bdc47a6146106595780633dffc3871461078157610399565b8063299b533d146105a35780632af6f399146105d75780632ff32aea146105f457610399565b806314b3023b1161037757806314b3023b146104015780631d1309351461041b5780631e275ae11461043757806322556cdc1461059b57610399565b806305e682581461039e5780630bee7a67146103bc5780630e2374a5146103dd575b600080fd5b6103a6610bbf565b6040805160ff9092168252519081900360200190f35b6103c4610bc4565b6040805163ffffffff9092168252519081900360200190f35b6103e5610bc9565b604080516001600160a01b039092168252519081900360200190f35b610409610bcf565b60408051918252519081900360200190f35b610423610bd5565b604080519115158252519081900360200190f35b610599600480360361010081101561044e57600080fd5b81018160a081016080820135600160201b81111561046b57600080fd5b82018360208201111561047d57600080fd5b803590602001918460018302840111600160201b8311171561049e57600080fd5b919390929091602081019035600160201b8111156104bb57600080fd5b8201836020820111156104cd57600080fd5b803590602001918460018302840111600160201b831117156104ee57600080fd5b919390929091602081019035600160201b81111561050b57600080fd5b82018360208201111561051d57600080fd5b803590602001918460018302840111600160201b8311171561053e57600080fd5b919390929091602081019035600160201b81111561055b57600080fd5b82018360208201111561056d57600080fd5b803590602001918460018302840111600160201b8311171561058e57600080fd5b509092509050610bde565b005b6104096112c2565b6105c0600480360360208110156105b957600080fd5b50356112c7565b6040805161ffff9092168252519081900360200190f35b610423600480360360208110156105ed57600080fd5b50356112dd565b6105fc6112f2565b60408051600792830b90920b8252519081900360200190f35b6104096112fb565b61063d6004803603602081101561063357600080fd5b503560ff16611301565b604080516001600160401b039092168252519081900360200190f35b61070c6004803603606081101561066f57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561069857600080fd5b8201836020820111156106aa57600080fd5b803590602001918460018302840111600160201b831117156106cb57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061131c945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561074657818101518382015260200161072e565b50505050905090810190601f1680156107735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103a6611392565b6104236004803603602081101561079f57600080fd5b503560ff16611397565b6103e56113ac565b6105c06113b2565b6103a66113b7565b6103e56113bc565b6104096113c2565b610599600480360360408110156107e757600080fd5b506001600160a01b03813581169160200135166113f2565b610409611652565b6105c061167a565b61082c6004803603602081101561082557600080fd5b503561167f565b6040805161ffff90941684526001600160801b03909216602084015282820152519081900360600190f35b6104096116ae565b6103e56004803603602081101561087557600080fd5b503560ff166116d5565b6103e56116f0565b6103a661167a565b6103a66116f6565b6105c0611392565b6104096116fb565b6103e5611701565b6103a6611707565b610599600480360360a08110156108cd57600080fd5b810190602081018135600160201b8111156108e757600080fd5b8201836020820111156108f957600080fd5b803590602001918460018302840111600160201b8311171561091a57600080fd5b919390929091602081019035600160201b81111561093757600080fd5b82018360208201111561094957600080fd5b803590602001918460018302840111600160201b8311171561096a57600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff1661170c565b6104096129c6565b6103a66129ce565b6103e56129d3565b6103e56129d9565b6104236129df565b6103c4610bbf565b610599600480360360408110156109d857600080fd5b810190602081018135600160201b8111156109f257600080fd5b820183602082011115610a0457600080fd5b803590602001918460018302840111600160201b83111715610a2557600080fd5b919390929091602081019035600160201b811115610a4257600080fd5b820183602082011115610a5457600080fd5b803590602001918460018302840111600160201b83111715610a7557600080fd5b5090925090506129e8565b61063d60048036036020811015610a9657600080fd5b503560ff166134ac565b6104096134c7565b6103e56134eb565b6105996134f1565b61042360048036036040811015610ace57600080fd5b5080356001600160a01b0316906020013560ff16613745565b61070c613765565b610409613784565b6103e561378a565b610599613790565b61063d60048036036020811015610b1d57600080fd5b503560ff16613b47565b610599613b62565b61059960048036036060811015610b4557600080fd5b60ff8235169190810190604081016020820135600160201b811115610b6957600080fd5b820183602082011115610b7b57600080fd5b803590602001918460018302840111600160201b83111715610b9c57600080fd5b919350915035613d81565b6103e5613ec4565b6103a6613eca565b6103e5613ecf565b600081565b606481565b61200181565b60015481565b600b5460ff1681565b60005460ff16610c23576040805162461bcd60e51b815260206004820152601960248201526000805160206149b2833981519152604482015290519081900360640190fd5b604080516337d7f9c160e21b81526001600160401b038b35166004820181905291516110039163df5fe704916024808301926020929190829003018186803b158015610c6e57600080fd5b505afa158015610c82573d6000803e3d6000fd5b505050506040513d6020811015610c9857600080fd5b5051610cd55760405162461bcd60e51b81526004018080602001828103825260238152602001806149d26023913960400191505060405180910390fd5b604080516337d7f9c160e21b815260208c8101356001600160401b03166004830181905292516110039263df5fe704926024808301939192829003018186803b158015610d2157600080fd5b505afa158015610d35573d6000803e3d6000fd5b505050506040513d6020811015610d4b57600080fd5b5051610d885760405162461bcd60e51b81526004018080602001828103825260238152602001806149d26023913960400191505060405180910390fd5b60608b013560ff81166000908152600560205260409020546001600160401b03909116906001600160a01b0316610e01576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b600b5460ff1615610e45576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b8888604051808383808284376040519201829003822094508f93508e9250819050838380828437808301925050509250505060405180910390201415610ec1576040805162461bcd60e51b815260206004820152600c60248201526b1cd85b59481c185e5b1bd85960a21b604482015290519081900360640190fd5b60606001600160401b0360408e01358116908e83013516610ee28282613ed5565b80516020808301919091206000818152600e9092526040909120549194509060ff1615610f4b576040805162461bcd60e51b8152602060048201526012602482015271185b1c9958591e4818da185b1b195b99d95960721b604482015290519081900360640190fd5b6000908152600e60205260408120805460ff191660011790558f8160200201356001600160401b0316905060608f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b15801561104157600080fd5b505afa158015611055573d6000803e3d6000fd5b505050506040513d602081101561106b57600080fd5b505160408051808201909152600381526269626360e81b6020820152909150611098908290898686613f1d565b6110e1576040805162461bcd60e51b81526020600482015260156024820152740696e76616c6964206d65726b6c652070726f6f663605c1b604482015290519081900360640190fd5b5050505060008f6001600481106110f457fe5b60200201356001600160401b0316905060608d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815293945060609392508d91508c908190840183828082843760009201829052506040805163cba510a960e01b81526001600160401b038a16600482015290519596509094611003945063cba510a9935060248083019350602092829003018186803b1580156111c057600080fd5b505afa1580156111d4573d6000803e3d6000fd5b505050506040513d60208110156111ea57600080fd5b505160408051808201909152600381526269626360e81b6020820152909150611217908290898686613f1d565b611260576040805162461bcd60e51b8152602060048201526015602482015274696e76616c6964206d65726b6c652070726f6f663160581b604482015290519081900360640190fd5b5050505061126c61401a565b604080516001600160401b038416815260ff83166020820152815133927f039eb91179ffd7d3b6e97f8ea106e748e827f910b872375dbc9c14a362319c3c928290030190a2505050505050505050505050505050565b603281565b600d6020526000908152604090205461ffff1681565b600e6020526000908152604090205460ff1681565b60045460070b81565b60025481565b600a602052600090815260409020546001600160401b031681565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015611354576020820181803683370190505b506021810186905260018101879052828152905060418101600061137786614098565b509050611386818388516140a2565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b606081565b600881565b61200081565b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b8152905190819003601801902081565b60005460ff16611437576040805162461bcd60e51b815260206004820152601960248201526000805160206149b2833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561147a57600080fd5b505afa15801561148e573d6000803e3d6000fd5b505050506040513d60208110156114a457600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156114e557600080fd5b505afa1580156114f9573d6000803e3d6000fd5b505050506040513d602081101561150f57600080fd5b505190508061151c575060155b60008211801561152c5750808211155b61156b576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b604080516001600160a01b038087166020808401919091529086168284015282518083038401815260608301808552815191909201207710d05390d15317d514905394d1915497d41493d413d4d05360421b90915291519081900360780190206000906115d890836140e3565b9050801561164a5760408051630911a2c160e11b81526001600160a01b03888116600483015287166024820152905161100491631223458291604480830192600092919082900301818387803b15801561163157600080fd5b505af1158015611645573d6000803e3d6000fd5b505050505b505050505050565b604080516f14d554d411539117d41493d413d4d05360821b8152905190819003601001902081565b600281565b600c602052600090815260409020805460019091015461ffff8216916201000090046001600160801b03169083565b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f01902081565b6005602052600090815260409020546001600160a01b031681565b61100581565b601081565b60035481565b61100881565b600b81565b60005460ff16611751576040805162461bcd60e51b815260206004820152601960248201526000805160206149b2833981519152604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561179057600080fd5b505afa1580156117a4573d6000803e3d6000fd5b505050506040513d60208110156117ba57600080fd5b505161180d576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b03908116908316811461187d576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b1580156118f257600080fd5b505afa158015611906573d6000803e3d6000fd5b505050506040513d602081101561191c57600080fd5b50516119595760405162461bcd60e51b81526004018080602001828103825260238152602001806149d26023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b03166119c3576040805162461bcd60e51b815260206004820152601860248201527718da185b9b995b081a5cc81b9bdd081cdd5c1c1bdc9d195960421b604482015290519081900360640190fd5b60ff86166000908152600a6020526040902054889087906001600160401b039081169083161015611a2c576040805162461bcd60e51b815260206004820152600e60248201526d3a37b79037b632103432b0b232b960911b604482015290519081900360640190fd5b60ff81166000908152600a60205260409020546001600160401b03838116911614611a7e5760ff81166000908152600a60205260409020805467ffffffffffffffff19166001600160401b0384161790555b600b5460ff1615611ac2576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b60608e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050611c066110036001600160a01b031663cba510a98e6040518263ffffffff1660e01b815260040180826001600160401b03166001600160401b0316815260200191505060206040518083038186803b158015611baf57600080fd5b505afa158015611bc3573d6000803e3d6000fd5b505050506040513d6020811015611bd957600080fd5b505160408051808201909152600381526269626360e81b6020820152611bff8e8e613ed5565b8585613f1d565b611c4e576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038e16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015611c9a57600080fd5b505afa158015611cae573d6000803e3d6000fd5b505050506040513d6020811015611cc457600080fd5b505190508b8b600080806060611cd9896143c8565b935093509350935083611d9b578460ff16866001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d53578181015183820152602001611d3b565b50505050905090810190601f168015611d805780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050506129b6565b6040805160ff85811682529151918716916001600160401b038916917f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad40919081900360200190a360ff83166123205760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015611e68578181015183820152602001611e50565b50505050905090810190601f168015611e955780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015611eb557600080fd5b505af1925050508015611f9957506040513d6000823e601f3d908101601f191682016040526020811015611ee857600080fd5b8101908080516040519392919084600160201b821115611f0757600080fd5b908301906020820185811115611f1c57600080fd5b8251600160201b811182820188101715611f3557600080fd5b82525081516020918201929091019080838360005b83811015611f62578181015183820152602001611f4a565b50505050905090810190601f168015611f8f5780820380516001836020036101000a031916815260200191505b5060405250505060015b6122ab576040516000815260443d1015611fb557506000612050565b60046000803e60005160e01c6308c379a08114611fd6576000915050612050565b60043d036004833e81513d60248201116001600160401b038211171561200157600092505050612050565b80830180516001600160401b03811115612022576000945050505050612050565b8060208301013d860181111561204057600095505050505050612050565b601f01601f191660405250925050505b8061205b575061216d565b60ff8716600090815260076020526040812054612092916001600160401b0390911690899061208d906002908861131c565b614478565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b8381101561212d578181015183820152602001612115565b50505050905090810190601f16801561215a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506122a6565b3d808015612197576040519150601f19603f3d011682016040523d82523d6000602084013e61219c565b606091505b5060ff87166000908152600760205260408120546121cf916001600160401b0390911690899061208d906002908861131c565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561226a578181015183820152602001612252565b50505050905090810190601f1680156122975780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b61231a565b8051156123185760ff87166000908152600760205260408120546122e4916001600160401b0390911690899061208d906001908661131c565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506128ee565b60ff8316600114156125c45760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b838110156123aa578181015183820152602001612392565b50505050905090810190601f1680156123d75780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156123f757600080fd5b505af1925050508015612408575060015b61231a576040516000815260443d1015612424575060006124bf565b60046000803e60005160e01c6308c379a081146124455760009150506124bf565b60043d036004833e81513d60248201116001600160401b0382111715612470576000925050506124bf565b80830180516001600160401b038111156124915760009450505050506124bf565b8060208301013d86018111156124af576000955050505050506124bf565b601f01601f191660405250925050505b806124ca575061252f565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf938693909283928301918501908083836000831561212d578181015183820152602001612115565b3d808015612559576040519150601f19603f3d011682016040523d82523d6000602084013e61255e565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561226a578181015183820152602001612252565b60ff8316600214156128ee5760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b8381101561264e578181015183820152602001612636565b50505050905090810190601f16801561267b5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561269b57600080fd5b505af19250505080156126ac575060015b6128ec576040516000815260443d10156126c857506000612763565b60046000803e60005160e01c6308c379a081146126e9576000915050612763565b60043d036004833e81513d60248201116001600160401b038211171561271457600092505050612763565b80830180516001600160401b03811115612735576000945050505050612763565b8060208301013d860181111561275357600095505050505050612763565b601f01601f191660405250925050505b8061276e5750612817565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127d75781810151838201526020016127bf565b50505050905090810190601f1680156128045780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506128ec565b3d808015612841576040519150601f19603f3d011682016040523d82523d6000602084013e612846565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b838110156128b0578181015183820152602001612898565b50505050905090810190601f1680156128dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e6918a91339187911680612920575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b15801561298057600080fd5b505af1158015612994573d6000803e3d6000fd5b505050506040513d60208110156129aa57600080fd5b50505050505050505050505b5050505050505050505050505050565b630100600081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714612a285760405162461bcd60e51b815260040180806020018281038252602e815260200180614908602e913960400191505060405180910390fd5b600b5460ff1615612a6c576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b612ad584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506146129050565b15612b7057604080516020601f8401819004810282018101909252828152600091612b18918585808385018382808284376000920191909152506146f992505050565b90506127108111158015612b2d5750600a8110155b612b685760405162461bcd60e51b81526004018080602001828103825260328152602001806149806032913960400191505060405180910390fd5b60015561341a565b612bd984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506146129050565b15612d6157606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050612c5c5760405162461bcd60e51b815260040180806020018281038252605a815260200180614821605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590612c7a816146fe565b612ccb576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a3505050505061341a565b612dce84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506146129050565b15612eff57606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050612e515760405162461bcd60e51b815260040180806020018281038252604a815260200180614936604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015612ef5576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b505050505061341a565b612f6384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c73757370656e6451756f72756d60981b602082015291506146129050565b156130985760028114612fa75760405162461bcd60e51b815260040180806020018281038252602d8152602001806148af602d913960400191505060405180910390fd5b6000612fea600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506146f992505050565b905060008161ffff16118015613004575060648161ffff16105b61304e576040805162461bcd60e51b8152602060048201526016602482015275696e76616c69642073757370656e642071756f72756d60501b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100190206000908152600d60205220805461ffff90921661ffff1990921691909117905561341a565b6130fb84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81526b72656f70656e51756f72756d60a01b602082015291506146129050565b1561322e576002811461313f5760405162461bcd60e51b815260040180806020018281038252602c8152602001806148dc602c913960400191505060405180910390fd5b6000613182600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506146f992505050565b905060008161ffff1611801561319c575060648161ffff16105b6131e5576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642072656f70656e2071756f72756d60581b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152815190819003600f0190206000908152600d60205220805461ffff90921661ffff1990921691909117905561341a565b61329984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601481527363616e63656c5472616e7366657251756f72756d60601b602082015291506146129050565b156133dd57600281146132dd5760405162461bcd60e51b815260040180806020018281038252603481526020018061487b6034913960400191505060405180910390fd5b6000613320600284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506146f992505050565b905060008161ffff1611801561333a575060648161ffff16105b61338b576040805162461bcd60e51b815260206004820152601e60248201527f696e76616c69642063616e63656c207472616e736665722071756f72756d0000604482015290519081900360640190fd5b604080517710d05390d15317d514905394d1915497d41493d413d4d05360421b815281519081900360180190206000908152600d60205220805461ffff90921661ffff1990921691909117905561341a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081565b61100281565b60005460ff16613536576040805162461bcd60e51b815260206004820152601960248201526000805160206149b2833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b15801561357957600080fd5b505afa15801561358d573d6000803e3d6000fd5b505050506040513d60208110156135a357600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b1580156135e457600080fd5b505afa1580156135f8573d6000803e3d6000fd5b505050506040513d602081101561360e57600080fd5b505190508061361b575060155b60008211801561362b5750808211155b61366a576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff166136b1576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081cdd5cdc195b991959609a1b604482015290519081900360640190fd5b604080516e149153d4115397d41493d413d4d053608a1b8152905190819003600f019020600090613702907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706140e3565b9050801561374057600b805460ff1916905560405133907f899fe8c37dc61708a3aaa99c4bf143346c1d1da69af79be9e8920c0a6785b75290600090a25b505050565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b610e1081565b61100381565b60005460ff16156137e8576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff16613ba7576040805162461bcd60e51b815260206004820152601960248201526000805160206149b2833981519152604482015290519081900360640190fd5b6040805163569e4ed360e11b815233600482015290516000916110009163ad3c9da691602480820192602092909190829003018186803b158015613bea57600080fd5b505afa158015613bfe573d6000803e3d6000fd5b505050506040513d6020811015613c1457600080fd5b505160408051633d42651560e11b8152905191925060009161100091637a84ca2a916004808301926020929190829003018186803b158015613c5557600080fd5b505afa158015613c69573d6000803e3d6000fd5b505050506040513d6020811015613c7f57600080fd5b5051905080613c8c575060155b600082118015613c9c5750808211155b613cdb576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818d8589a5b995d60aa1b604482015290519081900360640190fd5b600b5460ff1615613d1f576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b604080516f14d554d411539117d41493d413d4d05360821b81529051908190036010019020600090613d71907fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4706140e3565b905080156137405761374061401a565b60005460ff16613dc6576040805162461bcd60e51b815260206004820152601960248201526000805160206149b2833981519152604482015290519081900360640190fd5b33600090815260066020908152604080832060ff8089168552925290912054859116613e235760405162461bcd60e51b81526004018080602001828103825260318152602001806147f06031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b031692613e889284928a9261208d92909189918c908c908190840183828082843760009201919091525061131c92505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b60408051600e808252818301909252606091630100600060ff851617918391602082018180368337505050600e81810187905260068201939093529182525090505b92915050565b600085613f2c57506000614011565b606082518451865160800101016040519080825280601f01601f191660200182016040528015613f63576020820181803683370190505b5090506000613f7182614704565b602080890151825201905086600080613f8989614098565b8086526020909501949092509050613fa28285836140a2565b92830192613faf88614098565b8086526020909501949092509050613fc88285836140a2565b9283018a815260200192613fdb87614098565b9092509050613feb8285836140a2565b508351602001613ff961470a565b60208183886065600019fa5051600114955050505050505b95945050505050565b600b5460ff161561405e576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b600b805460ff1916600117905560405133907f6f123d3d54c84a7960a573b31c221dcd86e13fd849c5adb0c6ca851468cc1ae490600090a2565b8051602090910191565b5b602081106140c2578251825260209283019290910190601f19016140a3565b915181516020939093036101000a6000190180199091169216919091179052565b6000828152600d602052604081205461ffff166141ac57604080516f14d554d411539117d41493d413d4d05360821b815281519081900360100181206000908152600d6020818152848320805461ffff199081166001179091556e149153d4115397d41493d413d4d053608a1b8552855194859003600f01852084528282528584208054821660029081179091557710d05390d15317d514905394d1915497d41493d413d4d05360421b8652865195869003601801909520845291905292902080549092161790555b6000838152600c6020526040902080546201000090046001600160801b0316421015806141dd575082816001015414155b156142b0576000848152600d602090815260409182902054835461ffff90911661ffff199091161771ffffffffffffffffffffffffffffffff0000191662010000610e1042016001600160801b0316021783556001808401869055825191820190925233815261425291600284019190614728565b5080546040805161ffff83168152620100009092046001600160801b0316602083015281810185905251339186917f9e109f0e55ef32e99e4880be2ec357f1ddb3469c79d0747ef4762da6e89fabe5916060908290030190a3614364565b60005b600282015481101561433b57336001600160a01b03168260020182815481106142d857fe5b6000918252602090912001546001600160a01b03161415614333576040805162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48185c1c1c9bdd995960821b604482015290519081900360640190fd5b6001016142b3565b50600281018054600181018255600091825260209091200180546001600160a01b031916331790555b8054600282015461ffff909116116143be576000848152600c60205260408120805471ffffffffffffffffffffffffffffffffffff1916815560018101829055906143b2600283018261478d565b50506001915050613f17565b5060009392505050565b600080600060606021855110156143f8575050604080516000808252602082019092529092508291508190614471565b600185015160218601518651604080516020198301808252601f1960011990940193909316810160200190915260418901939291606091908015614443576020820181803683370190505b509050600061445182614098565b509050614463858260218d51036140a2565b506001975091955093509150505b9193509193565b600b5460ff16156144bc576040805162461bcd60e51b81526020600482015260096024820152681cdd5cdc195b99195960ba1b604482015290519081900360640190fd5b6002544311156144fb576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003554360025561453c565b6003805460019081019182905554101561453c576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe606085604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156145d25781810151838201526020016145ba565b50505050905090810190601f1680156145ff5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106146475780518252601f199092019160209182019101614628565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106146b55780518252601f199092019160209182019101614696565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b60405180602001604052806001906020820280368337509192915050565b82805482825590600052602060002090810192821561477d579160200282015b8281111561477d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614748565b506147899291506147ae565b5090565b50805460008255906000526020600020908101906147ab91906147d5565b50565b6147d291905b808211156147895780546001600160a01b03191681556001016147b4565b90565b6147d291905b8082111561478957600081556001016147db56fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c6572416464726573736c656e677468206f662076616c756520666f722063616e63656c5472616e7366657251756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722073757370656e6451756f72756d2073686f756c6420626520326c656e677468206f662076616c756520666f722072656f70656e51756f72756d2073686f756c642062652032746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d74686520636f6e7472616374206e6f7420696e697420796574000000000000006c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a2646970667358221220c03ca962d9bf090c5b9c0cdeaafc7052a749ac828aa3a1c6fe7e39a16dd02efb64736f6c63430006040033" }, "0x0000000000000000000000000000000000002001": { "balance": "0x0", - "code": "0x6080604052600436106103855760003560e01c806370fd5bad116101d1578063b88a802f11610102578063d7ecfcb6116100a0578063f9a2bbc71161006f578063f9a2bbc714610c40578063fa03f79714610c55578063fc3e590814610671578063fd6a687914610c6a5761038c565b8063d7ecfcb614610819578063dc927faf14610bd1578063edc1a5b014610be6578063f45fd80b14610bfb5761038c565b8063c2117d82116100dc578063c2117d8214610ae7578063c81b166214610afc578063c8509d8114610b11578063d61b9b9314610b965761038c565b8063b88a802f14610a82578063baaafd3b14610a97578063bf8546ca14610aac5761038c565b806396713da91161016f578063a78abc1611610149578063a78abc1614610964578063ab51bb961461098d578063ac431751146109a2578063b14315df14610a6d5761038c565b806396713da9146109255780639dc092621461093a578063a1a11bf51461094f5761038c565b806375d47a0a116101ab57806375d47a0a146108765780637942fd051461088b578063831d65d1146108a057806392b888a41461061d5761038c565b806370fd5bad14610819578063718a8aa81461082e57806375aca593146108435761038c565b80633fdfa7e4116102b6578063552aaf931161025457806369b635b61161022357806369b635b6146107865780636bd8f8041461079b5780636e47b482146107d15780636fb7f7eb146107e65761038c565b8063552aaf93146107325780635d17c8bd146107475780635d499b1b1461075c57806362b171d2146107715761038c565b8063493279b111610290578063493279b1146106b05780634bf6c882146106dc5780634d99dd16146106f157806351e806721461071d5761038c565b80633fdfa7e414610671578063413d9c3a1461068657806343756e5c1461069b5761038c565b806311fe9ec6116103235780632fdeb111116102fd5780632fdeb11114610632578063333ad3e71461064757806334c433541461065c5780633dffc3871461061d5761038c565b806311fe9ec6146105bf578063151817e3146105f257806317c9efb01461061d5761038c565b80630bee7a671161035f5780630bee7a67146104515780630c7957151461047f5780630e2374a5146104945780631182b875146104c55761038c565b8063026e402b1461039157806302985992146103bf578063047636d1146103e65761038c565b3661038c57005b600080fd5b6103bd600480360360408110156103a757600080fd5b506001600160a01b038135169060200135610c7f565b005b3480156103cb57600080fd5b506103d46111bc565b60408051918252519081900360200190f35b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b03166111c2565b6040518082606080838360005b8381101561043e578181015183820152602001610426565b5050505090500191505060405180910390f35b34801561045d57600080fd5b50610466611216565b6040805163ffffffff9092168252519081900360200190f35b34801561048b57600080fd5b506103d461121b565b3480156104a057600080fd5b506104a9611221565b604080516001600160a01b039092168252519081900360200190f35b3480156104d157600080fd5b5061054a600480360360408110156104e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561050c57600080fd5b82018360208201111561051e57600080fd5b803590602001918460018302840111600160201b8311171561053f57600080fd5b509092509050611227565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561058457818101518382015260200161056c565b50505050905090810190601f1680156105b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105cb57600080fd5b506103d4600480360360208110156105e257600080fd5b50356001600160a01b03166113e3565b3480156105fe57600080fd5b506106076113fe565b6040805160ff9092168252519081900360200190f35b34801561062957600080fd5b50610607611403565b34801561063e57600080fd5b506103d4611408565b34801561065357600080fd5b5061046661140e565b34801561066857600080fd5b506103d4611413565b34801561067d57600080fd5b5061060761141e565b34801561069257600080fd5b506103d4611423565b3480156106a757600080fd5b506104a961142a565b3480156106bc57600080fd5b506106c5611430565b6040805161ffff9092168252519081900360200190f35b3480156106e857600080fd5b50610607611436565b6103bd6004803603604081101561070757600080fd5b506001600160a01b03813516906020013561143b565b34801561072957600080fd5b506104a9611a63565b34801561073e57600080fd5b50610607611a69565b34801561075357600080fd5b506103d4611a6e565b34801561076857600080fd5b506103d4611a74565b34801561077d57600080fd5b506103d4611a7d565b34801561079257600080fd5b506103d4611c1d565b6103bd600480360360608110156107b157600080fd5b506001600160a01b03813581169160208101359091169060400135611c23565b3480156107dd57600080fd5b506104a961230c565b3480156107f257600080fd5b506103d46004803603602081101561080957600080fd5b50356001600160a01b0316612312565b34801561082557600080fd5b5061060761232d565b34801561083a57600080fd5b50610607612332565b34801561084f57600080fd5b506103d46004803603602081101561086657600080fd5b50356001600160a01b0316612337565b34801561088257600080fd5b506104a9612352565b34801561089757600080fd5b50610607612358565b3480156108ac57600080fd5b506103bd600480360360408110156108c357600080fd5b60ff8235169190810190604081016020820135600160201b8111156108e757600080fd5b8201836020820111156108f957600080fd5b803590602001918460018302840111600160201b8311171561091a57600080fd5b50909250905061235d565b34801561093157600080fd5b50610607612625565b34801561094657600080fd5b506104a961262a565b34801561095b57600080fd5b506104a9612630565b34801561097057600080fd5b50610979612636565b604080519115158252519081900360200190f35b34801561099957600080fd5b50610466611a69565b3480156109ae57600080fd5b506103bd600480360360408110156109c557600080fd5b810190602081018135600160201b8111156109df57600080fd5b8201836020820111156109f157600080fd5b803590602001918460018302840111600160201b83111715610a1257600080fd5b919390929091602081019035600160201b811115610a2f57600080fd5b820183602082011115610a4157600080fd5b803590602001918460018302840111600160201b83111715610a6257600080fd5b50909250905061263f565b348015610a7957600080fd5b50610607612dd1565b348015610a8e57600080fd5b506103d4612dd6565b348015610aa357600080fd5b506103d4612f73565b348015610ab857600080fd5b506103d460048036036040811015610acf57600080fd5b506001600160a01b0381358116916020013516612f7e565b348015610af357600080fd5b506103d4612fab565b348015610b0857600080fd5b506104a9612fb1565b348015610b1d57600080fd5b506103bd60048036036040811015610b3457600080fd5b60ff8235169190810190604081016020820135600160201b811115610b5857600080fd5b820183602082011115610b6a57600080fd5b803590602001918460018302840111600160201b83111715610b8b57600080fd5b509092509050612fb7565b348015610ba257600080fd5b506103d460048036036040811015610bb957600080fd5b506001600160a01b03813581169160200135166131da565b348015610bdd57600080fd5b506104a9613205565b348015610bf257600080fd5b506103d461320b565b348015610c0757600080fd5b506103d460048036036060811015610c1e57600080fd5b506001600160a01b038135811691602081013582169160409091013516613218565b348015610c4c57600080fd5b506104a961324d565b348015610c6157600080fd5b506103d4613253565b348015610c7657600080fd5b506104a9613259565b60105460ff1660021415610ccb576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610cf357506402540be4008106155b610d44576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16610d87576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b600354821015610dde576040805162461bcd60e51b815260206004820152601760248201527f696e76616c69642064656c656761746520616d6f756e74000000000000000000604482015290519081900360640190fd5b600154610df290839063ffffffff61325f16565b341015610e3d576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f756768206d73672076616c756560601b604482015290519081900360640190fd5b601154604051600091339183818181818787f1925050503d8060008114610e80576040519150601f19603f3d011682016040523d82523d6000602084013e610e85565b606091505b5050905080610ecf576040805162461bcd60e51b815260206004820152601160248201527034b73b30b634b2103232b632b3b0ba37b960791b604482015290519081900360640190fd5b6000610ee6846402540be40063ffffffff6132c016565b90506000610efa348663ffffffff61330216565b90506000610f136002548361330290919063ffffffff16565b6040805160038082526080820190925291925060609190816020015b6060815260200190600190039081610f2f579050509050610f4f33613344565b81600081518110610f5c57fe5b6020026020010181905250610f79886001600160a01b0316613344565b81600181518110610f8657fe5b6020026020010181905250610f9a84613367565b81600281518110610fa757fe5b60200260200101819052506060610fc76001610fc28461337a565b613404565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600b909352912080549091019055905061200063f7a251d7601083611025876402540be40063ffffffff6132c016565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561108357818101518382015260200161106b565b50505050905090810190601f1680156110b05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b5061100492506108fc915061110290508a8663ffffffff61325f16565b6040518115909202916000818181858888f1935050505015801561112a573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f1935050505015801561115b573d6000803e3d6000fd5b50604080518981526020810185905281516001600160a01b038c169233927f5f32ed2794e2e72d19e3cb2320e8820a499c4204887372beba51f5e61c040867929081900390910190a350506010805460ff1916600117905550505050505050565b60035481565b6111ca615194565b6111d2615194565b6001600160a01b0383166000818152600b60209081526040808320548552838352600c82528083205485830152928252600d9052819020549082015290505b919050565b606481565b6108fc81565b61200181565b606033612000146112695760405162461bcd60e51b815260040180806020018281038252602f81526020018061539c602f913960400191505060405180910390fd5b60005460ff166112ac576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6112b46151b2565b6112fb6112f685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061348a92505050565b6134af565b9050600061131061130b836134f9565b613547565b90506000606060ff8316600414156113355761132b846135fe565b909250905061138c565b60ff83166005141561134a5761132b846137de565b6040805162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e206576656e74207479706560701b604482015290519081900360640190fd5b63ffffffff8216156113d8576040805163ffffffff84168152905160ff8516917f391d6e5ea6ab6c49b9a0abb1782cae5def8d711f973b00c729658c0b2a80b31b919081900360200190a25b979650505050505050565b6001600160a01b031660009081526006602052604090205490565b600581565b600181565b60015481565b606581565b662386f26fc1000081565b600381565b620a8c0081565b61100181565b6102ca81565b600881565b60105460ff1660021415611487576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be40034061580156114af57506402540be4008106155b611500576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16611543576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b600154341015611591576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b60035482101561164c573360009081526005602090815260408083206001600160a01b03871684529091529020548214611603576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600254821161164c576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b3360009081526007602090815260408083206001600160a01b03871684529091529020544210156116c4576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720756e64656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b604080518082018252601081526f6e6f7420656e6f7567682066756e647360801b602080830191909152336000908152600582528381206001600160a01b03881682529091529182205461171f91859063ffffffff6139fa16565b905080156117675760025481116117675760405162461bcd60e51b81526004018080602001828103825260258152602001806153776025913960400191505060405180910390fd5b600061177e846402540be40063ffffffff6132c016565b600254909150349060009061179a90839063ffffffff61330216565b6040805160038082526080820190925291925060609190816020015b60608152602001906001900390816117b65790505090506117d633613344565b816000815181106117e357fe5b6020026020010181905250611800886001600160a01b0316613344565b8160018151811061180d57fe5b602002602001018190525061182184613367565b8160028151811061182e57fe5b602002602001018190525060606118496002610fc28461337a565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600c909352912080549091019055905061189a42620a8c0063ffffffff61325f16565b3360009081526007602090815260408083206001600160a01b038e16845290915290205561200063f7a251d76010836118de876402540be40063ffffffff6132c016565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561193c578181015183820152602001611924565b50505050905090810190601f1680156119695780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561198a57600080fd5b505af115801561199e573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f193505050501580156119d1573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f19350505050158015611a02573d6000803e3d6000fd5b50604080518981526020810185905281516001600160a01b038c169233927fdf0b6ac27f3f3bb31cee3dab0f4fe40cc19c6a3f8daaec52e06b261e58a12519929081900390910190a350506010805460ff1916600117905550505050505050565b61200081565b600081565b60025481565b6402540be40081565b60105460009060ff1660021415611acc576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480611b33576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d8060008114611b89576040519150601f19603f3d011682016040523d82523d6000602084013e611b8e565b606091505b5050905080611bd6576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b60105460ff1660021415611c6f576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015611c9757506402540be4008106155b611ce8576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16611d2b576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b826001600160a01b0316846001600160a01b03161415611d89576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103932b232b632b3b0ba34b7b760611b604482015290519081900360640190fd5b600154341015611dd7576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b600354821015611e1f576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b3360009081526009602090815260408083206001600160a01b03888116855290835281842090871684529091529020544210801590611e8d57503360009081526009602090815260408083206001600160a01b03878116855290835281842090881684529091529020544210155b611ede576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720726564656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b604080518082018252601081526f6e6f7420656e6f7567682066756e647360801b602080830191909152336000908152600582528381206001600160a01b038916825290915291822054611f3991859063ffffffff6139fa16565b90508015611f81576002548111611f815760405162461bcd60e51b815260040180806020018281038252602581526020018061527b6025913960400191505060405180910390fd5b6000611f98846402540be40063ffffffff6132c016565b6002549091503490600090611fb490839063ffffffff61330216565b60408051600480825260a0820190925291925060609190816020015b6060815260200190600190039081611fd0579050509050611ff033613344565b81600081518110611ffd57fe5b602002602001018190525061201a896001600160a01b0316613344565b8160018151811061202757fe5b6020026020010181905250612044886001600160a01b0316613344565b8160028151811061205157fe5b602002602001018190525061206584613367565b8160038151811061207257fe5b6020026020010181905250606061208d6003610fc28461337a565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600d90935291208054909101905590506120de42620a8c0063ffffffff61325f16565b3360009081526009602090815260408083206001600160a01b038e81168552908352818420908f16845290915290205561212142620a8c0063ffffffff61325f16565b3360009081526009602090815260408083206001600160a01b038f81168552908352818420908e16845290915290205561200063f7a251d7601083612171876402540be40063ffffffff6132c016565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121cf5781810151838201526020016121b7565b50505050905090810190601f1680156121fc5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561221d57600080fd5b505af1158015612231573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f19350505050158015612264573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f19350505050158015612295573d6000803e3d6000fd5b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167fdb0d03fdfcb145c486c442659e6a341a8828985505097cb5190afcf541e840158b87604051808381526020018281526020019250505060405180910390a450506010805460ff191660011790555050505050505050565b61100581565b6001600160a01b031660009081526004602052604090205490565b600281565b601081565b6001600160a01b031660009081526008602052604090205490565b61100881565b600b81565b336120001461239d5760405162461bcd60e51b815260040180806020018281038252602f81526020018061539c602f913960400191505060405180910390fd5b60005460ff166123e0576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6123e86151b2565b61242a6112f684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061348a92505050565b905060008060606000805b61243e86613a91565b156124a9578061245b5761245461130b876134f9565b94506124a1565b80600114156124775761247061130b876134f9565b93506124a1565b806002141561249c5761249161248c876134f9565b613ab2565b9250600191506124a1565b6124a9565b600101612435565b816124ef576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6124f883613b22565b61253b576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b6125476112f68461348a565b9550600061255761130b886134f9565b90506125616151b2565b61256a88613a91565b1561258d576125866112f661258161248c8b6134f9565b61348a565b90506125ce565b6040805162461bcd60e51b8152602060048201526011602482015270656d7074792061636b207061636b61676560781b604482015290519081900360640190fd5b60ff8216600114156125ea576125e5818888613b76565b612618565b60ff821660021415612601576125e5818888613f2d565b60ff82166003141561134a576125e58188886141fa565b5050505050505050505050565b600981565b61100781565b61100681565b60005460ff1681565b60005460ff16612696576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33611007146126d65760405162461bcd60e51b815260040180806020018281038252602e8152602001806152ed602e913960400191505060405180910390fd5b61273784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526972656c6179657246656560b01b6020820152915061455f9050565b1561289d5760208114612791576040805162461bcd60e51b815260206004820152601d60248201527f6c656e677468206f662072656c61796572466565206d69736d61746368000000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916127cf9185858083850183828082843760009201919091525061464692505050565b905060035481106128115760405162461bcd60e51b815260040180806020018281038252602e81526020018061531b602e913960400191505060405180910390fd5b60025481116128515760405162461bcd60e51b815260040180806020018281038252602e815260200180615349602e913960400191505060405180910390fd5b6402540be4008106156128955760405162461bcd60e51b815260040180806020018281038252602c8152602001806152c1602c913960400191505060405180910390fd5b600155612d3f565b61290184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c62534352656c6179657246656560981b6020820152915061455f9050565b15612a63576020811461295b576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f662062534352656c61796572466565206d69736d61746368604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916129999185858083850183828082843760009201919091525061464692505050565b9050806129d75760405162461bcd60e51b81526004018080602001828103825260228152602001806153cb6022913960400191505060405180910390fd5b6001548110612a175760405162461bcd60e51b815260040180806020018281038252602e81526020018061521c602e913960400191505060405180910390fd5b6402540be400810615612a5b5760405162461bcd60e51b815260040180806020018281038252602f8152602001806151ed602f913960400191505060405180910390fd5b600255612d3f565b612ac784848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c36b4b72232b632b3b0ba34b7b760991b6020820152915061455f9050565b15612ba95760208114612b21576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f66206d696e44656c65676174696f6e206d69736d61746368604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091612b5f9185858083850183828082843760009201919091525061464692505050565b90506001548111612ba15760405162461bcd60e51b815260040180806020018281038252603181526020018061524a6031913960400191505060405180910390fd5b600355612d3f565b612c0b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a7472616e7366657247617360a81b6020820152915061455f9050565b15612d025760208114612c65576040805162461bcd60e51b815260206004820152601e60248201527f6c656e677468206f66207472616e73666572476173206d69736d617463680000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091612ca39185858083850183828082843760009201919091525061464692505050565b905060008111612cfa576040805162461bcd60e51b815260206004820152601e60248201527f746865207472616e736665724761732063616e6e6f74206265207a65726f0000604482015290519081900360640190fd5b601155612d3f565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b600481565b60105460009060ff1660021415612e25576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526006602052604090205480612e89576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d8060008114612edf576040519150601f19603f3d011682016040523d82523d6000602084013e612ee4565b606091505b5050905080612f2c576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b038083166000908152600760209081526040808320938516835292905220545b92915050565b60015490565b61100281565b3361200014612ff75760405162461bcd60e51b815260040180806020018281038252602f81526020018061539c602f913960400191505060405180910390fd5b60005460ff1661303a576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b61307982828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b2292505050565b6130bc576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b6130c46151b2565b6131066112f684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061348a92505050565b9050600061311661130b836134f9565b90506131206151b2565b61312983613a91565b15613147576131406112f661258161248c866134f9565b905061318d565b6040805162461bcd60e51b8152602060048201526016602482015275656d707479206661696c2061636b207061636b61676560501b604482015290519081900360640190fd5b60ff8216600114156131a7576131a28161464b565b6131d1565b60ff8216600214156131bc576131a281614865565b60ff82166003141561134a576131a28161498f565b5050505b505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b68056bc75e2d6310000081565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6000828201838110156132b9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006132b983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614af4565b60006132b983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506139fa565b60408051600560a21b83186014820152603481019091526060906132b981614b59565b6060612fa561337583614baf565b614b59565b606081516000141561339b5750604080516000815260208101909152611211565b6060826000815181106133aa57fe5b602002602001015190506000600190505b83518110156133eb576133e1828583815181106133d457fe5b6020026020010151614c95565b91506001016133bb565b506132b96133fe825160c060ff16614d12565b82614c95565b6040805160028082526060828101909352829190816020015b606081526020019060019003908161341d5790505090506134408460ff16613367565b8160008151811061344d57fe5b602002602001018190525061346183614b59565b8160018151811061346e57fe5b60200260200101819052506134828161337a565b949350505050565b6134926151d2565b506040805180820190915281518152602082810190820152919050565b6134b76151b2565b6134c082614e0a565b6134c957600080fd5b60006134d88360200151614e44565b60208085015160408051808201909152868152920190820152915050919050565b6135016151d2565b61350a82613a91565b61351357600080fd5b6020820151600061352382614ea7565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061355c57508151602110155b61356557600080fd5b60006135748360200151614e44565b905080836000015110156135cf576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156135f557826020036101000a820491505b50949350505050565b600060606000806000805b61361287613a91565b1561366457826136345761362d613628886134f9565b614fda565b9150613659565b82600114156136545761364961130b886134f9565b905060019350613659565b613664565b826001019250613609565b836136aa576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156136f457600080fd5b505af1158015613708573d6000803e3d6000fd5b505050506040513d602081101561371e57600080fd5b505190508061374357613735600484846065614ff4565b9650965050505050506137d9565b6001600160a01b03831660009081526006602052604090205461376c908363ffffffff61325f16565b6001600160a01b038416600081815260066020908152604091829020939093558051858152905191927f7cc266c7b444f808013fa187f7b904d470a051a6564e78f482aa496581ba4bf892918290030190a260408051600080825260208201909252909750955050505050505b915091565b6000606060008060008060005b6137f488613a91565b1561385d57836138115761380a613628896134f9565b9250613852565b836001141561382d57613826613628896134f9565b9150613852565b836002141561384d5761384261130b896134f9565b905060019450613852565b61385d565b8360010193506137eb565b846138a3576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156138ed57600080fd5b505af1158015613901573d6000803e3d6000fd5b505050506040513d602081101561391757600080fd5b505190508061393d5761392e600585846065614ff4565b975097505050505050506137d9565b6001600160a01b038085166000818152600760209081526040808320948816835293815283822082905591815260089091522054613981908363ffffffff61325f16565b6001600160a01b0380861660008181526008602090815260409182902094909455805186815290519287169391927f35a799836f74fac7eccf5c73902823b970543d2274d3b93d8da3d37a255772a2929181900390910190a3604080516000808252602082019092529098509650505050505050915091565b60008184841115613a895760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a4e578181015183820152602001613a36565b50505050905090810190601f168015613a7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000613a9b6151d2565b505080518051602091820151919092015191011190565b8051606090613ac057600080fd5b6000613acf8360200151614e44565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015613b06576020820181803683370190505b50905060008160200190506135f58487602001510182856150f0565b8051602080830191909120600e546000908152600a9092526040822054808214613b5157600092505050611211565b5050600e80546000908152600a60205260408120558054600190810190915592915050565b60008060008060005b613b8888613a91565b15613bf15783613ba557613b9e613628896134f9565b9250613be6565b8360011415613bc157613bba613628896134f9565b9150613be6565b8360021415613be157613bd661130b896134f9565b905060019450613be6565b613bf1565b836001019350613b7f565b84613c37576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613c4e826402540be40063ffffffff61513b16565b6001600160a01b0385166000908152600b602052604090208054600019019055905060ff881660011415613d945760ff871615613cc1576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054613cea908263ffffffff61325f16565b6001600160a01b03808616600090815260046020908152604080832094909455600581528382209287168252919091522054613d2c908263ffffffff61325f16565b6001600160a01b038086166000818152600560209081526040808320948916808452948252918290209490945580518581529051929391927f9a57c81564ab02642f34fd87e41baa9b074c18342cec3b7268b62bf752018fd1929181900390910190a3613f22565b60ff8816613ee6576001600160a01b038416600090815260086020526040902054613dc5908263ffffffff61325f16565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b158015613e2157600080fd5b505af1158015613e35573d6000803e3d6000fd5b505050506040513d6020811015613e4b57600080fd5b5051613e94576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040805182815260ff8916602082015281516001600160a01b0380871693908816927fcbd481ae600289fad8c0484d07ce0ffe4f010d7c844ecfdeaf2a13fead52886e929081900390910190a3613f22565b6040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b505050505050505050565b60008060008060005b613f3f88613a91565b15613fa85783613f5c57613f55613628896134f9565b9250613f9d565b8360011415613f7857613f71613628896134f9565b9150613f9d565b8360021415613f9857613f8d61130b896134f9565b905060019450613f9d565b613fa8565b836001019350613f36565b84613fee576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000614005826402540be40063ffffffff61513b16565b6001600160a01b0385166000908152600c602052604090208054600019019055905060ff8816600114156141845760ff871615614078576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b0384166000908152600460205260409020546140a1908263ffffffff61330216565b6001600160a01b038086166000908152600460209081526040808320949094556005815283822092871682529190915220546140e3908263ffffffff61330216565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205561411c42620a8c0063ffffffff61325f16565b6001600160a01b038086166000818152600760209081526040808320948916808452948252918290209490945580518581529051929391927fd6f878a5bcbbe79a64e6418bb0d56aaa20b9a60587d45749819df88dfc7c3c44929181900390910190a3613f22565b60ff8816613ee6576001600160a01b03808516600081815260076020908152604080832094881680845294825280832092909255815185815260ff8c169181019190915281517f4417d10c1e33efa83a770b8d4f47176e78c08c1298d534901ad3b16bb585fa2e929181900390910190a3613f22565b6000806000806000805b61420d89613a91565b15614292578461422a576142236136288a6134f9565b9350614287565b84600114156142465761423f6136288a6134f9565b9250614287565b84600214156142625761425b6136288a6134f9565b9150614287565b84600314156142825761427761130b8a6134f9565b905060019550614287565b614292565b846001019450614204565b856142d8576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006142ef826402540be40063ffffffff61513b16565b6001600160a01b0386166000908152600d602052604090208054600019019055905060ff8916600114156144c25760ff881615614362576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b03808616600090815260056020908152604080832093881683529290522054614398908263ffffffff61330216565b6001600160a01b038681166000908152600560209081526040808320898516845290915280822093909355908516815220546143d4908261325f565b6001600160a01b0380871660009081526005602090815260408083209388168352929052205561440d42620a8c0063ffffffff61325f16565b6001600160a01b038087166000908152600960209081526040808320898516845282528083209388168352929052205561445042620a8c0063ffffffff61325f16565b6001600160a01b038087166000818152600960209081526040808320898616808552908352818420958b1680855295835292819020959095558451868152945191947f78bffae3f8c6691ac7fc1a3bff800cb2d612f5ad9ae5b0444cfe2eb15c189e18929081900390910190a4614553565b60ff8916613ee6576001600160a01b038581166000818152600960209081526040808320898616808552818452828520968a16808652968452828520859055908352818420818552835281842093909355805186815260ff8e169281019290925280519293927fb93bee5c59f85ede6b074a99f4ffcd3e3fc0d5c3d8156de331de89a49e0ce77c9281900390910190a45b50505050505050505050565b6000816040516020018082805190602001908083835b602083106145945780518252601f199092019160209182019101614575565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106146025780518252601f1990920191602091820191016145e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60008060008060005b61465d86613a91565b156146c6578361467a57614673613628876134f9565b92506146bb565b83600114156146965761468f613628876134f9565b91506146bb565b83600214156146b6576146ab61130b876134f9565b9050600194506146bb565b6146c6565b836001019350614654565b8461470c576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000614723826402540be40063ffffffff61513b16565b6001600160a01b0385166000908152600b6020908152604080832080546000190190556008909152902054909150614761908263ffffffff61325f16565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b1580156147bd57600080fd5b505af11580156147d1573d6000803e3d6000fd5b505050506040513d60208110156147e757600080fd5b5051614830576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040516001907ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b90600090a250505050505050565b60008060008060005b61487786613a91565b156148e057836148945761488d613628876134f9565b92506148d5565b83600114156148b0576148a9613628876134f9565b91506148d5565b83600214156148d0576148c561130b876134f9565b9050600194506148d5565b6148e0565b83600101935061486e565b84614926576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600c60209081526040808320805460001901905560078252808320938616835292905281812081905590516002917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a2505050505050565b6000806000806000805b6149a287613a91565b15614a2757846149bf576149b8613628886134f9565b9350614a1c565b84600114156149db576149d4613628886134f9565b9250614a1c565b84600214156149f7576149f0613628886134f9565b9150614a1c565b8460031415614a1757614a0c61130b886134f9565b905060019550614a1c565b614a27565b846001019450614999565b85614a6d576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038481166000908152600d602090815260408083208054600019019055600982528083208785168085528184528285209588168552948352818420849055825280832093835292905281812081905590516003917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a250505050505050565b60008183614b435760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a4e578181015183820152602001613a36565b506000838581614b4f57fe5b0495945050505050565b606081516001148015614b8b5750607f60f81b82600081518110614b7957fe5b01602001516001600160f81b03191611155b15614b97575080611211565b612fa5614ba98351608060ff16614d12565b83614c95565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614bf357506018614c17565b6fffffffffffffffffffffffffffffffff198416614c1357506010614c17565b5060005b6020811015614c4d57818181518110614c2c57fe5b01602001516001600160f81b03191615614c4557614c4d565b600101614c17565b60008160200390506060816040519080825280601f01601f191660200182016040528015614c82576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015614cc6578051835260209283019201614cae565b50855184518101855292509050808201602086015b81831015614cf3578051835260209283019201614cdb565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614d62576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614dbc5782840160f81b81600081518110614d9e57fe5b60200101906001600160f81b031916908160001a9053509050612fa5565b6060614dc785614baf565b90508381510160370160f81b82600081518110614de057fe5b60200101906001600160f81b031916908160001a905350614e018282614c95565b95945050505050565b8051600090614e1b57506000611211565b6020820151805160001a9060c0821015614e3a57600092505050611211565b5060019392505050565b8051600090811a6080811015614e5e576000915050611211565b60b8811080614e79575060c08110801590614e79575060f881105b15614e88576001915050611211565b60c0811015614e9c5760b519019050611211565b60f519019050611211565b80516000908190811a6080811015614ec25760019150614fd3565b60b8811015614ed757607e1981019150614fd3565b60c0811015614f5157600060b78203600186019550806020036101000a865104915060018101820193505080831015614f4b576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50614fd3565b60f8811015614f665760be1981019150614fd3565b600060f78203600186019550806020036101000a865104915060018101820193505080831015614fd1576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090601514614feb57600080fd5b612fa582613547565b6000606061500d846402540be40063ffffffff6132c016565b60408051600480825260a0820190925291955060609190816020015b606081526020019060019003908161502957905050905061504c8760ff16613367565b8160008151811061505957fe5b6020026020010181905250615076866001600160a01b0316613344565b8160018151811061508357fe5b602002602001018190525061509785613367565b816002815181106150a457fe5b60200260200101819052506150be8463ffffffff16613367565b816003815181106150cb57fe5b602002602001018190525060606150e18261337a565b94989497509395505050505050565b806150fa576131d5565b5b6020811061511a578251825260209283019290910190601f19016150fb565b915181516020939093036101000a6000190180199091169216919091179052565b60008261514a57506000612fa5565b8282028284828161515757fe5b04146132b95760405162461bcd60e51b81526004018080602001828103825260218152602001806152a06021913960400191505060405180910390fd5b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806151c56151d2565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe7468652042534352656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f7468652042534352656c61796572466565206d757374206265206c657373207468616e2072656c61796572466565746865206d696e44656c65676174696f6e206d7573742062652067726561746572207468616e2072656c61796572466565696e73756666696369656e742062616c616e636520616674657220726564656c6567617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777468652072656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163747468652072656c61796572466565206d757374206265206c657373207468616e206d696e44656c65676174696f6e7468652072656c61796572466565206d757374206265206d6f7265207468616e2042534352656c61796572466565696e73756666696369656e742062616c616e636520616674657220756e64656c6567617465746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747468652042534352656c61796572466565206d757374206e6f74206265207a65726fa164736f6c6343000604000a" + "code": "0x6080604052600436106103855760003560e01c806370fd5bad116101d1578063b88a802f11610102578063d7ecfcb6116100a0578063f9a2bbc71161006f578063f9a2bbc714610c40578063fa03f79714610c55578063fc3e590814610671578063fd6a687914610c6a5761038c565b8063d7ecfcb614610819578063dc927faf14610bd1578063edc1a5b014610be6578063f45fd80b14610bfb5761038c565b8063c2117d82116100dc578063c2117d8214610ae7578063c81b166214610afc578063c8509d8114610b11578063d61b9b9314610b965761038c565b8063b88a802f14610a82578063baaafd3b14610a97578063bf8546ca14610aac5761038c565b806396713da91161016f578063a78abc1611610149578063a78abc1614610964578063ab51bb961461098d578063ac431751146109a2578063b14315df14610a6d5761038c565b806396713da9146109255780639dc092621461093a578063a1a11bf51461094f5761038c565b806375d47a0a116101ab57806375d47a0a146108765780637942fd051461088b578063831d65d1146108a057806392b888a41461061d5761038c565b806370fd5bad14610819578063718a8aa81461082e57806375aca593146108435761038c565b80633fdfa7e4116102b6578063552aaf931161025457806369b635b61161022357806369b635b6146107865780636bd8f8041461079b5780636e47b482146107d15780636fb7f7eb146107e65761038c565b8063552aaf93146107325780635d17c8bd146107475780635d499b1b1461075c57806362b171d2146107715761038c565b8063493279b111610290578063493279b1146106b05780634bf6c882146106dc5780634d99dd16146106f157806351e806721461071d5761038c565b80633fdfa7e414610671578063413d9c3a1461068657806343756e5c1461069b5761038c565b806311fe9ec6116103235780632fdeb111116102fd5780632fdeb11114610632578063333ad3e71461064757806334c433541461065c5780633dffc3871461061d5761038c565b806311fe9ec6146105bf578063151817e3146105f257806317c9efb01461061d5761038c565b80630bee7a671161035f5780630bee7a67146104515780630c7957151461047f5780630e2374a5146104945780631182b875146104c55761038c565b8063026e402b1461039157806302985992146103bf578063047636d1146103e65761038c565b3661038c57005b600080fd5b6103bd600480360360408110156103a757600080fd5b506001600160a01b038135169060200135610c7f565b005b3480156103cb57600080fd5b506103d46111bc565b60408051918252519081900360200190f35b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b03166111c2565b6040518082606080838360005b8381101561043e578181015183820152602001610426565b5050505090500191505060405180910390f35b34801561045d57600080fd5b50610466611216565b6040805163ffffffff9092168252519081900360200190f35b34801561048b57600080fd5b506103d461121b565b3480156104a057600080fd5b506104a9611221565b604080516001600160a01b039092168252519081900360200190f35b3480156104d157600080fd5b5061054a600480360360408110156104e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561050c57600080fd5b82018360208201111561051e57600080fd5b803590602001918460018302840111600160201b8311171561053f57600080fd5b509092509050611227565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561058457818101518382015260200161056c565b50505050905090810190601f1680156105b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105cb57600080fd5b506103d4600480360360208110156105e257600080fd5b50356001600160a01b03166113e3565b3480156105fe57600080fd5b506106076113fe565b6040805160ff9092168252519081900360200190f35b34801561062957600080fd5b50610607611403565b34801561063e57600080fd5b506103d4611408565b34801561065357600080fd5b5061046661140e565b34801561066857600080fd5b506103d4611413565b34801561067d57600080fd5b5061060761141e565b34801561069257600080fd5b506103d4611423565b3480156106a757600080fd5b506104a961142a565b3480156106bc57600080fd5b506106c5611430565b6040805161ffff9092168252519081900360200190f35b3480156106e857600080fd5b50610607611435565b6103bd6004803603604081101561070757600080fd5b506001600160a01b03813516906020013561143a565b34801561072957600080fd5b506104a9611a62565b34801561073e57600080fd5b50610607611a68565b34801561075357600080fd5b506103d4611a6d565b34801561076857600080fd5b506103d4611a73565b34801561077d57600080fd5b506103d4611a7c565b34801561079257600080fd5b506103d4611c1c565b6103bd600480360360608110156107b157600080fd5b506001600160a01b03813581169160208101359091169060400135611c22565b3480156107dd57600080fd5b506104a961230b565b3480156107f257600080fd5b506103d46004803603602081101561080957600080fd5b50356001600160a01b0316612311565b34801561082557600080fd5b5061060761232c565b34801561083a57600080fd5b50610607612331565b34801561084f57600080fd5b506103d46004803603602081101561086657600080fd5b50356001600160a01b0316612336565b34801561088257600080fd5b506104a9612351565b34801561089757600080fd5b50610607612357565b3480156108ac57600080fd5b506103bd600480360360408110156108c357600080fd5b60ff8235169190810190604081016020820135600160201b8111156108e757600080fd5b8201836020820111156108f957600080fd5b803590602001918460018302840111600160201b8311171561091a57600080fd5b50909250905061235c565b34801561093157600080fd5b50610607612624565b34801561094657600080fd5b506104a9612629565b34801561095b57600080fd5b506104a961262f565b34801561097057600080fd5b50610979612635565b604080519115158252519081900360200190f35b34801561099957600080fd5b50610466611a68565b3480156109ae57600080fd5b506103bd600480360360408110156109c557600080fd5b810190602081018135600160201b8111156109df57600080fd5b8201836020820111156109f157600080fd5b803590602001918460018302840111600160201b83111715610a1257600080fd5b919390929091602081019035600160201b811115610a2f57600080fd5b820183602082011115610a4157600080fd5b803590602001918460018302840111600160201b83111715610a6257600080fd5b50909250905061263e565b348015610a7957600080fd5b50610607612dd0565b348015610a8e57600080fd5b506103d4612dd5565b348015610aa357600080fd5b506103d4612f72565b348015610ab857600080fd5b506103d460048036036040811015610acf57600080fd5b506001600160a01b0381358116916020013516612f7d565b348015610af357600080fd5b506103d4612faa565b348015610b0857600080fd5b506104a9612fb0565b348015610b1d57600080fd5b506103bd60048036036040811015610b3457600080fd5b60ff8235169190810190604081016020820135600160201b811115610b5857600080fd5b820183602082011115610b6a57600080fd5b803590602001918460018302840111600160201b83111715610b8b57600080fd5b509092509050612fb6565b348015610ba257600080fd5b506103d460048036036040811015610bb957600080fd5b506001600160a01b03813581169160200135166131d9565b348015610bdd57600080fd5b506104a9613204565b348015610bf257600080fd5b506103d461320a565b348015610c0757600080fd5b506103d460048036036060811015610c1e57600080fd5b506001600160a01b038135811691602081013582169160409091013516613217565b348015610c4c57600080fd5b506104a961324c565b348015610c6157600080fd5b506103d4613252565b348015610c7657600080fd5b506104a9613258565b60105460ff1660021415610ccb576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015610cf357506402540be4008106155b610d44576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16610d87576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b600354821015610dde576040805162461bcd60e51b815260206004820152601760248201527f696e76616c69642064656c656761746520616d6f756e74000000000000000000604482015290519081900360640190fd5b600154610df290839063ffffffff61325e16565b341015610e3d576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f756768206d73672076616c756560601b604482015290519081900360640190fd5b601154604051600091339183818181818787f1925050503d8060008114610e80576040519150601f19603f3d011682016040523d82523d6000602084013e610e85565b606091505b5050905080610ecf576040805162461bcd60e51b815260206004820152601160248201527034b73b30b634b2103232b632b3b0ba37b960791b604482015290519081900360640190fd5b6000610ee6846402540be40063ffffffff6132bf16565b90506000610efa348663ffffffff61330116565b90506000610f136002548361330190919063ffffffff16565b6040805160038082526080820190925291925060609190816020015b6060815260200190600190039081610f2f579050509050610f4f33613343565b81600081518110610f5c57fe5b6020026020010181905250610f79886001600160a01b0316613343565b81600181518110610f8657fe5b6020026020010181905250610f9a84613366565b81600281518110610fa757fe5b60200260200101819052506060610fc76001610fc284613379565b613403565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600b909352912080549091019055905061200063f7a251d7601083611025876402540be40063ffffffff6132bf16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561108357818101518382015260200161106b565b50505050905090810190601f1680156110b05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b5061100492506108fc915061110290508a8663ffffffff61325e16565b6040518115909202916000818181858888f1935050505015801561112a573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f1935050505015801561115b573d6000803e3d6000fd5b50604080518981526020810185905281516001600160a01b038c169233927f5f32ed2794e2e72d19e3cb2320e8820a499c4204887372beba51f5e61c040867929081900390910190a350506010805460ff1916600117905550505050505050565b60035481565b6111ca615193565b6111d2615193565b6001600160a01b0383166000818152600b60209081526040808320548552838352600c82528083205485830152928252600d9052819020549082015290505b919050565b606481565b6108fc81565b61200181565b606033612000146112695760405162461bcd60e51b815260040180806020018281038252602f81526020018061539b602f913960400191505060405180910390fd5b60005460ff166112ac576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6112b46151b1565b6112fb6112f685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061348992505050565b6134ae565b9050600061131061130b836134f8565b613546565b90506000606060ff8316600414156113355761132b846135fd565b909250905061138c565b60ff83166005141561134a5761132b846137dd565b6040805162461bcd60e51b8152602060048201526012602482015271756e6b6e6f776e206576656e74207479706560701b604482015290519081900360640190fd5b63ffffffff8216156113d8576040805163ffffffff84168152905160ff8516917f391d6e5ea6ab6c49b9a0abb1782cae5def8d711f973b00c729658c0b2a80b31b919081900360200190a25b979650505050505050565b6001600160a01b031660009081526006602052604090205490565b600581565b600181565b60015481565b606581565b662386f26fc1000081565b600381565b620a8c0081565b61100181565b606081565b600881565b60105460ff1660021415611486576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be40034061580156114ae57506402540be4008106155b6114ff576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16611542576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b600154341015611590576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b60035482101561164b573360009081526005602090815260408083206001600160a01b03871684529091529020548214611602576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b600254821161164b576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b3360009081526007602090815260408083206001600160a01b03871684529091529020544210156116c3576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720756e64656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b604080518082018252601081526f6e6f7420656e6f7567682066756e647360801b602080830191909152336000908152600582528381206001600160a01b03881682529091529182205461171e91859063ffffffff6139f916565b905080156117665760025481116117665760405162461bcd60e51b81526004018080602001828103825260258152602001806153766025913960400191505060405180910390fd5b600061177d846402540be40063ffffffff6132bf16565b600254909150349060009061179990839063ffffffff61330116565b6040805160038082526080820190925291925060609190816020015b60608152602001906001900390816117b55790505090506117d533613343565b816000815181106117e257fe5b60200260200101819052506117ff886001600160a01b0316613343565b8160018151811061180c57fe5b602002602001018190525061182084613366565b8160028151811061182d57fe5b602002602001018190525060606118486002610fc284613379565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600c909352912080549091019055905061189942620a8c0063ffffffff61325e16565b3360009081526007602090815260408083206001600160a01b038e16845290915290205561200063f7a251d76010836118dd876402540be40063ffffffff6132bf16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561193b578181015183820152602001611923565b50505050905090810190601f1680156119685780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561198957600080fd5b505af115801561199d573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f193505050501580156119d0573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f19350505050158015611a01573d6000803e3d6000fd5b50604080518981526020810185905281516001600160a01b038c169233927fdf0b6ac27f3f3bb31cee3dab0f4fe40cc19c6a3f8daaec52e06b261e58a12519929081900390910190a350506010805460ff1916600117905550505050505050565b61200081565b600081565b60025481565b6402540be40081565b60105460009060ff1660021415611acb576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526008602052604090205480611b32576040805162461bcd60e51b81526020600482015260146024820152736e6f20756e64656c6567617465642066756e647360601b604482015290519081900360640190fd5b336000818152600860205260408082208290556011549051919291849084818181858888f193505050503d8060008114611b88576040519150601f19603f3d011682016040523d82523d6000602084013e611b8d565b606091505b5050905080611bd5576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917fc712d133b8d448221aaed2198ed1f0db6dfc860fb01bc3a630916fe6cbef946f919081900360200190a2506010805460ff1916600117905590565b60035490565b60105460ff1660021415611c6e576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b6010805460ff19166002179055806402540be4003406158015611c9657506402540be4008106155b611ce7576040805162461bcd60e51b815260206004820152601c60248201527f707265636973696f6e206c6f737320696e20636f6e76657273696f6e00000000604482015290519081900360640190fd5b60005460ff16611d2a576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b826001600160a01b0316846001600160a01b03161415611d88576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b2103932b232b632b3b0ba34b7b760611b604482015290519081900360640190fd5b600154341015611dd6576040805162461bcd60e51b81526020600482015260146024820152736e6f7420656e6f7567682072656c61792066656560601b604482015290519081900360640190fd5b600354821015611e1e576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b3360009081526009602090815260408083206001600160a01b03888116855290835281842090871684529091529020544210801590611e8c57503360009081526009602090815260408083206001600160a01b03878116855290835281842090881684529091529020544210155b611edd576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e6720726564656c65676174696f6e206578697374000000000000604482015290519081900360640190fd5b604080518082018252601081526f6e6f7420656e6f7567682066756e647360801b602080830191909152336000908152600582528381206001600160a01b038916825290915291822054611f3891859063ffffffff6139f916565b90508015611f80576002548111611f805760405162461bcd60e51b815260040180806020018281038252602581526020018061527a6025913960400191505060405180910390fd5b6000611f97846402540be40063ffffffff6132bf16565b6002549091503490600090611fb390839063ffffffff61330116565b60408051600480825260a0820190925291925060609190816020015b6060815260200190600190039081611fcf579050509050611fef33613343565b81600081518110611ffc57fe5b6020026020010181905250612019896001600160a01b0316613343565b8160018151811061202657fe5b6020026020010181905250612043886001600160a01b0316613343565b8160028151811061205057fe5b602002602001018190525061206484613366565b8160038151811061207157fe5b6020026020010181905250606061208c6003610fc284613379565b8051602080830191909120600f80546000908152600a845260408082209390935581546001908101909255338152600d90935291208054909101905590506120dd42620a8c0063ffffffff61325e16565b3360009081526009602090815260408083206001600160a01b038e81168552908352818420908f16845290915290205561212042620a8c0063ffffffff61325e16565b3360009081526009602090815260408083206001600160a01b038f81168552908352818420908e16845290915290205561200063f7a251d7601083612170876402540be40063ffffffff6132bf16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121ce5781810151838201526020016121b6565b50505050905090810190601f1680156121fb5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561221c57600080fd5b505af1158015612230573d6000803e3d6000fd5b5050604051611004925085156108fc02915085906000818181858888f19350505050158015612263573d6000803e3d6000fd5b506002546040516110029180156108fc02916000818181858888f19350505050158015612294573d6000803e3d6000fd5b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167fdb0d03fdfcb145c486c442659e6a341a8828985505097cb5190afcf541e840158b87604051808381526020018281526020019250505060405180910390a450506010805460ff191660011790555050505050505050565b61100581565b6001600160a01b031660009081526004602052604090205490565b600281565b601081565b6001600160a01b031660009081526008602052604090205490565b61100881565b600b81565b336120001461239c5760405162461bcd60e51b815260040180806020018281038252602f81526020018061539b602f913960400191505060405180910390fd5b60005460ff166123df576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b6123e76151b1565b6124296112f684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061348992505050565b905060008060606000805b61243d86613a90565b156124a8578061245a5761245361130b876134f8565b94506124a0565b80600114156124765761246f61130b876134f8565b93506124a0565b806002141561249b5761249061248b876134f8565b613ab1565b9250600191506124a0565b6124a8565b600101612434565b816124ee576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6124f783613b21565b61253a576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b6125466112f684613489565b9550600061255661130b886134f8565b90506125606151b1565b61256988613a90565b1561258c576125856112f661258061248b8b6134f8565b613489565b90506125cd565b6040805162461bcd60e51b8152602060048201526011602482015270656d7074792061636b207061636b61676560781b604482015290519081900360640190fd5b60ff8216600114156125e9576125e4818888613b75565b612617565b60ff821660021415612600576125e4818888613f2c565b60ff82166003141561134a576125e48188886141f9565b5050505050505050505050565b600981565b61100781565b61100681565b60005460ff1681565b60005460ff16612695576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33611007146126d55760405162461bcd60e51b815260040180806020018281038252602e8152602001806152ec602e913960400191505060405180910390fd5b61273684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526972656c6179657246656560b01b6020820152915061455e9050565b1561289c5760208114612790576040805162461bcd60e51b815260206004820152601d60248201527f6c656e677468206f662072656c61796572466565206d69736d61746368000000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916127ce9185858083850183828082843760009201919091525061464592505050565b905060035481106128105760405162461bcd60e51b815260040180806020018281038252602e81526020018061531a602e913960400191505060405180910390fd5b60025481116128505760405162461bcd60e51b815260040180806020018281038252602e815260200180615348602e913960400191505060405180910390fd5b6402540be4008106156128945760405162461bcd60e51b815260040180806020018281038252602c8152602001806152c0602c913960400191505060405180910390fd5b600155612d3e565b61290084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c62534352656c6179657246656560981b6020820152915061455e9050565b15612a62576020811461295a576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f662062534352656c61796572466565206d69736d61746368604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916129989185858083850183828082843760009201919091525061464592505050565b9050806129d65760405162461bcd60e51b81526004018080602001828103825260228152602001806153ca6022913960400191505060405180910390fd5b6001548110612a165760405162461bcd60e51b815260040180806020018281038252602e81526020018061521b602e913960400191505060405180910390fd5b6402540be400810615612a5a5760405162461bcd60e51b815260040180806020018281038252602f8152602001806151ec602f913960400191505060405180910390fd5b600255612d3e565b612ac684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600d81526c36b4b72232b632b3b0ba34b7b760991b6020820152915061455e9050565b15612ba85760208114612b20576040805162461bcd60e51b815260206004820181905260248201527f6c656e677468206f66206d696e44656c65676174696f6e206d69736d61746368604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091612b5e9185858083850183828082843760009201919091525061464592505050565b90506001548111612ba05760405162461bcd60e51b81526004018080602001828103825260318152602001806152496031913960400191505060405180910390fd5b600355612d3e565b612c0a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600b81526a7472616e7366657247617360a81b6020820152915061455e9050565b15612d015760208114612c64576040805162461bcd60e51b815260206004820152601e60248201527f6c656e677468206f66207472616e73666572476173206d69736d617463680000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091612ca29185858083850183828082843760009201919091525061464592505050565b905060008111612cf9576040805162461bcd60e51b815260206004820152601e60248201527f746865207472616e736665724761732063616e6e6f74206265207a65726f0000604482015290519081900360640190fd5b601155612d3e565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b600481565b60105460009060ff1660021415612e24576040805162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b604482015290519081900360640190fd5b506010805460ff191660021790553360009081526006602052604090205480612e88576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c195b991a5b99c81c995dd85c99607a1b604482015290519081900360640190fd5b336000818152600660205260408082208290556011549051919291849084818181858888f193505050503d8060008114612ede576040519150601f19603f3d011682016040523d82523d6000602084013e612ee3565b606091505b5050905080612f2b576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60408051838152905133917f83b78188b13346b2ffb484da70d42ee27de7fbf9f2bd8045269e10ed643ccd76919081900360200190a2506010805460ff1916600117905590565b6638d7ea4c68000081565b6001600160a01b038083166000908152600760209081526040808320938516835292905220545b92915050565b60015490565b61100281565b3361200014612ff65760405162461bcd60e51b815260040180806020018281038252602f81526020018061539b602f913960400191505060405180910390fd5b60005460ff16613039576638d7ea4c6800006001908155662386f26fc1000060025568056bc75e2d631000006003556108fc6011556000805460ff191690911790555b61307882828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b2192505050565b6130bb576040805162461bcd60e51b815260206004820152600f60248201526e0eee4dedcce40e0c2c6d640d0c2e6d608b1b604482015290519081900360640190fd5b6130c36151b1565b6131056112f684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061348992505050565b9050600061311561130b836134f8565b905061311f6151b1565b61312883613a90565b156131465761313f6112f661258061248b866134f8565b905061318c565b6040805162461bcd60e51b8152602060048201526016602482015275656d707479206661696c2061636b207061636b61676560501b604482015290519081900360640190fd5b60ff8216600114156131a6576131a18161464a565b6131d0565b60ff8216600214156131bb576131a181614864565b60ff82166003141561134a576131a18161498e565b5050505b505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61100381565b68056bc75e2d6310000081565b6001600160a01b0392831660009081526009602090815260408083209486168352938152838220929094168152925290205490565b61100081565b60115481565b61100481565b6000828201838110156132b8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006132b883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614af3565b60006132b883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506139f9565b60408051600560a21b83186014820152603481019091526060906132b881614b58565b6060612fa461337483614bae565b614b58565b606081516000141561339a5750604080516000815260208101909152611211565b6060826000815181106133a957fe5b602002602001015190506000600190505b83518110156133ea576133e0828583815181106133d357fe5b6020026020010151614c94565b91506001016133ba565b506132b86133fd825160c060ff16614d11565b82614c94565b6040805160028082526060828101909352829190816020015b606081526020019060019003908161341c57905050905061343f8460ff16613366565b8160008151811061344c57fe5b602002602001018190525061346083614b58565b8160018151811061346d57fe5b602002602001018190525061348181613379565b949350505050565b6134916151d1565b506040805180820190915281518152602082810190820152919050565b6134b66151b1565b6134bf82614e09565b6134c857600080fd5b60006134d78360200151614e43565b60208085015160408051808201909152868152920190820152915050919050565b6135006151d1565b61350982613a90565b61351257600080fd5b6020820151600061352282614ea6565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061355b57508151602110155b61356457600080fd5b60006135738360200151614e43565b905080836000015110156135ce576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156135f457826020036101000a820491505b50949350505050565b600060606000806000805b61361187613a90565b1561366357826136335761362c613627886134f8565b614fd9565b9150613658565b82600114156136535761364861130b886134f8565b905060019350613658565b613663565b826001019250613608565b836136a9576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156136f357600080fd5b505af1158015613707573d6000803e3d6000fd5b505050506040513d602081101561371d57600080fd5b505190508061374257613734600484846065614ff3565b9650965050505050506137d8565b6001600160a01b03831660009081526006602052604090205461376b908363ffffffff61325e16565b6001600160a01b038416600081815260066020908152604091829020939093558051858152905191927f7cc266c7b444f808013fa187f7b904d470a051a6564e78f482aa496581ba4bf892918290030190a260408051600080825260208201909252909750955050505050505b915091565b6000606060008060008060005b6137f388613a90565b1561385c578361381057613809613627896134f8565b9250613851565b836001141561382c57613825613627896134f8565b9150613851565b836002141561384c5761384161130b896134f8565b905060019450613851565b61385c565b8360010193506137ea565b846138a2576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006110046001600160a01b031663727be1f8836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156138ec57600080fd5b505af1158015613900573d6000803e3d6000fd5b505050506040513d602081101561391657600080fd5b505190508061393c5761392d600585846065614ff3565b975097505050505050506137d8565b6001600160a01b038085166000818152600760209081526040808320948816835293815283822082905591815260089091522054613980908363ffffffff61325e16565b6001600160a01b0380861660008181526008602090815260409182902094909455805186815290519287169391927f35a799836f74fac7eccf5c73902823b970543d2274d3b93d8da3d37a255772a2929181900390910190a3604080516000808252602082019092529098509650505050505050915091565b60008184841115613a885760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a4d578181015183820152602001613a35565b50505050905090810190601f168015613a7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000613a9a6151d1565b505080518051602091820151919092015191011190565b8051606090613abf57600080fd5b6000613ace8360200151614e43565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015613b05576020820181803683370190505b50905060008160200190506135f48487602001510182856150ef565b8051602080830191909120600e546000908152600a9092526040822054808214613b5057600092505050611211565b5050600e80546000908152600a60205260408120558054600190810190915592915050565b60008060008060005b613b8788613a90565b15613bf05783613ba457613b9d613627896134f8565b9250613be5565b8360011415613bc057613bb9613627896134f8565b9150613be5565b8360021415613be057613bd561130b896134f8565b905060019450613be5565b613bf0565b836001019350613b7e565b84613c36576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000613c4d826402540be40063ffffffff61513a16565b6001600160a01b0385166000908152600b602052604090208054600019019055905060ff881660011415613d935760ff871615613cc0576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b038416600090815260046020526040902054613ce9908263ffffffff61325e16565b6001600160a01b03808616600090815260046020908152604080832094909455600581528382209287168252919091522054613d2b908263ffffffff61325e16565b6001600160a01b038086166000818152600560209081526040808320948916808452948252918290209490945580518581529051929391927f9a57c81564ab02642f34fd87e41baa9b074c18342cec3b7268b62bf752018fd1929181900390910190a3613f21565b60ff8816613ee5576001600160a01b038416600090815260086020526040902054613dc4908263ffffffff61325e16565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b158015613e2057600080fd5b505af1158015613e34573d6000803e3d6000fd5b505050506040513d6020811015613e4a57600080fd5b5051613e93576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040805182815260ff8916602082015281516001600160a01b0380871693908816927fcbd481ae600289fad8c0484d07ce0ffe4f010d7c844ecfdeaf2a13fead52886e929081900390910190a3613f21565b6040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b505050505050505050565b60008060008060005b613f3e88613a90565b15613fa75783613f5b57613f54613627896134f8565b9250613f9c565b8360011415613f7757613f70613627896134f8565b9150613f9c565b8360021415613f9757613f8c61130b896134f8565b905060019450613f9c565b613fa7565b836001019350613f35565b84613fed576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000614004826402540be40063ffffffff61513a16565b6001600160a01b0385166000908152600c602052604090208054600019019055905060ff8816600114156141835760ff871615614077576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b0384166000908152600460205260409020546140a0908263ffffffff61330116565b6001600160a01b038086166000908152600460209081526040808320949094556005815283822092871682529190915220546140e2908263ffffffff61330116565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205561411b42620a8c0063ffffffff61325e16565b6001600160a01b038086166000818152600760209081526040808320948916808452948252918290209490945580518581529051929391927fd6f878a5bcbbe79a64e6418bb0d56aaa20b9a60587d45749819df88dfc7c3c44929181900390910190a3613f21565b60ff8816613ee5576001600160a01b03808516600081815260076020908152604080832094881680845294825280832092909255815185815260ff8c169181019190915281517f4417d10c1e33efa83a770b8d4f47176e78c08c1298d534901ad3b16bb585fa2e929181900390910190a3613f21565b6000806000806000805b61420c89613a90565b156142915784614229576142226136278a6134f8565b9350614286565b84600114156142455761423e6136278a6134f8565b9250614286565b84600214156142615761425a6136278a6134f8565b9150614286565b84600314156142815761427661130b8a6134f8565b905060019550614286565b614291565b846001019450614203565b856142d7576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b60006142ee826402540be40063ffffffff61513a16565b6001600160a01b0386166000908152600d602052604090208054600019019055905060ff8916600114156144c15760ff881615614361576040805162461bcd60e51b815260206004820152600c60248201526b77726f6e672073746174757360a01b604482015290519081900360640190fd5b6001600160a01b03808616600090815260056020908152604080832093881683529290522054614397908263ffffffff61330116565b6001600160a01b038681166000908152600560209081526040808320898516845290915280822093909355908516815220546143d3908261325e565b6001600160a01b0380871660009081526005602090815260408083209388168352929052205561440c42620a8c0063ffffffff61325e16565b6001600160a01b038087166000908152600960209081526040808320898516845282528083209388168352929052205561444f42620a8c0063ffffffff61325e16565b6001600160a01b038087166000818152600960209081526040808320898616808552908352818420958b1680855295835292819020959095558451868152945191947f78bffae3f8c6691ac7fc1a3bff800cb2d612f5ad9ae5b0444cfe2eb15c189e18929081900390910190a4614552565b60ff8916613ee5576001600160a01b038581166000818152600960209081526040808320898616808552818452828520968a16808652968452828520859055908352818420818552835281842093909355805186815260ff8e169281019290925280519293927fb93bee5c59f85ede6b074a99f4ffcd3e3fc0d5c3d8156de331de89a49e0ce77c9281900390910190a45b50505050505050505050565b6000816040516020018082805190602001908083835b602083106145935780518252601f199092019160209182019101614574565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106146015780518252601f1990920191602091820191016145e2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60008060008060005b61465c86613a90565b156146c5578361467957614672613627876134f8565b92506146ba565b83600114156146955761468e613627876134f8565b91506146ba565b83600214156146b5576146aa61130b876134f8565b9050600194506146ba565b6146c5565b836001019350614653565b8461470b576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6000614722826402540be40063ffffffff61513a16565b6001600160a01b0385166000908152600b6020908152604080832080546000190190556008909152902054909150614760908263ffffffff61325e16565b6001600160a01b0385166000908152600860209081526040808320939093558251630e4f7c3f60e31b81526004810185905292516110049363727be1f89360248083019493928390030190829087803b1580156147bc57600080fd5b505af11580156147d0573d6000803e3d6000fd5b505050506040513d60208110156147e657600080fd5b505161482f576040805162461bcd60e51b81526020600482015260136024820152721dda5d1a191c985dc8189b988819985a5b1959606a1b604482015290519081900360640190fd5b6040516001907ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b90600090a250505050505050565b60008060008060005b61487686613a90565b156148df57836148935761488c613627876134f8565b92506148d4565b83600114156148af576148a8613627876134f8565b91506148d4565b83600214156148cf576148c461130b876134f8565b9050600194506148d4565b6148df565b83600101935061486d565b84614925576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600c60209081526040808320805460001901905560078252808320938616835292905281812081905590516002917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a2505050505050565b6000806000806000805b6149a187613a90565b15614a2657846149be576149b7613627886134f8565b9350614a1b565b84600114156149da576149d3613627886134f8565b9250614a1b565b84600214156149f6576149ef613627886134f8565b9150614a1b565b8460031415614a1657614a0b61130b886134f8565b905060019550614a1b565b614a26565b846001019450614998565b85614a6c576040805162461bcd60e51b81526020600482015260116024820152701c9b1c08191958dbd9194819985a5b1959607a1b604482015290519081900360640190fd5b6001600160a01b038481166000908152600d602090815260408083208054600019019055600982528083208785168085528184528285209588168552948352818420849055825280832093835292905281812081905590516003917ff83de021914a4585482db5ca47d520a5657165b443fa2c7ef8ed4635f054da9b91a250505050505050565b60008183614b425760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a4d578181015183820152602001613a35565b506000838581614b4e57fe5b0495945050505050565b606081516001148015614b8a5750607f60f81b82600081518110614b7857fe5b01602001516001600160f81b03191611155b15614b96575080611211565b612fa4614ba88351608060ff16614d11565b83614c94565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416614bf257506018614c16565b6fffffffffffffffffffffffffffffffff198416614c1257506010614c16565b5060005b6020811015614c4c57818181518110614c2b57fe5b01602001516001600160f81b03191615614c4457614c4c565b600101614c16565b60008160200390506060816040519080825280601f01601f191660200182016040528015614c81576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015614cc5578051835260209283019201614cad565b50855184518101855292509050808201602086015b81831015614cf2578051835260209283019201614cda565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614d61576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411614dbb5782840160f81b81600081518110614d9d57fe5b60200101906001600160f81b031916908160001a9053509050612fa4565b6060614dc685614bae565b90508381510160370160f81b82600081518110614ddf57fe5b60200101906001600160f81b031916908160001a905350614e008282614c94565b95945050505050565b8051600090614e1a57506000611211565b6020820151805160001a9060c0821015614e3957600092505050611211565b5060019392505050565b8051600090811a6080811015614e5d576000915050611211565b60b8811080614e78575060c08110801590614e78575060f881105b15614e87576001915050611211565b60c0811015614e9b5760b519019050611211565b60f519019050611211565b80516000908190811a6080811015614ec15760019150614fd2565b60b8811015614ed657607e1981019150614fd2565b60c0811015614f5057600060b78203600186019550806020036101000a865104915060018101820193505080831015614f4a576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50614fd2565b60f8811015614f655760be1981019150614fd2565b600060f78203600186019550806020036101000a865104915060018101820193505080831015614fd0576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090601514614fea57600080fd5b612fa482613546565b6000606061500c846402540be40063ffffffff6132bf16565b60408051600480825260a0820190925291955060609190816020015b606081526020019060019003908161502857905050905061504b8760ff16613366565b8160008151811061505857fe5b6020026020010181905250615075866001600160a01b0316613343565b8160018151811061508257fe5b602002602001018190525061509685613366565b816002815181106150a357fe5b60200260200101819052506150bd8463ffffffff16613366565b816003815181106150ca57fe5b602002602001018190525060606150e082613379565b94989497509395505050505050565b806150f9576131d4565b5b60208110615119578251825260209283019290910190601f19016150fa565b915181516020939093036101000a6000190180199091169216919091179052565b60008261514957506000612fa4565b8282028284828161515657fe5b04146132b85760405162461bcd60e51b815260040180806020018281038252602181526020018061529f6021913960400191505060405180910390fd5b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806151c46151d1565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe7468652042534352656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f7468652042534352656c61796572466565206d757374206265206c657373207468616e2072656c61796572466565746865206d696e44656c65676174696f6e206d7573742062652067726561746572207468616e2072656c61796572466565696e73756666696369656e742062616c616e636520616674657220726564656c6567617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777468652072656c61796572466565206d6f642074656e20646563696d616c73206d757374206265207a65726f746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163747468652072656c61796572466565206d757374206265206c657373207468616e206d696e44656c65676174696f6e7468652072656c61796572466565206d757374206265206d6f7265207468616e2042534352656c61796572466565696e73756666696369656e742062616c616e636520616674657220756e64656c6567617465746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747468652042534352656c61796572466565206d757374206e6f74206265207a65726fa2646970667358221220636a06a0887551cdb9a837b5adb61e44cf4b37eb8dbfb03e354f34c5e7fe9aed64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000002002": { + "balance": "0x0", + "code": "0x608060405260043610620003db5760003560e01c806376e7d6d61162000203578063c9c048ba1162000117578063dc927faf11620000ad578063f9a2bbc71162000078578063f9a2bbc71462000b5e578063fb50b31f1462000b76578063fc0c5ff11462000b9b578063fd6a68791462000bb357600080fd5b8063dc927faf1462000afe578063df8079e91462000b16578063e8f67c3b1462000b2e578063f999c5061462000b4657600080fd5b8063d6ca429d11620000ee578063d6ca429d1462000a92578063d89e001b1462000ab7578063d8ca511f1462000ace578063daacdb661462000ae657600080fd5b8063c9c048ba14620009e7578063cbb04d9d1462000a1d578063cf06248c1462000a5557600080fd5b8063a43569b31162000199578063b187bd261162000164578063b187bd261462000968578063b801860d1462000992578063c473318f14620009b7578063c81b166214620009cf57600080fd5b8063a43569b314620008d2578063aa82dce11462000906578063aad3ec96146200091e578063ac431751146200094357600080fd5b80638129fc1c11620001da5780638129fc1c14620008725780639dc09262146200088a5780639e8bf70714620008a2578063a1a11bf514620008ba57600080fd5b806376e7d6d6146200081d5780637adcf7e814620008355780637e434d54146200085a57600080fd5b80634e6fd6c411620002fb578063675a00ae116200029157806372672ae4116200025c57806372672ae414620007a05780637475f91314620007c857806375cc7d8914620007e057806375d47a0a146200080557600080fd5b8063675a00ae14620006815780636bd8f80414620006a65780636e47b48214620006cb5780636ec01b2714620006e357600080fd5b80635c19a95c11620002d25780635c19a95c14620006095780635e7cc1c9146200062057806364028fbd1462000645578063663b81c7146200065c57600080fd5b80634e6fd6c414620005c157806351b4dce314620005d957806351e8067214620005f157600080fd5b806338409988116200037157806343756e5c116200034857806343756e5c146200053a578063449ecfe6146200055257806345211bfd14620005775780634d99dd16146200059c57600080fd5b80633840998814620004e55780633a71f2f214620004fd5780633db6f47e146200052257600080fd5b80630e2374a511620003b25780630e2374a514620004435780631fa035ab14620004745780632808702814620004b557806336d1619014620004cd57600080fd5b80630661806e14620003e8578063092193ab14620004135780630c20fe41146200042c57600080fd5b36620003e357005b600080fd5b348015620003f557600080fd5b506200040060025481565b6040519081526020015b60405180910390f35b6200042a6200042436600462007141565b62000bcb565b005b3480156200043957600080fd5b5062000400603081565b3480156200045057600080fd5b506200045b61200181565b6040516001600160a01b0390911681526020016200040a565b3480156200048157600080fd5b5062000499620004933660046200715f565b62001273565b604080519384526020840192909252908201526060016200040a565b348015620004c257600080fd5b506200045b61200581565b348015620004da57600080fd5b506200040060095481565b348015620004f257600080fd5b506200040060035481565b3480156200050a57600080fd5b506200042a6200051c366004620071f5565b6200132d565b3480156200052f57600080fd5b5062000400600a5481565b3480156200054757600080fd5b506200045b61100181565b3480156200055f57600080fd5b506200042a6200057136600462007141565b620014ee565b3480156200058457600080fd5b506200042a6200059636600462007141565b62001729565b348015620005a957600080fd5b506200042a620005bb3660046200724e565b620018d5565b348015620005ce57600080fd5b506200045b61dead81565b348015620005e657600080fd5b506200045b61200681565b348015620005fe57600080fd5b506200045b61200081565b6200042a6200061a36600462007141565b62001ea0565b3480156200062d57600080fd5b506200042a6200063f36600462007291565b620024a6565b6200042a620006563660046200730e565b6200268d565b3480156200066957600080fd5b506200042a6200067b366004620073de565b62002b96565b3480156200068e57600080fd5b506200042a620006a036600462007450565b6200302c565b348015620006b357600080fd5b506200042a620006c536600462007486565b62003254565b348015620006d857600080fd5b506200045b61100581565b348015620006f057600080fd5b506200076d6200070236600462007141565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03949094168452600d82529282902082519384018352600801546001600160401b038082168552600160401b8204811692850192909252600160801b9004169082015290565b6040805182516001600160401b03908116825260208085015182169083015292820151909216908201526060016200040a565b348015620007ad57600080fd5b50620007b862003f4d565b6040516200040a92919062007574565b348015620007d557600080fd5b506200042a620040ec565b348015620007ed57600080fd5b506200042a620007ff36600462007141565b62004144565b3480156200081257600080fd5b506200045b61100881565b3480156200082a57600080fd5b506200040060085481565b3480156200084257600080fd5b506200045b620008543660046200761b565b620042fd565b3480156200086757600080fd5b506200045b61200381565b3480156200087f57600080fd5b506200042a62004335565b3480156200089757600080fd5b506200045b61100781565b348015620008af57600080fd5b506200040060075481565b348015620008c757600080fd5b506200045b61100681565b348015620008df57600080fd5b50620008f7620008f136600462007141565b62004456565b6040516200040a919062007660565b3480156200091357600080fd5b506200045b61200281565b3480156200092b57600080fd5b506200042a6200093d3660046200724e565b62004716565b3480156200095057600080fd5b506200042a62000962366004620076e6565b62004860565b3480156200097557600080fd5b50600054610100900460ff1660405190151581526020016200040a565b3480156200099f57600080fd5b506200042a620009b13660046200774c565b62005878565b348015620009c457600080fd5b506200040060045481565b348015620009dc57600080fd5b506200045b61100281565b348015620009f457600080fd5b5062000a0c62000a063660046200779b565b62005a38565b6040516200040a9392919062007804565b34801562000a2a57600080fd5b5062000a4262000a3c36600462007141565b62006044565b6040516200040a95949392919062007868565b34801562000a6257600080fd5b506200045b62000a7436600462007141565b6001600160a01b039081166000908152600f60205260409020541690565b34801562000a9f57600080fd5b506200042a62000ab1366004620078aa565b62006478565b34801562000ac457600080fd5b5062000400606081565b34801562000adb57600080fd5b506200040060065481565b34801562000af357600080fd5b506200040060115481565b34801562000b0b57600080fd5b506200045b61100381565b34801562000b2357600080fd5b506200045b61200481565b34801562000b3b57600080fd5b506200040060015481565b34801562000b5357600080fd5b506200042a620065c7565b34801562000b6b57600080fd5b506200045b61100081565b34801562000b8357600080fd5b506200042a62000b95366004620076e6565b62006623565b34801562000ba857600080fd5b506200040060055481565b34801562000bc057600080fd5b506200045b61100481565b336110001462000c3b5760405162461bcd60e51b815260206004820152603060248201527f746865206d6573736167652073656e646572206d7573742062652076616c696460448201526f185d1bdc94d95d0818dbdb9d1c9858dd60821b60648201526084015b60405180910390fd5b6001600160a01b038082166000908152600f60209081526040808320548416808452600d8352818420825161014081018452815487168152600182015487169481019490945260028101549095169183019190915260038401805491949160608401919062000caa90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462000cd890620078e2565b801562000d295780601f1062000cfd5761010080835404028352916020019162000d29565b820191906000526020600020905b81548152906001019060200180831162000d0b57829003601f168201915b505050505081526020016004820160405180608001604052908160008201805462000d5490620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462000d8290620078e2565b801562000dd35780601f1062000da75761010080835404028352916020019162000dd3565b820191906000526020600020905b81548152906001019060200180831162000db557829003601f168201915b5050505050815260200160018201805462000dee90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462000e1c90620078e2565b801562000e6d5780601f1062000e415761010080835404028352916020019162000e6d565b820191906000526020600020905b81548152906001019060200180831162000e4f57829003601f168201915b5050505050815260200160028201805462000e8890620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462000eb690620078e2565b801562000f075780601f1062000edb5761010080835404028352916020019162000f07565b820191906000526020600020905b81548152906001019060200180831162000ee957829003601f168201915b5050505050815260200160038201805462000f2290620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462000f5090620078e2565b801562000fa15780601f1062000f755761010080835404028352916020019162000fa1565b820191906000526020600020905b81548152906001019060200180831162000f8357829003601f168201915b505050919092525050508152604080516060808201835260088501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600984015460ff16151582840152600a84015490830152600b8301546080830152805161028081019182905260a09092019190600c84019060149082845b8154815260200190600101908083116200102d575050509190925250505060408101519091506001600160a01b031615806200106a57508060c001515b15620010db57816001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d604051620010ce9060208082526011908201527024a72b20a624a22fab20a624a220aa27a960791b604082015260600190565b60405180910390a2505050565b60408181015160a0830151519151632f303ebb60e11b81526001600160401b0390921660048301526001600160a01b031690635e607d769034906024016000604051808303818588803b1580156200113257600080fd5b505af19350505050801562001145575060015b62001231576200115462007918565b806308c379a003620011c257506200116b6200797a565b80620011785750620011c4565b826001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d82604051620011b3919062007a09565b60405180910390a2506200126d565b505b3d808015620011f0576040519150601f19603f3d011682016040523d82523d6000602084013e620011f5565b606091505b50826001600160a01b03167ffc8bff675087dd2da069cc3fb517b9ed001e19750c0865241a5542dba1ba170d82604051620011b3919062007a09565b816001600160a01b03167fe34918ff1c7084970068b53fd71ad6d8b04e9f15d3886cbf006443e6cdc52ea634604051620010ce91815260200190565b50505b50565b600080600080620012868787876200681c565b60008181526010602090815260408083208151608081018352815481526001820154938101939093526002808201546001600160f81b0381169385019390935294955092939192916060840191600160f81b900460ff1690811115620012f057620012f062007a1e565b600281111562001304576200130462007a1e565b905250602081015160408201519151909a6001600160f81b039092169950975095505050505050565b600054610100900460ff1615620013585760405162461bcd60e51b815260040162000c329062007a34565b816000816001600160401b0381111562001376576200137662007935565b604051908082528060200260200182016040528015620013a0578160200160208202803683370190505b5090506000805b838110156200148857600d6000888884818110620013c957620013c962007a5b565b9050602002016020810190620013e0919062007141565b6001600160a01b03908116825260208201929092526040016000206002015416915081620014475760405162461bcd60e51b81526020600482015260136024820152721d985b1a59185d1bdc881b9bdd08195e1a5cdd606a1b604482015260640162000c32565b818382815181106200145d576200145d62007a5b565b6001600160a01b0390921660209283029190910190910152620014808162007a87565b9050620013a7565b50604051631d38f97960e11b815261200590633a71f2f290620014b2908590889060040162007aa3565b600060405180830381600087803b158015620014cd57600080fd5b505af1158015620014e2573d6000803e3d6000fd5b50505050505050505050565b600054610100900460ff1615620015195760405162461bcd60e51b815260040162000c329062007a34565b6001600160a01b038082166000908152600d6020526040902060020154829116620015585760405162461bcd60e51b815260040162000c329062007acf565b6001600160a01b0382166000908152600d60205260409020600981015460ff16620015b35760405162461bcd60e51b815260206004820152600a6024820152691393d517d2905253115160b21b604482015260640162000c32565b6002548160020160009054906101000a90046001600160a01b03166001600160a01b031663169864896040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200160c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001632919062007afc565b1015620016825760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f53454c465f44454c45474154494f4e000000000000604482015260640162000c32565b4281600a01541115620016c75760405162461bcd60e51b815260206004820152600c60248201526b14d512531317d2905253115160a21b604482015260640162000c32565b60098101805460ff191690556011805460019190600090620016eb90849062007b16565b90915550506040516001600160a01b038416907f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f1990600090a2505050565b600054610100900460ff1615620017545760405162461bcd60e51b815260040162000c329062007a34565b336000818152600d60205260409020600201546001600160a01b03166200178f5760405162461bcd60e51b815260040162000c329062007acf565b6001600160a01b038216620017b85760405162461bcd60e51b815260040162000c329062007b2c565b6001600160a01b038281166000908152600f60205260409020541615620018225760405162461bcd60e51b815260206004820152601b60248201527f4455504c49434154455f434f4e53454e5355535f414444524553530000000000604482015260640162000c32565b336000818152600d60205260409020600b810154429062001847906201518062007b63565b1115620018685760405162461bcd60e51b815260040162000c329062007b79565b80546001600160a01b038086166001600160a01b03199283168117845542600b8501556000818152600f60205260408082208054948816949095168417909455925190927f6e4e747ca35203f16401c69805c7dd52fff67ef60b0ebc5c7fe16890530f223591a350505050565b600054610100900460ff1615620019005760405162461bcd60e51b815260040162000c329062007a34565b6001600160a01b038083166000908152600d60205260409020600201548391166200193f5760405162461bcd60e51b815260040162000c329062007acf565b60008211620019895760405162461bcd60e51b81526020600482015260156024820152741253959053125117d4d210549154d7d05353d55395605a1b604482015260640162000c32565b6001600160a01b038084166000908152600d6020908152604080832081516101408101835281548616815260018201548616938101939093526002810154909416908201526003830180543394916060840191620019e790620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462001a1590620078e2565b801562001a665780601f1062001a3a5761010080835404028352916020019162001a66565b820191906000526020600020905b81548152906001019060200180831162001a4857829003601f168201915b505050505081526020016004820160405180608001604052908160008201805462001a9190620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462001abf90620078e2565b801562001b105780601f1062001ae45761010080835404028352916020019162001b10565b820191906000526020600020905b81548152906001019060200180831162001af257829003601f168201915b5050505050815260200160018201805462001b2b90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462001b5990620078e2565b801562001baa5780601f1062001b7e5761010080835404028352916020019162001baa565b820191906000526020600020905b81548152906001019060200180831162001b8c57829003601f168201915b5050505050815260200160028201805462001bc590620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462001bf390620078e2565b801562001c445780601f1062001c185761010080835404028352916020019162001c44565b820191906000526020600020905b81548152906001019060200180831162001c2657829003601f168201915b5050505050815260200160038201805462001c5f90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462001c8d90620078e2565b801562001cde5780601f1062001cb25761010080835404028352916020019162001cde565b820191906000526020600020905b81548152906001019060200180831162001cc057829003601f168201915b505050919092525050508152604080516060808201835260088501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600984015460ff16151582840152600a84015490830152600b8301546080830152805161028081019182905260a09092019190600c84019060149082845b81548152602001906001019080831162001d6a575050509190925250505060408082015190516326ccee8b60e11b81526001600160a01b0385811660048301526024820188905292935060009290911690634d99dd16906044016020604051808303816000875af115801562001de4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e0a919062007afc565b9050826001600160a01b0316866001600160a01b03167f3aace7340547de7b9156593a7652dc07ee900cea3fd8f82cb6c9d38b40829802878460405162001e5b929190918252602082015260400190565b60405180910390a3856001600160a01b0316836001600160a01b03160362001e885762001e888662006854565b62001e988260400151846200696f565b505050505050565b600054610100900460ff161562001ecb5760405162461bcd60e51b815260040162000c329062007a34565b6001600160a01b038082166000908152600d602052604090206002015482911662001f0a5760405162461bcd60e51b815260040162000c329062007acf565b600354349081101562001f605760405162461bcd60e51b815260206004820152601960248201527f494e56414c49445f44454c45474154494f4e5f414d4f554e5400000000000000604482015260640162000c32565b6001600160a01b038084166000908152600d602090815260408083208151610140810183528154861681526001820154861693810193909352600281015490941690820152600383018054339491606084019162001fbe90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462001fec90620078e2565b80156200203d5780601f1062002011576101008083540402835291602001916200203d565b820191906000526020600020905b8154815290600101906020018083116200201f57829003601f168201915b50505050508152602001600482016040518060800160405290816000820180546200206890620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200209690620078e2565b8015620020e75780601f10620020bb57610100808354040283529160200191620020e7565b820191906000526020600020905b815481529060010190602001808311620020c957829003601f168201915b505050505081526020016001820180546200210290620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200213090620078e2565b8015620021815780601f10620021555761010080835404028352916020019162002181565b820191906000526020600020905b8154815290600101906020018083116200216357829003601f168201915b505050505081526020016002820180546200219c90620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620021ca90620078e2565b80156200221b5780601f10620021ef576101008083540402835291602001916200221b565b820191906000526020600020905b815481529060010190602001808311620021fd57829003601f168201915b505050505081526020016003820180546200223690620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200226490620078e2565b8015620022b55780601f106200228957610100808354040283529160200191620022b5565b820191906000526020600020905b8154815290600101906020018083116200229757829003601f168201915b505050919092525050508152604080516060808201835260088501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600984015460ff16151582840152600a84015490830152600b8301546080830152805161028081019182905260a09092019190600c84019060149082845b815481526020019060010190808311620023415750505050508152505090508060c0015115620023c557846001600160a01b0316826001600160a01b031614620023c55760405162461bcd60e51b815260206004820152601460248201527327a7262cafa9a2a6232fa222a622a3a0aa24a7a760611b604482015260640162000c32565b60408082015190516317066a5760e21b81526001600160a01b0384811660048301526000921690635c19a95c90869060240160206040518083038185885af115801562002416573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906200243d919062007afc565b9050826001600160a01b0316866001600160a01b03167f24d7bda8602b916d64417f0dbfe2e2e88ec9b1157bd9f596dfdb91ba26624e0483876040516200248e929190918252602082015260400190565b60405180910390a362001e988260400151846200696f565b600054610100900460ff1615620024d15760405162461bcd60e51b815260040162000c329062007a34565b336000818152600d60205260409020600201546001600160a01b03166200250c5760405162461bcd60e51b815260040162000c329062007acf565b336000818152600d60205260409020600b810154429062002531906201518062007b63565b1115620025525760405162461bcd60e51b815260040162000c329062007b79565b60088101546001600160401b03600160401b909104811690851611156200258d5760405162461bcd60e51b815260040162000c329062007ba8565b60088101546000906001600160401b039081169086161015620025cb576008820154620025c59086906001600160401b031662007bdf565b620025e5565b6008820154620025e5906001600160401b03168662007bdf565b60088301546001600160401b039182169250600160801b900416811115620026215760405162461bcd60e51b815260040162000c329062007ba8565b60088201805467ffffffffffffffff19166001600160401b03871690811790915542600b8401556040519081526001600160a01b038416907f78cdd96edf59e09cfd4d26ef6ef6c92d166effe6a40970c54821206d541932cb9060200160405180910390a25050505050565b600054610100900460ff1615620026b85760405162461bcd60e51b815260040162000c329062007a34565b336000818152600d60205260409020600201546001600160a01b031615620027175760405162461bcd60e51b81526020600482015260116024820152701590531251105513d497d1561254d51151607a1b604482015260640162000c32565b6001600160a01b038881166000908152600f60205260409020541615620027815760405162461bcd60e51b815260206004820152601b60248201527f4455504c49434154455f434f4e53454e5355535f414444524553530000000000604482015260640162000c32565b60006001600160a01b0316600e8888604051620027a092919062007c09565b908152604051908190036020019020546001600160a01b031614620028015760405162461bcd60e51b81526020600482015260166024820152754455504c49434154455f564f54455f4144445245535360501b604482015260640162000c32565b6002543490811015620028575760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f53454c465f44454c45474154494f4e000000000000604482015260640162000c32565b62002869604085016020860162007291565b6001600160401b031662002881602086018662007291565b6001600160401b03161115620028ab5760405162461bcd60e51b815260040162000c329062007ba8565b620028bd604085016020860162007291565b6001600160401b0316620028d8606086016040870162007291565b6001600160401b03161115620029315760405162461bcd60e51b815260206004820152601760248201527f494e56414c49445f4d41585f4348414e47455f52415445000000000000000000604482015260640162000c32565b6200297c62002941848062007c19565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062006a1992505050565b620029bc5760405162461bcd60e51b815260206004820152600f60248201526e24a72b20a624a22fa6a7a724a5a2a960891b604482015260640162000c32565b620029ca8888888862006bbb565b620029e95760405162461bcd60e51b815260040162000c329062007c62565b600062002a3783620029fc868062007c19565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525062006d3092505050565b905062002a46600b8462006dfa565b506001600160a01b038381166000818152600d6020526040902080546001600160a01b03199081168e851617825560018201805482169093179092556002810180549092169284169290921790556003810162002aa58a8c8362007cef565b50846004820162002ab7828262007db7565b508690506008820162002acb828262007eea565b505042600b8201556001600160a01b038b81166000908152600f60205260409081902080546001600160a01b03191692871692909217909155518490600e9062002b19908d908d9062007c09565b90815260405190819003602001812080546001600160a01b039384166001600160a01b03199091161790558382169186811691908e16907faecd9fb95e79c75a3a1de93362c6be5fe6ab65770d8614be583884161cd8228d9062002b81908f908f9062007fba565b60405180910390a45050505050505050505050565b33411462002bb85760405162461bcd60e51b815260040162000c329062007fd0565b3a1562002bff5760405162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015260640162000c32565b82600081900362002c11575062003026565b6012548181111562002ccd57815b8181101562002ccb57601280548062002c3c5762002c3c6200801d565b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b0319169055600301559055601380548062002c985762002c986200801d565b60019003818190600052602060002001600062002cb69190620070bc565b905562002cc38162007a87565b905062002c1f565b505b6000805b8381101562002fc257600088888381811062002cf15762002cf162007a5b565b905060200201602081019062002d08919062007141565b6001600160a01b038082166000908152600f6020526040902054919250168062002d3457505062002faf565b84841062002eb25760126040518060c00160405280846001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020018a8a8781811062002d8d5762002d8d62007a5b565b905060200201602081019062002da4919062007291565b6001600160401b039081168252600060208084018290526040938401829052855460018181018855968352818320865160049092020180546001600160a01b039283166001600160a01b031991821617825587840151828a018054918516919092161790558686015160028201805460608a015160808b01511515600160e01b0260ff60e01b1991909916600160a01b026001600160e01b03199092169386169390931717919091169590951790945560a0909501516003938401559386168152600d9093529082206013805494850181559092527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0909092019162002eab91018262008033565b5062002f9f565b60006012858154811062002eca5762002eca62007a5b565b6000918252602090912060049091020180546001600160a01b0319166001600160a01b038516178155905088888581811062002f0a5762002f0a62007a5b565b905060200201602081019062002f21919062007291565b6002820180546001600160401b0392909216600160a01b0267ffffffffffffffff60a01b199092169190911790556001600160a01b0382166000908152600d60205260409020601380546003909201918790811062002f845762002f8462007a5b565b90600052602060002001908162002f9c919062008033565b50505b62002faa8462007a87565b935050505b62002fba8162007a87565b905062002cd1565b5060405163126da76b60e11b8152611000906324db4ed69062002fee90601290601390600401620081e6565b600060405180830381600087803b1580156200300957600080fd5b505af11580156200301e573d6000803e3d6000fd5b505050505050505b50505050565b3361100114620030505760405162461bcd60e51b815260040162000c329062008299565b6001600160a01b038084166000908152600f602052604090205416806200308b5760405162461bcd60e51b815260040162000c329062007b2c565b6001600160a01b038082166000908152600d602052604090206002810154909116620030cb5760405162461bcd60e51b815260040162000c329062007acf565b42600a5484620030dc919062007b63565b10156200311f5760405162461bcd60e51b815260206004820152601060248201526f11559251115390d157d513d3d7d3d31160821b604482015260640162000c32565b600281015460075460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562003172573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003198919062007afc565b9050620031a58262006e18565b6000620031b6848388600062006ef6565b9050806000015483600a01541015620031d1578054600a8401555b8054600182015460028301546040516001600160a01b038816937fc0929f76bd4b0cbd3d2e68001c17b2b7ef24e7cb5b6e67c2b32453f2d51683b6936200322993919290916001600160f81b031690600090620082e2565b60405180910390a260028301546200324b906001600160a01b0316856200696f565b50505050505050565b600054610100900460ff16156200327f5760405162461bcd60e51b815260040162000c329062007a34565b6001600160a01b038084166000908152600d6020526040902060020154849116620032be5760405162461bcd60e51b815260040162000c329062007acf565b6001600160a01b038084166000908152600d6020526040902060020154849116620032fd5760405162461bcd60e51b815260040162000c329062007acf565b6001600160a01b0384166000908152600d6020526040902060090154849060ff1615620033605760405162461bcd60e51b815260206004820152601060248201526f1590531251105513d497d2905253115160821b604482015260640162000c32565b60008411620033aa5760405162461bcd60e51b81526020600482015260156024820152741253959053125117d4d210549154d7d05353d55395605a1b604482015260640162000c32565b6001600160a01b038087166000908152600d60209081526040808320815161014081018352815486168152600182015486169381019390935260028101549094169082015260038301805433949160608401916200340890620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200343690620078e2565b8015620034875780601f106200345b5761010080835404028352916020019162003487565b820191906000526020600020905b8154815290600101906020018083116200346957829003601f168201915b5050505050815260200160048201604051806080016040529081600082018054620034b290620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620034e090620078e2565b8015620035315780601f10620035055761010080835404028352916020019162003531565b820191906000526020600020905b8154815290600101906020018083116200351357829003601f168201915b505050505081526020016001820180546200354c90620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200357a90620078e2565b8015620035cb5780601f106200359f57610100808354040283529160200191620035cb565b820191906000526020600020905b815481529060010190602001808311620035ad57829003601f168201915b50505050508152602001600282018054620035e690620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200361490620078e2565b8015620036655780601f10620036395761010080835404028352916020019162003665565b820191906000526020600020905b8154815290600101906020018083116200364757829003601f168201915b505050505081526020016003820180546200368090620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620036ae90620078e2565b8015620036ff5780601f10620036d357610100808354040283529160200191620036ff565b820191906000526020600020905b815481529060010190602001808311620036e157829003601f168201915b505050919092525050508152604080516060808201835260088501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600984015460ff16151582840152600a84015490830152600b8301546080830152805161028081019182905260a09092019190600c84019060149082845b8154815260200190600101908083116200378b57505050919092525050506001600160a01b038089166000908152600d602090815260408083208151610140810183528154861681526001820154861693810193909352600281015490941690820152600383018054949550919390929160608401916200380c90620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200383a90620078e2565b80156200388b5780601f106200385f576101008083540402835291602001916200388b565b820191906000526020600020905b8154815290600101906020018083116200386d57829003601f168201915b5050505050815260200160048201604051806080016040529081600082018054620038b690620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620038e490620078e2565b8015620039355780601f10620039095761010080835404028352916020019162003935565b820191906000526020600020905b8154815290600101906020018083116200391757829003601f168201915b505050505081526020016001820180546200395090620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200397e90620078e2565b8015620039cf5780601f10620039a357610100808354040283529160200191620039cf565b820191906000526020600020905b815481529060010190602001808311620039b157829003601f168201915b50505050508152602001600282018054620039ea90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462003a1890620078e2565b801562003a695780601f1062003a3d5761010080835404028352916020019162003a69565b820191906000526020600020905b81548152906001019060200180831162003a4b57829003601f168201915b5050505050815260200160038201805462003a8490620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462003ab290620078e2565b801562003b035780601f1062003ad75761010080835404028352916020019162003b03565b820191906000526020600020905b81548152906001019060200180831162003ae557829003601f168201915b505050919092525050508152604080516060808201835260088501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600984015460ff16151582840152600a84015490830152600b8301546080830152805161028081019182905260a09092019190600c84019060149082845b81548152602001906001019080831162003b8f57505050505081525050905060035482604001516001600160a01b03166391faf0b4896040518263ffffffff1660e01b815260040162003be491815260200190565b602060405180830381865afa15801562003c02573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003c28919062007afc565b101562003c785760405162461bcd60e51b815260206004820152601b60248201527f494e56414c49445f524544454c45474154494f4e5f414d4f554e540000000000604482015260640162000c32565b8060c001511562003cdd57876001600160a01b0316836001600160a01b03161462003cdd5760405162461bcd60e51b815260206004820152601460248201527327a7262cafa9a2a6232fa222a622a3a0aa24a7a760611b604482015260640162000c32565b60408083015190516352e82ce560e11b81526001600160a01b038581166004830152602482018a9052600092169063a5d059ca906044016020604051808303816000875af115801562003d34573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003d5a919062007afc565b60408084015190516317066a5760e21b81526001600160a01b03878116600483015292935060009290911690635c19a95c90849060240160206040518083038185885af115801562003db0573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062003dd7919062007afc565b604080518b8152602081018390529081018490529091506001600160a01b03808716918c8216918e16907ffdac6e81913996d95abcc289e90f2d8bd235487ce6fe6f821e7d21002a1915b49060600160405180910390a48a6001600160a01b0316856001600160a01b03160362003e535762003e538b62006854565b60408051600280825260608201835260009260208301908036833701905050905084604001518160008151811062003e8f5762003e8f62007a5b565b60200260200101906001600160a01b031690816001600160a01b03168152505083604001518160018151811062003eca5762003eca62007a5b565b6001600160a01b0390921660209283029190910190910152604051631d38f97960e11b815261200590633a71f2f29062003f0b9084908a9060040162007aa3565b600060405180830381600087803b15801562003f2657600080fd5b505af115801562003f3b573d6000803e3d6000fd5b50505050505050505050505050505050565b6060806012601381805480602002602001604051908101604052809291908181526020016000905b82821015620040015760008481526020908190206040805160c0810182526004860290920180546001600160a01b039081168452600180830154821685870152600283015491821693850193909352600160a01b81046001600160401b03166060850152600160e01b900460ff16151560808401526003015460a0830152908352909201910162003f75565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015620040de5783829060005260206000200180546200404a90620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200407890620078e2565b8015620040c95780601f106200409d57610100808354040283529160200191620040c9565b820191906000526020600020905b815481529060010190602001808311620040ab57829003601f168201915b50505050508152602001906001019062004028565b505050509050915091509091565b3361100714620041105760405162461bcd60e51b815260040162000c32906200832d565b6000805461ff00191681556040517fedaeeae9aed70c4545d3ab0065713261c9cee8d6cf5c8b07f52f0a65fd91efda9190a1565b3361100114620041685760405162461bcd60e51b815260040162000c329062008299565b6001600160a01b038082166000908152600f60205260409020541680620041a35760405162461bcd60e51b815260040162000c329062007b2c565b6001600160a01b038082166000908152600d602052604090206002810154909116620041e35760405162461bcd60e51b815260040162000c329062007acf565b600281015460065460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562004236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200425c919062007afc565b9050620042698262006e18565b6000600854426200427b919062007b63565b90508083600a015410156200429257600a83018190555b836001600160a01b03167fc0929f76bd4b0cbd3d2e68001c17b2b7ef24e7cb5b6e67c2b32453f2d51683b68284436001604051620042d49493929190620082e2565b60405180910390a26002830154620042f6906001600160a01b0316856200696f565b5050505050565b6000600e83836040516200431392919062007c09565b908152604051908190036020019020546001600160a01b031690505b92915050565b334114620043575760405162461bcd60e51b815260040162000c329062007fd0565b3a156200439e5760405162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015260640162000c32565b60005460ff1615620043e95760405162461bcd60e51b81526020600482015260136024820152721053149150511657d253925512505312569151606a1b604482015260640162000c32565b6108fc6001908155686c6b935b8bbd400000600255670de0b6b3a7640000600355601d60045562093a806005556802b5e3af16b188000060065569021e19e0c9bab24000006007556202a3006008556303c26700600955621baf80600a556000805460ff19169091179055565b620044826040518060800160405280606081526020016060815260200160608152602001606081525090565b6001600160a01b0382166000908152600d602052604090819020815160808101909252600401805482908290620044b990620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620044e790620078e2565b8015620045385780601f106200450c5761010080835404028352916020019162004538565b820191906000526020600020905b8154815290600101906020018083116200451a57829003601f168201915b505050505081526020016001820180546200455390620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200458190620078e2565b8015620045d25780601f10620045a657610100808354040283529160200191620045d2565b820191906000526020600020905b815481529060010190602001808311620045b457829003601f168201915b50505050508152602001600282018054620045ed90620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200461b90620078e2565b80156200466c5780601f1062004640576101008083540402835291602001916200466c565b820191906000526020600020905b8154815290600101906020018083116200464e57829003601f168201915b505050505081526020016003820180546200468790620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620046b590620078e2565b8015620047065780601f10620046da5761010080835404028352916020019162004706565b820191906000526020600020905b815481529060010190602001808311620046e857829003601f168201915b5050505050815250509050919050565b600054610100900460ff1615620047415760405162461bcd60e51b815260040162000c329062007a34565b6001600160a01b038083166000908152600d6020526040902060020154839116620047805760405162461bcd60e51b815260040162000c329062007acf565b6001600160a01b038381166000908152600d6020526040808220600201549051635569f64b60e11b8152336004820152602481018690529192169063aad3ec96906044016020604051808303816000875af1158015620047e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200480a919062007afc565b9050336001600160a01b0316846001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd3992683836040516200485291815260200190565b60405180910390a350505050565b3361100714620048845760405162461bcd60e51b815260040162000c32906200832d565b620048f16040518060400160405280601081526020016f1d1c985b9cd9995c91d85cd31a5b5a5d60821b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b1562004a035760208114620049555760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f66207472616e736665724761734c696d6974206d69736d616044820152620e8c6d60eb1b606482015260840162000c32565b604080516020601f8401819004810282018101909252828152600091620049989185858083850183828082843760009201919091525092939250506200701f9050565b90506108fc811015620049fa5760405162461bcd60e51b8152602060048201526024808201527f746865207472616e736665724761734c696d6974206973206f7574206f662072604482015263616e676560e01b606482015260840162000c32565b60015562005833565b62004a746040518060400160405280601481526020017336b4b729b2b6332232b632b3b0ba34b7b721272160611b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b1562004b94576020811462004adc5760405162461bcd60e51b815260206004820152602760248201527f6c656e677468206f66206d696e53656c6644656c65676174696f6e424e42206d6044820152660d2e6dac2e8c6d60cb1b606482015260840162000c32565b604080516020601f840181900481028201810190925282815260009162004b1f9185858083850183828082843760009201919091525092939250506200701f9050565b9050683635c9adc5dea0000081101562004b8d5760405162461bcd60e51b815260206004820152602860248201527f746865206d696e53656c6644656c65676174696f6e424e42206973206f7574206044820152676f662072616e676560c01b606482015260840162000c32565b5062005833565b62004c07604051806040016040528060168152602001756d696e44656c65676174696f6e424e424368616e676560501b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b1562004d2c576020811462004c715760405162461bcd60e51b815260206004820152602960248201527f6c656e677468206f66206d696e44656c65676174696f6e424e424368616e6765604482015268040dad2e6dac2e8c6d60bb1b606482015260840162000c32565b604080516020601f840181900481028201810190925282815260009162004cb49185858083850183828082843760009201919091525092939250506200701f9050565b9050670de0b6b3a764000081101562004d235760405162461bcd60e51b815260206004820152602a60248201527f746865206d696e44656c65676174696f6e424e424368616e6765206973206f7560448201526974206f662072616e676560b01b606482015260840162000c32565b60035562005833565b62004d9d604051806040016040528060148152602001736d6178456c656374656456616c696461746f727360601b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b1562004eb7576020811462004e055760405162461bcd60e51b815260206004820152602760248201527f6c656e677468206f66206d6178456c656374656456616c696461746f7273206d6044820152660d2e6dac2e8c6d60cb1b606482015260840162000c32565b604080516020601f840181900481028201810190925282815260009162004e489185858083850183828082843760009201919091525092939250506200701f9050565b9050600181101562004eae5760405162461bcd60e51b815260206004820152602860248201527f746865206d6178456c656374656456616c696461746f7273206973206f7574206044820152676f662072616e676560c01b606482015260840162000c32565b60045562005833565b62004f206040518060400160405280600c81526020016b1d5b989bdb9914195c9a5bd960a21b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b156200501b576020811462004f785760405162461bcd60e51b815260206004820152601f60248201527f6c656e677468206f6620756e626f6e64506572696f64206d69736d6174636800604482015260640162000c32565b604080516020601f840181900481028201810190925282815260009162004fbb9185858083850183828082843760009201919091525092939250506200701f9050565b90506203f480811015620050125760405162461bcd60e51b815260206004820181905260248201527f74686520756e626f6e64506572696f64206973206f7574206f662072616e6765604482015260640162000c32565b60055562005833565b6200508b60405180604001604052806013815260200172191bdddb9d1a5b5954db185cda105b5bdd5b9d606a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b15620051b85760208114620050f25760405162461bcd60e51b815260206004820152602660248201527f6c656e677468206f6620646f776e74696d65536c617368416d6f756e74206d696044820152650e6dac2e8c6d60d31b606482015260840162000c32565b604080516020601f8401819004810282018101909252828152600091620051359185858083850183828082843760009201919091525092939250506200701f9050565b9050674563918244f40000811015801562005151575060075481105b620051af5760405162461bcd60e51b815260206004820152602760248201527f74686520646f776e74696d65536c617368416d6f756e74206973206f7574206f604482015266662072616e676560c81b606482015260840162000c32565b60065562005833565b6200522a60405180604001604052806015815260200174191bdd589b1954da59db94db185cda105b5bdd5b9d605a1b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b156200535c5760208114620052935760405162461bcd60e51b815260206004820152602860248201527f6c656e677468206f6620646f75626c655369676e536c617368416d6f756e74206044820152670dad2e6dac2e8c6d60c31b606482015260840162000c32565b604080516020601f8401819004810282018101909252828152600091620052d69185858083850183828082843760009201919091525092939250506200701f9050565b9050683635c9adc5dea000008110158015620052f3575060065481115b620053535760405162461bcd60e51b815260206004820152602960248201527f74686520646f75626c655369676e536c617368416d6f756e74206973206f7574604482015268206f662072616e676560b81b606482015260840162000c32565b60075562005833565b620053c96040518060400160405280601081526020016f646f776e74696d654a61696c54696d6560801b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b15620054ea57602081146200542d5760405162461bcd60e51b815260206004820152602360248201527f6c656e677468206f6620646f776e74696d654a61696c54696d65206d69736d616044820152620e8c6d60eb1b606482015260840162000c32565b604080516020601f8401819004810282018101909252828152600091620054709185858083850183828082843760009201919091525092939250506200701f9050565b90506202a300811015801562005487575060095481105b620054e15760405162461bcd60e51b8152602060048201526024808201527f74686520646f776e74696d654a61696c54696d65206973206f7574206f662072604482015263616e676560e01b606482015260840162000c32565b60085562005833565b6200555960405180604001604052806012815260200171646f75626c655369676e4a61696c54696d6560701b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b156200567f5760208114620055bf5760405162461bcd60e51b815260206004820152602560248201527f6c656e677468206f6620646f75626c655369676e4a61696c54696d65206d69736044820152640dac2e8c6d60db1b606482015260840162000c32565b604080516020601f8401819004810282018101909252828152600091620056029185858083850183828082843760009201919091525092939250506200701f9050565b90506283d600811015801562005619575060085481115b620056765760405162461bcd60e51b815260206004820152602660248201527f74686520646f75626c655369676e4a61696c54696d65206973206f7574206f666044820152652072616e676560d01b606482015260840162000c32565b60095562005833565b620056ea6040518060400160405280600e81526020016d6d617845766964656e636541676560901b81525085858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505062006fc29050565b15620057fa57602081146200574c5760405162461bcd60e51b815260206004820152602160248201527f6c656e677468206f66206d617845766964656e6365416765206d69736d6174636044820152600d60fb1b606482015260840162000c32565b604080516020601f84018190048102820181019092528281526000916200578f9185858083850183828082843760009201919091525092939250506200701f9050565b905062093a80811015620057f15760405162461bcd60e51b815260206004820152602260248201527f746865206d617845766964656e6365416765206973206f7574206f662072616e604482015261676560f01b606482015260840162000c32565b600a5562005833565b60405162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015260640162000c32565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633848484846040516200586a94939291906200837b565b60405180910390a150505050565b33611001146200589c5760405162461bcd60e51b815260040162000c329062008299565b6000600e8484604051620058b292919062007c09565b908152604051908190036020019020546001600160a01b0316905080620058ed5760405162461bcd60e51b815260040162000c329062007b2c565b6001600160a01b038082166000908152600d6020526040902060028101549091166200592d5760405162461bcd60e51b815260040162000c329062007acf565b600281015460075460405163045bc4d160e41b815260048101919091526000916001600160a01b0316906345bc4d10906024016020604051808303816000875af115801562005980573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620059a6919062007afc565b9050620059b38262006e18565b6000620059c4848387600262006ef6565b9050806000015483600a01541015620059df578054600a8401555b805460018201546002808401546040516001600160a01b038916947fc0929f76bd4b0cbd3d2e68001c17b2b7ef24e7cb5b6e67c2b32453f2d51683b6946200322994919390926001600160f81b039091169190620082e2565b606080600062005a49600b62007024565b9050808510156200603d57831562005a62578362005a64565b805b935060008462005a75878462007b16565b1162005a8d5762005a87868362007b16565b62005a8f565b845b9050806001600160401b0381111562005aac5762005aac62007935565b60405190808252806020026020018201604052801562005ad6578160200160208202803683370190505b509350806001600160401b0381111562005af45762005af462007935565b60405190808252806020026020018201604052801562005b1e578160200160208202803683370190505b50925060005b818110156200603a57600062005b4862005b3f838a62007b63565b600b906200702f565b6001600160a01b038082166000908152600d6020908152604080832081516101408101835281548616815260018201548616938101939093526002810154909416908201526003830180549495509193909291606084019162005bab90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462005bd990620078e2565b801562005c2a5780601f1062005bfe5761010080835404028352916020019162005c2a565b820191906000526020600020905b81548152906001019060200180831162005c0c57829003601f168201915b505050505081526020016004820160405180608001604052908160008201805462005c5590620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462005c8390620078e2565b801562005cd45780601f1062005ca85761010080835404028352916020019162005cd4565b820191906000526020600020905b81548152906001019060200180831162005cb657829003601f168201915b5050505050815260200160018201805462005cef90620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462005d1d90620078e2565b801562005d6e5780601f1062005d425761010080835404028352916020019162005d6e565b820191906000526020600020905b81548152906001019060200180831162005d5057829003601f168201915b5050505050815260200160028201805462005d8990620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462005db790620078e2565b801562005e085780601f1062005ddc5761010080835404028352916020019162005e08565b820191906000526020600020905b81548152906001019060200180831162005dea57829003601f168201915b5050505050815260200160038201805462005e2390620078e2565b80601f016020809104026020016040519081016040528092919081815260200182805462005e5190620078e2565b801562005ea25780601f1062005e765761010080835404028352916020019162005ea2565b820191906000526020600020905b81548152906001019060200180831162005e8457829003601f168201915b505050919092525050508152604080516060808201835260088501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600984015460ff16151582840152600a84015490830152600b8301546080830152805161028081019182905260a09092019190600c84019060149082845b81548152602001906001019080831162005f2e575050505050815250509050806000015187848151811062005f675762005f6762007a5b565b60200260200101906001600160a01b031690816001600160a01b0316815250508060c00151620060005780604001516001600160a01b03166315d1f8986040518163ffffffff1660e01b8152600401602060405180830381865afa15801562005fd4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062005ffa919062007afc565b62006003565b60005b86848151811062006018576200601862007a5b565b602002602001018181525050505080620060329062007a87565b905062005b24565b50505b9250925092565b6001600160a01b038082166000908152600d60209081526040808320815161014081018352815486168152600182015486169381019390935260028101549094169082015260038301805492938493606093859384938493909183880191620060ad90620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620060db90620078e2565b80156200612c5780601f1062006100576101008083540402835291602001916200612c565b820191906000526020600020905b8154815290600101906020018083116200610e57829003601f168201915b50505050508152602001600482016040518060800160405290816000820180546200615790620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200618590620078e2565b8015620061d65780601f10620061aa57610100808354040283529160200191620061d6565b820191906000526020600020905b815481529060010190602001808311620061b857829003601f168201915b50505050508152602001600182018054620061f190620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200621f90620078e2565b8015620062705780601f10620062445761010080835404028352916020019162006270565b820191906000526020600020905b8154815290600101906020018083116200625257829003601f168201915b505050505081526020016002820180546200628b90620078e2565b80601f0160208091040260200160405190810160405280929190818152602001828054620062b990620078e2565b80156200630a5780601f10620062de576101008083540402835291602001916200630a565b820191906000526020600020905b815481529060010190602001808311620062ec57829003601f168201915b505050505081526020016003820180546200632590620078e2565b80601f01602080910402602001604051908101604052809291908181526020018280546200635390620078e2565b8015620063a45780601f106200637857610100808354040283529160200191620063a4565b820191906000526020600020905b8154815290600101906020018083116200638657829003601f168201915b505050919092525050508152604080516060808201835260088501546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152840191909152600984015460ff16151582840152600a84015490830152600b8301546080830152805161028081019182905260a09092019190600c84019060149082845b815481526020019060010190808311620064305750505091909252505081516040830151606084015160c085015160e090950151929c919b5099509297509550909350505050565b600054610100900460ff1615620064a35760405162461bcd60e51b815260040162000c329062007a34565b336000818152600d60205260409020600201546001600160a01b0316620064de5760405162461bcd60e51b815260040162000c329062007acf565b620064ee62002941838062007c19565b6200652e5760405162461bcd60e51b815260206004820152600f60248201526e24a72b20a624a22fa6a7a724a5a2a960891b604482015260640162000c32565b336000818152600d60205260409020600b810154429062006553906201518062007b63565b1115620065745760405162461bcd60e51b815260040162000c329062007b79565b836004820162006585828262007db7565b505042600b8201556040516001600160a01b038316907f85d6366b336ade7f106987ec7a8eac1e8799e508aeab045a39d2f63e0dc969d990600090a250505050565b3361100714620065eb5760405162461bcd60e51b815260040162000c32906200832d565b6000805461ff0019166101001781556040517f26d1807b479eaba249c1214b82e4b65bbb0cc73ee8a17901324b1ef1b5904e499190a1565b600054610100900460ff16156200664e5760405162461bcd60e51b815260040162000c329062007a34565b336000818152600d60205260409020600201546001600160a01b0316620066895760405162461bcd60e51b815260040162000c329062007acf565b620066978585858562006bbb565b620066b65760405162461bcd60e51b815260040162000c329062007c62565b60006001600160a01b0316600e8686604051620066d592919062007c09565b908152604051908190036020019020546001600160a01b031614620067365760405162461bcd60e51b81526020600482015260166024820152754455504c49434154455f564f54455f4144445245535360501b604482015260640162000c32565b336000818152600d60205260409020600b81015442906200675b906201518062007b63565b11156200677c5760405162461bcd60e51b815260040162000c329062007b79565b600381016200678d87898362007cef565b5042600b8201556040518290600e90620067ab908a908a9062007c09565b90815260405190819003602001812080546001600160a01b039384166001600160a01b0319909116179055908316907f783156582145bd0ff7924fae6953ba054cf1233eb60739a200ddb10de068ff0d906200680b908a908a9062007fba565b60405180910390a250505050505050565b60008383836040516020016200683593929190620083a6565b6040516020818303038152906040528051906020012090509392505050565b6001600160a01b0381166000908152600d60205260409020600981015460ff16156200687e575050565b6002548160020160009054906101000a90046001600160a01b03166001600160a01b031663169864896040518163ffffffff1660e01b8152600401602060405180830381865afa158015620068d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620068fd919062007afc565b10156200696b576200690f8162006e18565b80546040516372c4db0f60e11b81526001600160a01b0390911660048201526110009063e589b61e90602401600060405180830381600087803b1580156200695657600080fd5b505af115801562001e98573d6000803e3d6000fd5b5050565b604080516001808252818301909252600091602080830190803683370190505090508281600081518110620069a857620069a862007a5b565b6001600160a01b0390921660209283029190910190910152604051631d38f97960e11b815261200590633a71f2f290620069e9908490869060040162007aa3565b600060405180830381600087803b15801562006a0457600080fd5b505af11580156200324b573d6000803e3d6000fd5b60008082905060038151108062006a31575060098151115b1562006a405750600092915050565b60418160008151811062006a585762006a5862007a5b565b016020015160f81c108062006a8a5750605a8160008151811062006a805762006a8062007a5b565b016020015160f81c115b1562006a995750600092915050565b60015b815181101562006bb157603082828151811062006abd5762006abd62007a5b565b016020015160f81c108062006aee5750603982828151811062006ae45762006ae462007a5b565b016020015160f81c115b801562006b3e5750604182828151811062006b0d5762006b0d62007a5b565b016020015160f81c108062006b3e5750605a82828151811062006b345762006b3462007a5b565b016020015160f81c115b801562006b8e5750606182828151811062006b5d5762006b5d62007a5b565b016020015160f81c108062006b8e5750607a82828151811062006b845762006b8462007a5b565b016020015160f81c115b1562006b9e575060009392505050565b62006ba98162007a87565b905062006a9c565b5060019392505050565b60006030841462006be05760405162461bcd60e51b815260040162000c329062007c62565b6060821462006c265760405162461bcd60e51b815260206004820152601160248201527024a72b20a624a22fa12629afa82927a7a360791b604482015260640162000c32565b600085854660405160200162006c3f93929190620083f7565b60408051808303601f1901815282825280516020918201208184528383019092529092506000919060208201818036833701905050905081602082015260008186868a8a60405160200162006c9995949392919062008409565b60408051808303601f190181526001808452838301909252925060009190602082018180368337019050509050815160016020830182602086016066600019fa62006ce357600080fd5b5060008160008151811062006cfc5762006cfc62007a5b565b016020015160f81c90506001811462006d1e5760009550505050505062006d28565b6001955050505050505b949350505050565b60008061200361dead60405162006d4790620070fb565b6001600160a01b03928316815291166020820152606060408201819052600090820152608001604051809103906000f08015801562006d8a573d6000803e3d6000fd5b509050806001600160a01b031663f399e22e3486866040518463ffffffff1660e01b815260040162006dbe92919062008441565b6000604051808303818588803b15801562006dd857600080fd5b505af115801562006ded573d6000803e3d6000fd5b5093979650505050505050565b600062006e11836001600160a01b0384166200703d565b9392505050565b6000600162006e28600b62007024565b62006e34919062007b16565b601154108015915062006e7f5760018201546040516001600160a01b03909116907f2afdc18061ac21cff7d9f11527ab9c8dec6fabd4edf6f894ed634bebd6a20d4590600090a25050565b600982015460ff1662006eb85760098201805460ff191660019081179091556011805460009062006eb290849062007b63565b90915550505b60018201546040516001600160a01b03909116907f4905ac32602da3fb8b4b7b00c285e5fc4c6c2308cc908b4a1e4e9625a29c90a390600090a25050565b60008062006f068685856200681c565b60008181526010602052604090206002810154919250906001600160f81b03161562006f5f5760405162461bcd60e51b815260206004820152600760248201526614d31054d2115160ca1b604482015260640162000c32565b60095462006f6e904262007b63565b815560018101869055600280820180546001600160f81b0319166001600160f81b03881690811782558692600160f81b90849081111562006fb35762006fb362007a1e565b02179055509695505050505050565b60008160405160200162006fd7919062008467565b604051602081830303815290604052805190602001208360405160200162007000919062008467565b6040516020818303038152906040528051906020012014905092915050565b015190565b60006200432f825490565b600062006e1183836200708f565b600081815260018301602052604081205462007086575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200432f565b5060006200432f565b6000826000018281548110620070a957620070a962007a5b565b9060005260206000200154905092915050565b508054620070ca90620078e2565b6000825580601f10620070db575050565b601f01602090049060005260206000209081019062001270919062007109565b610e96806200848683390190565b5b808211156200712057600081556001016200710a565b5090565b80356001600160a01b03811681146200713c57600080fd5b919050565b6000602082840312156200715457600080fd5b62006e118262007124565b6000806000606084860312156200717557600080fd5b620071808462007124565b9250602084013591506040840135600381106200719c57600080fd5b809150509250925092565b60008083601f840112620071ba57600080fd5b5081356001600160401b03811115620071d257600080fd5b6020830191508360208260051b8501011115620071ee57600080fd5b9250929050565b6000806000604084860312156200720b57600080fd5b83356001600160401b038111156200722257600080fd5b6200723086828701620071a7565b90945092506200724590506020850162007124565b90509250925092565b600080604083850312156200726257600080fd5b6200726d8362007124565b946020939093013593505050565b6001600160401b03811681146200127057600080fd5b600060208284031215620072a457600080fd5b813562006e11816200727b565b60008083601f840112620072c457600080fd5b5081356001600160401b03811115620072dc57600080fd5b602083019150836020828501011115620071ee57600080fd5b6000608082840312156200730857600080fd5b50919050565b600080600080600080600087890360e08112156200732b57600080fd5b620073368962007124565b975060208901356001600160401b03808211156200735357600080fd5b620073618c838d01620072b1565b909950975060408b01359150808211156200737b57600080fd5b620073898c838d01620072b1565b90975095508591506060605f1984011215620073a457600080fd5b60608b01945060c08b0135925080831115620073bf57600080fd5b5050620073cf8a828b01620072f5565b91505092959891949750929550565b60008060008060408587031215620073f557600080fd5b84356001600160401b03808211156200740d57600080fd5b6200741b88838901620071a7565b909650945060208701359150808211156200743557600080fd5b506200744487828801620071a7565b95989497509550505050565b6000806000606084860312156200746657600080fd5b620074718462007124565b95602085013595506040909401359392505050565b6000806000606084860312156200749c57600080fd5b620074a78462007124565b9250620074b76020850162007124565b9150604084013590509250925092565b60005b83811015620074e4578181015183820152602001620074ca565b50506000910152565b6000815180845262007507816020860160208601620074c7565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b858110156200756757828403895262007554848351620074ed565b9885019893509084019060010162007539565b5091979650505050505050565b6040808252835182820181905260009190606090818501906020808901865b83811015620075fa57815180516001600160a01b03908116875284820151811685880152888201511688870152868101516001600160401b03168787015260808082015115159087015260a0908101519086015260c0909401939082019060010162007593565b505086830390870152506200761081876200751b565b979650505050505050565b600080602083850312156200762f57600080fd5b82356001600160401b038111156200764657600080fd5b6200765485828601620072b1565b90969095509350505050565b6020815260008251608060208401526200767e60a0840182620074ed565b90506020840151601f19808584030160408601526200769e8383620074ed565b92506040860151915080858403016060860152620076bd8383620074ed565b9250606086015191508085840301608086015250620076dd8282620074ed565b95945050505050565b60008060008060408587031215620076fd57600080fd5b84356001600160401b03808211156200771557600080fd5b6200772388838901620072b1565b909650945060208701359150808211156200773d57600080fd5b506200744487828801620072b1565b6000806000604084860312156200776257600080fd5b83356001600160401b038111156200777957600080fd5b6200778786828701620072b1565b909790965060209590950135949350505050565b60008060408385031215620077af57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015620077f95781516001600160a01b031687529582019590820190600101620077d2565b509495945050505050565b606081526000620078196060830186620077be565b82810360208481019190915285518083528682019282019060005b81811015620078525784518352938301939183019160010162007834565b5050809350505050826040830152949350505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906200789690830186620074ed565b931515606083015250608001529392505050565b600060208284031215620078bd57600080fd5b81356001600160401b03811115620078d457600080fd5b62006d2884828501620072f5565b600181811c90821680620078f757607f821691505b6020821081036200730857634e487b7160e01b600052602260045260246000fd5b600060033d1115620079325760046000803e5060005160e01c5b90565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171562007973576200797362007935565b6040525050565b600060443d1015620079895790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715620079b957505050505090565b8285019150815181811115620079d25750505050505090565b843d8701016020828501011115620079ed5750505050505090565b620079fe602082860101876200794b565b509095945050505050565b60208152600062006e116020830184620074ed565b634e487b7160e01b600052602160045260246000fd5b6020808252600d908201526c14d51052d157d4d513d4141151609a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162007a9c5762007a9c62007a71565b5060010190565b60408152600062007ab86040830185620077be565b905060018060a01b03831660208301529392505050565b6020808252601390820152721590531251105513d497d393d517d1561254d5606a1b604082015260600190565b60006020828403121562007b0f57600080fd5b5051919050565b818103818111156200432f576200432f62007a71565b60208082526019908201527f494e56414c49445f434f4e53454e5355535f4144445245535300000000000000604082015260600190565b808201808211156200432f576200432f62007a71565b6020808252601590820152745550444154455f544f4f5f4652455155454e544c5960581b604082015260600190565b60208082526017908201527f494e56414c49445f434f4d4d495353494f4e5f52415445000000000000000000604082015260600190565b6001600160401b0382811682821603908082111562007c025762007c0262007a71565b5092915050565b8183823760009101908152919050565b6000808335601e1984360301811262007c3157600080fd5b8301803591506001600160401b0382111562007c4c57600080fd5b602001915036819003821315620071ee57600080fd5b602080825260149082015273494e56414c49445f564f54455f4144445245535360601b604082015260600190565b601f8211156200126d57600081815260208120601f850160051c8101602086101562007cb95750805b601f850160051c820191505b8181101562001e985782815560010162007cc5565b600019600383901b1c191660019190911b1790565b6001600160401b0383111562007d095762007d0962007935565b62007d218362007d1a8354620078e2565b8362007c90565b6000601f84116001811462007d54576000851562007d3f5750838201355b62007d4b868262007cda565b845550620042f6565b600083815260209020601f19861690835b8281101562007d87578685013582556020948501946001909201910162007d65565b508682101562007da55760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b62007dc3828362007c19565b6001600160401b0381111562007ddd5762007ddd62007935565b62007df58162007dee8554620078e2565b8562007c90565b6000601f82116001811462007e28576000831562007e135750838201355b62007e1f848262007cda565b86555062007e85565b600085815260209020601f19841690835b8281101562007e5b578685013582556020948501946001909201910162007e39565b508482101562007e795760001960f88660031b161c19848701351681555b505060018360011b0185555b5050505062007e98602083018362007c19565b62007ea881836001860162007cef565b505062007eb9604083018362007c19565b62007ec981836002860162007cef565b505062007eda606083018362007c19565b6200302681836003860162007cef565b813562007ef7816200727b565b6001600160401b03811690508154816001600160401b03198216178355602084013562007f24816200727b565b6fffffffffffffffff0000000000000000604091821b166fffffffffffffffffffffffffffffffff1983168417811785559085013562007f64816200727b565b6001600160c01b0319929092169092179190911760809190911b67ffffffffffffffff60801b1617905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60208152600062006d2860208301848662007f91565b6020808252602d908201527f746865206d6573736167652073656e646572206d75737420626520746865206260408201526c3637b1b590383937b23ab1b2b960991b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b8181036200803f575050565b6200804b8254620078e2565b6001600160401b0381111562008065576200806562007935565b6200807d81620080768454620078e2565b8462007c90565b6000601f821160018114620080b057600083156200809b5750848201545b620080a7848262007cda565b855550620042f6565b600085815260209020601f19841690600086815260209020845b83811015620080ec5782860154825560019586019590910190602001620080ca565b50858310156200810b5781850154600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081548084526020808501808196506005915083821b81016000878152848120815b87811015620081d7578484038b528282546200815a81620078e2565b808752600182811680156200817857600181146200819257620081bf565b60ff198416898d01528215158b1b89018c019450620081bf565b8688528b8820885b84811015620081b75781548b82018f0152908301908d016200819a565b8a018d019550505b509d8a019d929650505091909101906001016200813e565b50919998505050505050505050565b600060408083018184528086548083526060925082860191508760005260208060002060005b83811015620082835781546001600160a01b039081168652600183015481168487015260028301548082168988015260a081811c6001600160401b0316888a01529150620082646080880160ff8360e01c1615159052565b5060038301549086015260c0909401936004909101906001016200820c565b505086830390870152506200761081876200811b565b60208082526029908201527f746865206d6573736167652073656e646572206d75737420626520736c6173686040820152680818dbdb9d1c9858dd60ba1b606082015260800190565b848152602081018490526001600160f81b038316604082015260808101600383106200831e57634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b6020808252602e908201527f746865206d6573736167652073656e646572206d75737420626520676f76657260408201526d1b985b98d94818dbdb9d1c9858dd60921b606082015260800190565b6040815260006200839160408301868862007f91565b82810360208401526200761081858762007f91565b6bffffffffffffffffffffffff198460601b168152826014820152600060038310620083e257634e487b7160e01b600052602160045260246000fd5b5060f89190911b603482015260350192915050565b82848237909101908152602001919050565b600086516200841d818460208b01620074c7565b82018587823760009086019081528385823760009301928352509095945050505050565b6001600160a01b038316815260406020820181905260009062006d2890830184620074ed565b600082516200847b818460208701620074c7565b919091019291505056fe608060405260405162000e9638038062000e96833981016040819052620000269162000497565b828162000036828260006200004d565b50620000449050826200008a565b505050620005ca565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620001691760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e6f60279139620002f8565b9392505050565b60006200018060008051602062000e4f83398151915260001b6200037760201b620001951760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e4f83398151915260001b6200037760201b620001951760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b620001981760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620001951760201c565b6060600080856001600160a01b03168560405162000317919062000577565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fd578251600003620003f5576001600160a01b0385163b620003f55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000409565b62000409838362000411565b949350505050565b815115620004225781518083602001fd5b8060405162461bcd60e51b8152600401620001f1919062000595565b80516001600160a01b03811681146200045657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048e57818101518382015260200162000474565b50506000910152565b600080600060608486031215620004ad57600080fd5b620004b8846200043e565b9250620004c8602085016200043e565b60408501519092506001600160401b0380821115620004e657600080fd5b818601915086601f830112620004fb57600080fd5b8151818111156200051057620005106200045b565b604051601f8201601f19908116603f011681019083821181831017156200053b576200053b6200045b565b816040528281528960208487010111156200055557600080fd5b6200056883602083016020880162000471565b80955050505050509250925092565b600082516200058b81846020870162000471565b9190910192915050565b6020815260008251806020840152620005b681604085016020870162000471565b601f01601f19169190910160400192915050565b61087580620005da6000396000f3fe60806040523661001357610011610017565b005b6100115b61001f6101a7565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a576100536101da565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a57610053610231565b63070d7c6960e41b6001600160e01b031982160161009a57610053610277565b621eb96f60e61b6001600160e01b03198216016100b9576100536102a8565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102e8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102fc565b565b606061018e83836040518060600160405280602781526020016108426027913961030c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101e4610384565b60006101f33660048184610695565b81019061020091906106db565b905061021d8160405180602001604052806000815250600061038f565b505060408051602081019091526000815290565b60606000806102433660048184610695565b810190610250919061070c565b915091506102608282600161038f565b604051806020016040528060008152509250505090565b6060610281610384565b60006102903660048184610695565b81019061029d91906106db565b905061021d816103bb565b60606102b2610384565b60006102bc6101a7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102f2610384565b60006102bc610412565b610167610307610412565b610421565b6060600080856001600160a01b03168560405161032991906107f2565b600060405180830381855af49150503d8060008114610364576040519150601f19603f3d011682016040523d82523d6000602084013e610369565b606091505b509150915061037a86838387610445565b9695505050505050565b341561016757600080fd5b610398836104c6565b6000825111806103a55750805b156103b6576103b48383610169565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103e46101a7565b604080516001600160a01b03928316815291841660208301520160405180910390a161040f81610506565b50565b600061041c6105af565b905090565b3660008037600080366000845af43d6000803e808015610440573d6000f35b3d6000fd5b606083156104b45782516000036104ad576001600160a01b0385163b6104ad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b50816104be565b6104be83836105d7565b949350505050565b6104cf81610601565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661056b5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101cb565b8151156105e75781518083602001fd5b8060405162461bcd60e51b815260040161014e919061080e565b6001600160a01b0381163b61066e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61058e565b600080858511156106a557600080fd5b838611156106b257600080fd5b5050820193919092039150565b80356001600160a01b03811681146106d657600080fd5b919050565b6000602082840312156106ed57600080fd5b61018e826106bf565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561071f57600080fd5b610728836106bf565b9150602083013567ffffffffffffffff8082111561074557600080fd5b818501915085601f83011261075957600080fd5b81358181111561076b5761076b6106f6565b604051601f8201601f19908116603f01168101908382118183101715610793576107936106f6565b816040528281528860208487010111156107ac57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107e95781810151838201526020016107d1565b50506000910152565b600082516108048184602087016107ce565b9190910192915050565b602081526000825180602084015261082d8160408501602087016107ce565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000812000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000812000a" + }, + "0x0000000000000000000000000000000000002003": { + "balance": "0x0", + "code": "0x6080604052600436106102675760003560e01c806375d47a0a11610144578063bee8380e116100b6578063dd62ed3e1161007a578063dd62ed3e146106d7578063df8079e9146106f7578063e336ac441461070d578063f399e22e14610743578063f9a2bbc714610756578063fd6a68791461076c57600080fd5b8063bee8380e1461062e578063c2cde2b214610644578063c81b166214610664578063d241c1ea1461067a578063dc927faf146106c157600080fd5b8063a1a11bf511610108578063a1a11bf514610582578063a457c2d714610598578063a5d059ca146105b8578063a9059cbb146105d8578063aa82dce1146105f8578063aad3ec961461060e57600080fd5b806375d47a0a1461050b5780637e434d541461052157806391faf0b41461053757806395d89b41146105575780639dc092621461056c57600080fd5b80633a5381b5116101dd57806351e80672116101a157806351e80672146104615780635c19a95c146104775780635e607d761461048a578063647df7591461049f5780636e47b482146104bf57806370a08231146104d557600080fd5b80633a5381b5146103d557806343756e5c146103f557806345bc4d101461040b5780634d99dd161461042b57806351b4dce31461044b57600080fd5b8063169864891161022f578063169864891461033957806318160ddd1461034e57806323b872dd146103635780632808702814610383578063313ce5671461039957806339509351146103b557600080fd5b806306fdde031461026c5780630913db4714610297578063095ea7b3146102c55780630e2374a5146102f557806315d1f89814610323575b600080fd5b34801561027857600080fd5b50610281610782565b60405161028e9190611f2d565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004611f78565b610814565b60405190815260200161028e565b3480156102d157600080fd5b506102e56102e0366004611f9c565b61083c565b604051901515815260200161028e565b34801561030157600080fd5b5061030b61200181565b6040516001600160a01b03909116815260200161028e565b34801561032f57600080fd5b506102b760985481565b34801561034557600080fd5b506102b7610854565b34801561035a57600080fd5b506067546102b7565b34801561036f57600080fd5b506102e561037e366004611fc8565b61087d565b34801561038f57600080fd5b5061030b61200581565b3480156103a557600080fd5b506040516012815260200161028e565b3480156103c157600080fd5b506102e56103d0366004611f9c565b6108a1565b3480156103e157600080fd5b5060975461030b906001600160a01b031681565b34801561040157600080fd5b5061030b61100181565b34801561041757600080fd5b506102b7610426366004612009565b6108c3565b34801561043757600080fd5b506102b7610446366004611f9c565b610a8a565b34801561045757600080fd5b5061030b61200681565b34801561046d57600080fd5b5061030b61200081565b6102b7610485366004611f78565b610d2f565b61049d610498366004612022565b610d9b565b005b3480156104ab57600080fd5b506102b76104ba366004612009565b610e5d565b3480156104cb57600080fd5b5061030b61100581565b3480156104e157600080fd5b506102b76104f0366004611f78565b6001600160a01b031660009081526065602052604090205490565b34801561051757600080fd5b5061030b61100881565b34801561052d57600080fd5b5061030b61200381565b34801561054357600080fd5b506102b7610552366004612009565b610e8b565b34801561056357600080fd5b50610281610eb5565b34801561057857600080fd5b5061030b61100781565b34801561058e57600080fd5b5061030b61100681565b3480156105a457600080fd5b506102e56105b3366004611f9c565b610ec4565b3480156105c457600080fd5b506102b76105d3366004611f9c565b610f3f565b3480156105e457600080fd5b506102e56105f3366004611f9c565b61115c565b34801561060457600080fd5b5061030b61200281565b34801561061a57600080fd5b506102b7610629366004611f9c565b61116a565b34801561063a57600080fd5b506102b761271081565b34801561065057600080fd5b506102b761065f366004611f78565b61151a565b34801561067057600080fd5b5061030b61100281565b34801561068657600080fd5b5061069a610695366004611f9c565b611538565b6040805183518152602080850151908201529281015190830152606082015260800161028e565b3480156106cd57600080fd5b5061030b61100381565b3480156106e357600080fd5b506102b76106f236600461204c565b6115e8565b34801561070357600080fd5b5061030b61200481565b34801561071957600080fd5b506102b7610728366004611f78565b6001600160a01b03166000908152609b602052604090205490565b61049d61075136600461209b565b611613565b34801561076257600080fd5b5061030b61100081565b34801561077857600080fd5b5061030b61100481565b6060606880546107919061215f565b80601f01602080910402602001604051908101604052809291908181526020018280546107bd9061215f565b801561080a5780601f106107df5761010080835404028352916020019161080a565b820191906000526020600020905b8154815290600101906020018083116107ed57829003601f168201915b5050505050905090565b6001600160a01b03811660009081526065602052604081205461083690610e8b565b92915050565b60003361084a8185856117c7565b5060019392505050565b6097546001600160a01b031660009081526065602052604081205461087890610e8b565b905090565b60003361088b85828561180f565b610896858585611889565b506001949350505050565b60003361084a8185856108b483836115e8565b6108be91906121a9565b6117c7565b600033612002146108ef5760405162461bcd60e51b81526004016108e6906121bc565b60405180910390fd5b6097546001600160a01b03166000908152606560205260408120549061091484610e5d565b90508181116109235780610925565b815b609754909150600090610941906001600160a01b0316836118d1565b90507f0a6331e5cfe25333c065863fddcbcd3c103d07a3aaa549b327736ccb1e7b3cab8160405161097491815260200190565b60405180910390a160006120026001600160a01b031663e8f67c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e291906121f3565b905060006110026001600160a01b03168284604051600060405180830381858888f193505050503d8060008114610a35576040519150601f19603f3d011682016040523d82523d6000602084013e610a3a565b606091505b5050905080610a7d5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016108e6565b509093505050505b919050565b60003361200214610aad5760405162461bcd60e51b81526004016108e6906121bc565b81600003610aeb5760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d05353d5539560aa1b60448201526064016108e6565b6001600160a01b038316600090815260656020526040902054821115610b4a5760405162461bcd60e51b8152602060048201526014602482015273494e53554646494349454e545f42414c414e434560601b60448201526064016108e6565b6001600160a01b0383166000908152609b602052604081208054849290610b729084906121a9565b9091555060009050610b8484846118d1565b905060006120026001600160a01b031663fc0c5ff16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bec91906121f3565b610bf690426121a9565b6040805160608101825286815260208101859052908101829052909150600086610c1f81611906565b60405160609290921b6bffffffffffffffffffffffff19166020830152603482015260540160408051601f19818403018152918152815160209283012060008181526099845282812086518155868501516001820155868401516002909101556001600160a01b038b168152609a9093529120909150610cd690828154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b604080830151815188815260208101879052918201526001600160a01b038816907fa189391ea8e7d76922feb7ee566a77c6f09c171b6eced3054282dec6f0993c189060600160405180910390a2509195945050505050565b60003361200214610d525760405162461bcd60e51b81526004016108e6906121bc565b34600003610d915760405162461bcd60e51b815260206004820152600c60248201526b16915493d7d1115413d4d25560a21b60448201526064016108e6565b610836823461192e565b3361200214610dbc5760405162461bcd60e51b81526004016108e6906121bc565b346000612710610dd667ffffffffffffffff85168461220c565b610de09190612223565b90506000610dee8284612245565b90508060986000828254610e0291906121a9565b9091555050609754610e1d906001600160a01b031683611987565b5060408051828152602081018490527ffb0e1482d62102ab9594f69d4c6d693749e3e2bf1c21af272f5456b2d5a4f6b5910160405180910390a150505050565b6000609854600003610e7157506000919050565b609854606754610e81908461220c565b6108369190612223565b6000610e9660675490565b600003610ea557506000919050565b606754609854610e81908461220c565b6060606980546107919061215f565b60003381610ed282866115e8565b905083811015610f325760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108e6565b61089682868684036117c7565b60003361200214610f625760405162461bcd60e51b81526004016108e6906121bc565b81600003610fa05760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d05353d5539560aa1b60448201526064016108e6565b6001600160a01b038316600090815260656020526040902054821115610fff5760405162461bcd60e51b8152602060048201526014602482015273494e53554646494349454e545f42414c414e434560601b60448201526064016108e6565b600061100b84846118d1565b905060006120026001600160a01b031663e8f67c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561104f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107391906121f3565b905060006120026001600160a01b03168284604051600060405180830381858888f193505050503d80600081146110c6576040519150601f19603f3d011682016040523d82523d6000602084013e6110cb565b606091505b505090508061110e5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016108e6565b60408051868152602081018590526001600160a01b038816917f6377e6852c3c3eb914806be9085171e0f4e00da79573f3f740695326ba92a612910160405180910390a25090949350505050565b60003361084a818585611889565b6000336120021461118d5760405162461bcd60e51b81526004016108e6906121bc565b6111956119b0565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b036000036112015760405162461bcd60e51b81526020600482015260116024820152701393d7d5539093d39117d49154555154d5607a1b60448201526064016108e6565b81158061123557506001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b0382115b61123f5781611269565b6001600160a01b0383166000908152609a6020526040902054600f81810b600160801b909204900b035b91506000805b831561134c576001600160a01b0385166000908152609a6020526040812061129690611a09565b600081815260996020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529192504210156112db57505061134c565b80516112e790856121a9565b93508060200151836112f991906121a9565b6001600160a01b0388166000908152609a6020526040902090935061131d90611a5d565b506000828152609960205260408120818155600181018290556002015561134386612258565b9550505061126f565b8160000361139c5760405162461bcd60e51b815260206004820152601b60248201527f4e4f5f434c41494d41424c455f554e424f4e445f52455155455354000000000060448201526064016108e6565b6001600160a01b0385166000908152609b6020526040812080548492906113c4908490612245565b9250508190555060006120026001600160a01b031663e8f67c3b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143191906121f3565b90506000866001600160a01b03168284604051600060405180830381858888f193505050503d8060008114611482576040519150601f19603f3d011682016040523d82523d6000602084013e611487565b606091505b50509050806114c75760405162461bcd60e51b815260206004820152600c60248201526b10d310525357d1905253115160a21b60448201526064016108e6565b60408051858152602081018590526001600160a01b038916917f130fffc7b37a23444102b7eecbea1b84036ad5d0e91896470aba6ac3d01a064b910160405180910390a250909250505061083660018055565b6001600160a01b0381166000908152609c6020526040812054610836565b61155c60405180606001604052806000815260200160008152602001600081525090565b6001600160a01b0383166000908152609a6020526040812081906115809085611adc565b60008181526099602090815260408083206001600160a01b038a168452609a9092529091205491925090600f81810b600160801b909204900b036040805160608101825283548152600184015460208201526002909301549083015290969095509350505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b600054610100900460ff16158080156116335750600054600160ff909116105b8061164d5750303b15801561164d575060005460ff166001145b6116b05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108e6565b6000805460ff1916600117905580156116d3576000805461ff0019166101001790555b33612002146116f45760405162461bcd60e51b81526004016108e6906121bc565b600082604051602001611707919061226f565b604051602081830303815290604052905060008360405160200161172b91906122ae565b60405160208183030381529060405290506117468282611b4d565b609780546001600160a01b0319166001600160a01b03871617905534600003611771576117716122d8565b61177a34611b8d565b505080156117c2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60405162461bcd60e51b815260206004820152601e60248201527f7374424e4220617070726f7665206973206e6f7420737570706f72746564000060448201526064016108e6565b600061181b84846115e8565b9050600019811461188357818110156118765760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108e6565b61188384848484036117c7565b50505050565b60405162461bcd60e51b815260206004820152601f60248201527f7374424e42207472616e73666572206973206e6f7420737570706f727465640060448201526064016108e6565b60006118dc82610e8b565b90506118e88383611c42565b80609860008282546118fa9190612245565b90915550909392505050565b6001600160a01b0381166000908152609c602052604090208054600181018255905b50919050565b600061193a8383611987565b60408051828152602081018590529192506001600160a01b038516917f9a8f44850296624dadfd9c246d17e47171d35727a181bd090aa14bbbe00238bb910160405180910390a292915050565b600061199282610e5d565b905061199e8382611d76565b81609860008282546118fa91906121a9565b600260015403611a025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108e6565b6002600155565b6000611a248254600f81810b600160801b909204900b131590565b15611a4257604051631ed9509560e11b815260040160405180910390fd5b508054600f0b60009081526001909101602052604090205490565b6000611a788254600f81810b600160801b909204900b131590565b15611a9657604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b600080611aff611aeb84611e37565b8554611afa9190600f0b6122ee565b611ea5565b8454909150600160801b9004600f90810b9082900b12611b3257604051632d0483c560e21b815260040160405180910390fd5b600f0b60009081526001939093016020525050604090205490565b600054610100900460ff16611b745760405162461bcd60e51b81526004016108e690612316565b6068611b8083826123af565b5060696117c282826123af565b600054610100900460ff16611bb45760405162461bcd60e51b81526004016108e690612316565b6097546001600160a01b0316611bcc57611bcc6122d8565b60675415611bdc57611bdc6122d8565b609754611bf2906001600160a01b031682611d76565b609881905560975460408051838152602081018490526001600160a01b03909216917f9a8f44850296624dadfd9c246d17e47171d35727a181bd090aa14bbbe00238bb910160405180910390a250565b6001600160a01b038216611ca25760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108e6565b6001600160a01b03821660009081526065602052604090205481811015611d165760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108e6565b6001600160a01b03831660008181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b038216611dcc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108e6565b8060676000828254611dde91906121a9565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60006001600160ff1b03821115611ea15760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016108e6565b5090565b80600f81900b8114610a855760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016108e6565b60005b83811015611f24578181015183820152602001611f0c565b50506000910152565b6020815260008251806020840152611f4c816040850160208701611f09565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611f7557600080fd5b50565b600060208284031215611f8a57600080fd5b8135611f9581611f60565b9392505050565b60008060408385031215611faf57600080fd5b8235611fba81611f60565b946020939093013593505050565b600080600060608486031215611fdd57600080fd5b8335611fe881611f60565b92506020840135611ff881611f60565b929592945050506040919091013590565b60006020828403121561201b57600080fd5b5035919050565b60006020828403121561203457600080fd5b813567ffffffffffffffff81168114611f9557600080fd5b6000806040838503121561205f57600080fd5b823561206a81611f60565b9150602083013561207a81611f60565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156120ae57600080fd5b82356120b981611f60565b9150602083013567ffffffffffffffff808211156120d657600080fd5b818501915085601f8301126120ea57600080fd5b8135818111156120fc576120fc612085565b604051601f8201601f19908116603f0116810190838211818310171561212457612124612085565b8160405282815288602084870101111561213d57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600181811c9082168061217357607f821691505b60208210810361192857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561083657610836612193565b6020808252601f908201527f746865206d73672073656e646572206d757374206265207374616b6548756200604082015260600190565b60006020828403121561220557600080fd5b5051919050565b808202811582820484141761083657610836612193565b60008261224057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561083657610836612193565b60008161226757612267612193565b506000190190565b65039ba30b5b2960d51b815260008251612290816006850160208701611f09565b660818dc99591a5d60ca1b6006939091019283015250600d01919050565b611cdd60f21b8152600082516122cb816002850160208701611f09565b9190910160020192915050565b634e487b7160e01b600052600160045260246000fd5b808201828112600083128015821682158216171561230e5761230e612193565b505092915050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b601f8211156117c257600081815260208120601f850160051c810160208610156123885750805b601f850160051c820191505b818110156123a757828155600101612394565b505050505050565b815167ffffffffffffffff8111156123c9576123c9612085565b6123dd816123d7845461215f565b84612361565b602080601f83116001811461241257600084156123fa5750858301515b600019600386901b1c1916600185901b1785556123a7565b600085815260208120601f198616915b8281101561244157888601518255948401946001909101908401612422565b508582101561245f5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c6343000812000a" + }, + "0x0000000000000000000000000000000000002004": { + "balance": "0x0", + "code": "0x60806040526004361061046c5760003560e01c80637d5e81e21161024a578063c59057e411610139578063e23a9a52116100b6578063f8ce560a1161007a578063f8ce560a14610f77578063f9a2bbc714610f97578063fc0c546a14610fad578063fd6a687914610fce578063fe0d94c114610fe457600080fd5b8063e23a9a5214610e20578063ea0217cf14610eeb578063eb9019d414610f0b578063ece40cc114610f2b578063f23a6e6114610f4b57600080fd5b8063dc927faf116100fd578063dc927faf14610d5a578063dd4e2ba514610d70578063ddf0b00914610db6578063deaaa7cc14610dd6578063df8079e914610e0a57600080fd5b8063c59057e414610cc5578063c81b166214610ce5578063d07f91e914610cfb578063d33219b414610d1b578063da95691a14610d3a57600080fd5b8063a890c910116101c7578063b33e987b1161018b578063b33e987b14610c3c578063b58131b014610c51578063bc197c8114610c66578063c01f9e3714610c92578063c28bc2fa14610cb257600080fd5b8063a890c91014610ba9578063aa82dce114610bc9578063ab58fb8e14610bdf578063ac43175114610bff578063b2b04db514610c1f57600080fd5b806397c3d3341161020e57806397c3d33414610b345780639a802a6d14610b485780639dc0926214610b68578063a1a11bf514610b7e578063a7713a7014610b9457600080fd5b80637d5e81e214610a955780637e434d5414610ab55780638129fc1c14610acb57806384b0196e14610ae057806391ddadf414610b0857600080fd5b80633e4f49e61161036657806354fd4d50116102e35780636e47b482116102a75780636e47b48214610a1257806370b0f66014610a2857806375d47a0a14610a4857806375da247514610a5e5780637b3c71d314610a7557600080fd5b806354fd4d5014610972578063567813881461099c5780635d0bf632146109bc5780635f398a14146109d257806360c4247f146109f257600080fd5b80634bf5d7e91161032a5780634bf5d7e9146108e957806351b4dce3146108fe57806351e8067214610914578063533ddd141461092a5780635410108d1461095b57600080fd5b80633e4f49e61461081b57806340e58ee51461084857806343756e5c14610868578063438596321461087e578063452115d6146108c957600080fd5b8063160cbed7116103f45780632fe3e261116103b85780632fe3e2611461074e578063328dd9821461078257806332b8113e146107b25780633932abb1146107e55780633bccf4fd146107fb57600080fd5b8063160cbed7146106b957806324bc1a64146106d95780632656227d146106ee57806328087028146107015780632d63f6931461071757600080fd5b806306f3f9e61161043b57806306f3f9e6146105c757806306fdde03146105e75780630e2374a514610609578063143489d014610637578063150b7a021461067557600080fd5b8063013cf08b146104dc57806301ffc9a71461055757806302a251a31461058757806303420181146105a757600080fd5b366104d7573061047a610ff7565b6001600160a01b0316146104d55760405162461bcd60e51b815260206004820152601f60248201527f476f7665726e6f723a206d7573742073656e6420746f206578656375746f720060448201526064015b60405180910390fd5b005b600080fd5b3480156104e857600080fd5b506104fc6104f7366004615b67565b611011565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561056357600080fd5b50610577610572366004615b80565b6110cc565b604051901515815260200161054e565b34801561059357600080fd5b50610162545b60405190815260200161054e565b3480156105b357600080fd5b506105996105c2366004615cc6565b6110dd565b3480156105d357600080fd5b506104d56105e2366004615b67565b6111d5565b3480156105f357600080fd5b506105fc611260565b60405161054e9190615dbc565b34801561061557600080fd5b5061061f61200181565b6040516001600160a01b03909116815260200161054e565b34801561064357600080fd5b5061061f610652366004615b67565b60009081526101306020526040902054600160401b90046001600160a01b031690565b34801561068157600080fd5b506106a0610690366004615de4565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161054e565b3480156106c557600080fd5b506105996106d4366004615fbb565b6112f3565b3480156106e557600080fd5b506105996114f8565b6105996106fc366004615fbb565b61151e565b34801561070d57600080fd5b5061061f61200581565b34801561072357600080fd5b50610599610732366004615b67565b600090815261013060205260409020546001600160401b031690565b34801561075a57600080fd5b506105997fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561078e57600080fd5b506107a261079d366004615b67565b611611565b60405161054e9493929190616113565b3480156107be57600080fd5b5061025c546001600160401b03165b6040516001600160401b03909116815260200161054e565b3480156107f157600080fd5b5061016154610599565b34801561080757600080fd5b50610599610816366004616160565b6118a3565b34801561082757600080fd5b5061083b610836366004615b67565b611919565b60405161054e91906161c4565b34801561085457600080fd5b506104d5610863366004615b67565b611924565b34801561087457600080fd5b5061061f61100181565b34801561088a57600080fd5b506105776108993660046161ec565b6000828152610193602090815260408083206001600160a01b038516845260080190915290205460ff1692915050565b3480156108d557600080fd5b506105996108e4366004615fbb565b61194f565b3480156108f557600080fd5b506105fc611966565b34801561090a57600080fd5b5061061f61200681565b34801561092057600080fd5b5061061f61200081565b34801561093657600080fd5b5061057761094536600461621c565b61028e6020526000908152604090205460ff1681565b34801561096757600080fd5b506107cd6201518081565b34801561097e57600080fd5b506040805180820190915260018152603160f81b60208201526105fc565b3480156109a857600080fd5b506105996109b7366004616239565b611a13565b3480156109c857600080fd5b5061059961546081565b3480156109de57600080fd5b506105996109ed366004616265565b611a3c565b3480156109fe57600080fd5b50610599610a0d366004615b67565b611a86565b348015610a1e57600080fd5b5061061f61100581565b348015610a3457600080fd5b506104d5610a43366004615b67565b611b3b565b348015610a5457600080fd5b5061061f61100881565b348015610a6a57600080fd5b5061059962093a8081565b348015610a8157600080fd5b50610599610a903660046162e8565b611bc3565b348015610aa157600080fd5b50610599610ab0366004616341565b611c15565b348015610ac157600080fd5b5061061f61200381565b348015610ad757600080fd5b506104d5611cbc565b348015610aec57600080fd5b50610af561218c565b60405161054e97969594939291906163e1565b348015610b1457600080fd5b50610b1d61222a565b60405165ffffffffffff909116815260200161054e565b348015610b4057600080fd5b506064610599565b348015610b5457600080fd5b50610599610b63366004616443565b61229e565b348015610b7457600080fd5b5061061f61100781565b348015610b8a57600080fd5b5061061f61100681565b348015610ba057600080fd5b506105996122b5565b348015610bb557600080fd5b506104d5610bc436600461621c565b6122e2565b348015610bd557600080fd5b5061061f61200281565b348015610beb57600080fd5b50610599610bfa366004615b67565b61236a565b348015610c0b57600080fd5b506104d5610c1a36600461649b565b612406565b348015610c2b57600080fd5b5061059968056bc75e2d6310000081565b348015610c4857600080fd5b50610599600a81565b348015610c5d57600080fd5b50610599612be2565b348015610c7257600080fd5b506106a0610c813660046164fa565b63bc197c8160e01b95945050505050565b348015610c9e57600080fd5b50610599610cad366004615b67565b612bee565b6104d5610cc036600461658d565b612bf9565b348015610cd157600080fd5b50610599610ce0366004615fbb565b612d09565b348015610cf157600080fd5b5061061f61100281565b348015610d0757600080fd5b506104d5610d163660046165d0565b612d43565b348015610d2757600080fd5b506101f8546001600160a01b031661061f565b348015610d4657600080fd5b50610599610d55366004616678565b612dcb565b348015610d6657600080fd5b5061061f61100381565b348015610d7c57600080fd5b5060408051808201909152601a81527f737570706f72743d627261766f2671756f72756d3d627261766f00000000000060208201526105fc565b348015610dc257600080fd5b506104d5610dd1366004615b67565b612e52565b348015610de257600080fd5b506105997f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610e1657600080fd5b5061061f61200481565b348015610e2c57600080fd5b50610ebb610e3b3660046161ec565b6040805160608101825260008082526020820181905291810191909152506000918252610193602090815260408084206001600160a01b0393909316845260089092018152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b03169082015260600161054e565b348015610ef757600080fd5b506104d5610f06366004615b67565b612e75565b348015610f1757600080fd5b50610599610f26366004616719565b612efd565b348015610f3757600080fd5b506104d5610f46366004615b67565b612f1e565b348015610f5757600080fd5b506106a0610f66366004616745565b63f23a6e6160e01b95945050505050565b348015610f8357600080fd5b50610599610f92366004615b67565b612fa6565b348015610fa357600080fd5b5061061f61100081565b348015610fb957600080fd5b506101c55461061f906001600160a01b031681565b348015610fda57600080fd5b5061061f61100481565b6104d5610ff2366004615b67565b613035565b600061100c6101f8546001600160a01b031690565b905090565b80600080808080808080806110258a61236a565b60008c815261013060205260409020549098506001600160401b0316965061104c8b612bee565b60008c81526101936020526040812080546005820154600683015460078401546001600160a01b039093169e50949a50985092965091945061108d8d611919565b905060028160078111156110a3576110a36161ae565b14935060078160078111156110ba576110ba6161ae565b14925050509193959799509193959799565b60006110d782613058565b92915050565b6000806111816111797fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516111199291906167ad565b60405180910390208b8051906020012060405160200161115e959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b6040516020818303038152906040528051906020012061307d565b8686866130aa565b90506111c78a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506130c8915050565b9a9950505050505050505050565b6111dd610ff7565b6001600160a01b0316336001600160a01b03161461120d5760405162461bcd60e51b81526004016104cc906167bd565b30611216610ff7565b6001600160a01b03161461125457600080366040516112369291906167ad565b604051809103902090505b8061124d6101316130d7565b0361124157505b61125d81613156565b50565b606061012f8054611270906167f4565b80601f016020809104026020016040519081016040528092919081815260200182805461129c906167f4565b80156112e95780601f106112be576101008083540402835291602001916112e9565b820191906000526020600020905b8154815290600101906020018083116112cc57829003601f168201915b5050505050905090565b60008061130286868686612d09565b9050600461130f82611919565b6007811115611320576113206161ae565b1461133d5760405162461bcd60e51b81526004016104cc9061682e565b6101f8546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac919061686f565b6101f85460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f427906113e7908a908a908a906000908b90600401616888565b602060405180830381865afa158015611404573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611428919061686f565b60008381526101f96020526040808220929092556101f85491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb091611475918b918b918b91908b9089906004016168d6565b600060405180830381600087803b15801561148f57600080fd5b505af11580156114a3573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426114d59190616944565b604080519283526020830191909152015b60405180910390a15095945050505050565b600061100c600161150761222a565b6115119190616957565b65ffffffffffff16612fa6565b60008061152d86868686612d09565b9050600061153a82611919565b90506004816007811115611550576115506161ae565b148061156d5750600581600781111561156b5761156b6161ae565b145b6115895760405162461bcd60e51b81526004016104cc9061682e565b6000828152610130602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906115d89084815260200190565b60405180910390a16115ed82888888886132c7565b6115fa8288888888613368565b611607828888888861340f565b5095945050505050565b606080606080600061019360008781526020019081526020016000209050806001018160020182600301836004018380548060200260200160405190810160405280929190818152602001828054801561169457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611676575b50505050509350828054806020026020016040519081016040528092919081815260200182805480156116e657602002820191906000526020600020905b8154815260200190600101908083116116d2575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156117ba57838290600052602060002001805461172d906167f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611759906167f4565b80156117a65780601f1061177b576101008083540402835291602001916117a6565b820191906000526020600020905b81548152906001019060200180831161178957829003601f168201915b50505050508152602001906001019061170e565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561188d578382906000526020600020018054611800906167f4565b80601f016020809104026020016040519081016040528092919081815260200182805461182c906167f4565b80156118795780601f1061184e57610100808354040283529160200191611879565b820191906000526020600020905b81548152906001019060200180831161185c57829003601f168201915b5050505050815260200190600101906117e1565b5050505090509450945094509450509193509193565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff8516606082015260009081906118f1906111799060800161115e565b905061190e8782886040518060200160405280600081525061344a565b979650505050505050565b60006110d78261346d565b600080600080611933856135ba565b93509350935093506119478484848461194f565b505050505050565b600061195d8585858561384b565b95945050505050565b6101c55460408051634bf5d7e960e01b815290516060926001600160a01b031691634bf5d7e99160048083019260009291908290030181865afa9250505080156119d257506040513d6000823e601f3d908101601f191682016040526119cf919081019061697d565b60015b611a0e575060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b919050565b600080339050611a348482856040518060200160405280600081525061344a565b949350505050565b60008033905061190e87828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92506130c8915050565b61022b54600090808203611a9f57505061022a54919050565b600061022b611aaf6001846169ea565b81548110611abf57611abf6169fd565b60009182526020918290206040805180820190915291015463ffffffff8116808352600160201b9091046001600160e01b03169282019290925291508410611b1557602001516001600160e01b03169392505050565b611b2a611b2185613916565b61022b9061397f565b6001600160e01b0316949350505050565b611b43610ff7565b6001600160a01b0316336001600160a01b031614611b735760405162461bcd60e51b81526004016104cc906167bd565b30611b7c610ff7565b6001600160a01b031614611bba5760008036604051611b9c9291906167ad565b604051809103902090505b80611bb36101316130d7565b03611ba757505b61125d81613a32565b600080339050611c0b86828787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061344a92505050565b9695505050505050565b6000805b8551811015611caf5761028e6000878381518110611c3957611c396169fd565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611c9d5760405162461bcd60e51b815260206004820152600e60248201526d1bdb9b1e481dda1a5d195b1a5cdd60921b60448201526064016104cc565b80611ca781616a13565b915050611c19565b5061195d85858585613a75565b600054610100900460ff1615808015611cdc5750600054600160ff909116105b80611cf65750303b158015611cf6575060005460ff166001145b611d595760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104cc565b6000805460ff191660011790558015611d7c576000805461ff0019166101001790555b334114611de15760405162461bcd60e51b815260206004820152602d60248201527f746865206d6573736167652073656e646572206d75737420626520746865206260448201526c3637b1b590383937b23ab1b2b960991b60648201526084016104cc565b3a15611e265760405162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b60448201526064016104cc565b611e526040518060400160405280600b81526020016a2129a1a3b7bb32b93737b960a91b815250613add565b611e6b61546062093a8068056bc75e2d63100000613b34565b611e73613b6b565b611e7e612005613b94565b611e89612006613bc4565b611e93600a613bf4565b611e9f62015180613c24565b61028e6020527ff0f52cefb444f33092ac77280e2ff9c808a9c078a96d3cd7513137548137ed8f8054600160ff1991821681179092557fb2c9e894c6f17bfc84a6708e0ea85c2729271d7cae0a8d875cd1080fb415e7a080548216831790557fd8ceb939a734f5a4e0a6fede9e31504e16ac856b555e8bac20ad743b9ff2976a80548216831790557f2a7b967fc66f4b36023165170b23a76f880d3dbbf244a856aeee9e670cef725980548216831790557fdb1a1113bac2e4f0e6f8c2f2bc4f6dbecf1fccb033d5df1b55b5c5ad6c20ac7980548216831790557f8b1888b379fb3b749668d86c5bf8aaada8e2276c6ced3a4efcc1e877827ce0b380548216831790557feeeea8d485053a64711f2c5802d2cc63251dd394956c140a2e30db7cef242ec580548216831790557f4cdb1a6c4b56f62f27f7202d75e865c2405f138cb32ec45019c0f2ca8f91e47280548216831790557f49d6c403a3197b15e024f109c83eb730d7af1a8b49fc6f820e09bad2597c14c980548216831790557f7a41b38ceb33f296c1ff3db5ffcc6542acb091d5fb27586f3c551dd2ebac063880548216831790557f701fe333ee20fad5d5a6a9930dddd3fb815af1d976d5250e394e39d6e4123e3880548216831790557fee7ba9842df249188adc0fc380980c3099f608b602924e083dd61e8e70845b4a80548216831790557f3d402ebd72e644bcd92f3ee2ba09a8ae7105989d2e5863b3b8ac14e1397bc64480548216831790557f29973aeebf3c17f2c3a9cf7ace17f2798aa544e1ea7427938024cde6df46bac180548216831790557f74c0d6e29c82d6628d5f083f86fc15f0c6acef97321252a1eee0bd893dae276580548216831790556120066000527f1bdfc01e60036e5be56ae85d8394ddf727e1021b3d74de5b554fedea2de4376780549091169091179055801561125d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000606080600080600060606065546000801b1480156121ac5750606654155b6121f05760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016104cc565b6121f8613c54565b612200613c63565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6101c554604080516324776b7d60e21b815290516000926001600160a01b0316916391ddadf49160048083019260209291908290030181865afa925050508015612291575060408051601f3d908101601f1916820190925261228e91810190616a2c565b60015b611a0e5761100c43613c72565b60006122ab848484613cd9565b90505b9392505050565b61022b54600090156122da576122cc61022b613d50565b6001600160e01b0316905090565b5061022a5490565b6122ea610ff7565b6001600160a01b0316336001600160a01b03161461231a5760405162461bcd60e51b81526004016104cc906167bd565b30612323610ff7565b6001600160a01b03161461236157600080366040516123439291906167ad565b604051809103902090505b8061235a6101316130d7565b0361234e57505b61125d81613d80565b6101f85460008281526101f9602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa1580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed919061686f565b9050806001146123fd57806122ae565b60009392505050565b336110071461246e5760405162461bcd60e51b815260206004820152602e60248201527f746865206d6573736167652073656e646572206d75737420626520676f76657260448201526d1b985b98d94818dbdb9d1c9858dd60921b60648201526084016104cc565b604080516020601f860181900481028201810190925284815282916124d1919087908790819084018382808284376000920191909152505060408051808201909152600b81526a766f74696e6744656c617960a81b60208201529150613deb9050565b156125c057806020146125265760405162461bcd60e51b815260206004820181905260248201527f696e76616c696420766f74696e6744656c61792076616c7565206c656e67746860448201526064016104cc565b600061256984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613e44915050565b9050600081116125b15760405162461bcd60e51b8152602060048201526013602482015272696e76616c696420766f74696e6744656c617960681b60448201526064016104cc565b6125ba81613a32565b50612b9e565b61262385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600c81526b1d9bdd1a5b99d4195c9a5bd960a21b60208201529150613deb9050565b1561271757806020146126825760405162461bcd60e51b815260206004820152602160248201527f696e76616c696420766f74696e67506572696f642076616c7565206c656e67746044820152600d60fb1b60648201526084016104cc565b60006126c584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613e44915050565b90506000811161270e5760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081d9bdd1a5b99d4195c9a5bd960621b60448201526064016104cc565b6125ba81613e49565b61277f85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260118152701c1c9bdc1bdcd85b151a1c995cda1bdb19607a1b60208201529150613deb9050565b1561288157806020146127e35760405162461bcd60e51b815260206004820152602660248201527f696e76616c69642070726f706f73616c5468726573686f6c642076616c7565206044820152650d8cadccee8d60d31b60648201526084016104cc565b600061282684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613e44915050565b9050600081116128785760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642070726f706f73616c5468726573686f6c640000000000000060448201526064016104cc565b6125ba81613eec565b6128e985858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601181527038bab7b93ab6a232b737b6b4b730ba37b960791b60208201529150613deb9050565b156129ec578060201461294d5760405162461bcd60e51b815260206004820152602660248201527f696e76616c69642071756f72756d44656e6f6d696e61746f722076616c7565206044820152650d8cadccee8d60d31b60648201526084016104cc565b600061299084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613e44915050565b905060018110156129e35760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642071756f72756d44656e6f6d696e61746f720000000000000060448201526064016104cc565b6125ba81613156565b612a5785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152736d696e506572696f64416674657251756f72756d60601b60208201529150613deb9050565b15612b665780600814612abe5760405162461bcd60e51b815260206004820152602960248201527f696e76616c6964206d696e506572696f64416674657251756f72756d2076616c6044820152680eaca40d8cadccee8d60bb1b60648201526084016104cc565b6000612b0184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250613e44915050565b90506001816001600160401b03161015612b5d5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c6964206d696e506572696f64416674657251756f72756d0000000060448201526064016104cc565b6125ba81613f2f565b60405162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b60448201526064016104cc565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e63385858585604051612bd39493929190616a7d565b60405180910390a15050505050565b600061100c6101635490565b60006110d782613f9b565b612c01610ff7565b6001600160a01b0316336001600160a01b031614612c315760405162461bcd60e51b81526004016104cc906167bd565b30612c3a610ff7565b6001600160a01b031614612c785760008036604051612c5a9291906167ad565b604051809103902090505b80612c716101316130d7565b03612c6557505b600080856001600160a01b0316858585604051612c969291906167ad565b60006040518083038185875af1925050503d8060008114612cd3576040519150601f19603f3d011682016040523d82523d6000602084013e612cd8565b606091505b5091509150612d008282604051806060016040528060288152602001616e6560289139613fd9565b50505050505050565b600084848484604051602001612d229493929190616aa4565b60408051601f19818403018152919052805160209091012095945050505050565b612d4b610ff7565b6001600160a01b0316336001600160a01b031614612d7b5760405162461bcd60e51b81526004016104cc906167bd565b30612d84610ff7565b6001600160a01b031614612dc25760008036604051612da49291906167ad565b604051809103902090505b80612dbb6101316130d7565b03612daf57505b61125d81613f2f565b60008251845114612e2f5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a20696e76616c6964207369676e61747572656044820152670e640d8cadccee8d60c31b60648201526084016104cc565b612e3d338787878787613ff2565b611c0b8686612e4c87876140b0565b85611c15565b600080600080612e61856135ba565b9350935093509350611947848484846112f3565b612e7d610ff7565b6001600160a01b0316336001600160a01b031614612ead5760405162461bcd60e51b81526004016104cc906167bd565b30612eb6610ff7565b6001600160a01b031614612ef45760008036604051612ed69291906167ad565b604051809103902090505b80612eed6101316130d7565b03612ee157505b61125d81613e49565b60006122ae8383612f1960408051602081019091526000815290565b613cd9565b612f26610ff7565b6001600160a01b0316336001600160a01b031614612f565760405162461bcd60e51b81526004016104cc906167bd565b30612f5f610ff7565b6001600160a01b031614612f9d5760008036604051612f7f9291906167ad565b604051809103902090505b80612f966101316130d7565b03612f8a57505b61125d81613eec565b60006064612fb383611a86565b6101c554604051632394e7a360e21b8152600481018690526001600160a01b0390911690638e539e8c90602401602060405180830381865afa158015612ffd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613021919061686f565b61302b9190616aef565b6110d79190616b1c565b600080600080613044856135ba565b93509350935093506119478484848461151e565b60006001600160e01b03198216636e665ced60e01b14806110d757506110d7826141e2565b60006110d761308a61427e565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006130bb87878787614288565b915091506116078161434c565b6000611c0b8686868686614496565b60006130f28254600f81810b600160801b909204900b131590565b1561311057604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60648111156131d95760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a4016104cc565b60006131e36122b5565b905080158015906131f5575061022b54155b1561325a57604080518082019091526000815261022b906020810161321984614599565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b61328861327561326861222a565b65ffffffffffff16613916565b61327e84614599565b61022b9190614602565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b306132d0610ff7565b6001600160a01b0316146133615760005b845181101561194757306001600160a01b0316858281518110613306576133066169fd565b60200260200101516001600160a01b03160361335157613351838281518110613331576133316169fd565b60200260200101518051906020012061013161461d90919063ffffffff16565b61335a81616a13565b90506132e1565b5050505050565b60005b84518110156134015761028e600086838151811061338b5761338b6169fd565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166133ef5760405162461bcd60e51b815260206004820152600e60248201526d1bdb9b1e481dda1a5d195b1a5cdd60921b60448201526064016104cc565b806133f981616a13565b91505061336b565b506133618585858585614659565b30613418610ff7565b6001600160a01b0316146133615761013154600f81810b600160801b909204900b131561336157600061013155613361565b600061195d8585858561346860408051602081019091526000815290565b6130c8565b600080613479836146ce565b9050600481600781111561348f5761348f6161ae565b1461349a5792915050565b60008381526101f96020526040902054806134b6575092915050565b6101f854604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa158015613500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135249190616b3e565b15613533575060079392505050565b6101f854604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa15801561357d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a19190616b3e565b156135b0575060059392505050565b5060029392505050565b606080606060008061019360008781526020019081526020016000209050806001018160020161378c83600301805480602002602001604051908101604052809291908181526020016000905b828210156136b3578382906000526020600020018054613626906167f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613652906167f4565b801561369f5780601f106136745761010080835404028352916020019161369f565b820191906000526020600020905b81548152906001019060200180831161368257829003601f168201915b505050505081526020019060010190613607565b50505060048601805460408051602080840282018101909252828152935060009084015b828210156137835783829060005260206000200180546136f6906167f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613722906167f4565b801561376f5780601f106137445761010080835404028352916020019161376f565b820191906000526020600020905b81548152906001019060200180831161375257829003601f168201915b5050505050815260200190600101906136d7565b505050506140b0565b60098401548354604080516020808402820181019092528281529186918301828280156137e257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116137c4575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561383457602002820191906000526020600020905b815481526020019060010190808311613820575b505050505092509450945094509450509193509193565b60008061385a86868686612d09565b600081815261019360205260409020549091506001600160a01b0316338114806138ae5750613887612be2565b6138ac82600161389561222a565b61389f9190616957565b65ffffffffffff16612efd565b105b61390a5760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72427261766f3a2070726f706f7365722061626f76652074686044820152661c995cda1bdb1960ca1b60648201526084016104cc565b61190e87878787614806565b600063ffffffff82111561397b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016104cc565b5090565b8154600090818160058111156139dc57600061399a84614814565b6139a490856169ea565b60008881526020902090915081015463ffffffff90811690871610156139cc578091506139da565b6139d7816001616944565b92505b505b60006139ea878785856148fc565b90508015613a2557613a0f87613a016001846169ea565b600091825260209091200190565b54600160201b90046001600160e01b031661190e565b6000979650505050505050565b6101615460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a161016155565b6000613ad133868686516001600160401b03811115613a9657613a96615c03565b604051908082528060200260200182016040528015613ac957816020015b6060815260200190600190039081613ab45790505b508787613ff2565b61195d85858585614952565b600054610100900460ff16613b045760405162461bcd60e51b81526004016104cc90616b60565b613b2b81613b266040805180820190915260018152603160f81b602082015290565b614d31565b61125d81614d80565b600054610100900460ff16613b5b5760405162461bcd60e51b81526004016104cc90616b60565b613b66838383614db8565b505050565b600054610100900460ff16613b925760405162461bcd60e51b81526004016104cc90616b60565b565b600054610100900460ff16613bbb5760405162461bcd60e51b81526004016104cc90616b60565b61125d81614dfa565b600054610100900460ff16613beb5760405162461bcd60e51b81526004016104cc90616b60565b61125d81614e44565b600054610100900460ff16613c1b5760405162461bcd60e51b81526004016104cc90616b60565b61125d81614e6b565b600054610100900460ff16613c4b5760405162461bcd60e51b81526004016104cc90616b60565b61125d81614e92565b606060678054611270906167f4565b606060688054611270906167f4565b600065ffffffffffff82111561397b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b60648201526084016104cc565b6101c554604051630748d63560e31b81526001600160a01b038581166004830152602482018590526000921690633a46b1a890604401602060405180830381865afa158015613d2c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ab919061686f565b805460009080156123fd57613d6a83613a016001846169ea565b54600160201b90046001600160e01b03166122ae565b6101f854604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a16101f880546001600160a01b0319166001600160a01b0392909216919091179055565b600081604051602001613dfe9190616bab565b6040516020818303038152906040528051906020012083604051602001613e259190616bab565b6040516020818303038152906040528051906020012014905092915050565b015190565b60008111613ea95760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b60648201526084016104cc565b6101625460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a161016255565b6101635460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a161016355565b61025c54604080516001600160401b03928316815291831660208301527f7ca4ac117ed3cdce75c1161d8207c440389b1a15d69d096831664657c07dafc2910160405180910390a161025c805467ffffffffffffffff19166001600160401b0392909216919091179055565b600081815261013060205260408120600101546110d7906001600160401b0316600084815261025d60205260409020546001600160401b0316614eb9565b60608315613fe85750816122ae565b6122ae8383614ecf565b805160208201206000614010878761400a88886140b0565b85612d09565b6000818152610193602052604090206009810154919250906140a55780546001600160a01b0319166001600160a01b038a16178155875161405a90600183019060208b019061599e565b50865161407090600283019060208a01906159ff565b5085516140869060038301906020890190615a3a565b50845161409c9060048301906020880190615a8c565b50600981018390555b505050505050505050565b6060600082516001600160401b038111156140cd576140cd615c03565b60405190808252806020026020018201604052801561410057816020015b60608152602001906001900390816140eb5790505b50905060005b81518110156141da57848181518110614121576141216169fd565b60200260200101515160001461419157848181518110614143576141436169fd565b602002602001015180519060200120848281518110614164576141646169fd565b602002602001015160405160200161417d929190616bc7565b6040516020818303038152906040526141ac565b8381815181106141a3576141a36169fd565b60200260200101515b8282815181106141be576141be6169fd565b6020026020010181905250806141d390616a13565b9050614106565b509392505050565b600063288ace0360e11b6318df743f60e31b63bf26d89760e01b6379dd796f60e01b6001600160e01b0319861682148061422857506001600160e01b0319868116908216145b8061423f57506001600160e01b0319868116908516145b8061425a57506001600160e01b03198616630271189760e51b145b80611c0b57506301ffc9a760e01b6001600160e01b03198716149695505050505050565b600061100c614ef9565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156142bf5750600090506003614343565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614313573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661433c57600060019250925050614343565b9150600090505b94509492505050565b6000816004811115614360576143606161ae565b036143685750565b600181600481111561437c5761437c6161ae565b036143c95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016104cc565b60028160048111156143dd576143dd6161ae565b0361442a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104cc565b600381600481111561443e5761443e6161ae565b0361125d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104cc565b6000806144a68787878787614f6d565b600088815261025d60205260409020549091506001600160401b03161580156144d357506144d3876150c3565b15611c0b5760006144ed61025c546001600160401b031690565b6144f561222a565b65ffffffffffff166145079190616bf8565b905061451288612bee565b816001600160401b03161115614561576040516001600160401b038216815288907f541f725fb9f7c98a30cc9c0ff32fbb14358cd7159c847a3aa20a2bdc442ba5119060200160405180910390a25b600088815261025d60205260409020805467ffffffffffffffff19166001600160401b03929092169190911790559695505050505050565b60006001600160e01b0382111561397b5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016104cc565b600080614610858585615103565b915091505b935093915050565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b6101f85460405163e38335e560e01b81526001600160a01b039091169063e38335e5903490614695908890889088906000908990600401616888565b6000604051808303818588803b1580156146ae57600080fd5b505af11580156146c2573d6000803e3d6000fd5b50505050505050505050565b600081815261013060205260408120600281015460ff16156146f35750600792915050565b6002810154610100900460ff161561470e5750600292915050565b600083815261013060205260408120546001600160401b0316908190036147775760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c20696400000060448201526064016104cc565b600061478161222a565b65ffffffffffff16905080821061479d57506000949350505050565b60006147a886612bee565b90508181106147bd5750600195945050505050565b6147c6866150c3565b80156147e957506000868152610193602052604090206006810154600590910154115b156147fa5750600495945050505050565b50600395945050505050565b600061195d858585856152a2565b60008160000361482657506000919050565b6000600161483384615358565b901c6001901b9050600181848161484c5761484c616b06565b048201901c9050600181848161486457614864616b06565b048201901c9050600181848161487c5761487c616b06565b048201901c9050600181848161489457614894616b06565b048201901c905060018184816148ac576148ac616b06565b048201901c905060018184816148c4576148c4616b06565b048201901c905060018184816148dc576148dc616b06565b048201901c90506122ae818285816148f6576148f6616b06565b046153ec565b60005b818310156141da57600061491384846153fb565b60008781526020902090915063ffffffff86169082015463ffffffff16111561493e5780925061494c565b614949816001616944565b93505b506148ff565b60003361495f8184615416565b6149ab5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f736572207265737472696374656400000060448201526064016104cc565b60006149b561222a565b65ffffffffffff1690506149c7612be2565b6149d683610f266001856169ea565b1015614a3e5760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b60648201526084016104cc565b6000614a538888888880519060200120612d09565b90508651885114614a765760405162461bcd60e51b81526004016104cc90616c18565b8551885114614a975760405162461bcd60e51b81526004016104cc90616c18565b6000885111614ae85760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c000000000000000060448201526064016104cc565b600081815261013060205260409020546001600160401b031615614b585760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b60648201526084016104cc565b6000614b646101615490565b614b6e9084616944565b90506000614b7c6101625490565b614b869083616944565b90506040518060e00160405280614b9c84615507565b6001600160401b031681526001600160a01b038716602082015260006040820152606001614bc983615507565b6001600160401b03908116825260006020808401829052604080850183905260609485018390528883526101308252918290208551815492870151878501519186166001600160e01b031990941693909317600160401b6001600160a01b039094168402176001600160e01b0316600160e01b60e09290921c91909102178155938501516080860151908416921c0217600183015560a08301516002909201805460c09094015161ffff1990941692151561ff00191692909217610100931515939093029290921790558a517f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e091859188918e918e91811115614cce57614cce615c03565b604051908082528060200260200182016040528015614d0157816020015b6060815260200190600190039081614cec5790505b508d88888f604051614d1b99989796959493929190616c59565b60405180910390a1509098975050505050505050565b600054610100900460ff16614d585760405162461bcd60e51b81526004016104cc90616b60565b6067614d648382616d37565b506068614d718282616d37565b50506000606581905560665550565b600054610100900460ff16614da75760405162461bcd60e51b81526004016104cc90616b60565b61012f614db48282616d37565b5050565b600054610100900460ff16614ddf5760405162461bcd60e51b81526004016104cc90616b60565b614de883613a32565b614df182613e49565b613b6681613eec565b600054610100900460ff16614e215760405162461bcd60e51b81526004016104cc90616b60565b6101c580546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166123615760405162461bcd60e51b81526004016104cc90616b60565b600054610100900460ff166112545760405162461bcd60e51b81526004016104cc90616b60565b600054610100900460ff16612dc25760405162461bcd60e51b81526004016104cc90616b60565b6000818311614ec857816122ae565b5090919050565b815115614edf5781518083602001fd5b8060405162461bcd60e51b81526004016104cc9190615dbc565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f614f2461556f565b614f2c6155c8565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000858152610130602052604081206001614f8788611919565b6007811115614f9857614f986161ae565b14614ff15760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b60648201526084016104cc565b805460009061500b9088906001600160401b031686613cd9565b905061501a88888884886155f9565b835160000361506f57866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516150629493929190616df6565b60405180910390a261190e565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516150b0959493929190616e1e565b60405180910390a2979650505050505050565b60008181526101936020526040812060058101546150fa610f9285600090815261013060205260409020546001600160401b031690565b11159392505050565b82546000908190801561524957600061512187613a016001856169ea565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090871610156151a25760405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b657973000000000060448201526064016104cc565b805163ffffffff8088169116036151ea57846151c388613a016001866169ea565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055615239565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b6020015192508391506146159050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b029190931617920191909155905081614615565b6000806152b186868686615797565b60008181526101f960205260409020549091501561195d576101f85460008281526101f960205260409081902054905163c4d252f560e01b81526001600160a01b039092169163c4d252f59161530d9160040190815260200190565b600060405180830381600087803b15801561532757600080fd5b505af115801561533b573d6000803e3d6000fd5b50505060008281526101f960205260408120555095945050505050565b600080608083901c1561536d57608092831c92015b604083901c1561537f57604092831c92015b602083901c1561539157602092831c92015b601083901c156153a357601092831c92015b600883901c156153b557600892831c92015b600483901c156153c757600492831c92015b600283901c156153d957600292831c92015b600183901c156110d75760010192915050565b6000818310614ec857816122ae565b600061540a6002848418616b1c565b6122ae90848416616944565b8051600090603481101561542e5760019150506110d7565b82810160131901516001600160a01b031981166b046e0e4dee0dee6cae47a60f60a31b14615461576001925050506110d7565b60008061546f6028856169ea565b90505b838110156154e6576000806154a6888481518110615492576154926169fd565b01602001516001600160f81b0319166158a4565b91509150816154be57600196505050505050506110d7565b8060ff166004856001600160a01b0316901b1793505050806154df90616a13565b9050615472565b50856001600160a01b0316816001600160a01b031614935050505092915050565b60006001600160401b0382111561397b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016104cc565b60008061557a613c54565b805190915015615591578051602090910120919050565b60655480156155a05792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b6000806155d3613c63565b8051909150156155ea578051602090910120919050565b60665480156155a05792915050565b6000858152610193602090815260408083206001600160a01b038816845260088101909252909120805460ff16156156895760405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20766f746560448201526c08185b1c9958591e4818d85cdd609a1b60648201526084016104cc565b805460ff86166101000261ffff199091161760011781556156a984615936565b81546001600160601b039190911662010000026dffffffffffffffffffffffff00001990911617815560ff85166156f957838260060160008282546156ee9190616944565b90915550612d009050565b60001960ff86160161571957838260050160008282546156ee9190616944565b60011960ff86160161573957838260070160008282546156ee9190616944565b60405162461bcd60e51b815260206004820152602d60248201527f476f7665726e6f72436f6d7061746962696c697479427261766f3a20696e766160448201526c6c696420766f7465207479706560981b60648201526084016104cc565b6000806157a686868686612d09565b905060006157b382611919565b905060028160078111156157c9576157c96161ae565b141580156157e9575060068160078111156157e6576157e66161ae565b14155b801561580757506007816007811115615804576158046161ae565b14155b6158535760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f742061637469766500000060448201526064016104cc565b6000828152610130602052604090819020600201805461ff001916610100179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906114e69084815260200190565b60008060f883901c602f811180156158bf5750603a8160ff16105b156158d457600194602f199091019350915050565b8060ff1660401080156158ea575060478160ff16105b156158ff576001946036199091019350915050565b8060ff166060108015615915575060678160ff16105b1561592a576001946056199091019350915050565b50600093849350915050565b60006001600160601b0382111561397b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b60648201526084016104cc565b8280548282559060005260206000209081019282156159f3579160200282015b828111156159f357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906159be565b5061397b929150615ade565b8280548282559060005260206000209081019282156159f3579160200282015b828111156159f3578251825591602001919060010190615a1f565b828054828255906000526020600020908101928215615a80579160200282015b82811115615a805782518290615a709082616d37565b5091602001919060010190615a5a565b5061397b929150615af3565b828054828255906000526020600020908101928215615ad2579160200282015b82811115615ad25782518290615ac29082616d37565b5091602001919060010190615aac565b5061397b929150615b10565b5b8082111561397b5760008155600101615adf565b8082111561397b576000615b078282615b2d565b50600101615af3565b8082111561397b576000615b248282615b2d565b50600101615b10565b508054615b39906167f4565b6000825580601f10615b49575050565b601f01602090049060005260206000209081019061125d9190615ade565b600060208284031215615b7957600080fd5b5035919050565b600060208284031215615b9257600080fd5b81356001600160e01b0319811681146122ae57600080fd5b803560ff81168114611a0e57600080fd5b60008083601f840112615bcd57600080fd5b5081356001600160401b03811115615be457600080fd5b602083019150836020828501011115615bfc57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715615c4157615c41615c03565b604052919050565b60006001600160401b03821115615c6257615c62615c03565b50601f01601f191660200190565b600082601f830112615c8157600080fd5b8135615c94615c8f82615c49565b615c19565b818152846020838601011115615ca957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b031215615ce257600080fd5b88359750615cf260208a01615baa565b965060408901356001600160401b0380821115615d0e57600080fd5b615d1a8c838d01615bbb565b909850965060608b0135915080821115615d3357600080fd5b50615d408b828c01615c70565b945050615d4f60808a01615baa565b925060a0890135915060c089013590509295985092959890939650565b60005b83811015615d87578181015183820152602001615d6f565b50506000910152565b60008151808452615da8816020860160208601615d6c565b601f01601f19169290920160200192915050565b6020815260006122ae6020830184615d90565b6001600160a01b038116811461125d57600080fd5b60008060008060808587031215615dfa57600080fd5b8435615e0581615dcf565b93506020850135615e1581615dcf565b92506040850135915060608501356001600160401b03811115615e3757600080fd5b615e4387828801615c70565b91505092959194509250565b60006001600160401b03821115615e6857615e68615c03565b5060051b60200190565b600082601f830112615e8357600080fd5b81356020615e93615c8f83615e4f565b82815260059290921b84018101918181019086841115615eb257600080fd5b8286015b84811015615ed6578035615ec981615dcf565b8352918301918301615eb6565b509695505050505050565b600082601f830112615ef257600080fd5b81356020615f02615c8f83615e4f565b82815260059290921b84018101918181019086841115615f2157600080fd5b8286015b84811015615ed65780358352918301918301615f25565b600082601f830112615f4d57600080fd5b81356020615f5d615c8f83615e4f565b82815260059290921b84018101918181019086841115615f7c57600080fd5b8286015b84811015615ed65780356001600160401b03811115615f9f5760008081fd5b615fad8986838b0101615c70565b845250918301918301615f80565b60008060008060808587031215615fd157600080fd5b84356001600160401b0380821115615fe857600080fd5b615ff488838901615e72565b9550602087013591508082111561600a57600080fd5b61601688838901615ee1565b9450604087013591508082111561602c57600080fd5b5061603987828801615f3c565b949793965093946060013593505050565b600081518084526020808501945080840160005b838110156160835781516001600160a01b03168752958201959082019060010161605e565b509495945050505050565b600081518084526020808501945080840160005b83811015616083578151875295820195908201906001016160a2565b600081518084526020808501808196508360051b8101915082860160005b858110156161065782840389526160f4848351615d90565b988501989350908401906001016160dc565b5091979650505050505050565b608081526000616126608083018761604a565b8281036020840152616138818761608e565b9050828103604084015261614c81866160be565b9050828103606084015261190e81856160be565b600080600080600060a0868803121561617857600080fd5b8535945061618860208701615baa565b935061619660408701615baa565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106161e657634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156161ff57600080fd5b82359150602083013561621181615dcf565b809150509250929050565b60006020828403121561622e57600080fd5b81356122ae81615dcf565b6000806040838503121561624c57600080fd5b8235915061625c60208401615baa565b90509250929050565b60008060008060006080868803121561627d57600080fd5b8535945061628d60208701615baa565b935060408601356001600160401b03808211156162a957600080fd5b6162b589838a01615bbb565b909550935060608801359150808211156162ce57600080fd5b506162db88828901615c70565b9150509295509295909350565b600080600080606085870312156162fe57600080fd5b8435935061630e60208601615baa565b925060408501356001600160401b0381111561632957600080fd5b61633587828801615bbb565b95989497509550505050565b6000806000806080858703121561635757600080fd5b84356001600160401b038082111561636e57600080fd5b61637a88838901615e72565b9550602087013591508082111561639057600080fd5b61639c88838901615ee1565b945060408701359150808211156163b257600080fd5b6163be88838901615f3c565b935060608701359150808211156163d457600080fd5b50615e4387828801615c70565b60ff60f81b8816815260e06020820152600061640060e0830189615d90565b82810360408401526164128189615d90565b606084018890526001600160a01b038716608085015260a0840186905283810360c085015290506111c7818561608e565b60008060006060848603121561645857600080fd5b833561646381615dcf565b92506020840135915060408401356001600160401b0381111561648557600080fd5b61649186828701615c70565b9150509250925092565b600080600080604085870312156164b157600080fd5b84356001600160401b03808211156164c857600080fd5b6164d488838901615bbb565b909650945060208701359150808211156164ed57600080fd5b5061633587828801615bbb565b600080600080600060a0868803121561651257600080fd5b853561651d81615dcf565b9450602086013561652d81615dcf565b935060408601356001600160401b038082111561654957600080fd5b61655589838a01615ee1565b9450606088013591508082111561656b57600080fd5b61657789838a01615ee1565b935060808801359150808211156162ce57600080fd5b600080600080606085870312156165a357600080fd5b84356165ae81615dcf565b93506020850135925060408501356001600160401b0381111561632957600080fd5b6000602082840312156165e257600080fd5b81356001600160401b03811681146122ae57600080fd5b600082601f83011261660a57600080fd5b8135602061661a615c8f83615e4f565b82815260059290921b8401810191818101908684111561663957600080fd5b8286015b84811015615ed65780356001600160401b0381111561665c5760008081fd5b61666a8986838b0101615c70565b84525091830191830161663d565b600080600080600060a0868803121561669057600080fd5b85356001600160401b03808211156166a757600080fd5b6166b389838a01615e72565b965060208801359150808211156166c957600080fd5b6166d589838a01615ee1565b955060408801359150808211156166eb57600080fd5b6166f789838a016165f9565b9450606088013591508082111561670d57600080fd5b61657789838a01615f3c565b6000806040838503121561672c57600080fd5b823561673781615dcf565b946020939093013593505050565b600080600080600060a0868803121561675d57600080fd5b853561676881615dcf565b9450602086013561677881615dcf565b9350604086013592506060860135915060808601356001600160401b038111156167a157600080fd5b6162db88828901615c70565b8183823760009101908152919050565b60208082526018908201527f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000604082015260600190565b600181811c9082168061680857607f821691505b60208210810361682857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b60006020828403121561688157600080fd5b5051919050565b60a08152600061689b60a083018861604a565b82810360208401526168ad818861608e565b905082810360408401526168c181876160be565b60608401959095525050608001529392505050565b60c0815260006168e960c083018961604a565b82810360208401526168fb818961608e565b9050828103604084015261690f81886160be565b60608401969096525050608081019290925260a0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156110d7576110d761692e565b65ffffffffffff8281168282160390808211156169765761697661692e565b5092915050565b60006020828403121561698f57600080fd5b81516001600160401b038111156169a557600080fd5b8201601f810184136169b657600080fd5b80516169c4615c8f82615c49565b8181528560208385010111156169d957600080fd5b61195d826020830160208601615d6c565b818103818111156110d7576110d761692e565b634e487b7160e01b600052603260045260246000fd5b600060018201616a2557616a2561692e565b5060010190565b600060208284031215616a3e57600080fd5b815165ffffffffffff811681146122ae57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000616a91604083018688616a54565b828103602084015261190e818587616a54565b608081526000616ab7608083018761604a565b8281036020840152616ac9818761608e565b90508281036040840152616add81866160be565b91505082606083015295945050505050565b80820281158282048414176110d7576110d761692e565b634e487b7160e01b600052601260045260246000fd5b600082616b3957634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215616b5057600080fd5b815180151581146122ae57600080fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251616bbd818460208701615d6c565b9190910192915050565b6001600160e01b0319831681528151600090616bea816004850160208701615d6c565b919091016004019392505050565b6001600160401b038181168382160190808211156169765761697661692e565b60208082526021908201527f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e67746040820152600d60fb1b606082015260800190565b8981526001600160a01b038916602082015261012060408201819052600090616c848382018b61604a565b90508281036060840152616c98818a61608e565b90508281036080840152616cac81896160be565b905082810360a0840152616cc081886160be565b90508560c08401528460e0840152828103610100840152616ce18185615d90565b9c9b505050505050505050505050565b601f821115613b6657600081815260208120601f850160051c81016020861015616d185750805b601f850160051c820191505b8181101561194757828155600101616d24565b81516001600160401b03811115616d5057616d50615c03565b616d6481616d5e84546167f4565b84616cf1565b602080601f831160018114616d995760008415616d815750858301515b600019600386901b1c1916600185901b178555611947565b600085815260208120601f198616915b82811015616dc857888601518255948401946001909101908401616da9565b5085821015616de65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b84815260ff84166020820152826040820152608060608201526000611c0b6080830184615d90565b85815260ff8516602082015283604082015260a060608201526000616e4660a0830185615d90565b8281036080840152616e588185615d90565b9897505050505050505056fe476f7665726e6f723a2072656c617920726576657274656420776974686f7574206d657373616765a164736f6c6343000812000a" + }, + "0x0000000000000000000000000000000000002005": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102955760003560e01c806379cc679011610167578063a9059cbb116100ce578063dd62ed3e11610087578063dd62ed3e14610598578063df8079e9146105ab578063e5ed5b1e146105b4578063f1127ed8146105c7578063f9a2bbc714610604578063fd6a68791461060d57600080fd5b8063a9059cbb14610544578063aa82dce114610557578063c3cda52014610560578063c81b166214610573578063d505accf1461057c578063dc927faf1461058f57600080fd5b806391ddadf41161012057806391ddadf4146104e557806395d89b41146105045780639ab24eb01461050c5780639dc092621461051f578063a1a11bf514610528578063a457c2d71461053157600080fd5b806379cc6790146104805780637e434d54146104935780637ecebe001461049c5780638129fc1c146104af57806384b0196e146104b75780638e539e8c146104d257600080fd5b80633a71f2f21161020b578063587cde1e116101c4578063587cde1e146103de5780635c19a95c1461040a5780636e47b4821461041d5780636fcfff451461042657806370a082311461044e57806375d47a0a1461047757600080fd5b80633a71f2f21461039357806342966c68146103a857806343756e5c146103bb5780634bf5d7e9146103c457806351b4dce3146103cc57806351e80672146103d557600080fd5b806323b872dd1161025d57806323b872dd1461033a578063280870281461034d578063313ce567146103565780633644e51514610365578063395093511461036d5780633a46b1a81461038057600080fd5b8063039c91fc1461029a57806306fdde03146102d9578063095ea7b3146102ee5780630e2374a51461031157806318160ddd14610332575b600080fd5b6102c66102a8366004612379565b61013060209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b6102e1610616565b6040516102d091906123f2565b6103016102fc366004612405565b6106a8565b60405190151581526020016102d0565b61031a61200181565b6040516001600160a01b0390911681526020016102d0565b6035546102c6565b61030161034836600461242f565b6106c2565b61031a61200581565b604051601281526020016102d0565b6102c66106e6565b61030161037b366004612405565b6106f5565b6102c661038e366004612405565b610717565b6103a66103a136600461246b565b6107a1565b005b6103a66103b63660046124ef565b610845565b61031a61100181565b6102e1610852565b61031a61200681565b61031a61200081565b61031a6103ec366004612508565b6001600160a01b03908116600090815260fe60205260409020541690565b6103a6610418366004612508565b6108ea565b61031a61100581565b610439610434366004612508565b6108f4565b60405163ffffffff90911681526020016102d0565b6102c661045c366004612508565b6001600160a01b031660009081526033602052604090205490565b61031a61100881565b6103a661048e366004612405565b610916565b61031a61200381565b6102c66104aa366004612508565b61092f565b6103a661094d565b6104bf610b98565b6040516102d09796959493929190612523565b6102c66104e03660046124ef565b610c36565b6104ed610c9e565b60405165ffffffffffff90911681526020016102d0565b6102e1610ca9565b6102c661051a366004612508565b610cb8565b61031a61100781565b61031a61100681565b61030161053f366004612405565b610d3a565b610301610552366004612405565b610db5565b61031a61200281565b6103a661056e3660046125ca565b610dc3565b61031a61100281565b6103a661058a366004612622565b610ef9565b61031a61100381565b6102c66105a6366004612379565b61105d565b61031a61200481565b6103a66105c2366004612379565b611088565b6105da6105d536600461268c565b6110e3565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016102d0565b61031a61100081565b61031a61100481565b606060368054610625906126cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610651906126cc565b801561069e5780601f106106735761010080835404028352916020019161069e565b820191906000526020600020905b81548152906001019060200180831161068157829003601f168201915b5050505050905090565b6000336106b6818585611167565b60019150505b92915050565b6000336106d085828561128b565b6106db858585611305565b506001949350505050565b60006106f0611344565b905090565b6000336106b6818585610708838361105d565b6107129190612716565b611167565b6000610721610c9e565b65ffffffffffff1682106107785760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b038316600090815260ff6020526040902061079a908361134e565b9392505050565b33612002146107f25760405162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015260640161076f565b8160005b8181101561083e5761082e85858381811061081357610813612729565b90506020020160208101906108289190612508565b84611437565b6108378161273f565b90506107f6565b5050505050565b61084f3382611563565b50565b60604361085d610c9e565b65ffffffffffff16146108b25760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f6465000000604482015260640161076f565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b61084f338261156d565b6001600160a01b038116600090815260ff60205260408120546106bc906115e7565b61092182338361128b565b61092b8282611563565b5050565b6001600160a01b038116600090815260cb60205260408120546106bc565b600054610100900460ff161580801561096d5750600054600160ff909116105b806109875750303b158015610987575060005460ff166001145b6109ea5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161076f565b6000805460ff191660011790558015610a0d576000805461ff0019166101001790555b334114610a725760405162461bcd60e51b815260206004820152602d60248201527f746865206d6573736167652073656e646572206d75737420626520746865206260448201526c3637b1b590383937b23ab1b2b960991b606482015260840161076f565b3a15610ab75760405162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015260640161076f565b610b0b604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506040518060400160405280600681526020016533b7bb21272160d11b815250611650565b610b13611681565b610b48604051806040016040528060148152602001732129a19023b7bb32b93730b731b2902a37b5b2b760611b8152506116aa565b610b50611681565b801561084f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000606080600080600060606097546000801b148015610bb85750609854155b610bfc5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b604482015260640161076f565b610c046116f4565b610c0c611703565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610c40610c9e565b65ffffffffffff168210610c925760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b604482015260640161076f565b6106bc6101008361134e565b60006106f043611712565b606060378054610625906126cc565b6001600160a01b038116600090815260ff60205260408120548015610d27576001600160a01b038316600090815260ff6020526040902080546000198301908110610d0557610d05612729565b60009182526020909120015464010000000090046001600160e01b0316610d2a565b60005b6001600160e01b03169392505050565b60003381610d48828661105d565b905083811015610da85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161076f565b6106db8286868403611167565b6000336106b6818585611305565b83421115610e135760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161076f565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8d90610e859060a00160405160208183030381529060405280519060200120611779565b8585856117a6565b9050610e98816117ce565b8614610ee65760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161076f565b610ef0818861156d565b50505050505050565b83421115610f495760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161076f565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f788c6117ce565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610fd382611779565b90506000610fe3828787876117a6565b9050896001600160a01b0316816001600160a01b0316146110465760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161076f565b6110518a8a8a611167565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b33612002146110d95760405162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206d757374206265207374616b6548756200604482015260640161076f565b61092b828261156d565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff841690811061112757611127612729565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6001600160a01b0383166111c95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076f565b6001600160a01b03821661122a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076f565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611297848461105d565b905060001981146112ff57818110156112f25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161076f565b6112ff8484848403611167565b50505050565b60405162461bcd60e51b81526020600482015260146024820152731d1c985b9cd9995c881b9bdd08185b1b1bddd95960621b604482015260640161076f565b60006106f06117f6565b8154600090818160058111156113a85760006113698461186a565b611373908561276e565b600088815260209020909150869082015463ffffffff161115611398578091506113a6565b6113a3816001612716565b92505b505b808210156113f55760006113bc8383611952565b600088815260209020909150869082015463ffffffff1611156113e1578091506113ef565b6113ec816001612716565b92505b506113a8565b8015611421576000868152602090208101600019015464010000000090046001600160e01b0316611424565b60005b6001600160e01b03169695505050505050565b604051630913db4760e01b81526001600160a01b03828116600483015260009190841690630913db4790602401602060405180830381865afa158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a59190612781565b6001600160a01b03808516600090815261013060209081526040808320938716835292905220549091508181101561151e5760006114e3828461276e565b6001600160a01b038087166000908152610130602090815260408083209389168352929052208490559050611518848261196d565b506112ff565b818111156112ff576000611532838361276e565b6001600160a01b03808716600090815261013060209081526040808320938916835292905220849055905061083e84825b61092b8282611977565b6001600160a01b03828116600081815260fe6020818152604080842080546033845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46112ff828483611990565b600063ffffffff82111561164c5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161076f565b5090565b600054610100900460ff166116775760405162461bcd60e51b815260040161076f9061279a565b61092b8282611ace565b600054610100900460ff166116a85760405162461bcd60e51b815260040161076f9061279a565b565b600054610100900460ff166116d15760405162461bcd60e51b815260040161076f9061279a565b61084f81604051806040016040528060018152602001603160f81b815250611b0e565b606060998054610625906126cc565b6060609a8054610625906126cc565b600065ffffffffffff82111561164c5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b606482015260840161076f565b60006106bc611786611344565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060006117b787878787611b5d565b915091506117c481611c21565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611821611d6b565b611829611dc4565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008160000361187c57506000919050565b6000600161188984611df5565b901c6001901b905060018184816118a2576118a26127e5565b048201901c905060018184816118ba576118ba6127e5565b048201901c905060018184816118d2576118d26127e5565b048201901c905060018184816118ea576118ea6127e5565b048201901c90506001818481611902576119026127e5565b048201901c9050600181848161191a5761191a6127e5565b048201901c90506001818481611932576119326127e5565b048201901c905061079a8182858161194c5761194c6127e5565b04611e89565b600061196160028484186127fb565b61079a90848416612716565b61092b8282611e9f565b6119818282611f2a565b6112ff61010061206583612071565b816001600160a01b0316836001600160a01b0316141580156119b25750600081115b15611ac9576001600160a01b03831615611a40576001600160a01b038316600090815260ff6020526040812081906119ed9061206585612071565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611a35929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611ac9576001600160a01b038216600090815260ff602052604081208190611a76906121e685612071565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611abe929190918252602082015260400190565b60405180910390a250505b505050565b600054610100900460ff16611af55760405162461bcd60e51b815260040161076f9061279a565b6036611b01838261286b565b506037611ac9828261286b565b600054610100900460ff16611b355760405162461bcd60e51b815260040161076f9061279a565b6099611b41838261286b565b50609a611b4e828261286b565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b945750600090506003611c18565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611be8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c1157600060019250925050611c18565b9150600090505b94509492505050565b6000816004811115611c3557611c3561292b565b03611c3d5750565b6001816004811115611c5157611c5161292b565b03611c9e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161076f565b6002816004811115611cb257611cb261292b565b03611cff5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161076f565b6003816004811115611d1357611d1361292b565b0361084f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161076f565b600080611d766116f4565b805190915015611d8d578051602090910120919050565b6097548015611d9c5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080611dcf611703565b805190915015611de6578051602090910120919050565b6098548015611d9c5792915050565b600080608083901c15611e0a57608092831c92015b604083901c15611e1c57604092831c92015b602083901c15611e2e57602092831c92015b601083901c15611e4057601092831c92015b600883901c15611e5257600892831c92015b600483901c15611e6457600492831c92015b600283901c15611e7657600292831c92015b600183901c156106bc5760010192915050565b6000818310611e98578161079a565b5090919050565b611ea982826121f2565b6035546001600160e01b031015611f1b5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161076f565b6112ff6101006121e683612071565b6001600160a01b038216611f8a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161076f565b6001600160a01b03821660009081526033602052604090205481811015611ffe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161076f565b6001600160a01b03831660008181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611ac9836000846122b7565b600061079a828461276e565b825460009081908181156120be5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b031660208201526120d3565b60408051808201909152600080825260208201525b905080602001516001600160e01b031693506120f384868863ffffffff16565b925060008211801561211d5750612108610c9e565b65ffffffffffff16816000015163ffffffff16145b156121625761212b836122c2565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff9092169190911790556121dc565b866040518060400160405280612186612179610c9e565b65ffffffffffff166115e7565b63ffffffff16815260200161219a866122c2565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061079a8284612716565b6001600160a01b0382166122485760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161076f565b806035600082825461225a9190612716565b90915550506001600160a01b0382166000818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361092b600083835b611ac983838361232b565b60006001600160e01b0382111561164c5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161076f565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054611ac992918216911683611990565b80356001600160a01b038116811461237457600080fd5b919050565b6000806040838503121561238c57600080fd5b6123958361235d565b91506123a36020840161235d565b90509250929050565b6000815180845260005b818110156123d2576020818501810151868301820152016123b6565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061079a60208301846123ac565b6000806040838503121561241857600080fd5b6124218361235d565b946020939093013593505050565b60008060006060848603121561244457600080fd5b61244d8461235d565b925061245b6020850161235d565b9150604084013590509250925092565b60008060006040848603121561248057600080fd5b833567ffffffffffffffff8082111561249857600080fd5b818601915086601f8301126124ac57600080fd5b8135818111156124bb57600080fd5b8760208260051b85010111156124d057600080fd5b6020928301955093506124e6918601905061235d565b90509250925092565b60006020828403121561250157600080fd5b5035919050565b60006020828403121561251a57600080fd5b61079a8261235d565b60ff60f81b881681526000602060e08184015261254360e084018a6123ac565b8381036040850152612555818a6123ac565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156125a75783518352928401929184019160010161258b565b50909c9b505050505050505050505050565b803560ff8116811461237457600080fd5b60008060008060008060c087890312156125e357600080fd5b6125ec8761235d565b95506020870135945060408701359350612608606088016125b9565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561263d57600080fd5b6126468861235d565b96506126546020890161235d565b95506040880135945060608801359350612670608089016125b9565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561269f57600080fd5b6126a88361235d565b9150602083013563ffffffff811681146126c157600080fd5b809150509250929050565b600181811c908216806126e057607f821691505b6020821081036117f057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156106bc576106bc612700565b634e487b7160e01b600052603260045260246000fd5b60006001820161275157612751612700565b5060010190565b634e487b7160e01b600052604160045260246000fd5b818103818111156106bc576106bc612700565b60006020828403121561279357600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261281857634e487b7160e01b600052601260045260246000fd5b500490565b601f821115611ac957600081815260208120601f850160051c810160208610156128445750805b601f850160051c820191505b8181101561286357828155600101612850565b505050505050565b815167ffffffffffffffff81111561288557612885612758565b6128998161289384546126cc565b8461281d565b602080601f8311600181146128ce57600084156128b65750858301515b600019600386901b1c1916600185901b178555612863565b600085815260208120601f198616915b828110156128fd578886015182559484019460019091019084016128de565b508582101561291b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052602160045260246000fdfea164736f6c6343000812000a" + }, + "0x0000000000000000000000000000000000002006": { + "balance": "0x0", + "code": "0x60806040526004361061028c5760003560e01c80638065657f1161015a578063bc197c81116100c1578063df8079e91161007a578063df8079e9146107ab578063e38335e5146107c1578063f23a6e61146107d4578063f27a0c9214610800578063f9a2bbc714610815578063fd6a68791461082b57600080fd5b8063bc197c81146106e6578063c4d252f514610712578063c81b166214610732578063d45c443514610748578063d547741f14610775578063dc927faf1461079557600080fd5b8063a1a11bf511610113578063a1a11bf514610643578063a217fddf14610659578063aa82dce11461066e578063ac43175114610684578063b08e51c0146106a4578063b1c5f427146106c657600080fd5b80638065657f146105965780638129fc1c146105b65780638f2a0bb0146105cb5780638f61f4f5146105eb57806391d148541461060d5780639dc092621461062d57600080fd5b80632f2ff15d116101fe578063584b153e116101b7578063584b153e146104fe57806364d623531461051e5780636e47b4821461053e57806375d47a0a146105545780637653d3f31461056a5780637e434d541461058057600080fd5b80632f2ff15d1461045c57806331d507501461047c57806336568abe1461049c57806343756e5c146104bc57806351b4dce3146104d257806351e80672146104e857600080fd5b8063134008d311610250578063134008d31461036f57806313bc9f2014610382578063150b7a02146103a2578063248a9ca3146103e657806328087028146104165780632ab0f5291461042c57600080fd5b806301d5062a1461029857806301ffc9a7146102ba57806307bd0265146102ef5780630d3cf6fc1461031f5780630e2374a51461034157600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102b86102b3366004611d9e565b610841565b005b3480156102c657600080fd5b506102da6102d5366004611e12565b610905565b60405190151581526020015b60405180910390f35b3480156102fb57600080fd5b5061031160008051602061288583398151915281565b6040519081526020016102e6565b34801561032b57600080fd5b5061031160008051602061284583398151915281565b34801561034d57600080fd5b5061035761200181565b6040516001600160a01b0390911681526020016102e6565b6102b861037d366004611e3c565b610930565b34801561038e57600080fd5b506102da61039d366004611ea7565b6109d3565b3480156103ae57600080fd5b506103cd6103bd366004611f75565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016102e6565b3480156103f257600080fd5b50610311610401366004611ea7565b60009081526065602052604090206001015490565b34801561042257600080fd5b5061035761200581565b34801561043857600080fd5b506102da610447366004611ea7565b60009081526097602052604090205460011490565b34801561046857600080fd5b506102b8610477366004611fdc565b6109f9565b34801561048857600080fd5b506102da610497366004611ea7565b610a23565b3480156104a857600080fd5b506102b86104b7366004611fdc565b610a3c565b3480156104c857600080fd5b5061035761100181565b3480156104de57600080fd5b5061035761200681565b3480156104f457600080fd5b5061035761200081565b34801561050a57600080fd5b506102da610519366004611ea7565b610abf565b34801561052a57600080fd5b506102b8610539366004611ea7565b610ad6565b34801561054a57600080fd5b5061035761100581565b34801561056057600080fd5b5061035761100881565b34801561057657600080fd5b5061031161546081565b34801561058c57600080fd5b5061035761200381565b3480156105a257600080fd5b506103116105b1366004611e3c565b610b7a565b3480156105c257600080fd5b506102b8610bb9565b3480156105d757600080fd5b506102b86105e636600461204c565b610dd5565b3480156105f757600080fd5b5061031160008051602061286583398151915281565b34801561061957600080fd5b506102da610628366004611fdc565b610f56565b34801561063957600080fd5b5061035761100781565b34801561064f57600080fd5b5061035761100681565b34801561066557600080fd5b50610311600081565b34801561067a57600080fd5b5061035761200281565b34801561069057600080fd5b506102b861069f3660046120fd565b610f81565b3480156106b057600080fd5b506103116000805160206128a583398151915281565b3480156106d257600080fd5b506103116106e1366004612168565b6111f9565b3480156106f257600080fd5b506103cd61070136600461228f565b63bc197c8160e01b95945050505050565b34801561071e57600080fd5b506102b861072d366004611ea7565b61123e565b34801561073e57600080fd5b5061035761100281565b34801561075457600080fd5b50610311610763366004611ea7565b60009081526097602052604090205490565b34801561078157600080fd5b506102b8610790366004611fdc565b611301565b3480156107a157600080fd5b5061035761100381565b3480156107b757600080fd5b5061035761200481565b6102b86107cf366004612168565b611326565b3480156107e057600080fd5b506103cd6107ef366004612338565b63f23a6e6160e01b95945050505050565b34801561080c57600080fd5b50609854610311565b34801561082157600080fd5b5061035761100081565b34801561083757600080fd5b5061035761100481565b6000805160206128658339815191526108598161149e565b6000610869898989898989610b7a565b905061087581846114a8565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516108b1969594939291906123c5565b60405180910390a383156108fa57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516108f191815260200190565b60405180910390a25b505050505050505050565b60006001600160e01b03198216630271189760e51b148061092a575061092a82611597565b92915050565b60008051602061288583398151915261094a816000610f56565b6109585761095881336115cc565b6000610968888888888888610b7a565b90506109748185611625565b610980888888886116c0565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516109b89493929190612402565b60405180910390a36109c981611793565b5050505050505050565b6000818152609760205260408120546001811180156109f25750428111155b9392505050565b600082815260656020526040902060010154610a148161149e565b610a1e83836117cc565b505050565b60008181526097602052604081205481905b1192915050565b6001600160a01b0381163314610ab15760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610abb8282611852565b5050565b600081815260976020526040812054600190610a35565b333014610b395760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610aa8565b60985460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1609855565b6000868686868686604051602001610b97969594939291906123c5565b6040516020818303038152906040528051906020012090509695505050505050565b600054610100900460ff1615808015610bd95750600054600160ff909116105b80610bf35750303b158015610bf3575060005460ff166001145b610c565760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610aa8565b6000805460ff191660011790558015610c79576000805461ff0019166101001790555b334114610cde5760405162461bcd60e51b815260206004820152602d60248201527f746865206d6573736167652073656e646572206d75737420626520746865206260448201526c3637b1b590383937b23ab1b2b960991b6064820152608401610aa8565b3a15610d235760405162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b6044820152606401610aa8565b6040805160018082528183019092526000916020808301908036833701905050905061200481600081518110610d5b57610d5b612434565b60200260200101906001600160a01b031690816001600160a01b031681525050610d8b61546082836120046118b9565b508015610dd2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b600080516020612865833981519152610ded8161149e565b888714610e0c5760405162461bcd60e51b8152600401610aa89061244a565b888514610e2b5760405162461bcd60e51b8152600401610aa89061244a565b6000610e3d8b8b8b8b8b8b8b8b6111f9565b9050610e4981846114a8565b60005b8a811015610f075780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610e8957610e89612434565b9050602002016020810190610e9e919061248d565b8d8d86818110610eb057610eb0612434565b905060200201358c8c87818110610ec957610ec9612434565b9050602002810190610edb91906124a8565b8c8b604051610eef969594939291906123c5565b60405180910390a3610f0081612504565b9050610e4c565b508315610f4957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610f4091815260200190565b60405180910390a25b5050505050505050505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b3361100714610fe95760405162461bcd60e51b815260206004820152602e60248201527f746865206d6573736167652073656e646572206d75737420626520676f76657260448201526d1b985b98d94818dbdb9d1c9858dd60921b6064820152608401610aa8565b604080516020601f8601819004810282018101909252848152829161104991908790879081908401838280828437600092019190915250506040805180820190915260088152676d696e44656c617960c01b602082015291506118f29050565b1561117d578060201461109e5760405162461bcd60e51b815260206004820152601d60248201527f696e76616c6964206d696e44656c61792076616c7565206c656e6774680000006044820152606401610aa8565b60006110e184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925061194b915050565b9050600081116111265760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964206d696e44656c617960801b6044820152606401610aa8565b6040516364d6235360e01b81526004810182905230906364d6235390602401600060405180830381600087803b15801561115f57600080fd5b505af1158015611173573d6000803e3d6000fd5b50505050506111b5565b60405162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b6044820152606401610aa8565b7ff1ce9b2cbf50eeb05769a29e2543fd350cab46894a7dd9978a12d534bb20e633858585856040516111ea949392919061251d565b60405180910390a15050505050565b6000888888888888888860405160200161121a9897969594939291906125d5565b60405160208183030381529060405280519060200120905098975050505050505050565b6000805160206128a58339815191526112568161149e565b61125f82610abf565b6112c55760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610aa8565b6000828152609760205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b60008281526065602052604090206001015461131c8161149e565b610a1e8383611852565b600080516020612885833981519152611340816000610f56565b61134e5761134e81336115cc565b87861461136d5760405162461bcd60e51b8152600401610aa89061244a565b87841461138c5760405162461bcd60e51b8152600401610aa89061244a565b600061139e8a8a8a8a8a8a8a8a6111f9565b90506113aa8185611625565b60005b898110156114885760008b8b838181106113c9576113c9612434565b90506020020160208101906113de919061248d565b905060008a8a848181106113f4576113f4612434565b9050602002013590503660008a8a8681811061141257611412612434565b905060200281019061142491906124a8565b91509150611434848484846116c0565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161146b9493929190612402565b60405180910390a3505050508061148190612504565b90506113ad565b5061149281611793565b50505050505050505050565b610dd281336115cc565b6114b182610a23565b156115165760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610aa8565b6098548110156115775760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610aa8565b6115818142612676565b6000928352609760205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061092a57506301ffc9a760e01b6001600160e01b031983161461092a565b6115d68282610f56565b610abb576115e381611950565b6115ee836020611962565b6040516020016115ff9291906126ad565b60408051601f198184030181529082905262461bcd60e51b8252610aa891600401612722565b61162e826109d3565b61164a5760405162461bcd60e51b8152600401610aa890612755565b80158061166557506000818152609760205260409020546001145b610abb5760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610aa8565b6000846001600160a01b03168484846040516116dd92919061279f565b60006040518083038185875af1925050503d806000811461171a576040519150601f19603f3d011682016040523d82523d6000602084013e61171f565b606091505b505090508061178c5760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610aa8565b5050505050565b61179c816109d3565b6117b85760405162461bcd60e51b8152600401610aa890612755565b600090815260976020526040902060019055565b6117d68282610f56565b610abb5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561180e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61185c8282610f56565b15610abb5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166118e05760405162461bcd60e51b8152600401610aa8906127af565b6118ec84848484611afd565b50505050565b60008160405160200161190591906127fa565b604051602081830303815290604052805190602001208360405160200161192c91906127fa565b6040516020818303038152906040528051906020012014905092915050565b015190565b606061092a6001600160a01b03831660145b60606000611971836002612816565b61197c906002612676565b6001600160401b0381111561199357611993611ec0565b6040519080825280601f01601f1916602001820160405280156119bd576020820181803683370190505b509050600360fc1b816000815181106119d8576119d8612434565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611a0757611a07612434565b60200101906001600160f81b031916908160001a9053506000611a2b846002612816565b611a36906001612676565b90505b6001811115611aae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611a6a57611a6a612434565b1a60f81b828281518110611a8057611a80612434565b60200101906001600160f81b031916908160001a90535060049490941c93611aa78161282d565b9050611a39565b5083156109f25760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610aa8565b600054610100900460ff16611b245760405162461bcd60e51b8152600401610aa8906127af565b611b3c60008051602061284583398151915280611ce5565b611b62600080516020612865833981519152600080516020612845833981519152611ce5565b611b88600080516020612885833981519152600080516020612845833981519152611ce5565b611bae6000805160206128a5833981519152600080516020612845833981519152611ce5565b611bc660008051602061284583398151915230611d30565b6001600160a01b03811615611bed57611bed60008051602061284583398151915282611d30565b60005b8351811015611c5e57611c2a600080516020612865833981519152858381518110611c1d57611c1d612434565b6020026020010151611d30565b611c4e6000805160206128a5833981519152858381518110611c1d57611c1d612434565b611c5781612504565b9050611bf0565b5060005b8251811015611c9f57611c8f600080516020612885833981519152848381518110611c1d57611c1d612434565b611c9881612504565b9050611c62565b5060988490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150505050565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b610abb82826117cc565b80356001600160a01b0381168114611d5157600080fd5b919050565b60008083601f840112611d6857600080fd5b5081356001600160401b03811115611d7f57600080fd5b602083019150836020828501011115611d9757600080fd5b9250929050565b600080600080600080600060c0888a031215611db957600080fd5b611dc288611d3a565b96506020880135955060408801356001600160401b03811115611de457600080fd5b611df08a828b01611d56565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611e2457600080fd5b81356001600160e01b0319811681146109f257600080fd5b60008060008060008060a08789031215611e5557600080fd5b611e5e87611d3a565b95506020870135945060408701356001600160401b03811115611e8057600080fd5b611e8c89828a01611d56565b979a9699509760608101359660809091013595509350505050565b600060208284031215611eb957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611efe57611efe611ec0565b604052919050565b600082601f830112611f1757600080fd5b81356001600160401b03811115611f3057611f30611ec0565b611f43601f8201601f1916602001611ed6565b818152846020838601011115611f5857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611f8b57600080fd5b611f9485611d3a565b9350611fa260208601611d3a565b92506040850135915060608501356001600160401b03811115611fc457600080fd5b611fd087828801611f06565b91505092959194509250565b60008060408385031215611fef57600080fd5b82359150611fff60208401611d3a565b90509250929050565b60008083601f84011261201a57600080fd5b5081356001600160401b0381111561203157600080fd5b6020830191508360208260051b8501011115611d9757600080fd5b600080600080600080600080600060c08a8c03121561206a57600080fd5b89356001600160401b038082111561208157600080fd5b61208d8d838e01612008565b909b50995060208c01359150808211156120a657600080fd5b6120b28d838e01612008565b909950975060408c01359150808211156120cb57600080fd5b506120d88c828d01612008565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b6000806000806040858703121561211357600080fd5b84356001600160401b038082111561212a57600080fd5b61213688838901611d56565b9096509450602087013591508082111561214f57600080fd5b5061215c87828801611d56565b95989497509550505050565b60008060008060008060008060a0898b03121561218457600080fd5b88356001600160401b038082111561219b57600080fd5b6121a78c838d01612008565b909a50985060208b01359150808211156121c057600080fd5b6121cc8c838d01612008565b909850965060408b01359150808211156121e557600080fd5b506121f28b828c01612008565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261222157600080fd5b813560206001600160401b0382111561223c5761223c611ec0565b8160051b61224b828201611ed6565b928352848101820192828101908785111561226557600080fd5b83870192505b848310156122845782358252918301919083019061226b565b979650505050505050565b600080600080600060a086880312156122a757600080fd5b6122b086611d3a565b94506122be60208701611d3a565b935060408601356001600160401b03808211156122da57600080fd5b6122e689838a01612210565b945060608801359150808211156122fc57600080fd5b61230889838a01612210565b9350608088013591508082111561231e57600080fd5b5061232b88828901611f06565b9150509295509295909350565b600080600080600060a0868803121561235057600080fd5b61235986611d3a565b945061236760208701611d3a565b9350604086013592506060860135915060808601356001600160401b0381111561239057600080fd5b61232b88828901611f06565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006123ed60a08301868861239c565b60608301949094525060800152949350505050565b60018060a01b038516815283602082015260606040820152600061242a60608301848661239c565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b60006020828403121561249f57600080fd5b6109f282611d3a565b6000808335601e198436030181126124bf57600080fd5b8301803591506001600160401b038211156124d957600080fd5b602001915036819003821315611d9757600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612516576125166124ee565b5060010190565b60408152600061253160408301868861239c565b828103602084015261228481858761239c565b81835260006020808501808196508560051b810191508460005b878110156125c85782840389528135601e1988360301811261257f57600080fd5b870185810190356001600160401b0381111561259a57600080fd5b8036038213156125a957600080fd5b6125b486828461239c565b9a87019a955050509084019060010161255e565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015612616576001600160a01b0361260184611d3a565b168252602092830192909101906001016125e8565b5083810360208501528881526001600160fb1b0389111561263657600080fd5b8860051b9150818a6020830137018281036020908101604085015261265e9082018789612544565b60608401959095525050608001529695505050505050565b8082018082111561092a5761092a6124ee565b60005b838110156126a457818101518382015260200161268c565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516126e5816017850160208801612689565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612716816028840160208801612689565b01602801949350505050565b6020815260008251806020840152612741816040850160208701612689565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000825161280c818460208701612689565b9190910192915050565b808202811582820484141761092a5761092a6124ee565b60008161283c5761283c6124ee565b50600019019056fe5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783a164736f6c6343000812000a" }, "0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD": { "balance": "0x100000000000000000000" diff --git a/lib/Deployer.sol b/lib/Deployer.sol deleted file mode 100644 index b9af68d3..00000000 --- a/lib/Deployer.sol +++ /dev/null @@ -1,161 +0,0 @@ -pragma solidity 0.8.16; - -import "forge-std/Test.sol"; -import "./interface/IBSCValidatorSet.sol"; -import "./interface/ICrossChain.sol"; -import "./interface/IGovHub.sol"; -import "./interface/IRelayerHub.sol"; -import "./interface/IRelayerIncentivize.sol"; -import "./interface/ISlashIndicator.sol"; -import "./interface/IStaking.sol"; -import "./interface/ISystemReward.sol"; -import "./interface/ITokenHub.sol"; -import "./interface/ITokenManager.sol"; -import "./interface/ITendermintLightClient.sol"; -import "../lib/RLPEncode.sol"; -import "../lib/RLPDecode.sol"; - -contract Deployer is Test { - using RLPEncode for *; - - // system contract address - address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000; - address public constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001; - address public constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002; - address public constant LIGHT_CLIENT_ADDR = 0x0000000000000000000000000000000000001003; - address public constant TOKEN_HUB_ADDR = 0x0000000000000000000000000000000000001004; - address public constant INCENTIVIZE_ADDR = 0x0000000000000000000000000000000000001005; - address public constant RELAYERHUB_CONTRACT_ADDR = 0x0000000000000000000000000000000000001006; - address public constant GOV_HUB_ADDR = 0x0000000000000000000000000000000000001007; - address public constant TOKEN_MANAGER_ADDR = 0x0000000000000000000000000000000000001008; - address public constant CROSS_CHAIN_CONTRACT_ADDR = 0x0000000000000000000000000000000000002000; - address public constant STAKING_CONTRACT_ADDR = 0x0000000000000000000000000000000000002001; - - uint8 public constant BIND_CHANNELID = 0x01; - uint8 public constant TRANSFER_IN_CHANNELID = 0x02; - uint8 public constant TRANSFER_OUT_CHANNELID = 0x03; - uint8 public constant MIRROR_CHANNELID = 0x04; - uint8 public constant SYNC_CHANNELID = 0x05; - uint8 public constant STAKING_CHANNELID = 0x08; - uint8 public constant GOV_CHANNELID = 0x09; - uint8 public constant SLASH_CHANNELID = 0x0b; - uint8 public constant CROSS_STAKE_CHANNELID = 0x10; - - BSCValidatorSet public validator; - SlashIndicator public slash; - SystemReward public systemReward; - TendermintLightClient public lightClient; - TokenHub public tokenHub; - RelayerIncentivize public incentivize; - RelayerHub public relayerHub; - GovHub public govHub; - TokenManager public tokenManager; - CrossChain public crossChain; - Staking public staking; - - address payable public relayer; - address payable[] public addrSet; - uint256 public addrIdx; - - bytes32 internal nextUser = keccak256(abi.encodePacked("user address")); - - constructor() { - // create fork - // you should modify this for your own test, which generally should be the bsc mainnet latest number - vm.createSelectFork("bsc", 23839447); - - validator = BSCValidatorSet(VALIDATOR_CONTRACT_ADDR); - vm.label(address(validator), "Validator"); - slash = SlashIndicator(SLASH_CONTRACT_ADDR); - vm.label(address(slash), "SlashIndicator"); - systemReward = SystemReward(SYSTEM_REWARD_ADDR); - vm.label(address(systemReward), "SystemReward"); - lightClient = TendermintLightClient(LIGHT_CLIENT_ADDR); - vm.label(address(lightClient), "LightClient"); - tokenHub = TokenHub(TOKEN_HUB_ADDR); - vm.label(address(tokenHub), "TokenHub"); - incentivize = RelayerIncentivize(INCENTIVIZE_ADDR); - vm.label(address(incentivize), "RelayerIncentivize"); - relayerHub = RelayerHub(RELAYERHUB_CONTRACT_ADDR); - vm.label(address(relayerHub), "RelayerHub"); - govHub = GovHub(GOV_HUB_ADDR); - vm.label(address(govHub), "GovHub"); - tokenManager = TokenManager(TOKEN_MANAGER_ADDR); - vm.label(address(tokenManager), "TokenManager"); - crossChain = CrossChain(CROSS_CHAIN_CONTRACT_ADDR); - vm.label(address(crossChain), "CrossChain"); - staking = Staking(STAKING_CONTRACT_ADDR); - vm.label(address(staking), "Staking"); - - addrSet = createUsers(100); - - relayer = payable(0xb005741528b86F5952469d80A8614591E3c5B632); // whitelabel relayer - vm.label(relayer, "relayer"); - } - - // create users with 1,000,000 ether balance - function createUsers(uint256 userNum) public returns (address payable[] memory) { - address payable[] memory users = new address payable[](userNum); - for (uint256 i = 0; i < userNum; ++i) { - address payable user = _getNextUserAddress(); - vm.deal(user, 1_000_000 ether); - users[i] = user; - } - return users; - } - - function _getNextUserAddress() internal returns (address payable) { - //bytes32 to address conversion - address payable user = payable(address(uint160(uint256(nextUser)))); - nextUser = keccak256(abi.encodePacked(nextUser)); - return user; - } - - function updateParamByGovHub(bytes memory key, bytes memory value, address addr) public { - bytes[] memory elements = new bytes[](3); - elements[0] = key.encodeBytes(); - elements[1] = value.encodeBytes(); - elements[2] = addr.encodeAddress(); - - vm.startPrank(address(crossChain)); - govHub.handleSynPackage(GOV_CHANNELID, elements.encodeList()); - vm.stopPrank(); - } - - function encodeOldValidatorSetUpdatePack(uint8 code, address[] memory valSet) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](2); - elements[0] = code.encodeUint(); - - bytes[] memory vals = new bytes[](valSet.length); - for (uint256 i; i < valSet.length; ++i) { - bytes[] memory tmp = new bytes[](4); - tmp[0] = valSet[i].encodeAddress(); - tmp[1] = valSet[i].encodeAddress(); - tmp[2] = valSet[i].encodeAddress(); - tmp[3] = uint8(0x64).encodeUint(); - vals[i] = tmp.encodeList(); - } - - elements[1] = vals.encodeList(); - return elements.encodeList(); - } - - function encodeNewValidatorSetUpdatePack(uint8 code, address[] memory valSet, bytes[] memory voteAddrs) internal pure returns (bytes memory) { - bytes[] memory elements = new bytes[](2); - elements[0] = code.encodeUint(); - - bytes[] memory vals = new bytes[](valSet.length); - for (uint256 i; i < valSet.length; ++i) { - bytes[] memory tmp = new bytes[](5); - tmp[0] = valSet[i].encodeAddress(); - tmp[1] = valSet[i].encodeAddress(); - tmp[2] = valSet[i].encodeAddress(); - tmp[3] = uint8(0x64).encodeUint(); - tmp[4] = voteAddrs[i].encodeBytes(); - vals[i] = tmp.encodeList(); - } - - elements[1] = vals.encodeList(); - return elements.encodeList(); - } -} diff --git a/lib/interface/IDEFToken.sol b/lib/interface/IDEFToken.sol deleted file mode 100644 index 551707d8..00000000 --- a/lib/interface/IDEFToken.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity ^0.8.10; - -interface DEFToken { - event Approval(address indexed owner, address indexed spender, uint256 value); - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - event Transfer(address indexed from, address indexed to, uint256 value); - - function _decimals() external view returns (uint8); - function _name() external view returns (string memory); - function _symbol() external view returns (string memory); - function allowance(address owner, address spender) external view returns (uint256); - function approve(address spender, uint256 amount) external returns (bool); - function balanceOf(address account) external view returns (uint256); - function decimals() external view returns (uint8); - function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); - function getOwner() external view returns (address); - function increaseAllowance(address spender, uint256 addedValue) external returns (bool); - function name() external view returns (string memory); - function owner() external view returns (address); - function renounceOwnership() external; - function symbol() external view returns (string memory); - function totalSupply() external view returns (uint256); - function transfer(address recipient, uint256 amount) external returns (bool); - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - function transferOwnership(address newOwner) external; -} diff --git a/lib/interface/IMaliciousToken.sol b/lib/interface/IMaliciousToken.sol deleted file mode 100644 index f3ae3d70..00000000 --- a/lib/interface/IMaliciousToken.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity ^0.8.10; - -interface MaliciousToken { - event Approval(address indexed owner, address indexed spender, uint256 value); - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - event Transfer(address indexed from, address indexed to, uint256 value); - - function _decimals() external view returns (uint8); - function _name() external view returns (string memory); - function _symbol() external view returns (string memory); - function allowance(address owner, address spender) external view returns (uint256); - function approve(address spender, uint256 amount) external returns (bool); - function balanceOf(address account) external view returns (uint256); - function decimals() external view returns (uint8); - function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); - function getOwner() external view returns (address); - function increaseAllowance(address spender, uint256 addedValue) external returns (bool); - function name() external view returns (string memory); - function owner() external view returns (address); - function renounceOwnership() external; - function symbol() external view returns (string memory); - function totalSupply() external view returns (uint256); - function transfer(address, uint256) external returns (bool); - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - function transferOwnership(address newOwner) external; -} diff --git a/lib/interface/IMiniToken.sol b/lib/interface/IMiniToken.sol deleted file mode 100644 index 5ef899bb..00000000 --- a/lib/interface/IMiniToken.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity ^0.8.10; - -interface MiniToken { - event Approval(address indexed owner, address indexed spender, uint256 value); - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - event Transfer(address indexed from, address indexed to, uint256 value); - - function _decimals() external view returns (uint8); - function _name() external view returns (string memory); - function _symbol() external view returns (string memory); - function allowance(address owner, address spender) external view returns (uint256); - function approve(address spender, uint256 amount) external returns (bool); - function balanceOf(address account) external view returns (uint256); - function decimals() external view returns (uint8); - function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); - function getOwner() external view returns (address); - function increaseAllowance(address spender, uint256 addedValue) external returns (bool); - function name() external view returns (string memory); - function owner() external view returns (address); - function renounceOwnership() external; - function symbol() external view returns (string memory); - function totalSupply() external view returns (uint256); - function transfer(address recipient, uint256 amount) external returns (bool); - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - function transferOwnership(address newOwner) external; -} diff --git a/lib/interface/IXYZToken.sol b/lib/interface/IXYZToken.sol deleted file mode 100644 index b12a7d46..00000000 --- a/lib/interface/IXYZToken.sol +++ /dev/null @@ -1,28 +0,0 @@ -pragma solidity ^0.8.10; - -interface XYZToken { - event Approval(address indexed owner, address indexed spender, uint256 value); - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - event Transfer(address indexed from, address indexed to, uint256 value); - - function allowance(address owner, address spender) external view returns (uint256); - function approve(address spender, uint256 amount) external returns (bool); - function balanceOf(address account) external view returns (uint256); - function decimals() external view returns (uint8); - function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); - function getOwner() external view returns (address); - function increaseAllowance(address spender, uint256 addedValue) external returns (bool); - function mint(uint256 amount) external returns (bool); - function name() external view returns (string memory); - function owner() external view returns (address); - function renounceOwnership() external; - function setDecimals(uint8 newDecimals) external; - function setName(string memory newName) external; - function setSymbol(string memory newSymbol) external; - function setTotalSupply(uint256 newTotalSupply) external; - function symbol() external view returns (string memory); - function totalSupply() external view returns (uint256); - function transfer(address recipient, uint256 amount) external returns (bool); - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - function transferOwnership(address newOwner) external; -} diff --git a/package-lock.json b/package-lock.json index 541c7165..767b5500 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,10 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.3", "commander": "^3.0.1", "nunjucks": "^3.2.0", - "openzeppelin-solidity": "v3.0.0-rc.0", "rlp": "^2.2.7", "web3": "^1.7.0" }, @@ -301,6 +302,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@openzeppelin/contracts": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", + "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" + }, + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz", + "integrity": "sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A==" + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -2393,11 +2404,6 @@ "wrappy": "1" } }, - "node_modules/openzeppelin-solidity": { - "version": "3.0.0-rc.0", - "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-3.0.0-rc.0.tgz", - "integrity": "sha512-cftpu1YvJgYbYcUVlTAOi+JvMF+hkvwdjLtA3ZLiBjVfEsf5HQGKL293dr/F31PRZSGurH+31Y0RxOPUvExGQQ==" - }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -3996,6 +4002,16 @@ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "dev": true }, + "@openzeppelin/contracts": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", + "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" + }, + "@openzeppelin/contracts-upgradeable": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz", + "integrity": "sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A==" + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -5778,11 +5794,6 @@ "wrappy": "1" } }, - "openzeppelin-solidity": { - "version": "3.0.0-rc.0", - "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-3.0.0-rc.0.tgz", - "integrity": "sha512-cftpu1YvJgYbYcUVlTAOi+JvMF+hkvwdjLtA3ZLiBjVfEsf5HQGKL293dr/F31PRZSGurH+31Y0RxOPUvExGQQ==" - }, "p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", diff --git a/package.json b/package.json index fcaa6f13..b84e0c66 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,10 @@ "author": "", "license": "MIT", "dependencies": { + "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.3", "commander": "^3.0.1", "nunjucks": "^3.2.0", - "openzeppelin-solidity": "v3.0.0-rc.0", "rlp": "^2.2.7", "web3": "^1.7.0" }, diff --git a/scripts/flatten.sh b/scripts/flatten.sh new file mode 100644 index 00000000..e221fd19 --- /dev/null +++ b/scripts/flatten.sh @@ -0,0 +1,16 @@ +forge flatten contracts/BSCValidatorSet.sol >contracts/flattened/BSCValidatorSet.sol +forge flatten contracts/GovHub.sol >contracts/flattened/GovHub.sol +forge flatten contracts/RelayerHub.sol >contracts/flattened/RelayerHub.sol +forge flatten contracts/RelayerIncentivize.sol >contracts/flattened/RelayerIncentivize.sol +forge flatten contracts/SlashIndicator.sol >contracts/flattened/SlashIndicator.sol +forge flatten contracts/SystemReward.sol >contracts/flattened/SystemReward.sol +forge flatten contracts/TendermintLightClient.sol >contracts/flattened/TendermintLightClient.sol +forge flatten contracts/TokenHub.sol >contracts/flattened/TokenHub.sol +forge flatten contracts/CrossChain.sol >contracts/flattened/CrossChain.sol +forge flatten contracts/TokenManager.sol >contracts/flattened/TokenManager.sol +forge flatten contracts/Staking.sol >contracts/flattened/Staking.sol +forge flatten contracts/BC_fusion/StakeHub.sol >contracts/flattened/StakeHub.sol +forge flatten contracts/BC_fusion/StakeCredit.sol >contracts/flattened/StakeCredit.sol +forge flatten contracts/BC_fusion/BSCGovernor.sol >contracts/flattened/BSCGovernor.sol +forge flatten contracts/BC_fusion/GovToken.sol >contracts/flattened/GovToken.sol +forge flatten contracts/BC_fusion/BSCTimelock.sol >contracts/flattened/BSCTimelock.sol diff --git a/scripts/generate-chainId.js b/scripts/generate-chainId.js new file mode 100644 index 00000000..b164e481 --- /dev/null +++ b/scripts/generate-chainId.js @@ -0,0 +1,7 @@ +// Use to convert chainId from decimal to hex +function formatChainID(chainId) { + const hexString = (chainId >>> 0).toString(16); // Convert to hexadecimal and treat as unsigned + return hexString.padStart(4, '0'); // Pad with leading zeros to a length of 4 characters +} + +exports = module.exports = formatChainID; diff --git a/scripts/generate-crossChain.sh b/scripts/generate-crossChain.sh index 1ae8fe4c..c700d321 100644 --- a/scripts/generate-crossChain.sh +++ b/scripts/generate-crossChain.sh @@ -2,14 +2,14 @@ # Default values OUTPUT="./contracts/CrossChain.sol" -BSC_CHAIN_ID="0060" +HEX_CHAIN_ID="0060" INIT_BATCH_SIZE_FOR_ORACLE="50" # Parse command line arguments while [[ "$#" -gt 0 ]]; do case $1 in - --bscChainId) - BSC_CHAIN_ID="$2" + --hexChainId) + HEX_CHAIN_ID="$2" shift ;; --initBatchSizeForOracle) @@ -25,7 +25,7 @@ while [[ "$#" -gt 0 ]]; do done # Replace the specific line -sed -i -e "s/uint256 constant public CROSS_CHAIN_KEY_PREFIX = .*;/uint256 constant public CROSS_CHAIN_KEY_PREFIX = 0x01${BSC_CHAIN_ID}00;/g" "$OUTPUT" +sed -i -e "s/uint256 constant public CROSS_CHAIN_KEY_PREFIX = .*;/uint256 constant public CROSS_CHAIN_KEY_PREFIX = 0x01${HEX_CHAIN_ID}00;/g" "$OUTPUT" sed -i -e "s/uint256 constant public INIT_BATCH_SIZE = .*;/uint256 constant public INIT_BATCH_SIZE = ${INIT_BATCH_SIZE_FOR_ORACLE};/g" "$OUTPUT" echo "CrossChain file updated." diff --git a/scripts/generate-genesis.js b/scripts/generate-genesis.js index eac6380e..6b631091 100644 --- a/scripts/generate-genesis.js +++ b/scripts/generate-genesis.js @@ -17,7 +17,7 @@ program.option( ); program.parse(process.argv); -// compile contract +// get byte code from compiled contract function readByteCode(key, contractFile) { return new Promise((resolve, reject) => { fs.readFile(`${contractFile}`, 'utf8', (err, data) => { @@ -54,6 +54,11 @@ Promise.all([ readByteCode('tokenManager', 'out/TokenManager.sol/TokenManager.json'), readByteCode('crossChain', 'out/CrossChain.sol/CrossChain.json'), readByteCode('staking', 'out/Staking.sol/Staking.json'), + readByteCode('stakeHub', 'out/StakeHub.sol/StakeHub.json'), + readByteCode('stakeCredit', 'out/StakeCredit.sol/StakeCredit.json'), + readByteCode('governor', 'out/BSCGovernor.sol/BSCGovernor.json'), + readByteCode('govToken', 'out/GovToken.sol/GovToken.json'), + readByteCode('timelock', 'out/BSCTimelock.sol/BSCTimelock.json'), ]).then((result) => { const data = { initLockedBNBOnTokenHub: program.initLockedBNBOnTokenHub, diff --git a/scripts/generate-initHolders.js b/scripts/generate-initHolders.js index 593a8a5c..137165d7 100644 --- a/scripts/generate-initHolders.js +++ b/scripts/generate-initHolders.js @@ -8,9 +8,9 @@ program.version('0.0.1'); program.option( '-t, --template