More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,147 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Vote | 12907771 | 1263 days ago | IN | 0 ETH | 0.01005827 | ||||
Vote | 12906973 | 1263 days ago | IN | 0 ETH | 0.00548888 | ||||
Vote | 12903395 | 1263 days ago | IN | 0 ETH | 0.01111907 | ||||
Vote | 12903372 | 1263 days ago | IN | 0 ETH | 0.01393566 | ||||
Stake | 12898229 | 1264 days ago | IN | 0 ETH | 0.00504444 | ||||
Vote | 12878918 | 1267 days ago | IN | 0 ETH | 0.00587513 | ||||
Stake | 12878906 | 1267 days ago | IN | 0 ETH | 0.00506537 | ||||
Vote | 12871631 | 1268 days ago | IN | 0 ETH | 0.00696851 | ||||
Stake | 12871499 | 1268 days ago | IN | 0 ETH | 0.00695063 | ||||
Stake | 12865629 | 1269 days ago | IN | 0 ETH | 0.00475521 | ||||
Vote | 12865629 | 1269 days ago | IN | 0 ETH | 0.00512814 | ||||
Vote | 12778569 | 1283 days ago | IN | 0 ETH | 0.01282162 | ||||
Stake | 12778561 | 1283 days ago | IN | 0 ETH | 0.01198102 | ||||
Stake | 12717582 | 1292 days ago | IN | 0 ETH | 0.03643379 | ||||
Stake | 12697994 | 1296 days ago | IN | 0 ETH | 0.00679316 | ||||
Vote | 12697993 | 1296 days ago | IN | 0 ETH | 0.00732592 | ||||
Vote | 12697932 | 1296 days ago | IN | 0 ETH | 0.00439598 | ||||
Stake | 12697845 | 1296 days ago | IN | 0 ETH | 0.00535972 | ||||
Execute | 12652421 | 1303 days ago | IN | 0 ETH | 0.0255774 | ||||
Vote | 12628776 | 1306 days ago | IN | 0 ETH | 0.00366332 | ||||
Stake | 12628715 | 1306 days ago | IN | 0 ETH | 0.00450847 | ||||
Execute | 12564255 | 1316 days ago | IN | 0 ETH | 0.0036486 | ||||
Execute | 12564254 | 1316 days ago | IN | 0 ETH | 0.02563665 | ||||
Execute | 12564252 | 1316 days ago | IN | 0 ETH | 0.0196611 | ||||
Execute | 12554559 | 1318 days ago | IN | 0 ETH | 0.031023 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GenesisProtocol
Compiler Version
v0.5.11+commit.c082d0b4
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-04-13 */ // File: openzeppelin-solidity/contracts/cryptography/ECDSA.sol pragma solidity ^0.5.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * (.note) This call _does not revert_ if the signature is invalid, or * if the signer is otherwise unable to be retrieved. In those scenarios, * the zero address is returned. * * (.warning) `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise) * be too long), and then calling `toEthSignedMessageHash` on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign) * JSON-RPC method. * * See `recover`. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: @daostack/infra/contracts/votingMachines/IntVoteInterface.sol pragma solidity ^0.5.11; interface IntVoteInterface { //When implementing this interface please do not only override function and modifier, //but also to keep the modifiers on the overridden functions. modifier onlyProposalOwner(bytes32 _proposalId) {revert(); _;} modifier votable(bytes32 _proposalId) {revert(); _;} event NewProposal( bytes32 indexed _proposalId, address indexed _organization, uint256 _numOfChoices, address _proposer, bytes32 _paramsHash ); event ExecuteProposal(bytes32 indexed _proposalId, address indexed _organization, uint256 _decision, uint256 _totalReputation ); event VoteProposal( bytes32 indexed _proposalId, address indexed _organization, address indexed _voter, uint256 _vote, uint256 _reputation ); event CancelProposal(bytes32 indexed _proposalId, address indexed _organization ); event CancelVoting(bytes32 indexed _proposalId, address indexed _organization, address indexed _voter); /** * @dev register a new proposal with the given parameters. Every proposal has a unique ID which is being * generated by calculating keccak256 of a incremented counter. * @param _numOfChoices number of voting choices * @param _proposalParameters defines the parameters of the voting machine used for this proposal * @param _proposer address * @param _organization address - if this address is zero the msg.sender will be used as the organization address. * @return proposal's id. */ function propose( uint256 _numOfChoices, bytes32 _proposalParameters, address _proposer, address _organization ) external returns(bytes32); function vote( bytes32 _proposalId, uint256 _vote, uint256 _rep, address _voter ) external returns(bool); function cancelVote(bytes32 _proposalId) external; function getNumberOfChoices(bytes32 _proposalId) external view returns(uint256); function isVotable(bytes32 _proposalId) external view returns(bool); /** * @dev voteStatus returns the reputation voted for a proposal for a specific voting choice. * @param _proposalId the ID of the proposal * @param _choice the index in the * @return voted reputation for the given choice */ function voteStatus(bytes32 _proposalId, uint256 _choice) external view returns(uint256); /** * @dev isAbstainAllow returns if the voting machine allow abstain (0) * @return bool true or false */ function isAbstainAllow() external pure returns(bool); /** * @dev getAllowedRangeOfChoices returns the allowed range of choices for a voting machine. * @return min - minimum number of choices max - maximum number of choices */ function getAllowedRangeOfChoices() external pure returns(uint256 min, uint256 max); } // File: @daostack/infra/contracts/libs/RealMath.sol pragma solidity ^0.5.11; /** * RealMath: fixed-point math library, based on fractional and integer parts. * Using uint256 as real216x40, which isn't in Solidity yet. * Internally uses the wider uint256 for some math. * * Note that for addition, subtraction, and mod (%), you should just use the * built-in Solidity operators. Functions for these operations are not provided. * */ library RealMath { /** * How many total bits are there? */ uint256 constant private REAL_BITS = 256; /** * How many fractional bits are there? */ uint256 constant private REAL_FBITS = 40; /** * What's the first non-fractional bit */ uint256 constant private REAL_ONE = uint256(1) << REAL_FBITS; /** * Raise a real number to any positive integer power */ function pow(uint256 realBase, uint256 exponent) internal pure returns (uint256) { uint256 tempRealBase = realBase; uint256 tempExponent = exponent; // Start with the 0th power uint256 realResult = REAL_ONE; while (tempExponent != 0) { // While there are still bits set if ((tempExponent & 0x1) == 0x1) { // If the low bit is set, multiply in the (many-times-squared) base realResult = mul(realResult, tempRealBase); } // Shift off the low bit tempExponent = tempExponent >> 1; if (tempExponent != 0) { // Do the squaring tempRealBase = mul(tempRealBase, tempRealBase); } } // Return the final result. return realResult; } /** * Create a real from a rational fraction. */ function fraction(uint216 numerator, uint216 denominator) internal pure returns (uint256) { return div(uint256(numerator) * REAL_ONE, uint256(denominator) * REAL_ONE); } /** * Multiply one real by another. Truncates overflows. */ function mul(uint256 realA, uint256 realB) private pure returns (uint256) { // When multiplying fixed point in x.y and z.w formats we get (x+z).(y+w) format. // So we just have to clip off the extra REAL_FBITS fractional bits. uint256 res = realA * realB; require(res/realA == realB, "RealMath mul overflow"); return (res >> REAL_FBITS); } /** * Divide one real by another real. Truncates overflows. */ function div(uint256 realNumerator, uint256 realDenominator) private pure returns (uint256) { // We use the reverse of the multiplication trick: convert numerator from // x.y to (x+z).(y+w) fixed point, then divide by denom in z.w fixed point. return uint256((uint256(realNumerator) * REAL_ONE) / uint256(realDenominator)); } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through `transferFrom`. This is * zero by default. * * This value changes when `approve` or `transferFrom` are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * > Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an `Approval` event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to `approve`. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol pragma solidity ^0.5.11; interface VotingMachineCallbacksInterface { function mintReputation(uint256 _amount, address _beneficiary, bytes32 _proposalId) external returns(bool); function burnReputation(uint256 _amount, address _owner, bytes32 _proposalId) external returns(bool); function stakingTokenTransfer(IERC20 _stakingToken, address _beneficiary, uint256 _amount, bytes32 _proposalId) external returns(bool); function getTotalReputationSupply(bytes32 _proposalId) external view returns(uint256); function reputationOf(address _owner, bytes32 _proposalId) external view returns(uint256); function balanceOfStakingToken(IERC20 _stakingToken, bytes32 _proposalId) external view returns(uint256); } // File: @daostack/infra/contracts/votingMachines/ProposalExecuteInterface.sol pragma solidity ^0.5.11; interface ProposalExecuteInterface { function executeProposal(bytes32 _proposalId, int _decision) external returns(bool); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: openzeppelin-solidity/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.5.0; /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: @daostack/infra/contracts/votingMachines/GenesisProtocolLogic.sol pragma solidity ^0.5.11; /** * @title GenesisProtocol implementation -an organization's voting machine scheme. */ contract GenesisProtocolLogic is IntVoteInterface { using SafeMath for uint256; using Math for uint256; using RealMath for uint216; using RealMath for uint256; using Address for address; enum ProposalState { None, ExpiredInQueue, Executed, Queued, PreBoosted, Boosted, QuietEndingPeriod} enum ExecutionState { None, QueueBarCrossed, QueueTimeOut, PreBoostedBarCrossed, BoostedTimeOut, BoostedBarCrossed} //Organization's parameters struct Parameters { uint256 queuedVoteRequiredPercentage; // the absolute vote percentages bar. uint256 queuedVotePeriodLimit; //the time limit for a proposal to be in an absolute voting mode. uint256 boostedVotePeriodLimit; //the time limit for a proposal to be in boost mode. uint256 preBoostedVotePeriodLimit; //the time limit for a proposal //to be in an preparation state (stable) before boosted. uint256 thresholdConst; //constant for threshold calculation . //threshold =thresholdConst ** (numberOfBoostedProposals) uint256 limitExponentValue;// an upper limit for numberOfBoostedProposals //in the threshold calculation to prevent overflow uint256 quietEndingPeriod; //quite ending period uint256 proposingRepReward;//proposer reputation reward. uint256 votersReputationLossRatio;//Unsuccessful pre booster //voters lose votersReputationLossRatio% of their reputation. uint256 minimumDaoBounty; uint256 daoBountyConst;//The DAO downstake for each proposal is calculate according to the formula //(daoBountyConst * averageBoostDownstakes)/100 . uint256 activationTime;//the point in time after which proposals can be created. //if this address is set so only this address is allowed to vote of behalf of someone else. address voteOnBehalf; } struct Voter { uint256 vote; // YES(1) ,NO(2) uint256 reputation; // amount of voter's reputation bool preBoosted; } struct Staker { uint256 vote; // YES(1) ,NO(2) uint256 amount; // amount of staker's stake uint256 amount4Bounty;// amount of staker's stake used for bounty reward calculation. } struct Proposal { bytes32 organizationId; // the organization unique identifier the proposal is target to. address callbacks; // should fulfill voting callbacks interface. ProposalState state; uint256 winningVote; //the winning vote. address proposer; //the proposal boosted period limit . it is updated for the case of quiteWindow mode. uint256 currentBoostedVotePeriodLimit; bytes32 paramsHash; uint256 daoBountyRemain; //use for checking sum zero bounty claims.it is set at the proposing time. uint256 daoBounty; uint256 totalStakes;// Total number of tokens staked which can be redeemable by stakers. uint256 confidenceThreshold; uint256 secondsFromTimeOutTillExecuteBoosted; uint[3] times; //times[0] - submittedTime //times[1] - boostedPhaseTime //times[2] -preBoostedPhaseTime; bool daoRedeemItsWinnings; // vote reputation mapping(uint256 => uint256 ) votes; // vote reputation mapping(uint256 => uint256 ) preBoostedVotes; // address voter mapping(address => Voter ) voters; // vote stakes mapping(uint256 => uint256 ) stakes; // address staker mapping(address => Staker ) stakers; } event Stake(bytes32 indexed _proposalId, address indexed _organization, address indexed _staker, uint256 _vote, uint256 _amount ); event Redeem(bytes32 indexed _proposalId, address indexed _organization, address indexed _beneficiary, uint256 _amount ); event RedeemDaoBounty(bytes32 indexed _proposalId, address indexed _organization, address indexed _beneficiary, uint256 _amount ); event RedeemReputation(bytes32 indexed _proposalId, address indexed _organization, address indexed _beneficiary, uint256 _amount ); event StateChange(bytes32 indexed _proposalId, ProposalState _proposalState); event GPExecuteProposal(bytes32 indexed _proposalId, ExecutionState _executionState); event ExpirationCallBounty(bytes32 indexed _proposalId, address indexed _beneficiary, uint256 _amount); event ConfidenceLevelChange(bytes32 indexed _proposalId, uint256 _confidenceThreshold); mapping(bytes32=>Parameters) public parameters; // A mapping from hashes to parameters mapping(bytes32=>Proposal) public proposals; // Mapping from the ID of the proposal to the proposal itself. mapping(bytes32=>uint) public orgBoostedProposalsCnt; //organizationId => organization mapping(bytes32 => address ) public organizations; //organizationId => averageBoostDownstakes mapping(bytes32 => uint256 ) public averagesDownstakesOfBoosted; uint256 constant public NUM_OF_CHOICES = 2; uint256 constant public NO = 2; uint256 constant public YES = 1; uint256 public proposalsCnt; // Total number of proposals IERC20 public stakingToken; address constant private GEN_TOKEN_ADDRESS = 0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf; uint256 constant private MAX_BOOSTED_PROPOSALS = 4096; /** * @dev Constructor */ constructor(IERC20 _stakingToken) public { //The GEN token (staking token) address is hard coded in the contract by GEN_TOKEN_ADDRESS . //This will work for a network which already hosted the GEN token on this address (e.g mainnet). //If such contract address does not exist in the network (e.g ganache) //the contract will use the _stakingToken param as the //staking token address. if (address(GEN_TOKEN_ADDRESS).isContract()) { stakingToken = IERC20(GEN_TOKEN_ADDRESS); } else { stakingToken = _stakingToken; } } /** * @dev Check that the proposal is votable * a proposal is votable if it is in one of the following states: * PreBoosted,Boosted,QuietEndingPeriod or Queued */ modifier votable(bytes32 _proposalId) { require(_isVotable(_proposalId)); _; } /** * @dev register a new proposal with the given parameters. Every proposal has a unique ID which is being * generated by calculating keccak256 of a incremented counter. * @param _paramsHash parameters hash * @param _proposer address * @param _organization address */ function propose(uint256, bytes32 _paramsHash, address _proposer, address _organization) external returns(bytes32) { // solhint-disable-next-line not-rely-on-time require(now > parameters[_paramsHash].activationTime, "not active yet"); //Check parameters existence. require(parameters[_paramsHash].queuedVoteRequiredPercentage >= 50); // Generate a unique ID: bytes32 proposalId = keccak256(abi.encodePacked(this, proposalsCnt)); proposalsCnt = proposalsCnt.add(1); // Open proposal: Proposal memory proposal; proposal.callbacks = msg.sender; proposal.organizationId = keccak256(abi.encodePacked(msg.sender, _organization)); proposal.state = ProposalState.Queued; // solhint-disable-next-line not-rely-on-time proposal.times[0] = now;//submitted time proposal.currentBoostedVotePeriodLimit = parameters[_paramsHash].boostedVotePeriodLimit; proposal.proposer = _proposer; proposal.winningVote = NO; proposal.paramsHash = _paramsHash; if (organizations[proposal.organizationId] == address(0)) { if (_organization == address(0)) { organizations[proposal.organizationId] = msg.sender; } else { organizations[proposal.organizationId] = _organization; } } //calc dao bounty uint256 daoBounty = parameters[_paramsHash].daoBountyConst.mul(averagesDownstakesOfBoosted[proposal.organizationId]).div(100); proposal.daoBountyRemain = daoBounty.max(parameters[_paramsHash].minimumDaoBounty); proposals[proposalId] = proposal; proposals[proposalId].stakes[NO] = proposal.daoBountyRemain;//dao downstake on the proposal emit NewProposal(proposalId, organizations[proposal.organizationId], NUM_OF_CHOICES, _proposer, _paramsHash); return proposalId; } /** * @dev executeBoosted try to execute a boosted or QuietEndingPeriod proposal if it is expired * it rewards the msg.sender with P % of the proposal's upstakes upon a successful call to this function. * P = t/150, where t is the number of seconds passed since the the proposal's timeout. * P is capped by 10%. * @param _proposalId the id of the proposal * @return uint256 expirationCallBounty the bounty amount for the expiration call */ function executeBoosted(bytes32 _proposalId) external returns(uint256 expirationCallBounty) { Proposal storage proposal = proposals[_proposalId]; require(proposal.state == ProposalState.Boosted || proposal.state == ProposalState.QuietEndingPeriod, "proposal state in not Boosted nor QuietEndingPeriod"); require(_execute(_proposalId), "proposal need to expire"); proposal.secondsFromTimeOutTillExecuteBoosted = // solhint-disable-next-line not-rely-on-time now.sub(proposal.currentBoostedVotePeriodLimit.add(proposal.times[1])); expirationCallBounty = calcExecuteCallBounty(_proposalId); proposal.totalStakes = proposal.totalStakes.sub(expirationCallBounty); require(stakingToken.transfer(msg.sender, expirationCallBounty), "transfer to msg.sender failed"); emit ExpirationCallBounty(_proposalId, msg.sender, expirationCallBounty); } /** * @dev hash the parameters, save them if necessary, and return the hash value * @param _params a parameters array * _params[0] - _queuedVoteRequiredPercentage, * _params[1] - _queuedVotePeriodLimit, //the time limit for a proposal to be in an absolute voting mode. * _params[2] - _boostedVotePeriodLimit, //the time limit for a proposal to be in an relative voting mode. * _params[3] - _preBoostedVotePeriodLimit, //the time limit for a proposal to be in an preparation * state (stable) before boosted. * _params[4] -_thresholdConst * _params[5] -_quietEndingPeriod * _params[6] -_proposingRepReward * _params[7] -_votersReputationLossRatio * _params[8] -_minimumDaoBounty * _params[9] -_daoBountyConst * _params[10] -_activationTime * @param _voteOnBehalf - authorized to vote on behalf of others. */ function setParameters( uint[11] calldata _params, //use array here due to stack too deep issue. address _voteOnBehalf ) external returns(bytes32) { require(_params[0] <= 100 && _params[0] >= 50, "50 <= queuedVoteRequiredPercentage <= 100"); require(_params[4] <= 16000 && _params[4] > 1000, "1000 < thresholdConst <= 16000"); require(_params[7] <= 100, "votersReputationLossRatio <= 100"); require(_params[2] >= _params[5], "boostedVotePeriodLimit >= quietEndingPeriod"); require(_params[8] > 0, "minimumDaoBounty should be > 0"); require(_params[9] > 0, "daoBountyConst should be > 0"); bytes32 paramsHash = getParametersHash(_params, _voteOnBehalf); //set a limit for power for a given alpha to prevent overflow uint256 limitExponent = 172;//for alpha less or equal 2 uint256 j = 2; for (uint256 i = 2000; i < 16000; i = i*2) { if ((_params[4] > i) && (_params[4] <= i*2)) { limitExponent = limitExponent/j; break; } j++; } parameters[paramsHash] = Parameters({ queuedVoteRequiredPercentage: _params[0], queuedVotePeriodLimit: _params[1], boostedVotePeriodLimit: _params[2], preBoostedVotePeriodLimit: _params[3], thresholdConst:uint216(_params[4]).fraction(uint216(1000)), limitExponentValue:limitExponent, quietEndingPeriod: _params[5], proposingRepReward: _params[6], votersReputationLossRatio:_params[7], minimumDaoBounty:_params[8], daoBountyConst:_params[9], activationTime:_params[10], voteOnBehalf:_voteOnBehalf }); return paramsHash; } /** * @dev redeem a reward for a successful stake, vote or proposing. * The function use a beneficiary address as a parameter (and not msg.sender) to enable * users to redeem on behalf of someone else. * @param _proposalId the ID of the proposal * @param _beneficiary - the beneficiary address * @return rewards - * [0] stakerTokenReward * [1] voterReputationReward * [2] proposerReputationReward */ // solhint-disable-next-line function-max-lines,code-complexity function redeem(bytes32 _proposalId, address _beneficiary) public returns (uint[3] memory rewards) { Proposal storage proposal = proposals[_proposalId]; require((proposal.state == ProposalState.Executed)||(proposal.state == ProposalState.ExpiredInQueue), "Proposal should be Executed or ExpiredInQueue"); Parameters memory params = parameters[proposal.paramsHash]; //as staker Staker storage staker = proposal.stakers[_beneficiary]; uint256 totalWinningStakes = proposal.stakes[proposal.winningVote]; uint256 totalStakesLeftAfterCallBounty = proposal.stakes[NO].add(proposal.stakes[YES]).sub(calcExecuteCallBounty(_proposalId)); if (staker.amount > 0) { if (proposal.state == ProposalState.ExpiredInQueue) { //Stakes of a proposal that expires in Queue are sent back to stakers rewards[0] = staker.amount; } else if (staker.vote == proposal.winningVote) { if (staker.vote == YES) { if (proposal.daoBounty < totalStakesLeftAfterCallBounty) { uint256 _totalStakes = totalStakesLeftAfterCallBounty.sub(proposal.daoBounty); rewards[0] = (staker.amount.mul(_totalStakes))/totalWinningStakes; } } else { rewards[0] = (staker.amount.mul(totalStakesLeftAfterCallBounty))/totalWinningStakes; } } staker.amount = 0; } //dao redeem its winnings if (proposal.daoRedeemItsWinnings == false && _beneficiary == organizations[proposal.organizationId] && proposal.state != ProposalState.ExpiredInQueue && proposal.winningVote == NO) { rewards[0] = rewards[0] .add((proposal.daoBounty.mul(totalStakesLeftAfterCallBounty))/totalWinningStakes) .sub(proposal.daoBounty); proposal.daoRedeemItsWinnings = true; } //as voter Voter storage voter = proposal.voters[_beneficiary]; if ((voter.reputation != 0) && (voter.preBoosted)) { if (proposal.state == ProposalState.ExpiredInQueue) { //give back reputation for the voter rewards[1] = ((voter.reputation.mul(params.votersReputationLossRatio))/100); } else if (proposal.winningVote == voter.vote) { uint256 lostReputation; if (proposal.winningVote == YES) { lostReputation = proposal.preBoostedVotes[NO]; } else { lostReputation = proposal.preBoostedVotes[YES]; } lostReputation = (lostReputation.mul(params.votersReputationLossRatio))/100; rewards[1] = ((voter.reputation.mul(params.votersReputationLossRatio))/100) .add((voter.reputation.mul(lostReputation))/proposal.preBoostedVotes[proposal.winningVote]); } voter.reputation = 0; } //as proposer if ((proposal.proposer == _beneficiary)&&(proposal.winningVote == YES)&&(proposal.proposer != address(0))) { rewards[2] = params.proposingRepReward; proposal.proposer = address(0); } if (rewards[0] != 0) { proposal.totalStakes = proposal.totalStakes.sub(rewards[0]); require(stakingToken.transfer(_beneficiary, rewards[0]), "transfer to beneficiary failed"); emit Redeem(_proposalId, organizations[proposal.organizationId], _beneficiary, rewards[0]); } if (rewards[1].add(rewards[2]) != 0) { VotingMachineCallbacksInterface(proposal.callbacks) .mintReputation(rewards[1].add(rewards[2]), _beneficiary, _proposalId); emit RedeemReputation( _proposalId, organizations[proposal.organizationId], _beneficiary, rewards[1].add(rewards[2]) ); } } /** * @dev redeemDaoBounty a reward for a successful stake. * The function use a beneficiary address as a parameter (and not msg.sender) to enable * users to redeem on behalf of someone else. * @param _proposalId the ID of the proposal * @param _beneficiary - the beneficiary address * @return redeemedAmount - redeem token amount * @return potentialAmount - potential redeem token amount(if there is enough tokens bounty at the organization ) */ function redeemDaoBounty(bytes32 _proposalId, address _beneficiary) public returns(uint256 redeemedAmount, uint256 potentialAmount) { Proposal storage proposal = proposals[_proposalId]; require(proposal.state == ProposalState.Executed); uint256 totalWinningStakes = proposal.stakes[proposal.winningVote]; Staker storage staker = proposal.stakers[_beneficiary]; if ( (staker.amount4Bounty > 0)&& (staker.vote == proposal.winningVote)&& (proposal.winningVote == YES)&& (totalWinningStakes != 0)) { //as staker potentialAmount = (staker.amount4Bounty * proposal.daoBounty)/totalWinningStakes; } if ((potentialAmount != 0)&& (VotingMachineCallbacksInterface(proposal.callbacks) .balanceOfStakingToken(stakingToken, _proposalId) >= potentialAmount)) { staker.amount4Bounty = 0; proposal.daoBountyRemain = proposal.daoBountyRemain.sub(potentialAmount); require( VotingMachineCallbacksInterface(proposal.callbacks) .stakingTokenTransfer(stakingToken, _beneficiary, potentialAmount, _proposalId)); redeemedAmount = potentialAmount; emit RedeemDaoBounty(_proposalId, organizations[proposal.organizationId], _beneficiary, redeemedAmount); } } /** * @dev calcExecuteCallBounty calculate the execute boosted call bounty * @param _proposalId the ID of the proposal * @return uint256 executeCallBounty */ function calcExecuteCallBounty(bytes32 _proposalId) public view returns(uint256) { uint maxRewardSeconds = 1500; uint rewardSeconds = uint256(maxRewardSeconds).min(proposals[_proposalId].secondsFromTimeOutTillExecuteBoosted); return rewardSeconds.mul(proposals[_proposalId].stakes[YES]).div(maxRewardSeconds*10); } /** * @dev shouldBoost check if a proposal should be shifted to boosted phase. * @param _proposalId the ID of the proposal * @return bool true or false. */ function shouldBoost(bytes32 _proposalId) public view returns(bool) { Proposal memory proposal = proposals[_proposalId]; return (_score(_proposalId) > threshold(proposal.paramsHash, proposal.organizationId)); } /** * @dev threshold return the organization's score threshold which required by * a proposal to shift to boosted state. * This threshold is dynamically set and it depend on the number of boosted proposal. * @param _organizationId the organization identifier * @param _paramsHash the organization parameters hash * @return uint256 organization's score threshold as real number. */ function threshold(bytes32 _paramsHash, bytes32 _organizationId) public view returns(uint256) { uint256 power = orgBoostedProposalsCnt[_organizationId]; Parameters storage params = parameters[_paramsHash]; if (power > params.limitExponentValue) { power = params.limitExponentValue; } return params.thresholdConst.pow(power); } /** * @dev hashParameters returns a hash of the given parameters */ function getParametersHash( uint[11] memory _params,//use array here due to stack too deep issue. address _voteOnBehalf ) public pure returns(bytes32) { //double call to keccak256 to avoid deep stack issue when call with too many params. return keccak256( abi.encodePacked( keccak256( abi.encodePacked( _params[0], _params[1], _params[2], _params[3], _params[4], _params[5], _params[6], _params[7], _params[8], _params[9], _params[10]) ), _voteOnBehalf )); } /** * @dev execute check if the proposal has been decided, and if so, execute the proposal * @param _proposalId the id of the proposal * @return bool true - the proposal has been executed * false - otherwise. */ // solhint-disable-next-line function-max-lines,code-complexity function _execute(bytes32 _proposalId) internal votable(_proposalId) returns(bool) { Proposal storage proposal = proposals[_proposalId]; Parameters memory params = parameters[proposal.paramsHash]; Proposal memory tmpProposal = proposal; uint256 totalReputation = VotingMachineCallbacksInterface(proposal.callbacks).getTotalReputationSupply(_proposalId); //first divide by 100 to prevent overflow uint256 executionBar = (totalReputation/100) * params.queuedVoteRequiredPercentage; ExecutionState executionState = ExecutionState.None; uint256 averageDownstakesOfBoosted; uint256 confidenceThreshold; if (proposal.votes[proposal.winningVote] > executionBar) { // someone crossed the absolute vote execution bar. if (proposal.state == ProposalState.Queued) { executionState = ExecutionState.QueueBarCrossed; } else if (proposal.state == ProposalState.PreBoosted) { executionState = ExecutionState.PreBoostedBarCrossed; } else { executionState = ExecutionState.BoostedBarCrossed; } proposal.state = ProposalState.Executed; } else { if (proposal.state == ProposalState.Queued) { // solhint-disable-next-line not-rely-on-time if ((now - proposal.times[0]) >= params.queuedVotePeriodLimit) { proposal.state = ProposalState.ExpiredInQueue; proposal.winningVote = NO; executionState = ExecutionState.QueueTimeOut; } else { confidenceThreshold = threshold(proposal.paramsHash, proposal.organizationId); if (_score(_proposalId) > confidenceThreshold) { //change proposal mode to PreBoosted mode. proposal.state = ProposalState.PreBoosted; // solhint-disable-next-line not-rely-on-time proposal.times[2] = now; proposal.confidenceThreshold = confidenceThreshold; } } } if (proposal.state == ProposalState.PreBoosted) { confidenceThreshold = threshold(proposal.paramsHash, proposal.organizationId); // solhint-disable-next-line not-rely-on-time if ((now - proposal.times[2]) >= params.preBoostedVotePeriodLimit) { if (_score(_proposalId) > confidenceThreshold) { if (orgBoostedProposalsCnt[proposal.organizationId] < MAX_BOOSTED_PROPOSALS) { //change proposal mode to Boosted mode. proposal.state = ProposalState.Boosted; // solhint-disable-next-line not-rely-on-time proposal.times[1] = now; orgBoostedProposalsCnt[proposal.organizationId]++; //add a value to average -> average = average + ((value - average) / nbValues) averageDownstakesOfBoosted = averagesDownstakesOfBoosted[proposal.organizationId]; // solium-disable-next-line indentation averagesDownstakesOfBoosted[proposal.organizationId] = uint256(int256(averageDownstakesOfBoosted) + ((int256(proposal.stakes[NO])-int256(averageDownstakesOfBoosted))/ int256(orgBoostedProposalsCnt[proposal.organizationId]))); } } else { proposal.state = ProposalState.Queued; } } else { //check the Confidence level is stable uint256 proposalScore = _score(_proposalId); if (proposalScore <= proposal.confidenceThreshold.min(confidenceThreshold)) { proposal.state = ProposalState.Queued; } else if (proposal.confidenceThreshold > proposalScore) { proposal.confidenceThreshold = confidenceThreshold; emit ConfidenceLevelChange(_proposalId, confidenceThreshold); } } } } if ((proposal.state == ProposalState.Boosted) || (proposal.state == ProposalState.QuietEndingPeriod)) { // solhint-disable-next-line not-rely-on-time if ((now - proposal.times[1]) >= proposal.currentBoostedVotePeriodLimit) { proposal.state = ProposalState.Executed; executionState = ExecutionState.BoostedTimeOut; } } if (executionState != ExecutionState.None) { if ((executionState == ExecutionState.BoostedTimeOut) || (executionState == ExecutionState.BoostedBarCrossed)) { orgBoostedProposalsCnt[tmpProposal.organizationId] = orgBoostedProposalsCnt[tmpProposal.organizationId].sub(1); //remove a value from average = ((average * nbValues) - value) / (nbValues - 1); uint256 boostedProposals = orgBoostedProposalsCnt[tmpProposal.organizationId]; if (boostedProposals == 0) { averagesDownstakesOfBoosted[proposal.organizationId] = 0; } else { averageDownstakesOfBoosted = averagesDownstakesOfBoosted[proposal.organizationId]; averagesDownstakesOfBoosted[proposal.organizationId] = (averageDownstakesOfBoosted.mul(boostedProposals+1).sub(proposal.stakes[NO]))/boostedProposals; } } emit ExecuteProposal( _proposalId, organizations[proposal.organizationId], proposal.winningVote, totalReputation ); emit GPExecuteProposal(_proposalId, executionState); ProposalExecuteInterface(proposal.callbacks).executeProposal(_proposalId, int(proposal.winningVote)); proposal.daoBounty = proposal.daoBountyRemain; } if (tmpProposal.state != proposal.state) { emit StateChange(_proposalId, proposal.state); } return (executionState != ExecutionState.None); } /** * @dev staking function * @param _proposalId id of the proposal * @param _vote NO(2) or YES(1). * @param _amount the betting amount * @return bool true - the proposal has been executed * false - otherwise. */ function _stake(bytes32 _proposalId, uint256 _vote, uint256 _amount, address _staker) internal returns(bool) { // 0 is not a valid vote. require(_vote <= NUM_OF_CHOICES && _vote > 0, "wrong vote value"); require(_amount > 0, "staking amount should be >0"); if (_execute(_proposalId)) { return true; } Proposal storage proposal = proposals[_proposalId]; if ((proposal.state != ProposalState.PreBoosted) && (proposal.state != ProposalState.Queued)) { return false; } // enable to increase stake only on the previous stake vote Staker storage staker = proposal.stakers[_staker]; if ((staker.amount > 0) && (staker.vote != _vote)) { return false; } uint256 amount = _amount; require(stakingToken.transferFrom(_staker, address(this), amount), "fail transfer from staker"); proposal.totalStakes = proposal.totalStakes.add(amount); //update totalRedeemableStakes staker.amount = staker.amount.add(amount); //This is to prevent average downstakes calculation overflow //Note that any how GEN cap is 100000000 ether. require(staker.amount <= 0x100000000000000000000000000000000, "staking amount is too high"); require(proposal.totalStakes <= uint256(0x100000000000000000000000000000000).sub(proposal.daoBountyRemain), "total stakes is too high"); if (_vote == YES) { staker.amount4Bounty = staker.amount4Bounty.add(amount); } staker.vote = _vote; proposal.stakes[_vote] = amount.add(proposal.stakes[_vote]); emit Stake(_proposalId, organizations[proposal.organizationId], _staker, _vote, _amount); return _execute(_proposalId); } /** * @dev Vote for a proposal, if the voter already voted, cancel the last vote and set a new one instead * @param _proposalId id of the proposal * @param _voter used in case the vote is cast for someone else * @param _vote a value between 0 to and the proposal's number of choices. * @param _rep how many reputation the voter would like to stake for this vote. * if _rep==0 so the voter full reputation will be use. * @return true in case of proposal execution otherwise false * throws if proposal is not open or if it has been executed * NB: executes the proposal if a decision has been reached */ // solhint-disable-next-line function-max-lines,code-complexity function internalVote(bytes32 _proposalId, address _voter, uint256 _vote, uint256 _rep) internal returns(bool) { require(_vote <= NUM_OF_CHOICES && _vote > 0, "0 < _vote <= 2"); if (_execute(_proposalId)) { return true; } Parameters memory params = parameters[proposals[_proposalId].paramsHash]; Proposal storage proposal = proposals[_proposalId]; // Check voter has enough reputation: uint256 reputation = VotingMachineCallbacksInterface(proposal.callbacks).reputationOf(_voter, _proposalId); require(reputation > 0, "_voter must have reputation"); require(reputation >= _rep, "reputation >= _rep"); uint256 rep = _rep; if (rep == 0) { rep = reputation; } // If this voter has already voted, return false. if (proposal.voters[_voter].reputation != 0) { return false; } // The voting itself: proposal.votes[_vote] = rep.add(proposal.votes[_vote]); //check if the current winningVote changed or there is a tie. //for the case there is a tie the current winningVote set to NO. if ((proposal.votes[_vote] > proposal.votes[proposal.winningVote]) || ((proposal.votes[NO] == proposal.votes[proposal.winningVote]) && proposal.winningVote == YES)) { if (proposal.state == ProposalState.Boosted && // solhint-disable-next-line not-rely-on-time ((now - proposal.times[1]) >= (params.boostedVotePeriodLimit - params.quietEndingPeriod))|| proposal.state == ProposalState.QuietEndingPeriod) { //quietEndingPeriod if (proposal.state != ProposalState.QuietEndingPeriod) { proposal.currentBoostedVotePeriodLimit = params.quietEndingPeriod; proposal.state = ProposalState.QuietEndingPeriod; emit StateChange(_proposalId, proposal.state); } // solhint-disable-next-line not-rely-on-time proposal.times[1] = now; } proposal.winningVote = _vote; } proposal.voters[_voter] = Voter({ reputation: rep, vote: _vote, preBoosted:((proposal.state == ProposalState.PreBoosted) || (proposal.state == ProposalState.Queued)) }); if ((proposal.state == ProposalState.PreBoosted) || (proposal.state == ProposalState.Queued)) { proposal.preBoostedVotes[_vote] = rep.add(proposal.preBoostedVotes[_vote]); uint256 reputationDeposit = (params.votersReputationLossRatio.mul(rep))/100; VotingMachineCallbacksInterface(proposal.callbacks).burnReputation(reputationDeposit, _voter, _proposalId); } emit VoteProposal(_proposalId, organizations[proposal.organizationId], _voter, _vote, rep); return _execute(_proposalId); } /** * @dev _score return the proposal score (Confidence level) * For dual choice proposal S = (S+)/(S-) * @param _proposalId the ID of the proposal * @return uint256 proposal score as real number. */ function _score(bytes32 _proposalId) internal view returns(uint256) { Proposal storage proposal = proposals[_proposalId]; //proposal.stakes[NO] cannot be zero as the dao downstake > 0 for each proposal. return uint216(proposal.stakes[YES]).fraction(uint216(proposal.stakes[NO])); } /** * @dev _isVotable check if the proposal is votable * @param _proposalId the ID of the proposal * @return bool true or false */ function _isVotable(bytes32 _proposalId) internal view returns(bool) { ProposalState pState = proposals[_proposalId].state; return ((pState == ProposalState.PreBoosted)|| (pState == ProposalState.Boosted)|| (pState == ProposalState.QuietEndingPeriod)|| (pState == ProposalState.Queued) ); } } // File: @daostack/infra/contracts/votingMachines/GenesisProtocol.sol pragma solidity ^0.5.11; /** * @title GenesisProtocol implementation -an organization's voting machine scheme. */ contract GenesisProtocol is IntVoteInterface, GenesisProtocolLogic { using ECDSA for bytes32; // Digest describing the data the user signs according EIP 712. // Needs to match what is passed to Metamask. bytes32 public constant DELEGATION_HASH_EIP712 = keccak256(abi.encodePacked( "address GenesisProtocolAddress", "bytes32 ProposalId", "uint256 Vote", "uint256 AmountToStake", "uint256 Nonce" )); mapping(address=>uint256) public stakesNonce; //stakes Nonce /** * @dev Constructor */ constructor(IERC20 _stakingToken) public // solhint-disable-next-line no-empty-blocks GenesisProtocolLogic(_stakingToken) { } /** * @dev staking function * @param _proposalId id of the proposal * @param _vote NO(2) or YES(1). * @param _amount the betting amount * @return bool true - the proposal has been executed * false - otherwise. */ function stake(bytes32 _proposalId, uint256 _vote, uint256 _amount) external returns(bool) { return _stake(_proposalId, _vote, _amount, msg.sender); } /** * @dev stakeWithSignature function * @param _proposalId id of the proposal * @param _vote NO(2) or YES(1). * @param _amount the betting amount * @param _nonce nonce value ,it is part of the signature to ensure that a signature can be received only once. * @param _signatureType signature type 1 - for web3.eth.sign 2 - for eth_signTypedData according to EIP #712. * @param _signature - signed data by the staker * @return bool true - the proposal has been executed * false - otherwise. */ function stakeWithSignature( bytes32 _proposalId, uint256 _vote, uint256 _amount, uint256 _nonce, uint256 _signatureType, bytes calldata _signature ) external returns(bool) { // Recreate the digest the user signed bytes32 delegationDigest; if (_signatureType == 2) { delegationDigest = keccak256( abi.encodePacked( DELEGATION_HASH_EIP712, keccak256( abi.encodePacked( address(this), _proposalId, _vote, _amount, _nonce) ) ) ); } else { delegationDigest = keccak256( abi.encodePacked( address(this), _proposalId, _vote, _amount, _nonce) ).toEthSignedMessageHash(); } address staker = delegationDigest.recover(_signature); //a garbage staker address due to wrong signature will revert due to lack of approval and funds. require(staker != address(0), "staker address cannot be 0"); require(stakesNonce[staker] == _nonce); stakesNonce[staker] = stakesNonce[staker].add(1); return _stake(_proposalId, _vote, _amount, staker); } /** * @dev voting function * @param _proposalId id of the proposal * @param _vote NO(2) or YES(1). * @param _amount the reputation amount to vote with . if _amount == 0 it will use all voter reputation. * @param _voter voter address * @return bool true - the proposal has been executed * false - otherwise. */ function vote(bytes32 _proposalId, uint256 _vote, uint256 _amount, address _voter) external votable(_proposalId) returns(bool) { Proposal storage proposal = proposals[_proposalId]; Parameters memory params = parameters[proposal.paramsHash]; address voter; if (params.voteOnBehalf != address(0)) { require(msg.sender == params.voteOnBehalf); voter = _voter; } else { voter = msg.sender; } return internalVote(_proposalId, voter, _vote, _amount); } /** * @dev Cancel the vote of the msg.sender. * cancel vote is not allow in genesisProtocol so this function doing nothing. * This function is here in order to comply to the IntVoteInterface . */ function cancelVote(bytes32 _proposalId) external votable(_proposalId) { //this is not allowed return; } /** * @dev execute check if the proposal has been decided, and if so, execute the proposal * @param _proposalId the id of the proposal * @return bool true - the proposal has been executed * false - otherwise. */ function execute(bytes32 _proposalId) external votable(_proposalId) returns(bool) { return _execute(_proposalId); } /** * @dev getNumberOfChoices returns the number of choices possible in this proposal * @return uint256 that contains number of choices */ function getNumberOfChoices(bytes32) external view returns(uint256) { return NUM_OF_CHOICES; } /** * @dev getProposalTimes returns proposals times variables. * @param _proposalId id of the proposal * @return proposals times array */ function getProposalTimes(bytes32 _proposalId) external view returns(uint[3] memory times) { return proposals[_proposalId].times; } /** * @dev voteInfo returns the vote and the amount of reputation of the user committed to this proposal * @param _proposalId the ID of the proposal * @param _voter the address of the voter * @return uint256 vote - the voters vote * uint256 reputation - amount of reputation committed by _voter to _proposalId */ function voteInfo(bytes32 _proposalId, address _voter) external view returns(uint, uint) { Voter memory voter = proposals[_proposalId].voters[_voter]; return (voter.vote, voter.reputation); } /** * @dev voteStatus returns the reputation voted for a proposal for a specific voting choice. * @param _proposalId the ID of the proposal * @param _choice the index in the * @return voted reputation for the given choice */ function voteStatus(bytes32 _proposalId, uint256 _choice) external view returns(uint256) { return proposals[_proposalId].votes[_choice]; } /** * @dev isVotable check if the proposal is votable * @param _proposalId the ID of the proposal * @return bool true or false */ function isVotable(bytes32 _proposalId) external view returns(bool) { return _isVotable(_proposalId); } /** * @dev proposalStatus return the total votes and stakes for a given proposal * @param _proposalId the ID of the proposal * @return uint256 preBoostedVotes YES * @return uint256 preBoostedVotes NO * @return uint256 total stakes YES * @return uint256 total stakes NO */ function proposalStatus(bytes32 _proposalId) external view returns(uint256, uint256, uint256, uint256) { return ( proposals[_proposalId].preBoostedVotes[YES], proposals[_proposalId].preBoostedVotes[NO], proposals[_proposalId].stakes[YES], proposals[_proposalId].stakes[NO] ); } /** * @dev getProposalOrganization return the organizationId for a given proposal * @param _proposalId the ID of the proposal * @return bytes32 organization identifier */ function getProposalOrganization(bytes32 _proposalId) external view returns(bytes32) { return (proposals[_proposalId].organizationId); } /** * @dev getStaker return the vote and stake amount for a given proposal and staker * @param _proposalId the ID of the proposal * @param _staker staker address * @return uint256 vote * @return uint256 amount */ function getStaker(bytes32 _proposalId, address _staker) external view returns(uint256, uint256) { return (proposals[_proposalId].stakers[_staker].vote, proposals[_proposalId].stakers[_staker].amount); } /** * @dev voteStake return the amount stakes for a given proposal and vote * @param _proposalId the ID of the proposal * @param _vote vote number * @return uint256 stake amount */ function voteStake(bytes32 _proposalId, uint256 _vote) external view returns(uint256) { return proposals[_proposalId].stakes[_vote]; } /** * @dev voteStake return the winningVote for a given proposal * @param _proposalId the ID of the proposal * @return uint256 winningVote */ function winningVote(bytes32 _proposalId) external view returns(uint256) { return proposals[_proposalId].winningVote; } /** * @dev voteStake return the state for a given proposal * @param _proposalId the ID of the proposal * @return ProposalState proposal state */ function state(bytes32 _proposalId) external view returns(ProposalState) { return proposals[_proposalId].state; } /** * @dev isAbstainAllow returns if the voting machine allow abstain (0) * @return bool true or false */ function isAbstainAllow() external pure returns(bool) { return false; } /** * @dev getAllowedRangeOfChoices returns the allowed range of choices for a voting machine. * @return min - minimum number of choices max - maximum number of choices */ function getAllowedRangeOfChoices() external pure returns(uint256 min, uint256 max) { return (YES, NO); } /** * @dev score return the proposal score * @param _proposalId the ID of the proposal * @return uint256 proposal score. */ function score(bytes32 _proposalId) public view returns(uint256) { return _score(_proposalId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"parameters","outputs":[{"internalType":"uint256","name":"queuedVoteRequiredPercentage","type":"uint256"},{"internalType":"uint256","name":"queuedVotePeriodLimit","type":"uint256"},{"internalType":"uint256","name":"boostedVotePeriodLimit","type":"uint256"},{"internalType":"uint256","name":"preBoostedVotePeriodLimit","type":"uint256"},{"internalType":"uint256","name":"thresholdConst","type":"uint256"},{"internalType":"uint256","name":"limitExponentValue","type":"uint256"},{"internalType":"uint256","name":"quietEndingPeriod","type":"uint256"},{"internalType":"uint256","name":"proposingRepReward","type":"uint256"},{"internalType":"uint256","name":"votersReputationLossRatio","type":"uint256"},{"internalType":"uint256","name":"minimumDaoBounty","type":"uint256"},{"internalType":"uint256","name":"daoBountyConst","type":"uint256"},{"internalType":"uint256","name":"activationTime","type":"uint256"},{"internalType":"address","name":"voteOnBehalf","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[11]","name":"_params","type":"uint256[11]"},{"internalType":"address","name":"_voteOnBehalf","type":"address"}],"name":"getParametersHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"address","name":"_voter","type":"address"}],"name":"voteInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"address","name":"_staker","type":"address"}],"name":"getStaker","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"getProposalOrganization","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalsCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_paramsHash","type":"bytes32"},{"internalType":"bytes32","name":"_organizationId","type":"bytes32"}],"name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"uint256","name":"_vote","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DELEGATION_HASH_EIP712","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"proposals","outputs":[{"internalType":"bytes32","name":"organizationId","type":"bytes32"},{"internalType":"address","name":"callbacks","type":"address"},{"internalType":"enum GenesisProtocolLogic.ProposalState","name":"state","type":"uint8"},{"internalType":"uint256","name":"winningVote","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"currentBoostedVotePeriodLimit","type":"uint256"},{"internalType":"bytes32","name":"paramsHash","type":"bytes32"},{"internalType":"uint256","name":"daoBountyRemain","type":"uint256"},{"internalType":"uint256","name":"daoBounty","type":"uint256"},{"internalType":"uint256","name":"totalStakes","type":"uint256"},{"internalType":"uint256","name":"confidenceThreshold","type":"uint256"},{"internalType":"uint256","name":"secondsFromTimeOutTillExecuteBoosted","type":"uint256"},{"internalType":"bool","name":"daoRedeemItsWinnings","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"uint256","name":"_vote","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_voter","type":"address"}],"name":"vote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"winningVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"calcExecuteCallBounty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"uint256","name":"_vote","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_signatureType","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"stakeWithSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllowedRangeOfChoices","outputs":[{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"isAbstainAllow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"state","outputs":[{"internalType":"enum GenesisProtocolLogic.ProposalState","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"redeemDaoBounty","outputs":[{"internalType":"uint256","name":"redeemedAmount","type":"uint256"},{"internalType":"uint256","name":"potentialAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"uint256","name":"_vote","type":"uint256"}],"name":"voteStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"proposalStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"shouldBoost","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes32","name":"_paramsHash","type":"bytes32"},{"internalType":"address","name":"_proposer","type":"address"},{"internalType":"address","name":"_organization","type":"address"}],"name":"propose","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[11]","name":"_params","type":"uint256[11]"},{"internalType":"address","name":"_voteOnBehalf","type":"address"}],"name":"setParameters","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"cancelVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"NUM_OF_CHOICES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"getNumberOfChoices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakesNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"YES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"uint256","name":"_choice","type":"uint256"}],"name":"voteStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"organizations","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"averagesDownstakesOfBoosted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"executeBoosted","outputs":[{"internalType":"uint256","name":"expirationCallBounty","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"isVotable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"getProposalTimes","outputs":[{"internalType":"uint256[3]","name":"times","type":"uint256[3]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256[3]","name":"rewards","type":"uint256[3]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"score","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_proposalId","type":"bytes32"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"orgBoostedProposalsCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakingToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":true,"internalType":"address","name":"_staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"_vote","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RedeemDaoBounty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RedeemReputation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":false,"internalType":"enum GenesisProtocolLogic.ProposalState","name":"_proposalState","type":"uint8"}],"name":"StateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":false,"internalType":"enum GenesisProtocolLogic.ExecutionState","name":"_executionState","type":"uint8"}],"name":"GPExecuteProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ExpirationCallBounty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_confidenceThreshold","type":"uint256"}],"name":"ConfidenceLevelChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":false,"internalType":"uint256","name":"_numOfChoices","type":"uint256"},{"indexed":false,"internalType":"address","name":"_proposer","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_paramsHash","type":"bytes32"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":false,"internalType":"uint256","name":"_decision","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalReputation","type":"uint256"}],"name":"ExecuteProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":true,"internalType":"address","name":"_voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_vote","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_reputation","type":"uint256"}],"name":"VoteProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"}],"name":"CancelProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_proposalId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_organization","type":"address"},{"indexed":true,"internalType":"address","name":"_voter","type":"address"}],"name":"CancelVoting","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620042e1380380620042e1833981810160405260208110156200003757600080fd5b5051806200006573543ff227f64aa17ea132bf9886cab5db55dcaddf620000bb602090811b6200410017901c565b156200009757600680546001600160a01b03191673543ff227f64aa17ea132bf9886cab5db55dcaddf179055620000b3565b600680546001600160a01b0319166001600160a01b0383161790555b5050620000c1565b3b151590565b61421080620000d16000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806372f702f31161013b578063b4512913116100b8578063c8f526e81161007c578063c8f526e814610887578063cc3bf9e9146108dc578063e5af18c514610908578063e751f27114610925578063fb6c0cbb1461094257610248565b8063b4512913146107f0578063ba51b14e14610813578063bb5a05ed14610830578063beda80151461084d578063c08351061461086a57610248565b80639525c0cc116100ff5780639525c0cc146107865780639bc5689d14610347578063a003651d146107a5578063a05ea6e4146107c2578063b2449d65146107e857610248565b806372f702f31461069c57806379a1c1f6146106c057806380f5e0a11461070357806388737b5e146107205780638894c41b1461075a57610248565b806332ed5b12116101c95780635142bc1e1161018d5780635142bc1e146105fc57806351d997b21461060457806361d585da1461060c5780636359036b1461064d578063707437681461067957610248565b806332ed5b121461044d578063359afa49146104fb5780633c133818146105335780634047487314610550578063488c65fc1461056d57610248565b80631702ef0c116102105780631702ef0c146103c057806321b4b3dc146103dd5780632d598e58146103e55780632daedd521461040857806330ca0a531461044557610248565b8063025068041461024d57806307b4e1e3146102d85780630d48344214610347578063119ce91b1461034f57806316db517214610394575b600080fd5b61026a6004803603602081101561026357600080fd5b503561095f565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526001600160a01b031661018083015251908190036101a00190f35b61033560048036036101808110156102ef57600080fd5b81019080806101600190600b806020026040519081016040528092919082600b602002808284376000920191909152509194505050356001600160a01b031690506109cf565b60408051918252519081900360200190f35b610335610ae0565b61037b6004803603604081101561036557600080fd5b50803590602001356001600160a01b0316610ae5565b6040805192835260208301919091528051918290030190f35b61037b600480360360408110156103aa57600080fd5b50803590602001356001600160a01b0316610b48565b610335600480360360208110156103d657600080fd5b5035610b79565b610335610b8b565b610335600480360360408110156103fb57600080fd5b5080359060200135610b91565b6104316004803603606081101561041e57600080fd5b5080359060208101359060400135610bde565b604080519115158252519081900360200190f35b610335610bf4565b61046a6004803603602081101561046357600080fd5b5035610ca0565b604080518e81526001600160a01b038e1660208201529081018c600681111561048f57fe5b60ff168152602081019b909b52506001600160a01b039098166040808b019190915260608a0197909752608089019590955260a088019390935260c087019190915260e08601526101008501526101208401529015156101408301525190819003610160019350915050f35b6104316004803603608081101561051157600080fd5b50803590602081013590604081013590606001356001600160a01b0316610d0e565b6103356004803603602081101561054957600080fd5b5035610e33565b6103356004803603602081101561056657600080fd5b5035610e48565b610431600480360360c081101561058357600080fd5b8135916020810135916040820135916060810135916080820135919081019060c0810160a08201356401000000008111156105bd57600080fd5b8201836020820111156105cf57600080fd5b803590602001918460018302840111640100000000831117156105f157600080fd5b509092509050610eb8565b61037b611154565b61043161115c565b6106296004803603602081101561062257600080fd5b5035611162565b6040518082600681111561063957fe5b60ff16815260200191505060405180910390f35b61037b6004803603604081101561066357600080fd5b50803590602001356001600160a01b0316611182565b6103356004803603604081101561068f57600080fd5b50803590602001356113fd565b6106a461141e565b604080516001600160a01b039092168252519081900360200190f35b6106dd600480360360208110156106d657600080fd5b503561142d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6104316004803603602081101561071957600080fd5b5035611470565b6103356004803603608081101561073657600080fd5b508035906020810135906001600160a01b03604082013581169160600135166115ad565b610335600480360361018081101561077157600080fd5b506001600160a01b0361016082013516611965565b6107a36004803603602081101561079c57600080fd5b5035611d52565b005b610335600480360360208110156107bb57600080fd5b5035611d69565b610335600480360360208110156107d857600080fd5b50356001600160a01b0316611d6f565b610335611d81565b6103356004803603604081101561080657600080fd5b5080359060200135611d86565b6106a46004803603602081101561082957600080fd5b5035611da7565b6103356004803603602081101561084657600080fd5b5035611dc2565b6103356004803603602081101561086357600080fd5b5035611dd4565b6104316004803603602081101561088057600080fd5b503561201d565b6108a46004803603602081101561089d57600080fd5b5035612028565b6040518082606080838360005b838110156108c95781810151838201526020016108b1565b5050505090500191505060405180910390f35b6108a4600480360360408110156108f257600080fd5b50803590602001356001600160a01b0316612077565b6103356004803603602081101561091e57600080fd5b50356127e8565b6104316004803603602081101561093b57600080fd5b50356127f3565b6103356004803603602081101561095857600080fd5b5035612818565b600060208190529081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01549a9b999a989997989697959694959394929391929091906001600160a01b03168d565b60008281602002015183600160200201518460026020020151856003602002015186600460200201518760056020020151886006602002015189600760200201518a600860200201518b600960200201518c600a6020020151604051602001808c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001208260405160200180838152602001826001600160a01b03166001600160a01b031660601b8152601401925050506040516020818303038152906040528051906020012090505b92915050565b600281565b600080610af0613f75565b50505060009182526001602081815260408085206001600160a01b039490941685526011909301815292829020825160608101845281548082529282015494810185905260029091015460ff16151592019190915291565b60009182526001602081815260408085206001600160a01b0394909416855260139093019052912080549101549091565b60009081526001602052604090205490565b60055481565b6000818152600260209081526040808320548584529183905282206005810154821115610bc057806005015491505b6004810154610bd5908363ffffffff61282a16565b95945050505050565b6000610bec84848433612874565b949350505050565b604080517f616464726573732047656e6573697350726f746f636f6c41646472657373000060208083019190915271189e5d195ccccc88141c9bdc1bdcd85b125960721b603e8301526b75696e7432353620566f746560a01b60508301527475696e7432353620416d6f756e74546f5374616b6560581b605c8301526c75696e74323536204e6f6e636560981b60718301528251605e818403018152607e909201909252805191012081565b600160208190526000918252604090912080549181015460028201546003830154600484015460058501546006860154600787015460088801546009890154600a8a0154600e909a01546001600160a01b03808b169b60ff600160a01b909c048c169b99909116989091168d565b600084610d1a81612c7a565b610d2357600080fd5b6000868152600160205260409020610d39613f98565b5060058082015460009081526020818152604080832081516101a0810183528154815260018201549381019390935260028101549183019190915260038101546060830152600481015460808301529283015460a0820152600683015460c0820152600783015460e082015260088301546101008201526009830154610120820152600a830154610140820152600b830154610160820152600c909201546001600160a01b0316610180830181905215610e17578161018001516001600160a01b0316336001600160a01b031614610e1057600080fd5b5084610e1a565b50335b610e2689828a8a612ced565b9998505050505050505050565b60009081526001602052604090206002015490565b6000818152600160205260408120600a01546105dc908290610e7190839063ffffffff61332416565b600085815260016020818152604080842092845260129092019052902054909150610bec90600a840290610eac90849063ffffffff61333a16565b9063ffffffff61339316565b6000808460021415610fdb5750604080517f616464726573732047656e6573697350726f746f636f6c41646472657373000060208083019190915271189e5d195ccccc88141c9bdc1bdcd85b125960721b603e8301526b75696e7432353620566f746560a01b60508301527475696e7432353620416d6f756e74546f5374616b6560581b605c8301526c75696e74323536204e6f6e636560981b60718301528251605e818403018152607e830184528051908201203060601b609e84015260b283018c905260d283018b905260f283018a90526101128084018a905284518085039091018152610132840185528051908301206101528401919091526101728084019190915283518084039091018152610192909201909252805191012061102c565b604080513060601b602080830191909152603482018c9052605482018b9052607482018a905260948083018a90528351808403909101815260b49092019092528051910120611029906133fd565b90505b600061107685858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505063ffffffff61344e169050565b90506001600160a01b0381166110d3576040805162461bcd60e51b815260206004820152601a60248201527f7374616b657220616464726573732063616e6e6f742062652030000000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205487146110f757600080fd5b6001600160a01b03811660009081526007602052604090205461112190600163ffffffff61353c16565b6001600160a01b0382166000908152600760205260409020556111468a8a8a84612874565b9a9950505050505050505050565b600160029091565b60005b90565b60009081526001602081905260409091200154600160a01b900460ff1690565b6000828152600160205260408120819060026001820154600160a01b900460ff1660068111156111ae57fe5b146111b857600080fd5b60028082015460009081526012830160209081526040808320546001600160a01b0389168452601386019092529091209182015490919015801590611201575060028301548154145b8015611211575060018360020154145b801561121c57508115155b15611238578183600701548260020154028161123457fe5b0493505b83158015906112cd5750600183015460065460408051636b8eb40360e01b81526001600160a01b039283166004820152602481018b9052905187939290921691636b8eb40391604480820192602092909190829003018186803b15801561129e57600080fd5b505afa1580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b505110155b156113f3576000600282015560068301546112ee908563ffffffff61359616565b60068085019190915560018401549054604080516317d4ebe560e31b81526001600160a01b039283166004820152898316602482015260448101889052606481018b90529051919092169163bea75f289160848083019260209291908290030181600087803b15801561136057600080fd5b505af1158015611374573d6000803e3d6000fd5b505050506040513d602081101561138a57600080fd5b505161139557600080fd5b8254600090815260036020908152604091829020548251878152925196975087966001600160a01b03808b16949216928b927fb4a37163ec93e05e09b62e52f7f2ea8cfde431802edede7dfebe53d2ad969dbb929081900390910190a45b5050509250929050565b60009182526001602090815260408084209284526012909201905290205490565b6006546001600160a01b031681565b6000908152600160208181526040808420838552601081018352818520546002808752838720549587526012909201909352818520549085529320549093919291565b600061147a614009565b60008381526001602081815260409283902083516101c08101855281548152928101546001600160a01b038116928401929092529192830190600160a01b900460ff1660068111156114c857fe5b60068111156114d357fe5b8152600282015460208201526003808301546001600160a01b0316604080840191909152600484015460608085019190915260058501546080850152600685015460a0850152600785015460c0850152600885015460e08501526009850154610100850152600a8501546101208501528151908101918290526101409093019291600b85019182845b81548152602001906001019080831161155c575050509183525050600e919091015460ff16151560209091015260c0810151815191925061159c91610b91565b6115a5846135f3565b119392505050565b6000838152602081905260408120600b01544211611603576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd081858dd1a5d99481e595d60921b604482015290519081900360640190fd5b6000848152602081905260409020546032111561161f57600080fd5b600554604080513060601b602080830191909152603480830185905283518084039091018152605490920190925280519101209061166490600163ffffffff61353c16565b60055561166f614009565b33602082810182905260408051606093841b818401526bffffffffffffffffffffffff1988851b16603482015281516028818303018152604890910182528051908301208452600381850181905261018085015142905260008a815280845282812060029081015460a08801526001600160a01b038b811660808901529587015260c086018b905285518152925290205416611762576001600160a01b038416611738578051600090815260036020526040902080546001600160a01b03191633179055611762565b8051600090815260036020526040902080546001600160a01b0319166001600160a01b0386161790555b8051600090815260046020908152604080832054898452918390528220600a015461179991606491610eac9163ffffffff61333a16565b6000888152602081905260409020600901549091506117bf90829063ffffffff61363416565b60e0830152600083815260016020818152604092839020855181559085015191810180546001600160a01b0319166001600160a01b03909316929092178083559285015185939192909160ff60a01b1916600160a01b83600681111561182157fe5b0217905550606082015160028201556080820151600380830180546001600160a01b0319166001600160a01b039093169290921790915560a0830151600483015560c0830151600583015560e08301516006830155610100830151600783015561012083015160088301556101408301516009830155610160830151600a8301556101808301516118b791600b8401919061408a565b506101a09190910151600e909101805460ff191691151591909117905560e08201516000848152600160209081526040808320600280855260129091018352818420949094558551835260038252918290205482519384526001600160a01b038a8116928501929092528383018b9052915191169185917f75b4ff136cc5de5957574c797de3334eb1c141271922b825eb071e0487ba2c5c916060908290030190a350909695505050505050565b6000606483351180159061197b57506032833510155b6119b65760405162461bcd60e51b815260040180806020018281038252602981526020018061415f6029913960400191505060405180910390fd5b613e806080840135118015906119d157506103e86080840135115b611a22576040805162461bcd60e51b815260206004820152601e60248201527f31303030203c207468726573686f6c64436f6e7374203c3d2031363030300000604482015290519081900360640190fd5b606460e08401351115611a7c576040805162461bcd60e51b815260206004820181905260248201527f766f7465727352657075746174696f6e4c6f7373526174696f203c3d20313030604482015290519081900360640190fd5b60a083013560408401351015611ac35760405162461bcd60e51b815260040180806020018281038252602b815260200180614134602b913960400191505060405180910390fd5b610100830135611b1a576040805162461bcd60e51b815260206004820152601e60248201527f6d696e696d756d44616f426f756e74792073686f756c64206265203e20300000604482015290519081900360640190fd5b610120830135611b71576040805162461bcd60e51b815260206004820152601c60248201527f64616f426f756e7479436f6e73742073686f756c64206265203e203000000000604482015290519081900360640190fd5b6000611ba784600b806020026040519081016040528092919082600b602002808284376000920191909152508691506109cf9050565b905060ac60026107d05b613e80811015611bf957608087013581108015611bd5575060028102608088013511155b15611beb57818381611be357fe5b049250611bf9565b600190910190600202611bb1565b50604080516101a0810182528735815260208089013590820152878201359181019190915260608088013590820152608080820190611c46908901356001600160d81b03166103e8613644565b81526020810184905260a088810135604083015260c0808a0135606084015260e0808b013560808501526101008b0135928401929092526101208a0135908301520187600a6020908102919091013582526001600160a01b03978816918101919091526000858152808252604090819020835181559183015160018301558201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a820155610160820151600b82015561018090910151600c90910180546001600160a01b0319169190961617909455509392505050565b80611d5c81612c7a565b611d6557600080fd5b5050565b50600290565b60076020526000908152604090205481565b600181565b6000918252600160209081526040808420928452600f909201905290205490565b6003602052600090815260409020546001600160a01b031681565b60046020526000908152604090205481565b600081815260016020526040812060056001820154600160a01b900460ff166006811115611dfe57fe5b1480611e23575060066001820154600160a01b900460ff166006811115611e2157fe5b145b611e5e5760405162461bcd60e51b81526004018080602001828103825260338152602001806141a96033913960400191505060405180910390fd5b611e6783613667565b611eb8576040805162461bcd60e51b815260206004820152601760248201527f70726f706f73616c206e65656420746f20657870697265000000000000000000604482015290519081900360640190fd5b611ee4611ed7600b83016001015460048401549063ffffffff61353c16565b429063ffffffff61359616565b600a820155611ef283610e48565b6008820154909250611f0a908363ffffffff61359616565b60088201556006546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015611f6357600080fd5b505af1158015611f77573d6000803e3d6000fd5b505050506040513d6020811015611f8d57600080fd5b5051611fe0576040805162461bcd60e51b815260206004820152601d60248201527f7472616e7366657220746f206d73672e73656e646572206661696c6564000000604482015290519081900360640190fd5b604080518381529051339185917f7468017f6ff596af88244327e88fe691ac48cc1db88b033d11c335f2c7ccdd039181900360200190a350919050565b6000610ada82612c7a565b6120306140c8565b60008281526001602052604090819020815160608101909252600b0160038282826020028201915b8154815260200190600101908083116120585750505050509050919050565b61207f6140c8565b600083815260016020526040902060026001820154600160a01b900460ff1660068111156120a957fe5b14806120cd5750600180820154600160a01b900460ff1660068111156120cb57fe5b145b6121085760405162461bcd60e51b815260040180806020018281038252602d815260200180614107602d913960400191505060405180910390fd5b612110613f98565b5060058082015460009081526020818152604080832081516101a081018352815481526001820154818501526002808301548285015260038301546060830152600483015460808301529582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c909101546001600160a01b03908116610180830152881684526013860183528184209486015484526012860190925282205490929161221c6121e689610e48565b6001600090815260128801602052604080822054600283529120546122109163ffffffff61353c16565b9063ffffffff61359616565b6001840154909150156122e757600180860154600160a01b900460ff16600681111561224457fe5b141561225657600183015486526122df565b6002850154835414156122df578254600114156122bd5780856007015410156122b857600061229286600701548361359690919063ffffffff16565b9050826122ac82866001015461333a90919063ffffffff16565b816122b357fe5b048752505b6122df565b600183015482906122d4908363ffffffff61333a16565b816122db57fe5b0486525b600060018401555b600e85015460ff16158015612317575084546000908152600360205260409020546001600160a01b038881169116145b801561233c5750600180860154600160a01b900460ff16600681111561233957fe5b14155b801561234c575060028560020154145b1561239d57600785015461238b906122108461236e838663ffffffff61333a16565b8161237557fe5b048960005b60200201519063ffffffff61353c16565b8652600e8501805460ff191660011790555b6001600160a01b038716600090815260118601602052604090206001810154158015906123ce5750600281015460ff165b1561250d57600180870154600160a01b900460ff1660068111156123ee57fe5b1415612424576064612412866101000151836001015461333a90919063ffffffff16565b8161241957fe5b046020880152612505565b80546002870154141561250557600060018760020154141561245957506002600090815260108701602052604090205461246e565b50600160009081526010870160205260409020545b60646124888761010001518361333a90919063ffffffff16565b8161248f57fe5b6002890154600090815260108a01602052604090205460018501549290910492506124fe916124c4908463ffffffff61333a16565b816124cb57fe5b0460646124ea896101000151866001015461333a90919063ffffffff16565b816124f157fe5b049063ffffffff61353c16565b6020890152505b600060018201555b60038601546001600160a01b038981169116148015612530575060018660020154145b8015612548575060038601546001600160a01b031615155b1561256a5760e085015160408801526003860180546001600160a01b03191690555b8651156126b7578651600887015461258191613596565b600887015560065487516040805163a9059cbb60e01b81526001600160a01b038c8116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156125df57600080fd5b505af11580156125f3573d6000803e3d6000fd5b505050506040513d602081101561260957600080fd5b505161265c576040805162461bcd60e51b815260206004820152601e60248201527f7472616e7366657220746f2062656e6566696369617279206661696c65640000604482015290519081900360640190fd5b8554600090815260036020908152604091829020548951835190815292516001600160a01b038c8116949216928d927f6d26871c9f457d104b2122485f659f126f7a0cf6938cf20482c03f49794a2fbf929081900390910190a45b60408701516126c89088600161237a565b156127dc5760018601546001600160a01b031663d29b5d2f6126f389600260200201518a600161237a565b8a8c6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561274b57600080fd5b505af115801561275f573d6000803e3d6000fd5b505050506040513d602081101561277557600080fd5b505085546000908152600360205260409020546001600160a01b03808a1691168a7f7419b736daacf66d5c1645948c956fca2b83be1e2e02d486d65713f289d683b86127ca8b600260200201518c600161237a565b60408051918252519081900360200190a45b50505050505092915050565b6000610ada826135f3565b6000816127ff81612c7a565b61280857600080fd5b61281183613667565b9392505050565b60026020526000908152604090205481565b60008282650100000000005b8115610bd5578160011660011415612855576128528184613ef6565b90505b60019190911c90811561286f5761286c8384613ef6565b92505b612836565b6000600284111580156128875750600084115b6128cb576040805162461bcd60e51b815260206004820152601060248201526f77726f6e6720766f74652076616c756560801b604482015290519081900360640190fd5b60008311612920576040805162461bcd60e51b815260206004820152601b60248201527f7374616b696e6720616d6f756e742073686f756c64206265203e300000000000604482015290519081900360640190fd5b61292985613667565b1561293657506001610bec565b600085815260016020526040902060046001820154600160a01b900460ff16600681111561296057fe5b14158015612988575060036001820154600160a01b900460ff16600681111561298557fe5b14155b15612997576000915050610bec565b6001600160a01b038316600090815260138201602052604090206001810154158015906129c5575080548614155b156129d557600092505050610bec565b600654604080516323b872dd60e01b81526001600160a01b038781166004830152306024830152604482018990529151889392909216916323b872dd916064808201926020929091908290030181600087803b158015612a3457600080fd5b505af1158015612a48573d6000803e3d6000fd5b505050506040513d6020811015612a5e57600080fd5b5051612ab1576040805162461bcd60e51b815260206004820152601960248201527f6661696c207472616e736665722066726f6d207374616b657200000000000000604482015290519081900360640190fd5b6008830154612ac6908263ffffffff61353c16565b60088401556001820154612ae0908263ffffffff61353c16565b60018301819055600160801b1015612b3f576040805162461bcd60e51b815260206004820152601a60248201527f7374616b696e6720616d6f756e7420697320746f6f2068696768000000000000604482015290519081900360640190fd5b6006830154612b5990600160801b9063ffffffff61359616565b83600801541115612bb1576040805162461bcd60e51b815260206004820152601860248201527f746f74616c207374616b657320697320746f6f20686967680000000000000000604482015290519081900360640190fd5b6001871415612bd5576002820154612bcf908263ffffffff61353c16565b60028301555b8682556000878152601284016020526040902054612bfa90829063ffffffff61353c16565b60008881526012850160209081526040808320939093558554825260038152908290205482518a815291820189905282516001600160a01b03808a16949216928c927fd0239d7d4acf51def4507fa173be466927de5d75d8b10d840cd6994d6e10231092918290030190a4612c6e88613667565b98975050505050505050565b600081815260016020819052604082200154600160a01b900460ff166004816006811115612ca457fe5b1480612cbb57506005816006811115612cb957fe5b145b80612cd157506006816006811115612ccf57fe5b145b8061281157506003816006811115612ce557fe5b149392505050565b600060028311158015612d005750600083115b612d42576040805162461bcd60e51b815260206004820152600e60248201526d18101e102fbb37ba32901e1e901960911b604482015290519081900360640190fd5b612d4b85613667565b15612d5857506001610bec565b612d60613f98565b506000858152600160208181526040808420600580820154865285845282862083516101a0810185528154815281870154818701526002820154818601526003820154606082015260048083015460808301529282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c909101546001600160a01b039081166101808301528c8852868652958301548451634ac41bc760e11b81528c881693810193909352602483018d905293519096929592949390921692639588378e92604480840193829003018186803b158015612e6757600080fd5b505afa158015612e7b573d6000803e3d6000fd5b505050506040513d6020811015612e9157600080fd5b5051905080612ee7576040805162461bcd60e51b815260206004820152601b60248201527f5f766f746572206d75737420686176652072657075746174696f6e0000000000604482015290519081900360640190fd5b84811015612f31576040805162461bcd60e51b8152602060048201526012602482015271072657075746174696f6e203e3d205f7265760741b604482015290519081900360640190fd5b8480612f3a5750805b6001600160a01b038816600090815260118401602052604090206001015415612f6a576000945050505050610bec565b6000878152600f84016020526040902054612f8c90829063ffffffff61353c16565b6000888152600f8501602052604080822083905560028601548252812054908990521080612fe457506002808401546000908152600f8501602052604080822054928252902054148015612fe4575060018360020154145b156130f35760056001840154600160a01b900460ff16600681111561300557fe5b148015613025575060c0840151604085015103600b840160010154420310155b80613049575060066001840154600160a01b900460ff16600681111561304757fe5b145b156130eb5760066001840154600160a01b900460ff16600681111561306a57fe5b146130e45760c0840151600484015560018301805460ff60a01b1916600360a11b17908190556040518a917f21aca7f0285ccddeca2935074d3e36b5ab8fea0327f84cbbf12cf1b6d1a749f991600160a01b90910460ff1690808260068111156130d057fe5b60ff16815260200191505060405180910390a25b42600c8401555b600283018790555b604080516060810182528881526020810183905290810160046001860154600160a01b900460ff16600681111561312657fe5b148061314b575060036001860154600160a01b900460ff16600681111561314957fe5b145b151590526001600160a01b0389166000908152601185016020908152604091829020835181559083015160018201559101516002909101805460ff191691151591909117905560046001840154600160a01b900460ff1660068111156131ad57fe5b14806131d2575060036001840154600160a01b900460ff1660068111156131d057fe5b145b156132bf5760008781526010840160205260409020546131f990829063ffffffff61353c16565b6000888152601085016020526040812091909155610100850151606490613226908463ffffffff61333a16565b8161322d57fe5b600186015460408051637c0fc5fb60e11b815293909204600484018190526001600160a01b038d81166024860152604485018f9052925190945091169163f81f8bf69160648083019260209291908290030181600087803b15801561329157600080fd5b505af11580156132a5573d6000803e3d6000fd5b505050506040513d60208110156132bb57600080fd5b5050505b82546000908152600360209081526040918290205482518a815291820184905282516001600160a01b03808d16949216928d927f066c061a3792cb3eb64a441a928655fcbafb4a54b49725fe9cd2951df5e7189e92918290030190a4610e2689613667565b60008183106133335781612811565b5090919050565b60008261334957506000610ada565b8282028284828161335657fe5b04146128115760405162461bcd60e51b81526004018080602001828103825260218152602001806141886021913960400191505060405180910390fd5b60008082116133e9576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816133f457fe5b04949350505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b6000815160411461346157506000610ada565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156134a75760009350505050610ada565b8060ff16601b141580156134bf57508060ff16601c14155b156134d05760009350505050610ada565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015613527573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600082820183811015612811576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000828211156135ed576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008181526001602081815260408084206002855260128101909252808420549284528320549091612811916001600160d81b03169063ffffffff61364416565b6000818310156133335781612811565b60006128116001600160d81b038085166501000000000090810291851602613f5a565b60008161367381612c7a565b61367c57600080fd5b6000838152600160205260409020613692613f98565b506005808201546000908152602081815260409182902082516101a0810184528154815260018201549281019290925260028101549282019290925260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a810154610140830152600b810154610160830152600c01546001600160a01b0316610180820152613746614009565b604080516101c0810182528454815260018501546001600160a01b03811660208301529091859190830190600160a01b900460ff16600681111561378657fe5b600681111561379157fe5b8152600282015460208201526003808301546001600160a01b0316604080840191909152600484015460608085019190915260058501546080850152600685015460a0850152600785015460c0850152600885015460e08501526009850154610100850152600a8501546101208501528151908101918290526101409093019291600b85019182845b81548152602001906001019080831161381a575050509183525050600e919091015460ff16151560209182015260018501546040805163b551c37360e01b8152600481018b905290519394506000936001600160a01b039092169263b551c37392602480840193829003018186803b15801561389557600080fd5b505afa1580156138a9573d6000803e3d6000fd5b505050506040513d60208110156138bf57600080fd5b5051835160028601546000908152600f8701602052604081205492935060648404909102918190819084101561396c5760036001890154600160a01b900460ff16600681111561390b57fe5b141561391a576001925061394a565b60046001890154600160a01b900460ff16600681111561393657fe5b1415613945576003925061394a565b600592505b6001880180546002919060ff60a01b1916600160a01b835b0217905550613bb3565b60036001890154600160a01b900460ff16600681111561398857fe5b1415613a0a576020870151600b8901544203106139c35760018801805460ff60a01b1916600160a01b17905560028089018190559250613a0a565b6139d588600501548960000154610b91565b9050806139e18c6135f3565b1115613a0a5760018801805460ff60a01b1916600160a21b17905542600d890155600988018190555b60046001890154600160a01b900460ff166006811115613a2657fe5b1415613bb357613a3e88600501548960000154610b91565b6060880151909150600b890160020154420310613b245780613a5f8c6135f3565b1115613b035787546000908152600260205260409020546110001115613afe576001888101805460ff60a01b1916600560a01b17905542600c8a01558854600090815260026020818152604080842080549095019094558b54835260048152838320548282528484205492845260128d0190915292909120549193509083900381613ae657fe5b89546000908152600460205260409020919005830190555b613b1f565b6001880180546003919060ff60a01b1916600160a01b83613962565b613bb3565b6000613b2f8c6135f3565b60098a0154909150613b47908363ffffffff61332416565b8111613b675760018901805460ff60a01b1916600360a01b179055613bb1565b8089600901541115613bb157600989018290556040805183815290518d917fad767d61af51c7895fa3cc0497dde01afb610c74e55ee4d8a71fa5e3ee136d54919081900360200190a25b505b60056001890154600160a01b900460ff166006811115613bcf57fe5b1480613bf4575060066001890154600160a01b900460ff166006811115613bf257fe5b145b15613c24576004880154600c890154420310613c245760018801805460ff60a01b1916600160a11b179055600492505b6000836005811115613c3257fe5b14613e50576004836005811115613c4557fe5b1480613c5c57506005836005811115613c5a57fe5b145b15613d17578551600090815260026020526040902054613c8390600163ffffffff61359616565b86516000908152600260205260408082209290925587518152205480613cb9578854600090815260046020526040812055613d15565b88546000908152600460209081526040808320546002845260128d01909252909120549093508190613cf890612210866001850163ffffffff61333a16565b81613cff57fe5b8a54600090815260046020526040902091900490555b505b87546000908152600360209081526040918290205460028b0154835190815291820188905282516001600160a01b03909116928e927f37471b9c9d295ffb1309ad070b8964700bfb7b555e8e8292d0b6cbc7dba35d10929081900390910190a38a7f46a713b994c752c68fbefa9048bec9a0010cc7d933ad95a3c3dbb25931a167e78460405180826005811115613daa57fe5b60ff16815260200191505060405180910390a26001880154600289015460408051639d4c162d60e01b8152600481018f90526024810192909252516001600160a01b0390921691639d4c162d916044808201926020929091908290030181600087803b158015613e1957600080fd5b505af1158015613e2d573d6000803e3d6000fd5b505050506040513d6020811015613e4357600080fd5b5050600688015460078901555b6001880154600160a01b900460ff166006811115613e6a57fe5b86604001516006811115613e7a57fe5b14613ed7578a7f21aca7f0285ccddeca2935074d3e36b5ab8fea0327f84cbbf12cf1b6d1a749f98960010160149054906101000a900460ff1660405180826006811115613ec357fe5b60ff16815260200191505060405180910390a25b6000836005811115613ee557fe5b14159b9a5050505050505050505050565b600082820282848281613f0557fe5b0414613f50576040805162461bcd60e51b81526020600482015260156024820152745265616c4d617468206d756c206f766572666c6f7760581b604482015290519081900360640190fd5b60281c9392505050565b60008165010000000000840281613f6d57fe5b049392505050565b604051806060016040528060008152602001600081526020016000151581525090565b604051806101a0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b604080516101c081018252600080825260208201819052909182019081526020016000815260200160006001600160a01b031681526020016000815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200161407d6140c8565b8152600060209091015290565b82600381019282156140b8579160200282015b828111156140b857825182559160200191906001019061409d565b506140c49291506140e6565b5090565b60405180606001604052806003906020820280388339509192915050565b61115f91905b808211156140c457600081556001016140ec565b3b15159056fe50726f706f73616c2073686f756c64206265204578656375746564206f722045787069726564496e5175657565626f6f73746564566f7465506572696f644c696d6974203e3d207175696574456e64696e67506572696f643530203c3d20717565756564566f7465526571756972656450657263656e74616765203c3d20313030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7770726f706f73616c20737461746520696e206e6f7420426f6f73746564206e6f72205175696574456e64696e67506572696f64a265627a7a723158207dc53f2f15a6fc09f540e80fabfc6e36b254cb7aba78ba21886f74b889ebf6d564736f6c634300050b0032000000000000000000000000543ff227f64aa17ea132bf9886cab5db55dcaddf
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c806372f702f31161013b578063b4512913116100b8578063c8f526e81161007c578063c8f526e814610887578063cc3bf9e9146108dc578063e5af18c514610908578063e751f27114610925578063fb6c0cbb1461094257610248565b8063b4512913146107f0578063ba51b14e14610813578063bb5a05ed14610830578063beda80151461084d578063c08351061461086a57610248565b80639525c0cc116100ff5780639525c0cc146107865780639bc5689d14610347578063a003651d146107a5578063a05ea6e4146107c2578063b2449d65146107e857610248565b806372f702f31461069c57806379a1c1f6146106c057806380f5e0a11461070357806388737b5e146107205780638894c41b1461075a57610248565b806332ed5b12116101c95780635142bc1e1161018d5780635142bc1e146105fc57806351d997b21461060457806361d585da1461060c5780636359036b1461064d578063707437681461067957610248565b806332ed5b121461044d578063359afa49146104fb5780633c133818146105335780634047487314610550578063488c65fc1461056d57610248565b80631702ef0c116102105780631702ef0c146103c057806321b4b3dc146103dd5780632d598e58146103e55780632daedd521461040857806330ca0a531461044557610248565b8063025068041461024d57806307b4e1e3146102d85780630d48344214610347578063119ce91b1461034f57806316db517214610394575b600080fd5b61026a6004803603602081101561026357600080fd5b503561095f565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526001600160a01b031661018083015251908190036101a00190f35b61033560048036036101808110156102ef57600080fd5b81019080806101600190600b806020026040519081016040528092919082600b602002808284376000920191909152509194505050356001600160a01b031690506109cf565b60408051918252519081900360200190f35b610335610ae0565b61037b6004803603604081101561036557600080fd5b50803590602001356001600160a01b0316610ae5565b6040805192835260208301919091528051918290030190f35b61037b600480360360408110156103aa57600080fd5b50803590602001356001600160a01b0316610b48565b610335600480360360208110156103d657600080fd5b5035610b79565b610335610b8b565b610335600480360360408110156103fb57600080fd5b5080359060200135610b91565b6104316004803603606081101561041e57600080fd5b5080359060208101359060400135610bde565b604080519115158252519081900360200190f35b610335610bf4565b61046a6004803603602081101561046357600080fd5b5035610ca0565b604080518e81526001600160a01b038e1660208201529081018c600681111561048f57fe5b60ff168152602081019b909b52506001600160a01b039098166040808b019190915260608a0197909752608089019590955260a088019390935260c087019190915260e08601526101008501526101208401529015156101408301525190819003610160019350915050f35b6104316004803603608081101561051157600080fd5b50803590602081013590604081013590606001356001600160a01b0316610d0e565b6103356004803603602081101561054957600080fd5b5035610e33565b6103356004803603602081101561056657600080fd5b5035610e48565b610431600480360360c081101561058357600080fd5b8135916020810135916040820135916060810135916080820135919081019060c0810160a08201356401000000008111156105bd57600080fd5b8201836020820111156105cf57600080fd5b803590602001918460018302840111640100000000831117156105f157600080fd5b509092509050610eb8565b61037b611154565b61043161115c565b6106296004803603602081101561062257600080fd5b5035611162565b6040518082600681111561063957fe5b60ff16815260200191505060405180910390f35b61037b6004803603604081101561066357600080fd5b50803590602001356001600160a01b0316611182565b6103356004803603604081101561068f57600080fd5b50803590602001356113fd565b6106a461141e565b604080516001600160a01b039092168252519081900360200190f35b6106dd600480360360208110156106d657600080fd5b503561142d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6104316004803603602081101561071957600080fd5b5035611470565b6103356004803603608081101561073657600080fd5b508035906020810135906001600160a01b03604082013581169160600135166115ad565b610335600480360361018081101561077157600080fd5b506001600160a01b0361016082013516611965565b6107a36004803603602081101561079c57600080fd5b5035611d52565b005b610335600480360360208110156107bb57600080fd5b5035611d69565b610335600480360360208110156107d857600080fd5b50356001600160a01b0316611d6f565b610335611d81565b6103356004803603604081101561080657600080fd5b5080359060200135611d86565b6106a46004803603602081101561082957600080fd5b5035611da7565b6103356004803603602081101561084657600080fd5b5035611dc2565b6103356004803603602081101561086357600080fd5b5035611dd4565b6104316004803603602081101561088057600080fd5b503561201d565b6108a46004803603602081101561089d57600080fd5b5035612028565b6040518082606080838360005b838110156108c95781810151838201526020016108b1565b5050505090500191505060405180910390f35b6108a4600480360360408110156108f257600080fd5b50803590602001356001600160a01b0316612077565b6103356004803603602081101561091e57600080fd5b50356127e8565b6104316004803603602081101561093b57600080fd5b50356127f3565b6103356004803603602081101561095857600080fd5b5035612818565b600060208190529081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01549a9b999a989997989697959694959394929391929091906001600160a01b03168d565b60008281602002015183600160200201518460026020020151856003602002015186600460200201518760056020020151886006602002015189600760200201518a600860200201518b600960200201518c600a6020020151604051602001808c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001208260405160200180838152602001826001600160a01b03166001600160a01b031660601b8152601401925050506040516020818303038152906040528051906020012090505b92915050565b600281565b600080610af0613f75565b50505060009182526001602081815260408085206001600160a01b039490941685526011909301815292829020825160608101845281548082529282015494810185905260029091015460ff16151592019190915291565b60009182526001602081815260408085206001600160a01b0394909416855260139093019052912080549101549091565b60009081526001602052604090205490565b60055481565b6000818152600260209081526040808320548584529183905282206005810154821115610bc057806005015491505b6004810154610bd5908363ffffffff61282a16565b95945050505050565b6000610bec84848433612874565b949350505050565b604080517f616464726573732047656e6573697350726f746f636f6c41646472657373000060208083019190915271189e5d195ccccc88141c9bdc1bdcd85b125960721b603e8301526b75696e7432353620566f746560a01b60508301527475696e7432353620416d6f756e74546f5374616b6560581b605c8301526c75696e74323536204e6f6e636560981b60718301528251605e818403018152607e909201909252805191012081565b600160208190526000918252604090912080549181015460028201546003830154600484015460058501546006860154600787015460088801546009890154600a8a0154600e909a01546001600160a01b03808b169b60ff600160a01b909c048c169b99909116989091168d565b600084610d1a81612c7a565b610d2357600080fd5b6000868152600160205260409020610d39613f98565b5060058082015460009081526020818152604080832081516101a0810183528154815260018201549381019390935260028101549183019190915260038101546060830152600481015460808301529283015460a0820152600683015460c0820152600783015460e082015260088301546101008201526009830154610120820152600a830154610140820152600b830154610160820152600c909201546001600160a01b0316610180830181905215610e17578161018001516001600160a01b0316336001600160a01b031614610e1057600080fd5b5084610e1a565b50335b610e2689828a8a612ced565b9998505050505050505050565b60009081526001602052604090206002015490565b6000818152600160205260408120600a01546105dc908290610e7190839063ffffffff61332416565b600085815260016020818152604080842092845260129092019052902054909150610bec90600a840290610eac90849063ffffffff61333a16565b9063ffffffff61339316565b6000808460021415610fdb5750604080517f616464726573732047656e6573697350726f746f636f6c41646472657373000060208083019190915271189e5d195ccccc88141c9bdc1bdcd85b125960721b603e8301526b75696e7432353620566f746560a01b60508301527475696e7432353620416d6f756e74546f5374616b6560581b605c8301526c75696e74323536204e6f6e636560981b60718301528251605e818403018152607e830184528051908201203060601b609e84015260b283018c905260d283018b905260f283018a90526101128084018a905284518085039091018152610132840185528051908301206101528401919091526101728084019190915283518084039091018152610192909201909252805191012061102c565b604080513060601b602080830191909152603482018c9052605482018b9052607482018a905260948083018a90528351808403909101815260b49092019092528051910120611029906133fd565b90505b600061107685858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505063ffffffff61344e169050565b90506001600160a01b0381166110d3576040805162461bcd60e51b815260206004820152601a60248201527f7374616b657220616464726573732063616e6e6f742062652030000000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205487146110f757600080fd5b6001600160a01b03811660009081526007602052604090205461112190600163ffffffff61353c16565b6001600160a01b0382166000908152600760205260409020556111468a8a8a84612874565b9a9950505050505050505050565b600160029091565b60005b90565b60009081526001602081905260409091200154600160a01b900460ff1690565b6000828152600160205260408120819060026001820154600160a01b900460ff1660068111156111ae57fe5b146111b857600080fd5b60028082015460009081526012830160209081526040808320546001600160a01b0389168452601386019092529091209182015490919015801590611201575060028301548154145b8015611211575060018360020154145b801561121c57508115155b15611238578183600701548260020154028161123457fe5b0493505b83158015906112cd5750600183015460065460408051636b8eb40360e01b81526001600160a01b039283166004820152602481018b9052905187939290921691636b8eb40391604480820192602092909190829003018186803b15801561129e57600080fd5b505afa1580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b505110155b156113f3576000600282015560068301546112ee908563ffffffff61359616565b60068085019190915560018401549054604080516317d4ebe560e31b81526001600160a01b039283166004820152898316602482015260448101889052606481018b90529051919092169163bea75f289160848083019260209291908290030181600087803b15801561136057600080fd5b505af1158015611374573d6000803e3d6000fd5b505050506040513d602081101561138a57600080fd5b505161139557600080fd5b8254600090815260036020908152604091829020548251878152925196975087966001600160a01b03808b16949216928b927fb4a37163ec93e05e09b62e52f7f2ea8cfde431802edede7dfebe53d2ad969dbb929081900390910190a45b5050509250929050565b60009182526001602090815260408084209284526012909201905290205490565b6006546001600160a01b031681565b6000908152600160208181526040808420838552601081018352818520546002808752838720549587526012909201909352818520549085529320549093919291565b600061147a614009565b60008381526001602081815260409283902083516101c08101855281548152928101546001600160a01b038116928401929092529192830190600160a01b900460ff1660068111156114c857fe5b60068111156114d357fe5b8152600282015460208201526003808301546001600160a01b0316604080840191909152600484015460608085019190915260058501546080850152600685015460a0850152600785015460c0850152600885015460e08501526009850154610100850152600a8501546101208501528151908101918290526101409093019291600b85019182845b81548152602001906001019080831161155c575050509183525050600e919091015460ff16151560209091015260c0810151815191925061159c91610b91565b6115a5846135f3565b119392505050565b6000838152602081905260408120600b01544211611603576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd081858dd1a5d99481e595d60921b604482015290519081900360640190fd5b6000848152602081905260409020546032111561161f57600080fd5b600554604080513060601b602080830191909152603480830185905283518084039091018152605490920190925280519101209061166490600163ffffffff61353c16565b60055561166f614009565b33602082810182905260408051606093841b818401526bffffffffffffffffffffffff1988851b16603482015281516028818303018152604890910182528051908301208452600381850181905261018085015142905260008a815280845282812060029081015460a08801526001600160a01b038b811660808901529587015260c086018b905285518152925290205416611762576001600160a01b038416611738578051600090815260036020526040902080546001600160a01b03191633179055611762565b8051600090815260036020526040902080546001600160a01b0319166001600160a01b0386161790555b8051600090815260046020908152604080832054898452918390528220600a015461179991606491610eac9163ffffffff61333a16565b6000888152602081905260409020600901549091506117bf90829063ffffffff61363416565b60e0830152600083815260016020818152604092839020855181559085015191810180546001600160a01b0319166001600160a01b03909316929092178083559285015185939192909160ff60a01b1916600160a01b83600681111561182157fe5b0217905550606082015160028201556080820151600380830180546001600160a01b0319166001600160a01b039093169290921790915560a0830151600483015560c0830151600583015560e08301516006830155610100830151600783015561012083015160088301556101408301516009830155610160830151600a8301556101808301516118b791600b8401919061408a565b506101a09190910151600e909101805460ff191691151591909117905560e08201516000848152600160209081526040808320600280855260129091018352818420949094558551835260038252918290205482519384526001600160a01b038a8116928501929092528383018b9052915191169185917f75b4ff136cc5de5957574c797de3334eb1c141271922b825eb071e0487ba2c5c916060908290030190a350909695505050505050565b6000606483351180159061197b57506032833510155b6119b65760405162461bcd60e51b815260040180806020018281038252602981526020018061415f6029913960400191505060405180910390fd5b613e806080840135118015906119d157506103e86080840135115b611a22576040805162461bcd60e51b815260206004820152601e60248201527f31303030203c207468726573686f6c64436f6e7374203c3d2031363030300000604482015290519081900360640190fd5b606460e08401351115611a7c576040805162461bcd60e51b815260206004820181905260248201527f766f7465727352657075746174696f6e4c6f7373526174696f203c3d20313030604482015290519081900360640190fd5b60a083013560408401351015611ac35760405162461bcd60e51b815260040180806020018281038252602b815260200180614134602b913960400191505060405180910390fd5b610100830135611b1a576040805162461bcd60e51b815260206004820152601e60248201527f6d696e696d756d44616f426f756e74792073686f756c64206265203e20300000604482015290519081900360640190fd5b610120830135611b71576040805162461bcd60e51b815260206004820152601c60248201527f64616f426f756e7479436f6e73742073686f756c64206265203e203000000000604482015290519081900360640190fd5b6000611ba784600b806020026040519081016040528092919082600b602002808284376000920191909152508691506109cf9050565b905060ac60026107d05b613e80811015611bf957608087013581108015611bd5575060028102608088013511155b15611beb57818381611be357fe5b049250611bf9565b600190910190600202611bb1565b50604080516101a0810182528735815260208089013590820152878201359181019190915260608088013590820152608080820190611c46908901356001600160d81b03166103e8613644565b81526020810184905260a088810135604083015260c0808a0135606084015260e0808b013560808501526101008b0135928401929092526101208a0135908301520187600a6020908102919091013582526001600160a01b03978816918101919091526000858152808252604090819020835181559183015160018301558201516002820155606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a820155610160820151600b82015561018090910151600c90910180546001600160a01b0319169190961617909455509392505050565b80611d5c81612c7a565b611d6557600080fd5b5050565b50600290565b60076020526000908152604090205481565b600181565b6000918252600160209081526040808420928452600f909201905290205490565b6003602052600090815260409020546001600160a01b031681565b60046020526000908152604090205481565b600081815260016020526040812060056001820154600160a01b900460ff166006811115611dfe57fe5b1480611e23575060066001820154600160a01b900460ff166006811115611e2157fe5b145b611e5e5760405162461bcd60e51b81526004018080602001828103825260338152602001806141a96033913960400191505060405180910390fd5b611e6783613667565b611eb8576040805162461bcd60e51b815260206004820152601760248201527f70726f706f73616c206e65656420746f20657870697265000000000000000000604482015290519081900360640190fd5b611ee4611ed7600b83016001015460048401549063ffffffff61353c16565b429063ffffffff61359616565b600a820155611ef283610e48565b6008820154909250611f0a908363ffffffff61359616565b60088201556006546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015611f6357600080fd5b505af1158015611f77573d6000803e3d6000fd5b505050506040513d6020811015611f8d57600080fd5b5051611fe0576040805162461bcd60e51b815260206004820152601d60248201527f7472616e7366657220746f206d73672e73656e646572206661696c6564000000604482015290519081900360640190fd5b604080518381529051339185917f7468017f6ff596af88244327e88fe691ac48cc1db88b033d11c335f2c7ccdd039181900360200190a350919050565b6000610ada82612c7a565b6120306140c8565b60008281526001602052604090819020815160608101909252600b0160038282826020028201915b8154815260200190600101908083116120585750505050509050919050565b61207f6140c8565b600083815260016020526040902060026001820154600160a01b900460ff1660068111156120a957fe5b14806120cd5750600180820154600160a01b900460ff1660068111156120cb57fe5b145b6121085760405162461bcd60e51b815260040180806020018281038252602d815260200180614107602d913960400191505060405180910390fd5b612110613f98565b5060058082015460009081526020818152604080832081516101a081018352815481526001820154818501526002808301548285015260038301546060830152600483015460808301529582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c909101546001600160a01b03908116610180830152881684526013860183528184209486015484526012860190925282205490929161221c6121e689610e48565b6001600090815260128801602052604080822054600283529120546122109163ffffffff61353c16565b9063ffffffff61359616565b6001840154909150156122e757600180860154600160a01b900460ff16600681111561224457fe5b141561225657600183015486526122df565b6002850154835414156122df578254600114156122bd5780856007015410156122b857600061229286600701548361359690919063ffffffff16565b9050826122ac82866001015461333a90919063ffffffff16565b816122b357fe5b048752505b6122df565b600183015482906122d4908363ffffffff61333a16565b816122db57fe5b0486525b600060018401555b600e85015460ff16158015612317575084546000908152600360205260409020546001600160a01b038881169116145b801561233c5750600180860154600160a01b900460ff16600681111561233957fe5b14155b801561234c575060028560020154145b1561239d57600785015461238b906122108461236e838663ffffffff61333a16565b8161237557fe5b048960005b60200201519063ffffffff61353c16565b8652600e8501805460ff191660011790555b6001600160a01b038716600090815260118601602052604090206001810154158015906123ce5750600281015460ff165b1561250d57600180870154600160a01b900460ff1660068111156123ee57fe5b1415612424576064612412866101000151836001015461333a90919063ffffffff16565b8161241957fe5b046020880152612505565b80546002870154141561250557600060018760020154141561245957506002600090815260108701602052604090205461246e565b50600160009081526010870160205260409020545b60646124888761010001518361333a90919063ffffffff16565b8161248f57fe5b6002890154600090815260108a01602052604090205460018501549290910492506124fe916124c4908463ffffffff61333a16565b816124cb57fe5b0460646124ea896101000151866001015461333a90919063ffffffff16565b816124f157fe5b049063ffffffff61353c16565b6020890152505b600060018201555b60038601546001600160a01b038981169116148015612530575060018660020154145b8015612548575060038601546001600160a01b031615155b1561256a5760e085015160408801526003860180546001600160a01b03191690555b8651156126b7578651600887015461258191613596565b600887015560065487516040805163a9059cbb60e01b81526001600160a01b038c8116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156125df57600080fd5b505af11580156125f3573d6000803e3d6000fd5b505050506040513d602081101561260957600080fd5b505161265c576040805162461bcd60e51b815260206004820152601e60248201527f7472616e7366657220746f2062656e6566696369617279206661696c65640000604482015290519081900360640190fd5b8554600090815260036020908152604091829020548951835190815292516001600160a01b038c8116949216928d927f6d26871c9f457d104b2122485f659f126f7a0cf6938cf20482c03f49794a2fbf929081900390910190a45b60408701516126c89088600161237a565b156127dc5760018601546001600160a01b031663d29b5d2f6126f389600260200201518a600161237a565b8a8c6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561274b57600080fd5b505af115801561275f573d6000803e3d6000fd5b505050506040513d602081101561277557600080fd5b505085546000908152600360205260409020546001600160a01b03808a1691168a7f7419b736daacf66d5c1645948c956fca2b83be1e2e02d486d65713f289d683b86127ca8b600260200201518c600161237a565b60408051918252519081900360200190a45b50505050505092915050565b6000610ada826135f3565b6000816127ff81612c7a565b61280857600080fd5b61281183613667565b9392505050565b60026020526000908152604090205481565b60008282650100000000005b8115610bd5578160011660011415612855576128528184613ef6565b90505b60019190911c90811561286f5761286c8384613ef6565b92505b612836565b6000600284111580156128875750600084115b6128cb576040805162461bcd60e51b815260206004820152601060248201526f77726f6e6720766f74652076616c756560801b604482015290519081900360640190fd5b60008311612920576040805162461bcd60e51b815260206004820152601b60248201527f7374616b696e6720616d6f756e742073686f756c64206265203e300000000000604482015290519081900360640190fd5b61292985613667565b1561293657506001610bec565b600085815260016020526040902060046001820154600160a01b900460ff16600681111561296057fe5b14158015612988575060036001820154600160a01b900460ff16600681111561298557fe5b14155b15612997576000915050610bec565b6001600160a01b038316600090815260138201602052604090206001810154158015906129c5575080548614155b156129d557600092505050610bec565b600654604080516323b872dd60e01b81526001600160a01b038781166004830152306024830152604482018990529151889392909216916323b872dd916064808201926020929091908290030181600087803b158015612a3457600080fd5b505af1158015612a48573d6000803e3d6000fd5b505050506040513d6020811015612a5e57600080fd5b5051612ab1576040805162461bcd60e51b815260206004820152601960248201527f6661696c207472616e736665722066726f6d207374616b657200000000000000604482015290519081900360640190fd5b6008830154612ac6908263ffffffff61353c16565b60088401556001820154612ae0908263ffffffff61353c16565b60018301819055600160801b1015612b3f576040805162461bcd60e51b815260206004820152601a60248201527f7374616b696e6720616d6f756e7420697320746f6f2068696768000000000000604482015290519081900360640190fd5b6006830154612b5990600160801b9063ffffffff61359616565b83600801541115612bb1576040805162461bcd60e51b815260206004820152601860248201527f746f74616c207374616b657320697320746f6f20686967680000000000000000604482015290519081900360640190fd5b6001871415612bd5576002820154612bcf908263ffffffff61353c16565b60028301555b8682556000878152601284016020526040902054612bfa90829063ffffffff61353c16565b60008881526012850160209081526040808320939093558554825260038152908290205482518a815291820189905282516001600160a01b03808a16949216928c927fd0239d7d4acf51def4507fa173be466927de5d75d8b10d840cd6994d6e10231092918290030190a4612c6e88613667565b98975050505050505050565b600081815260016020819052604082200154600160a01b900460ff166004816006811115612ca457fe5b1480612cbb57506005816006811115612cb957fe5b145b80612cd157506006816006811115612ccf57fe5b145b8061281157506003816006811115612ce557fe5b149392505050565b600060028311158015612d005750600083115b612d42576040805162461bcd60e51b815260206004820152600e60248201526d18101e102fbb37ba32901e1e901960911b604482015290519081900360640190fd5b612d4b85613667565b15612d5857506001610bec565b612d60613f98565b506000858152600160208181526040808420600580820154865285845282862083516101a0810185528154815281870154818701526002820154818601526003820154606082015260048083015460808301529282015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b820154610160820152600c909101546001600160a01b039081166101808301528c8852868652958301548451634ac41bc760e11b81528c881693810193909352602483018d905293519096929592949390921692639588378e92604480840193829003018186803b158015612e6757600080fd5b505afa158015612e7b573d6000803e3d6000fd5b505050506040513d6020811015612e9157600080fd5b5051905080612ee7576040805162461bcd60e51b815260206004820152601b60248201527f5f766f746572206d75737420686176652072657075746174696f6e0000000000604482015290519081900360640190fd5b84811015612f31576040805162461bcd60e51b8152602060048201526012602482015271072657075746174696f6e203e3d205f7265760741b604482015290519081900360640190fd5b8480612f3a5750805b6001600160a01b038816600090815260118401602052604090206001015415612f6a576000945050505050610bec565b6000878152600f84016020526040902054612f8c90829063ffffffff61353c16565b6000888152600f8501602052604080822083905560028601548252812054908990521080612fe457506002808401546000908152600f8501602052604080822054928252902054148015612fe4575060018360020154145b156130f35760056001840154600160a01b900460ff16600681111561300557fe5b148015613025575060c0840151604085015103600b840160010154420310155b80613049575060066001840154600160a01b900460ff16600681111561304757fe5b145b156130eb5760066001840154600160a01b900460ff16600681111561306a57fe5b146130e45760c0840151600484015560018301805460ff60a01b1916600360a11b17908190556040518a917f21aca7f0285ccddeca2935074d3e36b5ab8fea0327f84cbbf12cf1b6d1a749f991600160a01b90910460ff1690808260068111156130d057fe5b60ff16815260200191505060405180910390a25b42600c8401555b600283018790555b604080516060810182528881526020810183905290810160046001860154600160a01b900460ff16600681111561312657fe5b148061314b575060036001860154600160a01b900460ff16600681111561314957fe5b145b151590526001600160a01b0389166000908152601185016020908152604091829020835181559083015160018201559101516002909101805460ff191691151591909117905560046001840154600160a01b900460ff1660068111156131ad57fe5b14806131d2575060036001840154600160a01b900460ff1660068111156131d057fe5b145b156132bf5760008781526010840160205260409020546131f990829063ffffffff61353c16565b6000888152601085016020526040812091909155610100850151606490613226908463ffffffff61333a16565b8161322d57fe5b600186015460408051637c0fc5fb60e11b815293909204600484018190526001600160a01b038d81166024860152604485018f9052925190945091169163f81f8bf69160648083019260209291908290030181600087803b15801561329157600080fd5b505af11580156132a5573d6000803e3d6000fd5b505050506040513d60208110156132bb57600080fd5b5050505b82546000908152600360209081526040918290205482518a815291820184905282516001600160a01b03808d16949216928d927f066c061a3792cb3eb64a441a928655fcbafb4a54b49725fe9cd2951df5e7189e92918290030190a4610e2689613667565b60008183106133335781612811565b5090919050565b60008261334957506000610ada565b8282028284828161335657fe5b04146128115760405162461bcd60e51b81526004018080602001828103825260218152602001806141886021913960400191505060405180910390fd5b60008082116133e9576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816133f457fe5b04949350505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b6000815160411461346157506000610ada565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156134a75760009350505050610ada565b8060ff16601b141580156134bf57508060ff16601c14155b156134d05760009350505050610ada565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015613527573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600082820183811015612811576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000828211156135ed576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008181526001602081815260408084206002855260128101909252808420549284528320549091612811916001600160d81b03169063ffffffff61364416565b6000818310156133335781612811565b60006128116001600160d81b038085166501000000000090810291851602613f5a565b60008161367381612c7a565b61367c57600080fd5b6000838152600160205260409020613692613f98565b506005808201546000908152602081815260409182902082516101a0810184528154815260018201549281019290925260028101549282019290925260038201546060820152600482015460808201529181015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a810154610140830152600b810154610160830152600c01546001600160a01b0316610180820152613746614009565b604080516101c0810182528454815260018501546001600160a01b03811660208301529091859190830190600160a01b900460ff16600681111561378657fe5b600681111561379157fe5b8152600282015460208201526003808301546001600160a01b0316604080840191909152600484015460608085019190915260058501546080850152600685015460a0850152600785015460c0850152600885015460e08501526009850154610100850152600a8501546101208501528151908101918290526101409093019291600b85019182845b81548152602001906001019080831161381a575050509183525050600e919091015460ff16151560209182015260018501546040805163b551c37360e01b8152600481018b905290519394506000936001600160a01b039092169263b551c37392602480840193829003018186803b15801561389557600080fd5b505afa1580156138a9573d6000803e3d6000fd5b505050506040513d60208110156138bf57600080fd5b5051835160028601546000908152600f8701602052604081205492935060648404909102918190819084101561396c5760036001890154600160a01b900460ff16600681111561390b57fe5b141561391a576001925061394a565b60046001890154600160a01b900460ff16600681111561393657fe5b1415613945576003925061394a565b600592505b6001880180546002919060ff60a01b1916600160a01b835b0217905550613bb3565b60036001890154600160a01b900460ff16600681111561398857fe5b1415613a0a576020870151600b8901544203106139c35760018801805460ff60a01b1916600160a01b17905560028089018190559250613a0a565b6139d588600501548960000154610b91565b9050806139e18c6135f3565b1115613a0a5760018801805460ff60a01b1916600160a21b17905542600d890155600988018190555b60046001890154600160a01b900460ff166006811115613a2657fe5b1415613bb357613a3e88600501548960000154610b91565b6060880151909150600b890160020154420310613b245780613a5f8c6135f3565b1115613b035787546000908152600260205260409020546110001115613afe576001888101805460ff60a01b1916600560a01b17905542600c8a01558854600090815260026020818152604080842080549095019094558b54835260048152838320548282528484205492845260128d0190915292909120549193509083900381613ae657fe5b89546000908152600460205260409020919005830190555b613b1f565b6001880180546003919060ff60a01b1916600160a01b83613962565b613bb3565b6000613b2f8c6135f3565b60098a0154909150613b47908363ffffffff61332416565b8111613b675760018901805460ff60a01b1916600360a01b179055613bb1565b8089600901541115613bb157600989018290556040805183815290518d917fad767d61af51c7895fa3cc0497dde01afb610c74e55ee4d8a71fa5e3ee136d54919081900360200190a25b505b60056001890154600160a01b900460ff166006811115613bcf57fe5b1480613bf4575060066001890154600160a01b900460ff166006811115613bf257fe5b145b15613c24576004880154600c890154420310613c245760018801805460ff60a01b1916600160a11b179055600492505b6000836005811115613c3257fe5b14613e50576004836005811115613c4557fe5b1480613c5c57506005836005811115613c5a57fe5b145b15613d17578551600090815260026020526040902054613c8390600163ffffffff61359616565b86516000908152600260205260408082209290925587518152205480613cb9578854600090815260046020526040812055613d15565b88546000908152600460209081526040808320546002845260128d01909252909120549093508190613cf890612210866001850163ffffffff61333a16565b81613cff57fe5b8a54600090815260046020526040902091900490555b505b87546000908152600360209081526040918290205460028b0154835190815291820188905282516001600160a01b03909116928e927f37471b9c9d295ffb1309ad070b8964700bfb7b555e8e8292d0b6cbc7dba35d10929081900390910190a38a7f46a713b994c752c68fbefa9048bec9a0010cc7d933ad95a3c3dbb25931a167e78460405180826005811115613daa57fe5b60ff16815260200191505060405180910390a26001880154600289015460408051639d4c162d60e01b8152600481018f90526024810192909252516001600160a01b0390921691639d4c162d916044808201926020929091908290030181600087803b158015613e1957600080fd5b505af1158015613e2d573d6000803e3d6000fd5b505050506040513d6020811015613e4357600080fd5b5050600688015460078901555b6001880154600160a01b900460ff166006811115613e6a57fe5b86604001516006811115613e7a57fe5b14613ed7578a7f21aca7f0285ccddeca2935074d3e36b5ab8fea0327f84cbbf12cf1b6d1a749f98960010160149054906101000a900460ff1660405180826006811115613ec357fe5b60ff16815260200191505060405180910390a25b6000836005811115613ee557fe5b14159b9a5050505050505050505050565b600082820282848281613f0557fe5b0414613f50576040805162461bcd60e51b81526020600482015260156024820152745265616c4d617468206d756c206f766572666c6f7760581b604482015290519081900360640190fd5b60281c9392505050565b60008165010000000000840281613f6d57fe5b049392505050565b604051806060016040528060008152602001600081526020016000151581525090565b604051806101a0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b604080516101c081018252600080825260208201819052909182019081526020016000815260200160006001600160a01b031681526020016000815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200161407d6140c8565b8152600060209091015290565b82600381019282156140b8579160200282015b828111156140b857825182559160200191906001019061409d565b506140c49291506140e6565b5090565b60405180606001604052806003906020820280388339509192915050565b61115f91905b808211156140c457600081556001016140ec565b3b15159056fe50726f706f73616c2073686f756c64206265204578656375746564206f722045787069726564496e5175657565626f6f73746564566f7465506572696f644c696d6974203e3d207175696574456e64696e67506572696f643530203c3d20717565756564566f7465526571756972656450657263656e74616765203c3d20313030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7770726f706f73616c20737461746520696e206e6f7420426f6f73746564206e6f72205175696574456e64696e67506572696f64a265627a7a723158207dc53f2f15a6fc09f540e80fabfc6e36b254cb7aba78ba21886f74b889ebf6d564736f6c634300050b0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000543ff227f64aa17ea132bf9886cab5db55dcaddf
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000543ff227f64aa17ea132bf9886cab5db55dcaddf
Deployed Bytecode Sourcemap
56473:10265:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56473:10265:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24655:46;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24655:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24655:46:0;;;;;;;;;;;;;;41601:801;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;41601:801:0;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41601:801:0;;-1:-1:-1;;;41601:801:0;-1:-1:-1;;;;;41601:801:0;;-1:-1:-1;41601:801:0;:::i;:::-;;;;;;;;;;;;;;;;25228:30;;;:::i;62483:214::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62483:214:0;;;;;;-1:-1:-1;;;;;62483:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;64698:217;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64698:217:0;;;;;;-1:-1:-1;;;;;64698:217:0;;:::i;64282:150::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64282:150:0;;:::i;25303:27::-;;;:::i;41121:393::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41121:393:0;;;;;;;:::i;57473:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57473:164:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56699:227;;;:::i;24748:43::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24748:43:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;24748:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24748:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24748:43:0;-1:-1:-1;;24748:43:0;60199:568;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;60199:568:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60199:568:0;;:::i;65463:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65463:133:0;;:::i;39904:355::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39904:355:0;;:::i;58263:1552::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;58263:1552:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;58263:1552:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;58263:1552:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;58263:1552:0;;-1:-1:-1;58263:1552:0;-1:-1:-1;58263:1552:0;:::i;66344:119::-;;;:::i;66040:85::-;;;:::i;65780:127::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65780:127:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38285:1422;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38285:1422:0;;;;;;-1:-1:-1;;;;;38285:1422:0;;:::i;65142:148::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65142:148:0;;;;;;;:::i;25366:26::-;;;:::i;:::-;;;;-1:-1:-1;;;;;25366:26:0;;;;;;;;;;;;;;63712:368;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63712:368:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40452:233;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40452:233:0;;:::i;26816:1991::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;26816:1991:0;;;;;;;;-1:-1:-1;;;;;26816:1991:0;;;;;;;;;;;;:::i;31213:1871::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;31213:1871:0;;;;;;:::i;60990:126::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60990:126:0;;:::i;:::-;;61682:108;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61682:108:0;;:::i;56935:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56935:44:0;-1:-1:-1;;;;;56935:44:0;;:::i;25265:31::-;;;:::i;62960:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62960:152:0;;;;;;;:::i;24965:60::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24965:60:0;;:::i;25086:86::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25086:86:0;;:::i;29308:941::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29308:941:0;;:::i;63275:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63275:117:0;;:::i;61969:145::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61969:145:0;;:::i;:::-;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;61969:145:0;;;;;;;;;;;;;;;;33657:4120;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33657:4120:0;;;;;;-1:-1:-1;;;;;33657:4120:0;;:::i;66624:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66624:111:0;;:::i;61388:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61388:129:0;;:::i;24861:52::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24861:52:0;;:::i;24655:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24655:46:0;;:::o;41601:801::-;41793:7;42037;41793;42037:10;;;;42066:7;42074:1;42066:10;;;;42095:7;42103:1;42095:10;;;;42124:7;42132:1;42124:10;;;;42153:7;42161:1;42153:10;;;;42182:7;42190:1;42182:10;;;;42211:7;42219:1;42211:10;;;;42240:7;42248:1;42240:10;;;;42269:7;42277:1;42269:10;;;;42298:7;42306:1;42298:10;;;;42327:7;42335:2;42327:11;;;;42002:337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42002:337:0;;;41978:376;;;;;;42369:13;41947:446;;;;;;;;;;;-1:-1:-1;;;;;41947:446:0;-1:-1:-1;;;;;41947:446:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41947:446:0;;;41923:471;;;;;;41916:478;;41601:801;;;;;:::o;25228:30::-;25257:1;25228:30;:::o;62483:214::-;62560:4;62566;62583:18;;:::i;:::-;-1:-1:-1;;;62604:22:0;;;;:9;:22;;;;;;;;-1:-1:-1;;;;;62604:37:0;;;;;;:29;;;;:37;;;;;;62583:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62483:214::o;64698:217::-;64777:7;64814:22;;;:9;:22;;;;;;;;-1:-1:-1;;;;;64814:39:0;;;;;;:30;;;;:39;;;;:44;;64860:46;;;64814:44;;64698:217::o;64282:150::-;64358:7;64386:22;;;:9;:22;;;;;:37;;64282:150::o;25303:27::-;;;;:::o;41121:393::-;41206:7;41242:39;;;:22;:39;;;;;;;;;41320:23;;;;;;;;;41368:25;;;;41360:33;;41356:99;;;41418:6;:25;;;41410:33;;41356:99;41474:21;;;;:32;;41500:5;41474:32;:25;:32;:::i;:::-;41467:39;41121:393;-1:-1:-1;;;;;41121:393:0:o;57473:164::-;57558:4;57582:47;57589:11;57602:5;57609:7;57618:10;57582:6;:47::i;:::-;57575:54;57473:164;-1:-1:-1;;;;57473:164:0:o;56699:227::-;56763:162;;;;;;;;;;;;-1:-1:-1;;;56763:162:0;;;;-1:-1:-1;;;56763:162:0;;;;-1:-1:-1;;;56763:162:0;;;;-1:-1:-1;;;56763:162:0;;;;;;22:32:-1;26:21;;;22:32;6:49;;56763:162:0;;;;;;;56753:173;;;;;56699:227;:::o;24748:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24748:43:0;;;;;-1:-1:-1;;;24748:43:0;;;;;;;;;;;;;;;:::o;60199:568::-;60335:4;60309:11;26454:23;26465:11;26454:10;:23::i;:::-;26446:32;;;;;;60352:25;60380:22;;;:9;:22;;;;;60413:24;;:::i;:::-;-1:-1:-1;60451:19:0;;;;;60440:10;:31;;;;;;;;;;;60413:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60413:58:0;;;;;;;60510:33;60506:188;;60582:6;:19;;;-1:-1:-1;;;;;60568:33:0;:10;-1:-1:-1;;;;;60568:33:0;;60560:42;;;;;;-1:-1:-1;60625:6:0;60506:188;;;-1:-1:-1;60672:10:0;60506:188;60711:48;60724:11;60737:5;60744;60751:7;60711:12;:48::i;:::-;60704:55;60199:568;-1:-1:-1;;;;;;;;;60199:568:0:o;65463:133::-;65527:7;65554:22;;;:9;:22;;;;;:34;;;;65463:133::o;39904:355::-;39976:7;40095:22;;;:9;:22;;;;;:59;;;40020:4;;39976:7;;40065:90;;40020:4;;40065:90;:29;:90;:::i;:::-;40191:22;;;;:9;:22;;;;;;;;:34;;;:29;;;;:34;;;;;40035:120;;-1:-1:-1;40173:78:0;;40248:2;40231:19;;;40173:53;;40035:120;;40173:53;:17;:53;:::i;:::-;:57;:78;:57;:78;:::i;58263:1552::-;58511:4;58585:24;58624:14;58642:1;58624:19;58620:779;;;-1:-1:-1;56763:162:0;;;;;;;;;;;;-1:-1:-1;;;56763:162:0;;;;-1:-1:-1;;;56763:162:0;;;;-1:-1:-1;;;56763:162:0;;;;-1:-1:-1;;;56763:162:0;;;;;;22:32:-1;26:21;;;22:32;6:49;;56763:162:0;;;;;56753:173;;;;;;58857:4;58806:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;58806:194:0;;;;;58770:253;;;;;;58707:335;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;58707:335:0;;;;;;;58679:378;;;;;58620:779;;;59145:194;;;59196:4;59145:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;59145:194:0;;;;;;;59109:253;;;;;:278;;:276;:278::i;:::-;59090:297;;58620:779;59409:14;59426:36;59451:10;;59426:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;59426:16:0;;:36;-1:-1:-1;;59426:36:0;:24;:36;;-1:-1:-1;59426:36:0:i;:::-;59409:53;-1:-1:-1;;;;;;59587:20:0;;59579:59;;;;;-1:-1:-1;;;59579:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59657:19:0;;;;;;:11;:19;;;;;;:29;;59649:38;;;;;;-1:-1:-1;;;;;59720:19:0;;;;;;:11;:19;;;;;;:26;;59744:1;59720:26;:23;:26;:::i;:::-;-1:-1:-1;;;;;59698:19:0;;;;;;:11;:19;;;;;:48;59764:43;59771:11;59784:5;59791:7;59710:6;59764;:43::i;:::-;59757:50;58263:1552;-1:-1:-1;;;;;;;;;;58263:1552:0:o;66344:119::-;25295:1;25257;66344:119;;:::o;66040:85::-;66088:4;66040:85;;:::o;65780:127::-;65838:13;65871:22;;;:9;:22;;;;;;;;:28;;-1:-1:-1;;;65871:28:0;;;;;65780:127::o;38285:1422::-;38378:22;38466;;;:9;:22;;;;;38378;;38525;38507:14;;;;-1:-1:-1;;;38507:14:0;;;;:40;;;;;;;;;38499:49;;;;;;38604:20;;;;;38559:26;38588:37;;;:15;;;:37;;;;;;;;;-1:-1:-1;;;;;38660:30:0;;;;:16;;;:30;;;;;;38720:20;;;;38588:37;;38660:30;38720:24;;;;38719:79;;-1:-1:-1;38777:20:0;;;;38762:11;;:35;38719:79;:124;;;;;25295:1;38815:8;:20;;;:27;38719:124;:165;;;;-1:-1:-1;38860:23:0;;;38719:165;38701:325;;;38992:18;38972:8;:18;;;38949:6;:20;;;:41;38948:62;;;;;;38930:80;;38701:325;39041:20;;;;;39040:173;;-1:-1:-1;39111:18:0;;;;39167:12;;39079:114;;;-1:-1:-1;;;39079:114:0;;-1:-1:-1;;;;;39167:12:0;;;39079:114;;;;;;;;;;;;39197:15;;39111:18;;;;;39079:87;;:114;;;;;;;;;;;;;;;39111:18;39079:114;;;5:2:-1;;;;30:1;27;20:12;5:2;39079:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39079:114:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39079:114:0;:133;;39040:173;39036:664;;;39253:1;39230:20;;;:24;39296;;;;:45;;39325:15;39296:45;:28;:45;:::i;:::-;39269:24;;;;:72;;;;39410:18;;;;39465:12;;39378:144;;;-1:-1:-1;;;39378:144:0;;-1:-1:-1;;;;;39465:12:0;;;39378:144;;;;;;;;;;;;;;;;;;;;;;;;;39410:18;;;;;39378:86;;:144;;;;;;;;;;;;;;39410:18;;39378:144;;;5:2:-1;;;;30:1;27;20:12;5:2;39378:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39378:144:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39378:144:0;39356:167;;;;;;39633:23;;39619:38;;;;:13;:38;;;;;;;;;;39590:98;;;;;;;39555:15;;-1:-1:-1;39555:15:0;;-1:-1:-1;;;;;39590:98:0;;;;39619:38;;;39606:11;;39590:98;;;;;;;;;;;39036:664;38285:1422;;;;;;;;:::o;65142:148::-;65219:7;65246:22;;;:9;:22;;;;;;;;:36;;;:29;;;;:36;;;;;;65142:148::o;25366:26::-;;;-1:-1:-1;;;;;25366:26:0;;:::o;63712:368::-;63779:7;63852:22;;;:9;:22;;;;;;;;:43;;;:38;;;:43;;;;;;25257:1;63914:42;;;;;;;63975:34;;;:29;;;;:34;;;;;;;64028:33;;;;;;63852:43;;63914:42;;63975:34;63712:368::o;40452:233::-;40514:4;40531:24;;:::i;:::-;40558:22;;;;:9;:22;;;;;;;;;40531:49;;;;;;;;;;;;;;;-1:-1:-1;;;;;40531:49:0;;;;;;;;;;;;;;-1:-1:-1;;;40531:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40531:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40531:49:0;;;-1:-1:-1;;40531:49:0;;;;;;;;;;;;;;;40631:19;;;;40652:23;;40531:49;;-1:-1:-1;40621:55:0;;:9;:55::i;:::-;40599:19;40606:11;40599:6;:19::i;:::-;:77;;40452:233;-1:-1:-1;;;40452:233:0:o;26816:1991::-;26940:7;27032:23;;;;;;;;;;:38;;;27026:3;:44;27018:71;;;;;-1:-1:-1;;;27018:71:0;;;;;;;;;;;;-1:-1:-1;;;27018:71:0;;;;;;;;;;;;;;;27147:10;:23;;;;;;;;;;:52;27203:2;-1:-1:-1;27147:58:0;27139:67;;;;;;27305:12;;27282:36;;;27299:4;27282:36;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27282:36:0;;;;;;;27272:47;;;;;;27345:19;;27362:1;27345:19;:16;:19;:::i;:::-;27330:12;:34;27403:24;;:::i;:::-;27459:10;27438:18;;;;:31;;;27516:43;;;;;;;;;;;-1:-1:-1;;27516:43:0;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;27516:43:0;;;;;;27506:54;;;;;;27480:80;;27590:20;27573:14;;;:37;;;27676:14;;;;27696:3;27676:23;;-1:-1:-1;27767:23:0;;;;;;;;;:46;;;;;27726:38;;;:87;-1:-1:-1;;;;;27824:29:0;;;:17;;;:29;27864:20;;;:25;27900:19;;;:33;;;27962:23;;27948:38;;;;;;;;27944:298;;-1:-1:-1;;;;;28021:27:0;;28017:214;;28083:23;;28069:38;;;;:13;:38;;;;;:51;;-1:-1:-1;;;;;;28069:51:0;28110:10;28069:51;;;28017:214;;;28175:23;;28161:38;;;;:13;:38;;;;;:54;;-1:-1:-1;;;;;;28161:54:0;-1:-1:-1;;;;;28161:54:0;;;;;28017:214;28379:23;;28279:17;28351:52;;;:27;:52;;;;;;;;;28308:23;;;;;;;;;:38;;;:105;;28409:3;;28308:96;;;:42;:96;:::i;:105::-;28465:10;:23;;;;;;;;;;:40;;;28279:134;;-1:-1:-1;28451:55:0;;28279:134;;28451:55;:13;:55;:::i;:::-;28424:24;;;:82;28517:21;;;;:9;:21;;;;;;;;;:32;;;;;;;;;;;;;-1:-1:-1;;;;;;28517:32:0;-1:-1:-1;;;;;28517:32:0;;;;;;;;;;;;;;28424:24;;28517:21;;:32;;-1:-1:-1;;;;28517:32:0;-1:-1:-1;;;28517:32:0;;;;;;;;;;;;;-1:-1:-1;28517:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28517:32:0;-1:-1:-1;;;;;28517:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28517:32:0;;;;;;;;;;;;-1:-1:-1;;28517:32:0;;;;;;;;;;28595:24;;;;-1:-1:-1;28560:21:0;;;-1:-1:-1;28560:21:0;;;;;;;;25257:1;28560:32;;;:28;;;;:32;;;;;:59;;;;28706:23;;28692:38;;:13;:38;;;;;;;28668:103;;;;;-1:-1:-1;;;;;28668:103:0;;;;;;;;;;;;;;;;;;28692:38;;;28560:21;;28668:103;;;;;;;;;;-1:-1:-1;28789:10:0;;26816:1991;-1:-1:-1;;;;;;26816:1991:0:o;31213:1871::-;31384:7;31431:3;31417:10;;:17;;;;:37;;-1:-1:-1;31452:2:0;31438:10;;:16;;31417:37;31409:91;;;;-1:-1:-1;;;31409:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31533:5;31519:10;;;;:19;;;;:40;;-1:-1:-1;31555:4:0;31542:10;;;;:17;31519:40;31511:83;;;;;-1:-1:-1;;;31511:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31627:3;31613:10;;;;:17;;31605:62;;;;;-1:-1:-1;;;31605:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31700:10;;;;31686;;;;:24;;31678:80;;;;-1:-1:-1;;;31678:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31777:10;;;;31769:57;;;;;-1:-1:-1;;;31769:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31845:10;;;;31837:55;;;;;-1:-1:-1;;;31837:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31905:18;31926:41;31944:7;31926:41;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31953:13:0;;-1:-1:-1;31926:17:0;;-1:-1:-1;31926:41:0:i;:::-;31905:62;-1:-1:-1;32073:3:0;32126:1;32155:4;32138:222;32165:5;32161:1;:9;32138:222;;;32201:10;;;;:14;-1:-1:-1;32200:39:0;;;;-1:-1:-1;32237:1:0;32235:3;;32221:10;;;;:17;;32200:39;32196:135;;;32290:1;32276:13;:15;;;;;;32260:31;;32310:5;;32196:135;32345:3;;;;;32178:1;32176:3;32138:222;;;-1:-1:-1;32397:651:0;;;;;;;;32453:10;;32397:651;;32453:10;32501;;;;32397:651;;;;32550:10;;;;32397:651;;;;;;;;32602:10;;;;32397:651;;;;;;;;;32642:43;;32650:10;;;-1:-1:-1;;;;;32642:28:0;32679:4;32642:28;:43::i;:::-;32397:651;;;;;;;;32766:10;;;;;32397:651;;;;32811:10;;;;;32397:651;;;;32862:10;;;;;32397:651;;;;32904:10;;;;32397:651;;;;;;;32944:10;;;;32397:651;;;;;32766:10;32992:2;32984:11;;;;;;;;;32397:651;;-1:-1:-1;;;;;32397:651:0;;;;;;;;;;-1:-1:-1;32372:22:0;;;;;;;;;;;:676;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32372:676:0;;;;;;;;;-1:-1:-1;32372:22:0;31213:1871;-1:-1:-1;;;31213:1871:0:o;60990:126::-;61048:11;26454:23;26465:11;26454:10;:23::i;:::-;26446:32;;;;;;60990:126;;:::o;61682:108::-;-1:-1:-1;25220:1:0;;61682:108::o;56935:44::-;;;;;;;;;;;;;:::o;25265:31::-;25295:1;25265:31;:::o;62960:152::-;63040:7;63067:22;;;:9;:22;;;;;;;;:37;;;:28;;;;:37;;;;;;62960:152::o;24965:60::-;;;;;;;;;;;;-1:-1:-1;;;;;24965:60:0;;:::o;25086:86::-;;;;;;;;;;;;;:::o;29308:941::-;29370:28;29439:22;;;:9;:22;;;;;29498:21;29480:14;;;;-1:-1:-1;;;29480:14:0;;;;:39;;;;;;;;;:92;;;-1:-1:-1;29541:31:0;29523:14;;;;-1:-1:-1;;;29523:14:0;;;;:49;;;;;;;;;29480:92;29472:165;;;;-1:-1:-1;;;29472:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29656:21;29665:11;29656:8;:21::i;:::-;29648:57;;;;;-1:-1:-1;;;29648:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29830:70;29838:61;29881:14;;;29896:1;29881:17;;29838:38;;;;;:61;:42;:61;:::i;:::-;29830:3;;:70;:7;:70;:::i;:::-;29718:45;;;:182;29936:34;29958:11;29936:21;:34::i;:::-;30004:20;;;;29913:57;;-1:-1:-1;30004:46:0;;29913:57;30004:46;:24;:46;:::i;:::-;29981:20;;;:69;30069:12;;:55;;;-1:-1:-1;;;30069:55:0;;30091:10;30069:55;;;;;;;;;;;;-1:-1:-1;;;;;30069:12:0;;;;:21;;:55;;;;;;;;;;;;;;;:12;;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;30069:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30069:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30069:55:0;30061:97;;;;;-1:-1:-1;;;30061:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30174:67;;;;;;;;30208:10;;30195:11;;30174:67;;;;;;;;;29308:941;;;;:::o;63275:117::-;63337:4;63361:23;63372:11;63361:10;:23::i;61969:145::-;62038:20;;:::i;:::-;62078:22;;;;:9;:22;;;;;;;62071:35;;;;;;;;62078:28;;62071:35;;62078:28;62071:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61969:145;;;:::o;33657:4120::-;33732:22;;:::i;:::-;33767:25;33795:22;;;:9;:22;;;;;33855;33837:14;;;;-1:-1:-1;;;33837:14:0;;;;:40;;;;;;;;;33836:92;;;-1:-1:-1;33899:28:0;33881:14;;;;-1:-1:-1;;;33881:14:0;;;;:46;;;;;;;;;33836:92;33828:159;;;;-1:-1:-1;;;33828:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33998:24;;:::i;:::-;-1:-1:-1;34036:19:0;;;;;34025:10;:31;;;;;;;;;;;33998:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33998:58:0;;;;;;;34112:30;;;;:16;;;:30;;;;;34198:20;;;;34182:37;;:15;;;:37;;;;;;33998:58;;34112:30;34280:85;34330:34;34352:11;34330:21;:34::i;:::-;25295:1;34304:20;;;;:15;;;:20;;;;;;;25257:1;34280:19;;;;;:45;;;:23;:45;:::i;:::-;:49;:85;:49;:85;:::i;:::-;34380:13;;;;34230:135;;-1:-1:-1;34380:17:0;34376:839;;34438:28;34420:14;;;;-1:-1:-1;;;34420:14:0;;;;:46;;;;;;;;;34416:756;;;34587:13;;;;34574:26;;34416:756;;;34641:20;;;;34626:11;;:35;34622:550;;;34686:11;;25295:1;34686:18;34682:475;;;34754:30;34733:8;:18;;;:51;34729:277;;;34813:20;34836:54;34871:8;:18;;;34836:30;:34;;:54;;;;:::i;:::-;34813:77;;34964:18;34931:31;34949:12;34931:6;:13;;;:17;;:31;;;;:::i;:::-;34930:52;;;;;;34917:65;;-1:-1:-1;34729:277:0;34682:475;;;35068:13;;;;35119:18;;35068:49;;35086:30;35068:49;:17;:49;:::i;:::-;35067:70;;;;;;35054:83;;34682:475;35202:1;35186:13;;;:17;34376:839;35268:29;;;;;;:38;;;:109;;-1:-1:-1;35353:23:0;;35339:38;;;;:13;:38;;;;;;-1:-1:-1;;;;;35323:54:0;;;35339:38;;35323:54;35268:109;:172;;;;-1:-1:-1;35412:28:0;35394:14;;;;-1:-1:-1;;;35394:14:0;;;;:46;;;;;;;;;;35268:172;:215;;;;;25257:1;35457:8;:20;;;:26;35268:215;35264:468;;;35650:18;;;;35526:143;;:105;35612:18;35556:54;35650:18;35579:30;35556:54;:22;:54;:::i;:::-;35555:75;;;;;;35526:7;35534:1;35526:10;;;;;;:105;:28;:105;:::i;:143::-;35500:169;;35684:29;;;:36;;-1:-1:-1;;35684:36:0;35716:4;35684:36;;;35264:468;-1:-1:-1;;;;;35786:29:0;;35764:19;35786:29;;;:15;;;:29;;;;;35831:16;;;;:21;;;;35830:45;;-1:-1:-1;35858:16:0;;;;;;35830:45;35826:960;;;35914:28;35896:14;;;;-1:-1:-1;;;35896:14:0;;;;:46;;;;;;;;;35892:848;;;36086:3;36030:54;36051:6;:32;;;36030:5;:16;;;:20;;:54;;;;:::i;:::-;36029:60;;;;;;36015:10;;;:75;35892:848;;;36140:10;;36116:20;;;;:34;36112:628;;;36171:22;25295:1;36216:8;:20;;;:27;36212:216;;;-1:-1:-1;25257:1:0;36285:28;;;;:24;;;:28;;;;;;36212:216;;;-1:-1:-1;25295:1:0;36379:29;;;;:24;;;:29;;;;;;36212:216;36518:3;36464:52;36483:6;:32;;;36464:14;:18;;:52;;;;:::i;:::-;36463:58;;;;;36702:20;;;;36677:46;;;;:24;;;:46;;;;;;36639:16;;;;36463:58;;;;;-1:-1:-1;36553:171:0;;36639:36;;36463:58;36639:36;:20;:36;:::i;:::-;36638:85;;;;;;36611:3;36555:54;36576:6;:32;;;36555:5;:16;;;:20;;:54;;;;:::i;:::-;36554:60;;;;;;;36553:171;:84;:171;:::i;:::-;36540:10;;;:184;-1:-1:-1;36112:628:0;36773:1;36754:16;;;:20;35826:960;36824:17;;;;-1:-1:-1;;;;;36824:33:0;;;:17;;:33;36823:66;;;;;25295:1;36861:8;:20;;;:27;36823:66;:101;;;;-1:-1:-1;36892:17:0;;;;-1:-1:-1;;;;;36892:17:0;:31;;36823:101;36819:217;;;36954:25;;;;36941:10;;;:38;36994:17;;;:30;;-1:-1:-1;;;;;;36994:30:0;;;36819:217;37050:10;;:15;37046:317;;37130:10;;37105:20;;;;:36;;:24;:36::i;:::-;37082:20;;;:59;37164:12;;37200:10;;37164:47;;;-1:-1:-1;;;37164:47:0;;-1:-1:-1;;;;;37164:47:0;;;;;;;;;;;;;;;;:12;;;;;:21;;:47;;;;;37200:10;;37164:47;;;;;;;:12;;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;37164:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37164:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37164:47:0;37156:90;;;;;-1:-1:-1;;;37156:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37300:23;;37286:38;;;;:13;:38;;;;;;;;;;37340:10;;37266:85;;;;;;;-1:-1:-1;;;;;37266:85:0;;;;37286:38;;;37273:11;;37266:85;;;;;;;;;;;37046:317;37392:10;;;;37377:26;;37392:7;37385:1;37377:10;;:26;:31;37373:397;;37457:18;;;;-1:-1:-1;;;;;37457:18:0;37425:80;37506:26;37521:7;37529:1;37521:10;;;;37506:7;37514:1;37506:10;;:26;37534:12;37548:11;37425:135;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37425:135:0;-1:-1:-1;;;;;37425:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37425:135:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37425:135:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;37651:23:0;;37637:38;;;;:13;37425:135;37637:38;;;;;-1:-1:-1;;;;;37580:178:0;;;;37637:38;37611:11;37580:178;37717:26;37732:7;37740:1;37732:10;;;;37717:7;37725:1;37717:10;;:26;37580:178;;;;;;;;;;;;;;;37373:397;33657:4120;;;;;;;;;;:::o;66624:111::-;66680:7;66708:19;66715:11;66708:6;:19::i;61388:129::-;61464:4;61443:11;26454:23;26465:11;26454:10;:23::i;:::-;26446:32;;;;;;61488:21;61497:11;61488:8;:21::i;:::-;61481:28;61388:129;-1:-1:-1;;;61388:129:0:o;24861:52::-;;;;;;;;;;;;;:::o;7870:868::-;7942:7;7987:8;8029;7761:24;8127:537;8134:17;;8127:537;;8220:12;8235:3;8220:18;8243:3;8219:27;8215:195;;;8365:29;8369:10;8381:12;8365:3;:29::i;:::-;8352:42;;8215:195;8497:1;8481:17;;;;;8517;;8513:140;;8606:31;8610:12;8624;8606:3;:31::i;:::-;8591:46;;8513:140;8127:537;;49551:1853;49654:4;25220:1;49714:5;:23;;:36;;;;;49749:1;49741:5;:9;49714:36;49706:65;;;;;-1:-1:-1;;;49706:65:0;;;;;;;;;;;;-1:-1:-1;;;49706:65:0;;;;;;;;;;;;;;;49800:1;49790:7;:11;49782:51;;;;;-1:-1:-1;;;49782:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49850:21;49859:11;49850:8;:21::i;:::-;49846:65;;;-1:-1:-1;49895:4:0;49888:11;;49846:65;49921:25;49949:22;;;:9;:22;;;;;50007:24;49989:14;;;;-1:-1:-1;;;49989:14:0;;;;:42;;;;;;;;;;49988:101;;;;-1:-1:-1;50068:20:0;50050:14;;;;-1:-1:-1;;;50050:14:0;;;;:38;;;;;;;;;;49988:101;49984:146;;;50113:5;50106:12;;;;;49984:146;-1:-1:-1;;;;;50235:25:0;;50211:21;50235:25;;;:16;;;:25;;;;;50276:13;;;;:17;;;;50275:45;;-1:-1:-1;50299:11:0;;:20;;;50275:45;50271:90;;;50344:5;50337:12;;;;;;50271:90;50416:12;;:57;;;-1:-1:-1;;;50416:57:0;;-1:-1:-1;;;;;50416:57:0;;;;;;;50459:4;50416:57;;;;;;;;;;;;50390:7;;50416:12;;;;;:25;;:57;;;;;;;;;;;;;;;50373:14;50416:12;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;50416:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50416:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50416:57:0;50408:95;;;;;-1:-1:-1;;;50408:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50537:20;;;;:32;;50562:6;50537:32;:24;:32;:::i;:::-;50514:20;;;:55;50627:13;;;;:25;;50645:6;50627:25;:17;:25;:::i;:::-;50611:13;;;:41;;;-1:-1:-1;;;;50798:52:0;50790:91;;;;;-1:-1:-1;;;50790:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50973:24;;;;50924:74;;-1:-1:-1;;;50932:35:0;50924:74;:48;:74;:::i;:::-;50900:8;:20;;;:98;;50892:152;;;;;-1:-1:-1;;;50892:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25295:1;51061:5;:12;51057:100;;;51113:20;;;;:32;;51138:6;51113:32;:24;:32;:::i;:::-;51090:20;;;:55;51057:100;51167:19;;;:11;51235:22;;;:15;;;:22;;;;;;51224:34;;:6;;:34;:10;:34;:::i;:::-;51199:22;;;;:15;;;:22;;;;;;;;:59;;;;51307:23;;51293:38;;:13;:38;;;;;;;51274:83;;;;;;;;;;;;;-1:-1:-1;;;;;51274:83:0;;;;51293:38;;;51280:11;;51274:83;;;;;;;;;51375:21;51384:11;51375:8;:21::i;:::-;51368:28;49551:1853;-1:-1:-1;;;;;;;;49551:1853:0:o;55892:373::-;55955:4;55995:22;;;:9;:22;;;;;;;:28;;-1:-1:-1;;;55995:28:0;;;;56053:24;56043:6;:34;;;;;;;;;56042:89;;;-1:-1:-1;56109:21:0;56099:6;:31;;;;;;;;;56042:89;:152;;;-1:-1:-1;56162:31:0;56152:6;:41;;;;;;;;;56042:152;:204;;;-1:-1:-1;56225:20:0;56215:6;:30;;;;;;;;;;55892:373;-1:-1:-1;;;55892:373:0:o;52157:3009::-;52262:4;25220:1;52287:5;:23;;:36;;;;;52322:1;52314:5;:9;52287:36;52279:63;;;;;-1:-1:-1;;;52279:63:0;;;;;;;;;;;;-1:-1:-1;;;52279:63:0;;;;;;;;;;;;;;;52357:21;52366:11;52357:8;:21::i;:::-;52353:65;;;-1:-1:-1;52402:4:0;52395:11;;52353:65;52430:24;;:::i;:::-;-1:-1:-1;52457:10:0;52468:22;;;:9;:22;;;;;;;;:33;;;;;52457:45;;;;;;;;52430:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52430:72:0;;;;;;;52541:22;;;;;;52676:18;;;;52644:85;;-1:-1:-1;;;52644:85:0;;;;;;;;;;;;;;;;;;;;52430:72;;52468:22;;52457:10;;52676:18;;;;;52644:64;;:85;;;;;;;;;;52676:18;52644:85;;;5:2:-1;;;;30:1;27;20:12;5:2;52644:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52644:85:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52644:85:0;;-1:-1:-1;52748:14:0;52740:54;;;;;-1:-1:-1;;;52740:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52827:4;52813:10;:18;;52805:49;;;;;-1:-1:-1;;;52805:49:0;;;;;;;;;;;;-1:-1:-1;;;52805:49:0;;;;;;;;;;;;;;;52879:4;52898:8;52894:57;;-1:-1:-1;52929:10:0;52894:57;-1:-1:-1;;;;;53024:23:0;;;;;;:15;;;:23;;;;;:34;;;:39;53020:84;;53087:5;53080:12;;;;;;;;53020:84;53177:21;;;;:14;;;:21;;;;;;53169:30;;:3;;:30;:7;:30;:::i;:::-;53145:21;;;;:14;;;:21;;;;;;:54;;;53399:20;;;;53384:36;;;;;53360:21;;;;-1:-1:-1;53360:60:0;53359:185;;-1:-1:-1;53477:20:0;;;;;53462:36;;;;:14;;;:36;;;;;;;53440:18;;;;;;:58;53439:104;;;;;25295:1;53516:8;:20;;;:27;53439:104;53355:1021;;;53583:21;53565:14;;;;-1:-1:-1;;;53565:14:0;;;;:39;;;;;;;;;:208;;;;-1:-1:-1;53747:24:0;;;;53715:29;;;;:56;53692:14;;;53707:1;53692:17;;53686:3;:23;53685:87;;53565:208;:277;;;-1:-1:-1;53811:31:0;53793:14;;;;-1:-1:-1;;;53793:14:0;;;;:49;;;;;;;;;53565:277;53561:761;;;53922:31;53904:14;;;;-1:-1:-1;;;53904:14:0;;;;:49;;;;;;;;;53900:302;;54019:24;;;;53978:38;;;:65;54066:14;;;:48;;-1:-1:-1;;;;54066:48:0;-1:-1:-1;;;54066:48:0;;;;;54142:40;;54154:11;;54142:40;;-1:-1:-1;;;54167:14:0;;;;;;54142:40;54167:14;54083:31;54142:40;;;;;;;;;;;;;;;;;;;;;;;53900:302;54303:3;54283:17;;;:23;53561:761;54336:20;;;:28;;;53355:1021;54412:190;;;;;;;;;;;;;;;;;;;;54520:24;54502:14;;;;-1:-1:-1;;;54502:14:0;;;;:42;;;;;;;;;54501:88;;;-1:-1:-1;54568:20:0;54550:14;;;;-1:-1:-1;;;54550:14:0;;;;:38;;;;;;;;;54501:88;54412:190;;;;-1:-1:-1;;;;;54386:23:0;;;;;;:15;;;:23;;;;;;;;;:216;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54386:216:0;;;;;;;;;;54636:24;54618:14;;;;-1:-1:-1;;;54618:14:0;;;;:42;;;;;;;;;54617:88;;;-1:-1:-1;54684:20:0;54666:14;;;;-1:-1:-1;;;54666:14:0;;;;:38;;;;;;;;;54617:88;54613:406;;;54764:31;;;;:24;;;:31;;;;;;54756:40;;:3;;:40;:7;:40;:::i;:::-;54722:31;;;;:24;;;:31;;;;;:74;;;;54840:32;;;;54883:3;;54840:41;;54877:3;54840:41;:36;:41;:::i;:::-;54839:47;;;;;54933:18;;;;54901:106;;;-1:-1:-1;;;54901:106:0;;54839:47;;;;54901:106;;;;;;-1:-1:-1;;;;;54901:106:0;;;;;;;;;;;;;;;54839:47;;-1:-1:-1;54933:18:0;;;54901:66;;:106;;;;;;;;;;;;;;54933:18;;54901:106;;;5:2:-1;;;;30:1;27;20:12;5:2;54901:106:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54901:106:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;54613:406:0;55074:23;;55060:38;;;;:13;:38;;;;;;;;;;55034:85;;;;;;;;;;;;;-1:-1:-1;;;;;55034:85:0;;;;55060:38;;;55047:11;;55034:85;;;;;;;;;55137:21;55146:11;55137:8;:21::i;18019:106::-;18077:7;18108:1;18104;:5;:13;;18116:1;18104:13;;;-1:-1:-1;18112:1:0;;18097:20;-1:-1:-1;18019:106:0:o;15700:470::-;15758:7;16002:6;15998:47;;-1:-1:-1;16032:1:0;16025:8;;15998:47;16069:5;;;16073:1;16069;:5;:1;16093:5;;;;;:10;16085:56;;;;-1:-1:-1;;;16085:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16638:333;16696:7;16795:1;16791;:5;16783:44;;;;;-1:-1:-1;;;16783:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16838:9;16854:1;16850;:5;;;;;;;16638:333;-1:-1:-1;;;;16638:333:0:o;3529:269::-;3731:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3731:58:0;;;;;;;3721:69;;;;;;3529:269::o;1323:1930::-;1401:7;1464:9;:16;1484:2;1464:22;1460:74;;-1:-1:-1;1519:1:0;1503:19;;1460:74;1895:4;1880:20;;1874:27;1941:4;1926:20;;1920:27;1995:4;1980:20;;1974:27;1603:9;1966:36;2925:66;2912:79;;2908:129;;;3023:1;3008:17;;;;;;;2908:129;3053:1;:7;;3058:2;3053:7;;:18;;;;;3064:1;:7;;3069:2;3064:7;;3053:18;3049:68;;;3103:1;3088:17;;;;;;;3049:68;3221:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3221:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;3221:24:0;;-1:-1:-1;;3221:24:0;;;1323:1930;-1:-1:-1;;;;;;;1323:1930:0:o;14809:181::-;14867:7;14899:5;;;14923:6;;;;14915:46;;;;;-1:-1:-1;;;14915:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15265:184;15323:7;15356:1;15351;:6;;15343:49;;;;;-1:-1:-1;;;15343:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15415:5:0;;;15265:184::o;55409:313::-;55468:7;55516:22;;;:9;:22;;;;;;;;25257:1;55693:19;;:15;;;:19;;;;;;;55654:20;;;;;;55516:22;;55646:68;;-1:-1:-1;;;;;55646:38:0;;:68;:38;:68;:::i;17836:107::-;17894:7;17926:1;17921;:6;;:14;;17934:1;17921:14;;8812:183;8893:7;8920:67;-1:-1:-1;;;;;8924:18:0;;;7761:24;8924:29;;;;8955:20;;:31;8920:3;:67::i;42744:6525::-;42821:4;42800:11;26454:23;26465:11;26454:10;:23::i;:::-;26446:32;;;;;;42838:25;42866:22;;;:9;:22;;;;;42899:24;;:::i;:::-;-1:-1:-1;42937:19:0;;;;;42926:10;:31;;;;;;;;;;;;42899:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42899:58:0;;;;;42968:27;;:::i;:::-;:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42968:38:0;;;;;;;;;;;;;;-1:-1:-1;;;42968:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42968:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42968:38:0;;;-1:-1:-1;;42968:38:0;;;;;;;;;;;;;;;;43084:18;;;43052:89;;;-1:-1:-1;;;43052:89:0;;;;;;;;;;42968:38;;-1:-1:-1;42968:38:0;;-1:-1:-1;;;;;43084:18:0;;;;43052:76;;:89;;;;;;;;;;43084:18;43052:89;;;5:2:-1;;;;30:1;27;20:12;5:2;43052:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43052:89:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43052:89:0;43250:35;;43462:20;;;;43203;43447:36;;;:14;;;:36;;;;;;43052:89;;-1:-1:-1;43243:3:0;43227:19;;43226:59;;;;43203:20;;;;43447:51;-1:-1:-1;43443:3748:0;;;43599:20;43581:14;;;;-1:-1:-1;;;43581:14:0;;;;:38;;;;;;;;;43577:357;;;43657:30;43640:47;;43577:357;;;43731:24;43713:14;;;;-1:-1:-1;;;43713:14:0;;;;:42;;;;;;;;;43709:225;;;43793:35;43776:52;;43709:225;;;43886:32;43869:49;;43709:225;43948:14;;;:39;;43965:22;;43948:14;-1:-1:-1;;;;43948:39:0;-1:-1:-1;;;43965:22:0;43948:39;;;;;;43443:3748;;;44042:20;44024:14;;;;-1:-1:-1;;;44024:14:0;;;;:38;;;;;;;;;44020:960;;;44179:28;;;;44157:14;;;:17;44151:3;:23;44150:57;44146:819;;44249:28;44232:14;;:45;;-1:-1:-1;;;;44232:45:0;-1:-1:-1;;;44232:45:0;;;25257:1;44300:20;;;:25;;;25257:1;-1:-1:-1;44146:819:0;;;44463:55;44473:8;:19;;;44494:8;:23;;;44463:9;:55::i;:::-;44441:77;;44567:19;44545;44552:11;44545:6;:19::i;:::-;:41;44541:405;;;44683:14;;;:41;;-1:-1:-1;;;;44683:41:0;-1:-1:-1;;;44683:41:0;;;44842:3;44822:17;;;:23;44872:28;;;:50;;;44541:405;45018:24;45000:14;;;;-1:-1:-1;;;45000:14:0;;;;:42;;;;;;;;;44996:2184;;;45085:55;45095:8;:19;;;45116:8;:23;;;45085:9;:55::i;:::-;45253:32;;;;45063:77;;-1:-1:-1;45231:14:0;;;45246:1;45231:17;;45225:3;:23;45224:61;45220:1945;;45336:19;45314;45321:11;45314:6;:19::i;:::-;:41;45310:1275;;;45411:23;;45388:47;;;;:22;:47;;;;;;25542:4;-1:-1:-1;45384:1084:0;;;45558:14;;;;:38;;-1:-1:-1;;;;45558:38:0;-1:-1:-1;;;45558:38:0;;;45719:3;45699:17;;;:23;45776;;-1:-1:-1;45753:47:0;;;:22;:47;;;;;;;;:49;;;;;;;;45995:23;;45967:52;;:27;:52;;;;;;46390:47;;;;;;;46292:19;;;:15;;;:19;;;;;;;;45967:52;;-1:-1:-1;46390:47:0;46285:62;;;46390:47;46284:154;;;;46145:23;;46117:52;;;;:27;:52;;;;;46284:154;;;46213:226;;46117:323;;45384:1084;45310:1275;;;46524:14;;;:37;;46541:20;;46524:14;-1:-1:-1;;;;46524:37:0;-1:-1:-1;;;46541:20:0;46524:37;;45310:1275;45220:1945;;;46672:21;46696:19;46703:11;46696:6;:19::i;:::-;46759:28;;;;46672:43;;-1:-1:-1;46759:53:0;;46792:19;46759:53;:32;:53;:::i;:::-;46742:13;:70;46738:408;;46841:14;;;:37;;-1:-1:-1;;;;46841:37:0;-1:-1:-1;;;46841:37:0;;;46738:408;;;46943:13;46912:8;:28;;;:44;46908:238;;;46985:28;;;:50;;;47067:55;;;;;;;;47089:11;;47067:55;;;;;;;;;;46908:238;45220:1945;;47226:21;47208:14;;;;-1:-1:-1;;;47208:14:0;;;;:39;;;;;;;;;47207:109;;;-1:-1:-1;47284:31:0;47266:14;;;;-1:-1:-1;;;47266:14:0;;;;:49;;;;;;;;;47207:109;47203:412;;;47425:38;;;;47403:17;;;;47397:3;:23;47396:67;47392:212;;47484:14;;;:39;;-1:-1:-1;;;;47484:39:0;-1:-1:-1;;;47484:39:0;;;47559:29;;-1:-1:-1;47392:212:0;47649:19;47631:14;:37;;;;;;;;;47627:1455;;47708:29;47690:14;:47;;;;;;;;;47689:122;;;-1:-1:-1;47778:32:0;47760:14;:50;;;;;;;;;47689:122;47685:951;;;47925:26;;47902:50;;;;:22;:50;;;;;;:57;;47957:1;47902:57;:54;:57;:::i;:::-;47855:26;;47832:50;;;;:22;:50;;;;;;:127;;;;48126:26;;48103:50;;;;48176:21;48172:449;;48250:23;;48277:1;48222:52;;;:27;:52;;;;;:56;48172:449;;;48384:23;;48356:52;;;;:27;:52;;;;;;;;;25257:1;48563:19;;:15;;;:19;;;;;;;48356:52;;-1:-1:-1;48585:16:0;;48508:75;;:50;48356:52;48556:1;48539:18;;48508:50;:30;:50;:::i;:75::-;48507:94;;;;;48459:23;;48431:52;;;;:27;:52;;;;;48507:94;;;48431:170;;48172:449;47685:951;;48725:23;;48711:38;;;;:13;:38;;;;;;;;;;48764:20;;;;48655:174;;;;;;;;;;;;;-1:-1:-1;;;;;48711:38:0;;;;48685:11;;48655:174;;;;;;;;;;;48867:11;48849:46;48880:14;48849:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;48935:18;;;;48988:20;;;;48910:100;;;-1:-1:-1;;;48910:100:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48935:18:0;;;;48910:60;;:100;;;;;;;;;;;;;;;48935:18;;48910:100;;;5:2:-1;;;;30:1;27;20:12;5:2;48910:100:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48910:100:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;49046:24:0;;;;49025:18;;;:45;47627:1455;49117:14;;;;-1:-1:-1;;;49117:14:0;;;;49096:35;;;;;;;;:11;:17;;;:35;;;;;;;;;49092:113;;49165:11;49153:40;49178:8;:14;;;;;;;;;;;;49153:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;49092:113;49241:19;49223:14;:37;;;;;;;;;;;42744:6525;-1:-1:-1;;;;;;;;;;;42744:6525:0:o;9080:389::-;9145:7;9348:13;;;9356:5;9348;:13;:5;9380:9;;;;;:18;9372:52;;;;;-1:-1:-1;;;9372:52:0;;;;;;;;;;;;-1:-1:-1;;;9372:52:0;;;;;;;;;;;;;;;7652:2;9443:17;;9080:389;-1:-1:-1;;;9080:389:0:o;9557:357::-;9640:7;9889:15;7761:24;9844:33;;9889:15;9843:62;;;;;;9557:357;-1:-1:-1;;;9557:357:0:o;56473:10265::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56473:10265:0;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;56473:10265:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56473:10265:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56473:10265:0;;;-1:-1:-1;56473:10265:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;56473:10265:0;;;-1:-1:-1;;56473:10265:0:o;:::-;;;;;;;;;;;;;;;;;;19064:422;19431:20;19470:8;;;19064:422::o
Swarm Source
bzzr://7dc53f2f15a6fc09f540e80fabfc6e36b254cb7aba78ba21886f74b889ebf6d5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.