1912 lines
539 KiB
JSON
Generated

{
"schemaVersion": "2.0.0",
"contractName": "Staking",
"compilerOutput": {
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "wethAddress_",
"type": "address"
},
{
"internalType": "address",
"name": "zrxVaultAddress_",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"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": "Returns the current weth contract address",
"return": "wethContract The WETH contract instance."
},
"getZrxVault()": {
"details": "Returns the current zrxVault address.",
"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": "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": "of ZRX to stake."
}
},
"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": "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": {
"linkReferences": {},
"object": "0x60806040523480156200001157600080fd5b506040516200577538038062005775833981016040819052620000349162000071565b600080546001600160a01b03199081163317909155601880546001600160a01b0394851690831617905560198054929093169116179055620000c8565b6000806040838503121562000084578182fd5b82516200009181620000af565b6020840151909250620000a481620000af565b809150509250929050565b6001600160a01b0381168114620000c557600080fd5b50565b61569d80620000d86000396000f3fe6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fb8565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b6040516103729190615318565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fb8565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150cc565b610bf4565b60405161037293929190615505565b3480156103d657600080fd5b5061034e6103e5366004615090565b610c20565b3480156103f657600080fd5b5061040a610405366004615090565b610dd5565b604051610372959493929190615536565b34801561042757600080fd5b50610430610e04565b6040516103729190615215565b34801561044957600080fd5b5061045d610458366004615090565b610e20565b60405161037291906154c6565b34801561047657600080fd5b5061034e610485366004614fb8565b610e3f565b34801561049657600080fd5b5061045d6104a536600461503d565b610e53565b3480156104b657600080fd5b506104ca6104c5366004615090565b610eb2565b6040516103729190615472565b3480156104e357600080fd5b506104306104f2366004615090565b610efd565b34801561050357600080fd5b50610517610512366004615090565b610f31565b6040516103729190615493565b34801561053057600080fd5b50610365610f93565b34801561054557600080fd5b5061034e610554366004615135565b610f99565b34801561056557600080fd5b50610579610574366004614fb8565b611196565b604051610372919061530d565b34801561059257600080fd5b5061034e6105a13660046150ed565b6111ab565b3480156105b257600080fd5b506105bb611274565b604051610372959493929190615559565b3480156105d857600080fd5b5061043061129d565b3480156105ed57600080fd5b506103656112b9565b34801561060257600080fd5b506103656106113660046151e8565b6112bf565b34801561062257600080fd5b5061034e610631366004614fb8565b6113f8565b34801561064257600080fd5b506103656114ad565b34801561065757600080fd5b506106606114b3565b604051610372919061559d565b34801561067957600080fd5b5061034e610688366004614fb8565b6114bf565b34801561069957600080fd5b50610430611581565b3480156106ae57600080fd5b5061034e6106bd366004615013565b61159d565b3480156106ce57600080fd5b5061034e6106dd36600461518a565b6115af565b3480156106ee57600080fd5b50610365611629565b61034e610705366004614fd3565b61162f565b34801561071657600080fd5b5061036561187f565b34801561072b57600080fd5b5061034e61073a366004615090565b611885565b34801561074b57600080fd5b5061036561199a565b34801561076057600080fd5b506103656119a0565b34801561077557600080fd5b5061034e610784366004615090565b6119be565b34801561079557600080fd5b5061034e6107a4366004615090565b6119fe565b3480156107b557600080fd5b506105796107c4366004614fb8565b611a08565b3480156107d557600080fd5b506103656107e4366004615090565b611a1d565b3480156107f557600080fd5b50610365610804366004615090565b611aa8565b34801561081557600080fd5b5061081e611aba565b60405161037291906152b4565b34801561083757600080fd5b50610660611b29565b34801561084c57600080fd5b5061034e611b35565b34801561086157600080fd5b5061045d610870366004615119565b611b4f565b34801561088157600080fd5b50610660611c9f565b34801561089657600080fd5b506103656108a53660046150a8565b611cb3565b3480156108b657600080fd5b50610430611d50565b3480156108cb57600080fd5b506103656108da366004614fb8565b611d6c565b3480156108eb57600080fd5b5061045d6108fa366004615013565b611d7e565b34801561090b57600080fd5b5061034e61091a366004614fb8565b611dbf565b34801561092b57600080fd5b5061034e61093a366004615090565b611e62565b61094761208f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120b2565b612154565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a02908390615215565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215c16565b6000818152601660205260409020600101549091508015610a4d57610a4d610982838361217b565b610a55612198565b610a5d61220b565b600084815260166020526040902055610a74614ea0565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af6949193929161551b565b60405180910390a2610b066122af565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b4491600091615363565b60405180910390a25b6020015193505050505b90565b6000610b6461129d565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c9190615215565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec9190810190615172565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ecf565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122f2565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612398565b905080841115610cbf57610cbf61098285836123ae565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123cb565b610d1561129d565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f92919061528e565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc79190615318565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b60185473ffffffffffffffffffffffffffffffffffffffff1690565b610e28614ecf565b6000828152600760205260409020610bec906122f2565b610e47612452565b610e5081612499565b50565b610e5b614ecf565b610ea960056000846001811115610e6e57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122f2565b90505b92915050565b610eba614eef565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f39614f10565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa55750611191565b6000610fb46020860186615119565b6001811115610fbf57fe5b148015610fe357506000610fd66020850185615119565b6001811115610fe157fe5b145b15610fee5750611191565b6001610ffd6020860186615119565b600181111561100857fe5b141561101d5761101d846020013582846125ca565b600161102c6020850185615119565b600181111561103757fe5b141561104c5761104c83602001358284612663565b600060058161105e6020880188615119565b600181111561106957fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110b390880188615119565b60018111156110be57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506111018282866126fc565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d908890611153908c615119565b600181111561115e57fe5b61116b60208c018c615119565b600181111561117657fe5b60405161118593929190615584565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b5816127f5565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111ed84828561282e565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155ae565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b60195473ffffffffffffffffffffffffffffffffffffffff1690565b60115481565b60085460009033906112d890600163ffffffff61287516565b600881905591506112ed82620f42408661282e565b6112f5614f10565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d990859085908990615321565b60405180910390a183156113f0576113f0836119be565b505092915050565b611400612452565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166114395761143961098282612891565b60005b6002548110156114a9578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156114a15761149c8282612930565b6114a9565b60010161143c565b5050565b600c5481565b60145463ffffffff1681565b6114c761208f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff1615611503576115036109826000836120b2565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a02908390615215565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6115a5612452565b6114a98282612930565b6115b761208f565b6115c48585858585612b7f565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff166116525761165261098233612c42565b61165b81612c5d565b3461173557611668610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b81526004016116a49392919061525d565b602060405180830381600087803b1580156116be57600080fd5b505af11580156116d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f69190810190615074565b611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061543b565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054806117665750611191565b600061177182610e20565b602001516bffffffffffffffffffffffff169050601354811015611796575050611191565b600c54600083815260156020908152604080832084845282528083206016909252909120815480611845576000806117ce8888612c7e565b6002870182905560018701819055600386015491935091506117f6908263ffffffff61287516565b60038501556001808501546118109163ffffffff61287516565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b611855818863ffffffff61287516565b8355600282015461186c908863ffffffff61287516565b8260020181905550505050505050505050565b60085481565b3361188e61129d565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118c892919061528e565b600060405180830381600087803b1580156118e257600080fd5b505af11580156118f6573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090206119489083612d0a565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a8360405161198e9190615318565b60405180910390a25050565b60175481565b60006119b9601154600d5461287590919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e508133612d74565b60016020526000908152604090205460ff1681565b6000611a27614f10565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8b85612f4c565b91509150611a9e83602001518383613009565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b1f57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611af4575b5050505050905090565b60125463ffffffff1681565b611b3d61208f565b611b4561304a565b611b4d61305d565b565b611b57614ecf565b60016000526004602052611b8a7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122f2565b90506000826001811115611b9a57fe5b1415610bef576000611baa61129d565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c279190810190615172565b9050611c56611c5183602001516bffffffffffffffffffffffff168361215c90919063ffffffff16565b613088565b6bffffffffffffffffffffffff90811660208401526040830151611c8691611c519184911663ffffffff61215c16565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cbd614f10565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d2186612f4c565b915091506000611d3684602001518484613009565b915050611d45878783856130ac565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d86614ecf565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea9906122f2565b611dc7612452565b73ffffffffffffffffffffffffffffffffffffffff8116611df257611ded6109826131f9565b610e50565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7882600163ffffffff61215c16565b9050611e82614ea0565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ed757505050610e50565b611edf614eef565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f2d5750505050610e50565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f608284613230565b9050600080611f74888486604001516132a5565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fab929190615363565b60405180910390a36000611fc5838363ffffffff61287516565b6080870151909150611fdd908263ffffffff61287516565b6080870181905260008881526016602090815260409091206004019190915586015161201090600163ffffffff61215c16565b602080880182815260008a815260169092526040909120600101919091555161161e576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b29161206e908263ffffffff61215c16565b60405161207c929190615363565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4d57611b4d610982336133f5565b606063b9588e4360e01b83836040516024016120cf9291906153ab565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b6000828211156121755761217561098260028585613410565b50900390565b606063614b800a60e01b83836040516024016120cf929190615363565b30318015610e50576121a8610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121ef57600080fd5b505af1158015612203573d6000803e3d6000fd5b505050505050565b60006119b960175461221b610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122539190615215565b60206040518083038186803b15801561226b57600080fd5b505afa15801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a39190810190615172565b9063ffffffff61215c16565b4260006122ba6119a0565b9050818111156122d1576122d161098282846134b5565b600c546000906122e890600163ffffffff61287516565b600c555050600d55565b6122fa614ecf565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c5490918111156123925761236d816134d2565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b60008183106123a75781610ea9565b5090919050565b60606384c8b7c960e01b83836040516024016120cf929190615363565b6123d3614ecf565b6123dc836122f2565b9050612406611c518383604001516bffffffffffffffffffffffff1661215c90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243591611c5191168463ffffffff61215c16565b6bffffffffffffffffffffffff16602082015261119183826134f2565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4d57600054611b4d9061098290339073ffffffffffffffffffffffffffffffffffffffff166135ac565b73ffffffffffffffffffffffffffffffffffffffff81166124bf576124bf6109826135c9565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124f9576124f961098282613600565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125d38361361b565b6125dd8383612d74565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126179082613652565b600083815260076020526040902061262f9082613652565b600160005260046020526111917fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0582613652565b61266c8361361b565b6126768383612d74565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126b090826136aa565b60008381526007602052604090206126c890826136aa565b600160005260046020526111917fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136aa565b61270683836136e5565b1561271057611191565b612718614ecf565b612721846122f2565b905061272b614ecf565b612734846122f2565b905081604001516bffffffffffffffffffffffff1683111561276f5761276f6109828484604001516bffffffffffffffffffffffff166123ae565b604082015161279690611c51906bffffffffffffffffffffffff168563ffffffff61215c16565b6bffffffffffffffffffffffff9081166040808501919091528201516127c791611c5191168563ffffffff61287516565b6bffffffffffffffffffffffff1660408201526127e485836134f2565b6127ee84826134f2565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a9576114a961098233846136ec565b620f424063ffffffff821611156128535761284e61098260008584613709565b611191565b8163ffffffff168163ffffffff16106111915761119161098260018584613709565b600082820183811015610ea957610ea961098260008686613410565b606063eb5108a260e01b826040516024016128ac9190615215565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166129695761296961098283612891565b60025481106129845761298461098282600280549050613728565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129a857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0a57612a0a610982600283815481106129e257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1684613745565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a8557fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612ab857fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b379082614f27565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c339087908790879087908790615559565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128ac9190615215565b803414158015612c6c57503415155b15610e5057610e506109828234613762565b6000828152600a602052604081205481908190612cb19073ffffffffffffffffffffffffffffffffffffffff1686611d7e565b602001516bffffffffffffffffffffffff169050612cd5848263ffffffff61215c16565b601254909350612d0090612cf39063ffffffff16620f42408661377f565b829063ffffffff61287516565b9150509250929050565b612d12614ecf565b612d1b836122f2565b9050612d45611c518383604001516bffffffffffffffffffffffff1661287590919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243591611c5191168463ffffffff61287516565b612d7d826137a1565b6000612d8c83836000806130ac565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dc8906122f2565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f4357612ead8382613815565b612eb5610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612eef92919061528e565b602060405180830381600087803b158015612f0957600080fd5b505af1158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f419190810190615074565b505b6111918361385d565b6000806000612f676001600c5461215c90919063ffffffff16565b9050612f71614eef565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ff9908290613230565b9350806040015192505050915091565b6000808261301957839150613042565b61302d63ffffffff8616620f42408661386a565b915061303f848363ffffffff61215c16565b90505b935093915050565b6130526138a0565b42600d556001600c55565b6130656138b5565b620d2f00620dbba068056bc75e2d63100000600260036127ee8585858585612b7f565b806bffffffffffffffffffffffff81168114610bef57610bef61098260028461391a565b600c546000906130ba614ecf565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811694840194909452740100000000000000000000000000000000000000009091049092169281019290925282141561315b576000925050506131f1565b61316781838787613937565b815190935060009061318a9067ffffffffffffffff16600163ffffffff61287516565b90506131c86131bb8984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139ba565b859063ffffffff61287516565b93506131eb6131bb8984604001516bffffffffffffffffffffffff1684876139ba565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061323e57610eac565b8151835160408401516020860151606086015160145461327495949392919063ffffffff80821691640100000000900416613a53565b608083015183519192506000916132909163ffffffff61215c16565b90508181101561329e578091505b5092915050565b6000806132b0614f10565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff16908201819052613314908686613009565b909350915082156133d157613327610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb9161337d91879060040161528e565b602060405180830381600087803b15801561339757600080fd5b505af11580156133ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133cf9190810190615074565b505b81156133ec576133e18683613b16565b6133ec868386613b57565b50935093915050565b606063b65a25b960e01b826040516024016128ac9190615215565b606063e946c1bb60e01b84848460405160240161342f93929190615371565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120cf929190615363565b8067ffffffffffffffff81168114610bef57610bef61098260018461391a565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120cf929190615236565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128ac9190615215565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e5057610e50610982826000613c40565b61365a614ecf565b613663836122f2565b905061368d611c518383604001516bffffffffffffffffffffffff1661215c90919063ffffffff16565b6bffffffffffffffffffffffff16604082015261119183826134f2565b6136b2614ecf565b6136bb836122f2565b905061368d611c518383604001516bffffffffffffffffffffffff1661287590919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120cf92919061528e565b60606322df959760e01b84848460405160240161342f939291906153dd565b606063e9f8377160e01b83836040516024016120cf929190615363565b606063140a84db60e01b83836040516024016120cf929190615236565b60606331d7a50560e01b83836040516024016120cf929190615363565b60006131f183613795868563ffffffff613c5d16565b9063ffffffff613c8e16565b600c546000906137b890600163ffffffff61215c16565b90506137c2614eef565b506000828152601560209081526040808320848452825291829020825160608101845281548082526001830154938201939093526002909101549281019290925215611191576111916109828484613cb8565b6000828152600b6020526040902054613834908263ffffffff61215c16565b6000838152600b6020526040902055601754613856908263ffffffff61215c16565b6017555050565b610e508160006001613b57565b60006131f18361379561388482600163ffffffff61215c16565b613894888763ffffffff613c5d16565b9063ffffffff61287516565b600d5415611b4d57611b4d6109826000613cd5565b601154158015906138cd575060125463ffffffff1615155b80156138da575060135415155b80156138ed575060145463ffffffff1615155b80156139085750601454640100000000900463ffffffff1615155b15611b4d57611b4d6109826001613cd5565b606063c996af7b60e01b83836040516024016120cf929190615393565b6000821580613944575081155b15613951575060006131f1565b600061396485600163ffffffff61215c16565b865167ffffffffffffffff161015613980578560400151613986565b85602001515b6bffffffffffffffffffffffff169050806139a55760009150506131f1565b6139b084848361377f565b9695505050505050565b60008315806139c857508183145b156139d5575060006131f1565b818310613a0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c90615404565b613a16614f4b565b613a208685613d14565b9050613a2a614f4b565b613a348785613d14565b9050611d4581600001518260200151846000015185602001518a613e32565b600080613a608888613ebe565b90506000613a6e8787613ebe565b9050811580613a7b575080155b15613a8c575060009150611d459050565b600081831315613aa557613aa08284613f10565b613aaf565b613aaf8383613f10565b9050613ad8613ad3613ac083613f2f565b8863ffffffff168863ffffffff166145d1565b6145e0565b905081831315613af157613aec8282613f10565b613afb565b613afb8282614bca565b9050613b07818c614bf6565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b35908263ffffffff61287516565b6000838152600b6020526040902055601754613856908263ffffffff61287516565b6000838152600f6020526040902054600c5480821415613b78575050611191565b613b80614f4b565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb7614f4b565b613bc082614c38565b15613bf957613bd9826000015183602001518888614c41565b60208301819052818352613bed9190614ca3565b60208301528152613c04565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120cf929190615353565b600082613c6c57506000610eac565b82820282848281613c7957fe5b0414610ea957610ea961098260018686613410565b600081613ca457613ca461098260038585613410565b6000828481613caf57fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120cf929190615363565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613d0457fe5b6040516024016128ac91906155c5565b613d1c614f4b565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d5481614c38565b15613d5e57610eac565b6000613d7183600163ffffffff61215c16565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613dac82614c38565b15613db75750610eac565b6000848152600f602052604090205483811015613e14576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0783614c38565b15613e145750610eac9050565b50506040805180820190915260008152600160208201529392505050565b600081613e4157506000613eb5565b83613e6157613e5a85613795848963ffffffff613c5d16565b9050613eb5565b6000613e86613e76868863ffffffff613c5d16565b6122a3898763ffffffff613c5d16565b90506000613e9a828663ffffffff613c8e16565b9050613eb087613795868463ffffffff613c5d16565b925050505b95945050505050565b600080831215613ed657613ed6610982600185614ccc565b6000821215613eed57613eed610982600184614ccc565b610ea9613f0a846f80000000000000000000000000000000614d0d565b83614d3f565b6000610ea9613f0a846f80000000000000000000000000000000614d0d565b60006f80000000000000000000000000000000821315613f5757613f57610982600184614dc0565b60008213613f6d57613f6d610982600084614dc0565b6f80000000000000000000000000000000821415613f8d57506000610bef565b640733048c5a8213613fc057507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f76164760000000851361401f577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e90000000000000851361407d577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140df577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec000000000000000008513614143577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a7577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de70000000000000000000851361420b577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be5828000000000000000000851361426f577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142d3577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614337577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143ad57fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143de57fe5b05840193506f80000000000000000000000000000000818302816143fe57fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161442f57fe5b05840193506f800000000000000000000000000000008183028161444f57fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161448057fe5b05840193506f80000000000000000000000000000000818302816144a057fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144d157fe5b05840193506f80000000000000000000000000000000818302816144f157fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161452257fe5b05840193506f800000000000000000000000000000008183028161454257fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161457357fe5b05840193506f800000000000000000000000000000008183028161459357fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145c457fe5b0584019350505050919050565b60006131f1613f0a8585614d0d565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561461257506000610bef565b8161462e57506f80000000000000000000000000000000610bef565b600082131561464557614645610982600184614dc0565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146b157fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146de57fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470a57fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161473657fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161476257fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478d57fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147b857fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147e257fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480c57fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161483657fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161485f57fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488857fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148b057fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148d857fe5b05905080611ab802830192506f80000000000000000000000000000000828202816148ff57fe5b0590508061017c02830192506f800000000000000000000000000000008282028161492657fe5b05905080601402830192506f800000000000000000000000000000008282028161494c57fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149bb577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149fd577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a3f57701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a81577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614ac35770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614b03576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b43576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b83576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bc3576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be78484614d0d565b81614bee57fe5b059392505050565b600080821215614c0e57614c0e610982600184614ccc565b6000614c1a8484614d0d565b905060008113614c2e576000915050610eac565b607f1c9392505050565b60200151151590565b60008085614c53575082905081614c9a565b83614c62575084905083614c9a565b614c85614c75858763ffffffff613c5d16565b613894888663ffffffff613c5d16565b9150614c97858463ffffffff613c5d16565b90505b94509492505050565b600080614cc184846f80000000000000000000000000000000614def565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cfb57fe5b836040516024016120cf9291906155d3565b600082614d1c57506000610eac565b5081810281838281614d2a57fe5b0514610eac57610eac61098260018585614e5d565b600081614d5557614d5561098260028585614e5d565b7f800000000000000000000000000000000000000000000000000000000000000083148015614da35750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614db757614db761098260038585614e5d565b818381614bee57fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cfb57fe5b60008082851180614dff57508284115b15614e5457600084861015614e145784614e16565b855b9050614e28818563ffffffff613c8e16565b9050614e3a868263ffffffff613c8e16565b9250614e4c858263ffffffff613c8e16565b915050613042565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614e8c57fe5b848460405160240161342f939291906155e6565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561119157600083815260209020611191918101908301614f65565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614f7f5760008155600101614f6b565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610eac57600080fd5b600060408284031215612392578081fd5b600060208284031215614fc9578081fd5b610ea98383614f83565b600080600060608486031215614fe7578182fd5b8335614ff28161560b565b925060208401356150028161560b565b929592945050506040919091013590565b60008060408385031215615025578182fd5b61502f8484614f83565b946020939093013593505050565b6000806040838503121561504f578182fd5b6150598484614f83565b915060208301356150698161563b565b809150509250929050565b600060208284031215615085578081fd5b8151610ea98161562d565b6000602082840312156150a1578081fd5b5035919050565b600080604083850312156150ba578182fd5b8235915060208301356150698161560b565b600080604083850312156150de578182fd5b50508035926020909101359150565b600080604083850312156150ff578182fd5b82359150602083013563ffffffff81168114615069578182fd5b60006020828403121561512a578081fd5b8135610ea98161563b565b600080600060a08486031215615149578283fd5b6151538585614fa7565b92506151628560408601614fa7565b9150608084013590509250925092565b600060208284031215615183578081fd5b5051919050565b600080600080600060a086880312156151a1578283fd5b8535945060208601356151b381615648565b93506040860135925060608601356151ca81615648565b915060808601356151da81615648565b809150509295509295909350565b600080604083850312156151fa578182fd5b823561520581615648565b915060208301356150698161562d565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561530257835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152ce565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b606081016004851061537f57fe5b938152602081019290925260409091015290565b60408101600384106153a157fe5b9281526020015290565b604081016153b884615601565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b606081016153ea85615601565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e5057fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e5057600080fd5b8015158114610e5057600080fd5b60028110610e5057600080fd5b63ffffffff81168114610e5057600080fdfea365627a7a72315820405f679c9973463d3088bfe457347d17202e3319adf7067235fc4905ae0f29646c6578706572696d656e74616cf564736f6c634300050c0040",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x5775 CODESIZE SUB DUP1 PUSH3 0x5775 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x71 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 DUP2 AND CALLER OR SWAP1 SWAP2 SSTORE PUSH1 0x18 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x19 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 AND OR SWAP1 SSTORE PUSH3 0xC8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x84 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH3 0x91 DUP2 PUSH3 0xAF JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0xA4 DUP2 PUSH3 0xAF JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x569D DUP1 PUSH3 0xD8 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x329 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x1A5 JUMPI DUP1 PUSH4 0xBB7EF7E0 GT PUSH2 0xEC JUMPI DUP1 PUSH4 0xE8EEB3F8 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF1876532 GT PUSH2 0x6F JUMPI DUP1 PUSH4 0xF1876532 EQ PUSH2 0x8BF JUMPI DUP1 PUSH4 0xF252B7A1 EQ PUSH2 0x8DF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x8FF JUMPI DUP1 PUSH4 0xFF691B11 EQ PUSH2 0x91F JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xE8EEB3F8 EQ PUSH2 0x875 JUMPI DUP1 PUSH4 0xE907F003 EQ PUSH2 0x88A JUMPI DUP1 PUSH4 0xEE99205C EQ PUSH2 0x8AA JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xE0EE036E GT PUSH2 0xC6 JUMPI DUP1 PUSH4 0xE0EE036E EQ PUSH2 0x82B JUMPI DUP1 PUSH4 0xE1C7392A EQ PUSH2 0x840 JUMPI DUP1 PUSH4 0xE804D0A4 EQ PUSH2 0x855 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xBB7EF7E0 EQ PUSH2 0x7C9 JUMPI DUP1 PUSH4 0xC18C9141 EQ PUSH2 0x7E9 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x809 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xA694FC3A GT PUSH2 0x14E JUMPI DUP1 PUSH4 0xB3E33379 GT PUSH2 0x128 JUMPI DUP1 PUSH4 0xB3E33379 EQ PUSH2 0x769 JUMPI DUP1 PUSH4 0xB510879F EQ PUSH2 0x789 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x7A9 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xA694FC3A EQ PUSH2 0x71F JUMPI DUP1 PUSH4 0xB0531524 EQ PUSH2 0x73F JUMPI DUP1 PUSH4 0xB2BAA33E EQ PUSH2 0x754 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xA26171E2 GT PUSH2 0x17F JUMPI DUP1 PUSH4 0xA26171E2 EQ PUSH2 0x6E2 JUMPI DUP1 PUSH4 0xA3B4A327 EQ PUSH2 0x6F7 JUMPI DUP1 PUSH4 0xA657E579 EQ PUSH2 0x70A JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x68D JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x6A2 JUMPI DUP1 PUSH4 0x9C3CCC82 EQ PUSH2 0x6C2 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x4BCC3F67 GT PUSH2 0x274 JUMPI DUP1 PUSH4 0x624A7232 GT PUSH2 0x21D JUMPI DUP1 PUSH4 0x70712939 GT PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x616 JUMPI DUP1 PUSH4 0x76671808 EQ PUSH2 0x636 JUMPI DUP1 PUSH4 0x81666796 EQ PUSH2 0x64B JUMPI DUP1 PUSH4 0x8A2E271A EQ PUSH2 0x66D JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x624A7232 EQ PUSH2 0x5CC JUMPI DUP1 PUSH4 0x63403801 EQ PUSH2 0x5E1 JUMPI DUP1 PUSH4 0x68A7D6CD EQ PUSH2 0x5F6 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x5BD4AB73 GT PUSH2 0x24E JUMPI DUP1 PUSH4 0x5BD4AB73 EQ PUSH2 0x559 JUMPI DUP1 PUSH4 0x5D91121D EQ PUSH2 0x586 JUMPI DUP1 PUSH4 0x5E615A6B EQ PUSH2 0x5A6 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x4BCC3F67 EQ PUSH2 0x4F7 JUMPI DUP1 PUSH4 0x587DA023 EQ PUSH2 0x524 JUMPI DUP1 PUSH4 0x58F6C7E3 EQ PUSH2 0x539 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x3C277FC5 GT PUSH2 0x2D6 JUMPI DUP1 PUSH4 0x44A6958B GT PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x44A6958B EQ PUSH2 0x48A JUMPI DUP1 PUSH4 0x46B97959 EQ PUSH2 0x4AA JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x4D7 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x3C277FC5 EQ PUSH2 0x41B JUMPI DUP1 PUSH4 0x3E4AD732 EQ PUSH2 0x43D JUMPI DUP1 PUSH4 0x42F1181E EQ PUSH2 0x46A JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x2A94C279 GT PUSH2 0x307 JUMPI DUP1 PUSH4 0x2A94C279 EQ PUSH2 0x39B JUMPI DUP1 PUSH4 0x2E17DE78 EQ PUSH2 0x3CA JUMPI DUP1 PUSH4 0x38229D93 EQ PUSH2 0x3EA JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x1E28D84 EQ PUSH2 0x32E JUMPI DUP1 PUSH4 0xB9663DB EQ PUSH2 0x350 JUMPI DUP1 PUSH4 0x1E7FF8F6 EQ PUSH2 0x37B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x349 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x93F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0xA0D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5318 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x387 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x396 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0xB5A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BB PUSH2 0x3B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0xBF4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5505 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x3E5 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xC20 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40A PUSH2 0x405 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xDD5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5536 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x427 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0xE04 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x449 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x458 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xE20 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x54C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x476 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x485 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0xE3F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x496 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x4A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x503D JUMP JUMPDEST PUSH2 0xE53 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4CA PUSH2 0x4C5 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xEB2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5472 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x4F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xEFD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x503 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x517 PUSH2 0x512 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xF31 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5493 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x530 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0xF93 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x545 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x554 CALLDATASIZE PUSH1 0x4 PUSH2 0x5135 JUMP JUMPDEST PUSH2 0xF99 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x565 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x579 PUSH2 0x574 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1196 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x5A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x50ED JUMP JUMPDEST PUSH2 0x11AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5BB PUSH2 0x1274 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5559 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x129D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x12B9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x602 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x611 CALLDATASIZE PUSH1 0x4 PUSH2 0x51E8 JUMP JUMPDEST PUSH2 0x12BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x622 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x631 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x13F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x642 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x14AD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x657 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x660 PUSH2 0x14B3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x559D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x679 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x688 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x14BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x699 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x1581 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x6BD CALLDATASIZE PUSH1 0x4 PUSH2 0x5013 JUMP JUMPDEST PUSH2 0x159D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x6DD CALLDATASIZE PUSH1 0x4 PUSH2 0x518A JUMP JUMPDEST PUSH2 0x15AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x1629 JUMP JUMPDEST PUSH2 0x34E PUSH2 0x705 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FD3 JUMP JUMPDEST PUSH2 0x162F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x716 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x187F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x73A CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1885 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x74B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x199A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x19A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x775 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x784 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x19BE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x795 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x7A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x19FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x579 PUSH2 0x7C4 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1A08 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x7E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1A1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x804 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1AA8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x815 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x81E PUSH2 0x1ABA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x52B4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x837 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x660 PUSH2 0x1B29 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x84C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x1B35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x861 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x870 CALLDATASIZE PUSH1 0x4 PUSH2 0x5119 JUMP JUMPDEST PUSH2 0x1B4F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x881 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x660 PUSH2 0x1C9F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x8A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x50A8 JUMP JUMPDEST PUSH2 0x1CB3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x1D50 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x8DA CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x8FA CALLDATASIZE PUSH1 0x4 PUSH2 0x5013 JUMP JUMPDEST PUSH2 0x1D7E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x90B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x91A CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1DBF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x92B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x93A CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1E62 JUMP JUMPDEST PUSH2 0x947 PUSH2 0x208F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x987 JUMPI PUSH2 0x987 PUSH2 0x982 PUSH1 0x1 DUP4 PUSH2 0x20B2 JUMP JUMPDEST PUSH2 0x2154 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD PUSH32 0xF50D0D312D501878616EB5E78EBF3ED6DCD3955AAEF8165AF9C6B057CC4832FB SWAP1 PUSH2 0xA02 SWAP1 DUP4 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0xA25 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD SWAP1 SWAP2 POP DUP1 ISZERO PUSH2 0xA4D JUMPI PUSH2 0xA4D PUSH2 0x982 DUP4 DUP4 PUSH2 0x217B JUMP JUMPDEST PUSH2 0xA55 PUSH2 0x2198 JUMP JUMPDEST PUSH2 0xA5D PUSH2 0x220B JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0xA74 PUSH2 0x4EA0 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0xA0 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP1 DUP3 MSTORE PUSH1 0x1 DUP4 ADD SLOAD SWAP4 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x2 DUP4 ADD SLOAD DUP3 DUP7 ADD DUP2 SWAP1 MSTORE PUSH1 0x3 DUP5 ADD SLOAD PUSH1 0x60 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x4 SWAP1 SWAP5 ADD SLOAD PUSH1 0x80 DUP5 ADD MSTORE SWAP5 MLOAD SWAP2 SWAP5 DUP9 SWAP5 PUSH32 0xBB4A26FA0ACE13EE4DA343896C20EAA44A618FB9071FDD8C2E2C960A4583189D SWAP5 PUSH2 0xAF6 SWAP5 SWAP2 SWAP4 SWAP3 SWAP2 PUSH2 0x551B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0xB06 PUSH2 0x22AF JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0xB4D JUMPI DUP1 MLOAD PUSH1 0x40 MLOAD DUP6 SWAP2 PUSH32 0xB463D19ECF455BE65365092CF8E1DB6934A0334CF8CD532DDF9964D01F36B5B2 SWAP2 PUSH2 0xB44 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST PUSH1 0x20 ADD MLOAD SWAP4 POP POP POP POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB64 PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB9C SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBC8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xBEC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5172 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 SWAP1 SWAP3 ADD SLOAD SWAP1 SWAP2 SWAP1 DUP4 JUMP JUMPDEST CALLER PUSH2 0xC29 PUSH2 0x4ECF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x5B8CCBB9D4D8FB16EA74CE3C29A41F1B461FBDAFF4714A0D9A8EB05499746BC PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xC76 SWAP1 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xCA8 DUP3 PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2398 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 GT ISZERO PUSH2 0xCBF JUMPI PUSH2 0xCBF PUSH2 0x982 DUP6 DUP4 PUSH2 0x23AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x5B8CCBB9D4D8FB16EA74CE3C29A41F1B461FBDAFF4714A0D9A8EB05499746BC PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xD0D SWAP1 DUP6 PUSH2 0x23CB JUMP JUMPDEST PUSH2 0xD15 PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9470B0BD DUP5 DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD4F SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x85082129D87B2FE11527CB1B3B7A520AEB5AA6913F88A3D8757FE40D1DB02FDD DUP6 PUSH1 0x40 MLOAD PUSH2 0xDC7 SWAP2 SWAP1 PUSH2 0x5318 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x16 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 DUP5 ADD SLOAD PUSH1 0x4 SWAP1 SWAP5 ADD SLOAD SWAP3 SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 DUP6 JUMP JUMPDEST PUSH1 0x18 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xE28 PUSH2 0x4ECF JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xBEC SWAP1 PUSH2 0x22F2 JUMP JUMPDEST PUSH2 0xE47 PUSH2 0x2452 JUMP JUMPDEST PUSH2 0xE50 DUP2 PUSH2 0x2499 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0xE5B PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0xEA9 PUSH1 0x5 PUSH1 0x0 DUP5 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xE6E JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 DUP2 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP3 MSTORE SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xEBA PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0xC SLOAD DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP2 MSTORE PUSH1 0x1 DUP3 ADD SLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x2 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xF0A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH2 0xF39 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP4 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD DUP2 JUMP JUMPDEST CALLER DUP2 PUSH2 0xFA5 JUMPI POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFB4 PUSH1 0x20 DUP7 ADD DUP7 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xFBF JUMPI INVALID JUMPDEST EQ DUP1 ISZERO PUSH2 0xFE3 JUMPI POP PUSH1 0x0 PUSH2 0xFD6 PUSH1 0x20 DUP6 ADD DUP6 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xFE1 JUMPI INVALID JUMPDEST EQ JUMPDEST ISZERO PUSH2 0xFEE JUMPI POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0x1 PUSH2 0xFFD PUSH1 0x20 DUP7 ADD DUP7 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1008 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x101D JUMPI PUSH2 0x101D DUP5 PUSH1 0x20 ADD CALLDATALOAD DUP3 DUP5 PUSH2 0x25CA JUMP JUMPDEST PUSH1 0x1 PUSH2 0x102C PUSH1 0x20 DUP6 ADD DUP6 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1037 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x104C JUMPI PUSH2 0x104C DUP4 PUSH1 0x20 ADD CALLDATALOAD DUP3 DUP5 PUSH2 0x2663 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 DUP2 PUSH2 0x105E PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1069 JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 DUP2 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP3 MSTORE DUP4 MSTORE SWAP1 DUP2 KECCAK256 SWAP3 POP SWAP1 PUSH1 0x5 SWAP1 DUP3 SWAP1 PUSH2 0x10B3 SWAP1 DUP9 ADD DUP9 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x10BE JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 DUP2 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 MSTORE SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SWAP1 POP PUSH2 0x1101 DUP3 DUP3 DUP7 PUSH2 0x26FC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP7 ADD CALLDATALOAD SWAP1 DUP8 ADD DUP1 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH32 0x7D3AD1DCF03B9027064D1D9A474A69E0CECC31324C541D3EB9B5E6FA2F106C8D SWAP1 DUP9 SWAP1 PUSH2 0x1153 SWAP1 DUP13 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x115E JUMPI INVALID JUMPDEST PUSH2 0x116B PUSH1 0x20 DUP13 ADD DUP13 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1176 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1185 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5584 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST DUP2 PUSH2 0x11B5 DUP2 PUSH2 0x27F5 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x11ED DUP5 DUP3 DUP6 PUSH2 0x282E JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP8 AND MUL OR SWAP1 SSTORE MLOAD DUP5 SWAP1 PUSH32 0x8EA2A7A959BD25F226B7B0A4393613F7FDCAA8404E8BAD96AA52DC1C14590167 SWAP1 PUSH2 0xDC7 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH1 0x11 SLOAD PUSH1 0x12 SLOAD PUSH1 0x13 SLOAD PUSH1 0x14 SLOAD SWAP3 SWAP4 PUSH4 0xFFFFFFFF SWAP3 DUP4 AND SWAP4 SWAP2 SWAP3 DUP3 DUP2 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x19 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x11 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH2 0x12D8 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x8 DUP2 SWAP1 SSTORE SWAP2 POP PUSH2 0x12ED DUP3 PUSH3 0xF4240 DUP7 PUSH2 0x282E JUMP JUMPDEST PUSH2 0x12F5 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND DUP3 MSTORE PUSH4 0xFFFFFFFF DUP8 DUP2 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP2 MSTORE DUP6 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SSTORE SWAP1 MLOAD PUSH32 0xCEC6FC86EA644053F6EDFF1160DFE3FA5C61E7A5EF9F873F145BB03A0BD319E7 SWAP1 PUSH2 0x13D9 SWAP1 DUP6 SWAP1 DUP6 SWAP1 DUP10 SWAP1 PUSH2 0x5321 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 ISZERO PUSH2 0x13F0 JUMPI PUSH2 0x13F0 DUP4 PUSH2 0x19BE JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1400 PUSH2 0x2452 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1439 JUMPI PUSH2 0x1439 PUSH2 0x982 DUP3 PUSH2 0x2891 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x14A9 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x146A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x14A1 JUMPI PUSH2 0x149C DUP3 DUP3 PUSH2 0x2930 JUMP JUMPDEST PUSH2 0x14A9 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x143C JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xC SLOAD DUP2 JUMP JUMPDEST PUSH1 0x14 SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x14C7 PUSH2 0x208F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1503 JUMPI PUSH2 0x1503 PUSH2 0x982 PUSH1 0x0 DUP4 PUSH2 0x20B2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD PUSH32 0x3E535D1AB441EF41C268FD9B52B478AEE02D693C5CA2A84B5D26B89E0922E5E1 SWAP1 PUSH2 0xA02 SWAP1 DUP4 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x15A5 PUSH2 0x2452 JUMP JUMPDEST PUSH2 0x14A9 DUP3 DUP3 PUSH2 0x2930 JUMP JUMPDEST PUSH2 0x15B7 PUSH2 0x208F JUMP JUMPDEST PUSH2 0x15C4 DUP6 DUP6 DUP6 DUP6 DUP6 PUSH2 0x2B7F JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xC6F3A427 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x160A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x161E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x13 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1652 JUMPI PUSH2 0x1652 PUSH2 0x982 CALLER PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0x165B DUP2 PUSH2 0x2C5D JUMP JUMPDEST CALLVALUE PUSH2 0x1735 JUMPI PUSH2 0x1668 PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD DUP4 ADDRESS DUP5 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x16A4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x525D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16F6 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5074 JUMP JUMPDEST PUSH2 0x1735 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x172C SWAP1 PUSH2 0x543B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 PUSH2 0x1766 JUMPI POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1771 DUP3 PUSH2 0xE20 JUMP JUMPDEST PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x13 SLOAD DUP2 LT ISZERO PUSH2 0x1796 JUMPI POP POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 PUSH1 0x16 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 DUP2 SLOAD DUP1 PUSH2 0x1845 JUMPI PUSH1 0x0 DUP1 PUSH2 0x17CE DUP9 DUP9 PUSH2 0x2C7E JUMP JUMPDEST PUSH1 0x2 DUP8 ADD DUP3 SWAP1 SSTORE PUSH1 0x1 DUP8 ADD DUP2 SWAP1 SSTORE PUSH1 0x3 DUP7 ADD SLOAD SWAP2 SWAP4 POP SWAP2 POP PUSH2 0x17F6 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x3 DUP6 ADD SSTORE PUSH1 0x1 DUP1 DUP6 ADD SLOAD PUSH2 0x1810 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x1 DUP6 ADD SSTORE PUSH1 0x40 MLOAD DUP9 SWAP1 DUP8 SWAP1 PUSH32 0x14B098103235344975B17508C2391721CC9AC3F3FA2B56C7FF46F8480DFD074F SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMPDEST PUSH2 0x1855 DUP2 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST DUP4 SSTORE PUSH1 0x2 DUP3 ADD SLOAD PUSH2 0x186C SWAP1 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST DUP3 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH2 0x188E PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x15CC36F2 DUP3 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x18C8 SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x18F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x5B8CCBB9D4D8FB16EA74CE3C29A41F1B461FBDAFF4714A0D9A8EB05499746BC PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1948 SWAP1 DUP4 PUSH2 0x2D0A JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEBEDB8B3C678666E7F36970BC8F57ABF6D8FA2E828C0DA91EA5B75BF68ED101A DUP4 PUSH1 0x40 MLOAD PUSH2 0x198E SWAP2 SWAP1 PUSH2 0x5318 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x17 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19B9 PUSH1 0x11 SLOAD PUSH1 0xD SLOAD PUSH2 0x2875 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP5 SWAP1 SSTORE MLOAD DUP4 SWAP2 DUP4 SWAP2 PUSH32 0x5640833634FCE74EB9211D1209A91DD5A1C8C6A751696BFF9323B4DB67F81513 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0xE50 DUP2 CALLER PUSH2 0x2D74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A27 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP1 PUSH2 0x1A8B DUP6 PUSH2 0x2F4C JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1A9E DUP4 PUSH1 0x20 ADD MLOAD DUP4 DUP4 PUSH2 0x3009 JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1AF4 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x12 SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1B3D PUSH2 0x208F JUMP JUMPDEST PUSH2 0x1B45 PUSH2 0x304A JUMP JUMPDEST PUSH2 0x1B4D PUSH2 0x305D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B57 PUSH2 0x4ECF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH2 0x1B8A PUSH32 0xABD6E7CB50984FF9C2F3E18A2660C3353DADF4E3291DEEB275DAE2CD1E44FE05 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1B9A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xBEF JUMPI PUSH1 0x0 PUSH2 0x1BAA PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9706E0C0 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1C27 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1C56 PUSH2 0x1C51 DUP4 PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x3088 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1C86 SWAP2 PUSH2 0x1C51 SWAP2 DUP5 SWAP2 AND PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP4 ADD MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x14 SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1CBD PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP1 PUSH2 0x1D21 DUP7 PUSH2 0x2F4C JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 PUSH2 0x1D36 DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP5 PUSH2 0x3009 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1D45 DUP8 DUP8 DUP4 DUP6 PUSH2 0x30AC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x1D86 PUSH2 0x4ECF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 PUSH2 0xEA9 SWAP1 PUSH2 0x22F2 JUMP JUMPDEST PUSH2 0x1DC7 PUSH2 0x2452 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1DF2 JUMPI PUSH2 0x1DED PUSH2 0x982 PUSH2 0x31F9 JUMP JUMPDEST PUSH2 0xE50 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 CALLER SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 PUSH2 0x1E78 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1E82 PUSH2 0x4EA0 JUMP JUMPDEST POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0xA0 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP2 MSTORE PUSH1 0x1 DUP3 ADD SLOAD SWAP3 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x4 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x1ED7 JUMPI POP POP POP PUSH2 0xE50 JUMP JUMPDEST PUSH2 0x1EDF PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP1 DUP3 MSTORE PUSH1 0x1 DUP4 ADD SLOAD SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH2 0x1F2D JUMPI POP POP POP POP PUSH2 0xE50 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP2 DUP2 SSTORE PUSH1 0x1 DUP2 ADD DUP3 SWAP1 SSTORE PUSH1 0x2 ADD DUP2 SWAP1 SSTORE PUSH2 0x1F60 DUP3 DUP5 PUSH2 0x3230 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x1F74 DUP9 DUP5 DUP7 PUSH1 0x40 ADD MLOAD PUSH2 0x32A5 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP8 DUP8 PUSH32 0xF1116B309178AA62DCB6BF8C3B8BC2321724907C7EBF52192D14C8CE3AA9194C DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1FAB SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 PUSH2 0x1FC5 DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x80 DUP8 ADD MLOAD SWAP1 SWAP2 POP PUSH2 0x1FDD SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x80 DUP8 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x4 ADD SWAP2 SWAP1 SWAP2 SSTORE DUP7 ADD MLOAD PUSH2 0x2010 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x20 DUP1 DUP9 ADD DUP3 DUP2 MSTORE PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x16 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x1 ADD SWAP2 SWAP1 SWAP2 SSTORE MLOAD PUSH2 0x161E JUMPI PUSH1 0x80 DUP7 ADD MLOAD DUP7 MLOAD DUP9 SWAP2 PUSH32 0xB463D19ECF455BE65365092CF8E1DB6934A0334CF8CD532DDF9964D01F36B5B2 SWAP2 PUSH2 0x206E SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x207C SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1B4D JUMPI PUSH2 0x1B4D PUSH2 0x982 CALLER PUSH2 0x33F5 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB9588E43 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x53AB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2175 JUMPI PUSH2 0x2175 PUSH2 0x982 PUSH1 0x2 DUP6 DUP6 PUSH2 0x3410 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x614B800A PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST ADDRESS BALANCE DUP1 ISZERO PUSH2 0xE50 JUMPI PUSH2 0x21A8 PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2203 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19B9 PUSH1 0x17 SLOAD PUSH2 0x221B PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2253 SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x226B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x227F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x22A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5172 JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST TIMESTAMP PUSH1 0x0 PUSH2 0x22BA PUSH2 0x19A0 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x22D1 JUMPI PUSH2 0x22D1 PUSH2 0x982 DUP3 DUP5 PUSH2 0x34B5 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 PUSH2 0x22E8 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0xC SSTORE POP POP PUSH1 0xD SSTORE JUMP JUMPDEST PUSH2 0x22FA PUSH2 0x4ECF JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP4 MSTORE PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH9 0x10000000000000000 DUP4 DIV DUP2 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP3 DIV SWAP1 SWAP2 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xC SLOAD SWAP1 SWAP2 DUP2 GT ISZERO PUSH2 0x2392 JUMPI PUSH2 0x236D DUP2 PUSH2 0x34D2 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x40 DUP3 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x23A7 JUMPI DUP2 PUSH2 0xEA9 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x84C8B7C9 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH2 0x23D3 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x23DC DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x2406 PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2435 SWAP2 PUSH2 0x1C51 SWAP2 AND DUP5 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1191 DUP4 DUP3 PUSH2 0x34F2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1B4D JUMPI PUSH1 0x0 SLOAD PUSH2 0x1B4D SWAP1 PUSH2 0x982 SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x35AC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x24BF JUMPI PUSH2 0x24BF PUSH2 0x982 PUSH2 0x35C9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x24F9 JUMPI PUSH2 0x24F9 PUSH2 0x982 DUP3 PUSH2 0x3600 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH2 0x25D3 DUP4 PUSH2 0x361B JUMP JUMPDEST PUSH2 0x25DD DUP4 DUP4 PUSH2 0x2D74 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 PUSH2 0x2617 SWAP1 DUP3 PUSH2 0x3652 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x262F SWAP1 DUP3 PUSH2 0x3652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH2 0x1191 PUSH32 0xABD6E7CB50984FF9C2F3E18A2660C3353DADF4E3291DEEB275DAE2CD1E44FE05 DUP3 PUSH2 0x3652 JUMP JUMPDEST PUSH2 0x266C DUP4 PUSH2 0x361B JUMP JUMPDEST PUSH2 0x2676 DUP4 DUP4 PUSH2 0x2D74 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 PUSH2 0x26B0 SWAP1 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x26C8 SWAP1 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH2 0x1191 PUSH32 0xABD6E7CB50984FF9C2F3E18A2660C3353DADF4E3291DEEB275DAE2CD1E44FE05 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x2706 DUP4 DUP4 PUSH2 0x36E5 JUMP JUMPDEST ISZERO PUSH2 0x2710 JUMPI PUSH2 0x1191 JUMP JUMPDEST PUSH2 0x2718 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x2721 DUP5 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x272B PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x2734 DUP5 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 GT ISZERO PUSH2 0x276F JUMPI PUSH2 0x276F PUSH2 0x982 DUP5 DUP5 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x23AE JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2796 SWAP1 PUSH2 0x1C51 SWAP1 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 ADD MLOAD PUSH2 0x27C7 SWAP2 PUSH2 0x1C51 SWAP2 AND DUP6 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x27E4 DUP6 DUP4 PUSH2 0x34F2 JUMP JUMPDEST PUSH2 0x27EE DUP5 DUP3 PUSH2 0x34F2 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x14A9 JUMPI PUSH2 0x14A9 PUSH2 0x982 CALLER DUP5 PUSH2 0x36EC JUMP JUMPDEST PUSH3 0xF4240 PUSH4 0xFFFFFFFF DUP3 AND GT ISZERO PUSH2 0x2853 JUMPI PUSH2 0x284E PUSH2 0x982 PUSH1 0x0 DUP6 DUP5 PUSH2 0x3709 JUMP JUMPDEST PUSH2 0x1191 JUMP JUMPDEST DUP2 PUSH4 0xFFFFFFFF AND DUP2 PUSH4 0xFFFFFFFF AND LT PUSH2 0x1191 JUMPI PUSH2 0x1191 PUSH2 0x982 PUSH1 0x1 DUP6 DUP5 PUSH2 0x3709 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xEA9 JUMPI PUSH2 0xEA9 PUSH2 0x982 PUSH1 0x0 DUP7 DUP7 PUSH2 0x3410 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xEB5108A2 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x2969 JUMPI PUSH2 0x2969 PUSH2 0x982 DUP4 PUSH2 0x2891 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0x2984 JUMPI PUSH2 0x2984 PUSH2 0x982 DUP3 PUSH1 0x2 DUP1 SLOAD SWAP1 POP PUSH2 0x3728 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x29A8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x2A0A JUMPI PUSH2 0x2A0A PUSH2 0x982 PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x29E2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x3745 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2A85 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x2AB8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x2B37 SWAP1 DUP3 PUSH2 0x4F27 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x11 DUP6 SWAP1 SSTORE PUSH1 0x12 DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP8 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x13 DUP6 SWAP1 SSTORE PUSH1 0x14 DUP1 SLOAD DUP5 DUP5 AND PUSH5 0x100000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF SWAP5 DUP8 AND SWAP2 SWAP1 SWAP4 AND OR SWAP3 SWAP1 SWAP3 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x613157DBB0E920DEAB8AD6DDD3805E87CBF57344B9FE780F1764790EC7897542 SWAP1 PUSH2 0x2C33 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0x5559 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB56D2DF0 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST DUP1 CALLVALUE EQ ISZERO DUP1 ISZERO PUSH2 0x2C6C JUMPI POP CALLVALUE ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE50 JUMPI PUSH2 0xE50 PUSH2 0x982 DUP3 CALLVALUE PUSH2 0x3762 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH2 0x2CB1 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH2 0x1D7E JUMP JUMPDEST PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x2CD5 DUP5 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x12 SLOAD SWAP1 SWAP4 POP PUSH2 0x2D00 SWAP1 PUSH2 0x2CF3 SWAP1 PUSH4 0xFFFFFFFF AND PUSH3 0xF4240 DUP7 PUSH2 0x377F JUMP JUMPDEST DUP3 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x2D12 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x2D1B DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x2D45 PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2875 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2435 SWAP2 PUSH2 0x1C51 SWAP2 AND DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH2 0x2D7D DUP3 PUSH2 0x37A1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP4 DUP4 PUSH1 0x0 DUP1 PUSH2 0x30AC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH2 0x2DC8 SWAP1 PUSH2 0x22F2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP9 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP4 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP3 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFF AND PUSH9 0x10000000000000000 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND MUL OR SWAP1 SWAP3 AND PUSH21 0x10000000000000000000000000000000000000000 SWAP4 SWAP1 SWAP3 AND SWAP3 SWAP1 SWAP3 MUL OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x2F43 JUMPI PUSH2 0x2EAD DUP4 DUP3 PUSH2 0x3815 JUMP JUMPDEST PUSH2 0x2EB5 PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB DUP4 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2EEF SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F1D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x2F41 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5074 JUMP JUMPDEST POP JUMPDEST PUSH2 0x1191 DUP4 PUSH2 0x385D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2F67 PUSH1 0x1 PUSH1 0xC SLOAD PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x2F71 PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP5 MSTORE DUP3 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 DUP5 ADD SLOAD DUP4 DUP8 ADD MSTORE PUSH1 0x2 SWAP4 DUP5 ADD SLOAD DUP4 DUP7 ADD MSTORE DUP8 DUP8 MSTORE PUSH1 0x16 DUP7 MSTORE SWAP6 DUP5 SWAP1 KECCAK256 DUP5 MLOAD PUSH1 0xA0 DUP2 ADD DUP7 MSTORE DUP2 SLOAD DUP2 MSTORE SWAP7 DUP2 ADD SLOAD SWAP6 DUP8 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP2 DUP5 ADD SLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x3 DUP4 ADD SLOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE SWAP1 PUSH2 0x2FF9 SWAP1 DUP3 SWAP1 PUSH2 0x3230 JUMP JUMPDEST SWAP4 POP DUP1 PUSH1 0x40 ADD MLOAD SWAP3 POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 PUSH2 0x3019 JUMPI DUP4 SWAP2 POP PUSH2 0x3042 JUMP JUMPDEST PUSH2 0x302D PUSH4 0xFFFFFFFF DUP7 AND PUSH3 0xF4240 DUP7 PUSH2 0x386A JUMP JUMPDEST SWAP2 POP PUSH2 0x303F DUP5 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3052 PUSH2 0x38A0 JUMP JUMPDEST TIMESTAMP PUSH1 0xD SSTORE PUSH1 0x1 PUSH1 0xC SSTORE JUMP JUMPDEST PUSH2 0x3065 PUSH2 0x38B5 JUMP JUMPDEST PUSH3 0xD2F00 PUSH3 0xDBBA0 PUSH9 0x56BC75E2D63100000 PUSH1 0x2 PUSH1 0x3 PUSH2 0x27EE DUP6 DUP6 DUP6 DUP6 DUP6 PUSH2 0x2B7F JUMP JUMPDEST DUP1 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xBEF JUMPI PUSH2 0xBEF PUSH2 0x982 PUSH1 0x2 DUP5 PUSH2 0x391A JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 PUSH2 0x30BA PUSH2 0x4ECF JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE SWAP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP4 MSTORE PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH9 0x10000000000000000 DUP4 DIV DUP2 AND SWAP5 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV SWAP1 SWAP3 AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 EQ ISZERO PUSH2 0x315B JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x31F1 JUMP JUMPDEST PUSH2 0x3167 DUP2 DUP4 DUP8 DUP8 PUSH2 0x3937 JUMP JUMPDEST DUP2 MLOAD SWAP1 SWAP4 POP PUSH1 0x0 SWAP1 PUSH2 0x318A SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST SWAP1 POP PUSH2 0x31C8 PUSH2 0x31BB DUP10 DUP5 PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x0 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND DUP6 PUSH2 0x39BA JUMP JUMPDEST DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x31EB PUSH2 0x31BB DUP10 DUP5 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP8 PUSH2 0x39BA JUMP JUMPDEST SWAP4 POP POP POP POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xE69EDC3E00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x323E JUMPI PUSH2 0xEAC JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x14 SLOAD PUSH2 0x3274 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF DUP1 DUP3 AND SWAP2 PUSH5 0x100000000 SWAP1 DIV AND PUSH2 0x3A53 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD DUP4 MLOAD SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 PUSH2 0x3290 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP DUP2 DUP2 LT ISZERO PUSH2 0x329E JUMPI DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x32B0 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP4 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3314 SWAP1 DUP7 DUP7 PUSH2 0x3009 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP2 POP DUP3 ISZERO PUSH2 0x33D1 JUMPI PUSH2 0x3327 PUSH2 0xE04 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH2 0x337D SWAP2 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x528E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3397 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x33AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x33CF SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5074 JUMP JUMPDEST POP JUMPDEST DUP2 ISZERO PUSH2 0x33EC JUMPI PUSH2 0x33E1 DUP7 DUP4 PUSH2 0x3B16 JUMP JUMPDEST PUSH2 0x33EC DUP7 DUP4 DUP7 PUSH2 0x3B57 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB65A25B9 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x342F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5371 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA6BCDE47 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xBEF JUMPI PUSH2 0xBEF PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x391A JUMP JUMPDEST DUP1 MLOAD DUP3 SLOAD PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x20 SWAP1 SWAP4 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH9 0x10000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP5 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP3 SWAP1 SWAP3 AND OR AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1DE45AD1 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5236 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x57654FE400000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xDE16F1A0 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xE50 JUMPI PUSH2 0xE50 PUSH2 0x982 DUP3 PUSH1 0x0 PUSH2 0x3C40 JUMP JUMPDEST PUSH2 0x365A PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x3663 DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x368D PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1191 DUP4 DUP3 PUSH2 0x34F2 JUMP JUMPDEST PUSH2 0x36B2 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x36BB DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x368D PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2875 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST EQ PUSH1 0x1 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x82DED785 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x60 PUSH4 0x22DF9597 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x342F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53DD JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE9F83771 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x140A84DB PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5236 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x31D7A505 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31F1 DUP4 PUSH2 0x3795 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 PUSH2 0x37B8 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP PUSH2 0x37C2 PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP1 DUP3 MSTORE PUSH1 0x1 DUP4 ADD SLOAD SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE ISZERO PUSH2 0x1191 JUMPI PUSH2 0x1191 PUSH2 0x982 DUP5 DUP5 PUSH2 0x3CB8 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3834 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x17 SLOAD PUSH2 0x3856 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x17 SSTORE POP POP JUMP JUMPDEST PUSH2 0xE50 DUP2 PUSH1 0x0 PUSH1 0x1 PUSH2 0x3B57 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31F1 DUP4 PUSH2 0x3795 PUSH2 0x3884 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH2 0x3894 DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0xD SLOAD ISZERO PUSH2 0x1B4D JUMPI PUSH2 0x1B4D PUSH2 0x982 PUSH1 0x0 PUSH2 0x3CD5 JUMP JUMPDEST PUSH1 0x11 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0x38CD JUMPI POP PUSH1 0x12 SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x38DA JUMPI POP PUSH1 0x13 SLOAD ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x38ED JUMPI POP PUSH1 0x14 SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x3908 JUMPI POP PUSH1 0x14 SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x1B4D JUMPI PUSH2 0x1B4D PUSH2 0x982 PUSH1 0x1 PUSH2 0x3CD5 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xC996AF7B PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5393 JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO DUP1 PUSH2 0x3944 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x3951 JUMPI POP PUSH1 0x0 PUSH2 0x31F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3964 DUP6 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST DUP7 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x3980 JUMPI DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3986 JUMP JUMPDEST DUP6 PUSH1 0x20 ADD MLOAD JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 PUSH2 0x39A5 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x31F1 JUMP JUMPDEST PUSH2 0x39B0 DUP5 DUP5 DUP4 PUSH2 0x377F JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 ISZERO DUP1 PUSH2 0x39C8 JUMPI POP DUP2 DUP4 EQ JUMPDEST ISZERO PUSH2 0x39D5 JUMPI POP PUSH1 0x0 PUSH2 0x31F1 JUMP JUMPDEST DUP2 DUP4 LT PUSH2 0x3A0E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x172C SWAP1 PUSH2 0x5404 JUMP JUMPDEST PUSH2 0x3A16 PUSH2 0x4F4B JUMP JUMPDEST PUSH2 0x3A20 DUP7 DUP6 PUSH2 0x3D14 JUMP JUMPDEST SWAP1 POP PUSH2 0x3A2A PUSH2 0x4F4B JUMP JUMPDEST PUSH2 0x3A34 DUP8 DUP6 PUSH2 0x3D14 JUMP JUMPDEST SWAP1 POP PUSH2 0x1D45 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP11 PUSH2 0x3E32 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3A60 DUP9 DUP9 PUSH2 0x3EBE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3A6E DUP8 DUP8 PUSH2 0x3EBE JUMP JUMPDEST SWAP1 POP DUP2 ISZERO DUP1 PUSH2 0x3A7B JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x3A8C JUMPI POP PUSH1 0x0 SWAP2 POP PUSH2 0x1D45 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 SGT ISZERO PUSH2 0x3AA5 JUMPI PUSH2 0x3AA0 DUP3 DUP5 PUSH2 0x3F10 JUMP JUMPDEST PUSH2 0x3AAF JUMP JUMPDEST PUSH2 0x3AAF DUP4 DUP4 PUSH2 0x3F10 JUMP JUMPDEST SWAP1 POP PUSH2 0x3AD8 PUSH2 0x3AD3 PUSH2 0x3AC0 DUP4 PUSH2 0x3F2F JUMP JUMPDEST DUP9 PUSH4 0xFFFFFFFF AND DUP9 PUSH4 0xFFFFFFFF AND PUSH2 0x45D1 JUMP JUMPDEST PUSH2 0x45E0 JUMP JUMPDEST SWAP1 POP DUP2 DUP4 SGT ISZERO PUSH2 0x3AF1 JUMPI PUSH2 0x3AEC DUP3 DUP3 PUSH2 0x3F10 JUMP JUMPDEST PUSH2 0x3AFB JUMP JUMPDEST PUSH2 0x3AFB DUP3 DUP3 PUSH2 0x4BCA JUMP JUMPDEST SWAP1 POP PUSH2 0x3B07 DUP2 DUP13 PUSH2 0x4BF6 JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3B35 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x17 SLOAD PUSH2 0x3856 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xC SLOAD DUP1 DUP3 EQ ISZERO PUSH2 0x3B78 JUMPI POP POP PUSH2 0x1191 JUMP JUMPDEST PUSH2 0x3B80 PUSH2 0x4F4B JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x3BB7 PUSH2 0x4F4B JUMP JUMPDEST PUSH2 0x3BC0 DUP3 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3BF9 JUMPI PUSH2 0x3BD9 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD DUP9 DUP9 PUSH2 0x4C41 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE DUP2 DUP4 MSTORE PUSH2 0x3BED SWAP2 SWAP1 PUSH2 0x4CA3 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE DUP2 MSTORE PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP6 SWAP1 MSTORE DUP6 DUP2 MSTORE JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 DUP5 MLOAD DUP2 SSTORE SWAP4 DUP3 ADD MLOAD PUSH1 0x1 SWAP1 SWAP5 ADD SWAP4 SWAP1 SWAP4 SSTORE SWAP8 DUP2 MSTORE PUSH1 0xF SWAP1 SWAP8 MSTORE SWAP1 SWAP6 KECCAK256 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x9AE94F01 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5353 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3C6C JUMPI POP PUSH1 0x0 PUSH2 0xEAC JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3C79 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xEA9 JUMPI PUSH2 0xEA9 PUSH2 0x982 PUSH1 0x1 DUP7 DUP7 PUSH2 0x3410 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x3CA4 JUMPI PUSH2 0x3CA4 PUSH2 0x982 PUSH1 0x3 DUP6 DUP6 PUSH2 0x3410 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x3CAF JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x5CAA0B05 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xB02D77300000000000000000000000000000000000000000000000000000000 DUP3 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x3D04 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x55C5 JUMP JUMPDEST PUSH2 0x3D1C PUSH2 0x4F4B JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x3D54 DUP2 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3D5E JUMPI PUSH2 0xEAC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D71 DUP4 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP SWAP1 POP PUSH2 0x3DAC DUP3 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3DB7 JUMPI POP PUSH2 0xEAC JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 DUP2 LT ISZERO PUSH2 0x3E14 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP PUSH2 0x3E07 DUP4 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3E14 JUMPI POP PUSH2 0xEAC SWAP1 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x3E41 JUMPI POP PUSH1 0x0 PUSH2 0x3EB5 JUMP JUMPDEST DUP4 PUSH2 0x3E61 JUMPI PUSH2 0x3E5A DUP6 PUSH2 0x3795 DUP5 DUP10 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 POP PUSH2 0x3EB5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E86 PUSH2 0x3E76 DUP7 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST PUSH2 0x22A3 DUP10 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3E9A DUP3 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP1 POP PUSH2 0x3EB0 DUP8 PUSH2 0x3795 DUP7 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 SLT ISZERO PUSH2 0x3ED6 JUMPI PUSH2 0x3ED6 PUSH2 0x982 PUSH1 0x1 DUP6 PUSH2 0x4CCC JUMP JUMPDEST PUSH1 0x0 DUP3 SLT ISZERO PUSH2 0x3EED JUMPI PUSH2 0x3EED PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4CCC JUMP JUMPDEST PUSH2 0xEA9 PUSH2 0x3F0A DUP5 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4D0D JUMP JUMPDEST DUP4 PUSH2 0x4D3F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEA9 PUSH2 0x3F0A DUP5 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4D0D JUMP JUMPDEST PUSH1 0x0 PUSH16 0x80000000000000000000000000000000 DUP3 SGT ISZERO PUSH2 0x3F57 JUMPI PUSH2 0x3F57 PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4DC0 JUMP JUMPDEST PUSH1 0x0 DUP3 SGT PUSH2 0x3F6D JUMPI PUSH2 0x3F6D PUSH2 0x982 PUSH1 0x0 DUP5 PUSH2 0x4DC0 JUMP JUMPDEST PUSH16 0x80000000000000000000000000000000 DUP3 EQ ISZERO PUSH2 0x3F8D JUMPI POP PUSH1 0x0 PUSH2 0xBEF JUMP JUMPDEST PUSH5 0x733048C5A DUP3 SGT PUSH2 0x3FC0 JUMPI POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE010000000000000000000000000000000 PUSH2 0xBEF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH11 0x1C8464F76164760000000 DUP6 SGT PUSH2 0x401F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH11 0x1C8464F76164760000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH13 0xF1AADDD7742E90000000000000 DUP6 SGT PUSH2 0x407D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH13 0xF1AADDD7742E90000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH15 0xAFE10820813D78000000000000000 DUP6 SGT PUSH2 0x40DF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH15 0xAFE10820813D78000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x2582AB704279EC00000000000000000 DUP6 SGT PUSH2 0x4143 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x2582AB704279EC00000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x1152AAA3BF81CC000000000000000000 DUP6 SGT PUSH2 0x41A7 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x1152AAA3BF81CC000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x2F16AC6C59DE70000000000000000000 DUP6 SGT PUSH2 0x420B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x2F16AC6C59DE70000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x4DA2CBF1BE5828000000000000000000 DUP6 SGT PUSH2 0x426F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x4DA2CBF1BE5828000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x63AFBE7AB2082C000000000000000000 DUP6 SGT PUSH2 0x42D3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x63AFBE7AB2082C000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x70F5A893B608861E1F58934F97AEA57D DUP6 SGT PUSH2 0x4337 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x70F5A893B608861E1F58934F97AEA57D PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000000000000000000000000000000 DUP6 ADD SWAP3 POP DUP3 SWAP2 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP1 MUL SDIV SWAP1 POP PUSH17 0x100000000000000000000000000000000 DUP4 DUP2 SUB DUP4 MUL SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x43AD JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x200000000000000000000000000000000 DUP4 PUSH16 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA SUB DUP4 MUL DUP2 PUSH2 0x43DE JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x43FE JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x300000000000000000000000000000000 DUP4 PUSH16 0x99999999999999999999999999999999 SUB DUP4 MUL DUP2 PUSH2 0x442F JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x444F JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x400000000000000000000000000000000 DUP4 PUSH16 0x92492492492492492492492492492492 SUB DUP4 MUL DUP2 PUSH2 0x4480 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x44A0 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x500000000000000000000000000000000 DUP4 PUSH16 0x8E38E38E38E38E38E38E38E38E38E38E SUB DUP4 MUL DUP2 PUSH2 0x44D1 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x44F1 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x600000000000000000000000000000000 DUP4 PUSH16 0x8BA2E8BA2E8BA2E8BA2E8BA2E8BA2E8B SUB DUP4 MUL DUP2 PUSH2 0x4522 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x4542 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x700000000000000000000000000000000 DUP4 PUSH16 0x89D89D89D89D89D89D89D89D89D89D89 SUB DUP4 MUL DUP2 PUSH2 0x4573 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x4593 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x800000000000000000000000000000000 DUP4 PUSH16 0x88888888888888888888888888888888 SUB DUP4 MUL DUP2 PUSH2 0x45C4 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31F1 PUSH2 0x3F0A DUP6 DUP6 PUSH2 0x4D0D JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE010000000000000000000000000000000 DUP3 SLT ISZERO PUSH2 0x4612 JUMPI POP PUSH1 0x0 PUSH2 0xBEF JUMP JUMPDEST DUP2 PUSH2 0x462E JUMPI POP PUSH16 0x80000000000000000000000000000000 PUSH2 0xBEF JUMP JUMPDEST PUSH1 0x0 DUP3 SGT ISZERO PUSH2 0x4645 JUMPI PUSH2 0x4645 PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4DC0 JUMP JUMPDEST PUSH16 0x80000000000000000000000000000000 PUSH16 0x10000000000000000000000000000000 DUP4 SMOD DUP1 DUP1 MUL DUP3 SWAP1 SDIV PUSH8 0x10E1B3BE415A0000 DUP2 MUL SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP2 DUP2 DUP4 MUL SDIV SWAP1 POP DUP1 PUSH8 0x5A0913F6B1E0000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x46B1 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH8 0x168244FDAC78000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x46DE JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH7 0x4807432BC18000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x470A JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH7 0xC0135DCA04000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4736 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH7 0x1B707B1CDC000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4762 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH6 0x36E0F639B800 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x478D JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH6 0x618FEE9F800 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x47B8 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH5 0x9C197DCC00 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x47E2 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH5 0xE30DCE400 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x480C JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH5 0x12EBD1300 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4836 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH4 0x17499F00 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x485F JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH4 0x1A9D480 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4888 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH3 0x1C6380 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x48B0 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH3 0x1C638 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x48D8 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH2 0x1AB8 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x48FF JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH2 0x17C MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4926 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH1 0x14 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x494C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP6 SWAP1 SWAP6 SUB SWAP5 PUSH8 0x21C3677C82B40000 SWAP2 SWAP1 SDIV SWAP4 DUP5 ADD SDIV DUP3 ADD PUSH16 0x80000000000000000000000000000000 ADD SWAP3 SWAP1 POP PUSH17 0x1000000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x49BB JUMPI PUSH19 0x43CBAF42A000812488FC5C220AD7B97BF6E99E PUSH13 0xF1AADDD7742E56D32FB9F99744 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x800000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x49FD JUMPI PUSH18 0x5D27A9F51C31B7C2F8038212A0574779991 PUSH15 0xAFE10820813D65DFE6A33C07F738F DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x400000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4A3F JUMPI PUSH17 0x1B4C902E273A58678D6D3BFDB93DB96D02 PUSH16 0x2582AB704279E8EFD15E0265855C47A DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x200000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4A81 JUMPI PUSH17 0x3B1CC971A9BB5B9867477440D6D157750 PUSH16 0x1152AAA3BF81CB9FDB76EAE12D029571 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x100000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4AC3 JUMPI PUSH17 0x15BF0A8B1457695355FB8AC404E7A79E3 PUSH16 0x2F16AC6C59DE6F8D5D6F63C1482A7C86 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x80000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4B03 JUMPI PUSH16 0xD3094C70F034DE4B96FF7D5B6F99FCD8 PUSH16 0x4DA2CBF1BE5827F9EB3AD1AA9866EBB3 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x40000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4B43 JUMPI PUSH16 0xA45AF1E1F40C333B3DE1DB4DD55F29A7 PUSH16 0x63AFBE7AB2082BA1A0AE5E4EB1B479DC DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x20000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4B83 JUMPI PUSH16 0x910B022DB7AE67CE76B441C27035C6A1 PUSH16 0x70F5A893B608861E1F58934F97AEA57D DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x10000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4BC3 JUMPI PUSH16 0x88415ABBE9A76BEAD8D00CF112E4D4A8 PUSH16 0x783EAFEF1C0A8F3978C7F81824D62EBF DUP5 MUL SDIV SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4BE7 DUP5 DUP5 PUSH2 0x4D0D JUMP JUMPDEST DUP2 PUSH2 0x4BEE JUMPI INVALID JUMPDEST SDIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SLT ISZERO PUSH2 0x4C0E JUMPI PUSH2 0x4C0E PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4CCC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C1A DUP5 DUP5 PUSH2 0x4D0D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 SGT PUSH2 0x4C2E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0xEAC JUMP JUMPDEST PUSH1 0x7F SHR SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH2 0x4C53 JUMPI POP DUP3 SWAP1 POP DUP2 PUSH2 0x4C9A JUMP JUMPDEST DUP4 PUSH2 0x4C62 JUMPI POP DUP5 SWAP1 POP DUP4 PUSH2 0x4C9A JUMP JUMPDEST PUSH2 0x4C85 PUSH2 0x4C75 DUP6 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST PUSH2 0x3894 DUP9 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP2 POP PUSH2 0x4C97 DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x4CC1 DUP5 DUP5 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4DEF JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xBD79545F00000000000000000000000000000000000000000000000000000000 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x4CFB JUMPI INVALID JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x55D3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x4D1C JUMPI POP PUSH1 0x0 PUSH2 0xEAC JUMP JUMPDEST POP DUP2 DUP2 MUL DUP2 DUP4 DUP3 DUP2 PUSH2 0x4D2A JUMPI INVALID JUMPDEST SDIV EQ PUSH2 0xEAC JUMPI PUSH2 0xEAC PUSH2 0x982 PUSH1 0x1 DUP6 DUP6 PUSH2 0x4E5D JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x4D55 JUMPI PUSH2 0x4D55 PUSH2 0x982 PUSH1 0x2 DUP6 DUP6 PUSH2 0x4E5D JUMP JUMPDEST PUSH32 0x8000000000000000000000000000000000000000000000000000000000000000 DUP4 EQ DUP1 ISZERO PUSH2 0x4DA3 JUMPI POP DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EQ JUMPDEST ISZERO PUSH2 0x4DB7 JUMPI PUSH2 0x4DB7 PUSH2 0x982 PUSH1 0x3 DUP6 DUP6 PUSH2 0x4E5D JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x4BEE JUMPI INVALID JUMPDEST PUSH1 0x60 PUSH32 0xED2F26A100000000000000000000000000000000000000000000000000000000 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x4CFB JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP6 GT DUP1 PUSH2 0x4DFF JUMPI POP DUP3 DUP5 GT JUMPDEST ISZERO PUSH2 0x4E54 JUMPI PUSH1 0x0 DUP5 DUP7 LT ISZERO PUSH2 0x4E14 JUMPI DUP5 PUSH2 0x4E16 JUMP JUMPDEST DUP6 JUMPDEST SWAP1 POP PUSH2 0x4E28 DUP2 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP1 POP PUSH2 0x4E3A DUP7 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP3 POP PUSH2 0x4E4C DUP6 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3042 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP2 SWAP3 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x8C12DFE700000000000000000000000000000000000000000000000000000000 DUP5 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4E8C JUMPI INVALID JUMPDEST DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x342F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55E6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x1191 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x1191 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x4F65 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0xB57 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x4F7F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4F6B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xEAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2392 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4FC9 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xEA9 DUP4 DUP4 PUSH2 0x4F83 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4FE7 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4FF2 DUP2 PUSH2 0x560B JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x5002 DUP2 PUSH2 0x560B JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5025 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x502F DUP5 DUP5 PUSH2 0x4F83 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x504F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x5059 DUP5 DUP5 PUSH2 0x4F83 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x5069 DUP2 PUSH2 0x563B JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5085 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xEA9 DUP2 PUSH2 0x562D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x50A1 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x50BA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x5069 DUP2 PUSH2 0x560B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x50DE JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x50FF JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x5069 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x512A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xEA9 DUP2 PUSH2 0x563B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x5149 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x5153 DUP6 DUP6 PUSH2 0x4FA7 JUMP JUMPDEST SWAP3 POP PUSH2 0x5162 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x4FA7 JUMP JUMPDEST SWAP2 POP PUSH1 0x80 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5183 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x51A1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 CALLDATALOAD SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x51B3 DUP2 PUSH2 0x5648 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x51CA DUP2 PUSH2 0x5648 JUMP JUMPDEST SWAP2 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH2 0x51DA DUP2 PUSH2 0x5648 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x51FA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x5205 DUP2 PUSH2 0x5648 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x5069 DUP2 PUSH2 0x562D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP5 ADD SWAP1 PUSH1 0x40 DUP5 ADD SWAP1 DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5302 JUMPI DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x52CE JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x537F JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH1 0x3 DUP5 LT PUSH2 0x53A1 JUMPI INVALID JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x53B8 DUP5 PUSH2 0x5601 JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x53EA DUP6 PUSH2 0x5601 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH32 0x43525F494E54455256414C5F494E56414C494400000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x574554485F5452414E534645525F4641494C4544000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 SWAP2 DUP3 ADD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD MLOAD PUSH4 0xFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH4 0xFFFFFFFF SWAP4 DUP5 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 AND PUSH1 0x60 DUP5 ADD MSTORE AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0xE50 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 BLOCKHASH 0x5f PUSH8 0x9C9973463D3088BF 0xe4 JUMPI CALLVALUE PUSH30 0x17202E3319ADF7067235FC4905AE0F29646C6578706572696D656E74616C CREATE2 PUSH5 0x736F6C6343 STOP SDIV 0xc STOP BLOCKHASH ",
"sourceMap": "889:1398:0:-;;;1057:188;8:9:-1;5:2;;;30:1;27;20:12;5:2;1057:188:0;;;;;;;;;;;;;;;;;;;;;820:5:62;:18;;-1:-1:-1;;;;;;820:18:62;;;828:10;820:18;;;;1168:11:0;:26;;-1:-1:-1;;;;;1168:26:0;;;;;;;;;1204:15;:34;;;;;;;;;;;889:1398;;146:399:-1;;;278:2;266:9;257:7;253:23;249:32;246:2;;;-1:-1;;284:12;246:2;89:6;83:13;101:33;128:5;101:33;;;447:2;497:22;;83:13;336:74;;-1:-1;101:33;83:13;101:33;;;455:74;;;;240:305;;;;;;778:117;-1:-1;;;;;712:54;;837:35;;827:2;;886:1;;876:12;827:2;821:74;;;889:1398:0;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106103295760003560e01c80638da5cb5b116101a5578063bb7ef7e0116100ec578063e8eeb3f811610095578063f18765321161006f578063f1876532146108bf578063f252b7a1146108df578063f2fde38b146108ff578063ff691b111461091f57610329565b8063e8eeb3f814610875578063e907f0031461088a578063ee99205c146108aa57610329565b8063e0ee036e116100c6578063e0ee036e1461082b578063e1c7392a14610840578063e804d0a41461085557610329565b8063bb7ef7e0146107c9578063c18c9141146107e9578063d39de6e91461080957610329565b8063a694fc3a1161014e578063b3e3337911610128578063b3e3337914610769578063b510879f14610789578063b9181611146107a957610329565b8063a694fc3a1461071f578063b05315241461073f578063b2baa33e1461075457610329565b8063a26171e21161017f578063a26171e2146106e2578063a3b4a327146106f7578063a657e5791461070a57610329565b80638da5cb5b1461068d5780639ad26744146106a25780639c3ccc82146106c257610329565b80634bcc3f6711610274578063624a72321161021d57806370712939116101f757806370712939146106165780637667180814610636578063816667961461064b5780638a2e271a1461066d57610329565b8063624a7232146105cc57806363403801146105e157806368a7d6cd146105f657610329565b80635bd4ab731161024e5780635bd4ab73146105595780635d91121d146105865780635e615a6b146105a657610329565b80634bcc3f67146104f7578063587da0231461052457806358f6c7e31461053957610329565b80633c277fc5116102d657806344a6958b116102b057806344a6958b1461048a57806346b97959146104aa578063494503d4146104d757610329565b80633c277fc51461041b5780633e4ad7321461043d57806342f1181e1461046a57610329565b80632a94c279116103075780632a94c2791461039b5780632e17de78146103ca57806338229d93146103ea57610329565b806301e28d841461032e5780630b9663db146103505780631e7ff8f61461037b575b600080fd5b34801561033a57600080fd5b5061034e610349366004614fb8565b61093f565b005b34801561035c57600080fd5b50610365610a0d565b6040516103729190615318565b60405180910390f35b34801561038757600080fd5b50610365610396366004614fb8565b610b5a565b3480156103a757600080fd5b506103bb6103b63660046150cc565b610bf4565b60405161037293929190615505565b3480156103d657600080fd5b5061034e6103e5366004615090565b610c20565b3480156103f657600080fd5b5061040a610405366004615090565b610dd5565b604051610372959493929190615536565b34801561042757600080fd5b50610430610e04565b6040516103729190615215565b34801561044957600080fd5b5061045d610458366004615090565b610e20565b60405161037291906154c6565b34801561047657600080fd5b5061034e610485366004614fb8565b610e3f565b34801561049657600080fd5b5061045d6104a536600461503d565b610e53565b3480156104b657600080fd5b506104ca6104c5366004615090565b610eb2565b6040516103729190615472565b3480156104e357600080fd5b506104306104f2366004615090565b610efd565b34801561050357600080fd5b50610517610512366004615090565b610f31565b6040516103729190615493565b34801561053057600080fd5b50610365610f93565b34801561054557600080fd5b5061034e610554366004615135565b610f99565b34801561056557600080fd5b50610579610574366004614fb8565b611196565b604051610372919061530d565b34801561059257600080fd5b5061034e6105a13660046150ed565b6111ab565b3480156105b257600080fd5b506105bb611274565b604051610372959493929190615559565b3480156105d857600080fd5b5061043061129d565b3480156105ed57600080fd5b506103656112b9565b34801561060257600080fd5b506103656106113660046151e8565b6112bf565b34801561062257600080fd5b5061034e610631366004614fb8565b6113f8565b34801561064257600080fd5b506103656114ad565b34801561065757600080fd5b506106606114b3565b604051610372919061559d565b34801561067957600080fd5b5061034e610688366004614fb8565b6114bf565b34801561069957600080fd5b50610430611581565b3480156106ae57600080fd5b5061034e6106bd366004615013565b61159d565b3480156106ce57600080fd5b5061034e6106dd36600461518a565b6115af565b3480156106ee57600080fd5b50610365611629565b61034e610705366004614fd3565b61162f565b34801561071657600080fd5b5061036561187f565b34801561072b57600080fd5b5061034e61073a366004615090565b611885565b34801561074b57600080fd5b5061036561199a565b34801561076057600080fd5b506103656119a0565b34801561077557600080fd5b5061034e610784366004615090565b6119be565b34801561079557600080fd5b5061034e6107a4366004615090565b6119fe565b3480156107b557600080fd5b506105796107c4366004614fb8565b611a08565b3480156107d557600080fd5b506103656107e4366004615090565b611a1d565b3480156107f557600080fd5b50610365610804366004615090565b611aa8565b34801561081557600080fd5b5061081e611aba565b60405161037291906152b4565b34801561083757600080fd5b50610660611b29565b34801561084c57600080fd5b5061034e611b35565b34801561086157600080fd5b5061045d610870366004615119565b611b4f565b34801561088157600080fd5b50610660611c9f565b34801561089657600080fd5b506103656108a53660046150a8565b611cb3565b3480156108b657600080fd5b50610430611d50565b3480156108cb57600080fd5b506103656108da366004614fb8565b611d6c565b3480156108eb57600080fd5b5061045d6108fa366004615013565b611d7e565b34801561090b57600080fd5b5061034e61091a366004614fb8565b611dbf565b34801561092b57600080fd5b5061034e61093a366004615090565b611e62565b61094761208f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff16610987576109876109826001836120b2565b612154565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb90610a02908390615215565b60405180910390a150565b600c5460009081610a2582600163ffffffff61215c16565b6000818152601660205260409020600101549091508015610a4d57610a4d610982838361217b565b610a55612198565b610a5d61220b565b600084815260166020526040902055610a74614ea0565b50600083815260166020908152604091829020825160a08101845281548082526001830154938201849052600283015482860181905260038401546060840181905260049094015460808401529451919488947fbb4a26fa0ace13ee4da343896c20eaa44a618fb9071fdd8c2e2c960a4583189d94610af6949193929161551b565b60405180910390a2610b066122af565b6020810151610b4d57805160405185917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b291610b4491600091615363565b60405180910390a25b6020015193505050505b90565b6000610b6461129d565b73ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610b9c9190615215565b60206040518083038186803b158015610bb457600080fd5b505afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bec9190810190615172565b90505b919050565b601560209081526000928352604080842090915290825290208054600182015460029092015490919083565b33610c29614ecf565b73ffffffffffffffffffffffffffffffffffffffff821660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610c76906122f2565b90506000610ca882602001516bffffffffffffffffffffffff1683604001516bffffffffffffffffffffffff16612398565b905080841115610cbf57610cbf61098285836123ae565b73ffffffffffffffffffffffffffffffffffffffff831660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc60205260409020610d0d90856123cb565b610d1561129d565b73ffffffffffffffffffffffffffffffffffffffff16639470b0bd84866040518363ffffffff1660e01b8152600401610d4f92919061528e565b600060405180830381600087803b158015610d6957600080fd5b505af1158015610d7d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd85604051610dc79190615318565b60405180910390a250505050565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b60185473ffffffffffffffffffffffffffffffffffffffff1690565b610e28614ecf565b6000828152600760205260409020610bec906122f2565b610e47612452565b610e5081612499565b50565b610e5b614ecf565b610ea960056000846001811115610e6e57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff8816825290925290206122f2565b90505b92915050565b610eba614eef565b506000908152601560209081526040808320600c548452825291829020825160608101845281548152600182015492810192909252600201549181019190915290565b60028181548110610f0a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f39614f10565b506000908152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff169082015290565b600d5481565b3381610fa55750611191565b6000610fb46020860186615119565b6001811115610fbf57fe5b148015610fe357506000610fd66020850185615119565b6001811115610fe157fe5b145b15610fee5750611191565b6001610ffd6020860186615119565b600181111561100857fe5b141561101d5761101d846020013582846125ca565b600161102c6020850185615119565b600181111561103757fe5b141561104c5761104c83602001358284612663565b600060058161105e6020880188615119565b600181111561106957fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff86168252835290812092509060059082906110b390880188615119565b60018111156110be57fe5b60ff1681526020808201929092526040908101600090812073ffffffffffffffffffffffffffffffffffffffff87168252909252902090506111018282866126fc565b60208086013590870180359073ffffffffffffffffffffffffffffffffffffffff8616907f7d3ad1dcf03b9027064d1d9a474a69e0cecc31324c541d3eb9b5e6fa2f106c8d908890611153908c615119565b600181111561115e57fe5b61116b60208c018c615119565b600181111561117657fe5b60405161118593929190615584565b60405180910390a45050505b505050565b60106020526000908152604090205460ff1681565b816111b5816127f5565b6000838152600a602052604090205474010000000000000000000000000000000000000000900463ffffffff166111ed84828561282e565b6000848152600a60205260409081902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8716021790555184907f8ea2a7a959bd25f226b7b0a4393613f7fdcaa8404e8bad96aa52dc1c1459016790610dc790849087906155ae565b601154601254601354601454929363ffffffff9283169391928281169264010000000090041690565b60195473ffffffffffffffffffffffffffffffffffffffff1690565b60115481565b60085460009033906112d890600163ffffffff61287516565b600881905591506112ed82620f42408661282e565b6112f5614f10565b5060408051808201825273ffffffffffffffffffffffffffffffffffffffff838116825263ffffffff87811660208085019182526000888152600a9091528590208451815492517fffffffffffffffffffffffff00000000000000000000000000000000000000009093169416939093177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000919092160217905590517fcec6fc86ea644053f6edff1160dfe3fa5c61e7a5ef9f873f145bb03a0bd319e7906113d990859085908990615321565b60405180910390a183156113f0576113f0836119be565b505092915050565b611400612452565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166114395761143961098282612891565b60005b6002548110156114a9578173ffffffffffffffffffffffffffffffffffffffff166002828154811061146a57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156114a15761149c8282612930565b6114a9565b60010161143c565b5050565b600c5481565b60145463ffffffff1681565b6114c761208f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526010602052604090205460ff1615611503576115036109826000836120b2565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601060205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e190610a02908390615215565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6115a5612452565b6114a98282612930565b6115b761208f565b6115c48585858585612b7f565b3073ffffffffffffffffffffffffffffffffffffffff1663c6f3a4276040518163ffffffff1660e01b815260040160006040518083038186803b15801561160a57600080fd5b505afa15801561161e573d6000803e3d6000fd5b505050505050505050565b60135481565b3360009081526010602052604090205460ff166116525761165261098233612c42565b61165b81612c5d565b3461173557611668610e04565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff1660e01b81526004016116a49392919061525d565b602060405180830381600087803b1580156116be57600080fd5b505af11580156116d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f69190810190615074565b611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061543b565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260096020526040902054806117665750611191565b600061177182610e20565b602001516bffffffffffffffffffffffff169050601354811015611796575050611191565b600c54600083815260156020908152604080832084845282528083206016909252909120815480611845576000806117ce8888612c7e565b6002870182905560018701819055600386015491935091506117f6908263ffffffff61287516565b60038501556001808501546118109163ffffffff61287516565b6001850155604051889087907f14b098103235344975b17508c2391721cc9ac3f3fa2b56c7ff46f8480dfd074f90600090a350505b611855818863ffffffff61287516565b8355600282015461186c908863ffffffff61287516565b8260020181905550505050505050505050565b60085481565b3361188e61129d565b73ffffffffffffffffffffffffffffffffffffffff166315cc36f282846040518363ffffffff1660e01b81526004016118c892919061528e565b600060405180830381600087803b1580156118e257600080fd5b505af11580156118f6573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff811660009081527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc602052604090206119489083612d0a565b8073ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a8360405161198e9190615318565b60405180910390a25050565b60175481565b60006119b9601154600d5461287590919063ffffffff16565b905090565b3360008181526009602052604080822084905551839183917f5640833634fce74eb9211d1209a91dd5a1c8c6a751696bff9323b4db67f815139190a35050565b610e508133612d74565b60016020526000908152604090205460ff1681565b6000611a27614f10565b506000828152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611a8b85612f4c565b91509150611a9e83602001518383613009565b5095945050505050565b600b6020526000908152604090205481565b60606002805480602002602001604051908101604052809291908181526020018280548015611b1f57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611af4575b5050505050905090565b60125463ffffffff1681565b611b3d61208f565b611b4561304a565b611b4d61305d565b565b611b57614ecf565b60016000526004602052611b8a7fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056122f2565b90506000826001811115611b9a57fe5b1415610bef576000611baa61129d565b73ffffffffffffffffffffffffffffffffffffffff16639706e0c06040518163ffffffff1660e01b815260040160206040518083038186803b158015611bef57600080fd5b505afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c279190810190615172565b9050611c56611c5183602001516bffffffffffffffffffffffff168361215c90919063ffffffff16565b613088565b6bffffffffffffffffffffffff90811660208401526040830151611c8691611c519184911663ffffffff61215c16565b6bffffffffffffffffffffffff16604083015250919050565b601454640100000000900463ffffffff1681565b6000611cbd614f10565b506000838152600a6020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900463ffffffff16918101919091529080611d2186612f4c565b915091506000611d3684602001518484613009565b915050611d45878783856130ac565b979650505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60096020526000908152604090205481565b611d86614ecf565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208584529091529020610ea9906122f2565b611dc7612452565b73ffffffffffffffffffffffffffffffffffffffff8116611df257611ded6109826131f9565b610e50565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b600c546000611e7882600163ffffffff61215c16565b9050611e82614ea0565b50600081815260166020908152604091829020825160a08101845281548152600182015492810183905260028201549381019390935260038101546060840152600401546080830152611ed757505050610e50565b611edf614eef565b5060008481526015602090815260408083208584528252918290208251606081018452815480825260018301549382019390935260029091015492810192909252611f2d5750505050610e50565b6000858152601560209081526040808320868452909152812081815560018101829055600201819055611f608284613230565b9050600080611f74888486604001516132a5565b9150915087877ff1116b309178aa62dcb6bf8c3b8bc2321724907c7ebf52192d14c8ce3aa9194c8484604051611fab929190615363565b60405180910390a36000611fc5838363ffffffff61287516565b6080870151909150611fdd908263ffffffff61287516565b6080870181905260008881526016602090815260409091206004019190915586015161201090600163ffffffff61215c16565b602080880182815260008a815260169092526040909120600101919091555161161e576080860151865188917fb463d19ecf455be65365092cf8e1db6934a0334cf8cd532ddf9964d01f36b5b29161206e908263ffffffff61215c16565b60405161207c929190615363565b60405180910390a2505050505050505050565b3360009081526001602052604090205460ff16611b4d57611b4d610982336133f5565b606063b9588e4360e01b83836040516024016120cf9291906153ab565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b6000828211156121755761217561098260028585613410565b50900390565b606063614b800a60e01b83836040516024016120cf929190615363565b30318015610e50576121a8610e04565b73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121ef57600080fd5b505af1158015612203573d6000803e3d6000fd5b505050505050565b60006119b960175461221b610e04565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122539190615215565b60206040518083038186803b15801561226b57600080fd5b505afa15801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122a39190810190615172565b9063ffffffff61215c16565b4260006122ba6119a0565b9050818111156122d1576122d161098282846134b5565b600c546000906122e890600163ffffffff61287516565b600c555050600d55565b6122fa614ecf565b5060408051606081018252825467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811660208501527401000000000000000000000000000000000000000090920490911692820192909252600c5490918111156123925761236d816134d2565b67ffffffffffffffff16825260408201516bffffffffffffffffffffffff1660208301525b50919050565b60008183106123a75781610ea9565b5090919050565b60606384c8b7c960e01b83836040516024016120cf929190615363565b6123d3614ecf565b6123dc836122f2565b9050612406611c518383604001516bffffffffffffffffffffffff1661215c90919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243591611c5191168463ffffffff61215c16565b6bffffffffffffffffffffffff16602082015261119183826134f2565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b4d57600054611b4d9061098290339073ffffffffffffffffffffffffffffffffffffffff166135ac565b73ffffffffffffffffffffffffffffffffffffffff81166124bf576124bf6109826135c9565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156124f9576124f961098282613600565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b6125d38361361b565b6125dd8383612d74565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126179082613652565b600083815260076020526040902061262f9082613652565b600160005260046020526111917fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0582613652565b61266c8361361b565b6126768383612d74565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020908152604080832086845290915290206126b090826136aa565b60008381526007602052604090206126c890826136aa565b600160005260046020526111917fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05826136aa565b61270683836136e5565b1561271057611191565b612718614ecf565b612721846122f2565b905061272b614ecf565b612734846122f2565b905081604001516bffffffffffffffffffffffff1683111561276f5761276f6109828484604001516bffffffffffffffffffffffff166123ae565b604082015161279690611c51906bffffffffffffffffffffffff168563ffffffff61215c16565b6bffffffffffffffffffffffff9081166040808501919091528201516127c791611c5191168563ffffffff61287516565b6bffffffffffffffffffffffff1660408201526127e485836134f2565b6127ee84826134f2565b5050505050565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146114a9576114a961098233846136ec565b620f424063ffffffff821611156128535761284e61098260008584613709565b611191565b8163ffffffff168163ffffffff16106111915761119161098260018584613709565b600082820183811015610ea957610ea961098260008686613410565b606063eb5108a260e01b826040516024016128ac9190615215565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166129695761296961098283612891565b60025481106129845761298461098282600280549050613728565b8173ffffffffffffffffffffffffffffffffffffffff16600282815481106129a857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614612a0a57612a0a610982600283815481106129e257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1684613745565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612a8557fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612ab857fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190612b379082614f27565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60118590556012805463ffffffff8087167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000092831617909255601385905560148054848416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9487169190931617929092161790556040517f613157dbb0e920deab8ad6ddd3805e87cbf57344b9fe780f1764790ec789754290612c339087908790879087908790615559565b60405180910390a15050505050565b606063b56d2df060e01b826040516024016128ac9190615215565b803414158015612c6c57503415155b15610e5057610e506109828234613762565b6000828152600a602052604081205481908190612cb19073ffffffffffffffffffffffffffffffffffffffff1686611d7e565b602001516bffffffffffffffffffffffff169050612cd5848263ffffffff61215c16565b601254909350612d0090612cf39063ffffffff16620f42408661377f565b829063ffffffff61287516565b9150509250929050565b612d12614ecf565b612d1b836122f2565b9050612d45611c518383604001516bffffffffffffffffffffffff1661287590919063ffffffff16565b6bffffffffffffffffffffffff9081166040830152602082015161243591611c5191168463ffffffff61287516565b612d7d826137a1565b6000612d8c83836000806130ac565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602090815260408083208784529091529020909150612dc8906122f2565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320888452825291829020845181549286015195909301517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921667ffffffffffffffff909316929092177fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff16680100000000000000006bffffffffffffffffffffffff95861602179092167401000000000000000000000000000000000000000093909216929092021790558015612f4357612ead8382613815565b612eb5610e04565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612eef92919061528e565b602060405180830381600087803b158015612f0957600080fd5b505af1158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f419190810190615074565b505b6111918361385d565b6000806000612f676001600c5461215c90919063ffffffff16565b9050612f71614eef565b50600084815260156020908152604080832084845282528083208151606080820184528254825260018084015483870152600293840154838601528787526016865295849020845160a0810186528154815296810154958701959095529184015492850192909252600383015490840152600490910154608083015290612ff9908290613230565b9350806040015192505050915091565b6000808261301957839150613042565b61302d63ffffffff8616620f42408661386a565b915061303f848363ffffffff61215c16565b90505b935093915050565b6130526138a0565b42600d556001600c55565b6130656138b5565b620d2f00620dbba068056bc75e2d63100000600260036127ee8585858585612b7f565b806bffffffffffffffffffffffff81168114610bef57610bef61098260028461391a565b600c546000906130ba614ecf565b5073ffffffffffffffffffffffffffffffffffffffff851660009081526006602090815260408083208984528252918290208251606081018452905467ffffffffffffffff81168083526bffffffffffffffffffffffff680100000000000000008304811694840194909452740100000000000000000000000000000000000000009091049092169281019290925282141561315b576000925050506131f1565b61316781838787613937565b815190935060009061318a9067ffffffffffffffff16600163ffffffff61287516565b90506131c86131bb8984602001516bffffffffffffffffffffffff16856000015167ffffffffffffffff16856139ba565b859063ffffffff61287516565b93506131eb6131bb8984604001516bffffffffffffffffffffffff1684876139ba565b93505050505b949350505050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b815160009061323e57610eac565b8151835160408401516020860151606086015160145461327495949392919063ffffffff80821691640100000000900416613a53565b608083015183519192506000916132909163ffffffff61215c16565b90508181101561329e578091505b5092915050565b6000806132b0614f10565b506000858152600a602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000900463ffffffff16908201819052613314908686613009565b909350915082156133d157613327610e04565b81516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092169163a9059cbb9161337d91879060040161528e565b602060405180830381600087803b15801561339757600080fd5b505af11580156133ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133cf9190810190615074565b505b81156133ec576133e18683613b16565b6133ec868386613b57565b50935093915050565b606063b65a25b960e01b826040516024016128ac9190615215565b606063e946c1bb60e01b84848460405160240161342f93929190615371565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063a6bcde4760e01b83836040516024016120cf929190615363565b8067ffffffffffffffff81168114610bef57610bef61098260018461391a565b8051825460408301516020909301516bffffffffffffffffffffffff90811668010000000000000000027fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff91909416740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff9094167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931692909217929092161716179055565b6060631de45ad160e01b83836040516024016120cf929190615236565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016128ac9190615215565b6000818152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff16610e5057610e50610982826000613c40565b61365a614ecf565b613663836122f2565b905061368d611c518383604001516bffffffffffffffffffffffff1661215c90919063ffffffff16565b6bffffffffffffffffffffffff16604082015261119183826134f2565b6136b2614ecf565b6136bb836122f2565b905061368d611c518383604001516bffffffffffffffffffffffff1661287590919063ffffffff16565b1460011690565b60606382ded78560e01b83836040516024016120cf92919061528e565b60606322df959760e01b84848460405160240161342f939291906153dd565b606063e9f8377160e01b83836040516024016120cf929190615363565b606063140a84db60e01b83836040516024016120cf929190615236565b60606331d7a50560e01b83836040516024016120cf929190615363565b60006131f183613795868563ffffffff613c5d16565b9063ffffffff613c8e16565b600c546000906137b890600163ffffffff61215c16565b90506137c2614eef565b506000828152601560209081526040808320848452825291829020825160608101845281548082526001830154938201939093526002909101549281019290925215611191576111916109828484613cb8565b6000828152600b6020526040902054613834908263ffffffff61215c16565b6000838152600b6020526040902055601754613856908263ffffffff61215c16565b6017555050565b610e508160006001613b57565b60006131f18361379561388482600163ffffffff61215c16565b613894888763ffffffff613c5d16565b9063ffffffff61287516565b600d5415611b4d57611b4d6109826000613cd5565b601154158015906138cd575060125463ffffffff1615155b80156138da575060135415155b80156138ed575060145463ffffffff1615155b80156139085750601454640100000000900463ffffffff1615155b15611b4d57611b4d6109826001613cd5565b606063c996af7b60e01b83836040516024016120cf929190615393565b6000821580613944575081155b15613951575060006131f1565b600061396485600163ffffffff61215c16565b865167ffffffffffffffff161015613980578560400151613986565b85602001515b6bffffffffffffffffffffffff169050806139a55760009150506131f1565b6139b084848361377f565b9695505050505050565b60008315806139c857508183145b156139d5575060006131f1565b818310613a0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c90615404565b613a16614f4b565b613a208685613d14565b9050613a2a614f4b565b613a348785613d14565b9050611d4581600001518260200151846000015185602001518a613e32565b600080613a608888613ebe565b90506000613a6e8787613ebe565b9050811580613a7b575080155b15613a8c575060009150611d459050565b600081831315613aa557613aa08284613f10565b613aaf565b613aaf8383613f10565b9050613ad8613ad3613ac083613f2f565b8863ffffffff168863ffffffff166145d1565b6145e0565b905081831315613af157613aec8282613f10565b613afb565b613afb8282614bca565b9050613b07818c614bf6565b9b9a5050505050505050505050565b6000828152600b6020526040902054613b35908263ffffffff61287516565b6000838152600b6020526040902055601754613856908263ffffffff61287516565b6000838152600f6020526040902054600c5480821415613b78575050611191565b613b80614f4b565b506000858152600e602090815260408083208584528252918290208251808401909352805483526001015490820152613bb7614f4b565b613bc082614c38565b15613bf957613bd9826000015183602001518888614c41565b60208301819052818352613bed9190614ca3565b60208301528152613c04565b602081018590528581525b6000878152600e6020908152604080832086845282528083208451815593820151600190940193909355978152600f9097529095205550505050565b6060639ae94f0160e01b83836040516024016120cf929190615353565b600082613c6c57506000610eac565b82820282848281613c7957fe5b0414610ea957610ea961098260018686613410565b600081613ca457613ca461098260038585613410565b6000828481613caf57fe5b04949350505050565b6060635caa0b0560e01b83836040516024016120cf929190615363565b60607f0b02d77300000000000000000000000000000000000000000000000000000000826001811115613d0457fe5b6040516024016128ac91906155c5565b613d1c614f4b565b506000828152600e602090815260408083208484528252918290208251808401909352805483526001015490820152613d5481614c38565b15613d5e57610eac565b6000613d7183600163ffffffff61215c16565b6000858152600e60209081526040808320848452825291829020825180840190935280548352600101549082015292509050613dac82614c38565b15613db75750610eac565b6000848152600f602052604090205483811015613e14576000858152600e6020908152604080832084845282529182902082518084019093528054835260010154908201529250613e0783614c38565b15613e145750610eac9050565b50506040805180820190915260008152600160208201529392505050565b600081613e4157506000613eb5565b83613e6157613e5a85613795848963ffffffff613c5d16565b9050613eb5565b6000613e86613e76868863ffffffff613c5d16565b6122a3898763ffffffff613c5d16565b90506000613e9a828663ffffffff613c8e16565b9050613eb087613795868463ffffffff613c5d16565b925050505b95945050505050565b600080831215613ed657613ed6610982600185614ccc565b6000821215613eed57613eed610982600184614ccc565b610ea9613f0a846f80000000000000000000000000000000614d0d565b83614d3f565b6000610ea9613f0a846f80000000000000000000000000000000614d0d565b60006f80000000000000000000000000000000821315613f5757613f57610982600184614dc0565b60008213613f6d57613f6d610982600084614dc0565b6f80000000000000000000000000000000821415613f8d57506000610bef565b640733048c5a8213613fc057507fffffffffffffffffffffffffffffffe010000000000000000000000000000000610bef565b60008060006a01c8464f76164760000000851361401f577ffffffffffffffffffffffffffffffff000000000000000000000000000000000909301926a01c8464f761647600000006f8000000000000000000000000000000086020594505b6cf1aaddd7742e90000000000000851361407d577ffffffffffffffffffffffffffffffff800000000000000000000000000000000909301926cf1aaddd7742e900000000000006f8000000000000000000000000000000086020594505b6e0afe10820813d7800000000000000085136140df577ffffffffffffffffffffffffffffffffc00000000000000000000000000000000909301926e0afe10820813d780000000000000006f8000000000000000000000000000000086020594505b6f02582ab704279ec000000000000000008513614143577ffffffffffffffffffffffffffffffffe00000000000000000000000000000000909301926f02582ab704279ec000000000000000006f8000000000000000000000000000000086020594505b6f1152aaa3bf81cc00000000000000000085136141a7577fffffffffffffffffffffffffffffffff00000000000000000000000000000000909301926f1152aaa3bf81cc0000000000000000006f8000000000000000000000000000000086020594505b6f2f16ac6c59de70000000000000000000851361420b577fffffffffffffffffffffffffffffffff80000000000000000000000000000000909301926f2f16ac6c59de700000000000000000006f8000000000000000000000000000000086020594505b6f4da2cbf1be5828000000000000000000851361426f577fffffffffffffffffffffffffffffffffc0000000000000000000000000000000909301926f4da2cbf1be58280000000000000000006f8000000000000000000000000000000086020594505b6f63afbe7ab2082c00000000000000000085136142d3577fffffffffffffffffffffffffffffffffe0000000000000000000000000000000909301926f63afbe7ab2082c0000000000000000006f8000000000000000000000000000000086020594505b6f70f5a893b608861e1f58934f97aea57d8513614337577ffffffffffffffffffffffffffffffffff0000000000000000000000000000000909301926f70f5a893b608861e1f58934f97aea57d6f8000000000000000000000000000000086020594505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000850192508291506f80000000000000000000000000000000828002059050700100000000000000000000000000000000838103830205840193506f80000000000000000000000000000000818302816143ad57fe5b059150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa038302816143de57fe5b05840193506f80000000000000000000000000000000818302816143fe57fe5b059150700300000000000000000000000000000000836f999999999999999999999999999999990383028161442f57fe5b05840193506f800000000000000000000000000000008183028161444f57fe5b059150700400000000000000000000000000000000836f924924924924924924924924924924920383028161448057fe5b05840193506f80000000000000000000000000000000818302816144a057fe5b059150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e038302816144d157fe5b05840193506f80000000000000000000000000000000818302816144f157fe5b059150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161452257fe5b05840193506f800000000000000000000000000000008183028161454257fe5b059150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d890383028161457357fe5b05840193506f800000000000000000000000000000008183028161459357fe5b059150700800000000000000000000000000000000836f88888888888888888888888888888888038302816145c457fe5b0584019350505050919050565b60006131f1613f0a8585614d0d565b60007fffffffffffffffffffffffffffffffe01000000000000000000000000000000082121561461257506000610bef565b8161462e57506f80000000000000000000000000000000610bef565b600082131561464557614645610982600184614dc0565b6f800000000000000000000000000000006f1000000000000000000000000000000083078080028290056710e1b3be415a0000810293909301929091818302059050806705a0913f6b1e000002830192506f80000000000000000000000000000000828202816146b157fe5b05905080670168244fdac7800002830192506f80000000000000000000000000000000828202816146de57fe5b05905080664807432bc1800002830192506f800000000000000000000000000000008282028161470a57fe5b05905080660c0135dca0400002830192506f800000000000000000000000000000008282028161473657fe5b059050806601b707b1cdc00002830192506f800000000000000000000000000000008282028161476257fe5b059050806536e0f639b80002830192506f800000000000000000000000000000008282028161478d57fe5b05905080650618fee9f80002830192506f80000000000000000000000000000000828202816147b857fe5b05905080649c197dcc0002830192506f80000000000000000000000000000000828202816147e257fe5b05905080640e30dce40002830192506f800000000000000000000000000000008282028161480c57fe5b0590508064012ebd130002830192506f800000000000000000000000000000008282028161483657fe5b059050806317499f0002830192506f800000000000000000000000000000008282028161485f57fe5b059050806301a9d48002830192506f800000000000000000000000000000008282028161488857fe5b05905080621c638002830192506f80000000000000000000000000000000828202816148b057fe5b059050806201c63802830192506f80000000000000000000000000000000828202816148d857fe5b05905080611ab802830192506f80000000000000000000000000000000828202816148ff57fe5b0590508061017c02830192506f800000000000000000000000000000008282028161492657fe5b05905080601402830192506f800000000000000000000000000000008282028161494c57fe5b600095909503946721c3677c82b400009190059384010582016f80000000000000000000000000000000019290507010000000000000000000000000000000008416156149bb577243cbaf42a000812488fc5c220ad7b97bf6e99e6cf1aaddd7742e56d32fb9f9974484020592505b7008000000000000000000000000000000008416156149fd577105d27a9f51c31b7c2f8038212a05747799916e0afe10820813d65dfe6a33c07f738f84020592505b700400000000000000000000000000000000841615614a3f57701b4c902e273a58678d6d3bfdb93db96d026f02582ab704279e8efd15e0265855c47a84020592505b700200000000000000000000000000000000841615614a81577003b1cc971a9bb5b9867477440d6d1577506f1152aaa3bf81cb9fdb76eae12d02957184020592505b700100000000000000000000000000000000841615614ac35770015bf0a8b1457695355fb8ac404e7a79e36f2f16ac6c59de6f8d5d6f63c1482a7c8684020592505b6f80000000000000000000000000000000841615614b03576fd3094c70f034de4b96ff7d5b6f99fcd86f4da2cbf1be5827f9eb3ad1aa9866ebb384020592505b6f40000000000000000000000000000000841615614b43576fa45af1e1f40c333b3de1db4dd55f29a76f63afbe7ab2082ba1a0ae5e4eb1b479dc84020592505b6f20000000000000000000000000000000841615614b83576f910b022db7ae67ce76b441c27035c6a16f70f5a893b608861e1f58934f97aea57d84020592505b6f10000000000000000000000000000000841615614bc3576f88415abbe9a76bead8d00cf112e4d4a86f783eafef1c0a8f3978c7f81824d62ebf84020592505b5050919050565b60006f80000000000000000000000000000000614be78484614d0d565b81614bee57fe5b059392505050565b600080821215614c0e57614c0e610982600184614ccc565b6000614c1a8484614d0d565b905060008113614c2e576000915050610eac565b607f1c9392505050565b60200151151590565b60008085614c53575082905081614c9a565b83614c62575084905083614c9a565b614c85614c75858763ffffffff613c5d16565b613894888663ffffffff613c5d16565b9150614c97858463ffffffff613c5d16565b90505b94509492505050565b600080614cc184846f80000000000000000000000000000000614def565b915091509250929050565b60607fbd79545f00000000000000000000000000000000000000000000000000000000836001811115614cfb57fe5b836040516024016120cf9291906155d3565b600082614d1c57506000610eac565b5081810281838281614d2a57fe5b0514610eac57610eac61098260018585614e5d565b600081614d5557614d5561098260028585614e5d565b7f800000000000000000000000000000000000000000000000000000000000000083148015614da35750817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b15614db757614db761098260038585614e5d565b818381614bee57fe5b60607fed2f26a100000000000000000000000000000000000000000000000000000000836001811115614cfb57fe5b60008082851180614dff57508284115b15614e5457600084861015614e145784614e16565b855b9050614e28818563ffffffff613c8e16565b9050614e3a868263ffffffff613c8e16565b9250614e4c858263ffffffff613c8e16565b915050613042565b50929391925050565b60607f8c12dfe700000000000000000000000000000000000000000000000000000000846003811115614e8c57fe5b848460405160240161342f939291906155e6565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b81548183558181111561119157600083815260209020611191918101908301614f65565b604051806040016040528060008152602001600081525090565b610b5791905b80821115614f7f5760008155600101614f6b565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114610eac57600080fd5b600060408284031215612392578081fd5b600060208284031215614fc9578081fd5b610ea98383614f83565b600080600060608486031215614fe7578182fd5b8335614ff28161560b565b925060208401356150028161560b565b929592945050506040919091013590565b60008060408385031215615025578182fd5b61502f8484614f83565b946020939093013593505050565b6000806040838503121561504f578182fd5b6150598484614f83565b915060208301356150698161563b565b809150509250929050565b600060208284031215615085578081fd5b8151610ea98161562d565b6000602082840312156150a1578081fd5b5035919050565b600080604083850312156150ba578182fd5b8235915060208301356150698161560b565b600080604083850312156150de578182fd5b50508035926020909101359150565b600080604083850312156150ff578182fd5b82359150602083013563ffffffff81168114615069578182fd5b60006020828403121561512a578081fd5b8135610ea98161563b565b600080600060a08486031215615149578283fd5b6151538585614fa7565b92506151628560408601614fa7565b9150608084013590509250925092565b600060208284031215615183578081fd5b5051919050565b600080600080600060a086880312156151a1578283fd5b8535945060208601356151b381615648565b93506040860135925060608601356151ca81615648565b915060808601356151da81615648565b809150509295509295909350565b600080604083850312156151fa578182fd5b823561520581615648565b915060208301356150698161562d565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000918401906040840190835b8181101561530257835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016152ce565b509095945050505050565b901515815260200190565b90815260200190565b92835273ffffffffffffffffffffffffffffffffffffffff91909116602083015263ffffffff16604082015260600190565b9182521515602082015260400190565b918252602082015260400190565b606081016004851061537f57fe5b938152602081019290925260409091015290565b60408101600384106153a157fe5b9281526020015290565b604081016153b884615601565b92815273ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b606081016153ea85615601565b938152602081019290925263ffffffff1660409091015290565b60208082526013908201527f43525f494e54455256414c5f494e56414c494400000000000000000000000000604082015260600190565b60208082526014908201527f574554485f5452414e534645525f4641494c4544000000000000000000000000604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b815173ffffffffffffffffffffffffffffffffffffffff16815260209182015163ffffffff169181019190915260400190565b815167ffffffffffffffff1681526020808301516bffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b94855263ffffffff938416602086015260408501929092528216606084015216608082015260a00190565b92835260ff918216602084015216604082015260600190565b63ffffffff91909116815260200190565b63ffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60ff929092168252602082015260400190565b60ff9390931683526020830191909152604082015260600190565b60028110610e5057fe5b73ffffffffffffffffffffffffffffffffffffffff81168114610e5057600080fd5b8015158114610e5057600080fd5b60028110610e5057600080fd5b63ffffffff81168114610e5057600080fdfea365627a7a72315820405f679c9973463d3088bfe457347d17202e3319adf7067235fc4905ae0f29646c6578706572696d656e74616cf564736f6c634300050c0040",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x329 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x1A5 JUMPI DUP1 PUSH4 0xBB7EF7E0 GT PUSH2 0xEC JUMPI DUP1 PUSH4 0xE8EEB3F8 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xF1876532 GT PUSH2 0x6F JUMPI DUP1 PUSH4 0xF1876532 EQ PUSH2 0x8BF JUMPI DUP1 PUSH4 0xF252B7A1 EQ PUSH2 0x8DF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x8FF JUMPI DUP1 PUSH4 0xFF691B11 EQ PUSH2 0x91F JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xE8EEB3F8 EQ PUSH2 0x875 JUMPI DUP1 PUSH4 0xE907F003 EQ PUSH2 0x88A JUMPI DUP1 PUSH4 0xEE99205C EQ PUSH2 0x8AA JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xE0EE036E GT PUSH2 0xC6 JUMPI DUP1 PUSH4 0xE0EE036E EQ PUSH2 0x82B JUMPI DUP1 PUSH4 0xE1C7392A EQ PUSH2 0x840 JUMPI DUP1 PUSH4 0xE804D0A4 EQ PUSH2 0x855 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xBB7EF7E0 EQ PUSH2 0x7C9 JUMPI DUP1 PUSH4 0xC18C9141 EQ PUSH2 0x7E9 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x809 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xA694FC3A GT PUSH2 0x14E JUMPI DUP1 PUSH4 0xB3E33379 GT PUSH2 0x128 JUMPI DUP1 PUSH4 0xB3E33379 EQ PUSH2 0x769 JUMPI DUP1 PUSH4 0xB510879F EQ PUSH2 0x789 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x7A9 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xA694FC3A EQ PUSH2 0x71F JUMPI DUP1 PUSH4 0xB0531524 EQ PUSH2 0x73F JUMPI DUP1 PUSH4 0xB2BAA33E EQ PUSH2 0x754 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0xA26171E2 GT PUSH2 0x17F JUMPI DUP1 PUSH4 0xA26171E2 EQ PUSH2 0x6E2 JUMPI DUP1 PUSH4 0xA3B4A327 EQ PUSH2 0x6F7 JUMPI DUP1 PUSH4 0xA657E579 EQ PUSH2 0x70A JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x68D JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x6A2 JUMPI DUP1 PUSH4 0x9C3CCC82 EQ PUSH2 0x6C2 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x4BCC3F67 GT PUSH2 0x274 JUMPI DUP1 PUSH4 0x624A7232 GT PUSH2 0x21D JUMPI DUP1 PUSH4 0x70712939 GT PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x616 JUMPI DUP1 PUSH4 0x76671808 EQ PUSH2 0x636 JUMPI DUP1 PUSH4 0x81666796 EQ PUSH2 0x64B JUMPI DUP1 PUSH4 0x8A2E271A EQ PUSH2 0x66D JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x624A7232 EQ PUSH2 0x5CC JUMPI DUP1 PUSH4 0x63403801 EQ PUSH2 0x5E1 JUMPI DUP1 PUSH4 0x68A7D6CD EQ PUSH2 0x5F6 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x5BD4AB73 GT PUSH2 0x24E JUMPI DUP1 PUSH4 0x5BD4AB73 EQ PUSH2 0x559 JUMPI DUP1 PUSH4 0x5D91121D EQ PUSH2 0x586 JUMPI DUP1 PUSH4 0x5E615A6B EQ PUSH2 0x5A6 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x4BCC3F67 EQ PUSH2 0x4F7 JUMPI DUP1 PUSH4 0x587DA023 EQ PUSH2 0x524 JUMPI DUP1 PUSH4 0x58F6C7E3 EQ PUSH2 0x539 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x3C277FC5 GT PUSH2 0x2D6 JUMPI DUP1 PUSH4 0x44A6958B GT PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x44A6958B EQ PUSH2 0x48A JUMPI DUP1 PUSH4 0x46B97959 EQ PUSH2 0x4AA JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x4D7 JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x3C277FC5 EQ PUSH2 0x41B JUMPI DUP1 PUSH4 0x3E4AD732 EQ PUSH2 0x43D JUMPI DUP1 PUSH4 0x42F1181E EQ PUSH2 0x46A JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x2A94C279 GT PUSH2 0x307 JUMPI DUP1 PUSH4 0x2A94C279 EQ PUSH2 0x39B JUMPI DUP1 PUSH4 0x2E17DE78 EQ PUSH2 0x3CA JUMPI DUP1 PUSH4 0x38229D93 EQ PUSH2 0x3EA JUMPI PUSH2 0x329 JUMP JUMPDEST DUP1 PUSH4 0x1E28D84 EQ PUSH2 0x32E JUMPI DUP1 PUSH4 0xB9663DB EQ PUSH2 0x350 JUMPI DUP1 PUSH4 0x1E7FF8F6 EQ PUSH2 0x37B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x349 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x93F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0xA0D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5318 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x387 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x396 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0xB5A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BB PUSH2 0x3B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x50CC JUMP JUMPDEST PUSH2 0xBF4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5505 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x3E5 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xC20 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40A PUSH2 0x405 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xDD5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5536 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x427 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0xE04 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x449 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x458 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xE20 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x54C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x476 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x485 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0xE3F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x496 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x4A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x503D JUMP JUMPDEST PUSH2 0xE53 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4CA PUSH2 0x4C5 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xEB2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5472 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x4F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xEFD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x503 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x517 PUSH2 0x512 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0xF31 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x5493 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x530 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0xF93 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x545 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x554 CALLDATASIZE PUSH1 0x4 PUSH2 0x5135 JUMP JUMPDEST PUSH2 0xF99 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x565 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x579 PUSH2 0x574 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1196 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x530D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x5A1 CALLDATASIZE PUSH1 0x4 PUSH2 0x50ED JUMP JUMPDEST PUSH2 0x11AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5BB PUSH2 0x1274 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5559 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x129D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x12B9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x602 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x611 CALLDATASIZE PUSH1 0x4 PUSH2 0x51E8 JUMP JUMPDEST PUSH2 0x12BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x622 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x631 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x13F8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x642 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x14AD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x657 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x660 PUSH2 0x14B3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x559D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x679 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x688 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x14BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x699 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x1581 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x6BD CALLDATASIZE PUSH1 0x4 PUSH2 0x5013 JUMP JUMPDEST PUSH2 0x159D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x6DD CALLDATASIZE PUSH1 0x4 PUSH2 0x518A JUMP JUMPDEST PUSH2 0x15AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x1629 JUMP JUMPDEST PUSH2 0x34E PUSH2 0x705 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FD3 JUMP JUMPDEST PUSH2 0x162F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x716 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x187F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x73A CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1885 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x74B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x199A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x19A0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x775 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x784 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x19BE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x795 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x7A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x19FE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x579 PUSH2 0x7C4 CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1A08 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x7E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1A1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x804 CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1AA8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x815 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x81E PUSH2 0x1ABA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x372 SWAP2 SWAP1 PUSH2 0x52B4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x837 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x660 PUSH2 0x1B29 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x84C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x1B35 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x861 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x870 CALLDATASIZE PUSH1 0x4 PUSH2 0x5119 JUMP JUMPDEST PUSH2 0x1B4F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x881 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x660 PUSH2 0x1C9F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x8A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x50A8 JUMP JUMPDEST PUSH2 0x1CB3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x430 PUSH2 0x1D50 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x365 PUSH2 0x8DA CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x45D PUSH2 0x8FA CALLDATASIZE PUSH1 0x4 PUSH2 0x5013 JUMP JUMPDEST PUSH2 0x1D7E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x90B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x91A CALLDATASIZE PUSH1 0x4 PUSH2 0x4FB8 JUMP JUMPDEST PUSH2 0x1DBF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x92B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34E PUSH2 0x93A CALLDATASIZE PUSH1 0x4 PUSH2 0x5090 JUMP JUMPDEST PUSH2 0x1E62 JUMP JUMPDEST PUSH2 0x947 PUSH2 0x208F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x987 JUMPI PUSH2 0x987 PUSH2 0x982 PUSH1 0x1 DUP4 PUSH2 0x20B2 JUMP JUMPDEST PUSH2 0x2154 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD PUSH32 0xF50D0D312D501878616EB5E78EBF3ED6DCD3955AAEF8165AF9C6B057CC4832FB SWAP1 PUSH2 0xA02 SWAP1 DUP4 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0xA25 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x1 ADD SLOAD SWAP1 SWAP2 POP DUP1 ISZERO PUSH2 0xA4D JUMPI PUSH2 0xA4D PUSH2 0x982 DUP4 DUP4 PUSH2 0x217B JUMP JUMPDEST PUSH2 0xA55 PUSH2 0x2198 JUMP JUMPDEST PUSH2 0xA5D PUSH2 0x220B JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0xA74 PUSH2 0x4EA0 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0xA0 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP1 DUP3 MSTORE PUSH1 0x1 DUP4 ADD SLOAD SWAP4 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x2 DUP4 ADD SLOAD DUP3 DUP7 ADD DUP2 SWAP1 MSTORE PUSH1 0x3 DUP5 ADD SLOAD PUSH1 0x60 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x4 SWAP1 SWAP5 ADD SLOAD PUSH1 0x80 DUP5 ADD MSTORE SWAP5 MLOAD SWAP2 SWAP5 DUP9 SWAP5 PUSH32 0xBB4A26FA0ACE13EE4DA343896C20EAA44A618FB9071FDD8C2E2C960A4583189D SWAP5 PUSH2 0xAF6 SWAP5 SWAP2 SWAP4 SWAP3 SWAP2 PUSH2 0x551B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0xB06 PUSH2 0x22AF JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH2 0xB4D JUMPI DUP1 MLOAD PUSH1 0x40 MLOAD DUP6 SWAP2 PUSH32 0xB463D19ECF455BE65365092CF8E1DB6934A0334CF8CD532DDF9964D01F36B5B2 SWAP2 PUSH2 0xB44 SWAP2 PUSH1 0x0 SWAP2 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST PUSH1 0x20 ADD MLOAD SWAP4 POP POP POP POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB64 PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB9C SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBC8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xBEC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5172 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 SWAP1 SWAP3 ADD SLOAD SWAP1 SWAP2 SWAP1 DUP4 JUMP JUMPDEST CALLER PUSH2 0xC29 PUSH2 0x4ECF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x5B8CCBB9D4D8FB16EA74CE3C29A41F1B461FBDAFF4714A0D9A8EB05499746BC PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xC76 SWAP1 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xCA8 DUP3 PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2398 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 GT ISZERO PUSH2 0xCBF JUMPI PUSH2 0xCBF PUSH2 0x982 DUP6 DUP4 PUSH2 0x23AE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x5B8CCBB9D4D8FB16EA74CE3C29A41F1B461FBDAFF4714A0D9A8EB05499746BC PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xD0D SWAP1 DUP6 PUSH2 0x23CB JUMP JUMPDEST PUSH2 0xD15 PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9470B0BD DUP5 DUP7 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD4F SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD69 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x85082129D87B2FE11527CB1B3B7A520AEB5AA6913F88A3D8757FE40D1DB02FDD DUP6 PUSH1 0x40 MLOAD PUSH2 0xDC7 SWAP2 SWAP1 PUSH2 0x5318 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x16 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x2 DUP4 ADD SLOAD PUSH1 0x3 DUP5 ADD SLOAD PUSH1 0x4 SWAP1 SWAP5 ADD SLOAD SWAP3 SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 DUP6 JUMP JUMPDEST PUSH1 0x18 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xE28 PUSH2 0x4ECF JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xBEC SWAP1 PUSH2 0x22F2 JUMP JUMPDEST PUSH2 0xE47 PUSH2 0x2452 JUMP JUMPDEST PUSH2 0xE50 DUP2 PUSH2 0x2499 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0xE5B PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0xEA9 PUSH1 0x5 PUSH1 0x0 DUP5 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xE6E JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 DUP2 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP3 MSTORE SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xEBA PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0xC SLOAD DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP2 MSTORE PUSH1 0x1 DUP3 ADD SLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x2 ADD SLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xF0A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH2 0xF39 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP4 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD DUP2 JUMP JUMPDEST CALLER DUP2 PUSH2 0xFA5 JUMPI POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFB4 PUSH1 0x20 DUP7 ADD DUP7 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xFBF JUMPI INVALID JUMPDEST EQ DUP1 ISZERO PUSH2 0xFE3 JUMPI POP PUSH1 0x0 PUSH2 0xFD6 PUSH1 0x20 DUP6 ADD DUP6 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xFE1 JUMPI INVALID JUMPDEST EQ JUMPDEST ISZERO PUSH2 0xFEE JUMPI POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0x1 PUSH2 0xFFD PUSH1 0x20 DUP7 ADD DUP7 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1008 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x101D JUMPI PUSH2 0x101D DUP5 PUSH1 0x20 ADD CALLDATALOAD DUP3 DUP5 PUSH2 0x25CA JUMP JUMPDEST PUSH1 0x1 PUSH2 0x102C PUSH1 0x20 DUP6 ADD DUP6 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1037 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x104C JUMPI PUSH2 0x104C DUP4 PUSH1 0x20 ADD CALLDATALOAD DUP3 DUP5 PUSH2 0x2663 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 DUP2 PUSH2 0x105E PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1069 JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 DUP2 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP3 MSTORE DUP4 MSTORE SWAP1 DUP2 KECCAK256 SWAP3 POP SWAP1 PUSH1 0x5 SWAP1 DUP3 SWAP1 PUSH2 0x10B3 SWAP1 DUP9 ADD DUP9 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x10BE JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 DUP2 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP3 MSTORE SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SWAP1 POP PUSH2 0x1101 DUP3 DUP3 DUP7 PUSH2 0x26FC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP7 ADD CALLDATALOAD SWAP1 DUP8 ADD DUP1 CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH32 0x7D3AD1DCF03B9027064D1D9A474A69E0CECC31324C541D3EB9B5E6FA2F106C8D SWAP1 DUP9 SWAP1 PUSH2 0x1153 SWAP1 DUP13 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x115E JUMPI INVALID JUMPDEST PUSH2 0x116B PUSH1 0x20 DUP13 ADD DUP13 PUSH2 0x5119 JUMP JUMPDEST PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1176 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1185 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5584 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST DUP2 PUSH2 0x11B5 DUP2 PUSH2 0x27F5 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x11ED DUP5 DUP3 DUP6 PUSH2 0x282E JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP8 AND MUL OR SWAP1 SSTORE MLOAD DUP5 SWAP1 PUSH32 0x8EA2A7A959BD25F226B7B0A4393613F7FDCAA8404E8BAD96AA52DC1C14590167 SWAP1 PUSH2 0xDC7 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x55AE JUMP JUMPDEST PUSH1 0x11 SLOAD PUSH1 0x12 SLOAD PUSH1 0x13 SLOAD PUSH1 0x14 SLOAD SWAP3 SWAP4 PUSH4 0xFFFFFFFF SWAP3 DUP4 AND SWAP4 SWAP2 SWAP3 DUP3 DUP2 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x19 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x11 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 CALLER SWAP1 PUSH2 0x12D8 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x8 DUP2 SWAP1 SSTORE SWAP2 POP PUSH2 0x12ED DUP3 PUSH3 0xF4240 DUP7 PUSH2 0x282E JUMP JUMPDEST PUSH2 0x12F5 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND DUP3 MSTORE PUSH4 0xFFFFFFFF DUP8 DUP2 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP2 MSTORE DUP6 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SSTORE SWAP1 MLOAD PUSH32 0xCEC6FC86EA644053F6EDFF1160DFE3FA5C61E7A5EF9F873F145BB03A0BD319E7 SWAP1 PUSH2 0x13D9 SWAP1 DUP6 SWAP1 DUP6 SWAP1 DUP10 SWAP1 PUSH2 0x5321 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 ISZERO PUSH2 0x13F0 JUMPI PUSH2 0x13F0 DUP4 PUSH2 0x19BE JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1400 PUSH2 0x2452 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1439 JUMPI PUSH2 0x1439 PUSH2 0x982 DUP3 PUSH2 0x2891 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x14A9 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x146A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x14A1 JUMPI PUSH2 0x149C DUP3 DUP3 PUSH2 0x2930 JUMP JUMPDEST PUSH2 0x14A9 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x143C JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xC SLOAD DUP2 JUMP JUMPDEST PUSH1 0x14 SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x14C7 PUSH2 0x208F JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1503 JUMPI PUSH2 0x1503 PUSH2 0x982 PUSH1 0x0 DUP4 PUSH2 0x20B2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD PUSH32 0x3E535D1AB441EF41C268FD9B52B478AEE02D693C5CA2A84B5D26B89E0922E5E1 SWAP1 PUSH2 0xA02 SWAP1 DUP4 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x15A5 PUSH2 0x2452 JUMP JUMPDEST PUSH2 0x14A9 DUP3 DUP3 PUSH2 0x2930 JUMP JUMPDEST PUSH2 0x15B7 PUSH2 0x208F JUMP JUMPDEST PUSH2 0x15C4 DUP6 DUP6 DUP6 DUP6 DUP6 PUSH2 0x2B7F JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xC6F3A427 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x160A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x161E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x13 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x10 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1652 JUMPI PUSH2 0x1652 PUSH2 0x982 CALLER PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0x165B DUP2 PUSH2 0x2C5D JUMP JUMPDEST CALLVALUE PUSH2 0x1735 JUMPI PUSH2 0x1668 PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD DUP4 ADDRESS DUP5 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x16A4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x525D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16F6 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5074 JUMP JUMPDEST PUSH2 0x1735 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x172C SWAP1 PUSH2 0x543B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 PUSH2 0x1766 JUMPI POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1771 DUP3 PUSH2 0xE20 JUMP JUMPDEST PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x13 SLOAD DUP2 LT ISZERO PUSH2 0x1796 JUMPI POP POP PUSH2 0x1191 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 PUSH1 0x16 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 DUP2 SLOAD DUP1 PUSH2 0x1845 JUMPI PUSH1 0x0 DUP1 PUSH2 0x17CE DUP9 DUP9 PUSH2 0x2C7E JUMP JUMPDEST PUSH1 0x2 DUP8 ADD DUP3 SWAP1 SSTORE PUSH1 0x1 DUP8 ADD DUP2 SWAP1 SSTORE PUSH1 0x3 DUP7 ADD SLOAD SWAP2 SWAP4 POP SWAP2 POP PUSH2 0x17F6 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x3 DUP6 ADD SSTORE PUSH1 0x1 DUP1 DUP6 ADD SLOAD PUSH2 0x1810 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x1 DUP6 ADD SSTORE PUSH1 0x40 MLOAD DUP9 SWAP1 DUP8 SWAP1 PUSH32 0x14B098103235344975B17508C2391721CC9AC3F3FA2B56C7FF46F8480DFD074F SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMPDEST PUSH2 0x1855 DUP2 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST DUP4 SSTORE PUSH1 0x2 DUP3 ADD SLOAD PUSH2 0x186C SWAP1 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST DUP3 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH2 0x188E PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x15CC36F2 DUP3 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x18C8 SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x18F6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x5B8CCBB9D4D8FB16EA74CE3C29A41F1B461FBDAFF4714A0D9A8EB05499746BC PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1948 SWAP1 DUP4 PUSH2 0x2D0A JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xEBEDB8B3C678666E7F36970BC8F57ABF6D8FA2E828C0DA91EA5B75BF68ED101A DUP4 PUSH1 0x40 MLOAD PUSH2 0x198E SWAP2 SWAP1 PUSH2 0x5318 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x17 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19B9 PUSH1 0x11 SLOAD PUSH1 0xD SLOAD PUSH2 0x2875 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP5 SWAP1 SSTORE MLOAD DUP4 SWAP2 DUP4 SWAP2 PUSH32 0x5640833634FCE74EB9211D1209A91DD5A1C8C6A751696BFF9323B4DB67F81513 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0xE50 DUP2 CALLER PUSH2 0x2D74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A27 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP1 PUSH2 0x1A8B DUP6 PUSH2 0x2F4C JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1A9E DUP4 PUSH1 0x20 ADD MLOAD DUP4 DUP4 PUSH2 0x3009 JUMP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1AF4 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x12 SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1B3D PUSH2 0x208F JUMP JUMPDEST PUSH2 0x1B45 PUSH2 0x304A JUMP JUMPDEST PUSH2 0x1B4D PUSH2 0x305D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B57 PUSH2 0x4ECF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH2 0x1B8A PUSH32 0xABD6E7CB50984FF9C2F3E18A2660C3353DADF4E3291DEEB275DAE2CD1E44FE05 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x1B9A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xBEF JUMPI PUSH1 0x0 PUSH2 0x1BAA PUSH2 0x129D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x9706E0C0 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1C27 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1C56 PUSH2 0x1C51 DUP4 PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x3088 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1C86 SWAP2 PUSH2 0x1C51 SWAP2 DUP5 SWAP2 AND PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP4 ADD MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x14 SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1CBD PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP3 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 DUP1 PUSH2 0x1D21 DUP7 PUSH2 0x2F4C JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH1 0x0 PUSH2 0x1D36 DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP5 PUSH2 0x3009 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1D45 DUP8 DUP8 DUP4 DUP6 PUSH2 0x30AC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x1D86 PUSH2 0x4ECF JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 PUSH2 0xEA9 SWAP1 PUSH2 0x22F2 JUMP JUMPDEST PUSH2 0x1DC7 PUSH2 0x2452 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1DF2 JUMPI PUSH2 0x1DED PUSH2 0x982 PUSH2 0x31F9 JUMP JUMPDEST PUSH2 0xE50 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 CALLER SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 PUSH2 0x1E78 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1E82 PUSH2 0x4EA0 JUMP JUMPDEST POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0xA0 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP2 MSTORE PUSH1 0x1 DUP3 ADD SLOAD SWAP3 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x2 DUP3 ADD SLOAD SWAP4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x3 DUP2 ADD SLOAD PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x4 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x1ED7 JUMPI POP POP POP PUSH2 0xE50 JUMP JUMPDEST PUSH2 0x1EDF PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP1 DUP3 MSTORE PUSH1 0x1 DUP4 ADD SLOAD SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH2 0x1F2D JUMPI POP POP POP POP PUSH2 0xE50 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP2 DUP2 SSTORE PUSH1 0x1 DUP2 ADD DUP3 SWAP1 SSTORE PUSH1 0x2 ADD DUP2 SWAP1 SSTORE PUSH2 0x1F60 DUP3 DUP5 PUSH2 0x3230 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x1F74 DUP9 DUP5 DUP7 PUSH1 0x40 ADD MLOAD PUSH2 0x32A5 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP8 DUP8 PUSH32 0xF1116B309178AA62DCB6BF8C3B8BC2321724907C7EBF52192D14C8CE3AA9194C DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1FAB SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 PUSH2 0x1FC5 DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x80 DUP8 ADD MLOAD SWAP1 SWAP2 POP PUSH2 0x1FDD SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x80 DUP8 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x16 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x4 ADD SWAP2 SWAP1 SWAP2 SSTORE DUP7 ADD MLOAD PUSH2 0x2010 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x20 DUP1 DUP9 ADD DUP3 DUP2 MSTORE PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x16 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 PUSH1 0x1 ADD SWAP2 SWAP1 SWAP2 SSTORE MLOAD PUSH2 0x161E JUMPI PUSH1 0x80 DUP7 ADD MLOAD DUP7 MLOAD DUP9 SWAP2 PUSH32 0xB463D19ECF455BE65365092CF8E1DB6934A0334CF8CD532DDF9964D01F36B5B2 SWAP2 PUSH2 0x206E SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x207C SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1B4D JUMPI PUSH2 0x1B4D PUSH2 0x982 CALLER PUSH2 0x33F5 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB9588E43 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x53AB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2175 JUMPI PUSH2 0x2175 PUSH2 0x982 PUSH1 0x2 DUP6 DUP6 PUSH2 0x3410 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x614B800A PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST ADDRESS BALANCE DUP1 ISZERO PUSH2 0xE50 JUMPI PUSH2 0x21A8 PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2203 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19B9 PUSH1 0x17 SLOAD PUSH2 0x221B PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2253 SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x226B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x227F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x22A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5172 JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST TIMESTAMP PUSH1 0x0 PUSH2 0x22BA PUSH2 0x19A0 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x22D1 JUMPI PUSH2 0x22D1 PUSH2 0x982 DUP3 DUP5 PUSH2 0x34B5 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 PUSH2 0x22E8 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0xC SSTORE POP POP PUSH1 0xD SSTORE JUMP JUMPDEST PUSH2 0x22FA PUSH2 0x4ECF JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP3 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP4 MSTORE PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH9 0x10000000000000000 DUP4 DIV DUP2 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP3 DIV SWAP1 SWAP2 AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0xC SLOAD SWAP1 SWAP2 DUP2 GT ISZERO PUSH2 0x2392 JUMPI PUSH2 0x236D DUP2 PUSH2 0x34D2 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x40 DUP3 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x23A7 JUMPI DUP2 PUSH2 0xEA9 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x84C8B7C9 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH2 0x23D3 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x23DC DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x2406 PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2435 SWAP2 PUSH2 0x1C51 SWAP2 AND DUP5 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1191 DUP4 DUP3 PUSH2 0x34F2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1B4D JUMPI PUSH1 0x0 SLOAD PUSH2 0x1B4D SWAP1 PUSH2 0x982 SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x35AC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x24BF JUMPI PUSH2 0x24BF PUSH2 0x982 PUSH2 0x35C9 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x24F9 JUMPI PUSH2 0x24F9 PUSH2 0x982 DUP3 PUSH2 0x3600 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH2 0x25D3 DUP4 PUSH2 0x361B JUMP JUMPDEST PUSH2 0x25DD DUP4 DUP4 PUSH2 0x2D74 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 PUSH2 0x2617 SWAP1 DUP3 PUSH2 0x3652 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x262F SWAP1 DUP3 PUSH2 0x3652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH2 0x1191 PUSH32 0xABD6E7CB50984FF9C2F3E18A2660C3353DADF4E3291DEEB275DAE2CD1E44FE05 DUP3 PUSH2 0x3652 JUMP JUMPDEST PUSH2 0x266C DUP4 PUSH2 0x361B JUMP JUMPDEST PUSH2 0x2676 DUP4 DUP4 PUSH2 0x2D74 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 PUSH2 0x26B0 SWAP1 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x26C8 SWAP1 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH2 0x1191 PUSH32 0xABD6E7CB50984FF9C2F3E18A2660C3353DADF4E3291DEEB275DAE2CD1E44FE05 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x2706 DUP4 DUP4 PUSH2 0x36E5 JUMP JUMPDEST ISZERO PUSH2 0x2710 JUMPI PUSH2 0x1191 JUMP JUMPDEST PUSH2 0x2718 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x2721 DUP5 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x272B PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x2734 DUP5 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 GT ISZERO PUSH2 0x276F JUMPI PUSH2 0x276F PUSH2 0x982 DUP5 DUP5 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x23AE JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2796 SWAP1 PUSH2 0x1C51 SWAP1 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 ADD MLOAD PUSH2 0x27C7 SWAP2 PUSH2 0x1C51 SWAP2 AND DUP6 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x27E4 DUP6 DUP4 PUSH2 0x34F2 JUMP JUMPDEST PUSH2 0x27EE DUP5 DUP3 PUSH2 0x34F2 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP2 EQ PUSH2 0x14A9 JUMPI PUSH2 0x14A9 PUSH2 0x982 CALLER DUP5 PUSH2 0x36EC JUMP JUMPDEST PUSH3 0xF4240 PUSH4 0xFFFFFFFF DUP3 AND GT ISZERO PUSH2 0x2853 JUMPI PUSH2 0x284E PUSH2 0x982 PUSH1 0x0 DUP6 DUP5 PUSH2 0x3709 JUMP JUMPDEST PUSH2 0x1191 JUMP JUMPDEST DUP2 PUSH4 0xFFFFFFFF AND DUP2 PUSH4 0xFFFFFFFF AND LT PUSH2 0x1191 JUMPI PUSH2 0x1191 PUSH2 0x982 PUSH1 0x1 DUP6 DUP5 PUSH2 0x3709 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xEA9 JUMPI PUSH2 0xEA9 PUSH2 0x982 PUSH1 0x0 DUP7 DUP7 PUSH2 0x3410 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xEB5108A2 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x2969 JUMPI PUSH2 0x2969 PUSH2 0x982 DUP4 PUSH2 0x2891 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0x2984 JUMPI PUSH2 0x2984 PUSH2 0x982 DUP3 PUSH1 0x2 DUP1 SLOAD SWAP1 POP PUSH2 0x3728 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x29A8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x2A0A JUMPI PUSH2 0x2A0A PUSH2 0x982 PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x29E2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0x3745 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2A85 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x2AB8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x2B37 SWAP1 DUP3 PUSH2 0x4F27 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x11 DUP6 SWAP1 SSTORE PUSH1 0x12 DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP8 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x13 DUP6 SWAP1 SSTORE PUSH1 0x14 DUP1 SLOAD DUP5 DUP5 AND PUSH5 0x100000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF SWAP5 DUP8 AND SWAP2 SWAP1 SWAP4 AND OR SWAP3 SWAP1 SWAP3 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x613157DBB0E920DEAB8AD6DDD3805E87CBF57344B9FE780F1764790EC7897542 SWAP1 PUSH2 0x2C33 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH2 0x5559 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB56D2DF0 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST DUP1 CALLVALUE EQ ISZERO DUP1 ISZERO PUSH2 0x2C6C JUMPI POP CALLVALUE ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE50 JUMPI PUSH2 0xE50 PUSH2 0x982 DUP3 CALLVALUE PUSH2 0x3762 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH2 0x2CB1 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH2 0x1D7E JUMP JUMPDEST PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x2CD5 DUP5 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x12 SLOAD SWAP1 SWAP4 POP PUSH2 0x2D00 SWAP1 PUSH2 0x2CF3 SWAP1 PUSH4 0xFFFFFFFF AND PUSH3 0xF4240 DUP7 PUSH2 0x377F JUMP JUMPDEST DUP3 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x2D12 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x2D1B DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x2D45 PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2875 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2435 SWAP2 PUSH2 0x1C51 SWAP2 AND DUP5 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH2 0x2D7D DUP3 PUSH2 0x37A1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D8C DUP4 DUP4 PUSH1 0x0 DUP1 PUSH2 0x30AC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP8 DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH2 0x2DC8 SWAP1 PUSH2 0x22F2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP9 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP3 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP4 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP3 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFF AND PUSH9 0x10000000000000000 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 DUP7 AND MUL OR SWAP1 SWAP3 AND PUSH21 0x10000000000000000000000000000000000000000 SWAP4 SWAP1 SWAP3 AND SWAP3 SWAP1 SWAP3 MUL OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x2F43 JUMPI PUSH2 0x2EAD DUP4 DUP3 PUSH2 0x3815 JUMP JUMPDEST PUSH2 0x2EB5 PUSH2 0xE04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB DUP4 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2EEF SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F1D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x2F41 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5074 JUMP JUMPDEST POP JUMPDEST PUSH2 0x1191 DUP4 PUSH2 0x385D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2F67 PUSH1 0x1 PUSH1 0xC SLOAD PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x2F71 PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP1 DUP3 ADD DUP5 MSTORE DUP3 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 DUP5 ADD SLOAD DUP4 DUP8 ADD MSTORE PUSH1 0x2 SWAP4 DUP5 ADD SLOAD DUP4 DUP7 ADD MSTORE DUP8 DUP8 MSTORE PUSH1 0x16 DUP7 MSTORE SWAP6 DUP5 SWAP1 KECCAK256 DUP5 MLOAD PUSH1 0xA0 DUP2 ADD DUP7 MSTORE DUP2 SLOAD DUP2 MSTORE SWAP7 DUP2 ADD SLOAD SWAP6 DUP8 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP2 DUP5 ADD SLOAD SWAP3 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x3 DUP4 ADD SLOAD SWAP1 DUP5 ADD MSTORE PUSH1 0x4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x80 DUP4 ADD MSTORE SWAP1 PUSH2 0x2FF9 SWAP1 DUP3 SWAP1 PUSH2 0x3230 JUMP JUMPDEST SWAP4 POP DUP1 PUSH1 0x40 ADD MLOAD SWAP3 POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 PUSH2 0x3019 JUMPI DUP4 SWAP2 POP PUSH2 0x3042 JUMP JUMPDEST PUSH2 0x302D PUSH4 0xFFFFFFFF DUP7 AND PUSH3 0xF4240 DUP7 PUSH2 0x386A JUMP JUMPDEST SWAP2 POP PUSH2 0x303F DUP5 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3052 PUSH2 0x38A0 JUMP JUMPDEST TIMESTAMP PUSH1 0xD SSTORE PUSH1 0x1 PUSH1 0xC SSTORE JUMP JUMPDEST PUSH2 0x3065 PUSH2 0x38B5 JUMP JUMPDEST PUSH3 0xD2F00 PUSH3 0xDBBA0 PUSH9 0x56BC75E2D63100000 PUSH1 0x2 PUSH1 0x3 PUSH2 0x27EE DUP6 DUP6 DUP6 DUP6 DUP6 PUSH2 0x2B7F JUMP JUMPDEST DUP1 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xBEF JUMPI PUSH2 0xBEF PUSH2 0x982 PUSH1 0x2 DUP5 PUSH2 0x391A JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 PUSH2 0x30BA PUSH2 0x4ECF JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE SWAP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP1 DUP4 MSTORE PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH9 0x10000000000000000 DUP4 DIV DUP2 AND SWAP5 DUP5 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV SWAP1 SWAP3 AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 EQ ISZERO PUSH2 0x315B JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x31F1 JUMP JUMPDEST PUSH2 0x3167 DUP2 DUP4 DUP8 DUP8 PUSH2 0x3937 JUMP JUMPDEST DUP2 MLOAD SWAP1 SWAP4 POP PUSH1 0x0 SWAP1 PUSH2 0x318A SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST SWAP1 POP PUSH2 0x31C8 PUSH2 0x31BB DUP10 DUP5 PUSH1 0x20 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x0 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND DUP6 PUSH2 0x39BA JUMP JUMPDEST DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x31EB PUSH2 0x31BB DUP10 DUP5 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP8 PUSH2 0x39BA JUMP JUMPDEST SWAP4 POP POP POP POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xE69EDC3E00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x323E JUMPI PUSH2 0xEAC JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x14 SLOAD PUSH2 0x3274 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF DUP1 DUP3 AND SWAP2 PUSH5 0x100000000 SWAP1 DIV AND PUSH2 0x3A53 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD DUP4 MLOAD SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 PUSH2 0x3290 SWAP2 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP DUP2 DUP2 LT ISZERO PUSH2 0x329E JUMPI DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x32B0 PUSH2 0x4F10 JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP4 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3314 SWAP1 DUP7 DUP7 PUSH2 0x3009 JUMP JUMPDEST SWAP1 SWAP4 POP SWAP2 POP DUP3 ISZERO PUSH2 0x33D1 JUMPI PUSH2 0x3327 PUSH2 0xE04 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH2 0x337D SWAP2 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x528E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3397 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x33AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x33CF SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x5074 JUMP JUMPDEST POP JUMPDEST DUP2 ISZERO PUSH2 0x33EC JUMPI PUSH2 0x33E1 DUP7 DUP4 PUSH2 0x3B16 JUMP JUMPDEST PUSH2 0x33EC DUP7 DUP4 DUP7 PUSH2 0x3B57 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB65A25B9 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x342F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5371 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xA6BCDE47 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xBEF JUMPI PUSH2 0xBEF PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x391A JUMP JUMPDEST DUP1 MLOAD DUP3 SLOAD PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x20 SWAP1 SWAP4 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH9 0x10000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP5 AND PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP3 SWAP1 SWAP3 AND OR AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1DE45AD1 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5236 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x57654FE400000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xDE16F1A0 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xE50 JUMPI PUSH2 0xE50 PUSH2 0x982 DUP3 PUSH1 0x0 PUSH2 0x3C40 JUMP JUMPDEST PUSH2 0x365A PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x3663 DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x368D PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x215C SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x1191 DUP4 DUP3 PUSH2 0x34F2 JUMP JUMPDEST PUSH2 0x36B2 PUSH2 0x4ECF JUMP JUMPDEST PUSH2 0x36BB DUP4 PUSH2 0x22F2 JUMP JUMPDEST SWAP1 POP PUSH2 0x368D PUSH2 0x1C51 DUP4 DUP4 PUSH1 0x40 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2875 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST EQ PUSH1 0x1 AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x82DED785 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x60 PUSH4 0x22DF9597 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x342F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53DD JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE9F83771 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x140A84DB PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5236 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x31D7A505 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31F1 DUP4 PUSH2 0x3795 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x0 SWAP1 PUSH2 0x37B8 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST SWAP1 POP PUSH2 0x37C2 PUSH2 0x4EEF JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x15 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE DUP2 SLOAD DUP1 DUP3 MSTORE PUSH1 0x1 DUP4 ADD SLOAD SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x2 SWAP1 SWAP2 ADD SLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE ISZERO PUSH2 0x1191 JUMPI PUSH2 0x1191 PUSH2 0x982 DUP5 DUP5 PUSH2 0x3CB8 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3834 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x17 SLOAD PUSH2 0x3856 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x17 SSTORE POP POP JUMP JUMPDEST PUSH2 0xE50 DUP2 PUSH1 0x0 PUSH1 0x1 PUSH2 0x3B57 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31F1 DUP4 PUSH2 0x3795 PUSH2 0x3884 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH2 0x3894 DUP9 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0xD SLOAD ISZERO PUSH2 0x1B4D JUMPI PUSH2 0x1B4D PUSH2 0x982 PUSH1 0x0 PUSH2 0x3CD5 JUMP JUMPDEST PUSH1 0x11 SLOAD ISZERO DUP1 ISZERO SWAP1 PUSH2 0x38CD JUMPI POP PUSH1 0x12 SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x38DA JUMPI POP PUSH1 0x13 SLOAD ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x38ED JUMPI POP PUSH1 0x14 SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x3908 JUMPI POP PUSH1 0x14 SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x1B4D JUMPI PUSH2 0x1B4D PUSH2 0x982 PUSH1 0x1 PUSH2 0x3CD5 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xC996AF7B PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5393 JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO DUP1 PUSH2 0x3944 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x3951 JUMPI POP PUSH1 0x0 PUSH2 0x31F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3964 DUP6 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST DUP7 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x3980 JUMPI DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3986 JUMP JUMPDEST DUP6 PUSH1 0x20 ADD MLOAD JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 PUSH2 0x39A5 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x31F1 JUMP JUMPDEST PUSH2 0x39B0 DUP5 DUP5 DUP4 PUSH2 0x377F JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 ISZERO DUP1 PUSH2 0x39C8 JUMPI POP DUP2 DUP4 EQ JUMPDEST ISZERO PUSH2 0x39D5 JUMPI POP PUSH1 0x0 PUSH2 0x31F1 JUMP JUMPDEST DUP2 DUP4 LT PUSH2 0x3A0E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x172C SWAP1 PUSH2 0x5404 JUMP JUMPDEST PUSH2 0x3A16 PUSH2 0x4F4B JUMP JUMPDEST PUSH2 0x3A20 DUP7 DUP6 PUSH2 0x3D14 JUMP JUMPDEST SWAP1 POP PUSH2 0x3A2A PUSH2 0x4F4B JUMP JUMPDEST PUSH2 0x3A34 DUP8 DUP6 PUSH2 0x3D14 JUMP JUMPDEST SWAP1 POP PUSH2 0x1D45 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP11 PUSH2 0x3E32 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3A60 DUP9 DUP9 PUSH2 0x3EBE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3A6E DUP8 DUP8 PUSH2 0x3EBE JUMP JUMPDEST SWAP1 POP DUP2 ISZERO DUP1 PUSH2 0x3A7B JUMPI POP DUP1 ISZERO JUMPDEST ISZERO PUSH2 0x3A8C JUMPI POP PUSH1 0x0 SWAP2 POP PUSH2 0x1D45 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 SGT ISZERO PUSH2 0x3AA5 JUMPI PUSH2 0x3AA0 DUP3 DUP5 PUSH2 0x3F10 JUMP JUMPDEST PUSH2 0x3AAF JUMP JUMPDEST PUSH2 0x3AAF DUP4 DUP4 PUSH2 0x3F10 JUMP JUMPDEST SWAP1 POP PUSH2 0x3AD8 PUSH2 0x3AD3 PUSH2 0x3AC0 DUP4 PUSH2 0x3F2F JUMP JUMPDEST DUP9 PUSH4 0xFFFFFFFF AND DUP9 PUSH4 0xFFFFFFFF AND PUSH2 0x45D1 JUMP JUMPDEST PUSH2 0x45E0 JUMP JUMPDEST SWAP1 POP DUP2 DUP4 SGT ISZERO PUSH2 0x3AF1 JUMPI PUSH2 0x3AEC DUP3 DUP3 PUSH2 0x3F10 JUMP JUMPDEST PUSH2 0x3AFB JUMP JUMPDEST PUSH2 0x3AFB DUP3 DUP3 PUSH2 0x4BCA JUMP JUMPDEST SWAP1 POP PUSH2 0x3B07 DUP2 DUP13 PUSH2 0x4BF6 JUMP JUMPDEST SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3B35 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x17 SLOAD PUSH2 0x3856 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x2875 AND JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xC SLOAD DUP1 DUP3 EQ ISZERO PUSH2 0x3B78 JUMPI POP POP PUSH2 0x1191 JUMP JUMPDEST PUSH2 0x3B80 PUSH2 0x4F4B JUMP JUMPDEST POP PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x3BB7 PUSH2 0x4F4B JUMP JUMPDEST PUSH2 0x3BC0 DUP3 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3BF9 JUMPI PUSH2 0x3BD9 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD DUP9 DUP9 PUSH2 0x4C41 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE DUP2 DUP4 MSTORE PUSH2 0x3BED SWAP2 SWAP1 PUSH2 0x4CA3 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE DUP2 MSTORE PUSH2 0x3C04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP6 SWAP1 MSTORE DUP6 DUP2 MSTORE JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP7 DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 DUP5 MLOAD DUP2 SSTORE SWAP4 DUP3 ADD MLOAD PUSH1 0x1 SWAP1 SWAP5 ADD SWAP4 SWAP1 SWAP4 SSTORE SWAP8 DUP2 MSTORE PUSH1 0xF SWAP1 SWAP8 MSTORE SWAP1 SWAP6 KECCAK256 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x9AE94F01 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5353 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3C6C JUMPI POP PUSH1 0x0 PUSH2 0xEAC JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3C79 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xEA9 JUMPI PUSH2 0xEA9 PUSH2 0x982 PUSH1 0x1 DUP7 DUP7 PUSH2 0x3410 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x3CA4 JUMPI PUSH2 0x3CA4 PUSH2 0x982 PUSH1 0x3 DUP6 DUP6 PUSH2 0x3410 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x3CAF JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x5CAA0B05 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x5363 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xB02D77300000000000000000000000000000000000000000000000000000000 DUP3 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x3D04 JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x28AC SWAP2 SWAP1 PUSH2 0x55C5 JUMP JUMPDEST PUSH2 0x3D1C PUSH2 0x4F4B JUMP JUMPDEST POP PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x3D54 DUP2 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3D5E JUMPI PUSH2 0xEAC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D71 DUP4 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x215C AND JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP SWAP1 POP PUSH2 0x3DAC DUP3 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3DB7 JUMPI POP PUSH2 0xEAC JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 DUP2 LT ISZERO PUSH2 0x3E14 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP1 SLOAD DUP4 MSTORE PUSH1 0x1 ADD SLOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP PUSH2 0x3E07 DUP4 PUSH2 0x4C38 JUMP JUMPDEST ISZERO PUSH2 0x3E14 JUMPI POP PUSH2 0xEAC SWAP1 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x3E41 JUMPI POP PUSH1 0x0 PUSH2 0x3EB5 JUMP JUMPDEST DUP4 PUSH2 0x3E61 JUMPI PUSH2 0x3E5A DUP6 PUSH2 0x3795 DUP5 DUP10 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 POP PUSH2 0x3EB5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E86 PUSH2 0x3E76 DUP7 DUP9 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST PUSH2 0x22A3 DUP10 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3E9A DUP3 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP1 POP PUSH2 0x3EB0 DUP8 PUSH2 0x3795 DUP7 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 SLT ISZERO PUSH2 0x3ED6 JUMPI PUSH2 0x3ED6 PUSH2 0x982 PUSH1 0x1 DUP6 PUSH2 0x4CCC JUMP JUMPDEST PUSH1 0x0 DUP3 SLT ISZERO PUSH2 0x3EED JUMPI PUSH2 0x3EED PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4CCC JUMP JUMPDEST PUSH2 0xEA9 PUSH2 0x3F0A DUP5 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4D0D JUMP JUMPDEST DUP4 PUSH2 0x4D3F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEA9 PUSH2 0x3F0A DUP5 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4D0D JUMP JUMPDEST PUSH1 0x0 PUSH16 0x80000000000000000000000000000000 DUP3 SGT ISZERO PUSH2 0x3F57 JUMPI PUSH2 0x3F57 PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4DC0 JUMP JUMPDEST PUSH1 0x0 DUP3 SGT PUSH2 0x3F6D JUMPI PUSH2 0x3F6D PUSH2 0x982 PUSH1 0x0 DUP5 PUSH2 0x4DC0 JUMP JUMPDEST PUSH16 0x80000000000000000000000000000000 DUP3 EQ ISZERO PUSH2 0x3F8D JUMPI POP PUSH1 0x0 PUSH2 0xBEF JUMP JUMPDEST PUSH5 0x733048C5A DUP3 SGT PUSH2 0x3FC0 JUMPI POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE010000000000000000000000000000000 PUSH2 0xBEF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH11 0x1C8464F76164760000000 DUP6 SGT PUSH2 0x401F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH11 0x1C8464F76164760000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH13 0xF1AADDD7742E90000000000000 DUP6 SGT PUSH2 0x407D JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH13 0xF1AADDD7742E90000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH15 0xAFE10820813D78000000000000000 DUP6 SGT PUSH2 0x40DF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH15 0xAFE10820813D78000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x2582AB704279EC00000000000000000 DUP6 SGT PUSH2 0x4143 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x2582AB704279EC00000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x1152AAA3BF81CC000000000000000000 DUP6 SGT PUSH2 0x41A7 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x1152AAA3BF81CC000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x2F16AC6C59DE70000000000000000000 DUP6 SGT PUSH2 0x420B JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x2F16AC6C59DE70000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x4DA2CBF1BE5828000000000000000000 DUP6 SGT PUSH2 0x426F JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x4DA2CBF1BE5828000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x63AFBE7AB2082C000000000000000000 DUP6 SGT PUSH2 0x42D3 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x63AFBE7AB2082C000000000000000000 PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH16 0x70F5A893B608861E1F58934F97AEA57D DUP6 SGT PUSH2 0x4337 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000 SWAP1 SWAP4 ADD SWAP3 PUSH16 0x70F5A893B608861E1F58934F97AEA57D PUSH16 0x80000000000000000000000000000000 DUP7 MUL SDIV SWAP5 POP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000000000000000000000000000000 DUP6 ADD SWAP3 POP DUP3 SWAP2 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP1 MUL SDIV SWAP1 POP PUSH17 0x100000000000000000000000000000000 DUP4 DUP2 SUB DUP4 MUL SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x43AD JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x200000000000000000000000000000000 DUP4 PUSH16 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA SUB DUP4 MUL DUP2 PUSH2 0x43DE JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x43FE JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x300000000000000000000000000000000 DUP4 PUSH16 0x99999999999999999999999999999999 SUB DUP4 MUL DUP2 PUSH2 0x442F JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x444F JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x400000000000000000000000000000000 DUP4 PUSH16 0x92492492492492492492492492492492 SUB DUP4 MUL DUP2 PUSH2 0x4480 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x44A0 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x500000000000000000000000000000000 DUP4 PUSH16 0x8E38E38E38E38E38E38E38E38E38E38E SUB DUP4 MUL DUP2 PUSH2 0x44D1 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x44F1 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x600000000000000000000000000000000 DUP4 PUSH16 0x8BA2E8BA2E8BA2E8BA2E8BA2E8BA2E8B SUB DUP4 MUL DUP2 PUSH2 0x4522 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x4542 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x700000000000000000000000000000000 DUP4 PUSH16 0x89D89D89D89D89D89D89D89D89D89D89 SUB DUP4 MUL DUP2 PUSH2 0x4573 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP PUSH16 0x80000000000000000000000000000000 DUP2 DUP4 MUL DUP2 PUSH2 0x4593 JUMPI INVALID JUMPDEST SDIV SWAP2 POP PUSH17 0x800000000000000000000000000000000 DUP4 PUSH16 0x88888888888888888888888888888888 SUB DUP4 MUL DUP2 PUSH2 0x45C4 JUMPI INVALID JUMPDEST SDIV DUP5 ADD SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31F1 PUSH2 0x3F0A DUP6 DUP6 PUSH2 0x4D0D JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE010000000000000000000000000000000 DUP3 SLT ISZERO PUSH2 0x4612 JUMPI POP PUSH1 0x0 PUSH2 0xBEF JUMP JUMPDEST DUP2 PUSH2 0x462E JUMPI POP PUSH16 0x80000000000000000000000000000000 PUSH2 0xBEF JUMP JUMPDEST PUSH1 0x0 DUP3 SGT ISZERO PUSH2 0x4645 JUMPI PUSH2 0x4645 PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4DC0 JUMP JUMPDEST PUSH16 0x80000000000000000000000000000000 PUSH16 0x10000000000000000000000000000000 DUP4 SMOD DUP1 DUP1 MUL DUP3 SWAP1 SDIV PUSH8 0x10E1B3BE415A0000 DUP2 MUL SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP2 DUP2 DUP4 MUL SDIV SWAP1 POP DUP1 PUSH8 0x5A0913F6B1E0000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x46B1 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH8 0x168244FDAC78000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x46DE JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH7 0x4807432BC18000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x470A JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH7 0xC0135DCA04000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4736 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH7 0x1B707B1CDC000 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4762 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH6 0x36E0F639B800 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x478D JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH6 0x618FEE9F800 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x47B8 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH5 0x9C197DCC00 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x47E2 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH5 0xE30DCE400 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x480C JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH5 0x12EBD1300 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4836 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH4 0x17499F00 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x485F JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH4 0x1A9D480 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4888 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH3 0x1C6380 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x48B0 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH3 0x1C638 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x48D8 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH2 0x1AB8 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x48FF JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH2 0x17C MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x4926 JUMPI INVALID JUMPDEST SDIV SWAP1 POP DUP1 PUSH1 0x14 MUL DUP4 ADD SWAP3 POP PUSH16 0x80000000000000000000000000000000 DUP3 DUP3 MUL DUP2 PUSH2 0x494C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP6 SWAP1 SWAP6 SUB SWAP5 PUSH8 0x21C3677C82B40000 SWAP2 SWAP1 SDIV SWAP4 DUP5 ADD SDIV DUP3 ADD PUSH16 0x80000000000000000000000000000000 ADD SWAP3 SWAP1 POP PUSH17 0x1000000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x49BB JUMPI PUSH19 0x43CBAF42A000812488FC5C220AD7B97BF6E99E PUSH13 0xF1AADDD7742E56D32FB9F99744 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x800000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x49FD JUMPI PUSH18 0x5D27A9F51C31B7C2F8038212A0574779991 PUSH15 0xAFE10820813D65DFE6A33C07F738F DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x400000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4A3F JUMPI PUSH17 0x1B4C902E273A58678D6D3BFDB93DB96D02 PUSH16 0x2582AB704279E8EFD15E0265855C47A DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x200000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4A81 JUMPI PUSH17 0x3B1CC971A9BB5B9867477440D6D157750 PUSH16 0x1152AAA3BF81CB9FDB76EAE12D029571 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH17 0x100000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4AC3 JUMPI PUSH17 0x15BF0A8B1457695355FB8AC404E7A79E3 PUSH16 0x2F16AC6C59DE6F8D5D6F63C1482A7C86 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x80000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4B03 JUMPI PUSH16 0xD3094C70F034DE4B96FF7D5B6F99FCD8 PUSH16 0x4DA2CBF1BE5827F9EB3AD1AA9866EBB3 DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x40000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4B43 JUMPI PUSH16 0xA45AF1E1F40C333B3DE1DB4DD55F29A7 PUSH16 0x63AFBE7AB2082BA1A0AE5E4EB1B479DC DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x20000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4B83 JUMPI PUSH16 0x910B022DB7AE67CE76B441C27035C6A1 PUSH16 0x70F5A893B608861E1F58934F97AEA57D DUP5 MUL SDIV SWAP3 POP JUMPDEST PUSH16 0x10000000000000000000000000000000 DUP5 AND ISZERO PUSH2 0x4BC3 JUMPI PUSH16 0x88415ABBE9A76BEAD8D00CF112E4D4A8 PUSH16 0x783EAFEF1C0A8F3978C7F81824D62EBF DUP5 MUL SDIV SWAP3 POP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4BE7 DUP5 DUP5 PUSH2 0x4D0D JUMP JUMPDEST DUP2 PUSH2 0x4BEE JUMPI INVALID JUMPDEST SDIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SLT ISZERO PUSH2 0x4C0E JUMPI PUSH2 0x4C0E PUSH2 0x982 PUSH1 0x1 DUP5 PUSH2 0x4CCC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4C1A DUP5 DUP5 PUSH2 0x4D0D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 SGT PUSH2 0x4C2E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0xEAC JUMP JUMPDEST PUSH1 0x7F SHR SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 ADD MLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH2 0x4C53 JUMPI POP DUP3 SWAP1 POP DUP2 PUSH2 0x4C9A JUMP JUMPDEST DUP4 PUSH2 0x4C62 JUMPI POP DUP5 SWAP1 POP DUP4 PUSH2 0x4C9A JUMP JUMPDEST PUSH2 0x4C85 PUSH2 0x4C75 DUP6 DUP8 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST PUSH2 0x3894 DUP9 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP2 POP PUSH2 0x4C97 DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x3C5D AND JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x4CC1 DUP5 DUP5 PUSH16 0x80000000000000000000000000000000 PUSH2 0x4DEF JUMP JUMPDEST SWAP2 POP SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xBD79545F00000000000000000000000000000000000000000000000000000000 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x4CFB JUMPI INVALID JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x20CF SWAP3 SWAP2 SWAP1 PUSH2 0x55D3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x4D1C JUMPI POP PUSH1 0x0 PUSH2 0xEAC JUMP JUMPDEST POP DUP2 DUP2 MUL DUP2 DUP4 DUP3 DUP2 PUSH2 0x4D2A JUMPI INVALID JUMPDEST SDIV EQ PUSH2 0xEAC JUMPI PUSH2 0xEAC PUSH2 0x982 PUSH1 0x1 DUP6 DUP6 PUSH2 0x4E5D JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x4D55 JUMPI PUSH2 0x4D55 PUSH2 0x982 PUSH1 0x2 DUP6 DUP6 PUSH2 0x4E5D JUMP JUMPDEST PUSH32 0x8000000000000000000000000000000000000000000000000000000000000000 DUP4 EQ DUP1 ISZERO PUSH2 0x4DA3 JUMPI POP DUP2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EQ JUMPDEST ISZERO PUSH2 0x4DB7 JUMPI PUSH2 0x4DB7 PUSH2 0x982 PUSH1 0x3 DUP6 DUP6 PUSH2 0x4E5D JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x4BEE JUMPI INVALID JUMPDEST PUSH1 0x60 PUSH32 0xED2F26A100000000000000000000000000000000000000000000000000000000 DUP4 PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x4CFB JUMPI INVALID JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP6 GT DUP1 PUSH2 0x4DFF JUMPI POP DUP3 DUP5 GT JUMPDEST ISZERO PUSH2 0x4E54 JUMPI PUSH1 0x0 DUP5 DUP7 LT ISZERO PUSH2 0x4E14 JUMPI DUP5 PUSH2 0x4E16 JUMP JUMPDEST DUP6 JUMPDEST SWAP1 POP PUSH2 0x4E28 DUP2 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP1 POP PUSH2 0x4E3A DUP7 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP3 POP PUSH2 0x4E4C DUP6 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x3C8E AND JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3042 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP2 SWAP3 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x8C12DFE700000000000000000000000000000000000000000000000000000000 DUP5 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x4E8C JUMPI INVALID JUMPDEST DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x342F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55E6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x1191 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x1191 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x4F65 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0xB57 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x4F7F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4F6B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xEAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2392 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4FC9 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xEA9 DUP4 DUP4 PUSH2 0x4F83 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4FE7 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4FF2 DUP2 PUSH2 0x560B JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x5002 DUP2 PUSH2 0x560B JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5025 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x502F DUP5 DUP5 PUSH2 0x4F83 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x504F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x5059 DUP5 DUP5 PUSH2 0x4F83 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x5069 DUP2 PUSH2 0x563B JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5085 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xEA9 DUP2 PUSH2 0x562D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x50A1 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x50BA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x5069 DUP2 PUSH2 0x560B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x50DE JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x50FF JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x5069 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x512A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xEA9 DUP2 PUSH2 0x563B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x5149 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x5153 DUP6 DUP6 PUSH2 0x4FA7 JUMP JUMPDEST SWAP3 POP PUSH2 0x5162 DUP6 PUSH1 0x40 DUP7 ADD PUSH2 0x4FA7 JUMP JUMPDEST SWAP2 POP PUSH1 0x80 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5183 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x51A1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 CALLDATALOAD SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x51B3 DUP2 PUSH2 0x5648 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x51CA DUP2 PUSH2 0x5648 JUMP JUMPDEST SWAP2 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH2 0x51DA DUP2 PUSH2 0x5648 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x51FA JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x5205 DUP2 PUSH2 0x5648 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x5069 DUP2 PUSH2 0x562D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP5 ADD SWAP1 PUSH1 0x40 DUP5 ADD SWAP1 DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5302 JUMPI DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x52CE JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x537F JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH1 0x3 DUP5 LT PUSH2 0x53A1 JUMPI INVALID JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x53B8 DUP5 PUSH2 0x5601 JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x53EA DUP6 PUSH2 0x5601 JUMP JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH4 0xFFFFFFFF AND PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH32 0x43525F494E54455256414C5F494E56414C494400000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH32 0x574554485F5452414E534645525F4641494C4544000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 SWAP2 DUP3 ADD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 SWAP2 DUP3 ADD MLOAD PUSH4 0xFFFFFFFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH4 0xFFFFFFFF SWAP4 DUP5 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 AND PUSH1 0x60 DUP5 ADD MSTORE AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0xE50 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xE50 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 BLOCKHASH 0x5f PUSH8 0x9C9973463D3088BF 0xe4 JUMPI CALLVALUE PUSH30 0x17202E3319ADF7067235FC4905AE0F29646C6578706572696D656E74616C CREATE2 PUSH5 0x736F6C6343 STOP SDIV 0xc STOP BLOCKHASH ",
"sourceMap": "889:1398:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1793:417:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1793:417:4;;;;;;;;:::i;:::-;;1303:1653:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1303:1653:27;;;:::i;:::-;;;;;;;;;;;;;;;;2637:152:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2637:152:21;;;;;;;;:::i;3430:84:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3430:84:7;;;;;;;;:::i;:::-;;;;;;;;;;1796:1176:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1796:1176:20;;;;;;;;:::i;3680:75:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3680:75:7;;;;;;;;:::i;:::-;;;;;;;;;;;;1822:187:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1822:187:0;;;:::i;:::-;;;;;;;;3485:245:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3485:245:21;;;;;;;;:::i;:::-;;;;;;;;1275:131:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1275:131:53;;;;;;;;:::i;2162:334:21:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2162:334:21;;;;;;;;:::i;4390:194:3:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4390:194:3;;;;;;;;:::i;:::-;;;;;;;;1055:28:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1055:28:53;;;;;;;;:::i;3960:152:24:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3960:152:24;;;;;;;;:::i;:::-;;;;;;;;2303:45:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2303:45:7;;;:::i;3302:1467:20:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3302:1467:20;;;;;;;;:::i;2664:47:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2664:47:7;;;;;;;;:::i;:::-;;;;;;;;2907:629:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2907:629:24;;;;;;;;:::i;2652:619:28:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2652:619:28;;;:::i;:::-;;;;;;;;;;;;2114:171:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2114:171:0;;;:::i;2789:37:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2789:37:7;;;:::i;1704:951:24:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1704:951:24;;;;;;;;:::i;1520:445:53:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1520:445:53;;;;;;;;:::i;2237:27:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2237:27:7;;;:::i;3107:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3107:39:7;;;:::i;:::-;;;;;;;;1264:414:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1264:414:4;;;;;;;;:::i;749:20:62:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;749:20:62;;;:::i;2138:195:53:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2138:195:53;;;;;;;;:::i;1464:675:28:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1464:675:28;;;;;;;;:::i;3021:31:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3021:31:7;;;:::i;1551:2691:3:-;;;;;;;;;:::i;1871:25:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1871:25:7;;;:::i;1064:467:20:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1064:467:20;;;;;;;;:::i;3851:41:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3851:41:7;;;:::i;1195:195:29:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1195:195:29;;;:::i;3645:232:24:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3645:232:24;;;;;;;;:::i;1110:140:25:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1110:140:25;;;;;;;;:::i;1006:43:53:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1006:43:53;;;;;;;;:::i;1416:742:25:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1416:742:25;;;;;;;;:::i;2158:51:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2158:51:7;;;;;;;;:::i;2430:138:53:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2430:138:53;;;:::i;:::-;;;;;;;;2904:40:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2904:40:7;;;:::i;1447:257:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1447:257:0;;;:::i;1099:855:21:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1099:855:21;;;;;;;;:::i;3203:41:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3203:41:7;;;:::i;2375:759:25:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2375:759:25;;;;;;;;:::i;1049:30:7:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1049:30:7;;;:::i;1957:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1957:49:7;;;;;;;;:::i;3007:276:21:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3007:276:21;;;;;;;;:::i;928:329:62:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;928:329:62;;;;;;;;:::i;3404:2420:27:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3404:2420:27;;;;;;;;:::i;1793:417:4:-;955:27:53;:25;:27::i;:::-;1897:20:4;;;;;;;:14;:20;;;;;;;;1892:238;;1933:186;1955:163;2014:68;2100:4;1955:41;:163::i;:::-;1933:21;:186::i;:::-;2139:20;;;2162:5;2139:20;;;:14;:20;;;;;;;:28;;;;;;2182:21;;;;;2154:4;;2182:21;;;;;;;;;;1793:417;:::o;1303:1653:27:-;1404:12;;1357:7;;;1446:24;1404:12;1468:1;1446:24;:21;:24;:::i;:::-;1547:39;1589:33;;;:22;:33;;;;;:52;;;1426:44;;-1:-1:-1;1655:36:27;;1651:273;;1707:206;1746:153;1819:9;1850:31;1746:51;:153::i;1707:206::-;2026:10;:8;:10::i;:::-;2165:26;:24;:26::i;:::-;2108:37;;;;:22;:37;;;;;:83;2201:47;;:::i;:::-;-1:-1:-1;2251:37:27;;;;:22;:37;;;;;;;;;2201:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2330:237;;2201:87;;2274:13;;2330:237;;;;2201:87;;;;2330:237;;;;;;;;;;2656:16;:14;:16::i;:::-;2761:34;;;;2757:141;;2854:32;;2821:66;;2836:13;;2821:66;;;;2851:1;;2821:66;;;;;;;;;;2757:141;2915:34;;;;-1:-1:-1;;;;1303:1653:27;;:::o;2637:152:21:-;2721:7;2751:13;:11;:13::i;:::-;:23;;;2775:6;2751:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2751:31:21;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2751:31:21;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2751:31:21;;;;;;;;;2744:38;;2637:152;;;;:::o;3430:84:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1796:1176:20:-;1877:10;1898:48;;:::i;:::-;1981:68;;;:60;:68;;;:60;;:68;:60;:68;;1961:89;;:19;:89::i;:::-;1898:152;;2140:32;2175:129;2207:18;:38;;;2175:129;;2259:18;:35;;;2175:129;;:18;:129::i;:::-;2140:164;;2328:24;2319:6;:33;2315:254;;;2368:190;2407:137;2474:6;2502:24;2407:45;:137::i;2368:190::-;2657:68;;;:60;:68;;;:60;;:68;:60;:68;;2613:142;;2739:6;2613:30;:142::i;:::-;2822:13;:11;:13::i;:::-;:26;;;2849:6;2857;2822:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2822:42:20;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2822:42:20;;;;2929:6;2908:57;;;2949:6;2908:57;;;;;;;;;;;;;;;1796:1176;;;;:::o;3680:75:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1822:187:0:-;1961:11;;;;1822:187;:::o;3485:245:21:-;3584:37;;:::i;:::-;3667:31;;;;:23;:31;;;;;3647:52;;:19;:52::i;1275:131:53:-;882:22:62;:20;:22::i;:::-;1370:29:53;1392:6;1370:21;:29::i;:::-;1275:131;:::o;2162:334:21:-;2312:37;;:::i;:::-;2375:90;2408:19;:39;2434:11;2428:18;;;;;;;;2408:39;;;;;;;;;;;;;;;;-1:-1:-1;2408:39:21;;;:47;;;;;;;;;;2375:19;:90::i;:::-;2365:100;-1:-1:-1;2162:334:21;;;;;:::o;4390:194:3:-;4491:25;;:::i;:::-;-1:-1:-1;4539:24:3;;;;:16;:24;;;;;;;;4564:12;;4539:38;;;;;;;;4532:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4390:194::o;1055:28:53:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1055:28:53;:::o;3960:152:24:-;4045:20;;:::i;:::-;-1:-1:-1;4088:17:24;;;;:9;:17;;;;;;;;;4081:24;;;;;;;;;;;;;;;;;;;;;;;;3960:152::o;2303:45:7:-;;;;:::o;3302:1467:20:-;3481:10;3565:11;3561:48;;3592:7;;;3561:48;3718:32;3703:11;;;;:4;:11;;;:47;;;;;;;;;:108;;;;-1:-1:-1;3779:32:20;3766:9;;;;:2;:9;;;:45;;;;;;;;;3703:108;3699:145;;;3827:7;;;3699:145;3902:30;3887:11;;;;:4;:11;;;:45;;;;;;;;;3883:183;;;3948:107;3982:4;:11;;;4011:6;4035;3948:16;:107::i;:::-;4093:30;4080:9;;;;:2;:9;;;:43;;;;;;;;;4076:177;;;4139:103;4171:2;:9;;;4198:6;4222;4139:14;:103::i;:::-;4287:38;4328:19;4287:38;4354:11;;;;:4;:11;;;4348:18;;;;;;;;4328:39;;;;;;;;;;;;;;;;-1:-1:-1;4328:39:20;;;:47;;;;;;;;;;;-1:-1:-1;;4424:19:20;;-1:-1:-1;;4450:9:20;;;;:2;:9;;;4444:16;;;;;;;;4424:37;;;;;;;;;;;;;;;;-1:-1:-1;4424:37:20;;;:45;;;;;;;;;;;-1:-1:-1;4479:80:20;4503:7;4424:45;4543:6;4479:10;:80::i;:::-;4743:9;;;;;;4688:11;;;;;4593:169;;;;;;4636:6;;4662:11;;4688:4;4662:11;;;4656:18;;;;;;;;4719:9;;;;:2;:9;;;4713:16;;;;;;;;4593:169;;;;;;;;;;;;;;;;;3302:1467;;;;;;;:::o;2664:47:7:-;;;;;;;;;;;;;;;:::o;2907:629:24:-;3039:6;1261:35;1289:6;1261:27;:35::i;:::-;3114:27;3144:17;;;:9;:17;;;;;:31;;;;;;3185:117;3144:17;:31;3276:16;3185:23;:117::i;:::-;3348:17;;;;:9;:17;;;;;;;:50;;;;;;;;;;;;3413:116;3348:17;;3413:116;;;;3469:20;;3348:50;;3413:116;;2652:619:28;2998:22;;3060:26;;3116:16;;3171:25;;2998:22;;3060:26;;;;;3116:16;;3171:25;;;;3237:27;;;;;2652:619::o;2114:171:0:-;2237:15;;;;2114:171;:::o;2789:37:7:-;;;;:::o;1704:951:24:-;2012:10;;1812:14;;1910:10;;2004:30;;2032:1;2004:30;:27;:30;:::i;:::-;1983:10;:52;;;1996:39;-1:-1:-1;2088:134:24;1996:39;714:5:5;2199:13:24;2088:23;:134::i;:::-;2266:25;;:::i;:::-;-1:-1:-1;2294:99:24;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2403:17:24;;;:9;:17;;;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;2484:51;;;;;;2403:17;;2294:99;;;;2484:51;;;;;;;;;;2550:18;2546:79;;;2584:30;2607:6;2584:22;:30::i;:::-;-1:-1:-1;;1704:951:24;;;;:::o;1520:445:53:-;882:22:62;:20;:22::i;:::-;1623:18:53;;;;;;;:10;:18;;;;;;;;1618:131;;1657:81;1679:58;1730:6;1679:50;:58::i;1657:81::-;1763:9;1758:201;1782:11;:18;1778:22;;1758:201;;;1843:6;1825:24;;:11;1837:1;1825:14;;;;;;;;;;;;;;;;;;;;:24;1821:128;;;1869:42;1901:6;1909:1;1869:31;:42::i;:::-;1929:5;;1821:128;1802:3;;1758:201;;;;1520:445;:::o;2237:27:7:-;;;;:::o;3107:39::-;;;;;;:::o;1264:414:4:-;955:27:53;:25;:27::i;:::-;1364:20:4;;;;;;;:14;:20;;;;;;;;1360:241;;;1400:190;1422:167;1481:72;1571:4;1422:41;:167::i;1400:190::-;1610:20;;;;;;;:14;:20;;;;;;;:27;;;;1633:4;1610:27;;;1652:19;;;;;1625:4;;1652:19;;749:20:62;;;;;;:::o;2138:195:53:-;882:22:62;:20;:22::i;:::-;2280:46:53;2312:6;2320:5;2280:31;:46::i;1464:675:28:-;955:27:53;:25;:27::i;:::-;1751:211:28;1775:23;1812:27;1853:17;1884:26;1924:28;1751:10;:211::i;:::-;2099:4;2077:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2077:55:28;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2077:55:28;;;;1464:675;;;;;:::o;3021:31:7:-;;;;:::o;1551:2691:3:-;993:10:4;978:26;;;;:14;:26;;;;;;;;973:171;;1020:113;1042:90;1108:10;1042:48;:90::i;1020:113::-;1738:36:3;1762:11;1738:23;:36::i;:::-;1883:9;1879:274;;1938:17;:15;:17::i;:::-;:30;;;1990:12;2032:4;2059:11;1938:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1938:150:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1938:150:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1938:150:3;;;;;;;;;1913:229;;;;;;;;;;;;;;;;;;;;;;2229:27;;;2212:14;2229:27;;;:13;:27;;;;;;2381:21;2377:58;;2418:7;;;2377:58;2445:17;2465:36;2494:6;2465:28;:36::i;:::-;:56;;;2445:76;;;;2588:16;;2576:9;:28;2572:65;;;2620:7;;;;2572:65;2743:12;;2719:21;2807:24;;;:16;:24;;;;;;;;:39;;;;;;;;2910:22;:37;;;;;;3083:26;;3123:24;3119:831;;3220:26;3248:27;3279:50;3311:6;3319:9;3279:31;:50::i;:::-;3343:25;;;:46;;;3403:26;;;:48;;;3556:37;;;;3219:110;;-1:-1:-1;3219:110:3;-1:-1:-1;3556:66:3;;3219:110;3556:66;:45;:66;:::i;:::-;3516:37;;;:106;3780:1;3734:37;;;;:48;;;:45;:48;:::i;:::-;3694:37;;;:88;3885:54;;3932:6;;3917:13;;3885:54;;;;;3119:831;;;4029:40;:19;4057:11;4029:40;:27;:40;:::i;:::-;4000:69;;4177:37;;;;:58;;4223:11;4177:58;:45;:58;:::i;:::-;4137:18;:37;;:98;;;;1153:1:4;;;;;;1551:2691:3;;;:::o;1871:25:7:-;;;;:::o;1064:467:20:-;1143:10;1219:13;:11;:13::i;:::-;:25;;;1245:6;1253;1219:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1219:41:20;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;1337:68:20;;;:60;:68;;;:60;;:68;:60;:68;;1293:142;;1419:6;1293:30;:142::i;:::-;1488:6;1469:55;;;1508:6;1469:55;;;;;;;;;;;;;;;1064:467;;:::o;3851:41:7:-;;;;:::o;1195:195:29:-;1291:7;1321:62;1360:22;;1321:30;;:38;;:62;;;;:::i;:::-;1314:69;;1195:195;:::o;3645:232:24:-;3738:10;3722:13;3758:20;;;:13;:20;;;;;;:29;;;3802:68;3781:6;;3738:10;;3802:68;;3722:13;3802:68;3645:232;;:::o;1110:140:25:-;1191:52;1224:6;1232:10;1191:32;:52::i;1006:43:53:-;;;;;;;;;;;;;;;:::o;1416:742:25:-;1519:14;1716:25;;:::i;:::-;-1:-1:-1;1744:17:25;;;;:9;:17;;;;;;;;1716:45;;;;;;;;;;;;;;;;;;;;;;;;;;;1744:17;1892:34;1744:17;1892:26;:34::i;:::-;1811:115;;;;1988:140;2026:4;:18;;;2058:23;2095;1988:24;:140::i;:::-;-1:-1:-1;1976:152:25;1416:742;-1:-1:-1;;;;;1416:742:25:o;2158:51:7:-;;;;;;;;;;;;;:::o;2430:138:53:-;2511:16;2550:11;2543:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2430:138;:::o;2904:40:7:-;;;;;;:::o;1447:257:0:-;955:27:53;:25;:27::i;:::-;1648:21:0;:19;:21::i;:::-;1679:18;:16;:18::i;:::-;1447:257::o;1099:855:21:-;1212:37;;:::i;:::-;1335:30;1308:59;;:20;:59;;1275:102;1308:59;1275:19;:102::i;:::-;1265:112;-1:-1:-1;1406:32:21;1391:11;:47;;;;;;;;;1387:537;;;1645:18;1666:13;:11;:13::i;:::-;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1666:33:21;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1666:33:21;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1666:33:21;;;;;;;;;1645:54;;1743:66;:47;1762:7;:27;;;1743:47;;:10;:18;;:47;;;;:::i;:::-;:64;:66::i;:::-;1713:96;;;;:27;;;:96;1869:24;;;;1850:63;;:44;;:10;;:44;;:18;:44;:::i;:63::-;1823:90;;:24;;;:90;-1:-1:-1;1099:855:21;;;:::o;3203:41:7:-;;;;;;;;;:::o;2375:759:25:-;2495:14;2525:25;;:::i;:::-;-1:-1:-1;2553:17:25;;;;:9;:17;;;;;;;;2525:45;;;;;;;;;;;;;;;;;;;;;;;;;;;2553:17;2701:34;2553:17;2701:26;:34::i;:::-;2620:115;;;;2786:32;2822:140;2860:4;:18;;;2892:23;2929;2822:24;:140::i;:::-;2783:179;;;2979:148;3016:6;3036;3056:24;3094:23;2979;:148::i;:::-;2972:155;2375:759;-1:-1:-1;;;;;;;2375:759:25:o;1049:30:7:-;;;;;;:::o;1957:49::-;;;;;;;;;;;;;:::o;3007:276:21:-;3124:37;;:::i;:::-;3207:36;;;;;;;:28;:36;;;;;;;;:44;;;;;;;;3187:65;;:19;:65::i;928:329:62:-;882:22;:20;:22::i;:::-;1024;;;1020:231;;1062:70;1084:47;:45;:47::i;1062:70::-;1020:231;;;1163:5;:16;;;;;;;;;;;;1198:42;;1163:16;;1219:10;;1198:42;;1163:5;1198:42;928:329;:::o;3404:2420:27:-;3532:12;;3508:21;3574:24;3532:12;3596:1;3574:24;:21;:24;:::i;:::-;3554:44;;3689:47;;:::i;:::-;-1:-1:-1;3739:33:27;;;;:22;:33;;;;;;;;;3689:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3782:76;;3841:7;;;;;3782:76;3953:35;;:::i;:::-;-1:-1:-1;3991:24:27;;;;:16;:24;;;;;;;;:35;;;;;;;;;3953:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4036:65;;4084:7;;;;;;4036:65;4216:24;;;;:16;:24;;;;;;;;:35;;;;;;;;4209:42;;;;;;;;;;;;;;4312:67;4352:9;4363:15;4312:39;:67::i;:::-;4294:85;;4576:22;4600:21;4625:103;4655:6;4675:7;4696:9;:22;;;4625:16;:103::i;:::-;4575:153;;;;4822:6;4795:13;4770:123;4842:14;4870:13;4770:123;;;;;;;;;;;;;;;;4904:19;4926:37;:14;4949:13;4926:37;:22;:37;:::i;:::-;5141;;;;4904:59;;-1:-1:-1;5141:58:27;;4904:59;5141:58;:45;:58;:::i;:::-;5089:37;;;:110;;;5019:33;;;;:22;:33;;;;;;;;:55;;:180;;;;5384:34;;;:45;;5427:1;5384:45;:42;:45;:::i;:::-;5335:34;;;;:94;;;5268:33;;;;:22;:33;;;;;;;:52;;:161;;;;5540:34;5536:282;;5659:37;;;;5714:32;;5632:9;;5600:207;;5714:79;;5659:37;5714:79;:40;:79;:::i;:::-;5600:207;;;;;;;;;;;;;;;;3404:2420;;;;;;;;;:::o;2628:226:53:-;2725:10;2714:22;;;;:10;:22;;;;;;;;2709:139;;2752:85;2774:62;2825:10;2774:50;:62::i;4182:334:19:-;4344:12;1593:10;4415:31;;4460:10;4484:15;4379:130;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;4379:130:19;;;49:4:-1;25:18;;61:17;;4379:130:19;182:15:-1;4379:130:19;;;;179:29:-1;;;;160:49;;;4379:130:19;-1:-1:-1;4182:334:19;;;;:::o;1511:170:59:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;965:364:60;1051:7;1082:1;1078;:5;1074:227;;;1099:191;1121:168;1178:59;1255:1;1274;1121:39;:168::i;1099:191::-;-1:-1:-1;1317:5:60;;;965:364::o;7958:370:19:-;8128:12;3687:10;8199:43;;8256:16;8286:25;8163:158;;;;;;;;;;6709:200:27;6789:4;6781:21;6816:15;;6812:91;;6847:17;:15;:17::i;:::-;:25;;;6879:10;6847:45;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6847:45:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6847:45:27;;;;;6709:200;:::o;7043:259::-;7126:19;7175:91;7239:26;;7175:17;:15;:17::i;:::-;:27;;;7211:4;7175:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7175:42:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7175:42:27;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;7175:42:27;;;;;;;;;:63;:91;:63;:91;:::i;2012:741:29:-;2188:15;2156:29;2297:41;:39;:41::i;:::-;2274:64;;2367:21;2352:12;:36;2348:219;;;2404:152;2426:129;2490:12;2520:21;2426:46;:129::i;2404:152::-;2625:12;;2605:17;;2625:23;;2646:1;2625:23;:20;:23;:::i;:::-;2658:12;:24;-1:-1:-1;;2692:30:29;:54;2012:741::o;2569:468:22:-;2688:37;;:::i;:::-;-1:-1:-1;2741:20:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2795:12;;2741:20;;2821:36;;2817:190;;;2896:32;:13;:30;:32::i;:::-;2873:55;;;;2972:24;;;;2942:54;;:27;;;:54;2817:190;-1:-1:-1;2569:468:22;;;:::o;1866:135:60:-;1951:7;1985:1;1981;:5;:13;;1993:1;1981:13;;;-1:-1:-1;1989:1:60;;1974:20;-1:-1:-1;1866:135:60:o;4522:300:19:-;4658:12;1751:10;4729:35;;4778:6;4798:7;4693:122;;;;;;;;;;3873:530:22;4040:37;;:::i;:::-;4080:31;4100:10;4080:19;:31::i;:::-;4040:71;;4148:68;:49;4190:6;4156:7;:24;;;4148:33;;:41;;:49;;;;:::i;:68::-;4121:95;;;;:24;;;:95;4264:27;;;;4256:71;;:52;;:36;4301:6;4256:52;:44;:52;:::i;:71::-;4226:101;;:27;;;:101;4362:34;4376:10;4226:7;4362:13;:34::i;1263:255:62:-;1357:5;;;;1343:10;:19;1339:173;;1481:5;;1378:123;;1400:100;;1453:10;;1481:5;;1400:35;:100::i;2940:602:53:-;3081:20;;;3077:127;;3117:76;3139:53;:51;:53::i;3117:76::-;3279:18;;;;;;;:10;:18;;;;;;;;3275:134;;;3313:85;3335:62;3390:6;3335:54;:62::i;3313:85::-;3419:18;;;;;;;3440:4;3419:18;;;;;;;;:25;;;;;;;;3454:11;27:10:-1;;23:18;;;45:23;;3454:24:53;;;;;;;;;;;;;;3493:42;3524:10;;3419:18;3493:42;;;2940:602;:::o;6099:923:20:-;6297:32;6322:6;6297:24;:32::i;:::-;6340:82;6386:6;6406;6340:32;:82::i;:::-;6546:36;;;;;;;:28;:36;;;;;;;;:44;;;;;;;;6512:108;;6604:6;6512:20;:108::i;:::-;6728:31;;;;:23;:31;;;;;6694:95;;6773:6;6694:20;:95::i;:::-;6953:30;6926:59;;:20;:59;;6892:123;6926:59;6999:6;6892:20;:123::i;4983:886::-;5176:32;5201:6;5176:24;:32::i;:::-;5219:82;5265:6;5285;5219:32;:82::i;:::-;5425:36;;;;;;;:28;:36;;;;;;;;:44;;;;;;;;5391:108;;5483:6;5391:20;:108::i;:::-;5607:31;;;;:23;:31;;;;;5573:95;;5652:6;5573:20;:95::i;:::-;5800:30;5773:59;;:20;:59;;5739:123;5773:59;5846:6;5739:20;:123::i;1268:1121:22:-;1491:33;1509:7;1518:5;1491:17;:33::i;:::-;1487:70;;;1540:7;;1487:70;1613:34;;:::i;:::-;1650:28;1670:7;1650:19;:28::i;:::-;1613:65;;1688:32;;:::i;:::-;1723:26;1743:5;1723:19;:26::i;:::-;1688:61;;1808:4;:21;;;1799:30;;:6;:30;1795:248;;;1845:187;1884:134;1951:6;1979:4;:21;;;1884:134;;:45;:134::i;1845:187::-;2122:21;;;;2114:65;;:46;;:30;;2153:6;2114:46;:38;:46;:::i;:65::-;2090:89;;;;:21;;;;:89;;;;2219:19;;;2211:63;;:44;;:28;2248:6;2211:44;:36;:44;:::i;:63::-;2189:85;;:19;;;:85;2320:28;2334:7;2343:4;2320:13;:28::i;:::-;2358:24;2372:5;2379:2;2358:13;:24::i;:::-;1268:1121;;;;;:::o;5883:393:24:-;5979:16;5998:17;;;:9;:17;;;;;:26;;;6038:10;:22;;6034:236;;6076:183;6115:130;6189:10;6221:6;6115:52;:130::i;4842:908::-;714:5:5;5047:34:24;;;;5043:701;;;5152:218;5174:195;5231:66;5315:6;5339:16;5174:39;:195::i;5152:218::-;5043:701;;;5411:20;5391:40;;:16;:40;;;5387:357;;5508:225;5530:202;5587:73;5678:6;5702:16;5530:39;:202::i;1335:383:60:-;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;2747:241:54:-;2844:12;1416:10;2915:36;;2965:6;2879:102;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2879:102:54;;;49:4:-1;25:18;;61:17;;2879:102:54;182:15:-1;2879:102:54;;;;179:29:-1;;;;160:49;;;2879:102:54;-1:-1:-1;2747:241:54;;;:::o;3715:887:53:-;3845:18;;;;;;;:10;:18;;;;;;;;3840:131;;3879:81;3901:58;3952:6;3901:50;:58::i;3879:81::-;3993:11;:18;3984:27;;3980:201;;4027:143;4049:120;4114:5;4137:11;:18;;;;4049:47;:120::i;4027:143::-;4216:6;4194:28;;:11;4206:5;4194:18;;;;;;;;;;;;;;;;;;;;:28;4190:212;;4238:153;4260:130;4334:11;4346:5;4334:18;;;;;;;;;;;;;;;;;;;;4370:6;4260:56;:130::i;4238:153::-;4419:18;;;;;;;:10;:18;;;;;4412:25;;;;;;4468:11;4480:18;;:22;;;;4468:35;;;;;;;;;;;;;;;;4447:11;:18;;4468:35;;;;;4459:5;;4447:18;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;4513:11;:23;;;;;;;;;:::i;:::-;-1:-1:-1;4551:44:53;;4584:10;;4551:44;;;;;;;;;3715:887;;:::o;5130:789:28:-;5394:22;:48;;;5452:26;:56;;;;;;;;;;;;;;5518:16;:36;;;5564:25;:54;;5628:58;;;;;;5564:54;;;;;;;;5628:58;;;;;;;5702:210;;;;;;5419:23;;5481:27;;5537:17;;5592:26;;5658:28;;5702:210;;;;;;;;;;5130:789;;;;;:::o;3900:276:19:-;4021:12;1445:10;4092:40;;4146:13;4056:113;;;;;;;;;5784:512:3;6048:11;6035:9;:24;;:42;;;;-1:-1:-1;6063:9:3;:14;;6035:42;6031:259;;;6093:186;6132:133;6205:11;6238:9;6132:51;:133::i;4910:681::-;5055:20;5182:17;;;:9;:17;;;;;:26;5055:20;;;;5138:100;;5182:26;;5192:6;5138:30;:100::i;:::-;:120;;;5114:144;;;-1:-1:-1;5284:33:3;:10;5114:144;5284:33;:18;:33;:::i;:::-;5425:26;;5269:48;;-1:-1:-1;5343:195:3;;5378:150;;5425:26;;714:5:5;5269:48:3;5378:29;:150::i;:::-;5343:13;;:195;:21;:195;:::i;:::-;5327:211;-1:-1:-1;;4910:681:3;;;;;:::o;3190:530:22:-;3357:37;;:::i;:::-;3397:31;3417:10;3397:19;:31::i;:::-;3357:71;;3465:68;:49;3507:6;3473:7;:24;;;3465:33;;:41;;:49;;;;:::i;:68::-;3438:95;;;;:24;;;:95;3581:27;;;;3573:71;;:52;;:36;3618:6;3573:52;:44;:52;:::i;3371:1313:25:-;3539:37;3569:6;3539:29;:37::i;:::-;3632:15;3650:205;3687:6;3707;3829:1;3844;3650:23;:205::i;:::-;4170:36;;;;;;;:28;:36;;;;;;;;:44;;;;;;;;3632:223;;-1:-1:-1;4150:65:25;;:19;:65::i;:::-;4091:36;;;;;;;;:28;:36;;;;;;;;:44;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4264:12;;4260:236;;4340:37;4361:6;4369:7;4340:20;:37::i;:::-;4442:17;:15;:17::i;:::-;:26;;;4469:6;4477:7;4442:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4442:43:25;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4442:43:25;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4442:43:25;;;;;;;;;;4260:236;4646:31;4670:6;4646:23;:31::i;6161:469:27:-;6273:14;6301:20;6346:17;6366:23;6387:1;6366:12;;:20;;:23;;;;:::i;:::-;6346:43;;6399:35;;:::i;:::-;-1:-1:-1;6437:24:27;;;;:16;:24;;;;;;;;:35;;;;;;;;6399:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6542:33;;;:22;:33;;;;;;6491:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6399:73;6491:85;;6399:73;;6491:39;:85::i;:::-;6482:94;;6601:9;:22;;;6586:37;;6161:469;;;;;:::o;6947:624:25:-;7123:22;;7188:17;7184:333;;7238:11;7221:28;;7184:333;;;7297:144;7343:22;;;714:5:5;7416:11:25;7297:28;:144::i;:::-;7280:161;-1:-1:-1;7471:35:25;:11;7280:161;7471:35;:19;:35;:::i;:::-;7455:51;;7184:333;6947:624;;;;;;:::o;1501:285:29:-;1625:32;:30;:32::i;:::-;1738:15;1705:30;:48;1778:1;1763:12;:16;1501:285::o;3334:669:28:-;3435:29;:27;:29::i;:::-;3537:7;3591:28;3657:21;3724:1;3773;3785:211;3537:7;3591:28;3657:21;3724:1;3773;3785:10;:211::i;876:395:18:-;995:1;1011:10;;;:15;;1007:240;;1042:194;1064:171;1124:78;1220:1;1064:42;:171::i;7937:1833:25:-;8207:12;;8153:14;;8229:44;;:::i;:::-;-1:-1:-1;8276:36:25;;;;;;;:28;:36;;;;;;;;:44;;;;;;;;;8229:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8548:44;;8544:83;;;8615:1;8608:8;;;;;;8544:83;8771:174;8819:14;8847:13;8874:24;8912:23;8771:34;:174::i;:::-;9106:27;;8762:183;;-1:-1:-1;9064:31:25;;9098:47;;:36;;9143:1;9098:47;:44;:47;:::i;:::-;9064:81;;9164:246;9192:208;9242:6;9266:14;:34;;;9192:208;;9318:14;:27;;;9192:208;;9363:23;9192:32;:208::i;:::-;9164:6;;:246;:14;:246;:::i;:::-;9155:255;;9510:229;9538:191;9588:6;9612:14;:31;;;9538:191;;9661:23;9702:13;9538:32;:191::i;9510:229::-;9501:238;-1:-1:-1;;;;7937:1833:25;;;;;;;:::o;669:159:58:-;787:34;;;;;;;;;;;;;;;;;669:159;:::o;8245:1186:27:-;8559:23;;8448:15;;8555:73;;8603:14;;8555:73;8758:32;;8804:23;;8841:34;;;;8889:23;;;;8926:34;;;;8974:25;;8718:332;;8758:32;8804:23;8841:34;8889:23;8926:34;8974:25;;;;;9013:27;;;;8718:26;:332::i;:::-;9294:37;;;;9253:32;;8708:342;;-1:-1:-1;9226:24:27;;9253:79;;;:40;:79;:::i;:::-;9226:106;;9365:7;9346:16;:26;9342:83;;;9398:16;9388:26;;9342:83;8245:1186;;;;;:::o;5352:993:25:-;5496:22;5520:21;5557:25;;:::i;:::-;-1:-1:-1;5585:17:25;;;;:9;:17;;;;;;;;;5557:45;;;;;;;;;;;;;;;;;;;;;;;;;5704:112;;5774:6;5794:12;5704:24;:112::i;:::-;5670:146;;-1:-1:-1;5670:146:25;-1:-1:-1;5831:18:25;;5827:173;;5932:17;:15;:17::i;:::-;5959:13;;5932:57;;;;;:26;;;;;;;;:57;;5974:14;;5932:57;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5932:57:25;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5932:57:25;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5932:57:25;;;;;;;;;;5827:173;6014:17;;6010:280;;6095:43;6116:6;6124:13;6095:20;:43::i;:::-;6222:57;6243:6;6251:13;6266:12;6222:20;:57::i;:::-;-1:-1:-1;5352:993:25;;;;;;:::o;2245:241:54:-;2342:12;1106:10;2413:36;;2463:6;2377:102;;;;;;;;;731:322:61;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;919:127:61;;;49:4:-1;25:18;;61:17;;919:127:61;182:15:-1;919:127:61;;;;179:29:-1;;;;160:49;;;919:127:61;-1:-1:-1;731:322:61;;;;;:::o;5163:344:19:-;5320:12;2088:10;5391:38;;5443:12;5469:21;5355:145;;;;;;;;;;1383:395:18;1502:1;1518:10;;;:15;;1514:240;;1549:194;1571:171;1631:78;1727:1;1571:42;:171::i;5717:510:22:-;6066:20;;6040:46;;6126:24;;;;6193:27;;;;;6096:54;6160:60;;;;;;6096:54;;;;;;;6040:46;;;;;;;;;;;;6096:54;;;;;6160:60;;;;5717:510::o;387:276:58:-;511:12;183:10;582:25;;621:6;641:5;546:110;;;;;;;;;;2994:161:54;3113:35;;;;;;;;;;;;;;;;;2994:161;:::o;2492:249::-;2593:12;1265:10;2664:40;;2718:6;2628:106;;;;;;;;;4215:408:24;879:42:5;4313:17:24;;;:9;:17;;;;;:26;:41;:26;4309:308;;4441:165;4480:112;4541:6;4569:5;4480:39;:112::i;5149:409:22:-;5306:37;;:::i;:::-;5346:31;5366:10;5346:19;:31::i;:::-;5306:71;;5414:68;:49;5456:6;5422:7;:24;;;5414:33;;:41;;:49;;;;:::i;:68::-;5387:95;;:24;;;:95;5517:34;5531:10;5387:7;5517:13;:34::i;4574:404::-;4726:37;;:::i;:::-;4766:31;4786:10;4766:19;:31::i;:::-;4726:71;;4834:68;:49;4876:6;4842:7;:24;;;4834:33;;:41;;:49;;;;:::i;6460:525::-;6832:38;6888:42;6811:133;;6460:525::o;4828:329:19:-;4977:12;1926:10;5048:45;;5107:13;5134:6;5012:138;;;;;;;;;;6203:367;6382:12;2763:10;6453:29;;6496:10;6520:6;6540:13;6417:146;;;;;;;;;;;1947:292:54;2078:12;955:10;2149:34;;2197:5;2216:6;2113:119;;;;;;;;;;1622:319;1767:12;801:10;1838:42;;1894:10;1918:6;1802:132;;;;;;;;;;6879:376:19;7052:12;3515:10;7123:43;;7180:23;7217:21;7087:161;;;;;;;;;;3189:300:65;3353:21;3406:46;3440:11;3406:25;:9;3424:6;3406:25;:17;:25;:::i;:::-;:33;:46;:33;:46;:::i;7446:542:27:-;7565:12;;7545:17;;7565:23;;7586:1;7565:23;:20;:23;:::i;:::-;7545:43;;7598:35;;:::i;:::-;-1:-1:-1;7636:24:27;;;;:16;:24;;;;;;;;:35;;;;;;;;;7598:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7755:28;7751:231;;7799:172;7838:119;7902:6;7930:9;7838:42;:119::i;11907:245:25:-;12025:23;;;;:15;:23;;;;;;:39;;12057:6;12025:39;:31;:39;:::i;:::-;11999:23;;;;:15;:23;;;;;:65;12103:26;;:42;;12138:6;12103:42;:34;:42;:::i;:::-;12074:26;:71;-1:-1:-1;;11907:245:25:o;3955:293:23:-;4207:34;4228:6;4236:1;4239;4207:20;:34::i;3762:545:65:-;3925:21;4165:104;4257:11;4165:70;4212:22;4257:11;4232:1;4212:22;:19;:22;:::i;:::-;4165:25;:9;4183:6;4165:25;:17;:25;:::i;:::-;:46;:70;:46;:70;:::i;2868:369:29:-;2958:30;;:35;2954:277;;3009:211;3048:158;3110:78;3048:40;:158::i;4084:542:28:-;4171:22;;:27;;;;:74;;-1:-1:-1;4214:26:28;;;;:31;;4171:74;:111;;;;-1:-1:-1;4261:16:28;;:21;;4171:111;:157;;;;-1:-1:-1;4298:25:28;;;;:30;;4171:157;:205;;;;-1:-1:-1;4344:27:28;;;;;;;:32;;4171:205;4167:453;;;4401:208;4440:155;4502:75;4440:40;:155::i;1059:297:61:-;1199:12;344:10;1270:31;;1315:9;1338:1;1234:115;;;;;;;;;;10223:1151:25;10487:7;10609:29;;;:61;;-1:-1:-1;10642:28:25;;10609:61;10605:100;;;-1:-1:-1;10693:1:25;10686:8;;10605:100;10848:31;10913:24;:13;10935:1;10913:24;:21;:24;:::i;:::-;10882:27;;:55;;;;:150;;11001:14;:31;;;10882:150;;;10952:14;:34;;;10882:150;10848:184;;;-1:-1:-1;11098:28:25;11094:67;;11149:1;11142:8;;;;;11094:67;11216:151;11259:24;11297:23;11334;11216:29;:151::i;:::-;11209:158;10223:1151;-1:-1:-1;;;;;;10223:1151:25:o;4641:1006:23:-;4855:14;4968:28;;;:54;;;5014:8;5000:10;:22;4968:54;4964:93;;;-1:-1:-1;5045:1:23;5038:8;;4964:93;5121:8;5108:10;:21;5100:53;;;;;;;;;;;;;;5201:36;;:::i;:::-;5240:47;5268:6;5276:10;5240:27;:47::i;:::-;5201:86;;5297:34;;:::i;:::-;5334:45;5362:6;5370:8;5334:27;:45::i;:::-;5297:82;;5425:215;5467:9;:19;;;5500:9;:21;;;5535:11;:21;;;5570:11;:23;;;5607;5425:28;:215::i;1676:2058:15:-;1944:15;1975;1993:37;2014:4;2020:9;1993:20;:37::i;:::-;1975:55;;2040:17;2060:39;2081:5;2088:10;2060:20;:39::i;:::-;2040:59;-1:-1:-1;2113:13:15;;;:32;;-1:-1:-1;2130:15:15;;2113:32;2109:81;;;-1:-1:-1;2178:1:15;;-1:-1:-1;2161:18:15;;-1:-1:-1;2161:18:15;2109:81;2953:8;2976:10;2964:8;:22;;:128;;3054:38;3071:10;3083:8;3054:16;:38::i;:::-;2964:128;;;3001:38;3018:8;3028:10;3001:16;:38::i;:::-;2953:139;;3106:191;3136:151;3173:18;3189:1;3173:15;:18::i;:::-;3216:14;3209:22;;3256:16;3249:24;;3136:19;:151::i;:::-;3106:16;:191::i;:::-;3102:195;;3519:10;3507:8;:22;;:114;;3590:31;3607:10;3619:1;3590:16;:31::i;:::-;3507:114;;;3544:31;3561:10;3573:1;3544:16;:31::i;:::-;3503:118;;3690:37;3711:1;3714:12;3690:20;:37::i;:::-;3680:47;1676:2058;-1:-1:-1;;;;;;;;;;;1676:2058:15:o;11518:245:25:-;11636:23;;;;:15;:23;;;;;;:39;;11668:6;11636:39;:31;:39;:::i;:::-;11610:23;;;;:15;:23;;;;;:65;11714:26;;:42;;11749:6;11714:42;:34;:42;:::i;1932:1776:23:-;2218:23;2244:42;;;:34;:42;;;;;;2320:12;;2422:32;;;2418:69;;;2470:7;;;;2418:69;2497:51;;:::i;:::-;-1:-1:-1;2563:32:23;;;;:24;:32;;;;;;;;:49;;;;;;;;;2497:115;;;;;;;;;;;;;;;;;;;2664:41;;:::i;:::-;2719:50;2742:26;2719:22;:50::i;:::-;2715:790;;;2931:187;2965:26;:36;;;3019:26;:38;;;3075:6;3099:5;2931:16;:187::i;:::-;2899:28;;;2870:248;;;;;;3261:126;;2870:248;3261:22;:126::i;:::-;3229:28;;;3200:187;;;2715:790;;;3447:28;;;3418:76;;;;;;2715:790;3567:32;;;;:24;:32;;;;;;;;:47;;;;;;;;:66;;;;;;;;;;;;;;;;3643:42;;;:34;:42;;;;;;:58;-1:-1:-1;;;;1932:1776:23:o;6576:297:19:-;6709:12;2906:10;6780:29;;6823:6;6843:13;6744:122;;;;;;;;;;122:448:60;208:7;235:6;231:45;;-1:-1:-1;264:1:60;257:8;;231:45;297:5;;;301:1;297;:5;:1;316:5;;;;;:10;312:234;;342:193;364:170;421:61;500:1;519;364:39;:170::i;576:383::-;662:7;689:6;685:223;;711:186;733:163;790:54;862:1;881;733:39;:163::i;711:186::-;917:9;933:1;929;:5;;;;;;;576:383;-1:-1:-1;;;;576:383:60:o;8334:291:19:-;8465:12;3840:10;8536:33;;8583:6;8603:5;8500:118;;;;;;;;;;7261:249;7368:12;7439:29;7488:4;7482:11;;;;;;;;7403:100;;;;;;;;;6619:1136:23;6733:41;;:::i;:::-;-1:-1:-1;6858:32:23;;;;:24;:32;;;;;;;;:39;;;;;;;;;6839:58;;;;;;;;;;;;;;;;;;;6911:40;6839:58;6911:22;:40::i;:::-;6907:94;;;6967:23;;6907:94;7062:17;7082:16;:5;7096:1;7082:16;:13;:16;:::i;:::-;7127:32;;;;:24;:32;;;;;;;;:43;;;;;;;;;7108:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7062:36:23;-1:-1:-1;7184:40:23;7108:62;7184:22;:40::i;:::-;7180:94;;;-1:-1:-1;7240:23:23;;7180:94;7352:23;7378:42;;;:34;:42;;;;;;7434:23;;;7430:237;;;7492:32;;;;:24;:32;;;;;;;;:49;;;;;;;;;7473:68;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7559:40:23;7473:68;7559:22;:40::i;:::-;7555:102;;;-1:-1:-1;7619:23:23;;-1:-1:-1;7619:23:23;7555:102;-1:-1:-1;;7725:23:23;;;;;;;;;-1:-1:-1;7725:23:23;;7746:1;7725:23;;;;;6619:1136;-1:-1:-1;;;6619:1136:23:o;3284:588:57:-;3461:14;3495:6;3491:45;;-1:-1:-1;3524:1:57;3517:8;;3491:45;3549:7;3545:113;;3588:59;3644:2;3588:30;:1;3615:2;3588:30;:26;:30;:::i;:59::-;3579:68;-1:-1:-1;3572:75:57;;3545:113;3667:17;3687:64;3736:14;:2;3747;3736:14;:10;:14;:::i;:::-;3687:27;:2;3711;3687:27;:23;:27;:::i;:64::-;3667:84;-1:-1:-1;3761:11:57;3775:21;3667:84;3793:2;3775:21;:17;:21;:::i;:::-;3761:35;-1:-1:-1;3813:52:57;3862:2;3813:27;:1;3761:35;3813:27;:22;:27;:::i;:52::-;3806:59;;;;3284:588;;;;;;;;:::o;5112:582:16:-;5174:8;5217:1;5205;5198:21;5194:215;;;5235:163;5257:140;5316:48;5382:1;5257:41;:140::i;5235:163::-;5441:1;5429;5422:21;5418:215;;;5459:163;5481:140;5540:48;5606:1;5481:41;:140::i;5459:163::-;5646:41;5651:24;5663:1;839:66;5651:4;:24::i;:::-;5684:1;5646:4;:41::i;2570:112::-;2626:8;2650:25;2655:16;2660:1;839:66;2655:4;:16::i;5945:5424::-;5990:8;839:66;6014:1;:14;6010:206;;;6044:161;6066:138;6123:48;6189:1;6066:39;:138::i;6044:161::-;6234:1;6229;:6;6225:198;;6251:161;6273:138;6330:48;6396:1;6273:39;:138::i;6251:161::-;839:66;6436:1;:12;6432:51;;;-1:-1:-1;6471:1:16;6464:8;;6432:51;1318:66;6496:1;:15;6492:64;;-1:-1:-1;1498:75:16;6527:18;;6492:64;6566:8;6584;6602;6915:66;6903:1;:79;6899:316;;6998:79;;;;;7124:66;839;7103:11;;:88;7099:92;;6899:316;7259:66;7247:1;:79;7243:316;;7342:79;;;;;7468:66;839;7447:11;;:88;7443:92;;7243:316;7602:66;7590:1;:79;7586:314;;7685:79;;;;;7810:66;839;7789:11;;:88;7785:92;;7586:314;7943:66;7931:1;:79;7927:314;;8026:79;;;;;8151:66;839;8130:11;;:88;8126:92;;7927:314;8284:66;8272:1;:79;8268:314;;8367:79;;;;;8492:66;839;8471:11;;:88;8467:92;;8268:314;8625:66;8613:1;:79;8609:314;;8708:79;;;;;8833:66;8720;8812:11;;:88;8808:92;;8609:314;8968:66;8956:1;:79;8952:318;;9051:79;;;;;9178:66;839;9157:11;;:88;9153:92;;8952:318;9316:66;9304:1;:79;9300:320;;9399:79;;;;;9527:66;839;9506:11;;:88;9502:92;;9300:320;9667:66;9655:1;:79;9651:322;;9750:79;;;;;9879:66;839;9858:11;;:88;9854:92;;9651:322;10138:11;;;;-1:-1:-1;10138:11:16;;-1:-1:-1;839:66:16;10163:5;;;:15;;-1:-1:-1;10241:35:16;10198:39;;;10193:45;;:83;10188:88;;;;839:66;10286:1;10282;:5;:15;;;;;;10278:19;;10389:35;10384:1;10346:35;:39;10341:1;:45;:83;;;;;;10336:88;;;;839:66;10434:1;10430;:5;:15;;;;;;10426:19;;10537:35;10532:1;10494:35;:39;10489:1;:45;:83;;;;;;10484:88;;;;839:66;10582:1;10578;:5;:15;;;;;;10574:19;;10685:35;10680:1;10642:35;:39;10637:1;:45;:83;;;;;;10632:88;;;;839:66;10730:1;10726;:5;:15;;;;;;10722:19;;10833:35;10828:1;10790:35;:39;10785:1;:45;:83;;;;;;10780:88;;;;839:66;10878:1;10874;:5;:15;;;;;;10870:19;;10981:35;10976:1;10938:35;:39;10933:1;:45;:83;;;;;;10928:88;;;;839:66;11026:1;11022;:5;:15;;;;;;11018:19;;11129:35;11124:1;11086:35;:39;11081:1;:45;:83;;;;;;11076:88;;;;839:66;11174:1;11170;:5;:15;;;;;;11166:19;;11277:35;11272:1;11234:35;:39;11229:1;:45;:83;;;;;;11224:88;;;;5945:5424;;;;;;:::o;2754:119::-;2823:8;2847:19;2852:10;2857:1;2860;2852:4;:10::i;11466:5743::-;11512:8;1498:75;11536:15;;11532:105;;;-1:-1:-1;11625:1:16;11618:8;;11532:105;11650:6;11646:51;;-1:-1:-1;839:66:16;11672:14;;11646:51;1438:1;11710;:15;11706:207;;;11741:161;11763:138;11820:48;11886:1;11763:39;:138::i;11741:161::-;839:66;12382;12378:70;;12462:5;;;:15;;;12488:18;12484:22;;12479:27;;;;;12378:70;;12546:5;;;:15;12542:19;;12568:1;12572:18;12568:22;12563:27;;;;839:66;12634:1;12630;:5;:15;;;;;;12626:19;;12652:1;12656:18;12652:22;12647:27;;;;839:66;12718:1;12714;:5;:15;;;;;;12710:19;;12736:1;12740:18;12736:22;12731:27;;;;839:66;12802:1;12798;:5;:15;;;;;;12794:19;;12820:1;12824:18;12820:22;12815:27;;;;839:66;12886:1;12882;:5;:15;;;;;;12878:19;;12904:1;12908:18;12904:22;12899:27;;;;839:66;12970:1;12966;:5;:15;;;;;;12962:19;;12988:1;12992:18;12988:22;12983:27;;;;839:66;13054:1;13050;:5;:15;;;;;;13046:19;;13072:1;13076:18;13072:22;13067:27;;;;839:66;13138:1;13134;:5;:15;;;;;;13130:19;;13156:1;13160:18;13156:22;13151:27;;;;839:66;13222:1;13218;:5;:15;;;;;;13214:19;;13240:1;13244:18;13240:22;13235:27;;;;839:66;13306:1;13302;:5;:15;;;;;;13298:19;;13324:1;13328:18;13324:22;13319:27;;;;839:66;13390:1;13386;:5;:15;;;;;;13382:19;;13408:1;13412:18;13408:22;13403:27;;;;839:66;13474:1;13470;:5;:15;;;;;;13466:19;;13492:1;13496:18;13492:22;13487:27;;;;839:66;13558:1;13554;:5;:15;;;;;;13550:19;;13576:1;13580:18;13576:22;13571:27;;;;839:66;13642:1;13638;:5;:15;;;;;;13634:19;;13660:1;13664:18;13660:22;13655:27;;;;839:66;13726:1;13722;:5;:15;;;;;;13718:19;;13744:1;13748:18;13744:22;13739:27;;;;839:66;13810:1;13806;:5;:15;;;;;;13802:19;;13828:1;13832:18;13828:22;13823:27;;;;839:66;13894:1;13890;:5;:15;;;;;;13886:19;;13912:1;13916:18;13912:22;13907:27;;;;839:66;13978:1;13974;:5;:15;;;;;14208:2;;;;;;14062:18;13974:15;;;13991:27;;;14058:22;:26;;839:66;14058:36;;13974:15;-1:-1:-1;14255:66:16;14244:78;;14243:85;14239:304;;14452:66;14359;14348:78;;:171;14344:175;;14239:304;14587:66;14576:78;;14575:85;14571:304;;14784:66;14691;14680:78;;:171;14676:175;;14571:304;14918:66;14907:78;;14906:85;14902:303;;15115:66;15022;15011:78;;:171;15007:175;;14902:303;15248:66;15237:78;;15236:85;15232:303;;15445:66;15352;15341:78;;:171;15337:175;;15232:303;15578:66;15567:78;;15566:85;15562:303;;15775:66;15682;15671:78;;:171;15667:175;;15562:303;15908:66;15897:78;;15896:85;15892:303;;16105:66;16012;16001:78;;:171;15997:175;;15892:303;16240:66;16229:78;;16228:85;16224:305;;16437:66;16344;16333:78;;:171;16329:175;;16224:305;16575:66;16564:78;;16563:85;16559:306;;16772:66;16679;16668:78;;:171;16664:175;;16559:306;16912:66;16901:78;;16900:85;16896:307;;17109:66;17016;17005:78;;:171;17001:175;;16896:307;11466:5743;;;;;:::o;2395:107::-;2451:8;839:66;2475:10;2480:1;2483;2475:4;:10::i;:::-;:20;;;;;;;2395:107;-1:-1:-1;;;2395:107:16:o;3088:437::-;3149:7;3191:1;3179;3172:21;3168:215;;;3209:163;3231:140;3290:48;3356:1;3231:41;:140::i;3209:163::-;3392:8;3403:18;3408:1;3418;3403:4;:18::i;:::-;3392:29;;3440:1;3435;:6;3431:45;;3464:1;3457:8;;;;;3431:45;3514:3;3500:17;;3088:437;-1:-1:-1;;;3088:437:16:o;1023:369:23:-;1352:28;;;:33;;;1023:369::o;408:572:57:-;567:17;;646:7;642:79;;-1:-1:-1;689:2:57;;-1:-1:-1;707:2:57;669:41;;642:79;734:7;730:79;;-1:-1:-1;777:2:57;;-1:-1:-1;795:2:57;757:41;;730:79;830:64;879:14;:2;890;879:14;:10;:14;:::i;:::-;830:27;:2;854;830:27;:23;:27;:::i;:64::-;818:76;-1:-1:-1;918:14:57;:2;929;918:14;:10;:14;:::i;:::-;904:28;-1:-1:-1;408:572:57;;;;;;;;:::o;2687:285::-;2828:23;2865:25;2922:43;2932:9;2943:11;2956:8;2922:9;:43::i;:::-;2915:50;;;;2687:285;;;;;:::o;1674:289:17:-;1805:12;1876:29;1925:5;1919:12;;;;;;;;1945:1;1840:116;;;;;;;;;;17291:384:16;17347:8;17371:6;17367:45;;-1:-1:-1;17400:1:16;17393:8;;17367:45;-1:-1:-1;17425:5:16;;;17429:1;17425;:5;:1;17444:5;;;;;:10;17440:229;;17470:188;17492:165;17543:62;17623:1;17642;17492:33;:165::i;17762:570::-;17818:8;17842:6;17838:218;;17864:181;17886:158;17937:55;18010:1;18029;17886:33;:158::i;17864:181::-;973:66;18069:1;:18;:29;;;;;18091:1;18096:2;18091:7;18069:29;18065:242;;;18114:182;18136:159;18187:56;18261:1;18280;18136:33;:159::i;18114:182::-;18324:1;18320;:5;;;;1384:284:17;1512:12;1583:27;1630:5;1624:12;;;;;;;1435:904:57;1602:23;1639:25;1859:8;1847:9;:20;:46;;;;1885:8;1871:11;:22;1847:46;1843:437;;;1909:19;1944:11;1931:9;:24;;:50;;1970:11;1931:50;;;1958:9;1931:50;1909:72;-1:-1:-1;2009:29:57;1909:72;2029:8;2009:29;:19;:29;:::i;:::-;1995:43;-1:-1:-1;2070:30:57;:9;1995:43;2070:30;:17;:30;:::i;:::-;2052:48;-1:-1:-1;2134:32:57;:11;2154;2134:32;:19;:32;:::i;:::-;2114:52;;1843:437;;;;-1:-1:-1;2215:9:57;;2258:11;;-1:-1:-1;;1435:904:57:o;1969:305:17:-;2109:12;2180:21;2221:5;2215:12;;;;;;;;2241:1;2256;2144:123;;;;;;;;;;;889:1398:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;889:1398:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;889:1398:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;29312:42;29301:54;;31891:35;;31881:2;;31940:1;;31930:12;748:160;;861:2;852:6;847:3;843:16;839:25;836:2;;;-1:-1;;867:12;1328:241;;1432:2;1420:9;1411:7;1407:23;1403:32;1400:2;;;-1:-1;;1438:12;1400:2;1500:53;1545:7;1521:22;1500:53;;1576:491;;;;1714:2;1702:9;1693:7;1689:23;1685:32;1682:2;;;-1:-1;;1720:12;1682:2;85:6;72:20;97:33;124:5;97:33;;;1772:63;-1:-1;1872:2;1911:22;;72:20;97:33;72:20;97:33;;;1676:391;;1880:63;;-1:-1;;;1980:2;2019:22;;;;982:20;;1676:391;2074:366;;;2195:2;2183:9;2174:7;2170:23;2166:32;2163:2;;;-1:-1;;2201:12;2163:2;2263:53;2308:7;2284:22;2263:53;;;2253:63;2353:2;2392:22;;;;475:20;;-1:-1;;;2157:283;2447:398;;;2584:2;2572:9;2563:7;2559:23;2555:32;2552:2;;;-1:-1;;2590:12;2552:2;2652:53;2697:7;2673:22;2652:53;;;2642:63;;2742:2;2801:9;2797:22;628:20;653:49;696:5;653:49;;;2750:79;;;;2546:299;;;;;;3225:257;;3337:2;3325:9;3316:7;3312:23;3308:32;3305:2;;;-1:-1;;3343:12;3305:2;354:6;348:13;366:30;390:5;366:30;;3489:241;;3593:2;3581:9;3572:7;3568:23;3564:32;3561:2;;;-1:-1;;3599:12;3561:2;-1:-1;475:20;;3555:175;-1:-1;3555:175;3737:366;;;3858:2;3846:9;3837:7;3833:23;3829:32;3826:2;;;-1:-1;;3864:12;3826:2;488:6;475:20;3916:63;;4016:2;4059:9;4055:22;72:20;97:33;124:5;97:33;;4110:366;;;4231:2;4219:9;4210:7;4206:23;4202:32;4199:2;;;-1:-1;;4237:12;4199:2;-1:-1;;475:20;;;4389:2;4428:22;;;982:20;;-1:-1;4193:283;4483:364;;;4603:2;4591:9;4582:7;4578:23;4574:32;4571:2;;;-1:-1;;4609:12;4571:2;488:6;475:20;4661:63;;4761:2;4803:9;4799:22;1259:20;29518:10;32524:5;29507:22;32500:5;32497:34;32487:2;;-1:-1;;32535:12;4854:273;;4974:2;4962:9;4953:7;4949:23;4945:32;4942:2;;;-1:-1;;4980:12;4942:2;641:6;628:20;653:49;696:5;653:49;;5134:609;;;;5330:3;5318:9;5309:7;5305:23;5301:33;5298:2;;;-1:-1;;5337:12;5298:2;5399:82;5473:7;5449:22;5399:82;;;5389:92;;5536:82;5610:7;5518:2;5590:9;5586:22;5536:82;;;5526:92;;5655:3;5699:9;5695:22;982:20;5664:63;;5292:451;;;;;;5998:263;;6113:2;6101:9;6092:7;6088:23;6084:32;6081:2;;;-1:-1;;6119:12;6081:2;-1:-1;1130:13;;6075:186;-1:-1;6075:186;6268:737;;;;;;6437:3;6425:9;6416:7;6412:23;6408:33;6405:2;;;-1:-1;;6444:12;6405:2;995:6;982:20;6496:63;;6596:2;6638:9;6634:22;1259:20;1284:32;1310:5;1284:32;;;6604:62;-1:-1;6703:2;6742:22;;982:20;;-1:-1;6811:2;6849:22;;1259:20;1284:32;1259:20;1284:32;;;6819:62;-1:-1;6918:3;6957:22;;1259:20;1284:32;1259:20;1284:32;;;6927:62;;;;6399:606;;;;;;;;;7012:358;;;7129:2;7117:9;7108:7;7104:23;7100:32;7097:2;;;-1:-1;;7135:12;7097:2;1272:6;1259:20;1284:32;1310:5;1284:32;;;7187:62;-1:-1;7286:2;7322:22;;206:20;231:30;206:20;231:30;;13746:213;29312:42;29301:54;;;;7620:37;;13864:2;13849:18;;13835:124;13966:324;29312:42;29301:54;;;7620:37;;29301:54;;14276:2;14261:18;;7620:37;14112:2;14097:18;;14083:207;14297:435;29312:42;29301:54;;;7620:37;;29301:54;;;;14635:2;14620:18;;7620:37;14718:2;14703:18;;8700:37;;;;14471:2;14456:18;;14442:290;14739:324;29312:42;29301:54;;;;7620:37;;15049:2;15034:18;;8700:37;14885:2;14870:18;;14856:207;15401:361;15569:2;15583:47;;;27719:12;;15554:18;;;27994:19;;;15401:361;;27573:14;;;28034;;;;15401:361;8228:260;8253:6;8250:1;8247:13;8228:260;;;8314:13;;29312:42;29301:54;7620:37;;15569:2;27849:14;;;;7531;;;;8275:1;8268:9;8228:260;;;-1:-1;15636:116;;15540:222;-1:-1;;;;;15540:222;15769:201;28398:13;;28391:21;8583:34;;15881:2;15866:18;;15852:118;15977:213;8700:37;;;16095:2;16080:18;;16066:124;16197:431;8700:37;;;29312:42;29301:54;;;;16533:2;16518:18;;7620:37;29518:10;29507:22;16614:2;16599:18;;13253:36;16369:2;16354:18;;16340:288;16635:312;8700:37;;;28398:13;28391:21;16933:2;16918:18;;8583:34;16775:2;16760:18;;16746:201;16954:324;8700:37;;;17264:2;17249:18;;8700:37;17100:2;17085:18;;17071:207;17801:473;17994:2;17979:18;;31427:1;31417:12;;31407:2;;31433:9;31407:2;9181:69;;;18177:2;18162:18;;8700:37;;;;18260:2;18245:18;;;8700:37;17965:309;;18281:368;18449:2;18434:18;;31549:1;31539:12;;31529:2;;31555:9;31529:2;9355:72;;;18635:2;18620:18;8700:37;18420:229;;18656:380;18830:2;18815:18;;28917:63;28974:5;28917:63;;;9538:78;;;29312:42;29301:54;;;;19022:2;19007:18;;;7620:37;18801:235;;19043:483;19241:2;19226:18;;28917:63;28974:5;28917:63;;;9725:76;;;19431:2;19416:18;;8700:37;;;;29518:10;29507:22;19512:2;19497:18;;;13253:36;19212:314;;19880:407;20071:2;20085:47;;;10304:2;20056:18;;;27994:19;10340:66;28034:14;;;10320:87;10426:12;;;20042:245;20294:407;20485:2;20499:47;;;10677:2;20470:18;;;27994:19;10713:66;28034:14;;;10693:87;10799:12;;;20456:245;20708:321;11108:22;;8700:37;;11286:4;11275:16;;;11269:23;11346:14;;;8700:37;11448:4;11437:16;;;11431:23;11508:14;;;8700:37;;;;20880:2;20865:18;;20851:178;21036:301;11809:22;;29312:42;29301:54;7620:37;;11987:4;11976:16;;;11970:23;29518:10;29507:22;12045:14;;;13253:36;;;;21198:2;21183:18;;21169:168;21344:337;12386:22;;29613:18;29602:30;13477:36;;12568:4;12557:16;;;12551:23;29804:26;29793:38;;;12626:14;;;13698:36;;;;12732:4;12721:16;;;12715:23;29793:38;12790:14;;;13698:36;;;;21524:2;21509:18;;21495:186;22239:435;8700:37;;;22577:2;22562:18;;8700:37;;;;22660:2;22645:18;;8700:37;22413:2;22398:18;;22384:290;22681:547;8700:37;;;23048:2;23033:18;;8700:37;;;;23131:2;23116:18;;8700:37;23214:2;23199:18;;8700:37;22883:3;22868:19;;22854:374;23235:659;8700:37;;;23630:2;23615:18;;8700:37;;;;23713:2;23698:18;;8700:37;;;;23796:2;23781:18;;8700:37;23879:3;23864:19;;8700:37;23465:3;23450:19;;23436:458;23901:651;8700:37;;;29518:10;29507:22;;;24290:2;24275:18;;13253:36;24373:2;24358:18;;8700:37;;;;29507:22;;24455:2;24440:18;;13133:49;29507:22;24537:3;24522:19;;13133:49;24127:3;24112:19;;24098:454;25213:419;8700:37;;;29715:4;29704:16;;;25539:2;25524:18;;13592:35;29704:16;25618:2;25603:18;;13592:35;25379:2;25364:18;;25350:282;25639:209;29518:10;29507:22;;;;13253:36;;25755:2;25740:18;;25726:122;25855:316;29518:10;29507:22;;;13253:36;;29507:22;;26157:2;26142:18;;13253:36;25997:2;25982:18;;25968:203;26178:205;29715:4;29704:16;;;;13592:35;;26292:2;26277:18;;26263:120;26390:312;29715:4;29704:16;;;;13592:35;;26688:2;26673:18;;8700:37;26530:2;26515:18;;26501:201;26709:419;29715:4;29704:16;;;;13592:35;;27033:2;27018:18;;8700:37;;;;27114:2;27099:18;;8700:37;26875:2;26860:18;;26846:282;31578:121;31677:1;31670:5;31667:12;31657:2;;31683:9;31832:117;29312:42;31919:5;29301:54;31894:5;31891:35;31881:2;;31940:1;;31930:12;31956:111;32037:5;28398:13;28391:21;32015:5;32012:32;32002:2;;32058:1;;32048:12;32198:110;32283:1;32276:5;32273:12;32263:2;;32299:1;;32289:12;32439:115;29518:10;32524:5;29507:22;32500:5;32497:34;32487:2;;32545:1;;32535:12"
}
}
},
"sources": {
"src/Staking.sol": {
"id": 0
},
"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol": {
"id": 52
},
"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": {
"id": 51
},
"src/interfaces/IStaking.sol": {
"id": 8
},
"src/interfaces/IStructs.sol": {
"id": 13
},
"src/interfaces/IZrxVault.sol": {
"id": 14
},
"src/sys/MixinParams.sol": {
"id": 28
},
"@0x/contracts-utils/contracts/src/LibRichErrors.sol": {
"id": 59
},
"src/immutable/MixinStorage.sol": {
"id": 7
},
"@0x/contracts-utils/contracts/src/Authorizable.sol": {
"id": 53
},
"@0x/contracts-utils/contracts/src/interfaces/IAuthorizable.sol": {
"id": 63
},
"@0x/contracts-utils/contracts/src/interfaces/IOwnable.sol": {
"id": 64
},
"@0x/contracts-utils/contracts/src/LibAuthorizableRichErrors.sol": {
"id": 54
},
"@0x/contracts-utils/contracts/src/Ownable.sol": {
"id": 62
},
"@0x/contracts-utils/contracts/src/LibOwnableRichErrors.sol": {
"id": 58
},
"src/immutable/MixinConstants.sol": {
"id": 5
},
"src/libs/LibStakingRichErrors.sol": {
"id": 19
},
"src/interfaces/IStakingEvents.sol": {
"id": 9
},
"src/interfaces/IStakingProxy.sol": {
"id": 10
},
"src/stake/MixinStake.sol": {
"id": 20
},
"@0x/contracts-utils/contracts/src/LibSafeMath.sol": {
"id": 60
},
"@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": {
"id": 61
},
"src/staking_pools/MixinStakingPool.sol": {
"id": 24
},
"src/sys/MixinAbstract.sol": {
"id": 26
},
"src/staking_pools/MixinStakingPoolRewards.sol": {
"id": 25
},
"@0x/contracts-exchange-libs/contracts/src/LibMath.sol": {
"id": 65
},
"@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": {
"id": 66
},
"src/staking_pools/MixinCumulativeRewards.sol": {
"id": 23
},
"@0x/contracts-utils/contracts/src/LibFractions.sol": {
"id": 57
},
"src/stake/MixinStakeBalances.sol": {
"id": 21
},
"src/immutable/MixinDeploymentConstants.sol": {
"id": 6
},
"src/stake/MixinStakeStorage.sol": {
"id": 22
},
"src/libs/LibSafeDowncast.sol": {
"id": 18
},
"src/sys/MixinScheduler.sol": {
"id": 29
},
"src/fees/MixinExchangeFees.sol": {
"id": 3
},
"src/sys/MixinFinalizer.sol": {
"id": 27
},
"src/libs/LibCobbDouglas.sol": {
"id": 15
},
"src/libs/LibFixedMath.sol": {
"id": 16
},
"src/libs/LibFixedMathRichErrors.sol": {
"id": 17
},
"src/fees/MixinExchangeManager.sol": {
"id": 4
}
},
"sourceCodes": {
"src/Staking.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol\";\nimport \"./interfaces/IStaking.sol\";\nimport \"./interfaces/IZrxVault.sol\";\nimport \"./sys/MixinParams.sol\";\nimport \"./stake/MixinStake.sol\";\nimport \"./fees/MixinExchangeFees.sol\";\n\n\ncontract Staking is\n IStaking,\n MixinParams,\n MixinStake,\n MixinExchangeFees\n{\n address internal wethAddress;\n address internal zrxVaultAddress;\n\n constructor(\n address wethAddress_,\n address zrxVaultAddress_\n )\n public\n {\n wethAddress = wethAddress_;\n zrxVaultAddress = zrxVaultAddress_;\n }\n\n /// @dev Initialize storage owned by this contract.\n /// This function should not be called directly.\n /// The StakingProxy contract will call it in `attachStakingContract()`.\n function init()\n public\n onlyAuthorized\n {\n // DANGER! When performing upgrades, take care to modify this logic\n // to prevent accidentally clearing prior state.\n _initMixinScheduler();\n _initMixinParams();\n }\n\n /// @dev Returns the current weth contract address\n /// @return wethContract The WETH contract instance.\n function getWethContract()\n public\n view\n returns (IEtherToken wethContract)\n {\n wethContract = IEtherToken(wethAddress);\n return wethContract;\n }\n\n /// @dev Returns the current zrxVault address.\n /// @return zrxVault The zrxVault contract.\n function getZrxVault()\n public\n view\n returns (IZrxVault zrxVault)\n {\n zrxVault = IZrxVault(zrxVaultAddress);\n return zrxVault;\n }\n}\n",
"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./IERC20Token.sol\";\n\n\ncontract IEtherToken is\n IERC20Token\n{\n function deposit()\n public\n payable;\n \n function withdraw(uint256 amount)\n public;\n}\n",
"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n\n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address _to, uint256 _value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address _from,\n address _to,\n uint256 _value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address _spender, uint256 _value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address _owner)\n external\n view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n external\n view\n returns (uint256);\n}\n",
"src/interfaces/IStaking.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol\";\nimport \"./IStructs.sol\";\nimport \"./IZrxVault.sol\";\n\n\ninterface IStaking {\n\n /// @dev Adds a new exchange address\n /// @param addr Address of exchange contract to add\n function addExchangeAddress(address addr)\n external;\n\n /// @dev Create a new staking pool. The sender will be the operator of this pool.\n /// Note that an operator must be payable.\n /// @param operatorShare Portion of rewards owned by the operator, in ppm.\n /// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true.\n /// @return poolId The unique pool id generated for this pool.\n function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker)\n external\n returns (bytes32 poolId);\n\n /// @dev Decreases the operator share for the given pool (i.e. increases pool rewards for members).\n /// @param poolId Unique Id of pool.\n /// @param newOperatorShare The newly decreased percentage of any rewards owned by the operator.\n function decreaseStakingPoolOperatorShare(bytes32 poolId, uint32 newOperatorShare)\n external;\n\n /// @dev Begins a new epoch, preparing the prior one for finalization.\n /// Throws if not enough time has passed between epochs or if the\n /// previous epoch was not fully finalized.\n /// @return numPoolsToFinalize The number of unfinalized pools.\n function endEpoch()\n external\n returns (uint256);\n\n /// @dev Instantly finalizes a single pool that earned rewards in the previous\n /// epoch, crediting it rewards for members and withdrawing operator's\n /// rewards as WETH. This can be called by internal functions that need\n /// to finalize a pool immediately. Does nothing if the pool is already\n /// finalized or did not earn rewards in the previous epoch.\n /// @param poolId The pool ID to finalize.\n function finalizePool(bytes32 poolId)\n external;\n\n /// @dev Initialize storage owned by this contract.\n /// This function should not be called directly.\n /// The StakingProxy contract will call it in `attachStakingContract()`.\n function init()\n external;\n\n /// @dev Allows caller to join a staking pool as a maker.\n /// @param poolId Unique id of pool.\n function joinStakingPoolAsMaker(bytes32 poolId)\n external;\n\n /// @dev Moves stake between statuses: 'undelegated' or 'delegated'.\n /// Delegated stake can also be moved between pools.\n /// This change comes into effect next epoch.\n /// @param from status to move stake out of.\n /// @param to status to move stake into.\n /// @param amount of stake to move.\n function moveStake(\n IStructs.StakeInfo calldata from,\n IStructs.StakeInfo calldata to,\n uint256 amount\n )\n external;\n\n /// @dev Pays a protocol fee in ETH.\n /// @param makerAddress The address of the order's maker.\n /// @param payerAddress The address that is responsible for paying the protocol fee.\n /// @param protocolFee The amount of protocol fees that should be paid.\n function payProtocolFee(\n address makerAddress,\n address payerAddress,\n uint256 protocolFee\n )\n external\n payable;\n\n /// @dev Removes an existing exchange address\n /// @param addr Address of exchange contract to remove\n function removeExchangeAddress(address addr)\n external;\n\n /// @dev Set all configurable parameters at once.\n /// @param _epochDurationInSeconds Minimum seconds between epochs.\n /// @param _rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @param _minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @param _cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @param _cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n function setParams(\n uint256 _epochDurationInSeconds,\n uint32 _rewardDelegatedStakeWeight,\n uint256 _minimumPoolStake,\n uint32 _cobbDouglasAlphaNumerator,\n uint32 _cobbDouglasAlphaDenominator\n )\n external;\n\n /// @dev Stake ZRX tokens. Tokens are deposited into the ZRX Vault.\n /// Unstake to retrieve the ZRX. Stake is in the 'Active' status.\n /// @param amount of ZRX to stake.\n function stake(uint256 amount)\n external;\n\n /// @dev Unstake. Tokens are withdrawn from the ZRX Vault and returned to\n /// the staker. Stake must be in the 'undelegated' status in both the\n /// current and next epoch in order to be unstaked.\n /// @param amount of ZRX to unstake.\n function unstake(uint256 amount)\n external;\n\n /// @dev Withdraws the caller's WETH rewards that have accumulated\n /// until the last epoch.\n /// @param poolId Unique id of pool.\n function withdrawDelegatorRewards(bytes32 poolId)\n external;\n\n /// @dev Computes the reward balance in ETH of a specific member of a pool.\n /// @param poolId Unique id of pool.\n /// @param member The member of the pool.\n /// @return totalReward Balance in ETH.\n function computeRewardBalanceOfDelegator(bytes32 poolId, address member)\n external\n view\n returns (uint256 reward);\n\n /// @dev Computes the reward balance in ETH of the operator of a pool.\n /// @param poolId Unique id of pool.\n /// @return totalReward Balance in ETH.\n function computeRewardBalanceOfOperator(bytes32 poolId)\n external\n view\n returns (uint256 reward);\n\n /// @dev Returns the earliest end time in seconds of this epoch.\n /// The next epoch can begin once this time is reached.\n /// Epoch period = [startTimeInSeconds..endTimeInSeconds)\n /// @return Time in seconds.\n function getCurrentEpochEarliestEndTimeInSeconds()\n external\n view\n returns (uint256);\n\n /// @dev Gets global stake for a given status.\n /// @param stakeStatus UNDELEGATED or DELEGATED\n /// @return Global stake for given status.\n function getGlobalStakeByStatus(IStructs.StakeStatus stakeStatus)\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev Gets an owner's stake balances by status.\n /// @param staker Owner of stake.\n /// @param stakeStatus UNDELEGATED or DELEGATED\n /// @return Owner's stake balances for given status.\n function getOwnerStakeByStatus(\n address staker,\n IStructs.StakeStatus stakeStatus\n )\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev Retrieves all configurable parameter values.\n /// @return _epochDurationInSeconds Minimum seconds between epochs.\n /// @return _rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @return _minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @return _cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @return _cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n function getParams()\n external\n view\n returns (\n uint256 _epochDurationInSeconds,\n uint32 _rewardDelegatedStakeWeight,\n uint256 _minimumPoolStake,\n uint32 _cobbDouglasAlphaNumerator,\n uint32 _cobbDouglasAlphaDenominator\n );\n\n /// @param staker of stake.\n /// @param poolId Unique Id of pool.\n /// @return Stake delegated to pool by staker.\n function getStakeDelegatedToPoolByOwner(address staker, bytes32 poolId)\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev Returns a staking pool\n /// @param poolId Unique id of pool.\n function getStakingPool(bytes32 poolId)\n external\n view\n returns (IStructs.Pool memory);\n\n /// @dev Get stats on a staking pool in this epoch.\n /// @param poolId Pool Id to query.\n /// @return PoolStats struct for pool id.\n function getStakingPoolStatsThisEpoch(bytes32 poolId)\n external\n view\n returns (IStructs.PoolStats memory);\n\n /// @dev Returns the total stake delegated to a specific staking pool,\n /// across all members.\n /// @param poolId Unique Id of pool.\n /// @return Total stake delegated to pool.\n function getTotalStakeDelegatedToPool(bytes32 poolId)\n external\n view\n returns (IStructs.StoredBalance memory balance);\n\n /// @dev An overridable way to access the deployed WETH contract.\n /// Must be view to allow overrides to access state.\n /// @return wethContract The WETH contract instance.\n function getWethContract()\n external\n view\n returns (IEtherToken wethContract);\n\n /// @dev An overridable way to access the deployed zrxVault.\n /// Must be view to allow overrides to access state.\n /// @return zrxVault The zrxVault contract.\n function getZrxVault()\n external\n view\n returns (IZrxVault zrxVault);\n}\n",
"src/interfaces/IStructs.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IStructs {\n\n /// @dev Stats for a pool that earned rewards.\n /// @param feesCollected Fees collected in ETH by this pool.\n /// @param weightedStake Amount of weighted stake in the pool.\n /// @param membersStake Amount of non-operator stake in the pool.\n struct PoolStats {\n uint256 feesCollected;\n uint256 weightedStake;\n uint256 membersStake;\n }\n\n /// @dev Holds stats aggregated across a set of pools.\n /// @param rewardsAvailable Rewards (ETH) available to the epoch\n /// being finalized (the previous epoch). This is simply the balance\n /// of the contract at the end of the epoch.\n /// @param numPoolsToFinalize The number of pools that have yet to be finalized through `finalizePools()`.\n /// @param totalFeesCollected The total fees collected for the epoch being finalized.\n /// @param totalWeightedStake The total fees collected for the epoch being finalized.\n /// @param totalRewardsFinalized Amount of rewards that have been paid during finalization.\n struct AggregatedStats {\n uint256 rewardsAvailable;\n uint256 numPoolsToFinalize;\n uint256 totalFeesCollected;\n uint256 totalWeightedStake;\n uint256 totalRewardsFinalized;\n }\n\n /// @dev Encapsulates a balance for the current and next epochs.\n /// Note that these balances may be stale if the current epoch\n /// is greater than `currentEpoch`.\n /// @param currentEpoch the current epoch\n /// @param currentEpochBalance balance in the current epoch.\n /// @param nextEpochBalance balance in `currentEpoch+1`.\n struct StoredBalance {\n uint64 currentEpoch;\n uint96 currentEpochBalance;\n uint96 nextEpochBalance;\n }\n\n /// @dev Statuses that stake can exist in.\n /// Any stake can be (re)delegated effective at the next epoch\n /// Undelegated stake can be withdrawn if it is available in both the current and next epoch\n enum StakeStatus {\n UNDELEGATED,\n DELEGATED\n }\n\n /// @dev Info used to describe a status.\n /// @param status of the stake.\n /// @param poolId Unique Id of pool. This is set when status=DELEGATED.\n struct StakeInfo {\n StakeStatus status;\n bytes32 poolId;\n }\n\n /// @dev Struct to represent a fraction.\n /// @param numerator of fraction.\n /// @param denominator of fraction.\n struct Fraction {\n uint256 numerator;\n uint256 denominator;\n }\n\n /// @dev Holds the metadata for a staking pool.\n /// @param operator of the pool.\n /// @param operatorShare Fraction of the total balance owned by the operator, in ppm.\n struct Pool {\n address operator;\n uint32 operatorShare;\n }\n}\n",
"src/interfaces/IZrxVault.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IZrxVault {\n\n /// @dev Emmitted whenever a StakingProxy is set in a vault.\n event StakingProxySet(address stakingProxyAddress);\n\n /// @dev Emitted when the Staking contract is put into Catastrophic Failure Mode\n /// @param sender Address of sender (`msg.sender`)\n event InCatastrophicFailureMode(address sender);\n\n /// @dev Emitted when Zrx Tokens are deposited into the vault.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens deposited.\n event Deposit(\n address indexed staker,\n uint256 amount\n );\n\n /// @dev Emitted when Zrx Tokens are withdrawn from the vault.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens withdrawn.\n event Withdraw(\n address indexed staker,\n uint256 amount\n );\n\n /// @dev Emitted whenever the ZRX AssetProxy is set.\n event ZrxProxySet(address zrxProxyAddress);\n\n /// @dev Sets the address of the StakingProxy contract.\n /// Note that only the contract staker can call this function.\n /// @param _stakingProxyAddress Address of Staking proxy contract.\n function setStakingProxy(address _stakingProxyAddress)\n external;\n\n /// @dev Vault enters into Catastrophic Failure Mode.\n /// *** WARNING - ONCE IN CATOSTROPHIC FAILURE MODE, YOU CAN NEVER GO BACK! ***\n /// Note that only the contract staker can call this function.\n function enterCatastrophicFailure()\n external;\n\n /// @dev Sets the Zrx proxy.\n /// Note that only the contract staker can call this.\n /// Note that this can only be called when *not* in Catastrophic Failure mode.\n /// @param zrxProxyAddress Address of the 0x Zrx Proxy.\n function setZrxProxy(address zrxProxyAddress)\n external;\n\n /// @dev Deposit an `amount` of Zrx Tokens from `staker` into the vault.\n /// Note that only the Staking contract can call this.\n /// Note that this can only be called when *not* in Catastrophic Failure mode.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens to deposit.\n function depositFrom(address staker, uint256 amount)\n external;\n\n /// @dev Withdraw an `amount` of Zrx Tokens to `staker` from the vault.\n /// Note that only the Staking contract can call this.\n /// Note that this can only be called when *not* in Catastrophic Failure mode.\n /// @param staker of Zrx Tokens.\n /// @param amount of Zrx Tokens to withdraw.\n function withdrawFrom(address staker, uint256 amount)\n external;\n\n /// @dev Withdraw ALL Zrx Tokens to `staker` from the vault.\n /// Note that this can only be called when *in* Catastrophic Failure mode.\n /// @param staker of Zrx Tokens.\n function withdrawAllFrom(address staker)\n external\n returns (uint256);\n\n /// @dev Returns the balance in Zrx Tokens of the `staker`\n /// @return Balance in Zrx.\n function balanceOf(address staker)\n external\n view\n returns (uint256);\n\n /// @dev Returns the entire balance of Zrx tokens in the vault.\n function balanceOfZrxVault()\n external\n view\n returns (uint256);\n}\n",
"src/sys/MixinParams.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"../immutable/MixinStorage.sol\";\nimport \"../immutable/MixinConstants.sol\";\nimport \"../interfaces/IStakingEvents.sol\";\nimport \"../interfaces/IStakingProxy.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\n\n\ncontract MixinParams is\n IStakingEvents,\n MixinStorage,\n MixinConstants\n{\n /// @dev Set all configurable parameters at once.\n /// @param _epochDurationInSeconds Minimum seconds between epochs.\n /// @param _rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @param _minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @param _cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @param _cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n function setParams(\n uint256 _epochDurationInSeconds,\n uint32 _rewardDelegatedStakeWeight,\n uint256 _minimumPoolStake,\n uint32 _cobbDouglasAlphaNumerator,\n uint32 _cobbDouglasAlphaDenominator\n )\n external\n onlyAuthorized\n {\n _setParams(\n _epochDurationInSeconds,\n _rewardDelegatedStakeWeight,\n _minimumPoolStake,\n _cobbDouglasAlphaNumerator,\n _cobbDouglasAlphaDenominator\n );\n\n // Let the staking proxy enforce that these parameters are within\n // acceptable ranges.\n IStakingProxy(address(this)).assertValidStorageParams();\n }\n\n /// @dev Retrieves all configurable parameter values.\n /// @return _epochDurationInSeconds Minimum seconds between epochs.\n /// @return _rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @return _minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @return _cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @return _cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n function getParams()\n external\n view\n returns (\n uint256 _epochDurationInSeconds,\n uint32 _rewardDelegatedStakeWeight,\n uint256 _minimumPoolStake,\n uint32 _cobbDouglasAlphaNumerator,\n uint32 _cobbDouglasAlphaDenominator\n )\n {\n _epochDurationInSeconds = epochDurationInSeconds;\n _rewardDelegatedStakeWeight = rewardDelegatedStakeWeight;\n _minimumPoolStake = minimumPoolStake;\n _cobbDouglasAlphaNumerator = cobbDouglasAlphaNumerator;\n _cobbDouglasAlphaDenominator = cobbDouglasAlphaDenominator;\n }\n\n /// @dev Initialize storage belonging to this mixin.\n function _initMixinParams()\n internal\n {\n // Ensure state is uninitialized.\n _assertParamsNotInitialized();\n\n // Set up defaults.\n uint256 _epochDurationInSeconds = 10 days;\n uint32 _rewardDelegatedStakeWeight = (90 * PPM_DENOMINATOR) / 100;\n uint256 _minimumPoolStake = 100 * MIN_TOKEN_VALUE;\n uint32 _cobbDouglasAlphaNumerator = 2;\n uint32 _cobbDouglasAlphaDenominator = 3;\n\n _setParams(\n _epochDurationInSeconds,\n _rewardDelegatedStakeWeight,\n _minimumPoolStake,\n _cobbDouglasAlphaNumerator,\n _cobbDouglasAlphaDenominator\n );\n }\n\n /// @dev Asserts that upgradable storage has not yet been initialized.\n function _assertParamsNotInitialized()\n internal\n view\n {\n if (epochDurationInSeconds != 0 &&\n rewardDelegatedStakeWeight != 0 &&\n minimumPoolStake != 0 &&\n cobbDouglasAlphaNumerator != 0 &&\n cobbDouglasAlphaDenominator != 0\n ) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.InitializationError(\n LibStakingRichErrors.InitializationErrorCodes.MixinParamsAlreadyInitialized\n )\n );\n }\n }\n\n /// @dev Set all configurable parameters at once.\n /// @param _epochDurationInSeconds Minimum seconds between epochs.\n /// @param _rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @param _minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @param _cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @param _cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n function _setParams(\n uint256 _epochDurationInSeconds,\n uint32 _rewardDelegatedStakeWeight,\n uint256 _minimumPoolStake,\n uint32 _cobbDouglasAlphaNumerator,\n uint32 _cobbDouglasAlphaDenominator\n )\n private\n {\n epochDurationInSeconds = _epochDurationInSeconds;\n rewardDelegatedStakeWeight = _rewardDelegatedStakeWeight;\n minimumPoolStake = _minimumPoolStake;\n cobbDouglasAlphaNumerator = _cobbDouglasAlphaNumerator;\n cobbDouglasAlphaDenominator = _cobbDouglasAlphaDenominator;\n\n emit ParamsSet(\n _epochDurationInSeconds,\n _rewardDelegatedStakeWeight,\n _minimumPoolStake,\n _cobbDouglasAlphaNumerator,\n _cobbDouglasAlphaDenominator\n );\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR =\n 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(\n string memory message\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n",
"src/immutable/MixinStorage.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/Authorizable.sol\";\nimport \"./MixinConstants.sol\";\nimport \"../interfaces/IZrxVault.sol\";\nimport \"../interfaces/IStructs.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\n\n\n// solhint-disable max-states-count, no-empty-blocks\ncontract MixinStorage is\n Authorizable\n{\n // address of staking contract\n address public stakingContract;\n\n // mapping from StakeStatus to global stored balance\n // NOTE: only Status.DELEGATED is used to access this mapping, but this format\n // is used for extensibility\n mapping (uint8 => IStructs.StoredBalance) internal _globalStakeByStatus;\n\n // mapping from StakeStatus to address of staker to stored balance\n mapping (uint8 => mapping (address => IStructs.StoredBalance)) internal _ownerStakeByStatus;\n\n // Mapping from Owner to Pool Id to Amount Delegated\n mapping (address => mapping (bytes32 => IStructs.StoredBalance)) internal _delegatedStakeToPoolByOwner;\n\n // Mapping from Pool Id to Amount Delegated\n mapping (bytes32 => IStructs.StoredBalance) internal _delegatedStakeByPoolId;\n\n // tracking Pool Id, a unique identifier for each staking pool.\n bytes32 public lastPoolId;\n\n // mapping from Maker Address to Pool Id of maker\n mapping (address => bytes32) public poolIdByMaker;\n\n // mapping from Pool Id to Pool\n mapping (bytes32 => IStructs.Pool) internal _poolById;\n\n // mapping from PoolId to balance of members\n mapping (bytes32 => uint256) public rewardsByPoolId;\n\n // current epoch\n uint256 public currentEpoch;\n\n // current epoch start time\n uint256 public currentEpochStartTimeInSeconds;\n\n // mapping from Pool Id to Epoch to Reward Ratio\n mapping (bytes32 => mapping (uint256 => IStructs.Fraction)) internal _cumulativeRewardsByPool;\n\n // mapping from Pool Id to Epoch\n mapping (bytes32 => uint256) internal _cumulativeRewardsByPoolLastStored;\n\n // registered 0x Exchange contracts\n mapping (address => bool) public validExchanges;\n\n /* Tweakable parameters */\n\n // Minimum seconds between epochs.\n uint256 public epochDurationInSeconds;\n\n // How much delegated stake is weighted vs operator stake, in ppm.\n uint32 public rewardDelegatedStakeWeight;\n\n // Minimum amount of stake required in a pool to collect rewards.\n uint256 public minimumPoolStake;\n\n // Numerator for cobb douglas alpha factor.\n uint32 public cobbDouglasAlphaNumerator;\n\n // Denominator for cobb douglas alpha factor.\n uint32 public cobbDouglasAlphaDenominator;\n\n /* State for finalization */\n\n /// @dev Stats for each pool that generated fees with sufficient stake to earn rewards.\n /// See `_minimumPoolStake` in MixinParams.\n mapping (bytes32 => mapping (uint256 => IStructs.PoolStats)) public poolStatsByEpoch;\n\n /// @dev Aggregated stats across all pools that generated fees with sufficient stake to earn rewards.\n /// See `_minimumPoolStake` in MixinParams.\n mapping (uint256 => IStructs.AggregatedStats) public aggregatedStatsByEpoch;\n\n /// @dev The WETH balance of this contract that is reserved for pool reward payouts.\n uint256 public wethReservedForPoolRewards;\n}\n",
"@0x/contracts-utils/contracts/src/Authorizable.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./interfaces/IAuthorizable.sol\";\nimport \"./LibAuthorizableRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\nimport \"./Ownable.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Authorizable is\n Ownable,\n IAuthorizable\n{\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n _assertSenderIsAuthorized();\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Initializes the `owner` address.\n constructor()\n public\n Ownable()\n {}\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n _addAuthorizedAddress(target);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n if (!authorized[target]) {\n LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));\n }\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n _removeAuthorizedAddressAtIndex(target, i);\n break;\n }\n }\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n onlyOwner\n {\n _removeAuthorizedAddressAtIndex(target, index);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n\n /// @dev Reverts if msg.sender is not authorized.\n function _assertSenderIsAuthorized()\n internal\n view\n {\n if (!authorized[msg.sender]) {\n LibRichErrors.rrevert(LibAuthorizableRichErrors.SenderNotAuthorizedError(msg.sender));\n }\n }\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function _addAuthorizedAddress(address target)\n internal\n {\n // Ensure that the target is not the zero address.\n if (target == address(0)) {\n LibRichErrors.rrevert(LibAuthorizableRichErrors.ZeroCantBeAuthorizedError());\n }\n\n // Ensure that the target is not already authorized.\n if (authorized[target]) {\n LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetAlreadyAuthorizedError(target));\n }\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function _removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n internal\n {\n if (!authorized[target]) {\n LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));\n }\n if (index >= authorities.length) {\n LibRichErrors.rrevert(LibAuthorizableRichErrors.IndexOutOfBoundsError(\n index,\n authorities.length\n ));\n }\n if (authorities[index] != target) {\n LibRichErrors.rrevert(LibAuthorizableRichErrors.AuthorizedAddressMismatchError(\n authorities[index],\n target\n ));\n }\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n}\n",
"@0x/contracts-utils/contracts/src/interfaces/IAuthorizable.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
"@0x/contracts-utils/contracts/src/interfaces/IOwnable.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IOwnable {\n\n /// @dev Emitted by Ownable when ownership is transferred.\n /// @param previousOwner The previous owner of the contract.\n /// @param newOwner The new owner of the contract.\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /// @dev Transfers ownership of the contract to a new address.\n /// @param newOwner The address that will become the owner.\n function transferOwnership(address newOwner)\n public;\n}\n",
"@0x/contracts-utils/contracts/src/LibAuthorizableRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibAuthorizableRichErrors {\n\n // bytes4(keccak256(\"AuthorizedAddressMismatchError(address,address)\"))\n bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR =\n 0x140a84db;\n\n // bytes4(keccak256(\"IndexOutOfBoundsError(uint256,uint256)\"))\n bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR =\n 0xe9f83771;\n\n // bytes4(keccak256(\"SenderNotAuthorizedError(address)\"))\n bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR =\n 0xb65a25b9;\n\n // bytes4(keccak256(\"TargetAlreadyAuthorizedError(address)\"))\n bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR =\n 0xde16f1a0;\n\n // bytes4(keccak256(\"TargetNotAuthorizedError(address)\"))\n bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR =\n 0xeb5108a2;\n\n // bytes4(keccak256(\"ZeroCantBeAuthorizedError()\"))\n bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES =\n hex\"57654fe4\";\n\n // solhint-disable func-name-mixedcase\n function AuthorizedAddressMismatchError(\n address authorized,\n address target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR,\n authorized,\n target\n );\n }\n\n function IndexOutOfBoundsError(\n uint256 index,\n uint256 length\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR,\n index,\n length\n );\n }\n\n function SenderNotAuthorizedError(address sender)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SENDER_NOT_AUTHORIZED_ERROR_SELECTOR,\n sender\n );\n }\n\n function TargetAlreadyAuthorizedError(address target)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR,\n target\n );\n }\n\n function TargetNotAuthorizedError(address target)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TARGET_NOT_AUTHORIZED_ERROR_SELECTOR,\n target\n );\n }\n\n function ZeroCantBeAuthorizedError()\n internal\n pure\n returns (bytes memory)\n {\n return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;\n }\n}\n",
"@0x/contracts-utils/contracts/src/Ownable.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./interfaces/IOwnable.sol\";\nimport \"./LibOwnableRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\ncontract Ownable is\n IOwnable\n{\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n _assertSenderIsOwner();\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner == address(0)) {\n LibRichErrors.rrevert(LibOwnableRichErrors.TransferOwnerToZeroError());\n } else {\n owner = newOwner;\n emit OwnershipTransferred(msg.sender, newOwner);\n }\n }\n\n function _assertSenderIsOwner()\n internal\n view\n {\n if (msg.sender != owner) {\n LibRichErrors.rrevert(LibOwnableRichErrors.OnlyOwnerError(\n msg.sender,\n owner\n ));\n }\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibOwnableRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibOwnableRichErrors {\n\n // bytes4(keccak256(\"OnlyOwnerError(address,address)\"))\n bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR =\n 0x1de45ad1;\n\n // bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES =\n hex\"e69edc3e\";\n\n // solhint-disable func-name-mixedcase\n function OnlyOwnerError(\n address sender,\n address owner\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ONLY_OWNER_ERROR_SELECTOR,\n sender,\n owner\n );\n }\n\n function TransferOwnerToZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;\n }\n}\n",
"src/immutable/MixinConstants.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract MixinConstants {\n\n // 100% in parts-per-million.\n uint32 constant internal PPM_DENOMINATOR = 10**6;\n\n bytes32 constant internal NIL_POOL_ID = 0x0000000000000000000000000000000000000000000000000000000000000000;\n\n address constant internal NIL_ADDRESS = 0x0000000000000000000000000000000000000000;\n\n uint256 constant internal MIN_TOKEN_VALUE = 10**18;\n}\n",
"src/libs/LibStakingRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"../interfaces/IStructs.sol\";\n\n\nlibrary LibStakingRichErrors {\n\n enum OperatorShareErrorCodes {\n OperatorShareTooLarge,\n CanOnlyDecreaseOperatorShare\n }\n\n enum InitializationErrorCodes {\n MixinSchedulerAlreadyInitialized,\n MixinParamsAlreadyInitialized\n }\n\n enum InvalidParamValueErrorCodes {\n InvalidCobbDouglasAlpha,\n InvalidRewardDelegatedStakeWeight,\n InvalidMaximumMakersInPool,\n InvalidMinimumPoolStake,\n InvalidEpochDuration\n }\n\n enum ExchangeManagerErrorCodes {\n ExchangeAlreadyRegistered,\n ExchangeNotRegistered\n }\n\n // bytes4(keccak256(\"OnlyCallableByExchangeError(address)\"))\n bytes4 internal constant ONLY_CALLABLE_BY_EXCHANGE_ERROR_SELECTOR =\n 0xb56d2df0;\n\n // bytes4(keccak256(\"ExchangeManagerError(uint8,address)\"))\n bytes4 internal constant EXCHANGE_MANAGER_ERROR_SELECTOR =\n 0xb9588e43;\n\n // bytes4(keccak256(\"InsufficientBalanceError(uint256,uint256)\"))\n bytes4 internal constant INSUFFICIENT_BALANCE_ERROR_SELECTOR =\n 0x84c8b7c9;\n\n // bytes4(keccak256(\"OnlyCallableByPoolOperatorError(address,bytes32)\"))\n bytes4 internal constant ONLY_CALLABLE_BY_POOL_OPERATOR_ERROR_SELECTOR =\n 0x82ded785;\n\n // bytes4(keccak256(\"BlockTimestampTooLowError(uint256,uint256)\"))\n bytes4 internal constant BLOCK_TIMESTAMP_TOO_LOW_ERROR_SELECTOR =\n 0xa6bcde47;\n\n // bytes4(keccak256(\"OnlyCallableByStakingContractError(address)\"))\n bytes4 internal constant ONLY_CALLABLE_BY_STAKING_CONTRACT_ERROR_SELECTOR =\n 0xca1d07a2;\n\n // bytes4(keccak256(\"OnlyCallableIfInCatastrophicFailureError()\"))\n bytes internal constant ONLY_CALLABLE_IF_IN_CATASTROPHIC_FAILURE_ERROR =\n hex\"3ef081cc\";\n\n // bytes4(keccak256(\"OnlyCallableIfNotInCatastrophicFailureError()\"))\n bytes internal constant ONLY_CALLABLE_IF_NOT_IN_CATASTROPHIC_FAILURE_ERROR =\n hex\"7dd020ce\";\n\n // bytes4(keccak256(\"OperatorShareError(uint8,bytes32,uint32)\"))\n bytes4 internal constant OPERATOR_SHARE_ERROR_SELECTOR =\n 0x22df9597;\n\n // bytes4(keccak256(\"PoolExistenceError(bytes32,bool)\"))\n bytes4 internal constant POOL_EXISTENCE_ERROR_SELECTOR =\n 0x9ae94f01;\n\n // bytes4(keccak256(\"ProxyDestinationCannotBeNilError()\"))\n bytes internal constant PROXY_DESTINATION_CANNOT_BE_NIL_ERROR =\n hex\"6eff8285\";\n\n // bytes4(keccak256(\"InitializationError(uint8)\"))\n bytes4 internal constant INITIALIZATION_ERROR_SELECTOR =\n 0x0b02d773;\n\n // bytes4(keccak256(\"InvalidParamValueError(uint8)\"))\n bytes4 internal constant INVALID_PARAM_VALUE_ERROR_SELECTOR =\n 0xfc45bd11;\n\n // bytes4(keccak256(\"InvalidProtocolFeePaymentError(uint256,uint256)\"))\n bytes4 internal constant INVALID_PROTOCOL_FEE_PAYMENT_ERROR_SELECTOR =\n 0x31d7a505;\n\n // bytes4(keccak256(\"PreviousEpochNotFinalizedError(uint256,uint256)\"))\n bytes4 internal constant PREVIOUS_EPOCH_NOT_FINALIZED_ERROR_SELECTOR =\n 0x614b800a;\n\n // bytes4(keccak256(\"PoolNotFinalizedError(bytes32,uint256)\"))\n bytes4 internal constant POOL_NOT_FINALIZED_ERROR_SELECTOR =\n 0x5caa0b05;\n\n // solhint-disable func-name-mixedcase\n function OnlyCallableByExchangeError(\n address senderAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ONLY_CALLABLE_BY_EXCHANGE_ERROR_SELECTOR,\n senderAddress\n );\n }\n\n function ExchangeManagerError(\n ExchangeManagerErrorCodes errorCodes,\n address exchangeAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n EXCHANGE_MANAGER_ERROR_SELECTOR,\n errorCodes,\n exchangeAddress\n );\n }\n\n function InsufficientBalanceError(\n uint256 amount,\n uint256 balance\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INSUFFICIENT_BALANCE_ERROR_SELECTOR,\n amount,\n balance\n );\n }\n\n function OnlyCallableByPoolOperatorError(\n address senderAddress,\n bytes32 poolId\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ONLY_CALLABLE_BY_POOL_OPERATOR_ERROR_SELECTOR,\n senderAddress,\n poolId\n );\n }\n\n function BlockTimestampTooLowError(\n uint256 epochEndTime,\n uint256 currentBlockTimestamp\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n BLOCK_TIMESTAMP_TOO_LOW_ERROR_SELECTOR,\n epochEndTime,\n currentBlockTimestamp\n );\n }\n\n function OnlyCallableByStakingContractError(\n address senderAddress\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ONLY_CALLABLE_BY_STAKING_CONTRACT_ERROR_SELECTOR,\n senderAddress\n );\n }\n\n function OnlyCallableIfInCatastrophicFailureError()\n internal\n pure\n returns (bytes memory)\n {\n return ONLY_CALLABLE_IF_IN_CATASTROPHIC_FAILURE_ERROR;\n }\n\n function OnlyCallableIfNotInCatastrophicFailureError()\n internal\n pure\n returns (bytes memory)\n {\n return ONLY_CALLABLE_IF_NOT_IN_CATASTROPHIC_FAILURE_ERROR;\n }\n\n function OperatorShareError(\n OperatorShareErrorCodes errorCodes,\n bytes32 poolId,\n uint32 operatorShare\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n OPERATOR_SHARE_ERROR_SELECTOR,\n errorCodes,\n poolId,\n operatorShare\n );\n }\n\n function PoolExistenceError(\n bytes32 poolId,\n bool alreadyExists\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n POOL_EXISTENCE_ERROR_SELECTOR,\n poolId,\n alreadyExists\n );\n }\n\n function InvalidProtocolFeePaymentError(\n uint256 expectedProtocolFeePaid,\n uint256 actualProtocolFeePaid\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_PROTOCOL_FEE_PAYMENT_ERROR_SELECTOR,\n expectedProtocolFeePaid,\n actualProtocolFeePaid\n );\n }\n\n function InitializationError(InitializationErrorCodes code)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INITIALIZATION_ERROR_SELECTOR,\n uint8(code)\n );\n }\n\n function InvalidParamValueError(InvalidParamValueErrorCodes code)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INVALID_PARAM_VALUE_ERROR_SELECTOR,\n uint8(code)\n );\n }\n\n function ProxyDestinationCannotBeNilError()\n internal\n pure\n returns (bytes memory)\n {\n return PROXY_DESTINATION_CANNOT_BE_NIL_ERROR;\n }\n\n function PreviousEpochNotFinalizedError(\n uint256 unfinalizedEpoch,\n uint256 unfinalizedPoolsRemaining\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n PREVIOUS_EPOCH_NOT_FINALIZED_ERROR_SELECTOR,\n unfinalizedEpoch,\n unfinalizedPoolsRemaining\n );\n }\n\n function PoolNotFinalizedError(\n bytes32 poolId,\n uint256 epoch\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n POOL_NOT_FINALIZED_ERROR_SELECTOR,\n poolId,\n epoch\n );\n }\n}\n",
"src/interfaces/IStakingEvents.sol": "pragma solidity ^0.5.9;\n\n\ninterface IStakingEvents {\n\n /// @dev Emitted by MixinStake when ZRX is staked.\n /// @param staker of ZRX.\n /// @param amount of ZRX staked.\n event Stake(\n address indexed staker,\n uint256 amount\n );\n\n /// @dev Emitted by MixinStake when ZRX is unstaked.\n /// @param staker of ZRX.\n /// @param amount of ZRX unstaked.\n event Unstake(\n address indexed staker,\n uint256 amount\n );\n\n /// @dev Emitted by MixinStake when ZRX is unstaked.\n /// @param staker of ZRX.\n /// @param amount of ZRX unstaked.\n event MoveStake(\n address indexed staker,\n uint256 amount,\n uint8 fromStatus,\n bytes32 indexed fromPool,\n uint8 toStatus,\n bytes32 indexed toPool\n );\n\n /// @dev Emitted by MixinExchangeManager when an exchange is added.\n /// @param exchangeAddress Address of new exchange.\n event ExchangeAdded(\n address exchangeAddress\n );\n\n /// @dev Emitted by MixinExchangeManager when an exchange is removed.\n /// @param exchangeAddress Address of removed exchange.\n event ExchangeRemoved(\n address exchangeAddress\n );\n\n /// @dev Emitted by MixinExchangeFees when a pool starts earning rewards in an epoch.\n /// @param epoch The epoch in which the pool earned rewards.\n /// @param poolId The ID of the pool.\n event StakingPoolEarnedRewardsInEpoch(\n uint256 indexed epoch,\n bytes32 indexed poolId\n );\n\n /// @dev Emitted by MixinFinalizer when an epoch has ended.\n /// @param epoch The epoch that ended.\n /// @param numPoolsToFinalize Number of pools that earned rewards during `epoch` and must be finalized.\n /// @param rewardsAvailable Rewards available to all pools that earned rewards during `epoch`.\n /// @param totalWeightedStake Total weighted stake across all pools that earned rewards during `epoch`.\n /// @param totalFeesCollected Total fees collected across all pools that earned rewards during `epoch`.\n event EpochEnded(\n uint256 indexed epoch,\n uint256 numPoolsToFinalize,\n uint256 rewardsAvailable,\n uint256 totalFeesCollected,\n uint256 totalWeightedStake\n );\n\n /// @dev Emitted by MixinFinalizer when an epoch is fully finalized.\n /// @param epoch The epoch being finalized.\n /// @param rewardsPaid Total amount of rewards paid out.\n /// @param rewardsRemaining Rewards left over.\n event EpochFinalized(\n uint256 indexed epoch,\n uint256 rewardsPaid,\n uint256 rewardsRemaining\n );\n\n /// @dev Emitted by MixinFinalizer when rewards are paid out to a pool.\n /// @param epoch The epoch when the rewards were earned.\n /// @param poolId The pool's ID.\n /// @param operatorReward Amount of reward paid to pool operator.\n /// @param membersReward Amount of reward paid to pool members.\n event RewardsPaid(\n uint256 indexed epoch,\n bytes32 indexed poolId,\n uint256 operatorReward,\n uint256 membersReward\n );\n\n /// @dev Emitted whenever staking parameters are changed via the `setParams()` function.\n /// @param epochDurationInSeconds Minimum seconds between epochs.\n /// @param rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm.\n /// @param minimumPoolStake Minimum amount of stake required in a pool to collect rewards.\n /// @param cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor.\n /// @param cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor.\n event ParamsSet(\n uint256 epochDurationInSeconds,\n uint32 rewardDelegatedStakeWeight,\n uint256 minimumPoolStake,\n uint256 cobbDouglasAlphaNumerator,\n uint256 cobbDouglasAlphaDenominator\n );\n\n /// @dev Emitted by MixinStakingPool when a new pool is created.\n /// @param poolId Unique id generated for pool.\n /// @param operator The operator (creator) of pool.\n /// @param operatorShare The share of rewards given to the operator, in ppm.\n event StakingPoolCreated(\n bytes32 poolId,\n address operator,\n uint32 operatorShare\n );\n\n /// @dev Emitted by MixinStakingPool when a maker sets their pool.\n /// @param makerAddress Adress of maker added to pool.\n /// @param poolId Unique id of pool.\n event MakerStakingPoolSet(\n address indexed makerAddress,\n bytes32 indexed poolId\n );\n\n /// @dev Emitted when a staking pool's operator share is decreased.\n /// @param poolId Unique Id of pool.\n /// @param oldOperatorShare Previous share of rewards owned by operator.\n /// @param newOperatorShare Newly decreased share of rewards owned by operator.\n event OperatorShareDecreased(\n bytes32 indexed poolId,\n uint32 oldOperatorShare,\n uint32 newOperatorShare\n );\n}\n",
"src/interfaces/IStakingProxy.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./IStructs.sol\";\n\n\ncontract IStakingProxy {\n\n /// @dev Emitted by StakingProxy when a staking contract is attached.\n /// @param newStakingContractAddress Address of newly attached staking contract.\n event StakingContractAttachedToProxy(\n address newStakingContractAddress\n );\n\n /// @dev Emitted by StakingProxy when a staking contract is detached.\n event StakingContractDetachedFromProxy();\n\n /// @dev Attach a staking contract; future calls will be delegated to the staking contract.\n /// Note that this is callable only by an authorized address.\n /// @param _stakingContract Address of staking contract.\n function attachStakingContract(address _stakingContract)\n external;\n\n /// @dev Detach the current staking contract.\n /// Note that this is callable only by an authorized address.\n function detachStakingContract()\n external;\n\n /// @dev Asserts that an epoch is between 5 and 30 days long.\n // Asserts that 0 < cobb douglas alpha value <= 1.\n // Asserts that a stake weight is <= 100%.\n // Asserts that pools allow >= 1 maker.\n // Asserts that all addresses are initialized.\n function assertValidStorageParams()\n external\n view;\n}\n",
"src/stake/MixinStake.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../staking_pools/MixinStakingPool.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\n\n\ncontract MixinStake is\n MixinStakingPool\n{\n using LibSafeMath for uint256;\n\n /// @dev Stake ZRX tokens. Tokens are deposited into the ZRX Vault.\n /// Unstake to retrieve the ZRX. Stake is in the 'Active' status.\n /// @param amount of ZRX to stake.\n function stake(uint256 amount)\n external\n {\n address staker = msg.sender;\n\n // deposit equivalent amount of ZRX into vault\n getZrxVault().depositFrom(staker, amount);\n\n // mint stake\n _increaseCurrentAndNextBalance(\n _ownerStakeByStatus[uint8(IStructs.StakeStatus.UNDELEGATED)][staker],\n amount\n );\n\n // notify\n emit Stake(\n staker,\n amount\n );\n }\n\n /// @dev Unstake. Tokens are withdrawn from the ZRX Vault and returned to\n /// the staker. Stake must be in the 'undelegated' status in both the\n /// current and next epoch in order to be unstaked.\n /// @param amount of ZRX to unstake.\n function unstake(uint256 amount)\n external\n {\n address staker = msg.sender;\n\n IStructs.StoredBalance memory undelegatedBalance =\n _loadCurrentBalance(_ownerStakeByStatus[uint8(IStructs.StakeStatus.UNDELEGATED)][staker]);\n\n // stake must be undelegated in current and next epoch to be withdrawn\n uint256 currentWithdrawableStake = LibSafeMath.min256(\n undelegatedBalance.currentEpochBalance,\n undelegatedBalance.nextEpochBalance\n );\n\n if (amount > currentWithdrawableStake) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.InsufficientBalanceError(\n amount,\n currentWithdrawableStake\n )\n );\n }\n\n // burn undelegated stake\n _decreaseCurrentAndNextBalance(\n _ownerStakeByStatus[uint8(IStructs.StakeStatus.UNDELEGATED)][staker],\n amount\n );\n\n // withdraw equivalent amount of ZRX from vault\n getZrxVault().withdrawFrom(staker, amount);\n\n // emit stake event\n emit Unstake(\n staker,\n amount\n );\n }\n\n /// @dev Moves stake between statuses: 'undelegated' or 'delegated'.\n /// Delegated stake can also be moved between pools.\n /// This change comes into effect next epoch.\n /// @param from status to move stake out of.\n /// @param to status to move stake into.\n /// @param amount of stake to move.\n function moveStake(\n IStructs.StakeInfo calldata from,\n IStructs.StakeInfo calldata to,\n uint256 amount\n )\n external\n {\n address staker = msg.sender;\n\n // Sanity check: no-op if no stake is being moved.\n if (amount == 0) {\n return;\n }\n\n // Sanity check: no-op if moving stake from undelegated to undelegated.\n if (from.status == IStructs.StakeStatus.UNDELEGATED &&\n to.status == IStructs.StakeStatus.UNDELEGATED) {\n return;\n }\n\n // handle delegation\n if (from.status == IStructs.StakeStatus.DELEGATED) {\n _undelegateStake(\n from.poolId,\n staker,\n amount\n );\n }\n\n if (to.status == IStructs.StakeStatus.DELEGATED) {\n _delegateStake(\n to.poolId,\n staker,\n amount\n );\n }\n\n // execute move\n IStructs.StoredBalance storage fromPtr = _ownerStakeByStatus[uint8(from.status)][staker];\n IStructs.StoredBalance storage toPtr = _ownerStakeByStatus[uint8(to.status)][staker];\n _moveStake(\n fromPtr,\n toPtr,\n amount\n );\n\n // notify\n emit MoveStake(\n staker,\n amount,\n uint8(from.status),\n from.poolId,\n uint8(to.status),\n to.poolId\n );\n }\n\n /// @dev Delegates a owners stake to a staking pool.\n /// @param poolId Id of pool to delegate to.\n /// @param staker Owner who wants to delegate.\n /// @param amount Amount of stake to delegate.\n function _delegateStake(\n bytes32 poolId,\n address staker,\n uint256 amount\n )\n private\n {\n // Sanity check the pool we're delegating to exists.\n _assertStakingPoolExists(poolId);\n\n _withdrawAndSyncDelegatorRewards(\n poolId,\n staker\n );\n\n // Increase how much stake the staker has delegated to the input pool.\n _increaseNextBalance(\n _delegatedStakeToPoolByOwner[staker][poolId],\n amount\n );\n\n // Increase how much stake has been delegated to pool.\n _increaseNextBalance(\n _delegatedStakeByPoolId[poolId],\n amount\n );\n\n // Increase next balance of global delegated stake.\n _increaseNextBalance(\n _globalStakeByStatus[uint8(IStructs.StakeStatus.DELEGATED)],\n amount\n );\n }\n\n /// @dev Un-Delegates a owners stake from a staking pool.\n /// @param poolId Id of pool to un-delegate from.\n /// @param staker Owner who wants to un-delegate.\n /// @param amount Amount of stake to un-delegate.\n function _undelegateStake(\n bytes32 poolId,\n address staker,\n uint256 amount\n )\n private\n {\n // sanity check the pool we're undelegating from exists\n _assertStakingPoolExists(poolId);\n\n _withdrawAndSyncDelegatorRewards(\n poolId,\n staker\n );\n\n // Decrease how much stake the staker has delegated to the input pool.\n _decreaseNextBalance(\n _delegatedStakeToPoolByOwner[staker][poolId],\n amount\n );\n\n // Decrease how much stake has been delegated to pool.\n _decreaseNextBalance(\n _delegatedStakeByPoolId[poolId],\n amount\n );\n\n // Decrease next balance of global delegated stake (aggregated across all stakers).\n _decreaseNextBalance(\n _globalStakeByStatus[uint8(IStructs.StakeStatus.DELEGATED)],\n amount\n );\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n",
"src/staking_pools/MixinStakingPool.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\nimport \"../interfaces/IStructs.sol\";\nimport \"../sys/MixinAbstract.sol\";\nimport \"./MixinStakingPoolRewards.sol\";\n\n\ncontract MixinStakingPool is\n MixinAbstract,\n MixinStakingPoolRewards\n{\n using LibSafeMath for uint256;\n using LibSafeDowncast for uint256;\n\n /// @dev Asserts that the sender is the operator of the input pool.\n /// @param poolId Pool sender must be operator of.\n modifier onlyStakingPoolOperator(bytes32 poolId) {\n _assertSenderIsPoolOperator(poolId);\n _;\n }\n\n /// @dev Create a new staking pool. The sender will be the operator of this pool.\n /// Note that an operator must be payable.\n /// @param operatorShare Portion of rewards owned by the operator, in ppm.\n /// @param addOperatorAsMaker Adds operator to the created pool as a maker for convenience iff true.\n /// @return poolId The unique pool id generated for this pool.\n function createStakingPool(uint32 operatorShare, bool addOperatorAsMaker)\n external\n returns (bytes32 poolId)\n {\n // note that an operator must be payable\n address operator = msg.sender;\n\n // compute unique id for this pool\n poolId = lastPoolId = bytes32(uint256(lastPoolId).safeAdd(1));\n\n // sanity check on operator share\n _assertNewOperatorShare(\n poolId,\n PPM_DENOMINATOR, // max operator share\n operatorShare\n );\n\n // create and store pool\n IStructs.Pool memory pool = IStructs.Pool({\n operator: operator,\n operatorShare: operatorShare\n });\n _poolById[poolId] = pool;\n\n // Staking pool has been created\n emit StakingPoolCreated(poolId, operator, operatorShare);\n\n if (addOperatorAsMaker) {\n joinStakingPoolAsMaker(poolId);\n }\n\n return poolId;\n }\n\n /// @dev Decreases the operator share for the given pool (i.e. increases pool rewards for members).\n /// @param poolId Unique Id of pool.\n /// @param newOperatorShare The newly decreased percentage of any rewards owned by the operator.\n function decreaseStakingPoolOperatorShare(bytes32 poolId, uint32 newOperatorShare)\n external\n onlyStakingPoolOperator(poolId)\n {\n // load pool and assert that we can decrease\n uint32 currentOperatorShare = _poolById[poolId].operatorShare;\n _assertNewOperatorShare(\n poolId,\n currentOperatorShare,\n newOperatorShare\n );\n\n // decrease operator share\n _poolById[poolId].operatorShare = newOperatorShare;\n emit OperatorShareDecreased(\n poolId,\n currentOperatorShare,\n newOperatorShare\n );\n }\n\n /// @dev Allows caller to join a staking pool as a maker.\n /// @param poolId Unique id of pool.\n function joinStakingPoolAsMaker(bytes32 poolId)\n public\n {\n address maker = msg.sender;\n poolIdByMaker[maker] = poolId;\n emit MakerStakingPoolSet(\n maker,\n poolId\n );\n }\n\n /// @dev Returns a staking pool\n /// @param poolId Unique id of pool.\n function getStakingPool(bytes32 poolId)\n public\n view\n returns (IStructs.Pool memory)\n {\n return _poolById[poolId];\n }\n\n /// @dev Reverts iff a staking pool does not exist.\n /// @param poolId Unique id of pool.\n function _assertStakingPoolExists(bytes32 poolId)\n internal\n view\n {\n if (_poolById[poolId].operator == NIL_ADDRESS) {\n // we use the pool's operator as a proxy for its existence\n LibRichErrors.rrevert(\n LibStakingRichErrors.PoolExistenceError(\n poolId,\n false\n )\n );\n }\n }\n\n /// @dev Reverts iff the new operator share is invalid.\n /// @param poolId Unique id of pool.\n /// @param currentOperatorShare Current operator share.\n /// @param newOperatorShare New operator share.\n function _assertNewOperatorShare(\n bytes32 poolId,\n uint32 currentOperatorShare,\n uint32 newOperatorShare\n )\n private\n pure\n {\n // sanity checks\n if (newOperatorShare > PPM_DENOMINATOR) {\n // operator share must be a valid fraction\n LibRichErrors.rrevert(LibStakingRichErrors.OperatorShareError(\n LibStakingRichErrors.OperatorShareErrorCodes.OperatorShareTooLarge,\n poolId,\n newOperatorShare\n ));\n } else if (newOperatorShare >= currentOperatorShare) {\n // new share must be less than the current share\n LibRichErrors.rrevert(LibStakingRichErrors.OperatorShareError(\n LibStakingRichErrors.OperatorShareErrorCodes.CanOnlyDecreaseOperatorShare,\n poolId,\n newOperatorShare\n ));\n }\n }\n\n /// @dev Asserts that the sender is the operator of the input pool.\n /// @param poolId Pool sender must be operator of.\n function _assertSenderIsPoolOperator(bytes32 poolId)\n private\n view\n {\n address operator = _poolById[poolId].operator;\n if (msg.sender != operator) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.OnlyCallableByPoolOperatorError(\n msg.sender,\n poolId\n )\n );\n }\n }\n}\n",
"src/sys/MixinAbstract.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Exposes some internal functions from various contracts to avoid\n/// cyclical dependencies.\ncontract MixinAbstract {\n\n /// @dev Computes the reward owed to a pool during finalization.\n /// Does nothing if the pool is already finalized.\n /// @param poolId The pool's ID.\n /// @return totalReward The total reward owed to a pool.\n /// @return membersStake The total stake for all non-operator members in\n /// this pool.\n function _getUnfinalizedPoolRewards(bytes32 poolId)\n internal\n view\n returns (\n uint256 totalReward,\n uint256 membersStake\n );\n\n /// @dev Asserts that a pool has been finalized last epoch.\n /// @param poolId The id of the pool that should have been finalized.\n function _assertPoolFinalizedLastEpoch(bytes32 poolId)\n internal\n view;\n}\n",
"src/staking_pools/MixinStakingPoolRewards.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"./MixinCumulativeRewards.sol\";\nimport \"../sys/MixinAbstract.sol\";\n\n\ncontract MixinStakingPoolRewards is\n MixinAbstract,\n MixinCumulativeRewards\n{\n using LibSafeMath for uint256;\n\n /// @dev Withdraws the caller's WETH rewards that have accumulated\n /// until the last epoch.\n /// @param poolId Unique id of pool.\n function withdrawDelegatorRewards(bytes32 poolId)\n external\n {\n _withdrawAndSyncDelegatorRewards(poolId, msg.sender);\n }\n\n /// @dev Computes the reward balance in ETH of the operator of a pool.\n /// @param poolId Unique id of pool.\n /// @return totalReward Balance in ETH.\n function computeRewardBalanceOfOperator(bytes32 poolId)\n external\n view\n returns (uint256 reward)\n {\n // Because operator rewards are immediately withdrawn as WETH\n // on finalization, the only factor in this function are unfinalized\n // rewards.\n IStructs.Pool memory pool = _poolById[poolId];\n // Get any unfinalized rewards.\n (uint256 unfinalizedTotalRewards, uint256 unfinalizedMembersStake) =\n _getUnfinalizedPoolRewards(poolId);\n\n // Get the operators' portion.\n (reward,) = _computePoolRewardsSplit(\n pool.operatorShare,\n unfinalizedTotalRewards,\n unfinalizedMembersStake\n );\n return reward;\n }\n\n /// @dev Computes the reward balance in ETH of a specific member of a pool.\n /// @param poolId Unique id of pool.\n /// @param member The member of the pool.\n /// @return totalReward Balance in ETH.\n function computeRewardBalanceOfDelegator(bytes32 poolId, address member)\n external\n view\n returns (uint256 reward)\n {\n IStructs.Pool memory pool = _poolById[poolId];\n // Get any unfinalized rewards.\n (uint256 unfinalizedTotalRewards, uint256 unfinalizedMembersStake) =\n _getUnfinalizedPoolRewards(poolId);\n\n // Get the members' portion.\n (, uint256 unfinalizedMembersReward) = _computePoolRewardsSplit(\n pool.operatorShare,\n unfinalizedTotalRewards,\n unfinalizedMembersStake\n );\n return _computeDelegatorReward(\n poolId,\n member,\n unfinalizedMembersReward,\n unfinalizedMembersStake\n );\n }\n\n /// @dev Syncs rewards for a delegator. This includes withdrawing rewards\n /// rewards and adding/removing dependencies on cumulative rewards.\n /// @param poolId Unique id of pool.\n /// @param member of the pool.\n function _withdrawAndSyncDelegatorRewards(\n bytes32 poolId,\n address member\n )\n internal\n {\n // Ensure the pool is finalized.\n _assertPoolFinalizedLastEpoch(poolId);\n\n // Compute balance owed to delegator\n uint256 balance = _computeDelegatorReward(\n poolId,\n member,\n // No unfinalized values because we ensured the pool is already\n // finalized.\n 0,\n 0\n );\n\n // Sync the delegated stake balance. This will ensure future calls of\n // `_computeDelegatorReward` during this epoch will return 0, \n // preventing a delegator from withdrawing more than once an epoch.\n _delegatedStakeToPoolByOwner[member][poolId] =\n _loadCurrentBalance(_delegatedStakeToPoolByOwner[member][poolId]);\n\n // Withdraw non-0 balance\n if (balance != 0) {\n // Decrease the balance of the pool\n _decreasePoolRewards(poolId, balance);\n\n // Withdraw the member's WETH balance\n getWethContract().transfer(member, balance);\n }\n\n // Ensure a cumulative reward entry exists for this epoch,\n // copying the previous epoch's CR if one doesn't exist already.\n _updateCumulativeReward(poolId);\n }\n\n /// @dev Handles a pool's reward at the current epoch.\n /// This will split the reward between the operator and members,\n /// depositing them into their respective vaults, and update the\n /// accounting needed to allow members to withdraw their individual\n /// rewards.\n /// @param poolId Unique Id of pool.\n /// @param reward received by the pool.\n /// @param membersStake the amount of non-operator delegated stake that\n /// will split the reward.\n /// @return operatorReward Portion of `reward` given to the pool operator.\n /// @return membersReward Portion of `reward` given to the pool members.\n function _syncPoolRewards(\n bytes32 poolId,\n uint256 reward,\n uint256 membersStake\n )\n internal\n returns (uint256 operatorReward, uint256 membersReward)\n {\n IStructs.Pool memory pool = _poolById[poolId];\n\n // Split the reward between operator and members\n (operatorReward, membersReward) = _computePoolRewardsSplit(\n pool.operatorShare,\n reward,\n membersStake\n );\n\n if (operatorReward > 0) {\n // Transfer the operator's weth reward to the operator\n getWethContract().transfer(pool.operator, operatorReward);\n }\n\n if (membersReward > 0) {\n // Increase the balance of the pool\n _increasePoolRewards(poolId, membersReward);\n // Create a cumulative reward entry at the current epoch.\n _addCumulativeReward(poolId, membersReward, membersStake);\n }\n\n return (operatorReward, membersReward);\n }\n\n /// @dev Compute the split of a pool reward between the operator and members\n /// based on the `operatorShare` and `membersStake`.\n /// @param operatorShare The fraction of rewards owed to the operator,\n /// in PPM.\n /// @param totalReward The pool reward.\n /// @param membersStake The amount of member (non-operator) stake delegated\n /// to the pool in the epoch the rewards were earned.\n /// @return operatorReward Portion of `totalReward` given to the pool operator.\n /// @return membersReward Portion of `totalReward` given to the pool members.\n function _computePoolRewardsSplit(\n uint32 operatorShare,\n uint256 totalReward,\n uint256 membersStake\n )\n internal\n pure\n returns (uint256 operatorReward, uint256 membersReward)\n {\n if (membersStake == 0) {\n operatorReward = totalReward;\n } else {\n operatorReward = LibMath.getPartialAmountCeil(\n uint256(operatorShare),\n PPM_DENOMINATOR,\n totalReward\n );\n membersReward = totalReward.safeSub(operatorReward);\n }\n return (operatorReward, membersReward);\n }\n\n /// @dev Computes the reward balance in ETH of a specific member of a pool.\n /// @param poolId Unique id of pool.\n /// @param member of the pool.\n /// @param unfinalizedMembersReward Unfinalized total members reward (if any).\n /// @param unfinalizedMembersStake Unfinalized total members stake (if any).\n /// @return reward Balance in WETH.\n function _computeDelegatorReward(\n bytes32 poolId,\n address member,\n uint256 unfinalizedMembersReward,\n uint256 unfinalizedMembersStake\n )\n private\n view\n returns (uint256 reward)\n {\n uint256 currentEpoch_ = currentEpoch;\n IStructs.StoredBalance memory delegatedStake = _delegatedStakeToPoolByOwner[member][poolId];\n\n // There can be no rewards if the last epoch when stake was stored is\n // equal to the current epoch, because all prior rewards, including\n // rewards finalized this epoch have been claimed.\n if (delegatedStake.currentEpoch == currentEpoch_) {\n return 0;\n }\n\n // We account for rewards over 3 intervals, below.\n\n // 1/3 Unfinalized rewards earned in `currentEpoch - 1`.\n reward = _computeUnfinalizedDelegatorReward(\n delegatedStake,\n currentEpoch_,\n unfinalizedMembersReward,\n unfinalizedMembersStake\n );\n\n // 2/3 Finalized rewards earned in epochs [`delegatedStake.currentEpoch + 1` .. `currentEpoch - 1`]\n uint256 delegatedStakeNextEpoch = uint256(delegatedStake.currentEpoch).safeAdd(1);\n reward = reward.safeAdd(\n _computeMemberRewardOverInterval(\n poolId,\n delegatedStake.currentEpochBalance,\n delegatedStake.currentEpoch,\n delegatedStakeNextEpoch\n )\n );\n\n // 3/3 Finalized rewards earned in epoch `delegatedStake.currentEpoch`.\n reward = reward.safeAdd(\n _computeMemberRewardOverInterval(\n poolId,\n delegatedStake.nextEpochBalance,\n delegatedStakeNextEpoch,\n currentEpoch_\n )\n );\n\n return reward;\n }\n\n /// @dev Computes the unfinalized rewards earned by a delegator in the last epoch.\n /// @param delegatedStake Amount of stake delegated to pool by a specific staker\n /// @param currentEpoch_ The epoch in which this call is executing\n /// @param unfinalizedMembersReward Unfinalized total members reward (if any).\n /// @param unfinalizedMembersStake Unfinalized total members stake (if any).\n /// @return reward Balance in WETH.\n function _computeUnfinalizedDelegatorReward(\n IStructs.StoredBalance memory delegatedStake,\n uint256 currentEpoch_,\n uint256 unfinalizedMembersReward,\n uint256 unfinalizedMembersStake\n )\n private\n pure\n returns (uint256)\n {\n // If there are unfinalized rewards this epoch, compute the member's\n // share.\n if (unfinalizedMembersReward == 0 || unfinalizedMembersStake == 0) {\n return 0;\n }\n\n // Unfinalized rewards are always earned from stake in\n // the prior epoch so we want the stake at `currentEpoch_-1`.\n uint256 unfinalizedStakeBalance = delegatedStake.currentEpoch >= currentEpoch_.safeSub(1) ?\n delegatedStake.currentEpochBalance :\n delegatedStake.nextEpochBalance;\n\n // Sanity check to save gas on computation\n if (unfinalizedStakeBalance == 0) {\n return 0;\n }\n\n // Compute unfinalized reward\n return LibMath.getPartialAmountFloor(\n unfinalizedMembersReward,\n unfinalizedMembersStake,\n unfinalizedStakeBalance\n );\n }\n\n /// @dev Increases rewards for a pool.\n /// @param poolId Unique id of pool.\n /// @param amount Amount to increment rewards by.\n function _increasePoolRewards(bytes32 poolId, uint256 amount)\n private\n {\n rewardsByPoolId[poolId] = rewardsByPoolId[poolId].safeAdd(amount);\n wethReservedForPoolRewards = wethReservedForPoolRewards.safeAdd(amount);\n }\n\n /// @dev Decreases rewards for a pool.\n /// @param poolId Unique id of pool.\n /// @param amount Amount to decrement rewards by.\n function _decreasePoolRewards(bytes32 poolId, uint256 amount)\n private\n {\n rewardsByPoolId[poolId] = rewardsByPoolId[poolId].safeSub(amount);\n wethReservedForPoolRewards = wethReservedForPoolRewards.safeSub(amount);\n }\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibMath.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n using LibSafeMath for uint256;\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorFloor(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorCeil(\n numerator,\n denominator,\n target\n )) {\n LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero.\n if (target == 0 || numerator == 0) {\n return false;\n }\n\n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n }\n\n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = denominator.safeSub(remainder) % denominator;\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n}\n",
"@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n // bytes4(keccak256(\"DivisionByZeroError()\"))\n bytes internal constant DIVISION_BY_ZERO_ERROR =\n hex\"a791837c\";\n\n // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n 0x339f3de2;\n\n // solhint-disable func-name-mixedcase\n function DivisionByZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return DIVISION_BY_ZERO_ERROR;\n }\n\n function RoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ROUNDING_ERROR_SELECTOR,\n numerator,\n denominator,\n target\n );\n }\n}\n",
"src/staking_pools/MixinCumulativeRewards.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibFractions.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../stake/MixinStakeBalances.sol\";\nimport \"../immutable/MixinConstants.sol\";\n\n\ncontract MixinCumulativeRewards is\n MixinStakeBalances,\n MixinConstants\n{\n using LibSafeMath for uint256;\n\n /// @dev returns true iff Cumulative Rewards are set\n function _isCumulativeRewardSet(IStructs.Fraction memory cumulativeReward)\n internal\n pure\n returns (bool)\n {\n // We use the denominator as a proxy for whether the cumulative\n // reward is set, as setting the cumulative reward always sets this\n // field to at least 1.\n return cumulativeReward.denominator != 0;\n }\n\n /// @dev Sets a pool's cumulative delegator rewards for the current epoch,\n /// given the rewards earned and stake from the last epoch, which will\n /// be summed with the previous cumulative rewards for this pool.\n /// If the last cumulative reward epoch is the current epoch, this is a\n /// no-op.\n /// @param poolId The pool ID.\n /// @param reward The total reward earned by pool delegators from the last epoch.\n /// @param stake The total delegated stake in the pool in the last epoch.\n function _addCumulativeReward(\n bytes32 poolId,\n uint256 reward,\n uint256 stake\n )\n internal\n {\n // Fetch the last epoch at which we stored an entry for this pool;\n // this is the most up-to-date cumulative rewards for this pool.\n uint256 lastStoredEpoch = _cumulativeRewardsByPoolLastStored[poolId];\n uint256 currentEpoch_ = currentEpoch;\n\n // If we already have a record for this epoch, don't overwrite it.\n if (lastStoredEpoch == currentEpoch_) {\n return;\n }\n\n IStructs.Fraction memory mostRecentCumulativeReward =\n _cumulativeRewardsByPool[poolId][lastStoredEpoch];\n\n // Compute new cumulative reward\n IStructs.Fraction memory cumulativeReward;\n if (_isCumulativeRewardSet(mostRecentCumulativeReward)) {\n // If we have a prior cumulative reward entry, we sum them as fractions.\n (cumulativeReward.numerator, cumulativeReward.denominator) = LibFractions.add(\n mostRecentCumulativeReward.numerator,\n mostRecentCumulativeReward.denominator,\n reward,\n stake\n );\n // Normalize to prevent overflows in future operations.\n (cumulativeReward.numerator, cumulativeReward.denominator) = LibFractions.normalize(\n cumulativeReward.numerator,\n cumulativeReward.denominator\n );\n } else {\n (cumulativeReward.numerator, cumulativeReward.denominator) = (reward, stake);\n }\n\n // Store cumulative rewards for this epoch.\n _cumulativeRewardsByPool[poolId][currentEpoch_] = cumulativeReward;\n _cumulativeRewardsByPoolLastStored[poolId] = currentEpoch_;\n }\n\n /// @dev Sets a pool's cumulative delegator rewards for the current epoch,\n /// using the last stored cumulative rewards. If we've already set\n /// a CR for this epoch, this is a no-op.\n /// @param poolId The pool ID.\n function _updateCumulativeReward(bytes32 poolId)\n internal\n {\n // Just add empty rewards for this epoch, which will be added to\n // the previous CR, so we end up with the previous CR being set for\n // this epoch.\n _addCumulativeReward(poolId, 0, 1);\n }\n\n /// @dev Computes a member's reward over a given epoch interval.\n /// @param poolId Uniqud Id of pool.\n /// @param memberStakeOverInterval Stake delegated to pool by member over\n /// the interval.\n /// @param beginEpoch Beginning of interval.\n /// @param endEpoch End of interval.\n /// @return rewards Reward accumulated over interval [beginEpoch, endEpoch]\n function _computeMemberRewardOverInterval(\n bytes32 poolId,\n uint256 memberStakeOverInterval,\n uint256 beginEpoch,\n uint256 endEpoch\n )\n internal\n view\n returns (uint256 reward)\n {\n // Sanity check if we can skip computation, as it will result in zero.\n if (memberStakeOverInterval == 0 || beginEpoch == endEpoch) {\n return 0;\n }\n\n // Sanity check interval\n require(beginEpoch < endEpoch, \"CR_INTERVAL_INVALID\");\n\n // Sanity check begin reward\n IStructs.Fraction memory beginReward = _getCumulativeRewardAtEpoch(poolId, beginEpoch);\n IStructs.Fraction memory endReward = _getCumulativeRewardAtEpoch(poolId, endEpoch);\n\n // Compute reward\n reward = LibFractions.scaleDifference(\n endReward.numerator,\n endReward.denominator,\n beginReward.numerator,\n beginReward.denominator,\n memberStakeOverInterval\n );\n }\n\n /// @dev Fetch the most recent cumulative reward entry for a pool.\n /// @param poolId Unique ID of pool.\n /// @return cumulativeReward The most recent cumulative reward `poolId`.\n function _getMostRecentCumulativeReward(bytes32 poolId)\n private\n view\n returns (IStructs.Fraction memory cumulativeReward)\n {\n uint256 lastStoredEpoch = _cumulativeRewardsByPoolLastStored[poolId];\n return _cumulativeRewardsByPool[poolId][lastStoredEpoch];\n }\n\n /// @dev Fetch the cumulative reward for a given epoch.\n /// If the corresponding CR does not exist in state, then we backtrack\n /// to find its value by querying `epoch-1` and then most recent CR.\n /// @param poolId Unique ID of pool.\n /// @param epoch The epoch to find the\n /// @return cumulativeReward The cumulative reward for `poolId` at `epoch`.\n /// @return cumulativeRewardStoredAt Epoch that the `cumulativeReward` is stored at.\n function _getCumulativeRewardAtEpoch(bytes32 poolId, uint256 epoch)\n private\n view\n returns (IStructs.Fraction memory cumulativeReward)\n {\n // Return CR at `epoch`, given it's set.\n cumulativeReward = _cumulativeRewardsByPool[poolId][epoch];\n if (_isCumulativeRewardSet(cumulativeReward)) {\n return cumulativeReward;\n }\n\n // Return CR at `epoch-1`, given it's set.\n uint256 lastEpoch = epoch.safeSub(1);\n cumulativeReward = _cumulativeRewardsByPool[poolId][lastEpoch];\n if (_isCumulativeRewardSet(cumulativeReward)) {\n return cumulativeReward;\n }\n\n // Return the most recent CR, given it's less than `epoch`.\n uint256 mostRecentEpoch = _cumulativeRewardsByPoolLastStored[poolId];\n if (mostRecentEpoch < epoch) {\n cumulativeReward = _cumulativeRewardsByPool[poolId][mostRecentEpoch];\n if (_isCumulativeRewardSet(cumulativeReward)) {\n return cumulativeReward;\n }\n }\n\n // Otherwise return an empty CR.\n return IStructs.Fraction(0, 1);\n }\n}\n",
"@0x/contracts-utils/contracts/src/LibFractions.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibSafeMath.sol\";\n\n\nlibrary LibFractions {\n\n using LibSafeMath for uint256;\n\n /// @dev Safely adds two fractions `n1/d1 + n2/d2`\n /// @param n1 numerator of `1`\n /// @param d1 denominator of `1`\n /// @param n2 numerator of `2`\n /// @param d2 denominator of `2`\n /// @return numerator Numerator of sum\n /// @return denominator Denominator of sum\n function add(\n uint256 n1,\n uint256 d1,\n uint256 n2,\n uint256 d2\n )\n internal\n pure\n returns (\n uint256 numerator,\n uint256 denominator\n )\n {\n if (n1 == 0) {\n return (numerator = n2, denominator = d2);\n }\n if (n2 == 0) {\n return (numerator = n1, denominator = d1);\n }\n numerator = n1\n .safeMul(d2)\n .safeAdd(n2.safeMul(d1));\n denominator = d1.safeMul(d2);\n return (numerator, denominator);\n }\n\n /// @dev Rescales a fraction to prevent overflows during addition if either\n /// the numerator or the denominator are > `maxValue`.\n /// @param numerator The numerator.\n /// @param denominator The denominator.\n /// @param maxValue The maximum value allowed for both the numerator and\n /// denominator.\n /// @return scaledNumerator The rescaled numerator.\n /// @return scaledDenominator The rescaled denominator.\n function normalize(\n uint256 numerator,\n uint256 denominator,\n uint256 maxValue\n )\n internal\n pure\n returns (\n uint256 scaledNumerator,\n uint256 scaledDenominator\n )\n {\n // If either the numerator or the denominator are > `maxValue`,\n // re-scale them by `maxValue` to prevent overflows in future operations.\n if (numerator > maxValue || denominator > maxValue) {\n uint256 rescaleBase = numerator >= denominator ? numerator : denominator;\n rescaleBase = rescaleBase.safeDiv(maxValue);\n scaledNumerator = numerator.safeDiv(rescaleBase);\n scaledDenominator = denominator.safeDiv(rescaleBase);\n } else {\n scaledNumerator = numerator;\n scaledDenominator = denominator;\n }\n return (scaledNumerator, scaledDenominator);\n }\n\n /// @dev Rescales a fraction to prevent overflows during addition if either\n /// the numerator or the denominator are > 2 ** 127.\n /// @param numerator The numerator.\n /// @param denominator The denominator.\n /// @return scaledNumerator The rescaled numerator.\n /// @return scaledDenominator The rescaled denominator.\n function normalize(\n uint256 numerator,\n uint256 denominator\n )\n internal\n pure\n returns (\n uint256 scaledNumerator,\n uint256 scaledDenominator\n )\n {\n return normalize(numerator, denominator, 2 ** 127);\n }\n\n /// @dev Safely scales the difference between two fractions.\n /// @param n1 numerator of `1`\n /// @param d1 denominator of `1`\n /// @param n2 numerator of `2`\n /// @param d2 denominator of `2`\n /// @param s scalar to multiply by difference.\n /// @return result `s * (n1/d1 - n2/d2)`.\n function scaleDifference(\n uint256 n1,\n uint256 d1,\n uint256 n2,\n uint256 d2,\n uint256 s\n )\n internal\n pure\n returns (uint256 result)\n {\n if (s == 0) {\n return 0;\n }\n if (n2 == 0) {\n return result = s\n .safeMul(n1)\n .safeDiv(d1);\n }\n uint256 numerator = n1\n .safeMul(d2)\n .safeSub(n2.safeMul(d1));\n uint256 tmp = numerator.safeDiv(d2);\n return s\n .safeMul(tmp)\n .safeDiv(d1);\n }\n}\n",
"src/stake/MixinStakeBalances.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../interfaces/IStructs.sol\";\nimport \"../immutable/MixinDeploymentConstants.sol\";\nimport \"./MixinStakeStorage.sol\";\n\n\ncontract MixinStakeBalances is\n MixinStakeStorage,\n MixinDeploymentConstants\n{\n using LibSafeMath for uint256;\n\n /// @dev Gets global stake for a given status.\n /// @param stakeStatus UNDELEGATED or DELEGATED\n /// @return Global stake for given status.\n function getGlobalStakeByStatus(IStructs.StakeStatus stakeStatus)\n external\n view\n returns (IStructs.StoredBalance memory balance)\n {\n balance = _loadCurrentBalance(\n _globalStakeByStatus[uint8(IStructs.StakeStatus.DELEGATED)]\n );\n if (stakeStatus == IStructs.StakeStatus.UNDELEGATED) {\n // Undelegated stake is the difference between total stake and delegated stake\n // Note that any ZRX erroneously sent to the vault will be counted as undelegated stake\n uint256 totalStake = getZrxVault().balanceOfZrxVault();\n balance.currentEpochBalance = totalStake.safeSub(balance.currentEpochBalance).downcastToUint96();\n balance.nextEpochBalance = totalStake.safeSub(balance.nextEpochBalance).downcastToUint96();\n }\n return balance;\n }\n\n /// @dev Gets an owner's stake balances by status.\n /// @param staker Owner of stake.\n /// @param stakeStatus UNDELEGATED or DELEGATED\n /// @return Owner's stake balances for given status.\n function getOwnerStakeByStatus(\n address staker,\n IStructs.StakeStatus stakeStatus\n )\n external\n view\n returns (IStructs.StoredBalance memory balance)\n {\n balance = _loadCurrentBalance(\n _ownerStakeByStatus[uint8(stakeStatus)][staker]\n );\n return balance;\n }\n\n /// @dev Returns the total stake for a given staker.\n /// @param staker of stake.\n /// @return Total ZRX staked by `staker`.\n function getTotalStake(address staker)\n public\n view\n returns (uint256)\n {\n return getZrxVault().balanceOf(staker);\n }\n\n /// @dev Returns the stake delegated to a specific staking pool, by a given staker.\n /// @param staker of stake.\n /// @param poolId Unique Id of pool.\n /// @return Stake delegated to pool by staker.\n function getStakeDelegatedToPoolByOwner(address staker, bytes32 poolId)\n public\n view\n returns (IStructs.StoredBalance memory balance)\n {\n balance = _loadCurrentBalance(_delegatedStakeToPoolByOwner[staker][poolId]);\n return balance;\n }\n\n /// @dev Returns the total stake delegated to a specific staking pool,\n /// across all members.\n /// @param poolId Unique Id of pool.\n /// @return Total stake delegated to pool.\n function getTotalStakeDelegatedToPool(bytes32 poolId)\n public\n view\n returns (IStructs.StoredBalance memory balance)\n {\n balance = _loadCurrentBalance(_delegatedStakeByPoolId[poolId]);\n return balance;\n }\n}\n",
"src/immutable/MixinDeploymentConstants.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IEtherToken.sol\";\nimport \"../interfaces/IZrxVault.sol\";\n\n\n// solhint-disable separate-by-one-line-in-contract\ncontract MixinDeploymentConstants {\n\n // @TODO SET THESE VALUES FOR DEPLOYMENT\n\n // Mainnet WETH9 Address\n // address constant private WETH_ADDRESS = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);\n\n // Kovan WETH9 Address\n // address constant private WETH_ADDRESS = address(0xd0A1E359811322d97991E03f863a0C30C2cF029C);\n\n // Ropsten & Rinkeby WETH9 Address\n address constant private WETH_ADDRESS = address(0xc778417E063141139Fce010982780140Aa0cD5Ab);\n\n // @TODO SET THESE VALUES FOR DEPLOYMENT\n\n // Kovan ZrxVault address\n // address constant private ZRX_VAULT_ADDRESS = address(0xf36eabdFE986B35b62c8FD5a98A7f2aEBB79B291);\n\n // Ropsten ZrxVault address\n address constant private ZRX_VAULT_ADDRESS = address(0xffD161026865Ad8B4aB28a76840474935eEc4DfA);\n\n // Rinkeby ZrxVault address\n // address constant private ZRX_VAULT_ADDRESS = address(0xA5Bf6aC73bC40790FC6Ffc9DBbbCE76c9176e224);\n\n /// @dev An overridable way to access the deployed WETH contract.\n /// Must be view to allow overrides to access state.\n /// @return wethContract The WETH contract instance.\n function getWethContract()\n public\n view\n returns (IEtherToken wethContract)\n {\n wethContract = IEtherToken(WETH_ADDRESS);\n return wethContract;\n }\n\n /// @dev An overridable way to access the deployed zrxVault.\n /// Must be view to allow overrides to access state.\n /// @return zrxVault The zrxVault contract.\n function getZrxVault()\n public\n view\n returns (IZrxVault zrxVault)\n {\n zrxVault = IZrxVault(ZRX_VAULT_ADDRESS);\n return zrxVault;\n }\n}\n",
"src/stake/MixinStakeStorage.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"../libs/LibSafeDowncast.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../interfaces/IStructs.sol\";\nimport \"../sys/MixinScheduler.sol\";\n\n\n/// @dev This mixin contains logic for managing stake storage.\ncontract MixinStakeStorage is\n MixinScheduler\n{\n using LibSafeMath for uint256;\n using LibSafeDowncast for uint256;\n\n /// @dev Moves stake between states: 'undelegated' or 'delegated'.\n /// This change comes into effect next epoch.\n /// @param fromPtr pointer to storage location of `from` stake.\n /// @param toPtr pointer to storage location of `to` stake.\n /// @param amount of stake to move.\n function _moveStake(\n IStructs.StoredBalance storage fromPtr,\n IStructs.StoredBalance storage toPtr,\n uint256 amount\n )\n internal\n {\n // do nothing if pointers are equal\n if (_arePointersEqual(fromPtr, toPtr)) {\n return;\n }\n\n // load current balances from storage\n IStructs.StoredBalance memory from = _loadCurrentBalance(fromPtr);\n IStructs.StoredBalance memory to = _loadCurrentBalance(toPtr);\n\n // sanity check on balance\n if (amount > from.nextEpochBalance) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.InsufficientBalanceError(\n amount,\n from.nextEpochBalance\n )\n );\n }\n\n // move stake for next epoch\n from.nextEpochBalance = uint256(from.nextEpochBalance).safeSub(amount).downcastToUint96();\n to.nextEpochBalance = uint256(to.nextEpochBalance).safeAdd(amount).downcastToUint96();\n\n // update state in storage\n _storeBalance(fromPtr, from);\n _storeBalance(toPtr, to);\n }\n\n /// @dev Loads a balance from storage and updates its fields to reflect values for the current epoch.\n /// @param balancePtr to load.\n /// @return current balance.\n function _loadCurrentBalance(IStructs.StoredBalance storage balancePtr)\n internal\n view\n returns (IStructs.StoredBalance memory balance)\n {\n balance = balancePtr;\n uint256 currentEpoch_ = currentEpoch;\n if (currentEpoch_ > balance.currentEpoch) {\n balance.currentEpoch = currentEpoch_.downcastToUint64();\n balance.currentEpochBalance = balance.nextEpochBalance;\n }\n return balance;\n }\n\n /// @dev Increments both the `current` and `next` fields.\n /// @param balancePtr storage pointer to balance.\n /// @param amount to mint.\n function _increaseCurrentAndNextBalance(IStructs.StoredBalance storage balancePtr, uint256 amount)\n internal\n {\n // Remove stake from balance\n IStructs.StoredBalance memory balance = _loadCurrentBalance(balancePtr);\n balance.nextEpochBalance = uint256(balance.nextEpochBalance).safeAdd(amount).downcastToUint96();\n balance.currentEpochBalance = uint256(balance.currentEpochBalance).safeAdd(amount).downcastToUint96();\n\n // update state\n _storeBalance(balancePtr, balance);\n }\n\n /// @dev Decrements both the `current` and `next` fields.\n /// @param balancePtr storage pointer to balance.\n /// @param amount to mint.\n function _decreaseCurrentAndNextBalance(IStructs.StoredBalance storage balancePtr, uint256 amount)\n internal\n {\n // Remove stake from balance\n IStructs.StoredBalance memory balance = _loadCurrentBalance(balancePtr);\n balance.nextEpochBalance = uint256(balance.nextEpochBalance).safeSub(amount).downcastToUint96();\n balance.currentEpochBalance = uint256(balance.currentEpochBalance).safeSub(amount).downcastToUint96();\n\n // update state\n _storeBalance(balancePtr, balance);\n }\n\n /// @dev Increments the `next` field (but not the `current` field).\n /// @param balancePtr storage pointer to balance.\n /// @param amount to increment by.\n function _increaseNextBalance(IStructs.StoredBalance storage balancePtr, uint256 amount)\n internal\n {\n // Add stake to balance\n IStructs.StoredBalance memory balance = _loadCurrentBalance(balancePtr);\n balance.nextEpochBalance = uint256(balance.nextEpochBalance).safeAdd(amount).downcastToUint96();\n\n // update state\n _storeBalance(balancePtr, balance);\n }\n\n /// @dev Decrements the `next` field (but not the `current` field).\n /// @param balancePtr storage pointer to balance.\n /// @param amount to decrement by.\n function _decreaseNextBalance(IStructs.StoredBalance storage balancePtr, uint256 amount)\n internal\n {\n // Remove stake from balance\n IStructs.StoredBalance memory balance = _loadCurrentBalance(balancePtr);\n balance.nextEpochBalance = uint256(balance.nextEpochBalance).safeSub(amount).downcastToUint96();\n\n // update state\n _storeBalance(balancePtr, balance);\n }\n\n /// @dev Stores a balance in storage.\n /// @param balancePtr points to where `balance` will be stored.\n /// @param balance to save to storage.\n function _storeBalance(\n IStructs.StoredBalance storage balancePtr,\n IStructs.StoredBalance memory balance\n )\n private\n {\n // note - this compresses into a single `sstore` when optimizations are enabled,\n // since the StoredBalance struct occupies a single word of storage.\n balancePtr.currentEpoch = balance.currentEpoch;\n balancePtr.nextEpochBalance = balance.nextEpochBalance;\n balancePtr.currentEpochBalance = balance.currentEpochBalance;\n }\n\n /// @dev Returns true iff storage pointers resolve to same storage location.\n /// @param balancePtrA first storage pointer.\n /// @param balancePtrB second storage pointer.\n /// @return true iff pointers are equal.\n function _arePointersEqual(\n // solhint-disable-next-line no-unused-vars\n IStructs.StoredBalance storage balancePtrA,\n // solhint-disable-next-line no-unused-vars\n IStructs.StoredBalance storage balancePtrB\n )\n private\n pure\n returns (bool areEqual)\n {\n assembly {\n areEqual := and(\n eq(balancePtrA_slot, balancePtrB_slot),\n eq(balancePtrA_offset, balancePtrB_offset)\n )\n }\n return areEqual;\n }\n}\n",
"src/libs/LibSafeDowncast.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeDowncast {\n\n /// @dev Safely downcasts to a uint96\n /// Note that this reverts if the input value is too large.\n function downcastToUint96(uint256 a)\n internal\n pure\n returns (uint96 b)\n {\n b = uint96(a);\n if (uint256(b) != a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256DowncastError(\n LibSafeMathRichErrors.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96,\n a\n ));\n }\n return b;\n }\n\n /// @dev Safely downcasts to a uint64\n /// Note that this reverts if the input value is too large.\n function downcastToUint64(uint256 a)\n internal\n pure\n returns (uint64 b)\n {\n b = uint64(a);\n if (uint256(b) != a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256DowncastError(\n LibSafeMathRichErrors.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n a\n ));\n }\n return b;\n }\n\n /// @dev Safely downcasts to a uint32\n /// Note that this reverts if the input value is too large.\n function downcastToUint32(uint256 a)\n internal\n pure\n returns (uint32 b)\n {\n b = uint32(a);\n if (uint256(b) != a) {\n LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256DowncastError(\n LibSafeMathRichErrors.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n a\n ));\n }\n return b;\n }\n}\n",
"src/sys/MixinScheduler.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\nimport \"../immutable/MixinStorage.sol\";\nimport \"../interfaces/IStakingEvents.sol\";\n\n\ncontract MixinScheduler is\n IStakingEvents,\n MixinStorage\n{\n using LibSafeMath for uint256;\n\n /// @dev Returns the earliest end time in seconds of this epoch.\n /// The next epoch can begin once this time is reached.\n /// Epoch period = [startTimeInSeconds..endTimeInSeconds)\n /// @return Time in seconds.\n function getCurrentEpochEarliestEndTimeInSeconds()\n public\n view\n returns (uint256)\n {\n return currentEpochStartTimeInSeconds.safeAdd(epochDurationInSeconds);\n }\n\n /// @dev Initializes state owned by this mixin.\n /// Fails if state was already initialized.\n function _initMixinScheduler()\n internal\n {\n // assert the current values before overwriting them.\n _assertSchedulerNotInitialized();\n\n // solhint-disable-next-line\n currentEpochStartTimeInSeconds = block.timestamp;\n currentEpoch = 1;\n }\n\n /// @dev Moves to the next epoch, given the current epoch period has ended.\n /// Time intervals that are measured in epochs (like timeLocks) are also incremented, given\n /// their periods have ended.\n function _goToNextEpoch()\n internal\n {\n // get current timestamp\n // solhint-disable-next-line not-rely-on-time\n uint256 currentBlockTimestamp = block.timestamp;\n\n // validate that we can increment the current epoch\n uint256 epochEndTime = getCurrentEpochEarliestEndTimeInSeconds();\n if (epochEndTime > currentBlockTimestamp) {\n LibRichErrors.rrevert(LibStakingRichErrors.BlockTimestampTooLowError(\n epochEndTime,\n currentBlockTimestamp\n ));\n }\n\n // incremment epoch\n uint256 nextEpoch = currentEpoch.safeAdd(1);\n currentEpoch = nextEpoch;\n currentEpochStartTimeInSeconds = currentBlockTimestamp;\n }\n\n /// @dev Assert scheduler state before initializing it.\n /// This must be updated for each migration.\n function _assertSchedulerNotInitialized()\n internal\n view\n {\n if (currentEpochStartTimeInSeconds != 0) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.InitializationError(\n LibStakingRichErrors.InitializationErrorCodes.MixinSchedulerAlreadyInitialized\n )\n );\n }\n }\n}\n",
"src/fees/MixinExchangeFees.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\nimport \"../interfaces/IStructs.sol\";\nimport \"../sys/MixinFinalizer.sol\";\nimport \"../staking_pools/MixinStakingPool.sol\";\nimport \"./MixinExchangeManager.sol\";\n\n\ncontract MixinExchangeFees is\n MixinExchangeManager,\n MixinStakingPool,\n MixinFinalizer\n{\n using LibSafeMath for uint256;\n\n /// @dev Pays a protocol fee in ETH or WETH.\n /// Only a known 0x exchange can call this method. See\n /// (MixinExchangeManager).\n /// @param makerAddress The address of the order's maker.\n /// @param payerAddress The address of the protocol fee payer.\n /// @param protocolFee The protocol fee amount. This is either passed as ETH or transferred as WETH.\n function payProtocolFee(\n address makerAddress,\n address payerAddress,\n uint256 protocolFee\n )\n external\n payable\n onlyExchange\n {\n _assertValidProtocolFee(protocolFee);\n\n // Transfer the protocol fee to this address if it should be paid in\n // WETH.\n if (msg.value == 0) {\n require(\n getWethContract().transferFrom(\n payerAddress,\n address(this),\n protocolFee\n ),\n \"WETH_TRANSFER_FAILED\"\n );\n }\n\n // Get the pool id of the maker address.\n bytes32 poolId = poolIdByMaker[makerAddress];\n\n // Only attribute the protocol fee payment to a pool if the maker is\n // registered to a pool.\n if (poolId == NIL_POOL_ID) {\n return;\n }\n\n uint256 poolStake = getTotalStakeDelegatedToPool(poolId).currentEpochBalance;\n // Ignore pools with dust stake.\n if (poolStake < minimumPoolStake) {\n return;\n }\n\n // Look up the pool stats and aggregated stats for this epoch.\n\n uint256 currentEpoch_ = currentEpoch;\n IStructs.PoolStats storage poolStatsPtr = poolStatsByEpoch[poolId][currentEpoch_];\n IStructs.AggregatedStats storage aggregatedStatsPtr = aggregatedStatsByEpoch[currentEpoch_];\n\n // Perform some initialization if this is the pool's first protocol fee in this epoch.\n uint256 feesCollectedByPool = poolStatsPtr.feesCollected;\n if (feesCollectedByPool == 0) {\n // Compute member and total weighted stake.\n (uint256 membersStakeInPool, uint256 weightedStakeInPool) = _computeMembersAndWeightedStake(poolId, poolStake);\n poolStatsPtr.membersStake = membersStakeInPool;\n poolStatsPtr.weightedStake = weightedStakeInPool;\n\n // Increase the total weighted stake.\n aggregatedStatsPtr.totalWeightedStake = aggregatedStatsPtr.totalWeightedStake.safeAdd(weightedStakeInPool);\n\n // Increase the number of pools to finalize.\n aggregatedStatsPtr.numPoolsToFinalize = aggregatedStatsPtr.numPoolsToFinalize.safeAdd(1);\n\n // Emit an event so keepers know what pools earned rewards this epoch.\n emit StakingPoolEarnedRewardsInEpoch(currentEpoch_, poolId);\n }\n\n // Credit the fees to the pool.\n poolStatsPtr.feesCollected = feesCollectedByPool.safeAdd(protocolFee);\n\n // Increase the total fees collected this epoch.\n aggregatedStatsPtr.totalFeesCollected = aggregatedStatsPtr.totalFeesCollected.safeAdd(protocolFee);\n }\n\n /// @dev Get stats on a staking pool in this epoch.\n /// @param poolId Pool Id to query.\n /// @return PoolStats struct for pool id.\n function getStakingPoolStatsThisEpoch(bytes32 poolId)\n external\n view\n returns (IStructs.PoolStats memory)\n {\n return poolStatsByEpoch[poolId][currentEpoch];\n }\n\n /// @dev Computes the members and weighted stake for a pool at the current\n /// epoch.\n /// @param poolId ID of the pool.\n /// @param totalStake Total (unweighted) stake in the pool.\n /// @return membersStake Non-operator stake in the pool.\n /// @return weightedStake Weighted stake of the pool.\n function _computeMembersAndWeightedStake(\n bytes32 poolId,\n uint256 totalStake\n )\n private\n view\n returns (uint256 membersStake, uint256 weightedStake)\n {\n uint256 operatorStake = getStakeDelegatedToPoolByOwner(\n _poolById[poolId].operator,\n poolId\n ).currentEpochBalance;\n\n membersStake = totalStake.safeSub(operatorStake);\n weightedStake = operatorStake.safeAdd(\n LibMath.getPartialAmountFloor(\n rewardDelegatedStakeWeight,\n PPM_DENOMINATOR,\n membersStake\n )\n );\n return (membersStake, weightedStake);\n }\n\n /// @dev Checks that the protocol fee passed into `payProtocolFee()` is\n /// valid.\n /// @param protocolFee The `protocolFee` parameter to\n /// `payProtocolFee.`\n function _assertValidProtocolFee(uint256 protocolFee)\n private\n view\n {\n // The protocol fee must equal the value passed to the contract; unless\n // the value is zero, in which case the fee is taken in WETH.\n if (msg.value != protocolFee && msg.value != 0) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.InvalidProtocolFeePaymentError(\n protocolFee,\n msg.value\n )\n );\n }\n }\n}\n",
"src/sys/MixinFinalizer.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../libs/LibCobbDouglas.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\nimport \"../interfaces/IStructs.sol\";\nimport \"../staking_pools/MixinStakingPoolRewards.sol\";\n\n\ncontract MixinFinalizer is\n MixinStakingPoolRewards\n{\n using LibSafeMath for uint256;\n\n /// @dev Begins a new epoch, preparing the prior one for finalization.\n /// Throws if not enough time has passed between epochs or if the\n /// previous epoch was not fully finalized.\n /// @return numPoolsToFinalize The number of unfinalized pools.\n function endEpoch()\n external\n returns (uint256)\n {\n uint256 currentEpoch_ = currentEpoch;\n uint256 prevEpoch = currentEpoch_.safeSub(1);\n\n // Make sure the previous epoch has been fully finalized.\n uint256 numPoolsToFinalizeFromPrevEpoch = aggregatedStatsByEpoch[prevEpoch].numPoolsToFinalize;\n if (numPoolsToFinalizeFromPrevEpoch != 0) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.PreviousEpochNotFinalizedError(\n prevEpoch,\n numPoolsToFinalizeFromPrevEpoch\n )\n );\n }\n\n // Convert all ETH to WETH; the WETH balance of this contract is the total rewards.\n _wrapEth();\n\n // Load aggregated stats for the epoch we're ending.\n aggregatedStatsByEpoch[currentEpoch_].rewardsAvailable = _getAvailableWethBalance();\n IStructs.AggregatedStats memory aggregatedStats = aggregatedStatsByEpoch[currentEpoch_];\n\n // Emit an event.\n emit EpochEnded(\n currentEpoch_,\n aggregatedStats.numPoolsToFinalize,\n aggregatedStats.rewardsAvailable,\n aggregatedStats.totalFeesCollected,\n aggregatedStats.totalWeightedStake\n );\n\n // Advance the epoch. This will revert if not enough time has passed.\n _goToNextEpoch();\n\n // If there are no pools to finalize then the epoch is finalized.\n if (aggregatedStats.numPoolsToFinalize == 0) {\n emit EpochFinalized(currentEpoch_, 0, aggregatedStats.rewardsAvailable);\n }\n\n return aggregatedStats.numPoolsToFinalize;\n }\n\n /// @dev Instantly finalizes a single pool that earned rewards in the previous\n /// epoch, crediting it rewards for members and withdrawing operator's\n /// rewards as WETH. This can be called by internal functions that need\n /// to finalize a pool immediately. Does nothing if the pool is already\n /// finalized or did not earn rewards in the previous epoch.\n /// @param poolId The pool ID to finalize.\n function finalizePool(bytes32 poolId)\n external\n {\n // Compute relevant epochs\n uint256 currentEpoch_ = currentEpoch;\n uint256 prevEpoch = currentEpoch_.safeSub(1);\n\n // Load the aggregated stats into memory; noop if no pools to finalize.\n IStructs.AggregatedStats memory aggregatedStats = aggregatedStatsByEpoch[prevEpoch];\n if (aggregatedStats.numPoolsToFinalize == 0) {\n return;\n }\n\n // Noop if the pool did not earn rewards or already finalized (has no fees).\n IStructs.PoolStats memory poolStats = poolStatsByEpoch[poolId][prevEpoch];\n if (poolStats.feesCollected == 0) {\n return;\n }\n\n // Clear the pool stats so we don't finalize it again, and to recoup\n // some gas.\n delete poolStatsByEpoch[poolId][prevEpoch];\n\n // Compute the rewards.\n uint256 rewards = _getUnfinalizedPoolRewardsFromPoolStats(poolStats, aggregatedStats);\n\n // Pay the operator and update rewards for the pool.\n // Note that we credit at the CURRENT epoch even though these rewards\n // were earned in the previous epoch.\n (uint256 operatorReward, uint256 membersReward) = _syncPoolRewards(\n poolId,\n rewards,\n poolStats.membersStake\n );\n\n // Emit an event.\n emit RewardsPaid(\n currentEpoch_,\n poolId,\n operatorReward,\n membersReward\n );\n\n uint256 totalReward = operatorReward.safeAdd(membersReward);\n\n // Increase `totalRewardsFinalized`.\n aggregatedStatsByEpoch[prevEpoch].totalRewardsFinalized =\n aggregatedStats.totalRewardsFinalized =\n aggregatedStats.totalRewardsFinalized.safeAdd(totalReward);\n\n // Decrease the number of unfinalized pools left.\n aggregatedStatsByEpoch[prevEpoch].numPoolsToFinalize =\n aggregatedStats.numPoolsToFinalize =\n aggregatedStats.numPoolsToFinalize.safeSub(1);\n\n // If there are no more unfinalized pools remaining, the epoch is\n // finalized.\n if (aggregatedStats.numPoolsToFinalize == 0) {\n emit EpochFinalized(\n prevEpoch,\n aggregatedStats.totalRewardsFinalized,\n aggregatedStats.rewardsAvailable.safeSub(aggregatedStats.totalRewardsFinalized)\n );\n }\n }\n\n /// @dev Computes the reward owed to a pool during finalization.\n /// Does nothing if the pool is already finalized.\n /// @param poolId The pool's ID.\n /// @return totalReward The total reward owed to a pool.\n /// @return membersStake The total stake for all non-operator members in\n /// this pool.\n function _getUnfinalizedPoolRewards(bytes32 poolId)\n internal\n view\n returns (\n uint256 reward,\n uint256 membersStake\n )\n {\n uint256 prevEpoch = currentEpoch.safeSub(1);\n IStructs.PoolStats memory poolStats = poolStatsByEpoch[poolId][prevEpoch];\n reward = _getUnfinalizedPoolRewardsFromPoolStats(poolStats, aggregatedStatsByEpoch[prevEpoch]);\n membersStake = poolStats.membersStake;\n }\n\n /// @dev Converts the entire ETH balance of this contract into WETH.\n function _wrapEth()\n internal\n {\n uint256 ethBalance = address(this).balance;\n if (ethBalance != 0) {\n getWethContract().deposit.value(ethBalance)();\n }\n }\n\n /// @dev Returns the WETH balance of this contract, minus\n /// any WETH that has already been reserved for rewards.\n function _getAvailableWethBalance()\n internal\n view\n returns (uint256 wethBalance)\n {\n wethBalance = getWethContract().balanceOf(address(this))\n .safeSub(wethReservedForPoolRewards);\n\n return wethBalance;\n }\n\n /// @dev Asserts that a pool has been finalized last epoch.\n /// @param poolId The id of the pool that should have been finalized.\n function _assertPoolFinalizedLastEpoch(bytes32 poolId)\n internal\n view\n {\n uint256 prevEpoch = currentEpoch.safeSub(1);\n IStructs.PoolStats memory poolStats = poolStatsByEpoch[poolId][prevEpoch];\n\n // A pool that has any fees remaining has not been finalized\n if (poolStats.feesCollected != 0) {\n LibRichErrors.rrevert(\n LibStakingRichErrors.PoolNotFinalizedError(\n poolId,\n prevEpoch\n )\n );\n }\n }\n\n /// @dev Computes the reward owed to a pool during finalization.\n /// @param poolStats Stats for a specific pool.\n /// @param aggregatedStats Stats aggregated across all pools.\n /// @return rewards Unfinalized rewards for the input pool.\n function _getUnfinalizedPoolRewardsFromPoolStats(\n IStructs.PoolStats memory poolStats,\n IStructs.AggregatedStats memory aggregatedStats\n )\n private\n view\n returns (uint256 rewards)\n {\n // There can't be any rewards if the pool did not collect any fees.\n if (poolStats.feesCollected == 0) {\n return rewards;\n }\n\n // Use the cobb-douglas function to compute the total reward.\n rewards = LibCobbDouglas.cobbDouglas(\n aggregatedStats.rewardsAvailable,\n poolStats.feesCollected,\n aggregatedStats.totalFeesCollected,\n poolStats.weightedStake,\n aggregatedStats.totalWeightedStake,\n cobbDouglasAlphaNumerator,\n cobbDouglasAlphaDenominator\n );\n\n // Clip the reward to always be under\n // `rewardsAvailable - totalRewardsPaid`,\n // in case cobb-douglas overflows, which should be unlikely.\n uint256 rewardsRemaining = aggregatedStats.rewardsAvailable.safeSub(aggregatedStats.totalRewardsFinalized);\n if (rewardsRemaining < rewards) {\n rewards = rewardsRemaining;\n }\n }\n}\n",
"src/libs/LibCobbDouglas.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"./LibFixedMath.sol\";\n\n\nlibrary LibCobbDouglas {\n\n /// @dev The cobb-douglas function used to compute fee-based rewards for\n /// staking pools in a given epoch. This function does not perform\n /// bounds checking on the inputs, but the following conditions\n /// need to be true:\n /// 0 <= fees / totalFees <= 1\n /// 0 <= stake / totalStake <= 1\n /// 0 <= alphaNumerator / alphaDenominator <= 1\n /// @param totalRewards collected over an epoch.\n /// @param fees Fees attributed to the the staking pool.\n /// @param totalFees Total fees collected across all pools that earned rewards.\n /// @param stake Stake attributed to the staking pool.\n /// @param totalStake Total stake across all pools that earned rewards.\n /// @param alphaNumerator Numerator of `alpha` in the cobb-douglas function.\n /// @param alphaDenominator Denominator of `alpha` in the cobb-douglas\n /// function.\n /// @return rewards Rewards owed to the staking pool.\n function cobbDouglas(\n uint256 totalRewards,\n uint256 fees,\n uint256 totalFees,\n uint256 stake,\n uint256 totalStake,\n uint32 alphaNumerator,\n uint32 alphaDenominator\n )\n internal\n pure\n returns (uint256 rewards)\n {\n int256 feeRatio = LibFixedMath.toFixed(fees, totalFees);\n int256 stakeRatio = LibFixedMath.toFixed(stake, totalStake);\n if (feeRatio == 0 || stakeRatio == 0) {\n return rewards = 0;\n }\n // The cobb-doublas function has the form:\n // `totalRewards * feeRatio ^ alpha * stakeRatio ^ (1-alpha)`\n // This is equivalent to:\n // `totalRewards * stakeRatio * e^(alpha * (ln(feeRatio / stakeRatio)))`\n // However, because `ln(x)` has the domain of `0 < x < 1`\n // and `exp(x)` has the domain of `x < 0`,\n // and fixed-point math easily overflows with multiplication,\n // we will choose the following if `stakeRatio > feeRatio`:\n // `totalRewards * stakeRatio / e^(alpha * (ln(stakeRatio / feeRatio)))`\n\n // Compute\n // `e^(alpha * ln(feeRatio/stakeRatio))` if feeRatio <= stakeRatio\n // or\n // `e^(alpa * ln(stakeRatio/feeRatio))` if feeRatio > stakeRatio\n int256 n = feeRatio <= stakeRatio ?\n LibFixedMath.div(feeRatio, stakeRatio) :\n LibFixedMath.div(stakeRatio, feeRatio);\n n = LibFixedMath.exp(\n LibFixedMath.mulDiv(\n LibFixedMath.ln(n),\n int256(alphaNumerator),\n int256(alphaDenominator)\n )\n );\n // Compute\n // `totalRewards * n` if feeRatio <= stakeRatio\n // or\n // `totalRewards / n` if stakeRatio > feeRatio\n // depending on the choice we made earlier.\n n = feeRatio <= stakeRatio ?\n LibFixedMath.mul(stakeRatio, n) :\n LibFixedMath.div(stakeRatio, n);\n // Multiply the above with totalRewards.\n rewards = LibFixedMath.uintMul(n, totalRewards);\n }\n}\n",
"src/libs/LibFixedMath.sol": "/*\n\n Copyright 2017 Bprotocol Foundation, 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"./LibFixedMathRichErrors.sol\";\n\n\n// solhint-disable indent\n/// @dev Signed, fixed-point, 127-bit precision math library.\nlibrary LibFixedMath {\n\n // 1\n int256 private constant FIXED_1 = int256(0x0000000000000000000000000000000080000000000000000000000000000000);\n // 2**255\n int256 private constant MIN_FIXED_VAL = int256(0x8000000000000000000000000000000000000000000000000000000000000000);\n // 1^2 (in fixed-point)\n int256 private constant FIXED_1_SQUARED = int256(0x4000000000000000000000000000000000000000000000000000000000000000);\n // 1\n int256 private constant LN_MAX_VAL = FIXED_1;\n // e ^ -63.875\n int256 private constant LN_MIN_VAL = int256(0x0000000000000000000000000000000000000000000000000000000733048c5a);\n // 0\n int256 private constant EXP_MAX_VAL = 0;\n // -63.875\n int256 private constant EXP_MIN_VAL = -int256(0x0000000000000000000000000000001ff0000000000000000000000000000000);\n\n /// @dev Get one as a fixed-point number.\n function one() internal pure returns (int256 f) {\n f = FIXED_1;\n }\n\n /// @dev Returns the addition of two fixed point numbers, reverting on overflow.\n function add(int256 a, int256 b) internal pure returns (int256 c) {\n c = _add(a, b);\n }\n\n /// @dev Returns the addition of two fixed point numbers, reverting on overflow.\n function sub(int256 a, int256 b) internal pure returns (int256 c) {\n if (b == MIN_FIXED_VAL) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.SignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_SMALL,\n b\n ));\n }\n c = _add(a, -b);\n }\n\n /// @dev Returns the multiplication of two fixed point numbers, reverting on overflow.\n function mul(int256 a, int256 b) internal pure returns (int256 c) {\n c = _mul(a, b) / FIXED_1;\n }\n\n /// @dev Returns the division of two fixed point numbers.\n function div(int256 a, int256 b) internal pure returns (int256 c) {\n c = _div(_mul(a, FIXED_1), b);\n }\n\n /// @dev Performs (a * n) / d, without scaling for precision.\n function mulDiv(int256 a, int256 n, int256 d) internal pure returns (int256 c) {\n c = _div(_mul(a, n), d);\n }\n\n /// @dev Returns the unsigned integer result of multiplying a fixed-point\n /// number with an integer, reverting if the multiplication overflows.\n /// Negative results are clamped to zero.\n function uintMul(int256 f, uint256 u) internal pure returns (uint256) {\n if (int256(u) < int256(0)) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.UnsignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,\n u\n ));\n }\n int256 c = _mul(f, int256(u));\n if (c <= 0) {\n return 0;\n }\n return uint256(uint256(c) >> 127);\n }\n\n /// @dev Returns the absolute value of a fixed point number.\n function abs(int256 f) internal pure returns (int256 c) {\n if (f == MIN_FIXED_VAL) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.SignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_SMALL,\n f\n ));\n }\n if (f >= 0) {\n c = f;\n } else {\n c = -f;\n }\n }\n\n /// @dev Returns 1 / `x`, where `x` is a fixed-point number.\n function invert(int256 f) internal pure returns (int256 c) {\n c = _div(FIXED_1_SQUARED, f);\n }\n\n /// @dev Convert signed `n` / 1 to a fixed-point number.\n function toFixed(int256 n) internal pure returns (int256 f) {\n f = _mul(n, FIXED_1);\n }\n\n /// @dev Convert signed `n` / `d` to a fixed-point number.\n function toFixed(int256 n, int256 d) internal pure returns (int256 f) {\n f = _div(_mul(n, FIXED_1), d);\n }\n\n /// @dev Convert unsigned `n` / 1 to a fixed-point number.\n /// Reverts if `n` is too large to fit in a fixed-point number.\n function toFixed(uint256 n) internal pure returns (int256 f) {\n if (int256(n) < int256(0)) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.UnsignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,\n n\n ));\n }\n f = _mul(int256(n), FIXED_1);\n }\n\n /// @dev Convert unsigned `n` / `d` to a fixed-point number.\n /// Reverts if `n` / `d` is too large to fit in a fixed-point number.\n function toFixed(uint256 n, uint256 d) internal pure returns (int256 f) {\n if (int256(n) < int256(0)) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.UnsignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,\n n\n ));\n }\n if (int256(d) < int256(0)) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.UnsignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,\n d\n ));\n }\n f = _div(_mul(int256(n), FIXED_1), int256(d));\n }\n\n /// @dev Convert a fixed-point number to an integer.\n function toInteger(int256 f) internal pure returns (int256 n) {\n return f / FIXED_1;\n }\n\n /// @dev Get the natural logarithm of a fixed-point number 0 < `x` <= LN_MAX_VAL\n function ln(int256 x) internal pure returns (int256 r) {\n if (x > LN_MAX_VAL) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.SignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,\n x\n ));\n }\n if (x <= 0) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.SignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_SMALL,\n x\n ));\n }\n if (x == FIXED_1) {\n return 0;\n }\n if (x <= LN_MIN_VAL) {\n return EXP_MIN_VAL;\n }\n\n int256 y;\n int256 z;\n int256 w;\n\n // Rewrite the input as a quotient of negative natural exponents and a single residual q, such that 1 < q < 2\n // For example: log(0.3) = log(e^-1 * e^-0.25 * 1.0471028872385522)\n // = 1 - 0.25 - log(1 + 0.0471028872385522)\n // e ^ -32\n if (x <= int256(0x00000000000000000000000000000000000000000001c8464f76164760000000)) {\n r -= int256(0x0000000000000000000000000000001000000000000000000000000000000000); // - 32\n x = x * FIXED_1 / int256(0x00000000000000000000000000000000000000000001c8464f76164760000000); // / e ^ -32\n }\n // e ^ -16\n if (x <= int256(0x00000000000000000000000000000000000000f1aaddd7742e90000000000000)) {\n r -= int256(0x0000000000000000000000000000000800000000000000000000000000000000); // - 16\n x = x * FIXED_1 / int256(0x00000000000000000000000000000000000000f1aaddd7742e90000000000000); // / e ^ -16\n }\n // e ^ -8\n if (x <= int256(0x00000000000000000000000000000000000afe10820813d78000000000000000)) {\n r -= int256(0x0000000000000000000000000000000400000000000000000000000000000000); // - 8\n x = x * FIXED_1 / int256(0x00000000000000000000000000000000000afe10820813d78000000000000000); // / e ^ -8\n }\n // e ^ -4\n if (x <= int256(0x0000000000000000000000000000000002582ab704279ec00000000000000000)) {\n r -= int256(0x0000000000000000000000000000000200000000000000000000000000000000); // - 4\n x = x * FIXED_1 / int256(0x0000000000000000000000000000000002582ab704279ec00000000000000000); // / e ^ -4\n }\n // e ^ -2\n if (x <= int256(0x000000000000000000000000000000001152aaa3bf81cc000000000000000000)) {\n r -= int256(0x0000000000000000000000000000000100000000000000000000000000000000); // - 2\n x = x * FIXED_1 / int256(0x000000000000000000000000000000001152aaa3bf81cc000000000000000000); // / e ^ -2\n }\n // e ^ -1\n if (x <= int256(0x000000000000000000000000000000002f16ac6c59de70000000000000000000)) {\n r -= int256(0x0000000000000000000000000000000080000000000000000000000000000000); // - 1\n x = x * FIXED_1 / int256(0x000000000000000000000000000000002f16ac6c59de70000000000000000000); // / e ^ -1\n }\n // e ^ -0.5\n if (x <= int256(0x000000000000000000000000000000004da2cbf1be5828000000000000000000)) {\n r -= int256(0x0000000000000000000000000000000040000000000000000000000000000000); // - 0.5\n x = x * FIXED_1 / int256(0x000000000000000000000000000000004da2cbf1be5828000000000000000000); // / e ^ -0.5\n }\n // e ^ -0.25\n if (x <= int256(0x0000000000000000000000000000000063afbe7ab2082c000000000000000000)) {\n r -= int256(0x0000000000000000000000000000000020000000000000000000000000000000); // - 0.25\n x = x * FIXED_1 / int256(0x0000000000000000000000000000000063afbe7ab2082c000000000000000000); // / e ^ -0.25\n }\n // e ^ -0.125\n if (x <= int256(0x0000000000000000000000000000000070f5a893b608861e1f58934f97aea57d)) {\n r -= int256(0x0000000000000000000000000000000010000000000000000000000000000000); // - 0.125\n x = x * FIXED_1 / int256(0x0000000000000000000000000000000070f5a893b608861e1f58934f97aea57d); // / e ^ -0.125\n }\n // `x` is now our residual in the range of 1 <= x <= 2 (or close enough).\n\n // Add the taylor series for log(1 + z), where z = x - 1\n z = y = x - FIXED_1;\n w = y * y / FIXED_1;\n r += z * (0x100000000000000000000000000000000 - y) / 0x100000000000000000000000000000000; z = z * w / FIXED_1; // add y^01 / 01 - y^02 / 02\n r += z * (0x0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - y) / 0x200000000000000000000000000000000; z = z * w / FIXED_1; // add y^03 / 03 - y^04 / 04\n r += z * (0x099999999999999999999999999999999 - y) / 0x300000000000000000000000000000000; z = z * w / FIXED_1; // add y^05 / 05 - y^06 / 06\n r += z * (0x092492492492492492492492492492492 - y) / 0x400000000000000000000000000000000; z = z * w / FIXED_1; // add y^07 / 07 - y^08 / 08\n r += z * (0x08e38e38e38e38e38e38e38e38e38e38e - y) / 0x500000000000000000000000000000000; z = z * w / FIXED_1; // add y^09 / 09 - y^10 / 10\n r += z * (0x08ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b - y) / 0x600000000000000000000000000000000; z = z * w / FIXED_1; // add y^11 / 11 - y^12 / 12\n r += z * (0x089d89d89d89d89d89d89d89d89d89d89 - y) / 0x700000000000000000000000000000000; z = z * w / FIXED_1; // add y^13 / 13 - y^14 / 14\n r += z * (0x088888888888888888888888888888888 - y) / 0x800000000000000000000000000000000; // add y^15 / 15 - y^16 / 16\n }\n\n /// @dev Compute the natural exponent for a fixed-point number EXP_MIN_VAL <= `x` <= 1\n function exp(int256 x) internal pure returns (int256 r) {\n if (x < EXP_MIN_VAL) {\n // Saturate to zero below EXP_MIN_VAL.\n return 0;\n }\n if (x == 0) {\n return FIXED_1;\n }\n if (x > EXP_MAX_VAL) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.SignedValueError(\n LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,\n x\n ));\n }\n\n // Rewrite the input as a product of natural exponents and a\n // single residual q, where q is a number of small magnitude.\n // For example: e^-34.419 = e^(-32 - 2 - 0.25 - 0.125 - 0.044)\n // = e^-32 * e^-2 * e^-0.25 * e^-0.125 * e^-0.044\n // -> q = -0.044\n\n // Multiply with the taylor series for e^q\n int256 y;\n int256 z;\n // q = x % 0.125 (the residual)\n z = y = x % 0x0000000000000000000000000000000010000000000000000000000000000000;\n z = z * y / FIXED_1; r += z * 0x10e1b3be415a0000; // add y^02 * (20! / 02!)\n z = z * y / FIXED_1; r += z * 0x05a0913f6b1e0000; // add y^03 * (20! / 03!)\n z = z * y / FIXED_1; r += z * 0x0168244fdac78000; // add y^04 * (20! / 04!)\n z = z * y / FIXED_1; r += z * 0x004807432bc18000; // add y^05 * (20! / 05!)\n z = z * y / FIXED_1; r += z * 0x000c0135dca04000; // add y^06 * (20! / 06!)\n z = z * y / FIXED_1; r += z * 0x0001b707b1cdc000; // add y^07 * (20! / 07!)\n z = z * y / FIXED_1; r += z * 0x000036e0f639b800; // add y^08 * (20! / 08!)\n z = z * y / FIXED_1; r += z * 0x00000618fee9f800; // add y^09 * (20! / 09!)\n z = z * y / FIXED_1; r += z * 0x0000009c197dcc00; // add y^10 * (20! / 10!)\n z = z * y / FIXED_1; r += z * 0x0000000e30dce400; // add y^11 * (20! / 11!)\n z = z * y / FIXED_1; r += z * 0x000000012ebd1300; // add y^12 * (20! / 12!)\n z = z * y / FIXED_1; r += z * 0x0000000017499f00; // add y^13 * (20! / 13!)\n z = z * y / FIXED_1; r += z * 0x0000000001a9d480; // add y^14 * (20! / 14!)\n z = z * y / FIXED_1; r += z * 0x00000000001c6380; // add y^15 * (20! / 15!)\n z = z * y / FIXED_1; r += z * 0x000000000001c638; // add y^16 * (20! / 16!)\n z = z * y / FIXED_1; r += z * 0x0000000000001ab8; // add y^17 * (20! / 17!)\n z = z * y / FIXED_1; r += z * 0x000000000000017c; // add y^18 * (20! / 18!)\n z = z * y / FIXED_1; r += z * 0x0000000000000014; // add y^19 * (20! / 19!)\n z = z * y / FIXED_1; r += z * 0x0000000000000001; // add y^20 * (20! / 20!)\n r = r / 0x21c3677c82b40000 + y + FIXED_1; // divide by 20! and then add y^1 / 1! + y^0 / 0!\n\n // Multiply with the non-residual terms.\n x = -x;\n // e ^ -32\n if ((x & int256(0x0000000000000000000000000000001000000000000000000000000000000000)) != 0) {\n r = r * int256(0x00000000000000000000000000000000000000f1aaddd7742e56d32fb9f99744)\n / int256(0x0000000000000000000000000043cbaf42a000812488fc5c220ad7b97bf6e99e); // * e ^ -32\n }\n // e ^ -16\n if ((x & int256(0x0000000000000000000000000000000800000000000000000000000000000000)) != 0) {\n r = r * int256(0x00000000000000000000000000000000000afe10820813d65dfe6a33c07f738f)\n / int256(0x000000000000000000000000000005d27a9f51c31b7c2f8038212a0574779991); // * e ^ -16\n }\n // e ^ -8\n if ((x & int256(0x0000000000000000000000000000000400000000000000000000000000000000)) != 0) {\n r = r * int256(0x0000000000000000000000000000000002582ab704279e8efd15e0265855c47a)\n / int256(0x0000000000000000000000000000001b4c902e273a58678d6d3bfdb93db96d02); // * e ^ -8\n }\n // e ^ -4\n if ((x & int256(0x0000000000000000000000000000000200000000000000000000000000000000)) != 0) {\n r = r * int256(0x000000000000000000000000000000001152aaa3bf81cb9fdb76eae12d029571)\n / int256(0x00000000000000000000000000000003b1cc971a9bb5b9867477440d6d157750); // * e ^ -4\n }\n // e ^ -2\n if ((x & int256(0x0000000000000000000000000000000100000000000000000000000000000000)) != 0) {\n r = r * int256(0x000000000000000000000000000000002f16ac6c59de6f8d5d6f63c1482a7c86)\n / int256(0x000000000000000000000000000000015bf0a8b1457695355fb8ac404e7a79e3); // * e ^ -2\n }\n // e ^ -1\n if ((x & int256(0x0000000000000000000000000000000080000000000000000000000000000000)) != 0) {\n r = r * int256(0x000000000000000000000000000000004da2cbf1be5827f9eb3ad1aa9866ebb3)\n / int256(0x00000000000000000000000000000000d3094c70f034de4b96ff7d5b6f99fcd8); // * e ^ -1\n }\n // e ^ -0.5\n if ((x & int256(0x0000000000000000000000000000000040000000000000000000000000000000)) != 0) {\n r = r * int256(0x0000000000000000000000000000000063afbe7ab2082ba1a0ae5e4eb1b479dc)\n / int256(0x00000000000000000000000000000000a45af1e1f40c333b3de1db4dd55f29a7); // * e ^ -0.5\n }\n // e ^ -0.25\n if ((x & int256(0x0000000000000000000000000000000020000000000000000000000000000000)) != 0) {\n r = r * int256(0x0000000000000000000000000000000070f5a893b608861e1f58934f97aea57d)\n / int256(0x00000000000000000000000000000000910b022db7ae67ce76b441c27035c6a1); // * e ^ -0.25\n }\n // e ^ -0.125\n if ((x & int256(0x0000000000000000000000000000000010000000000000000000000000000000)) != 0) {\n r = r * int256(0x00000000000000000000000000000000783eafef1c0a8f3978c7f81824d62ebf)\n / int256(0x0000000000000000000000000000000088415abbe9a76bead8d00cf112e4d4a8); // * e ^ -0.125\n }\n }\n\n /// @dev Returns the multiplication two numbers, reverting on overflow.\n function _mul(int256 a, int256 b) private pure returns (int256 c) {\n if (a == 0) {\n return 0;\n }\n c = a * b;\n if (c / a != b) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.BinOpError(\n LibFixedMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n }\n\n /// @dev Returns the division of two numbers, reverting on division by zero.\n function _div(int256 a, int256 b) private pure returns (int256 c) {\n if (b == 0) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.BinOpError(\n LibFixedMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n if (a == MIN_FIXED_VAL && b == -1) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.BinOpError(\n LibFixedMathRichErrors.BinOpErrorCodes.DIVISION_OVERFLOW,\n a,\n b\n ));\n }\n c = a / b;\n }\n\n /// @dev Adds two numbers, reverting on overflow.\n function _add(int256 a, int256 b) private pure returns (int256 c) {\n c = a + b;\n if ((a < 0 && b < 0 && c > a) || (a > 0 && b > 0 && c < a)) {\n LibRichErrors.rrevert(LibFixedMathRichErrors.BinOpError(\n LibFixedMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n }\n}\n",
"src/libs/LibFixedMathRichErrors.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\n\n\nlibrary LibFixedMathRichErrors {\n\n enum ValueErrorCodes {\n TOO_SMALL,\n TOO_LARGE\n }\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n DIVISION_BY_ZERO,\n DIVISION_OVERFLOW\n }\n\n // bytes4(keccak256(\"SignedValueError(uint8,int256)\"))\n bytes4 internal constant SIGNED_VALUE_ERROR_SELECTOR =\n 0xed2f26a1;\n\n // bytes4(keccak256(\"UnsignedValueError(uint8,uint256)\"))\n bytes4 internal constant UNSIGNED_VALUE_ERROR_SELECTOR =\n 0xbd79545f;\n\n // bytes4(keccak256(\"BinOpError(uint8,int256,int256)\"))\n bytes4 internal constant BIN_OP_ERROR_SELECTOR =\n 0x8c12dfe7;\n\n // solhint-disable func-name-mixedcase\n function SignedValueError(\n ValueErrorCodes error,\n int256 n\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SIGNED_VALUE_ERROR_SELECTOR,\n uint8(error),\n n\n );\n }\n\n function UnsignedValueError(\n ValueErrorCodes error,\n uint256 n\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UNSIGNED_VALUE_ERROR_SELECTOR,\n uint8(error),\n n\n );\n }\n\n function BinOpError(\n BinOpErrorCodes error,\n int256 a,\n int256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n BIN_OP_ERROR_SELECTOR,\n uint8(error),\n a,\n b\n );\n }\n}\n",
"src/fees/MixinExchangeManager.sol": "/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"../libs/LibStakingRichErrors.sol\";\nimport \"../interfaces/IStakingEvents.sol\";\nimport \"../immutable/MixinStorage.sol\";\n\n\ncontract MixinExchangeManager is\n IStakingEvents,\n MixinStorage\n{\n /// @dev Asserts that the call is coming from a valid exchange.\n modifier onlyExchange() {\n if (!validExchanges[msg.sender]) {\n LibRichErrors.rrevert(LibStakingRichErrors.OnlyCallableByExchangeError(\n msg.sender\n ));\n }\n _;\n }\n\n /// @dev Adds a new exchange address\n /// @param addr Address of exchange contract to add\n function addExchangeAddress(address addr)\n external\n onlyAuthorized\n {\n if (validExchanges[addr]) {\n LibRichErrors.rrevert(LibStakingRichErrors.ExchangeManagerError(\n LibStakingRichErrors.ExchangeManagerErrorCodes.ExchangeAlreadyRegistered,\n addr\n ));\n }\n validExchanges[addr] = true;\n emit ExchangeAdded(addr);\n }\n\n /// @dev Removes an existing exchange address\n /// @param addr Address of exchange contract to remove\n function removeExchangeAddress(address addr)\n external\n onlyAuthorized\n {\n if (!validExchanges[addr]) {\n LibRichErrors.rrevert(LibStakingRichErrors.ExchangeManagerError(\n LibStakingRichErrors.ExchangeManagerErrorCodes.ExchangeNotRegistered,\n addr\n ));\n }\n validExchanges[addr] = false;\n emit ExchangeRemoved(addr);\n }\n}\n"
},
"sourceTreeHashHex": "0x3d390043e53f2b764a8418ebf6b5f58e66ade1b98c688d207f0b245bfb12c36e",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.12+commit.7709ece9.js",
"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": "constantinople",
"remappings": [
"@0x/contracts-erc20=/Users/alextowle/0x-monorepo-1/contracts/staking/node_modules/@0x/contracts-erc20",
"@0x/contracts-utils=/Users/alextowle/0x-monorepo-1/contracts/staking/node_modules/@0x/contracts-utils",
"@0x/contracts-exchange-libs=/Users/alextowle/0x-monorepo-1/node_modules/@0x/contracts-exchange-libs",
"@0x/contracts-asset-proxy=/Users/alextowle/0x-monorepo-1/contracts/staking/node_modules/@0x/contracts-asset-proxy"
]
}
},
"networks": {}
}