Lawrence Forman 901d400d62
Address spot check feedback (#251)
* UniswapV3 VIP (#237)

* `@0x/contracts-zero-ex`: Add UniswapV3Feature

* `@0x/contracts-zero-ex`: Add UniswapV3 VIP
`@0x/contract-artifacts`: Regenerate.
`@0x/contract-wrappers`: Regenerate.
`@0x/asset-swapper`: Add UniswapV3 VIP support.

* address review comments and appease linter

* `@0x/contracts-zero-ex`: Add UniswapV3Feature tests

* Multiplex UniswapV3 (#241)

* Add UniswapV3 support to Multiplex batchFill

* Add AssetSwapper support for Multiplex UniswapV3

* fix repo scripts that use PKG= env var (#242)

Co-authored-by: Lawrence Forman <me@merklejerk.com>

* `@0x/asset-swapper`: Adjust uniswap gas overhead

Co-authored-by: Lawrence Forman <me@merklejerk.com>
Co-authored-by: mzhu25 <mchl.zhu.96@gmail.com>

* OTC orders feature (#244)

* Add OTC orders feature contracts

* Address PR feedback

* Remove partial fills for takerSigned variant

* Add function to query the min valid nonce

* Add ETH support

* Tightly pack expiry, nonceBucket, and nonce

* Address PR feedback

* OTC orders unit tests

* Bump prettier version

* Skip unnecessary math if takerTokenFillAmount == order.takerAmount

* appease CI

* Update contract-artifacts and contract-wrappers and CHANGELOGs

* `@0x/contracts-zero-ex`: Address spot check feedback

* `regen wrappers

* prettier

* `@0x/asset-swapper`: prettier and tweak gas schedule slightly for uni3

Co-authored-by: Lawrence Forman <me@merklejerk.com>
Co-authored-by: mzhu25 <mchl.zhu.96@gmail.com>
2021-06-02 14:21:14 +10:00

964 lines
131 KiB
JSON

{
"schemaVersion": "2.0.0",
"contractName": "Staking",
"compilerOutput": {
"abi": [
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "target", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "caller", "type": "address" }
],
"name": "AuthorizedAddressAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "target", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "caller", "type": "address" }
],
"name": "AuthorizedAddressRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "numPoolsToFinalize", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "rewardsAvailable", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "totalFeesCollected", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "totalWeightedStake", "type": "uint256" }
],
"name": "EpochEnded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "rewardsPaid", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "rewardsRemaining", "type": "uint256" }
],
"name": "EpochFinalized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": false, "internalType": "address", "name": "exchangeAddress", "type": "address" }
],
"name": "ExchangeAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": false, "internalType": "address", "name": "exchangeAddress", "type": "address" }
],
"name": "ExchangeRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "makerAddress", "type": "address" },
{ "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
],
"name": "MakerStakingPoolSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "staker", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" },
{ "indexed": false, "internalType": "uint8", "name": "fromStatus", "type": "uint8" },
{ "indexed": true, "internalType": "bytes32", "name": "fromPool", "type": "bytes32" },
{ "indexed": false, "internalType": "uint8", "name": "toStatus", "type": "uint8" },
{ "indexed": true, "internalType": "bytes32", "name": "toPool", "type": "bytes32" }
],
"name": "MoveStake",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
{ "indexed": false, "internalType": "uint32", "name": "oldOperatorShare", "type": "uint32" },
{ "indexed": false, "internalType": "uint32", "name": "newOperatorShare", "type": "uint32" }
],
"name": "OperatorShareDecreased",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" }
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "epochDurationInSeconds",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint32",
"name": "rewardDelegatedStakeWeight",
"type": "uint32"
},
{ "indexed": false, "internalType": "uint256", "name": "minimumPoolStake", "type": "uint256" },
{
"indexed": false,
"internalType": "uint256",
"name": "cobbDouglasAlphaNumerator",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "cobbDouglasAlphaDenominator",
"type": "uint256"
}
],
"name": "ParamsSet",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
{ "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
{ "indexed": false, "internalType": "uint256", "name": "operatorReward", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "membersReward", "type": "uint256" }
],
"name": "RewardsPaid",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "staker", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "Stake",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": false, "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
{ "indexed": false, "internalType": "address", "name": "operator", "type": "address" },
{ "indexed": false, "internalType": "uint32", "name": "operatorShare", "type": "uint32" }
],
"name": "StakingPoolCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
{ "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
],
"name": "StakingPoolEarnedRewardsInEpoch",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "staker", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "Unstake",
"type": "event"
},
{
"constant": false,
"inputs": [{ "internalType": "address", "name": "target", "type": "address" }],
"name": "addAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "address", "name": "addr", "type": "address" }],
"name": "addExchangeAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"name": "aggregatedStatsByEpoch",
"outputs": [
{ "internalType": "uint256", "name": "rewardsAvailable", "type": "uint256" },
{ "internalType": "uint256", "name": "numPoolsToFinalize", "type": "uint256" },
{ "internalType": "uint256", "name": "totalFeesCollected", "type": "uint256" },
{ "internalType": "uint256", "name": "totalWeightedStake", "type": "uint256" },
{ "internalType": "uint256", "name": "totalRewardsFinalized", "type": "uint256" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"name": "authorities",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "address", "name": "", "type": "address" }],
"name": "authorized",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "cobbDouglasAlphaDenominator",
"outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "cobbDouglasAlphaNumerator",
"outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
{ "internalType": "address", "name": "member", "type": "address" }
],
"name": "computeRewardBalanceOfDelegator",
"outputs": [{ "internalType": "uint256", "name": "reward", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"name": "computeRewardBalanceOfOperator",
"outputs": [{ "internalType": "uint256", "name": "reward", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "internalType": "uint32", "name": "operatorShare", "type": "uint32" },
{ "internalType": "bool", "name": "addOperatorAsMaker", "type": "bool" }
],
"name": "createStakingPool",
"outputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentEpoch",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentEpochStartTimeInSeconds",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
{ "internalType": "uint32", "name": "newOperatorShare", "type": "uint32" }
],
"name": "decreaseStakingPoolOperatorShare",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "endEpoch",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "epochDurationInSeconds",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"name": "finalizePool",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getAuthorizedAddresses",
"outputs": [{ "internalType": "address[]", "name": "", "type": "address[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getCurrentEpochEarliestEndTimeInSeconds",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "enum IStructs.StakeStatus", "name": "stakeStatus", "type": "uint8" }],
"name": "getGlobalStakeByStatus",
"outputs": [
{
"components": [
{ "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
{ "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
{ "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
],
"internalType": "struct IStructs.StoredBalance",
"name": "balance",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "staker", "type": "address" },
{ "internalType": "enum IStructs.StakeStatus", "name": "stakeStatus", "type": "uint8" }
],
"name": "getOwnerStakeByStatus",
"outputs": [
{
"components": [
{ "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
{ "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
{ "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
],
"internalType": "struct IStructs.StoredBalance",
"name": "balance",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getParams",
"outputs": [
{ "internalType": "uint256", "name": "_epochDurationInSeconds", "type": "uint256" },
{ "internalType": "uint32", "name": "_rewardDelegatedStakeWeight", "type": "uint32" },
{ "internalType": "uint256", "name": "_minimumPoolStake", "type": "uint256" },
{ "internalType": "uint32", "name": "_cobbDouglasAlphaNumerator", "type": "uint32" },
{ "internalType": "uint32", "name": "_cobbDouglasAlphaDenominator", "type": "uint32" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "staker", "type": "address" },
{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
],
"name": "getStakeDelegatedToPoolByOwner",
"outputs": [
{
"components": [
{ "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
{ "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
{ "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
],
"internalType": "struct IStructs.StoredBalance",
"name": "balance",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"name": "getStakingPool",
"outputs": [
{
"components": [
{ "internalType": "address", "name": "operator", "type": "address" },
{ "internalType": "uint32", "name": "operatorShare", "type": "uint32" }
],
"internalType": "struct IStructs.Pool",
"name": "",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"name": "getStakingPoolStatsThisEpoch",
"outputs": [
{
"components": [
{ "internalType": "uint256", "name": "feesCollected", "type": "uint256" },
{ "internalType": "uint256", "name": "weightedStake", "type": "uint256" },
{ "internalType": "uint256", "name": "membersStake", "type": "uint256" }
],
"internalType": "struct IStructs.PoolStats",
"name": "",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "address", "name": "staker", "type": "address" }],
"name": "getTotalStake",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"name": "getTotalStakeDelegatedToPool",
"outputs": [
{
"components": [
{ "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
{ "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
{ "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
],
"internalType": "struct IStructs.StoredBalance",
"name": "balance",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getWethContract",
"outputs": [{ "internalType": "contract IEtherToken", "name": "wethContract", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getZrxVault",
"outputs": [{ "internalType": "contract IZrxVault", "name": "zrxVault", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "init",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"name": "joinStakingPoolAsMaker",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "lastPoolId",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "minimumPoolStake",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{ "internalType": "enum IStructs.StakeStatus", "name": "status", "type": "uint8" },
{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
],
"internalType": "struct IStructs.StakeInfo",
"name": "from",
"type": "tuple"
},
{
"components": [
{ "internalType": "enum IStructs.StakeStatus", "name": "status", "type": "uint8" },
{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
],
"internalType": "struct IStructs.StakeInfo",
"name": "to",
"type": "tuple"
},
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "moveStake",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "internalType": "address", "name": "makerAddress", "type": "address" },
{ "internalType": "address", "name": "payerAddress", "type": "address" },
{ "internalType": "uint256", "name": "protocolFee", "type": "uint256" }
],
"name": "payProtocolFee",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "address", "name": "", "type": "address" }],
"name": "poolIdByMaker",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "bytes32", "name": "", "type": "bytes32" },
{ "internalType": "uint256", "name": "", "type": "uint256" }
],
"name": "poolStatsByEpoch",
"outputs": [
{ "internalType": "uint256", "name": "feesCollected", "type": "uint256" },
{ "internalType": "uint256", "name": "weightedStake", "type": "uint256" },
{ "internalType": "uint256", "name": "membersStake", "type": "uint256" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "address", "name": "target", "type": "address" }],
"name": "removeAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "internalType": "address", "name": "target", "type": "address" },
{ "internalType": "uint256", "name": "index", "type": "uint256" }
],
"name": "removeAuthorizedAddressAtIndex",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "address", "name": "addr", "type": "address" }],
"name": "removeExchangeAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "rewardDelegatedStakeWeight",
"outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"name": "rewardsByPoolId",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "internalType": "uint256", "name": "_epochDurationInSeconds", "type": "uint256" },
{ "internalType": "uint32", "name": "_rewardDelegatedStakeWeight", "type": "uint32" },
{ "internalType": "uint256", "name": "_minimumPoolStake", "type": "uint256" },
{ "internalType": "uint32", "name": "_cobbDouglasAlphaNumerator", "type": "uint32" },
{ "internalType": "uint32", "name": "_cobbDouglasAlphaDenominator", "type": "uint32" }
],
"name": "setParams",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }],
"name": "stake",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "stakingContract",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }],
"name": "unstake",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [{ "internalType": "address", "name": "", "type": "address" }],
"name": "validExchanges",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "wethReservedForPoolRewards",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
"name": "withdrawDelegatorRewards",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {
"addAuthorizedAddress(address)": {
"details": "Authorizes an address.",
"params": { "target": "Address to authorize." }
},
"addExchangeAddress(address)": {
"details": "Adds a new exchange address",
"params": { "addr": "Address of exchange contract to add" }
},
"computeRewardBalanceOfDelegator(bytes32,address)": {
"details": "Computes the reward balance in ETH of a specific member of a pool.",
"params": { "member": "The member of the pool.", "poolId": "Unique id of pool." },
"return": "totalReward Balance in ETH."
},
"computeRewardBalanceOfOperator(bytes32)": {
"details": "Computes the reward balance in ETH of the operator of a pool.",
"params": { "poolId": "Unique id of pool." },
"return": "totalReward Balance in ETH."
},
"createStakingPool(uint32,bool)": {
"details": "Create a new staking pool. The sender will be the operator of this pool. Note that an operator must be payable.",
"params": {
"addOperatorAsMaker": "Adds operator to the created pool as a maker for convenience iff true.",
"operatorShare": "Portion of rewards owned by the operator, in ppm."
},
"return": "poolId The unique pool id generated for this pool."
},
"decreaseStakingPoolOperatorShare(bytes32,uint32)": {
"details": "Decreases the operator share for the given pool (i.e. increases pool rewards for members).",
"params": {
"newOperatorShare": "The newly decreased percentage of any rewards owned by the operator.",
"poolId": "Unique Id of pool."
}
},
"endEpoch()": {
"details": "Begins a new epoch, preparing the prior one for finalization. Throws if not enough time has passed between epochs or if the previous epoch was not fully finalized.",
"return": "numPoolsToFinalize The number of unfinalized pools."
},
"finalizePool(bytes32)": {
"details": "Instantly finalizes a single pool that earned rewards in the previous epoch, crediting it rewards for members and withdrawing operator's rewards as WETH. This can be called by internal functions that need to finalize a pool immediately. Does nothing if the pool is already finalized or did not earn rewards in the previous epoch.",
"params": { "poolId": "The pool ID to finalize." }
},
"getAuthorizedAddresses()": {
"details": "Gets all authorized addresses.",
"return": "Array of authorized addresses."
},
"getCurrentEpochEarliestEndTimeInSeconds()": {
"details": "Returns the earliest end time in seconds of this epoch. The next epoch can begin once this time is reached. Epoch period = [startTimeInSeconds..endTimeInSeconds)",
"return": "Time in seconds."
},
"getGlobalStakeByStatus(uint8)": {
"details": "Gets global stake for a given status.",
"params": { "stakeStatus": "UNDELEGATED or DELEGATED" },
"return": "Global stake for given status."
},
"getOwnerStakeByStatus(address,uint8)": {
"details": "Gets an owner's stake balances by status.",
"params": { "stakeStatus": "UNDELEGATED or DELEGATED", "staker": "Owner of stake." },
"return": "Owner's stake balances for given status."
},
"getParams()": {
"details": "Retrieves all configurable parameter values.",
"return": "_epochDurationInSeconds Minimum seconds between epochs._rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm._minimumPoolStake Minimum amount of stake required in a pool to collect rewards._cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor._cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor."
},
"getStakeDelegatedToPoolByOwner(address,bytes32)": {
"details": "Returns the stake delegated to a specific staking pool, by a given staker.",
"params": { "poolId": "Unique Id of pool.", "staker": "of stake." },
"return": "Stake delegated to pool by staker."
},
"getStakingPool(bytes32)": {
"details": "Returns a staking pool",
"params": { "poolId": "Unique id of pool." }
},
"getStakingPoolStatsThisEpoch(bytes32)": {
"details": "Get stats on a staking pool in this epoch.",
"params": { "poolId": "Pool Id to query." },
"return": "PoolStats struct for pool id."
},
"getTotalStake(address)": {
"details": "Returns the total stake for a given staker.",
"params": { "staker": "of stake." },
"return": "Total ZRX staked by `staker`."
},
"getTotalStakeDelegatedToPool(bytes32)": {
"details": "Returns the total stake delegated to a specific staking pool, across all members.",
"params": { "poolId": "Unique Id of pool." },
"return": "Total stake delegated to pool."
},
"getWethContract()": {
"details": "An overridable way to access the deployed WETH contract. Must be view to allow overrides to access state.",
"return": "wethContract The WETH contract instance."
},
"getZrxVault()": {
"details": "An overridable way to access the deployed zrxVault. Must be view to allow overrides to access state.",
"return": "zrxVault The zrxVault contract."
},
"init()": {
"details": "Initialize storage owned by this contract. This function should not be called directly. The StakingProxy contract will call it in `attachStakingContract()`."
},
"joinStakingPoolAsMaker(bytes32)": {
"details": "Allows caller to join a staking pool as a maker.",
"params": { "poolId": "Unique id of pool." }
},
"moveStake((uint8,bytes32),(uint8,bytes32),uint256)": {
"details": "Moves stake between statuses: 'undelegated' or 'delegated'. Delegated stake can also be moved between pools. This change comes into effect next epoch.",
"params": {
"amount": "Amount of stake to move.",
"from": "Status to move stake out of.",
"to": "Status to move stake into."
}
},
"payProtocolFee(address,address,uint256)": {
"details": "Pays a protocol fee in ETH or WETH. Only a known 0x exchange can call this method. See (MixinExchangeManager).",
"params": {
"makerAddress": "The address of the order's maker.",
"payerAddress": "The address of the protocol fee payer.",
"protocolFee": "The protocol fee amount. This is either passed as ETH or transferred as WETH."
}
},
"removeAuthorizedAddress(address)": {
"details": "Removes authorizion of an address.",
"params": { "target": "Address to remove authorization from." }
},
"removeAuthorizedAddressAtIndex(address,uint256)": {
"details": "Removes authorizion of an address.",
"params": {
"index": "Index of target in authorities array.",
"target": "Address to remove authorization from."
}
},
"removeExchangeAddress(address)": {
"details": "Removes an existing exchange address",
"params": { "addr": "Address of exchange contract to remove" }
},
"setParams(uint256,uint32,uint256,uint32,uint32)": {
"details": "Set all configurable parameters at once.",
"params": {
"_cobbDouglasAlphaDenominator": "Denominator for cobb douglas alpha factor.",
"_cobbDouglasAlphaNumerator": "Numerator for cobb douglas alpha factor.",
"_epochDurationInSeconds": "Minimum seconds between epochs.",
"_minimumPoolStake": "Minimum amount of stake required in a pool to collect rewards.",
"_rewardDelegatedStakeWeight": "How much delegated stake is weighted vs operator stake, in ppm."
}
},
"stake(uint256)": {
"details": "Stake ZRX tokens. Tokens are deposited into the ZRX Vault. Unstake to retrieve the ZRX. Stake is in the 'Active' status.",
"params": { "amount": "Amount of ZRX to stake." }
},
"transferOwnership(address)": {
"details": "Change the owner of this contract.",
"params": { "newOwner": "New owner address." }
},
"unstake(uint256)": {
"details": "Unstake. Tokens are withdrawn from the ZRX Vault and returned to the staker. Stake must be in the 'undelegated' status in both the current and next epoch in order to be unstaked.",
"params": { "amount": "Amount of ZRX to unstake." }
},
"withdrawDelegatorRewards(bytes32)": {
"details": "Withdraws the caller's WETH rewards that have accumulated until the last epoch.",
"params": { "poolId": "Unique id of pool." }
}
}
},
"evm": {
"bytecode": {
"object": "0x6080604052600080546001600160a01b031916331790556156c0806100256000396000f3fe6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fdb565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b604051610372919061533b565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fdb565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150ef565b610bf4565b60405161037293929190615528565b3480156103d657600080fd5b5061034e6103e53660046150b3565b610c20565b3480156103f657600080fd5b5061040a6104053660046150b3565b610dd5565b604051610372959493929190615559565b34801561042757600080fd5b50610430610e04565b6040516103729190615238565b34801561044957600080fd5b5061045d6104583660046150b3565b610e1c565b60405161037291906154e9565b34801561047657600080fd5b5061034e610485366004614fdb565b610e3b565b34801561049657600080fd5b5061045d6104a5366004615060565b610e4f565b3480156104b657600080fd5b506104ca6104c53660046150b3565b610eae565b6040516103729190615495565b3480156104e357600080fd5b506104306104f23660046150b3565b610ef9565b34801561050357600080fd5b506105176105123660046150b3565b610f2d565b60405161037291906154b6565b34801561053057600080fd5b50610365610f8f565b34801561054557600080fd5b5061034e610554366004615158565b610f95565b34801561056557600080fd5b50610579610574366004614fdb565b611192565b6040516103729190615330565b34801561059257600080fd5b5061034e6105a1366004615110565b6111a7565b3480156105b257600080fd5b506105bb611270565b60405161037295949392919061557c565b3480156105d857600080fd5b50610430611299565b3480156105ed57600080fd5b506103656112b1565b34801561060257600080fd5b5061036561061136600461520b565b6112b7565b34801561062257600080fd5b5061034e610631366004614fdb565b6113f0565b34801561064257600080fd5b506103656114a5565b34801561065757600080fd5b506106606114ab565b60405161037291906155c0565b34801561067957600080fd5b5061034e610688366004614fdb565b6114b7565b34801561069957600080fd5b50610430611579565b3480156106ae57600080fd5b5061034e6106bd366004615036565b611595565b3480156106ce57600080fd5b5061034e6106dd3660046151ad565b6115a7565b3480156106ee57600080fd5b50610365611621565b61034e610705366004614ff6565b611627565b34801561071657600080fd5b50610365611881565b34801561072b57600080fd5b5061034e61073a3660046150b3565b611887565b34801561074b57600080fd5b5061036561199c565b34801561076057600080fd5b506103656119a2565b34801561077557600080fd5b5061034e6107843660046150b3565b6119c0565b34801561079557600080fd5b5061034e6107a43660046150b3565b611a00565b3480156107b557600080fd5b506105796107c4366004614fdb565b611a0a565b3480156107d557600080fd5b506103656107e43660046150b3565b611a1f565b3480156107f557600080fd5b506103656108043660046150b3565b611aaa565b34801561081557600080fd5b5061081e611abc565b60405161037291906152d7565b34801561083757600080fd5b50610660611b2b565b34801561084c57600080fd5b5061034e611b37565b34801561086157600080fd5b5061045d61087036600461513c565b611b51565b34801561088157600080fd5b50610660611ca1565b34801561089657600080fd5b506103656108a53660046150cb565b611cb5565b3480156108b657600080fd5b50610430611d52565b3480156108cb57600080fd5b506103656108da366004614fdb565b611d6e565b3480156108eb57600080fd5b5061045d6108fa366004615036565b611d80565b34801561090b57600080fd5b5061034e61091a366004614fdb565b611dc1565b34801561092b57600080fd5b5061034e61093a3660046150b3565b611e64565b610947612091565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120b4565b612156565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a02908390615238565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215e16565b6000818152601660205260409020600101549091508015610a4d57610a4d610982838361217d565b610a5561219a565b610a5d61220c565b600084815260166020526040902055610a74614ec3565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af6949193929161553e565b60405180910390a2610b066122b0565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b4491600091615386565b60405180910390a25b6020015193505050505b90565b6000610b64611299565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c9190615238565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec9190810190615195565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ef2565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122f3565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612399565b905080841115610cbf57610cbf61098285836123af565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123cc565b610d15611299565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f9291906152b1565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc7919061533b565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b610e24614ef2565b6000828152600760205260409020610bec906122f3565b610e43612453565b610e4c8161249a565b50565b610e57614ef2565b610ea560056000846001811115610e6a57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122f3565b90505b92915050565b610eb6614f12565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f35614f33565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa1575061118d565b6000610fb0602086018661513c565b6001811115610fbb57fe5b148015610fdf57506000610fd2602085018561513c565b6001811115610fdd57fe5b145b15610fea575061118d565b6001610ff9602086018661513c565b600181111561100457fe5b141561101957611019846020013582846125cb565b6001611028602085018561513c565b600181111561103357fe5b14156110485761104883602001358284612664565b600060058161105a602088018861513c565b600181111561106557fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110af9088018861513c565b60018111156110ba57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506110fd8282866126fd565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d90889061114f908c61513c565b600181111561115a57fe5b61116760208c018c61513c565b600181111561117257fe5b604051611181939291906155a7565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b1816127f6565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111e984828561282f565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155d1565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b73ba7f8b5fb1b19c1211c5d49550fcd149177a5eaf90565b60115481565b60085460009033906112d090600163ffffffff61287716565b600881905591506112e582620f42408661282f565b6112ed614f33565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d190859085908990615344565b60405180910390a183156113e8576113e8836119c0565b505092915050565b6113f8612453565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166114315761143161098282612893565b60005b6002548110156114a1578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611499576114948282612932565b6114a1565b600101611434565b5050565b600c5481565b60145463ffffffff1681565b6114bf612091565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16156114fb576114fb6109826000836120b4565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a02908390615238565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61159d612453565b6114a18282612932565b6115af612091565b6115bc8585858585612b81565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff1661164a5761164a61098233612c44565b61165381612c5f565b8061165d5761118d565b346117375761166a610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b81526004016116a693929190615280565b602060405180830381600087803b1580156116c057600080fd5b505af11580156116d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f89190810190615097565b611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e9061545e565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205480611768575061118d565b600061177382610e1c565b602001516bffffffffffffffffffffffff16905060135481101561179857505061118d565b600c54600083815260156020908152604080832084845282528083206016909252909120815480611847576000806117d08888612c80565b6002870182905560018701819055600386015491935091506117f8908263ffffffff61287716565b60038501556001808501546118129163ffffffff61287716565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b611857818863ffffffff61287716565b8355600282015461186e908863ffffffff61287716565b8260020181905550505050505050505050565b60085481565b33611890611299565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118ca9291906152b1565b600060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc6020526040902061194a9083612d0c565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051611990919061533b565b60405180910390a25050565b60175481565b60006119bb601154600d5461287790919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e4c8133612d76565b60016020526000908152604090205460ff1681565b6000611a29614f33565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8d85612f4e565b91509150611aa08360200151838361300b565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b2157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611af6575b5050505050905090565b60125463ffffffff1681565b611b3f612091565b611b4761304c565b611b4f61305f565b565b611b59614ef2565b60016000526004602052611b8c7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122f3565b90506000826001811115611b9c57fe5b1415610bef576000611bac611299565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf157600080fd5b505afa158015611c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c299190810190615195565b9050611c58611c5383602001516bffffffffffffffffffffffff168361215e90919063ffffffff16565b61308a565b6bffffffffffffffffffffffff90811660208401526040830151611c8891611c539184911663ffffffff61215e16565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cbf614f33565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d2386612f4e565b915091506000611d388460200151848461300b565b915050611d47878783856130ae565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d88614ef2565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea5906122f3565b611dc9612453565b73ffffffffffffffffffffffffffffffffffffffff8116611df457611def6109826131fb565b610e4c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7a82600163ffffffff61215e16565b9050611e84614ec3565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ed957505050610e4c565b611ee1614f12565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f2f5750505050610e4c565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f628284613232565b9050600080611f76888486604001516132a7565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fad929190615386565b60405180910390a36000611fc7838363ffffffff61287716565b6080870151909150611fdf908263ffffffff61287716565b6080870181905260008881526016602090815260409091206004019190915586015161201290600163ffffffff61215e16565b602080880182815260008a8152601690925260409091206001019190915551611616576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291612070908263ffffffff61215e16565b60405161207e929190615386565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4f57611b4f610982336133f7565b606063b9588e4360e01b83836040516024016120d19291906153ce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b6000828211156121775761217761098260028585613412565b50900390565b606063614b800a60e01b83836040516024016120d1929190615386565b478015610e4c576121a9610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f057600080fd5b505af1158015612204573d6000803e3d6000fd5b505050505050565b60006119bb60175461221c610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122549190615238565b60206040518083038186803b15801561226c57600080fd5b505afa158015612280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a49190810190615195565b9063ffffffff61215e16565b4260006122bb6119a2565b9050818111156122d2576122d261098282846134b7565b600c546000906122e990600163ffffffff61287716565b600c555050600d55565b6122fb614ef2565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c5490918111156123935761236e816134d4565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b60008183106123a85781610ea5565b5090919050565b60606384c8b7c960e01b83836040516024016120d1929190615386565b6123d4614ef2565b6123dd836122f3565b9050612407611c538383604001516bffffffffffffffffffffffff1661215e90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243691611c5391168463ffffffff61215e16565b6bffffffffffffffffffffffff16602082015261118d83826134f4565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4f57600054611b4f9061098290339073ffffffffffffffffffffffffffffffffffffffff166135ae565b73ffffffffffffffffffffffffffffffffffffffff81166124c0576124c06109826135cb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124fa576124fa61098282613602565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125d48361361d565b6125de8383612d76565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126189082613654565b60008381526007602052604090206126309082613654565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0582613654565b61266d8361361d565b6126778383612d76565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126b190826136ac565b60008381526007602052604090206126c990826136ac565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136ac565b61270783836136e7565b156127115761118d565b612719614ef2565b612722846122f3565b905061272c614ef2565b612735846122f3565b905081604001516bffffffffffffffffffffffff16831115612770576127706109828484604001516bffffffffffffffffffffffff166123af565b604082015161279790611c53906bffffffffffffffffffffffff168563ffffffff61215e16565b6bffffffffffffffffffffffff9081166040808501919091528201516127c891611c5391168563ffffffff61287716565b6bffffffffffffffffffffffff1660408201526127e585836134f4565b6127ef84826134f4565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a1576114a161098233846136ee565b620f424063ffffffff821611156128545761284f6109826000858461370b565b61118d565b8163ffffffff168163ffffffff16111561118d5761118d6109826001858461370b565b600082820183811015610ea557610ea561098260008686613412565b606063eb5108a260e01b826040516024016128ae9190615238565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff1661296b5761296b61098283612893565b6002548110612986576129866109828260028054905061372a565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129aa57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0c57612a0c610982600283815481106129e457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1684613747565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a8757fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612aba57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b399082614f4a565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c35908790879087908790879061557c565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128ae9190615238565b803414158015612c6e57503415155b15610e4c57610e4c6109828234613764565b6000828152600a602052604081205481908190612cb39073ffffffffffffffffffffffffffffffffffffffff1686611d80565b602001516bffffffffffffffffffffffff169050612cd7848263ffffffff61215e16565b601254909350612d0290612cf59063ffffffff16620f424086613781565b829063ffffffff61287716565b9150509250929050565b612d14614ef2565b612d1d836122f3565b9050612d47611c538383604001516bffffffffffffffffffffffff1661287790919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243691611c5391168463ffffffff61287716565b612d7f826137a3565b6000612d8e83836000806130ae565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dca906122f3565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f4557612eaf8382613817565b612eb7610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612ef19291906152b1565b602060405180830381600087803b158015612f0b57600080fd5b505af1158015612f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f439190810190615097565b505b61118d8361385f565b6000806000612f696001600c5461215e90919063ffffffff16565b9050612f73614f12565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ffb908290613232565b9350806040015192505050915091565b6000808261301b57839150613044565b61302f63ffffffff8616620f42408661386c565b9150613041848363ffffffff61215e16565b90505b935093915050565b6130546138a2565b42600d556001600c55565b6130676138b7565b620d2f00620dbba068056bc75e2d63100000600260036127ef8585858585612b81565b806bffffffffffffffffffffffff81168114610bef57610bef61098260028461391c565b600c546000906130bc614ef2565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811694840194909452740100000000000000000000000000000000000000009091049092169281019290925282141561315d576000925050506131f3565b61316981838787613939565b815190935060009061318c9067ffffffffffffffff16600163ffffffff61287716565b90506131ca6131bd8984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139bc565b859063ffffffff61287716565b93506131ed6131bd8984604001516bffffffffffffffffffffffff1684876139bc565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061324057610ea8565b8151835160408401516020860151606086015160145461327695949392919063ffffffff80821691640100000000900416613a55565b608083015183519192506000916132929163ffffffff61215e16565b9050818110156132a0578091505b5092915050565b6000806132b2614f33565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff1690820181905261331690868661300b565b909350915082156133d357613329610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb9161337f9187906004016152b1565b602060405180830381600087803b15801561339957600080fd5b505af11580156133ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133d19190810190615097565b505b81156133ee576133e38683613b18565b6133ee868386613b59565b50935093915050565b606063b65a25b960e01b826040516024016128ae9190615238565b606063e946c1bb60e01b84848460405160240161343193929190615394565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120d1929190615386565b8067ffffffffffffffff81168114610bef57610bef61098260018461391c565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120d1929190615259565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128ae9190615238565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e4c57610e4c610982826000613c42565b61365c614ef2565b613665836122f3565b905061368f611c538383604001516bffffffffffffffffffffffff1661215e90919063ffffffff16565b6bffffffffffffffffffffffff16604082015261118d83826134f4565b6136b4614ef2565b6136bd836122f3565b905061368f611c538383604001516bffffffffffffffffffffffff1661287790919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120d19291906152b1565b60606322df959760e01b84848460405160240161343193929190615400565b606063e9f8377160e01b83836040516024016120d1929190615386565b606063140a84db60e01b83836040516024016120d1929190615259565b60606331d7a50560e01b83836040516024016120d1929190615386565b60006131f383613797868563ffffffff613c5f16565b9063ffffffff613c9016565b600c546000906137ba90600163ffffffff61215e16565b90506137c4614f12565b50600082815260156020908152604080832084845282529182902082516060810184528154808252600183015493820193909352600290910154928101929092521561118d5761118d6109828484613cba565b6000828152600b6020526040902054613836908263ffffffff61215e16565b6000838152600b6020526040902055601754613858908263ffffffff61215e16565b6017555050565b610e4c8160006001613b59565b60006131f38361379761388682600163ffffffff61215e16565b613896888763ffffffff613c5f16565b9063ffffffff61287716565b600d5415611b4f57611b4f6109826000613cd7565b601154158015906138cf575060125463ffffffff1615155b80156138dc575060135415155b80156138ef575060145463ffffffff1615155b801561390a5750601454640100000000900463ffffffff1615155b15611b4f57611b4f6109826001613cd7565b606063c996af7b60e01b83836040516024016120d19291906153b6565b6000821580613946575081155b15613953575060006131f3565b600061396685600163ffffffff61215e16565b865167ffffffffffffffff161015613982578560400151613988565b85602001515b6bffffffffffffffffffffffff169050806139a75760009150506131f3565b6139b2848483613781565b9695505050505050565b60008315806139ca57508183145b156139d7575060006131f3565b818310613a10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90615427565b613a18614f6e565b613a228685613d16565b9050613a2c614f6e565b613a368785613d16565b9050611d4781600001518260200151846000015185602001518a613e34565b600080613a628888613ec0565b90506000613a708787613ec0565b9050811580613a7d575080155b15613a8e575060009150611d479050565b600081831315613aa757613aa28284613f12565b613ab1565b613ab18383613f12565b9050613ada613ad5613ac283613f31565b8863ffffffff168863ffffffff166145d3565b6145e2565b905081831315613af357613aee8282613f12565b613afd565b613afd8282614bcc565b9050613b09818c614bf8565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b37908263ffffffff61287716565b6000838152600b6020526040902055601754613858908263ffffffff61287716565b6000838152600f6020526040902054600c5480821415613b7a57505061118d565b613b82614f6e565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb9614f6e565b613bc282614c3a565b15613bfb57613bdb826000015183602001518888614c43565b60208301819052818352613bef9190614ca5565b60208301528152613c06565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120d1929190615376565b600082613c6e57506000610ea8565b82820282848281613c7b57fe5b0414610ea557610ea561098260018686613412565b600081613ca657613ca661098260038585613412565b6000828481613cb157fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120d1929190615386565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613d0657fe5b6040516024016128ae91906155e8565b613d1e614f6e565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d5681614c3a565b15613d6057610ea8565b6000613d7383600163ffffffff61215e16565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613dae82614c3a565b15613db95750610ea8565b6000848152600f602052604090205483811015613e16576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0983614c3a565b15613e165750610ea89050565b50506040805180820190915260008152600160208201529392505050565b600081613e4357506000613eb7565b83613e6357613e5c85613797848963ffffffff613c5f16565b9050613eb7565b6000613e88613e78868863ffffffff613c5f16565b6122a4898763ffffffff613c5f16565b90506000613e9c828663ffffffff613c9016565b9050613eb287613797868463ffffffff613c5f16565b925050505b95945050505050565b600080831215613ed857613ed8610982600185614cce565b6000821215613eef57613eef610982600184614cce565b610ea5613f0c846f80000000000000000000000000000000614d0f565b83614d62565b6000610ea5613f0c846f80000000000000000000000000000000614d0f565b60006f80000000000000000000000000000000821315613f5957613f59610982600184614de3565b60008213613f6f57613f6f610982600084614de3565b6f80000000000000000000000000000000821415613f8f57506000610bef565b640733048c5a8213613fc257507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f761647600000008513614021577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e90000000000000851361407f577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140e1577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec000000000000000008513614145577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a9577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de70000000000000000000851361420d577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be58280000000000000000008513614271577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142d5577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614339577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143af57fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143e057fe5b05840193506f800000000000000000000000000000008183028161440057fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161443157fe5b05840193506f800000000000000000000000000000008183028161445157fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161448257fe5b05840193506f80000000000000000000000000000000818302816144a257fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144d357fe5b05840193506f80000000000000000000000000000000818302816144f357fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161452457fe5b05840193506f800000000000000000000000000000008183028161454457fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161457557fe5b05840193506f800000000000000000000000000000008183028161459557fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145c657fe5b0584019350505050919050565b60006131f3613f0c8585614d0f565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561461457506000610bef565b8161463057506f80000000000000000000000000000000610bef565b600082131561464757614647610982600184614de3565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146b357fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146e057fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470c57fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161473857fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161476457fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478f57fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147ba57fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147e457fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480e57fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161483857fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161486157fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488a57fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148b257fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148da57fe5b05905080611ab802830192506f800000000000000000000000000000008282028161490157fe5b0590508061017c02830192506f800000000000000000000000000000008282028161492857fe5b05905080601402830192506f800000000000000000000000000000008282028161494e57fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149bd577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149ff577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a4157701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a83577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614ac55770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614b05576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b45576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b85576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bc5576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be98484614d0f565b81614bf057fe5b059392505050565b600080821215614c1057614c10610982600184614cce565b6000614c1c8484614d0f565b905060008113614c30576000915050610ea8565b607f1c9392505050565b60200151151590565b60008085614c55575082905081614c9c565b83614c64575084905083614c9c565b614c87614c77858763ffffffff613c5f16565b613896888663ffffffff613c5f16565b9150614c99858463ffffffff613c5f16565b90505b94509492505050565b600080614cc384846f80000000000000000000000000000000614e12565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cfd57fe5b836040516024016120d19291906155f6565b6000821580614d1c575081155b15614d2957506000610ea8565b5081810281838281614d3757fe5b05141580614d4e575082828281614d4a57fe5b0514155b15610ea857610ea861098260018585614e80565b600081614d7857614d7861098260028585614e80565b7f800000000000000000000000000000000000000000000000000000000000000083148015614dc65750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614dda57614dda61098260038585614e80565b818381614bf057fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cfd57fe5b60008082851180614e2257508284115b15614e7757600084861015614e375784614e39565b855b9050614e4b818563ffffffff613c9016565b9050614e5d868263ffffffff613c9016565b9250614e6f858263ffffffff613c9016565b915050613044565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614eaf57fe5b848460405160240161343193929190615609565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561118d5760008381526020902061118d918101908301614f88565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614fa25760008155600101614f8e565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ea857600080fd5b600060408284031215612393578081fd5b600060208284031215614fec578081fd5b610ea58383614fa6565b60008060006060848603121561500a578182fd5b83356150158161562e565b925060208401356150258161562e565b929592945050506040919091013590565b60008060408385031215615048578182fd5b6150528484614fa6565b946020939093013593505050565b60008060408385031215615072578182fd5b61507c8484614fa6565b9150602083013561508c8161565e565b809150509250929050565b6000602082840312156150a8578081fd5b8151610ea581615650565b6000602082840312156150c4578081fd5b5035919050565b600080604083850312156150dd578182fd5b82359150602083013561508c8161562e565b60008060408385031215615101578182fd5b50508035926020909101359150565b60008060408385031215615122578182fd5b82359150602083013563ffffffff8116811461508c578182fd5b60006020828403121561514d578081fd5b8135610ea58161565e565b600080600060a0848603121561516c578283fd5b6151768585614fca565b92506151858560408601614fca565b9150608084013590509250925092565b6000602082840312156151a6578081fd5b5051919050565b600080600080600060a086880312156151c4578283fd5b8535945060208601356151d68161566b565b93506040860135925060608601356151ed8161566b565b915060808601356151fd8161566b565b809150509295509295909350565b6000806040838503121561521d578182fd5b82356152288161566b565b9150602083013561508c81615650565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561532557835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152f1565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b60608101600485106153a257fe5b938152602081019290925260409091015290565b60408101600384106153c457fe5b9281526020015290565b604081016153db84615624565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b6060810161540d85615624565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e4c57fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e4c57600080fd5b8015158114610e4c57600080fd5b60028110610e4c57600080fd5b63ffffffff81168114610e4c57600080fdfea365627a7a72315820b96c941df92150e52c6cf039dc95cb04fae1d201f9237f932f24c27e58aece406c6578706572696d656e74616cf564736f6c63430005110040"
},
"deployedBytecode": {
"object": "0x6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fdb565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b604051610372919061533b565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fdb565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150ef565b610bf4565b60405161037293929190615528565b3480156103d657600080fd5b5061034e6103e53660046150b3565b610c20565b3480156103f657600080fd5b5061040a6104053660046150b3565b610dd5565b604051610372959493929190615559565b34801561042757600080fd5b50610430610e04565b6040516103729190615238565b34801561044957600080fd5b5061045d6104583660046150b3565b610e1c565b60405161037291906154e9565b34801561047657600080fd5b5061034e610485366004614fdb565b610e3b565b34801561049657600080fd5b5061045d6104a5366004615060565b610e4f565b3480156104b657600080fd5b506104ca6104c53660046150b3565b610eae565b6040516103729190615495565b3480156104e357600080fd5b506104306104f23660046150b3565b610ef9565b34801561050357600080fd5b506105176105123660046150b3565b610f2d565b60405161037291906154b6565b34801561053057600080fd5b50610365610f8f565b34801561054557600080fd5b5061034e610554366004615158565b610f95565b34801561056557600080fd5b50610579610574366004614fdb565b611192565b6040516103729190615330565b34801561059257600080fd5b5061034e6105a1366004615110565b6111a7565b3480156105b257600080fd5b506105bb611270565b60405161037295949392919061557c565b3480156105d857600080fd5b50610430611299565b3480156105ed57600080fd5b506103656112b1565b34801561060257600080fd5b5061036561061136600461520b565b6112b7565b34801561062257600080fd5b5061034e610631366004614fdb565b6113f0565b34801561064257600080fd5b506103656114a5565b34801561065757600080fd5b506106606114ab565b60405161037291906155c0565b34801561067957600080fd5b5061034e610688366004614fdb565b6114b7565b34801561069957600080fd5b50610430611579565b3480156106ae57600080fd5b5061034e6106bd366004615036565b611595565b3480156106ce57600080fd5b5061034e6106dd3660046151ad565b6115a7565b3480156106ee57600080fd5b50610365611621565b61034e610705366004614ff6565b611627565b34801561071657600080fd5b50610365611881565b34801561072b57600080fd5b5061034e61073a3660046150b3565b611887565b34801561074b57600080fd5b5061036561199c565b34801561076057600080fd5b506103656119a2565b34801561077557600080fd5b5061034e6107843660046150b3565b6119c0565b34801561079557600080fd5b5061034e6107a43660046150b3565b611a00565b3480156107b557600080fd5b506105796107c4366004614fdb565b611a0a565b3480156107d557600080fd5b506103656107e43660046150b3565b611a1f565b3480156107f557600080fd5b506103656108043660046150b3565b611aaa565b34801561081557600080fd5b5061081e611abc565b60405161037291906152d7565b34801561083757600080fd5b50610660611b2b565b34801561084c57600080fd5b5061034e611b37565b34801561086157600080fd5b5061045d61087036600461513c565b611b51565b34801561088157600080fd5b50610660611ca1565b34801561089657600080fd5b506103656108a53660046150cb565b611cb5565b3480156108b657600080fd5b50610430611d52565b3480156108cb57600080fd5b506103656108da366004614fdb565b611d6e565b3480156108eb57600080fd5b5061045d6108fa366004615036565b611d80565b34801561090b57600080fd5b5061034e61091a366004614fdb565b611dc1565b34801561092b57600080fd5b5061034e61093a3660046150b3565b611e64565b610947612091565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120b4565b612156565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a02908390615238565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215e16565b6000818152601660205260409020600101549091508015610a4d57610a4d610982838361217d565b610a5561219a565b610a5d61220c565b600084815260166020526040902055610a74614ec3565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af6949193929161553e565b60405180910390a2610b066122b0565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b4491600091615386565b60405180910390a25b6020015193505050505b90565b6000610b64611299565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c9190615238565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec9190810190615195565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ef2565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122f3565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612399565b905080841115610cbf57610cbf61098285836123af565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123cc565b610d15611299565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f9291906152b1565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc7919061533b565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b610e24614ef2565b6000828152600760205260409020610bec906122f3565b610e43612453565b610e4c8161249a565b50565b610e57614ef2565b610ea560056000846001811115610e6a57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122f3565b90505b92915050565b610eb6614f12565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f35614f33565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa1575061118d565b6000610fb0602086018661513c565b6001811115610fbb57fe5b148015610fdf57506000610fd2602085018561513c565b6001811115610fdd57fe5b145b15610fea575061118d565b6001610ff9602086018661513c565b600181111561100457fe5b141561101957611019846020013582846125cb565b6001611028602085018561513c565b600181111561103357fe5b14156110485761104883602001358284612664565b600060058161105a602088018861513c565b600181111561106557fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110af9088018861513c565b60018111156110ba57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506110fd8282866126fd565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d90889061114f908c61513c565b600181111561115a57fe5b61116760208c018c61513c565b600181111561117257fe5b604051611181939291906155a7565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b1816127f6565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111e984828561282f565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155d1565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b73ba7f8b5fb1b19c1211c5d49550fcd149177a5eaf90565b60115481565b60085460009033906112d090600163ffffffff61287716565b600881905591506112e582620f42408661282f565b6112ed614f33565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d190859085908990615344565b60405180910390a183156113e8576113e8836119c0565b505092915050565b6113f8612453565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166114315761143161098282612893565b60005b6002548110156114a1578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415611499576114948282612932565b6114a1565b600101611434565b5050565b600c5481565b60145463ffffffff1681565b6114bf612091565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16156114fb576114fb6109826000836120b4565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a02908390615238565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61159d612453565b6114a18282612932565b6115af612091565b6115bc8585858585612b81565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff1661164a5761164a61098233612c44565b61165381612c5f565b8061165d5761118d565b346117375761166a610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b81526004016116a693929190615280565b602060405180830381600087803b1580156116c057600080fd5b505af11580156116d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f89190810190615097565b611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e9061545e565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205480611768575061118d565b600061177382610e1c565b602001516bffffffffffffffffffffffff16905060135481101561179857505061118d565b600c54600083815260156020908152604080832084845282528083206016909252909120815480611847576000806117d08888612c80565b6002870182905560018701819055600386015491935091506117f8908263ffffffff61287716565b60038501556001808501546118129163ffffffff61287716565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b611857818863ffffffff61287716565b8355600282015461186e908863ffffffff61287716565b8260020181905550505050505050505050565b60085481565b33611890611299565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118ca9291906152b1565b600060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc6020526040902061194a9083612d0c565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051611990919061533b565b60405180910390a25050565b60175481565b60006119bb601154600d5461287790919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e4c8133612d76565b60016020526000908152604090205460ff1681565b6000611a29614f33565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8d85612f4e565b91509150611aa08360200151838361300b565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b2157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611af6575b5050505050905090565b60125463ffffffff1681565b611b3f612091565b611b4761304c565b611b4f61305f565b565b611b59614ef2565b60016000526004602052611b8c7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122f3565b90506000826001811115611b9c57fe5b1415610bef576000611bac611299565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf157600080fd5b505afa158015611c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c299190810190615195565b9050611c58611c5383602001516bffffffffffffffffffffffff168361215e90919063ffffffff16565b61308a565b6bffffffffffffffffffffffff90811660208401526040830151611c8891611c539184911663ffffffff61215e16565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cbf614f33565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d2386612f4e565b915091506000611d388460200151848461300b565b915050611d47878783856130ae565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d88614ef2565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea5906122f3565b611dc9612453565b73ffffffffffffffffffffffffffffffffffffffff8116611df457611def6109826131fb565b610e4c565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7a82600163ffffffff61215e16565b9050611e84614ec3565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ed957505050610e4c565b611ee1614f12565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f2f5750505050610e4c565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f628284613232565b9050600080611f76888486604001516132a7565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fad929190615386565b60405180910390a36000611fc7838363ffffffff61287716565b6080870151909150611fdf908263ffffffff61287716565b6080870181905260008881526016602090815260409091206004019190915586015161201290600163ffffffff61215e16565b602080880182815260008a8152601690925260409091206001019190915551611616576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291612070908263ffffffff61215e16565b60405161207e929190615386565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4f57611b4f610982336133f7565b606063b9588e4360e01b83836040516024016120d19291906153ce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b6000828211156121775761217761098260028585613412565b50900390565b606063614b800a60e01b83836040516024016120d1929190615386565b478015610e4c576121a9610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f057600080fd5b505af1158015612204573d6000803e3d6000fd5b505050505050565b60006119bb60175461221c610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122549190615238565b60206040518083038186803b15801561226c57600080fd5b505afa158015612280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a49190810190615195565b9063ffffffff61215e16565b4260006122bb6119a2565b9050818111156122d2576122d261098282846134b7565b600c546000906122e990600163ffffffff61287716565b600c555050600d55565b6122fb614ef2565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c5490918111156123935761236e816134d4565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b60008183106123a85781610ea5565b5090919050565b60606384c8b7c960e01b83836040516024016120d1929190615386565b6123d4614ef2565b6123dd836122f3565b9050612407611c538383604001516bffffffffffffffffffffffff1661215e90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243691611c5391168463ffffffff61215e16565b6bffffffffffffffffffffffff16602082015261118d83826134f4565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4f57600054611b4f9061098290339073ffffffffffffffffffffffffffffffffffffffff166135ae565b73ffffffffffffffffffffffffffffffffffffffff81166124c0576124c06109826135cb565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124fa576124fa61098282613602565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125d48361361d565b6125de8383612d76565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126189082613654565b60008381526007602052604090206126309082613654565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0582613654565b61266d8361361d565b6126778383612d76565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126b190826136ac565b60008381526007602052604090206126c990826136ac565b6001600052600460205261118d7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136ac565b61270783836136e7565b156127115761118d565b612719614ef2565b612722846122f3565b905061272c614ef2565b612735846122f3565b905081604001516bffffffffffffffffffffffff16831115612770576127706109828484604001516bffffffffffffffffffffffff166123af565b604082015161279790611c53906bffffffffffffffffffffffff168563ffffffff61215e16565b6bffffffffffffffffffffffff9081166040808501919091528201516127c891611c5391168563ffffffff61287716565b6bffffffffffffffffffffffff1660408201526127e585836134f4565b6127ef84826134f4565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a1576114a161098233846136ee565b620f424063ffffffff821611156128545761284f6109826000858461370b565b61118d565b8163ffffffff168163ffffffff16111561118d5761118d6109826001858461370b565b600082820183811015610ea557610ea561098260008686613412565b606063eb5108a260e01b826040516024016128ae9190615238565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff1661296b5761296b61098283612893565b6002548110612986576129866109828260028054905061372a565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129aa57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0c57612a0c610982600283815481106129e457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1684613747565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a8757fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612aba57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b399082614f4a565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c35908790879087908790879061557c565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128ae9190615238565b803414158015612c6e57503415155b15610e4c57610e4c6109828234613764565b6000828152600a602052604081205481908190612cb39073ffffffffffffffffffffffffffffffffffffffff1686611d80565b602001516bffffffffffffffffffffffff169050612cd7848263ffffffff61215e16565b601254909350612d0290612cf59063ffffffff16620f424086613781565b829063ffffffff61287716565b9150509250929050565b612d14614ef2565b612d1d836122f3565b9050612d47611c538383604001516bffffffffffffffffffffffff1661287790919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243691611c5391168463ffffffff61287716565b612d7f826137a3565b6000612d8e83836000806130ae565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dca906122f3565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f4557612eaf8382613817565b612eb7610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612ef19291906152b1565b602060405180830381600087803b158015612f0b57600080fd5b505af1158015612f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f439190810190615097565b505b61118d8361385f565b6000806000612f696001600c5461215e90919063ffffffff16565b9050612f73614f12565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ffb908290613232565b9350806040015192505050915091565b6000808261301b57839150613044565b61302f63ffffffff8616620f42408661386c565b9150613041848363ffffffff61215e16565b90505b935093915050565b6130546138a2565b42600d556001600c55565b6130676138b7565b620d2f00620dbba068056bc75e2d63100000600260036127ef8585858585612b81565b806bffffffffffffffffffffffff81168114610bef57610bef61098260028461391c565b600c546000906130bc614ef2565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811694840194909452740100000000000000000000000000000000000000009091049092169281019290925282141561315d576000925050506131f3565b61316981838787613939565b815190935060009061318c9067ffffffffffffffff16600163ffffffff61287716565b90506131ca6131bd8984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139bc565b859063ffffffff61287716565b93506131ed6131bd8984604001516bffffffffffffffffffffffff1684876139bc565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061324057610ea8565b8151835160408401516020860151606086015160145461327695949392919063ffffffff80821691640100000000900416613a55565b608083015183519192506000916132929163ffffffff61215e16565b9050818110156132a0578091505b5092915050565b6000806132b2614f33565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff1690820181905261331690868661300b565b909350915082156133d357613329610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb9161337f9187906004016152b1565b602060405180830381600087803b15801561339957600080fd5b505af11580156133ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133d19190810190615097565b505b81156133ee576133e38683613b18565b6133ee868386613b59565b50935093915050565b606063b65a25b960e01b826040516024016128ae9190615238565b606063e946c1bb60e01b84848460405160240161343193929190615394565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120d1929190615386565b8067ffffffffffffffff81168114610bef57610bef61098260018461391c565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120d1929190615259565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128ae9190615238565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e4c57610e4c610982826000613c42565b61365c614ef2565b613665836122f3565b905061368f611c538383604001516bffffffffffffffffffffffff1661215e90919063ffffffff16565b6bffffffffffffffffffffffff16604082015261118d83826134f4565b6136b4614ef2565b6136bd836122f3565b905061368f611c538383604001516bffffffffffffffffffffffff1661287790919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120d19291906152b1565b60606322df959760e01b84848460405160240161343193929190615400565b606063e9f8377160e01b83836040516024016120d1929190615386565b606063140a84db60e01b83836040516024016120d1929190615259565b60606331d7a50560e01b83836040516024016120d1929190615386565b60006131f383613797868563ffffffff613c5f16565b9063ffffffff613c9016565b600c546000906137ba90600163ffffffff61215e16565b90506137c4614f12565b50600082815260156020908152604080832084845282529182902082516060810184528154808252600183015493820193909352600290910154928101929092521561118d5761118d6109828484613cba565b6000828152600b6020526040902054613836908263ffffffff61215e16565b6000838152600b6020526040902055601754613858908263ffffffff61215e16565b6017555050565b610e4c8160006001613b59565b60006131f38361379761388682600163ffffffff61215e16565b613896888763ffffffff613c5f16565b9063ffffffff61287716565b600d5415611b4f57611b4f6109826000613cd7565b601154158015906138cf575060125463ffffffff1615155b80156138dc575060135415155b80156138ef575060145463ffffffff1615155b801561390a5750601454640100000000900463ffffffff1615155b15611b4f57611b4f6109826001613cd7565b606063c996af7b60e01b83836040516024016120d19291906153b6565b6000821580613946575081155b15613953575060006131f3565b600061396685600163ffffffff61215e16565b865167ffffffffffffffff161015613982578560400151613988565b85602001515b6bffffffffffffffffffffffff169050806139a75760009150506131f3565b6139b2848483613781565b9695505050505050565b60008315806139ca57508183145b156139d7575060006131f3565b818310613a10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90615427565b613a18614f6e565b613a228685613d16565b9050613a2c614f6e565b613a368785613d16565b9050611d4781600001518260200151846000015185602001518a613e34565b600080613a628888613ec0565b90506000613a708787613ec0565b9050811580613a7d575080155b15613a8e575060009150611d479050565b600081831315613aa757613aa28284613f12565b613ab1565b613ab18383613f12565b9050613ada613ad5613ac283613f31565b8863ffffffff168863ffffffff166145d3565b6145e2565b905081831315613af357613aee8282613f12565b613afd565b613afd8282614bcc565b9050613b09818c614bf8565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b37908263ffffffff61287716565b6000838152600b6020526040902055601754613858908263ffffffff61287716565b6000838152600f6020526040902054600c5480821415613b7a57505061118d565b613b82614f6e565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb9614f6e565b613bc282614c3a565b15613bfb57613bdb826000015183602001518888614c43565b60208301819052818352613bef9190614ca5565b60208301528152613c06565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120d1929190615376565b600082613c6e57506000610ea8565b82820282848281613c7b57fe5b0414610ea557610ea561098260018686613412565b600081613ca657613ca661098260038585613412565b6000828481613cb157fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120d1929190615386565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613d0657fe5b6040516024016128ae91906155e8565b613d1e614f6e565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d5681614c3a565b15613d6057610ea8565b6000613d7383600163ffffffff61215e16565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613dae82614c3a565b15613db95750610ea8565b6000848152600f602052604090205483811015613e16576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0983614c3a565b15613e165750610ea89050565b50506040805180820190915260008152600160208201529392505050565b600081613e4357506000613eb7565b83613e6357613e5c85613797848963ffffffff613c5f16565b9050613eb7565b6000613e88613e78868863ffffffff613c5f16565b6122a4898763ffffffff613c5f16565b90506000613e9c828663ffffffff613c9016565b9050613eb287613797868463ffffffff613c5f16565b925050505b95945050505050565b600080831215613ed857613ed8610982600185614cce565b6000821215613eef57613eef610982600184614cce565b610ea5613f0c846f80000000000000000000000000000000614d0f565b83614d62565b6000610ea5613f0c846f80000000000000000000000000000000614d0f565b60006f80000000000000000000000000000000821315613f5957613f59610982600184614de3565b60008213613f6f57613f6f610982600084614de3565b6f80000000000000000000000000000000821415613f8f57506000610bef565b640733048c5a8213613fc257507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f761647600000008513614021577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e90000000000000851361407f577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140e1577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec000000000000000008513614145577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a9577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de70000000000000000000851361420d577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be58280000000000000000008513614271577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142d5577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614339577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143af57fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143e057fe5b05840193506f800000000000000000000000000000008183028161440057fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161443157fe5b05840193506f800000000000000000000000000000008183028161445157fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161448257fe5b05840193506f80000000000000000000000000000000818302816144a257fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144d357fe5b05840193506f80000000000000000000000000000000818302816144f357fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161452457fe5b05840193506f800000000000000000000000000000008183028161454457fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161457557fe5b05840193506f800000000000000000000000000000008183028161459557fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145c657fe5b0584019350505050919050565b60006131f3613f0c8585614d0f565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561461457506000610bef565b8161463057506f80000000000000000000000000000000610bef565b600082131561464757614647610982600184614de3565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146b357fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146e057fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470c57fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161473857fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161476457fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478f57fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147ba57fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147e457fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480e57fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161483857fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161486157fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488a57fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148b257fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148da57fe5b05905080611ab802830192506f800000000000000000000000000000008282028161490157fe5b0590508061017c02830192506f800000000000000000000000000000008282028161492857fe5b05905080601402830192506f800000000000000000000000000000008282028161494e57fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149bd577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149ff577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a4157701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a83577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614ac55770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614b05576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b45576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b85576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bc5576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be98484614d0f565b81614bf057fe5b059392505050565b600080821215614c1057614c10610982600184614cce565b6000614c1c8484614d0f565b905060008113614c30576000915050610ea8565b607f1c9392505050565b60200151151590565b60008085614c55575082905081614c9c565b83614c64575084905083614c9c565b614c87614c77858763ffffffff613c5f16565b613896888663ffffffff613c5f16565b9150614c99858463ffffffff613c5f16565b90505b94509492505050565b600080614cc384846f80000000000000000000000000000000614e12565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cfd57fe5b836040516024016120d19291906155f6565b6000821580614d1c575081155b15614d2957506000610ea8565b5081810281838281614d3757fe5b05141580614d4e575082828281614d4a57fe5b0514155b15610ea857610ea861098260018585614e80565b600081614d7857614d7861098260028585614e80565b7f800000000000000000000000000000000000000000000000000000000000000083148015614dc65750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614dda57614dda61098260038585614e80565b818381614bf057fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cfd57fe5b60008082851180614e2257508284115b15614e7757600084861015614e375784614e39565b855b9050614e4b818563ffffffff613c9016565b9050614e5d868263ffffffff613c9016565b9250614e6f858263ffffffff613c9016565b915050613044565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614eaf57fe5b848460405160240161343193929190615609565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561118d5760008381526020902061118d918101908301614f88565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614fa25760008155600101614f8e565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ea857600080fd5b600060408284031215612393578081fd5b600060208284031215614fec578081fd5b610ea58383614fa6565b60008060006060848603121561500a578182fd5b83356150158161562e565b925060208401356150258161562e565b929592945050506040919091013590565b60008060408385031215615048578182fd5b6150528484614fa6565b946020939093013593505050565b60008060408385031215615072578182fd5b61507c8484614fa6565b9150602083013561508c8161565e565b809150509250929050565b6000602082840312156150a8578081fd5b8151610ea581615650565b6000602082840312156150c4578081fd5b5035919050565b600080604083850312156150dd578182fd5b82359150602083013561508c8161562e565b60008060408385031215615101578182fd5b50508035926020909101359150565b60008060408385031215615122578182fd5b82359150602083013563ffffffff8116811461508c578182fd5b60006020828403121561514d578081fd5b8135610ea58161565e565b600080600060a0848603121561516c578283fd5b6151768585614fca565b92506151858560408601614fca565b9150608084013590509250925092565b6000602082840312156151a6578081fd5b5051919050565b600080600080600060a086880312156151c4578283fd5b8535945060208601356151d68161566b565b93506040860135925060608601356151ed8161566b565b915060808601356151fd8161566b565b809150509295509295909350565b6000806040838503121561521d578182fd5b82356152288161566b565b9150602083013561508c81615650565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561532557835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152f1565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b60608101600485106153a257fe5b938152602081019290925260409091015290565b60408101600384106153c457fe5b9281526020015290565b604081016153db84615624565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b6060810161540d85615624565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e4c57fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e4c57600080fd5b8015158114610e4c57600080fd5b60028110610e4c57600080fd5b63ffffffff81168114610e4c57600080fdfea365627a7a72315820b96c941df92150e52c6cf039dc95cb04fae1d201f9237f932f24c27e58aece406c6578706572696d656e74616cf564736f6c63430005110040"
}
}
},
"compiler": {
"name": "solc",
"version": "0.5.17+commit.d19bba13",
"settings": {
"optimizer": {
"enabled": true,
"runs": 1000000,
"details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true }
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap"
]
}
},
"evmVersion": "istanbul"
}
},
"chains": {}
}