Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 2891353 | 205 days ago | IN | 0 ETH | 0.0123023 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
2891353 | 205 days ago | 0 ETH |
Loading...
Loading
Contract Name:
Autopay
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at lineascan.build/ on 2024-03-14 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.3; interface ITellor { //Controller function addresses(bytes32) external view returns (address); function uints(bytes32) external view returns (uint256); function burn(uint256 _amount) external; function changeDeity(address _newDeity) external; function changeOwner(address _newOwner) external; function changeUint(bytes32 _target, uint256 _amount) external; function migrate() external; function mint(address _reciever, uint256 _amount) external; function init() external; function getAllDisputeVars(uint256 _disputeId) external view returns ( bytes32, bool, bool, bool, address, address, address, uint256[9] memory, int256 ); function getDisputeIdByDisputeHash(bytes32 _hash) external view returns (uint256); function getDisputeUintVars(uint256 _disputeId, bytes32 _data) external view returns (uint256); function getLastNewValueById(uint256 _requestId) external view returns (uint256, bool); function retrieveData(uint256 _requestId, uint256 _timestamp) external view returns (uint256); function getNewValueCountbyRequestId(uint256 _requestId) external view returns (uint256); function getAddressVars(bytes32 _data) external view returns (address); function getUintVar(bytes32 _data) external view returns (uint256); function totalSupply() external view returns (uint256); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function isMigrated(address _addy) external view returns (bool); function allowance(address _user, address _spender) external view returns (uint256); function allowedToTrade(address _user, uint256 _amount) external view returns (bool); function approve(address _spender, uint256 _amount) external returns (bool); function approveAndTransferFrom( address _from, address _to, uint256 _amount ) external returns (bool); function balanceOf(address _user) external view returns (uint256); function balanceOfAt(address _user, uint256 _blockNumber) external view returns (uint256); function transfer(address _to, uint256 _amount) external returns (bool success); function transferFrom( address _from, address _to, uint256 _amount ) external returns (bool success); function depositStake() external; function requestStakingWithdraw() external; function withdrawStake() external; function changeStakingStatus(address _reporter, uint256 _status) external; function slashReporter(address _reporter, address _disputer) external; function getStakerInfo(address _staker) external view returns (uint256, uint256); function getTimestampbyRequestIDandIndex(uint256 _requestId, uint256 _index) external view returns (uint256); function getNewCurrentVariables() external view returns ( bytes32 _c, uint256[5] memory _r, uint256 _d, uint256 _t ); function getNewValueCountbyQueryId(bytes32 _queryId) external view returns (uint256); function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index) external view returns (uint256); function retrieveData(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory); //Governance enum VoteResult { FAILED, PASSED, INVALID } function setApprovedFunction(bytes4 _func, bool _val) external; function beginDispute(bytes32 _queryId, uint256 _timestamp) external; function delegate(address _delegate) external; function delegateOfAt(address _user, uint256 _blockNumber) external view returns (address); function executeVote(uint256 _disputeId) external; function proposeVote( address _contract, bytes4 _function, bytes calldata _data, uint256 _timestamp ) external; function tallyVotes(uint256 _disputeId) external; function governance() external view returns (address); function updateMinDisputeFee() external; function verify() external pure returns (uint256); function vote( uint256 _disputeId, bool _supports, bool _invalidQuery ) external; function voteFor( address[] calldata _addys, uint256 _disputeId, bool _supports, bool _invalidQuery ) external; function getDelegateInfo(address _holder) external view returns (address, uint256); function isFunctionApproved(bytes4 _func) external view returns (bool); function isApprovedGovernanceContract(address _contract) external returns (bool); function getVoteRounds(bytes32 _hash) external view returns (uint256[] memory); function getVoteCount() external view returns (uint256); function getVoteInfo(uint256 _disputeId) external view returns ( bytes32, uint256[9] memory, bool[2] memory, VoteResult, bytes memory, bytes4, address[2] memory ); function getDisputeInfo(uint256 _disputeId) external view returns ( uint256, uint256, bytes memory, address ); function getOpenDisputesOnId(bytes32 _queryId) external view returns (uint256); function didVote(uint256 _disputeId, address _voter) external view returns (bool); //Oracle function getReportTimestampByIndex(bytes32 _queryId, uint256 _index) external view returns (uint256); function getValueByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory); function getBlockNumberByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (uint256); function getReportingLock() external view returns (uint256); function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns (address); function reportingLock() external view returns (uint256); function removeValue(bytes32 _queryId, uint256 _timestamp) external; function getTipsByUser(address _user) external view returns(uint256); function tipQuery(bytes32 _queryId, uint256 _tip, bytes memory _queryData) external; function submitValue(bytes32 _queryId, bytes calldata _value, uint256 _nonce, bytes memory _queryData) external; function burnTips() external; function changeReportingLock(uint256 _newReportingLock) external; function getReportsSubmittedByAddress(address _reporter) external view returns(uint256); function changeTimeBasedReward(uint256 _newTimeBasedReward) external; function getReporterLastTimestamp(address _reporter) external view returns(uint256); function getTipsById(bytes32 _queryId) external view returns(uint256); function getTimeBasedReward() external view returns(uint256); function getTimestampCountById(bytes32 _queryId) external view returns(uint256); function getTimestampIndexByTimestamp(bytes32 _queryId, uint256 _timestamp) external view returns(uint256); function getCurrentReward(bytes32 _queryId) external view returns(uint256, uint256); function getCurrentValue(bytes32 _queryId) external view returns(bytes memory); function getDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns(bool _ifRetrieve, bytes memory _value, uint256 _timestampRetrieved); function getTimeOfLastNewValue() external view returns(uint256); function depositStake(uint256 _amount) external; function requestStakingWithdraw(uint256 _amount) external; //Test functions function changeAddressVar(bytes32 _id, address _addy) external; //parachute functions function killContract() external; function migrateFor(address _destination, uint256 _amount) external; function rescue51PercentAttack(address _tokenHolder) external; function rescueBrokenDataReporting() external; function rescueFailedUpdate() external; //Tellor 360 function addStakingRewards(uint256 _amount) external; function _sliceUint(bytes memory _b) external pure returns (uint256 _number); function claimOneTimeTip(bytes32 _queryId, uint256[] memory _timestamps) external; function claimTip( bytes32 _feedId, bytes32 _queryId, uint256[] memory _timestamps ) external; function fee() external view returns (uint256); function feedsWithFunding(uint256) external view returns (bytes32); function fundFeed( bytes32 _feedId, bytes32 _queryId, uint256 _amount ) external; function getCurrentFeeds(bytes32 _queryId) external view returns (bytes32[] memory); function getCurrentTip(bytes32 _queryId) external view returns (uint256); function getDataAfter(bytes32 _queryId, uint256 _timestamp) external view returns (bytes memory _value, uint256 _timestampRetrieved); function getDataFeed(bytes32 _feedId) external view returns (Autopay.FeedDetails memory); function getFundedFeeds() external view returns (bytes32[] memory); function getFundedQueryIds() external view returns (bytes32[] memory); function getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp) external view returns (bool _found, uint256 _index); function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp) external view returns (bool _found, uint256 _index); function getMultipleValuesBefore( bytes32 _queryId, uint256 _timestamp, uint256 _maxAge, uint256 _maxCount ) external view returns (uint256[] memory _values, uint256[] memory _timestamps); function getPastTipByIndex(bytes32 _queryId, uint256 _index) external view returns (Autopay.Tip memory); function getPastTipCount(bytes32 _queryId) external view returns (uint256); function getPastTips(bytes32 _queryId) external view returns (Autopay.Tip[] memory); function getQueryIdFromFeedId(bytes32 _feedId) external view returns (bytes32); function getRewardAmount( bytes32 _feedId, bytes32 _queryId, uint256[] memory _timestamps ) external view returns (uint256 _cumulativeReward); function getRewardClaimedStatus( bytes32 _feedId, bytes32 _queryId, uint256 _timestamp ) external view returns (bool); function getTipsByAddress(address _user) external view returns (uint256); function isInDispute(bytes32 _queryId, uint256 _timestamp) external view returns (bool); function queryIdFromDataFeedId(bytes32) external view returns (bytes32); function queryIdsWithFunding(uint256) external view returns (bytes32); function queryIdsWithFundingIndex(bytes32) external view returns (uint256); function setupDataFeed( bytes32 _queryId, uint256 _reward, uint256 _startTime, uint256 _interval, uint256 _window, uint256 _priceThreshold, uint256 _rewardIncreasePerSecond, bytes memory _queryData, uint256 _amount ) external; function tellor() external view returns (address); function tip( bytes32 _queryId, uint256 _amount, bytes memory _queryData ) external; function tips(bytes32, uint256) external view returns (uint256 amount, uint256 timestamp); function token() external view returns (address); function userTipsTotal(address) external view returns (uint256); function valueFor(bytes32 _id) external view returns ( int256 _value, uint256 _timestamp, uint256 _statusCode ); } /** * @dev EIP2362 Interface for pull oracles * https://github.com/tellor-io/EIP-2362 */ interface IERC2362 { /** * @dev Exposed function pertaining to EIP standards * @param _id bytes32 ID of the query * @return int,uint,uint returns the value, timestamp, and status code of query */ function valueFor(bytes32 _id) external view returns(int256,uint256,uint256); } interface IMappingContract{ function getTellorID(bytes32 _id) external view returns(bytes32); } /** @author Tellor Inc @title UsingTellor @dev This contract helps smart contracts read data from Tellor */ contract UsingTellor is IERC2362 { ITellor public tellor; IMappingContract public idMappingContract; /*Constructor*/ /** * @dev the constructor sets the oracle address in storage * @param _tellor is the Tellor Oracle address */ constructor(address payable _tellor) { tellor = ITellor(_tellor); } /*Getters*/ /** * @dev Retrieves the next value for the queryId after the specified timestamp * @param _queryId is the queryId to look up the value for * @param _timestamp after which to search for next value * @return _value the value retrieved * @return _timestampRetrieved the value's timestamp */ function getDataAfter(bytes32 _queryId, uint256 _timestamp) public view returns (bytes memory _value, uint256 _timestampRetrieved) { (bool _found, uint256 _index) = getIndexForDataAfter( _queryId, _timestamp ); if (!_found) { return ("", 0); } _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _index); _value = retrieveData(_queryId, _timestampRetrieved); return (_value, _timestampRetrieved); } /** * @dev Retrieves the latest value for the queryId before the specified timestamp * @param _queryId is the queryId to look up the value for * @param _timestamp before which to search for latest value * @return _value the value retrieved * @return _timestampRetrieved the value's timestamp */ function getDataBefore(bytes32 _queryId, uint256 _timestamp) public view returns (bytes memory _value, uint256 _timestampRetrieved) { (, _value, _timestampRetrieved) = tellor.getDataBefore( _queryId, _timestamp ); } /** * @dev Retrieves latest array index of data before the specified timestamp for the queryId * @param _queryId is the queryId to look up the index for * @param _timestamp is the timestamp before which to search for the latest index * @return _found whether the index was found * @return _index the latest index found before the specified timestamp */ // slither-disable-next-line calls-loop function getIndexForDataAfter(bytes32 _queryId, uint256 _timestamp) public view returns (bool _found, uint256 _index) { uint256 _count = getNewValueCountbyQueryId(_queryId); if (_count == 0) return (false, 0); _count--; bool _search = true; // perform binary search uint256 _middle = 0; uint256 _start = 0; uint256 _end = _count; uint256 _timestampRetrieved; // checking boundaries to short-circuit the algorithm _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _end); if (_timestampRetrieved <= _timestamp) return (false, 0); _timestampRetrieved = getTimestampbyQueryIdandIndex(_queryId, _start); if (_timestampRetrieved > _timestamp) { // candidate found, check for disputes _search = false; } // since the value is within our boundaries, do a binary search while (_search) { _middle = (_end + _start) / 2; _timestampRetrieved = getTimestampbyQueryIdandIndex( _queryId, _middle ); if (_timestampRetrieved > _timestamp) { // get immediate previous value uint256 _prevTime = getTimestampbyQueryIdandIndex( _queryId, _middle - 1 ); if (_prevTime <= _timestamp) { // candidate found, check for disputes _search = false; } else { // look from start to middle -1(prev value) _end = _middle - 1; } } else { // get immediate next value uint256 _nextTime = getTimestampbyQueryIdandIndex( _queryId, _middle + 1 ); if (_nextTime > _timestamp) { // candidate found, check for disputes _search = false; _middle++; _timestampRetrieved = _nextTime; } else { // look from middle + 1(next value) to end _start = _middle + 1; } } } // candidate found, check for disputed values if (!isInDispute(_queryId, _timestampRetrieved)) { // _timestampRetrieved is correct return (true, _middle); } else { // iterate forward until we find a non-disputed value while ( isInDispute(_queryId, _timestampRetrieved) && _middle < _count ) { _middle++; _timestampRetrieved = getTimestampbyQueryIdandIndex( _queryId, _middle ); } if ( _middle == _count && isInDispute(_queryId, _timestampRetrieved) ) { return (false, 0); } // _timestampRetrieved is correct return (true, _middle); } } /** * @dev Retrieves latest array index of data before the specified timestamp for the queryId * @param _queryId is the queryId to look up the index for * @param _timestamp is the timestamp before which to search for the latest index * @return _found whether the index was found * @return _index the latest index found before the specified timestamp */ // slither-disable-next-line calls-loop function getIndexForDataBefore(bytes32 _queryId, uint256 _timestamp) public view returns (bool _found, uint256 _index) { return tellor.getIndexForDataBefore(_queryId, _timestamp); } /** * @dev Retrieves multiple uint256 values before the specified timestamp * @param _queryId the unique id of the data query * @param _timestamp the timestamp before which to search for values * @param _maxAge the maximum number of seconds before the _timestamp to search for values * @param _maxCount the maximum number of values to return * @return _values the values retrieved, ordered from oldest to newest * @return _timestamps the timestamps of the values retrieved */ function getMultipleValuesBefore( bytes32 _queryId, uint256 _timestamp, uint256 _maxAge, uint256 _maxCount ) public view returns (bytes[] memory _values, uint256[] memory _timestamps) { // get index of first possible value (bool _ifRetrieve, uint256 _startIndex) = getIndexForDataAfter( _queryId, _timestamp - _maxAge ); // no value within range if (!_ifRetrieve) { return (new bytes[](0), new uint256[](0)); } uint256 _endIndex; // get index of last possible value (_ifRetrieve, _endIndex) = getIndexForDataBefore(_queryId, _timestamp); // no value before _timestamp if (!_ifRetrieve) { return (new bytes[](0), new uint256[](0)); } uint256 _valCount = 0; uint256 _index = 0; uint256[] memory _timestampsArrayTemp = new uint256[](_maxCount); // generate array of non-disputed timestamps within range while (_valCount < _maxCount && _endIndex + 1 - _index > _startIndex) { uint256 _timestampRetrieved = getTimestampbyQueryIdandIndex( _queryId, _endIndex - _index ); if (!isInDispute(_queryId, _timestampRetrieved)) { _timestampsArrayTemp[_valCount] = _timestampRetrieved; _valCount++; } _index++; } bytes[] memory _valuesArray = new bytes[](_valCount); uint256[] memory _timestampsArray = new uint256[](_valCount); // retrieve values and reverse timestamps order for (uint256 _i = 0; _i < _valCount; _i++) { _timestampsArray[_i] = _timestampsArrayTemp[_valCount - 1 - _i]; _valuesArray[_i] = retrieveData(_queryId, _timestampsArray[_i]); } return (_valuesArray, _timestampsArray); } /** * @dev Counts the number of values that have been submitted for the queryId * @param _queryId the id to look up * @return uint256 count of the number of values received for the queryId */ function getNewValueCountbyQueryId(bytes32 _queryId) public view returns (uint256) { return tellor.getNewValueCountbyQueryId(_queryId); } /** * @dev Returns the address of the reporter who submitted a value for a data ID at a specific time * @param _queryId is ID of the specific data feed * @param _timestamp is the timestamp to find a corresponding reporter for * @return address of the reporter who reported the value for the data ID at the given timestamp */ function getReporterByTimestamp(bytes32 _queryId, uint256 _timestamp) public view returns (address) { return tellor.getReporterByTimestamp(_queryId, _timestamp); } /** * @dev Gets the timestamp for the value based on their index * @param _queryId is the id to look up * @param _index is the value index to look up * @return uint256 timestamp */ function getTimestampbyQueryIdandIndex(bytes32 _queryId, uint256 _index) public view returns (uint256) { return tellor.getTimestampbyQueryIdandIndex(_queryId, _index); } /** * @dev Determines whether a value with a given queryId and timestamp has been disputed * @param _queryId is the value id to look up * @param _timestamp is the timestamp of the value to look up * @return bool true if queryId/timestamp is under dispute */ function isInDispute(bytes32 _queryId, uint256 _timestamp) public view returns (bool) { return tellor.isInDispute(_queryId, _timestamp); } /** * @dev Retrieve value from oracle based on queryId/timestamp * @param _queryId being requested * @param _timestamp to retrieve data/value from * @return bytes value for query/timestamp submitted */ function retrieveData(bytes32 _queryId, uint256 _timestamp) public view returns (bytes memory) { return tellor.retrieveData(_queryId, _timestamp); } /** * @dev allows dev to set mapping contract for valueFor (EIP2362) * @param _addy address of mapping contract */ function setIdMappingContract(address _addy) external { require(address(idMappingContract) == address(0)); idMappingContract = IMappingContract(_addy); } /** * @dev Retrieve most recent int256 value from oracle based on queryId * @param _id being requested * @return _value most recent value submitted * @return _timestamp timestamp of most recent value * @return _statusCode 200 if value found, 404 if not found */ function valueFor(bytes32 _id) external view override returns ( int256 _value, uint256 _timestamp, uint256 _statusCode ) { bytes32 _queryId = idMappingContract.getTellorID(_id); bytes memory _valueBytes; (_valueBytes, _timestamp) = getDataBefore( _queryId, block.timestamp + 1 ); if (_timestamp == 0) { return (0, 0, 404); } uint256 _valueUint = _sliceUint(_valueBytes); _value = int256(_valueUint); return (_value, _timestamp, 200); } // Internal functions /** * @dev Convert bytes to uint256 * @param _b bytes value to convert to uint256 * @return _number uint256 converted from bytes */ function _sliceUint(bytes memory _b) internal pure returns (uint256 _number) { for (uint256 _i = 0; _i < _b.length; _i++) { _number = _number * 256 + uint8(_b[_i]); } } } interface IERC20 { function transfer(address _to, uint256 _amount) external returns(bool); function transferFrom(address _from, address _to, uint256 _amount) external returns(bool); function approve(address _spender, uint256 _amount) external returns(bool); } interface IQueryDataStorage { function storeData(bytes memory _queryData) external; function getQueryData(bytes32 _queryId) external view returns (bytes memory); } /** @author Tellor Inc. @title Autopay @dev This is a contract for automatically paying for Tellor oracle data at * specific time intervals, as well as one time tips. */ contract Autopay is UsingTellor { // Storage IERC20 public token; // TRB token address IQueryDataStorage public queryDataStorage; // Query data storage contract uint256 public fee; // 1000 is 100%, 50 is 5%, etc. mapping(bytes32 => bytes32[]) currentFeeds; // mapping queryId to dataFeedIds array mapping(bytes32 => mapping(bytes32 => Feed)) dataFeed; // mapping queryId to dataFeedId to details mapping(bytes32 => bytes32) public queryIdFromDataFeedId; // mapping dataFeedId to queryId mapping(bytes32 => uint256) public queryIdsWithFundingIndex; // mapping queryId to queryIdsWithFunding index plus one (0 if not in array) mapping(bytes32 => Tip[]) public tips; // mapping queryId to tips mapping(address => uint256) public userTipsTotal; // track user tip total per user bytes32[] public feedsWithFunding; // array of dataFeedIds that have funding bytes32[] public queryIdsWithFunding; // array of queryIds that have funding // Structs struct Feed { FeedDetails details; mapping(uint256 => bool) rewardClaimed; // tracks which tips were already paid out } struct FeedDetails { uint256 reward; // amount paid for each eligible data submission uint256 balance; // account remaining balance uint256 startTime; // time of first payment window uint256 interval; // time between pay periods uint256 window; // amount of time data can be submitted per interval uint256 priceThreshold; //change in price necessitating an update 100 = 1% uint256 rewardIncreasePerSecond; // amount reward increases per second within window (0 for flat rewards) uint256 feedsWithFundingIndex; // index plus one of dataFeedID in feedsWithFunding array (0 if not in array) } struct FeedDetailsWithQueryData { FeedDetails details; // feed details for feed id with funding bytes queryData; // query data for requested data } struct SingleTipsWithQueryData { bytes queryData; // query data with single tip for requested data uint256 tip; // reward amount for request } struct Tip { uint256 amount; // amount tipped uint256 timestamp; // time tipped uint256 cumulativeTips; // cumulative tips for query ID } // Events event DataFeedFunded( bytes32 indexed _queryId, bytes32 indexed _feedId, uint256 indexed _amount, address _feedFunder, FeedDetails _feedDetails ); event NewDataFeed( bytes32 indexed _queryId, bytes32 indexed _feedId, bytes _queryData, address _feedCreator ); event OneTimeTipClaimed( bytes32 indexed _queryId, uint256 indexed _amount, address indexed _reporter ); event TipAdded( bytes32 indexed _queryId, uint256 indexed _amount, bytes _queryData, address _tipper ); event TipClaimed( bytes32 indexed _feedId, bytes32 indexed _queryId, uint256 indexed _amount, address _reporter ); // Functions /** * @dev Initializes system parameters * @param _tellor address of Tellor contract * @param _queryDataStorage address of query data storage contract * @param _fee percentage, 1000 is 100%, 50 is 5%, etc. */ constructor( address payable _tellor, address _queryDataStorage, uint256 _fee ) UsingTellor(_tellor) { token = IERC20(tellor.token()); queryDataStorage = IQueryDataStorage(_queryDataStorage); fee = _fee; } /** * @dev Function to claim singular tip * @param _queryId id of reported data * @param _timestamps[] batch of timestamps array of reported data eligible for reward */ function claimOneTimeTip( bytes32 _queryId, uint256[] calldata _timestamps ) external { require( tips[_queryId].length > 0, "no tips submitted for this queryId" ); uint256 _cumulativeReward; for (uint256 _i = 0; _i < _timestamps.length; _i++) { _cumulativeReward += _getOneTimeTipAmount( _queryId, _timestamps[_i] ); } require( token.transfer( msg.sender, _cumulativeReward - ((_cumulativeReward * fee) / 1000) ) ); token.approve(address(tellor), (_cumulativeReward * fee) / 1000); tellor.addStakingRewards((_cumulativeReward * fee) / 1000); if (getCurrentTip(_queryId) == 0) { if (queryIdsWithFundingIndex[_queryId] != 0) { uint256 _idx = queryIdsWithFundingIndex[_queryId] - 1; // Replace unfunded feed in array with last element queryIdsWithFunding[_idx] = queryIdsWithFunding[ queryIdsWithFunding.length - 1 ]; bytes32 _queryIdLastFunded = queryIdsWithFunding[_idx]; queryIdsWithFundingIndex[_queryIdLastFunded] = _idx + 1; queryIdsWithFundingIndex[_queryId] = 0; queryIdsWithFunding.pop(); } } emit OneTimeTipClaimed(_queryId, _cumulativeReward, msg.sender); } /** * @dev Allows Tellor reporters to claim their tips in batches * @param _feedId unique feed identifier * @param _queryId ID of reported data * @param _timestamps batch of timestamps array of reported data eligible for reward */ function claimTip( bytes32 _feedId, bytes32 _queryId, uint256[] calldata _timestamps ) external { Feed storage _feed = dataFeed[_queryId][_feedId]; uint256 _balance = _feed.details.balance; require(_balance > 0, "no funds available for this feed"); uint256 _cumulativeReward; for (uint256 _i = 0; _i < _timestamps.length; _i++) { require( block.timestamp - _timestamps[_i] > 12 hours, "buffer time has not passed" ); require( getReporterByTimestamp(_queryId, _timestamps[_i]) == msg.sender, "message sender not reporter for given queryId and timestamp" ); _cumulativeReward += _getRewardAmount( _feedId, _queryId, _timestamps[_i] ); if (_cumulativeReward >= _balance) { // Balance runs out require( _i == _timestamps.length - 1, "insufficient balance for all submitted timestamps" ); _cumulativeReward = _balance; // Adjust currently funded feeds if (feedsWithFunding.length > 1) { uint256 _idx = _feed.details.feedsWithFundingIndex - 1; // Replace unfunded feed in array with last element feedsWithFunding[_idx] = feedsWithFunding[ feedsWithFunding.length - 1 ]; bytes32 _feedIdLastFunded = feedsWithFunding[_idx]; bytes32 _queryIdLastFunded = queryIdFromDataFeedId[ _feedIdLastFunded ]; dataFeed[_queryIdLastFunded][_feedIdLastFunded] .details .feedsWithFundingIndex = _idx + 1; } feedsWithFunding.pop(); _feed.details.feedsWithFundingIndex = 0; } _feed.rewardClaimed[_timestamps[_i]] = true; } _feed.details.balance -= _cumulativeReward; require( token.transfer( msg.sender, _cumulativeReward - ((_cumulativeReward * fee) / 1000) ) ); token.approve(address(tellor), (_cumulativeReward * fee) / 1000); tellor.addStakingRewards((_cumulativeReward * fee) / 1000); emit TipClaimed(_feedId, _queryId, _cumulativeReward, msg.sender); } /** * @dev Allows dataFeed account to be filled with tokens * @param _feedId unique feed identifier * @param _queryId identifier of reported data type associated with feed * @param _amount quantity of tokens to fund feed */ function fundFeed( bytes32 _feedId, bytes32 _queryId, uint256 _amount ) public { FeedDetails storage _feed = dataFeed[_queryId][_feedId].details; require(_feed.reward > 0, "feed not set up"); require(_amount > 0, "must be sending an amount"); _feed.balance += _amount; require( token.transferFrom(msg.sender, address(this), _amount), "ERC20: transfer amount exceeds balance" ); // Add to array of feeds with funding if (_feed.feedsWithFundingIndex == 0 && _feed.balance > 0) { feedsWithFunding.push(_feedId); _feed.feedsWithFundingIndex = feedsWithFunding.length; } userTipsTotal[msg.sender] += _amount; emit DataFeedFunded(_feedId, _queryId, _amount, msg.sender, _feed); } /** * @dev Initializes dataFeed parameters. * @param _queryId unique identifier of desired data feed * @param _reward tip amount per eligible data submission * @param _startTime timestamp of first autopay window * @param _interval amount of time between autopay windows * @param _window amount of time after each new interval when reports are eligible for tips * @param _priceThreshold amount price must change to automate update regardless of time (negated if 0, 100 = 1%) * @param _rewardIncreasePerSecond amount reward increases per second within a window (0 for flat reward) * @param _queryData the data used by reporters to fulfill the query * @param _amount optional initial amount to fund it with */ function setupDataFeed( bytes32 _queryId, uint256 _reward, uint256 _startTime, uint256 _interval, uint256 _window, uint256 _priceThreshold, uint256 _rewardIncreasePerSecond, bytes calldata _queryData, uint256 _amount ) external returns (bytes32 _feedId) { require( _queryId == keccak256(_queryData), "id must be hash of bytes data" ); _feedId = keccak256( abi.encode( _queryId, _reward, _startTime, _interval, _window, _priceThreshold, _rewardIncreasePerSecond ) ); FeedDetails storage _feed = dataFeed[_queryId][_feedId].details; require(_feed.reward == 0, "feed must not be set up already"); require(_reward > 0, "reward must be greater than zero"); require(_interval > 0, "interval must be greater than zero"); require( _window < _interval, "window must be less than interval length" ); _feed.reward = _reward; _feed.startTime = _startTime; _feed.interval = _interval; _feed.window = _window; _feed.priceThreshold = _priceThreshold; _feed.rewardIncreasePerSecond = _rewardIncreasePerSecond; currentFeeds[_queryId].push(_feedId); queryIdFromDataFeedId[_feedId] = _queryId; queryDataStorage.storeData(_queryData); emit NewDataFeed(_queryId, _feedId, _queryData, msg.sender); if (_amount > 0) { fundFeed(_feedId, _queryId, _amount); } return _feedId; } /** * @dev Function to run a single tip * @param _queryId ID of tipped data * @param _amount amount to tip * @param _queryData the data used by reporters to fulfill the query */ function tip( bytes32 _queryId, uint256 _amount, bytes calldata _queryData ) external { require( _queryId == keccak256(_queryData), "id must be hash of bytes data" ); require(_amount > 0, "tip must be greater than zero"); Tip[] storage _tips = tips[_queryId]; if (_tips.length == 0) { _tips.push(Tip(_amount, block.timestamp + 1, _amount)); queryDataStorage.storeData(_queryData); } else { (, uint256 _timestampRetrieved) = _getCurrentValue(_queryId); if (_timestampRetrieved < _tips[_tips.length - 1].timestamp) { _tips[_tips.length - 1].timestamp = block.timestamp + 1; _tips[_tips.length - 1].amount += _amount; _tips[_tips.length - 1].cumulativeTips += _amount; } else { _tips.push( Tip( _amount, block.timestamp + 1, _tips[_tips.length - 1].cumulativeTips + _amount ) ); } } if ( queryIdsWithFundingIndex[_queryId] == 0 && getCurrentTip(_queryId) > 0 ) { queryIdsWithFunding.push(_queryId); queryIdsWithFundingIndex[_queryId] = queryIdsWithFunding.length; } require( token.transferFrom(msg.sender, address(this), _amount), "ERC20: transfer amount exceeds balance" ); userTipsTotal[msg.sender] += _amount; emit TipAdded(_queryId, _amount, _queryData, msg.sender); } // Getters /** * @dev Getter function to read current data feeds * @param _queryId id of reported data * @return feedIds array for queryId */ function getCurrentFeeds( bytes32 _queryId ) external view returns (bytes32[] memory) { return currentFeeds[_queryId]; } /** * @dev Getter function to current oneTime tip by queryId * @param _queryId id of reported data * @return amount of tip */ function getCurrentTip(bytes32 _queryId) public view returns (uint256) { // if no tips, return 0 if (tips[_queryId].length == 0) { return 0; } (, uint256 _timestampRetrieved) = _getCurrentValue(_queryId); Tip memory _lastTip = tips[_queryId][tips[_queryId].length - 1]; if (_timestampRetrieved < _lastTip.timestamp) { return _lastTip.amount; } else { return 0; } } /** * @dev Getter function to read a specific dataFeed * @param _feedId unique feedId of parameters * @return FeedDetails details of specified feed */ function getDataFeed( bytes32 _feedId ) external view returns (FeedDetails memory) { return (dataFeed[queryIdFromDataFeedId[_feedId]][_feedId].details); } /** * @dev Getter function for currently funded feed details * @return FeedDetailsWithQueryData[] array of details for funded feeds */ function getFundedFeedDetails() external view returns (FeedDetailsWithQueryData[] memory) { bytes32[] memory _feeds = this.getFundedFeeds(); FeedDetailsWithQueryData[] memory _details = new FeedDetailsWithQueryData[](_feeds.length); for (uint256 i = 0; i < _feeds.length; i++) { FeedDetails memory _feedDetail = this.getDataFeed(_feeds[i]); bytes32 _queryId = this.getQueryIdFromFeedId(_feeds[i]); bytes memory _queryData = queryDataStorage.getQueryData(_queryId); _details[i].details = _feedDetail; _details[i].queryData = _queryData; } return _details; } /** * @dev Getter function for currently funded feeds */ function getFundedFeeds() external view returns (bytes32[] memory) { return feedsWithFunding; } /** * @dev Getter function for queryIds with current one time tips */ function getFundedQueryIds() external view returns (bytes32[] memory) { return queryIdsWithFunding; } /** * @dev Getter function for currently funded single tips with queryData * @return SingleTipsWithQueryData[] array of current tips */ function getFundedSingleTipsInfo() external view returns (SingleTipsWithQueryData[] memory) { bytes32[] memory _fundedQueryIds = this.getFundedQueryIds(); SingleTipsWithQueryData[] memory _query = new SingleTipsWithQueryData[]( _fundedQueryIds.length ); for (uint256 i = 0; i < _fundedQueryIds.length; i++) { bytes memory _data = queryDataStorage.getQueryData( _fundedQueryIds[i] ); uint256 _reward = this.getCurrentTip(_fundedQueryIds[i]); _query[i].queryData = _data; _query[i].tip = _reward; } return _query; } /** * @dev Getter function to get number of past tips * @param _queryId id of reported data * @return count of tips available */ function getPastTipCount(bytes32 _queryId) external view returns (uint256) { return tips[_queryId].length; } /** * @dev Getter function for past tips * @param _queryId id of reported data * @return Tip struct (amount/timestamp) of all past tips */ function getPastTips( bytes32 _queryId ) external view returns (Tip[] memory) { return tips[_queryId]; } /** * @dev Getter function for past tips by index * @param _queryId id of reported data * @param _index uint index in the Tip array * @return amount/timestamp of specific tip */ function getPastTipByIndex( bytes32 _queryId, uint256 _index ) external view returns (Tip memory) { return tips[_queryId][_index]; } /** * @dev Getter function to lookup query IDs from dataFeed IDs * @param _feedId dataFeed unique identifier * @return bytes32 corresponding query ID */ function getQueryIdFromFeedId( bytes32 _feedId ) external view returns (bytes32) { return queryIdFromDataFeedId[_feedId]; } /** * @dev Getter function to read potential rewards for a set of oracle submissions * NOTE: Does not consider reporter address, 12-hour dispute buffer period, or duplicate timestamps * @param _feedId dataFeed unique identifier * @param _queryId unique identifier of reported data * @param _timestamps array of timestamps of oracle submissions * @return _cumulativeReward total potential reward for the set of oracle submissions */ function getRewardAmount( bytes32 _feedId, bytes32 _queryId, uint256[] calldata _timestamps ) external view returns (uint256 _cumulativeReward) { FeedDetails storage _feed = dataFeed[_queryId][_feedId].details; for (uint256 _i = 0; _i < _timestamps.length; _i++) { _cumulativeReward += _getRewardAmount( _feedId, _queryId, _timestamps[_i] ); } if (_cumulativeReward > _feed.balance) { _cumulativeReward = _feed.balance; } _cumulativeReward -= ((_cumulativeReward * fee) / 1000); } /** * @dev Getter function for reading whether a reward has been claimed * @param _feedId feedId of dataFeed * @param _queryId id of reported data * @param _timestamp id or reported data * @return bool rewardClaimed */ function getRewardClaimedStatus( bytes32 _feedId, bytes32 _queryId, uint256 _timestamp ) external view returns (bool) { return dataFeed[_queryId][_feedId].rewardClaimed[_timestamp]; } /** * @dev Getter function for reading whether a reward has been claimed * @param _feedId feedId of dataFeed * @param _queryId queryId of reported data * @param _timestamp[] list of report timestamps * @return bool[] list of rewardClaim status */ function getRewardClaimStatusList( bytes32 _feedId, bytes32 _queryId, uint256[] calldata _timestamp ) external view returns (bool[] memory) { bool[] memory _status = new bool[](_timestamp.length); for (uint256 i = 0; i < _timestamp.length; i++) { _status[i] = dataFeed[_queryId][_feedId].rewardClaimed[ _timestamp[i] ]; } return _status; } /** * @dev Getter function for retrieving the total amount of tips paid by a given address * @param _user address of user to query * @return uint256 total amount of tips paid by user */ function getTipsByAddress(address _user) external view returns (uint256) { return userTipsTotal[_user]; } // Internal functions /** * @dev Internal function to read if a reward has been claimed * @param _b bytes value to convert to uint256 * @return _number uint256 converted from bytes */ function _bytesToUint( bytes memory _b ) internal pure returns (uint256 _number) { for (uint256 _i = 0; _i < _b.length; _i++) { _number = _number * 256 + uint8(_b[_i]); } } /** ** @dev Internal function which determines tip eligibility for a given oracle submission * @param _queryId id of reported data * @param _timestamp timestamp of one time tip * @return _tipAmount of tip */ function _getOneTimeTipAmount( bytes32 _queryId, uint256 _timestamp ) internal returns (uint256 _tipAmount) { require( block.timestamp - _timestamp > 12 hours, "buffer time has not passed" ); require(!isInDispute(_queryId, _timestamp), "value disputed"); require( msg.sender == getReporterByTimestamp(_queryId, _timestamp), "msg sender must be reporter address" ); Tip[] storage _tips = tips[_queryId]; uint256 _min = 0; uint256 _max = _tips.length; uint256 _mid; while (_max - _min > 1) { _mid = (_max + _min) / 2; if (_tips[_mid].timestamp > _timestamp) { _max = _mid; } else { _min = _mid; } } (, uint256 _timestampBefore) = getDataBefore(_queryId, _timestamp); require( _timestampBefore < _tips[_min].timestamp, "tip earned by previous submission" ); require( _timestamp >= _tips[_min].timestamp, "timestamp not eligible for tip" ); require(_tips[_min].amount > 0, "tip already claimed"); _tipAmount = _tips[_min].amount; _tips[_min].amount = 0; uint256 _minBackup = _min; // check whether eligible for previous tips in array due to disputes (, uint256 _indexNow) = getIndexForDataBefore(_queryId, _timestamp + 1); (bool _found, uint256 _indexBefore) = getIndexForDataBefore( _queryId, _timestampBefore + 1 ); if (_indexNow - _indexBefore > 1 || !_found) { if (!_found) { _tipAmount = _tips[_minBackup].cumulativeTips; } else { _max = _min; _min = 0; _mid; while (_max - _min > 1) { _mid = (_max + _min) / 2; if (_tips[_mid].timestamp > _timestampBefore) { _max = _mid; } else { _min = _mid; } } _min++; if (_min < _minBackup) { _tipAmount = _tips[_minBackup].cumulativeTips - _tips[_min].cumulativeTips + _tips[_min].amount; } } } } /** * @dev Allows the user to get the latest value for the queryId specified * @param _queryId is the id to look up the value for * @return _value the value retrieved * @return _timestampRetrieved the retrieved value's timestamp */ function _getCurrentValue( bytes32 _queryId ) internal view returns (bytes memory _value, uint256 _timestampRetrieved) { uint256 _count = getNewValueCountbyQueryId(_queryId); if (_count == 0) { return (bytes(""), 0); } uint256 _time; //loop handles for dispute (value = "" if disputed) while (_count > 0) { _count--; _time = getTimestampbyQueryIdandIndex(_queryId, _count); _value = retrieveData(_queryId, _time); if (_value.length > 0) { return (_value, _time); } } return (bytes(""), _time); } /** * @dev Internal function which determines the reward amount for a given oracle submission * @param _feedId id of dataFeed * @param _queryId id of reported data * @param _timestamp timestamp of reported data eligible for reward * @return _rewardAmount potential reward amount for the given oracle submission */ function _getRewardAmount( bytes32 _feedId, bytes32 _queryId, uint256 _timestamp ) internal view returns (uint256 _rewardAmount) { require( block.timestamp - _timestamp < 4 weeks, "timestamp too old to claim tip" ); Feed storage _feed = dataFeed[_queryId][_feedId]; require(!_feed.rewardClaimed[_timestamp], "reward already claimed"); uint256 _n = (_timestamp - _feed.details.startTime) / _feed.details.interval; // finds closest interval _n to timestamp uint256 _c = _feed.details.startTime + _feed.details.interval * _n; // finds start timestamp _c of interval _n bytes memory _valueRetrieved = retrieveData(_queryId, _timestamp); require(_valueRetrieved.length != 0, "no value exists at timestamp"); ( bytes memory _valueRetrievedBefore, uint256 _timestampBefore ) = getDataBefore(_queryId, _timestamp); uint256 _priceChange = 0; // price change from last value to current value if (_feed.details.priceThreshold != 0) { uint256 _v1 = _bytesToUint(_valueRetrieved); uint256 _v2 = _bytesToUint(_valueRetrievedBefore); if (_v2 == 0) { _priceChange = 10000; } else if (_v1 >= _v2) { _priceChange = (10000 * (_v1 - _v2)) / _v2; } else { _priceChange = (10000 * (_v2 - _v1)) / _v2; } } _rewardAmount = _feed.details.reward; uint256 _timeDiff = _timestamp - _c; // time difference between report timestamp and start of interval // ensure either report is first within a valid window, or price change threshold is met if (_timeDiff < _feed.details.window && _timestampBefore < _c) { // add time based rewards if applicable _rewardAmount += _feed.details.rewardIncreasePerSecond * _timeDiff; } else { require( _priceChange > _feed.details.priceThreshold, "price threshold not met" ); } if (_feed.details.balance < _rewardAmount) { _rewardAmount = _feed.details.balance; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"_tellor","type":"address"},{"internalType":"address","name":"_queryDataStorage","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_feedFunder","type":"address"},{"components":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"},{"internalType":"uint256","name":"priceThreshold","type":"uint256"},{"internalType":"uint256","name":"rewardIncreasePerSecond","type":"uint256"},{"internalType":"uint256","name":"feedsWithFundingIndex","type":"uint256"}],"indexed":false,"internalType":"struct Autopay.FeedDetails","name":"_feedDetails","type":"tuple"}],"name":"DataFeedFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"_queryData","type":"bytes"},{"indexed":false,"internalType":"address","name":"_feedCreator","type":"address"}],"name":"NewDataFeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_reporter","type":"address"}],"name":"OneTimeTipClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_queryData","type":"bytes"},{"indexed":false,"internalType":"address","name":"_tipper","type":"address"}],"name":"TipAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"TipClaimed","type":"event"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"name":"claimOneTimeTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"name":"claimTip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feedsWithFunding","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fundFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getCurrentFeeds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getCurrentTip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataAfter","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getDataBefore","outputs":[{"internalType":"bytes","name":"_value","type":"bytes"},{"internalType":"uint256","name":"_timestampRetrieved","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"}],"name":"getDataFeed","outputs":[{"components":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"},{"internalType":"uint256","name":"priceThreshold","type":"uint256"},{"internalType":"uint256","name":"rewardIncreasePerSecond","type":"uint256"},{"internalType":"uint256","name":"feedsWithFundingIndex","type":"uint256"}],"internalType":"struct Autopay.FeedDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedFeedDetails","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"},{"internalType":"uint256","name":"priceThreshold","type":"uint256"},{"internalType":"uint256","name":"rewardIncreasePerSecond","type":"uint256"},{"internalType":"uint256","name":"feedsWithFundingIndex","type":"uint256"}],"internalType":"struct Autopay.FeedDetails","name":"details","type":"tuple"},{"internalType":"bytes","name":"queryData","type":"bytes"}],"internalType":"struct Autopay.FeedDetailsWithQueryData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedFeeds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedQueryIds","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundedSingleTipsInfo","outputs":[{"components":[{"internalType":"bytes","name":"queryData","type":"bytes"},{"internalType":"uint256","name":"tip","type":"uint256"}],"internalType":"struct Autopay.SingleTipsWithQueryData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataAfter","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getIndexForDataBefore","outputs":[{"internalType":"bool","name":"_found","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_maxAge","type":"uint256"},{"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"getMultipleValuesBefore","outputs":[{"internalType":"bytes[]","name":"_values","type":"bytes[]"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getNewValueCountbyQueryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getPastTipByIndex","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"cumulativeTips","type":"uint256"}],"internalType":"struct Autopay.Tip","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getPastTipCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"}],"name":"getPastTips","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"cumulativeTips","type":"uint256"}],"internalType":"struct Autopay.Tip[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"}],"name":"getQueryIdFromFeedId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReporterByTimestamp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamps","type":"uint256[]"}],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"_cumulativeReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256[]","name":"_timestamp","type":"uint256[]"}],"name":"getRewardClaimStatusList","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getRewardClaimedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getTimestampbyQueryIdandIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTipsByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idMappingContract","outputs":[{"internalType":"contract IMappingContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"isInDispute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queryDataStorage","outputs":[{"internalType":"contract IQueryDataStorage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queryIdFromDataFeedId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"queryIdsWithFunding","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queryIdsWithFundingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"retrieveData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"}],"name":"setIdMappingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_interval","type":"uint256"},{"internalType":"uint256","name":"_window","type":"uint256"},{"internalType":"uint256","name":"_priceThreshold","type":"uint256"},{"internalType":"uint256","name":"_rewardIncreasePerSecond","type":"uint256"},{"internalType":"bytes","name":"_queryData","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setupDataFeed","outputs":[{"internalType":"bytes32","name":"_feedId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tellor","outputs":[{"internalType":"contract ITellor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_queryData","type":"bytes"}],"name":"tip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tips","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"cumulativeTips","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTipsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"valueFor","outputs":[{"internalType":"int256","name":"_value","type":"int256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_statusCode","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200490b3803806200490b833981016040819052620000349162000124565b600080546001600160a01b0319166001600160a01b03851690811790915560408051637e062a3560e11b8152905163fc0c546a91600480820192602092909190829003018186803b1580156200008957600080fd5b505afa1580156200009e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c49190620000fe565b600280546001600160a01b039283166001600160a01b03199182161790915560038054949092169316929092179091556004555062000184565b60006020828403121562000110578081fd5b81516200011d816200016b565b9392505050565b60008060006060848603121562000139578182fd5b835162000146816200016b565b602085015190935062000159816200016b565b80925050604084015190509250925092565b6001600160a01b03811681146200018157600080fd5b50565b61477780620001946000396000f3fe608060405234801561001057600080fd5b50600436106102995760003560e01c806377b03e0d11610171578063bd05a23a116100d3578063e07c548611610097578063fc0c546a11610071578063fc0c546a146106c7578063fcd4a546146106da578063fdb9d0e2146106fb57610299565b8063e07c54861461068e578063f66f49c3146106a1578063f78eea83146106b457610299565b8063bd05a23a1461061f578063c5958af91461063f578063c7fafff81461065f578063ce5e11bf14610672578063ddca3f431461068557610299565b8063997b799011610135578063a9352c091161010f578063a9352c09146105cc578063b0e5fd07146105ec578063b7c9d376146105ff57610299565b8063997b79901461056c578063a733d2db146105a6578063a792765f146105b957610299565b806377b03e0d146104e55780637bcdfa7a146104f85780637f23d1ce14610526578063868d8b591461053957806393d539321461055957610299565b806344e87f911161021a5780634fff7099116101de57806364ee3c6d116101b857806364ee3c6d1461049157806366c1de50146104b2578063751c895c146104d257610299565b80634fff70991461043e57806357806e701461045e578063579b6d061461047157610299565b806344e87f91146103ac57806345740ccc146103cf57806345d60823146103e25780634637de0b1461040b5780634fce1e181461042b57610299565b80632af8aae0116102615780632af8aae014610347578063353d8ac91461035a57806337db4faf1461036f5780633d3fc43d1461038f57806342505164146103a457610299565b806309d6e27e1461029e578063193b505b146102bc5780631959ad5b146102d15780631af4075f146102fc578063294490851461031d575b600080fd5b6102a661070e565b6040516102b39190614332565b60405180910390f35b6102cf6102ca366004613d6f565b610a51565b005b6000546102e4906001600160a01b031681565b6040516001600160a01b0390911681526020016102b3565b61030f61030a366004613f6a565b610a96565b6040519081526020016102b3565b61033061032b366004613fe6565b610b4c565b6040805192151583526020830191909152016102b3565b6001546102e4906001600160a01b031681565b610362610bdb565b6040516102b39190614261565b61030f61037d366004613ef0565b60086020526000908152604090205481565b610397610c33565b6040516102b391906143fc565b610362610f00565b6103bf6103ba366004613fe6565b610f56565b60405190151581526020016102b3565b61030f6103dd366004613ef0565b610fe3565b61030f6103f0366004613d6f565b6001600160a01b03166000908152600a602052604090205490565b61041e610419366004613ef0565b61109d565b6040516102b39190614583565b61030f610439366004613ef0565b611162565b61030f61044c366004613ef0565b60009081526007602052604090205490565b6102cf61046c366004613f6a565b611183565b61048461047f366004613ef0565b6117d0565b6040516102b39190614471565b6104a461049f366004613fe6565b611860565b6040516102b392919061451b565b61030f6104c0366004613d6f565b600a6020526000908152604090205481565b6102cf6104e0366004614007565b6118b9565b61030f6104f3366004613ef0565b611dc1565b61050b610506366004613fe6565b611e3e565b604080519384526020840192909252908201526060016102b3565b6102cf610534366004613fbb565b611e80565b61030f610547366004613ef0565b60076020526000908152604090205481565b610362610567366004613ef0565b6120f0565b6103bf61057a366004613fbb565b600091825260066020908152604080842094845293815283832091835260089091019052205460ff1690565b61030f6105b436600461407d565b612152565b6104a46105c7366004613fe6565b612491565b6105df6105da366004613fe6565b612527565b6040516102b391906145db565b6003546102e4906001600160a01b031681565b61030f61060d366004613ef0565b60009081526009602052604090205490565b61063261062d366004613f6a565b6125b8565b6040516102b3919061421b565b61065261064d366004613fe6565b6126c6565b6040516102b39190614508565b61030f61066d366004613ef0565b61274e565b61030f610680366004613fe6565b61275e565b61030f60045481565b6102e461069c366004613fe6565b6127e2565b6103306106af366004613fe6565b612866565b61050b6106c2366004613ef0565b612a22565b6002546102e4906001600160a01b031681565b6106ed6106e836600461404c565b612af2565b6040516102b3929190614299565b6102cf610709366004613f20565b612e51565b60606000306001600160a01b031663353d8ac96040518163ffffffff1660e01b815260040160006040518083038186803b15801561074b57600080fd5b505afa15801561075f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107879190810190613dae565b90506000815167ffffffffffffffff8111156107b357634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156107ec57816020015b6107d9613c12565b8152602001906001900390816107d15790505b50905060005b8251811015610a4a576000306001600160a01b0316634637de0b85848151811061082c57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161085291815260200190565b6101006040518083038186803b15801561086b57600080fd5b505afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a39190614143565b90506000306001600160a01b0316634fff70998685815181106108d657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016108fc91815260200190565b60206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190613f08565b6003546040516341b6849f60e11b8152600481018390529192506000916001600160a01b039091169063836d093e9060240160006040518083038186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d29190810190614110565b9050828585815181106109f557634e487b7160e01b600052603260045260246000fd5b60200260200101516000018190525080858581518110610a2557634e487b7160e01b600052603260045260246000fd5b6020026020010151602001819052505050508080610a42906146e2565b9150506107f2565b5091505090565b6001546001600160a01b031615610a6757600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60008381526006602090815260408083208784529091528120815b83811015610b0857610aea8787878785818110610ade57634e487b7160e01b600052603260045260246000fd5b90506020020135613275565b610af4908461462d565b925080610b00816146e2565b915050610ab1565b508060010154821115610b1d57806001015491505b6103e860045483610b2e9190614665565b610b389190614645565b610b429083614684565b9695505050505050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610b9757600080fd5b505afa158015610bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcf9190613ec5565b915091505b9250929050565b6060600b805480602002602001604051908101604052809291908181526020018280548015610c2957602002820191906000526020600020905b815481526020019060010190808311610c15575b5050505050905090565b60606000306001600160a01b031663425051646040518163ffffffff1660e01b815260040160006040518083038186803b158015610c7057600080fd5b505afa158015610c84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cac9190810190613dae565b90506000815167ffffffffffffffff811115610cd857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d1e57816020015b604080518082019091526060815260006020820152815260200190600190039081610cf65790505b50905060005b8251811015610a4a5760035483516000916001600160a01b03169063836d093e90869085908110610d6557634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610d8b91815260200190565b60006040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ddf9190810190614110565b90506000306001600160a01b03166345740ccc868581518110610e1257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610e3891815260200190565b60206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190613f08565b905081848481518110610eab57634e487b7160e01b600052603260045260246000fd5b60200260200101516000018190525080848481518110610edb57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001818152505050508080610ef8906146e2565b915050610d24565b6060600c805480602002602001604051908101604052809291908181526020018280548015610c295760200282019190600052602060002090815481526020019060010190808311610c15575050505050905090565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610fa257600080fd5b505afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613e56565b90505b92915050565b600081815260096020526040812054610ffe57506000611098565b600061100983613552565b600085815260096020526040812080549294509092509061102c90600190614684565b8154811061104a57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051606081018252600390930290910180548352600181015493830184905260020154908201529150821015611091575191506110989050565b6000925050505b919050565b6110e560405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000818152600760208181526040808420548452600680835281852095855294825292839020835161010081018552815481526001820154928101929092526002810154938201939093526003830154606082015260048301546080820152600583015460a08201529282015460c0840152015460e082015290565b600b818154811061117257600080fd5b600091825260209091200154905081565b600083815260066020908152604080832087845290915290206001810154806111f35760405162461bcd60e51b815260206004820181905260248201527f6e6f2066756e647320617661696c61626c6520666f722074686973206665656460448201526064015b60405180910390fd5b6000805b8481101561157a5761a8c086868381811061122257634e487b7160e01b600052603260045260246000fd5b90506020020135426112349190614684565b116112815760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f742070617373656400000000000060448201526064016111ea565b336112b2888888858181106112a657634e487b7160e01b600052603260045260246000fd5b905060200201356127e2565b6001600160a01b03161461132e5760405162461bcd60e51b815260206004820152603b60248201527f6d6573736167652073656e646572206e6f74207265706f7274657220666f722060448201527f676976656e207175657279496420616e642074696d657374616d70000000000060648201526084016111ea565b6113538888888885818110610ade57634e487b7160e01b600052603260045260246000fd5b61135d908361462d565b915082821061151357611371600186614684565b81146113d95760405162461bcd60e51b815260206004820152603160248201527f696e73756666696369656e742062616c616e636520666f7220616c6c207375626044820152706d69747465642074696d657374616d707360781b60648201526084016111ea565b600b54839250600110156114d45760078401546000906113fb90600190614684565b600b80549192509061140f90600190614684565b8154811061142d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600b828154811061145957634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600b828154811061148a57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091015480835260079091526040909120549091506114b483600161462d565b600091825260066020908152604080842094845293905291902060070155505b600b8054806114f357634e487b7160e01b600052603160045260246000fd5b600082815260208120820160001990810182905590910190915560078501555b600184600801600088888581811061153b57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611572906146e2565b9150506111f7565b50808360000160010160008282546115929190614684565b90915550506002546004546001600160a01b039091169063a9059cbb9033906103e8906115bf9086614665565b6115c99190614645565b6115d39085614684565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116519190613e56565b61165a57600080fd5b6002546000546004546001600160a01b039283169263095ea7b39216906103e8906116859086614665565b61168f9190614645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170d9190613e56565b506000546004546001600160a01b039091169063d9c51cd4906103e8906117349085614665565b61173e9190614645565b6040518263ffffffff1660e01b815260040161175c91815260200190565b600060405180830381600087803b15801561177657600080fd5b505af115801561178a573d6000803e3d6000fd5b505060405133815283925088915089907fbe397b811472239aa40c62686337c1611135342d6e238e8aa16580dcd7223adf9060200160405180910390a450505050505050565b606060096000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118555783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611805565b505050509050919050565b606060008060006118718686612866565b91509150816118985760006040518060200160405280600081525090935093505050610bd4565b6118a2868261275e565b92506118ae86846126c6565b935050509250929050565b81816040516118c992919061420b565b6040518091039020841461191f5760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f66206279746573206461746100000060448201526064016111ea565b6000831161196f5760405162461bcd60e51b815260206004820152601d60248201527f746970206d7573742062652067726561746572207468616e207a65726f00000060448201526064016111ea565b60008481526009602052604090208054611a49578060405180606001604052808681526020014260016119a2919061462d565b815260209081018790528254600181810185556000948552938290208351600392830290910190815591830151938201939093556040918201516002909101559054905163ac5c853560e01b81526001600160a01b039091169063ac5c853590611a1290869086906004016144c7565b600060405180830381600087803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b50505050611c48565b6000611a5486613552565b8354909250839150611a6890600190614684565b81548110611a8657634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160010154811015611b9e57611aaa42600161462d565b82548390611aba90600190614684565b81548110611ad857634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160010181905550848260018480549050611b009190614684565b81548110611b1e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016000016000828254611b3e919061462d565b9091555050815485908390611b5590600190614684565b81548110611b7357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002016000828254611b93919061462d565b90915550611c469050565b816040518060600160405280878152602001426001611bbd919061462d565b8152602001878560018780549050611bd59190614684565b81548110611bf357634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154611c0f919061462d565b9052815460018181018455600093845260209384902083516003909302019182559282015192810192909255604001516002909101555b505b600085815260086020526040902054158015611c6c57506000611c6a86610fe3565b115b15611cb157600c80546001810182557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701869055546000868152600860205260409020555b6002546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3b9190613e56565b611d575760405162461bcd60e51b81526004016111ea9061453d565b336000908152600a602052604081208054869290611d7690849061462d565b9250508190555083857ff5ab15991b2cec1142b66b2c57a205c2af5e9d8fc5056bcb33b53b193990b07e858533604051611db2939291906144db565b60405180910390a35050505050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b158015611e0657600080fd5b505afa158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdd9190613f08565b60096020528160005260406000208181548110611e5a57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600082815260066020908152604080832086845290915290208054611ed95760405162461bcd60e51b815260206004820152600f60248201526e066656564206e6f742073657420757608c1b60448201526064016111ea565b60008211611f295760405162461bcd60e51b815260206004820152601960248201527f6d7573742062652073656e64696e6720616e20616d6f756e740000000000000060448201526064016111ea565b81816001016000828254611f3d919061462d565b90915550506002546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015611f9457600080fd5b505af1158015611fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcc9190613e56565b611fe85760405162461bcd60e51b81526004016111ea9061453d565b6007810154158015611ffe575060008160010154115b1561203e57600b805460018101825560008290527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018590555460078201555b336000908152600a60205260408120805484929061205d90849061462d565b909155505060408051338152825460208201526001830154818301526002830154606082015260038301546080820152600483015460a0820152600583015460c0820152600683015460e0820152600783015461010082015290518391859187917fdaf477f4ffa6a044c31632ac3040e483553fb75f8437629291046a833cc352af91908190036101200190a450505050565b60008181526005602090815260409182902080548351818402810184019094528084526060939283018282801561214657602002820191906000526020600020905b815481526020019060010190808311612132575b50505050509050919050565b6000838360405161216492919061420b565b60405180910390208b146121ba5760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f66206279746573206461746100000060448201526064016111ea565b60408051602081018d90529081018b9052606081018a90526080810189905260a0810188905260c0810187905260e081018690526101000160408051601f19818403018152918152815160209283012060008e8152600684528281208282529093529120805491925090156122715760405162461bcd60e51b815260206004820152601f60248201527f66656564206d757374206e6f742062652073657420757020616c72656164790060448201526064016111ea565b60008b116122c15760405162461bcd60e51b815260206004820181905260248201527f726577617264206d7573742062652067726561746572207468616e207a65726f60448201526064016111ea565b6000891161231c5760405162461bcd60e51b815260206004820152602260248201527f696e74657276616c206d7573742062652067726561746572207468616e207a65604482015261726f60f01b60648201526084016111ea565b88881061237c5760405162461bcd60e51b815260206004820152602860248201527f77696e646f77206d757374206265206c657373207468616e20696e74657276616044820152670d840d8cadccee8d60c31b60648201526084016111ea565b8a8155600281018a905560038082018a905560048083018a905560058084018a90556006840189905560008f81526020918252604080822080546001810182559083528383200187905586825260079092528190208f90559154915163ac5c853560e01b81526001600160a01b039092169163ac5c8535916124029189918991016144c7565b600060405180830381600087803b15801561241c57600080fd5b505af1158015612430573d6000803e3d6000fd5b50505050818c7f25b7a245f1298a141e9a73052d47515c64a19a5550bc21f5c896f2097e155efe878733604051612469939291906144db565b60405180910390a3821561248257612482828d85611e80565b509a9950505050505050505050565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156124df57600080fd5b505afa1580156124f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261251b9190810190613e70565b90969095509350505050565b61254b60405180606001604052806000815260200160008152602001600081525090565b600083815260096020526040902080548390811061257957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905092915050565b606060008267ffffffffffffffff8111156125e357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561260c578160200160208202803683370190505b50905060005b838110156126bc5760008681526006602090815260408083208a845290915281206008019086868481811061265757634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a900460ff1682828151811061269a57634e487b7160e01b600052603260045260246000fd5b91151560209283029190910190910152806126b4816146e2565b915050612612565b5095945050505050565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b15801561271257600080fd5b505afa158015612726573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fda9190810190614110565b600c818154811061117257600080fd5b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b1580156127aa57600080fd5b505afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613f08565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b15801561282e57600080fd5b505afa158015612842573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613d92565b600080600061287485611dc1565b905080612888576000809250925050610bd4565b80612892816146cb565b91506001905060008083816128a78a8361275e565b90508881116128c25760008097509750505050505050610bd4565b6128cc8a8461275e565b9050888111156128db57600094505b841561298d5760026128ed848461462d565b6128f79190614645565b93506129038a8561275e565b90508881111561294457600061291e8b610680600188614684565b9050898111612930576000955061293e565b61293b600186614684565b92505b50612988565b60006129558b61068087600161462d565b90508981111561297857600095508461296d816146e2565b955050809150612986565b61298385600161462d565b93505b505b6128db565b6129978a82610f56565b6129ad5760018497509750505050505050610bd4565b6129b78a82610f56565b80156129c257508584105b156129e557836129d1816146e2565b9450506129de8a8561275e565b90506129ad565b85841480156129f957506129f98a82610f56565b15612a105760008097509750505050505050610bd4565b60018497509750505050505050610bd4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b158015612a6f57600080fd5b505afa158015612a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa79190613f08565b90506060612aba826105c742600161462d565b9450905083612ad6576000806101949450945094505050612aeb565b6000612ae1826135e1565b955060c893505050505b9193909250565b606080600080612b06886106af888a614684565b9150915081612b57576040805160008082526020820190925290612b3a565b6060815260200190600190039081612b255790505b506040805160008152602081019091529094509250612e48915050565b6000612b638989610b4c565b909350905082612bb6576040805160008082526020820190925290612b98565b6060815260200190600190039081612b835790505b506040805160008152602081019091529095509350612e4892505050565b60008060008867ffffffffffffffff811115612be257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c0b578160200160208202803683370190505b5090505b8883108015612c3257508482612c2686600161462d565b612c309190614684565b115b15612ca4576000612c478d6106808588614684565b9050612c538d82610f56565b612c915780828581518110612c7857634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612c8d816146e2565b9450505b82612c9b816146e2565b93505050612c0f565b60008367ffffffffffffffff811115612ccd57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d0057816020015b6060815260200190600190039081612ceb5790505b50905060008467ffffffffffffffff811115612d2c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d55578160200160208202803683370190505b50905060005b85811015612e3b578381612d70600189614684565b612d7a9190614684565b81518110612d9857634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612dc057634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612dfd8f838381518110612df057634e487b7160e01b600052603260045260246000fd5b60200260200101516126c6565b838281518110612e1d57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612e33906146e2565b915050612d5b565b5090985096505050505050505b94509492505050565b600083815260096020526040902054612eb75760405162461bcd60e51b815260206004820152602260248201527f6e6f2074697073207375626d697474656420666f722074686973207175657279604482015261125960f21b60648201526084016111ea565b6000805b82811015612f1157612ef385858584818110612ee757634e487b7160e01b600052603260045260246000fd5b90506020020135613646565b612efd908361462d565b915080612f09816146e2565b915050612ebb565b506002546004546001600160a01b039091169063a9059cbb9033906103e890612f3a9086614665565b612f449190614645565b612f4e9085614684565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015612f9457600080fd5b505af1158015612fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcc9190613e56565b612fd557600080fd5b6002546000546004546001600160a01b039283169263095ea7b39216906103e8906130009086614665565b61300a9190614645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561305057600080fd5b505af1158015613064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130889190613e56565b506000546004546001600160a01b039091169063d9c51cd4906103e8906130af9085614665565b6130b99190614645565b6040518263ffffffff1660e01b81526004016130d791815260200190565b600060405180830381600087803b1580156130f157600080fd5b505af1158015613105573d6000803e3d6000fd5b5050505061311284610fe3565b61324057600084815260086020526040902054156132405760008481526008602052604081205461314590600190614684565b600c80549192509061315990600190614684565b8154811061317757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600c82815481106131a357634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600c82815481106131d457634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508160016131ee919061462d565b6000828152600860205260408082209290925587815290812055600c80548061322757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505b6040513390829086907fdff45d500502d35c7f1150acbb404c5b2e288e31a74354c8553a283dd1e806e790600090a450505050565b60006224ea006132858342614684565b106132d25760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d7020746f6f206f6c6420746f20636c61696d20746970000060448201526064016111ea565b60008381526006602090815260408083208784528252808320858452600881019092529091205460ff16156133495760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c726561647920636c61696d65640000000000000000000060448201526064016111ea565b60038101546002820154600091906133619086614684565b61336b9190614645565b905060008183600001600301546133829190614665565b6002840154613391919061462d565b9050600061339f87876126c6565b90508051600014156133f35760405162461bcd60e51b815260206004820152601c60248201527f6e6f2076616c7565206578697374732061742074696d657374616d700000000060448201526064016111ea565b6000806134008989612491565b600588015491935091506000901561349157600061341d85613bb3565b9050600061342a85613bb3565b90508061343b57612710925061348e565b80821061346a578061344d8184614684565b61345990612710614665565b6134639190614645565b925061348e565b806134758382614684565b61348190612710614665565b61348b9190614645565b92505b50505b8654975060006134a1868b614684565b6004890154909150811080156134b657508583105b156134dc5760068801546134cb908290614665565b6134d5908a61462d565b985061352f565b6005880154821161352f5760405162461bcd60e51b815260206004820152601760248201527f7072696365207468726573686f6c64206e6f74206d657400000000000000000060448201526064016111ea565b600188015489111561354357600188015498505b50505050505050509392505050565b606060008061356084611dc1565b9050806135835760405180602001604052806000815250600092509250506135dc565b60005b81156135c75781613596816146cb565b9250506135a3858361275e565b90506135af85826126c6565b8051909450156135c25791506135dc9050565b613586565b60408051602081019091526000815293509150505b915091565b6000805b82518110156136405782818151811061360e57634e487b7160e01b600052603260045260246000fd5b016020015160f81c61362283610100614665565b61362c919061462d565b915080613638816146e2565b9150506135e5565b50919050565b600061a8c06136558342614684565b116136a25760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f742070617373656400000000000060448201526064016111ea565b6136ac8383610f56565b156136ea5760405162461bcd60e51b815260206004820152600e60248201526d1d985b1d5948191a5cdc1d5d195960921b60448201526064016111ea565b6136f483836127e2565b6001600160a01b0316336001600160a01b0316146137605760405162461bcd60e51b815260206004820152602360248201527f6d73672073656e646572206d757374206265207265706f72746572206164647260448201526265737360e81b60648201526084016111ea565b60008381526009602052604081208054909190815b60016137818484614684565b11156137e9576002613793848461462d565b61379d9190614645565b9050858482815481106137c057634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015411156137e0578091506137e4565b8092505b613775565b60006137f58888612491565b91505084848154811061381857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015481106138825760405162461bcd60e51b815260206004820152602160248201527f746970206561726e65642062792070726576696f7573207375626d697373696f6044820152603760f91b60648201526084016111ea565b8484815481106138a257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101548710156139035760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d70206e6f7420656c696769626c6520666f7220746970000060448201526064016111ea565b600085858154811061392557634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600001541161397a5760405162461bcd60e51b81526020600482015260136024820152721d1a5c08185b1c9958591e4818db185a5b5959606a1b60448201526064016111ea565b84848154811061399a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154955060008585815481106139d057634e487b7160e01b600052603260045260246000fd5b6000918252602082206003909102019190915584906139f48a61032b8b600161462d565b91506000905080613a0a8c61032b87600161462d565b90925090506001613a1b8285614684565b1180613a25575081155b15613ba45781613a6857888481548110613a4f57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201549950613ba4565b60009796505b6001613a7a8989614684565b1115613ae2576002613a8c898961462d565b613a969190614645565b955084898781548110613ab957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101541115613ad957859650613add565b8597505b613a6e565b87613aec816146e2565b98505083881015613ba457888881548110613b1757634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154898981548110613b4957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201548a8681548110613b7b57634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154613b979190614684565b613ba1919061462d565b99505b50505050505050505092915050565b6000805b825181101561364057828181518110613be057634e487b7160e01b600052603260045260246000fd5b016020015160f81c613bf483610100614665565b613bfe919061462d565b915080613c0a816146e2565b915050613bb7565b6040518060400160405280613c6560405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001606081525090565b60008083601f840112613c83578182fd5b50813567ffffffffffffffff811115613c9a578182fd5b6020830191508360208260051b8501011115610bd457600080fd5b8051801515811461109857600080fd5b60008083601f840112613cd6578182fd5b50813567ffffffffffffffff811115613ced578182fd5b602083019150836020828501011115610bd457600080fd5b600082601f830112613d15578081fd5b815167ffffffffffffffff811115613d2f57613d2f614713565b613d42601f8201601f19166020016145fc565b818152846020838601011115613d56578283fd5b613d6782602083016020870161469b565b949350505050565b600060208284031215613d80578081fd5b8135613d8b81614729565b9392505050565b600060208284031215613da3578081fd5b8151613d8b81614729565b60006020808385031215613dc0578182fd5b825167ffffffffffffffff80821115613dd7578384fd5b818501915085601f830112613dea578384fd5b815181811115613dfc57613dfc614713565b8060051b9150613e0d8483016145fc565b8181528481019084860184860187018a1015613e27578788fd5b8795505b83861015613e49578051835260019590950194918601918601613e2b565b5098975050505050505050565b600060208284031215613e67578081fd5b610fda82613cb5565b600080600060608486031215613e84578182fd5b613e8d84613cb5565b9250602084015167ffffffffffffffff811115613ea8578283fd5b613eb486828701613d05565b925050604084015190509250925092565b60008060408385031215613ed7578182fd5b613ee083613cb5565b9150602083015190509250929050565b600060208284031215613f01578081fd5b5035919050565b600060208284031215613f19578081fd5b5051919050565b600080600060408486031215613f34578283fd5b83359250602084013567ffffffffffffffff811115613f51578283fd5b613f5d86828701613c72565b9497909650939450505050565b60008060008060608587031215613f7f578081fd5b8435935060208501359250604085013567ffffffffffffffff811115613fa3578182fd5b613faf87828801613c72565b95989497509550505050565b600080600060608486031215613fcf578081fd5b505081359360208301359350604090920135919050565b60008060408385031215613ff8578182fd5b50508035926020909101359150565b6000806000806060858703121561401c578182fd5b8435935060208501359250604085013567ffffffffffffffff811115614040578283fd5b613faf87828801613cc5565b60008060008060808587031215614061578182fd5b5050823594602084013594506040840135936060013592509050565b6000806000806000806000806000806101208b8d03121561409c578788fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013567ffffffffffffffff8111156140e3578384fd5b6140ef8d828e01613cc5565b915080945050809250506101008b013590509295989b9194979a5092959850565b600060208284031215614121578081fd5b815167ffffffffffffffff811115614137578182fd5b613d6784828501613d05565b6000610100808385031215614156578182fd5b61415f816145fc565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201528091505092915050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526141f781602086016020860161469b565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015614255578351151583529284019291840191600101614237565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156142555783518352928401929184019160010161427d565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b838110156142ef57605f198887030185526142dd8683516141df565b955093820193908201906001016142c1565b505085840381870152865180855287820194820193509150845b8281101561432557845184529381019392810192600101614309565b5091979650505050505050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b828110156143ef57603f1988860301845281516101206143c2878351805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b878201519150806101008801526143db818801836141df565b965050509285019290850190600101614358565b5092979650505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b8381101561446357888303603f1901855281518051878552614446888601826141df565b918901519489019490945294870194925090860190600101614422565b509098975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614255576144b48385518051825260208082015190830152604090810151910152565b928401926060929092019160010161448d565b600060208252613d676020830184866141b5565b6000604082526144ef6040830185876141b5565b90506001600160a01b0383166020830152949350505050565b600060208252610fda60208301846141df565b60006040825261452e60408301856141df565b90508260208301529392505050565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6101008101610fdd8284805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b81518152602080830151908201526040808301519082015260608101610fdd565b604051601f8201601f1916810167ffffffffffffffff8111828210171561462557614625614713565b604052919050565b60008219821115614640576146406146fd565b500190565b60008261466057634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561467f5761467f6146fd565b500290565b600082821015614696576146966146fd565b500390565b60005b838110156146b657818101518382015260200161469e565b838111156146c5576000848401525b50505050565b6000816146da576146da6146fd565b506000190190565b60006000198214156146f6576146f66146fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461473e57600080fd5b5056fea26469706673582212209e7893de646a1a68e4a9d5a068f3acec5a127b5909b0a75e1cc218e43952289164736f6c63430008030033000000000000000000000000896419ed2e0dc848a1f7d2814f4e5df4b9b9bfcc0000000000000000000000006684e5ddbee1b97e10847468cb5f4e38f3ab83fe0000000000000000000000000000000000000000000000000000000000000014
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102995760003560e01c806377b03e0d11610171578063bd05a23a116100d3578063e07c548611610097578063fc0c546a11610071578063fc0c546a146106c7578063fcd4a546146106da578063fdb9d0e2146106fb57610299565b8063e07c54861461068e578063f66f49c3146106a1578063f78eea83146106b457610299565b8063bd05a23a1461061f578063c5958af91461063f578063c7fafff81461065f578063ce5e11bf14610672578063ddca3f431461068557610299565b8063997b799011610135578063a9352c091161010f578063a9352c09146105cc578063b0e5fd07146105ec578063b7c9d376146105ff57610299565b8063997b79901461056c578063a733d2db146105a6578063a792765f146105b957610299565b806377b03e0d146104e55780637bcdfa7a146104f85780637f23d1ce14610526578063868d8b591461053957806393d539321461055957610299565b806344e87f911161021a5780634fff7099116101de57806364ee3c6d116101b857806364ee3c6d1461049157806366c1de50146104b2578063751c895c146104d257610299565b80634fff70991461043e57806357806e701461045e578063579b6d061461047157610299565b806344e87f91146103ac57806345740ccc146103cf57806345d60823146103e25780634637de0b1461040b5780634fce1e181461042b57610299565b80632af8aae0116102615780632af8aae014610347578063353d8ac91461035a57806337db4faf1461036f5780633d3fc43d1461038f57806342505164146103a457610299565b806309d6e27e1461029e578063193b505b146102bc5780631959ad5b146102d15780631af4075f146102fc578063294490851461031d575b600080fd5b6102a661070e565b6040516102b39190614332565b60405180910390f35b6102cf6102ca366004613d6f565b610a51565b005b6000546102e4906001600160a01b031681565b6040516001600160a01b0390911681526020016102b3565b61030f61030a366004613f6a565b610a96565b6040519081526020016102b3565b61033061032b366004613fe6565b610b4c565b6040805192151583526020830191909152016102b3565b6001546102e4906001600160a01b031681565b610362610bdb565b6040516102b39190614261565b61030f61037d366004613ef0565b60086020526000908152604090205481565b610397610c33565b6040516102b391906143fc565b610362610f00565b6103bf6103ba366004613fe6565b610f56565b60405190151581526020016102b3565b61030f6103dd366004613ef0565b610fe3565b61030f6103f0366004613d6f565b6001600160a01b03166000908152600a602052604090205490565b61041e610419366004613ef0565b61109d565b6040516102b39190614583565b61030f610439366004613ef0565b611162565b61030f61044c366004613ef0565b60009081526007602052604090205490565b6102cf61046c366004613f6a565b611183565b61048461047f366004613ef0565b6117d0565b6040516102b39190614471565b6104a461049f366004613fe6565b611860565b6040516102b392919061451b565b61030f6104c0366004613d6f565b600a6020526000908152604090205481565b6102cf6104e0366004614007565b6118b9565b61030f6104f3366004613ef0565b611dc1565b61050b610506366004613fe6565b611e3e565b604080519384526020840192909252908201526060016102b3565b6102cf610534366004613fbb565b611e80565b61030f610547366004613ef0565b60076020526000908152604090205481565b610362610567366004613ef0565b6120f0565b6103bf61057a366004613fbb565b600091825260066020908152604080842094845293815283832091835260089091019052205460ff1690565b61030f6105b436600461407d565b612152565b6104a46105c7366004613fe6565b612491565b6105df6105da366004613fe6565b612527565b6040516102b391906145db565b6003546102e4906001600160a01b031681565b61030f61060d366004613ef0565b60009081526009602052604090205490565b61063261062d366004613f6a565b6125b8565b6040516102b3919061421b565b61065261064d366004613fe6565b6126c6565b6040516102b39190614508565b61030f61066d366004613ef0565b61274e565b61030f610680366004613fe6565b61275e565b61030f60045481565b6102e461069c366004613fe6565b6127e2565b6103306106af366004613fe6565b612866565b61050b6106c2366004613ef0565b612a22565b6002546102e4906001600160a01b031681565b6106ed6106e836600461404c565b612af2565b6040516102b3929190614299565b6102cf610709366004613f20565b612e51565b60606000306001600160a01b031663353d8ac96040518163ffffffff1660e01b815260040160006040518083038186803b15801561074b57600080fd5b505afa15801561075f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107879190810190613dae565b90506000815167ffffffffffffffff8111156107b357634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156107ec57816020015b6107d9613c12565b8152602001906001900390816107d15790505b50905060005b8251811015610a4a576000306001600160a01b0316634637de0b85848151811061082c57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161085291815260200190565b6101006040518083038186803b15801561086b57600080fd5b505afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a39190614143565b90506000306001600160a01b0316634fff70998685815181106108d657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016108fc91815260200190565b60206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190613f08565b6003546040516341b6849f60e11b8152600481018390529192506000916001600160a01b039091169063836d093e9060240160006040518083038186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d29190810190614110565b9050828585815181106109f557634e487b7160e01b600052603260045260246000fd5b60200260200101516000018190525080858581518110610a2557634e487b7160e01b600052603260045260246000fd5b6020026020010151602001819052505050508080610a42906146e2565b9150506107f2565b5091505090565b6001546001600160a01b031615610a6757600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60008381526006602090815260408083208784529091528120815b83811015610b0857610aea8787878785818110610ade57634e487b7160e01b600052603260045260246000fd5b90506020020135613275565b610af4908461462d565b925080610b00816146e2565b915050610ab1565b508060010154821115610b1d57806001015491505b6103e860045483610b2e9190614665565b610b389190614645565b610b429083614684565b9695505050505050565b60008054604051632944908560e01b8152600481018590526024810184905282916001600160a01b031690632944908590604401604080518083038186803b158015610b9757600080fd5b505afa158015610bab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcf9190613ec5565b915091505b9250929050565b6060600b805480602002602001604051908101604052809291908181526020018280548015610c2957602002820191906000526020600020905b815481526020019060010190808311610c15575b5050505050905090565b60606000306001600160a01b031663425051646040518163ffffffff1660e01b815260040160006040518083038186803b158015610c7057600080fd5b505afa158015610c84573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cac9190810190613dae565b90506000815167ffffffffffffffff811115610cd857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d1e57816020015b604080518082019091526060815260006020820152815260200190600190039081610cf65790505b50905060005b8251811015610a4a5760035483516000916001600160a01b03169063836d093e90869085908110610d6557634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610d8b91815260200190565b60006040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ddf9190810190614110565b90506000306001600160a01b03166345740ccc868581518110610e1257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610e3891815260200190565b60206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190613f08565b905081848481518110610eab57634e487b7160e01b600052603260045260246000fd5b60200260200101516000018190525080848481518110610edb57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001818152505050508080610ef8906146e2565b915050610d24565b6060600c805480602002602001604051908101604052809291908181526020018280548015610c295760200282019190600052602060002090815481526020019060010190808311610c15575050505050905090565b600080546040516344e87f9160e01b815260048101859052602481018490526001600160a01b03909116906344e87f919060440160206040518083038186803b158015610fa257600080fd5b505afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613e56565b90505b92915050565b600081815260096020526040812054610ffe57506000611098565b600061100983613552565b600085815260096020526040812080549294509092509061102c90600190614684565b8154811061104a57634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051606081018252600390930290910180548352600181015493830184905260020154908201529150821015611091575191506110989050565b6000925050505b919050565b6110e560405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000818152600760208181526040808420548452600680835281852095855294825292839020835161010081018552815481526001820154928101929092526002810154938201939093526003830154606082015260048301546080820152600583015460a08201529282015460c0840152015460e082015290565b600b818154811061117257600080fd5b600091825260209091200154905081565b600083815260066020908152604080832087845290915290206001810154806111f35760405162461bcd60e51b815260206004820181905260248201527f6e6f2066756e647320617661696c61626c6520666f722074686973206665656460448201526064015b60405180910390fd5b6000805b8481101561157a5761a8c086868381811061122257634e487b7160e01b600052603260045260246000fd5b90506020020135426112349190614684565b116112815760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f742070617373656400000000000060448201526064016111ea565b336112b2888888858181106112a657634e487b7160e01b600052603260045260246000fd5b905060200201356127e2565b6001600160a01b03161461132e5760405162461bcd60e51b815260206004820152603b60248201527f6d6573736167652073656e646572206e6f74207265706f7274657220666f722060448201527f676976656e207175657279496420616e642074696d657374616d70000000000060648201526084016111ea565b6113538888888885818110610ade57634e487b7160e01b600052603260045260246000fd5b61135d908361462d565b915082821061151357611371600186614684565b81146113d95760405162461bcd60e51b815260206004820152603160248201527f696e73756666696369656e742062616c616e636520666f7220616c6c207375626044820152706d69747465642074696d657374616d707360781b60648201526084016111ea565b600b54839250600110156114d45760078401546000906113fb90600190614684565b600b80549192509061140f90600190614684565b8154811061142d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600b828154811061145957634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600b828154811061148a57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091015480835260079091526040909120549091506114b483600161462d565b600091825260066020908152604080842094845293905291902060070155505b600b8054806114f357634e487b7160e01b600052603160045260246000fd5b600082815260208120820160001990810182905590910190915560078501555b600184600801600088888581811061153b57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611572906146e2565b9150506111f7565b50808360000160010160008282546115929190614684565b90915550506002546004546001600160a01b039091169063a9059cbb9033906103e8906115bf9086614665565b6115c99190614645565b6115d39085614684565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116519190613e56565b61165a57600080fd5b6002546000546004546001600160a01b039283169263095ea7b39216906103e8906116859086614665565b61168f9190614645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156116d557600080fd5b505af11580156116e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170d9190613e56565b506000546004546001600160a01b039091169063d9c51cd4906103e8906117349085614665565b61173e9190614645565b6040518263ffffffff1660e01b815260040161175c91815260200190565b600060405180830381600087803b15801561177657600080fd5b505af115801561178a573d6000803e3d6000fd5b505060405133815283925088915089907fbe397b811472239aa40c62686337c1611135342d6e238e8aa16580dcd7223adf9060200160405180910390a450505050505050565b606060096000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118555783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611805565b505050509050919050565b606060008060006118718686612866565b91509150816118985760006040518060200160405280600081525090935093505050610bd4565b6118a2868261275e565b92506118ae86846126c6565b935050509250929050565b81816040516118c992919061420b565b6040518091039020841461191f5760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f66206279746573206461746100000060448201526064016111ea565b6000831161196f5760405162461bcd60e51b815260206004820152601d60248201527f746970206d7573742062652067726561746572207468616e207a65726f00000060448201526064016111ea565b60008481526009602052604090208054611a49578060405180606001604052808681526020014260016119a2919061462d565b815260209081018790528254600181810185556000948552938290208351600392830290910190815591830151938201939093556040918201516002909101559054905163ac5c853560e01b81526001600160a01b039091169063ac5c853590611a1290869086906004016144c7565b600060405180830381600087803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b50505050611c48565b6000611a5486613552565b8354909250839150611a6890600190614684565b81548110611a8657634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160010154811015611b9e57611aaa42600161462d565b82548390611aba90600190614684565b81548110611ad857634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160010181905550848260018480549050611b009190614684565b81548110611b1e57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016000016000828254611b3e919061462d565b9091555050815485908390611b5590600190614684565b81548110611b7357634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002016000828254611b93919061462d565b90915550611c469050565b816040518060600160405280878152602001426001611bbd919061462d565b8152602001878560018780549050611bd59190614684565b81548110611bf357634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154611c0f919061462d565b9052815460018181018455600093845260209384902083516003909302019182559282015192810192909255604001516002909101555b505b600085815260086020526040902054158015611c6c57506000611c6a86610fe3565b115b15611cb157600c80546001810182557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701869055546000868152600860205260409020555b6002546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015611d0357600080fd5b505af1158015611d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3b9190613e56565b611d575760405162461bcd60e51b81526004016111ea9061453d565b336000908152600a602052604081208054869290611d7690849061462d565b9250508190555083857ff5ab15991b2cec1142b66b2c57a205c2af5e9d8fc5056bcb33b53b193990b07e858533604051611db2939291906144db565b60405180910390a35050505050565b600080546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d9060240160206040518083038186803b158015611e0657600080fd5b505afa158015611e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdd9190613f08565b60096020528160005260406000208181548110611e5a57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b600082815260066020908152604080832086845290915290208054611ed95760405162461bcd60e51b815260206004820152600f60248201526e066656564206e6f742073657420757608c1b60448201526064016111ea565b60008211611f295760405162461bcd60e51b815260206004820152601960248201527f6d7573742062652073656e64696e6720616e20616d6f756e740000000000000060448201526064016111ea565b81816001016000828254611f3d919061462d565b90915550506002546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015611f9457600080fd5b505af1158015611fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcc9190613e56565b611fe85760405162461bcd60e51b81526004016111ea9061453d565b6007810154158015611ffe575060008160010154115b1561203e57600b805460018101825560008290527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018590555460078201555b336000908152600a60205260408120805484929061205d90849061462d565b909155505060408051338152825460208201526001830154818301526002830154606082015260038301546080820152600483015460a0820152600583015460c0820152600683015460e0820152600783015461010082015290518391859187917fdaf477f4ffa6a044c31632ac3040e483553fb75f8437629291046a833cc352af91908190036101200190a450505050565b60008181526005602090815260409182902080548351818402810184019094528084526060939283018282801561214657602002820191906000526020600020905b815481526020019060010190808311612132575b50505050509050919050565b6000838360405161216492919061420b565b60405180910390208b146121ba5760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f66206279746573206461746100000060448201526064016111ea565b60408051602081018d90529081018b9052606081018a90526080810189905260a0810188905260c0810187905260e081018690526101000160408051601f19818403018152918152815160209283012060008e8152600684528281208282529093529120805491925090156122715760405162461bcd60e51b815260206004820152601f60248201527f66656564206d757374206e6f742062652073657420757020616c72656164790060448201526064016111ea565b60008b116122c15760405162461bcd60e51b815260206004820181905260248201527f726577617264206d7573742062652067726561746572207468616e207a65726f60448201526064016111ea565b6000891161231c5760405162461bcd60e51b815260206004820152602260248201527f696e74657276616c206d7573742062652067726561746572207468616e207a65604482015261726f60f01b60648201526084016111ea565b88881061237c5760405162461bcd60e51b815260206004820152602860248201527f77696e646f77206d757374206265206c657373207468616e20696e74657276616044820152670d840d8cadccee8d60c31b60648201526084016111ea565b8a8155600281018a905560038082018a905560048083018a905560058084018a90556006840189905560008f81526020918252604080822080546001810182559083528383200187905586825260079092528190208f90559154915163ac5c853560e01b81526001600160a01b039092169163ac5c8535916124029189918991016144c7565b600060405180830381600087803b15801561241c57600080fd5b505af1158015612430573d6000803e3d6000fd5b50505050818c7f25b7a245f1298a141e9a73052d47515c64a19a5550bc21f5c896f2097e155efe878733604051612469939291906144db565b60405180910390a3821561248257612482828d85611e80565b509a9950505050505050505050565b6000805460405163a792765f60e01b81526004810185905260248101849052606092916001600160a01b03169063a792765f9060440160006040518083038186803b1580156124df57600080fd5b505afa1580156124f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261251b9190810190613e70565b90969095509350505050565b61254b60405180606001604052806000815260200160008152602001600081525090565b600083815260096020526040902080548390811061257957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905092915050565b606060008267ffffffffffffffff8111156125e357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561260c578160200160208202803683370190505b50905060005b838110156126bc5760008681526006602090815260408083208a845290915281206008019086868481811061265757634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a900460ff1682828151811061269a57634e487b7160e01b600052603260045260246000fd5b91151560209283029190910190910152806126b4816146e2565b915050612612565b5095945050505050565b60005460405163c5958af960e01b815260048101849052602481018390526060916001600160a01b03169063c5958af99060440160006040518083038186803b15801561271257600080fd5b505afa158015612726573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fda9190810190614110565b600c818154811061117257600080fd5b6000805460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf9060440160206040518083038186803b1580156127aa57600080fd5b505afa1580156127be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613f08565b6000805460405163703e2a4360e11b815260048101859052602481018490526001600160a01b039091169063e07c54869060440160206040518083038186803b15801561282e57600080fd5b505afa158015612842573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190613d92565b600080600061287485611dc1565b905080612888576000809250925050610bd4565b80612892816146cb565b91506001905060008083816128a78a8361275e565b90508881116128c25760008097509750505050505050610bd4565b6128cc8a8461275e565b9050888111156128db57600094505b841561298d5760026128ed848461462d565b6128f79190614645565b93506129038a8561275e565b90508881111561294457600061291e8b610680600188614684565b9050898111612930576000955061293e565b61293b600186614684565b92505b50612988565b60006129558b61068087600161462d565b90508981111561297857600095508461296d816146e2565b955050809150612986565b61298385600161462d565b93505b505b6128db565b6129978a82610f56565b6129ad5760018497509750505050505050610bd4565b6129b78a82610f56565b80156129c257508584105b156129e557836129d1816146e2565b9450506129de8a8561275e565b90506129ad565b85841480156129f957506129f98a82610f56565b15612a105760008097509750505050505050610bd4565b60018497509750505050505050610bd4565b6001546040516387a475fd60e01b8152600481018390526000918291829182916001600160a01b03909116906387a475fd9060240160206040518083038186803b158015612a6f57600080fd5b505afa158015612a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa79190613f08565b90506060612aba826105c742600161462d565b9450905083612ad6576000806101949450945094505050612aeb565b6000612ae1826135e1565b955060c893505050505b9193909250565b606080600080612b06886106af888a614684565b9150915081612b57576040805160008082526020820190925290612b3a565b6060815260200190600190039081612b255790505b506040805160008152602081019091529094509250612e48915050565b6000612b638989610b4c565b909350905082612bb6576040805160008082526020820190925290612b98565b6060815260200190600190039081612b835790505b506040805160008152602081019091529095509350612e4892505050565b60008060008867ffffffffffffffff811115612be257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c0b578160200160208202803683370190505b5090505b8883108015612c3257508482612c2686600161462d565b612c309190614684565b115b15612ca4576000612c478d6106808588614684565b9050612c538d82610f56565b612c915780828581518110612c7857634e487b7160e01b600052603260045260246000fd5b602090810291909101015283612c8d816146e2565b9450505b82612c9b816146e2565b93505050612c0f565b60008367ffffffffffffffff811115612ccd57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d0057816020015b6060815260200190600190039081612ceb5790505b50905060008467ffffffffffffffff811115612d2c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612d55578160200160208202803683370190505b50905060005b85811015612e3b578381612d70600189614684565b612d7a9190614684565b81518110612d9857634e487b7160e01b600052603260045260246000fd5b6020026020010151828281518110612dc057634e487b7160e01b600052603260045260246000fd5b602002602001018181525050612dfd8f838381518110612df057634e487b7160e01b600052603260045260246000fd5b60200260200101516126c6565b838281518110612e1d57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080612e33906146e2565b915050612d5b565b5090985096505050505050505b94509492505050565b600083815260096020526040902054612eb75760405162461bcd60e51b815260206004820152602260248201527f6e6f2074697073207375626d697474656420666f722074686973207175657279604482015261125960f21b60648201526084016111ea565b6000805b82811015612f1157612ef385858584818110612ee757634e487b7160e01b600052603260045260246000fd5b90506020020135613646565b612efd908361462d565b915080612f09816146e2565b915050612ebb565b506002546004546001600160a01b039091169063a9059cbb9033906103e890612f3a9086614665565b612f449190614645565b612f4e9085614684565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015612f9457600080fd5b505af1158015612fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcc9190613e56565b612fd557600080fd5b6002546000546004546001600160a01b039283169263095ea7b39216906103e8906130009086614665565b61300a9190614645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561305057600080fd5b505af1158015613064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130889190613e56565b506000546004546001600160a01b039091169063d9c51cd4906103e8906130af9085614665565b6130b99190614645565b6040518263ffffffff1660e01b81526004016130d791815260200190565b600060405180830381600087803b1580156130f157600080fd5b505af1158015613105573d6000803e3d6000fd5b5050505061311284610fe3565b61324057600084815260086020526040902054156132405760008481526008602052604081205461314590600190614684565b600c80549192509061315990600190614684565b8154811061317757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600c82815481106131a357634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600c82815481106131d457634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508160016131ee919061462d565b6000828152600860205260408082209290925587815290812055600c80548061322757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505b6040513390829086907fdff45d500502d35c7f1150acbb404c5b2e288e31a74354c8553a283dd1e806e790600090a450505050565b60006224ea006132858342614684565b106132d25760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d7020746f6f206f6c6420746f20636c61696d20746970000060448201526064016111ea565b60008381526006602090815260408083208784528252808320858452600881019092529091205460ff16156133495760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c726561647920636c61696d65640000000000000000000060448201526064016111ea565b60038101546002820154600091906133619086614684565b61336b9190614645565b905060008183600001600301546133829190614665565b6002840154613391919061462d565b9050600061339f87876126c6565b90508051600014156133f35760405162461bcd60e51b815260206004820152601c60248201527f6e6f2076616c7565206578697374732061742074696d657374616d700000000060448201526064016111ea565b6000806134008989612491565b600588015491935091506000901561349157600061341d85613bb3565b9050600061342a85613bb3565b90508061343b57612710925061348e565b80821061346a578061344d8184614684565b61345990612710614665565b6134639190614645565b925061348e565b806134758382614684565b61348190612710614665565b61348b9190614645565b92505b50505b8654975060006134a1868b614684565b6004890154909150811080156134b657508583105b156134dc5760068801546134cb908290614665565b6134d5908a61462d565b985061352f565b6005880154821161352f5760405162461bcd60e51b815260206004820152601760248201527f7072696365207468726573686f6c64206e6f74206d657400000000000000000060448201526064016111ea565b600188015489111561354357600188015498505b50505050505050509392505050565b606060008061356084611dc1565b9050806135835760405180602001604052806000815250600092509250506135dc565b60005b81156135c75781613596816146cb565b9250506135a3858361275e565b90506135af85826126c6565b8051909450156135c25791506135dc9050565b613586565b60408051602081019091526000815293509150505b915091565b6000805b82518110156136405782818151811061360e57634e487b7160e01b600052603260045260246000fd5b016020015160f81c61362283610100614665565b61362c919061462d565b915080613638816146e2565b9150506135e5565b50919050565b600061a8c06136558342614684565b116136a25760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f742070617373656400000000000060448201526064016111ea565b6136ac8383610f56565b156136ea5760405162461bcd60e51b815260206004820152600e60248201526d1d985b1d5948191a5cdc1d5d195960921b60448201526064016111ea565b6136f483836127e2565b6001600160a01b0316336001600160a01b0316146137605760405162461bcd60e51b815260206004820152602360248201527f6d73672073656e646572206d757374206265207265706f72746572206164647260448201526265737360e81b60648201526084016111ea565b60008381526009602052604081208054909190815b60016137818484614684565b11156137e9576002613793848461462d565b61379d9190614645565b9050858482815481106137c057634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015411156137e0578091506137e4565b8092505b613775565b60006137f58888612491565b91505084848154811061381857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016001015481106138825760405162461bcd60e51b815260206004820152602160248201527f746970206561726e65642062792070726576696f7573207375626d697373696f6044820152603760f91b60648201526084016111ea565b8484815481106138a257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101548710156139035760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d70206e6f7420656c696769626c6520666f7220746970000060448201526064016111ea565b600085858154811061392557634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600001541161397a5760405162461bcd60e51b81526020600482015260136024820152721d1a5c08185b1c9958591e4818db185a5b5959606a1b60448201526064016111ea565b84848154811061399a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154955060008585815481106139d057634e487b7160e01b600052603260045260246000fd5b6000918252602082206003909102019190915584906139f48a61032b8b600161462d565b91506000905080613a0a8c61032b87600161462d565b90925090506001613a1b8285614684565b1180613a25575081155b15613ba45781613a6857888481548110613a4f57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201549950613ba4565b60009796505b6001613a7a8989614684565b1115613ae2576002613a8c898961462d565b613a969190614645565b955084898781548110613ab957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600101541115613ad957859650613add565b8597505b613a6e565b87613aec816146e2565b98505083881015613ba457888881548110613b1757634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154898981548110613b4957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201548a8681548110613b7b57634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160020154613b979190614684565b613ba1919061462d565b99505b50505050505050505092915050565b6000805b825181101561364057828181518110613be057634e487b7160e01b600052603260045260246000fd5b016020015160f81c613bf483610100614665565b613bfe919061462d565b915080613c0a816146e2565b915050613bb7565b6040518060400160405280613c6560405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001606081525090565b60008083601f840112613c83578182fd5b50813567ffffffffffffffff811115613c9a578182fd5b6020830191508360208260051b8501011115610bd457600080fd5b8051801515811461109857600080fd5b60008083601f840112613cd6578182fd5b50813567ffffffffffffffff811115613ced578182fd5b602083019150836020828501011115610bd457600080fd5b600082601f830112613d15578081fd5b815167ffffffffffffffff811115613d2f57613d2f614713565b613d42601f8201601f19166020016145fc565b818152846020838601011115613d56578283fd5b613d6782602083016020870161469b565b949350505050565b600060208284031215613d80578081fd5b8135613d8b81614729565b9392505050565b600060208284031215613da3578081fd5b8151613d8b81614729565b60006020808385031215613dc0578182fd5b825167ffffffffffffffff80821115613dd7578384fd5b818501915085601f830112613dea578384fd5b815181811115613dfc57613dfc614713565b8060051b9150613e0d8483016145fc565b8181528481019084860184860187018a1015613e27578788fd5b8795505b83861015613e49578051835260019590950194918601918601613e2b565b5098975050505050505050565b600060208284031215613e67578081fd5b610fda82613cb5565b600080600060608486031215613e84578182fd5b613e8d84613cb5565b9250602084015167ffffffffffffffff811115613ea8578283fd5b613eb486828701613d05565b925050604084015190509250925092565b60008060408385031215613ed7578182fd5b613ee083613cb5565b9150602083015190509250929050565b600060208284031215613f01578081fd5b5035919050565b600060208284031215613f19578081fd5b5051919050565b600080600060408486031215613f34578283fd5b83359250602084013567ffffffffffffffff811115613f51578283fd5b613f5d86828701613c72565b9497909650939450505050565b60008060008060608587031215613f7f578081fd5b8435935060208501359250604085013567ffffffffffffffff811115613fa3578182fd5b613faf87828801613c72565b95989497509550505050565b600080600060608486031215613fcf578081fd5b505081359360208301359350604090920135919050565b60008060408385031215613ff8578182fd5b50508035926020909101359150565b6000806000806060858703121561401c578182fd5b8435935060208501359250604085013567ffffffffffffffff811115614040578283fd5b613faf87828801613cc5565b60008060008060808587031215614061578182fd5b5050823594602084013594506040840135936060013592509050565b6000806000806000806000806000806101208b8d03121561409c578788fd5b8a35995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135935060e08b013567ffffffffffffffff8111156140e3578384fd5b6140ef8d828e01613cc5565b915080945050809250506101008b013590509295989b9194979a5092959850565b600060208284031215614121578081fd5b815167ffffffffffffffff811115614137578182fd5b613d6784828501613d05565b6000610100808385031215614156578182fd5b61415f816145fc565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201528091505092915050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526141f781602086016020860161469b565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015614255578351151583529284019291840191600101614237565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156142555783518352928401929184019160010161427d565b6000604082016040835280855180835260608501915060608160051b86010192506020808801855b838110156142ef57605f198887030185526142dd8683516141df565b955093820193908201906001016142c1565b505085840381870152865180855287820194820193509150845b8281101561432557845184529381019392810192600101614309565b5091979650505050505050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b828110156143ef57603f1988860301845281516101206143c2878351805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b878201519150806101008801526143db818801836141df565b965050509285019290850190600101614358565b5092979650505050505050565b60006020808301818452808551808352604092508286019150828160051b870101848801865b8381101561446357888303603f1901855281518051878552614446888601826141df565b918901519489019490945294870194925090860190600101614422565b509098975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614255576144b48385518051825260208082015190830152604090810151910152565b928401926060929092019160010161448d565b600060208252613d676020830184866141b5565b6000604082526144ef6040830185876141b5565b90506001600160a01b0383166020830152949350505050565b600060208252610fda60208301846141df565b60006040825261452e60408301856141df565b90508260208301529392505050565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6101008101610fdd8284805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b81518152602080830151908201526040808301519082015260608101610fdd565b604051601f8201601f1916810167ffffffffffffffff8111828210171561462557614625614713565b604052919050565b60008219821115614640576146406146fd565b500190565b60008261466057634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561467f5761467f6146fd565b500290565b600082821015614696576146966146fd565b500390565b60005b838110156146b657818101518382015260200161469e565b838111156146c5576000848401525b50505050565b6000816146da576146da6146fd565b506000190190565b60006000198214156146f6576146f66146fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461473e57600080fd5b5056fea26469706673582212209e7893de646a1a68e4a9d5a068f3acec5a127b5909b0a75e1cc218e43952289164736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000896419ed2e0dc848a1f7d2814f4e5df4b9b9bfcc0000000000000000000000006684e5ddbee1b97e10847468cb5f4e38f3ab83fe0000000000000000000000000000000000000000000000000000000000000014
-----Decoded View---------------
Arg [0] : _tellor (address): 0x896419Ed2E0dC848a1f7d2814F4e5Df4b9B9bFcc
Arg [1] : _queryDataStorage (address): 0x6684E5DdbEe1b97E10847468cB5f4e38f3aB83FE
Arg [2] : _fee (uint256): 20
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000896419ed2e0dc848a1f7d2814f4e5df4b9b9bfcc
Arg [1] : 0000000000000000000000006684e5ddbee1b97e10847468cb5f4e38f3ab83fe
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000014
Deployed Bytecode Sourcemap
27317:28392:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42813:716;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25106:176;;;;;;:::i;:::-;;:::i;:::-;;13893:21;;;;;-1:-1:-1;;;;;13893:21:0;;;;;;-1:-1:-1;;;;;11233:55:1;;;11215:74;;11203:2;11188:18;13893:21:0;11170:125:1;46610:661:0;;;;;;:::i;:::-;;:::i;:::-;;;18938:25:1;;;18926:2;18911:18;46610:661:0;18893:76:1;19856:227:0;;;;;;:::i;:::-;;:::i;:::-;;;;18722:14:1;;18715:22;18697:41;;18769:2;18754:18;;18747:34;;;;18670:18;19856:227:0;18652:135:1;13921:41:0;;;;;-1:-1:-1;;;;;13921:41:0;;;43611:109;;;:::i;:::-;;;;;;;:::i;27846:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;44097:699;;;:::i;:::-;;;;;;;:::i;43815:115::-;;;:::i;24337:184::-;;;;;;:::i;:::-;;:::i;:::-;;;18502:14:1;;18495:22;18477:41;;18465:2;18450:18;24337:184:0;18432:92:1;41797:480:0;;;;;;:::i;:::-;;:::i;48742:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;48833:20:0;48806:7;48833:20;;;:13;:20;;;;;;;48742:119;42465:182;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28150:33::-;;;;;;:::i;:::-;;:::i;45972:151::-;;;;;;:::i;:::-;46058:7;46085:30;;;:21;:30;;;;;;;45972:151;33055:2636;;;;;;:::i;:::-;;:::i;45260:132::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14562:547::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;28060:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;39586:1716;;;;;;:::i;:::-;;:::i;22837:183::-;;;;;;:::i;:::-;;:::i;27989:37::-;;;;;;:::i;:::-;;:::i;:::-;;;;22177:25:1;;;22233:2;22218:18;;22211:34;;;;22261:18;;;22254:34;22165:2;22150:18;27989:37:0;22132:162:1;35958:861:0;;;;;;:::i;:::-;;:::i;27750:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;41486:148;;;;;;:::i;:::-;;:::i;47539:229::-;;;;;;:::i;:::-;47683:4;47707:18;;;:8;:18;;;;;;;;:27;;;;;;;;;:53;;;:41;;;;:53;;;;;;;47539:229;37605:1760;;;;;;:::i;:::-;;:::i;15453:296::-;;;;;;:::i;:::-;;:::i;45613:169::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27419:41::-;;;;;-1:-1:-1;;;;;27419:41:0;;;44962:122;;;;;;:::i;:::-;45028:7;45055:14;;;:4;:14;;;;;:21;;44962:122;48064:455;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24766:194::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28232:36::-;;;;;;:::i;:::-;;:::i;23821:215::-;;;;;;:::i;:::-;;:::i;27498:18::-;;;;;;23388:209;;;;;;:::i;:::-;;:::i;16196:3213::-;;;;;;:::i;:::-;;:::i;25593:649::-;;;;;;:::i;:::-;;:::i;27372:19::-;;;;;-1:-1:-1;;;;;27372:19:0;;;20620:1988;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;31251:1530::-;;;;;;:::i;:::-;;:::i;42813:716::-;42895:33;42946:23;42972:4;-1:-1:-1;;;;;42972:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42972:21:0;;;;;;;;;;;;:::i;:::-;42946:47;;43004:55;43093:6;:13;43062:45;;;;;;-1:-1:-1;;;43062:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;43004:103;;43123:9;43118:378;43142:6;:13;43138:1;:17;43118:378;;;43177:30;43210:4;-1:-1:-1;;;;;43210:16:0;;43227:6;43234:1;43227:9;;;;;;-1:-1:-1;;;43227:9:0;;;;;;;;;;;;;;;43210:27;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;43210:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43177:60;;43252:16;43271:4;-1:-1:-1;;;;;43271:25:0;;43297:6;43304:1;43297:9;;;;;;-1:-1:-1;;;43297:9:0;;;;;;;;;;;;;;;43271:36;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;43271:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43348:16;;:39;;-1:-1:-1;;;43348:39:0;;;;;18938:25:1;;;43252:55:0;;-1:-1:-1;43322:23:0;;-1:-1:-1;;;;;43348:16:0;;;;:29;;18911:18:1;;43348:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43348:39:0;;;;;;;;;;;;:::i;:::-;43322:65;;43424:11;43402:8;43411:1;43402:11;;;;;;-1:-1:-1;;;43402:11:0;;;;;;;;;;;;;;;:19;;:33;;;;43474:10;43450:8;43459:1;43450:11;;;;;;-1:-1:-1;;;43450:11:0;;;;;;;;;;;;;;;:21;;:34;;;;43118:378;;;43157:3;;;;;:::i;:::-;;;;43118:378;;;-1:-1:-1;43513:8:0;-1:-1:-1;;42813:716:0;:::o;25106:176::-;25187:17;;-1:-1:-1;;;;;25187:17:0;25179:40;25171:49;;;;;;25231:17;:43;;-1:-1:-1;;25231:43:0;-1:-1:-1;;;;;25231:43:0;;;;;;;;;;25106:176::o;46610:661::-;46759:25;46825:18;;;:8;:18;;;;;;;;:27;;;;;;;;46759:25;46871:218;46892:23;;;46871:218;;;46959:118;46994:7;47020:8;47047:11;;47059:2;47047:15;;;;;-1:-1:-1;;;47047:15:0;;;;;;;;;;;;;;;46959:16;:118::i;:::-;46938:139;;;;:::i;:::-;;-1:-1:-1;46917:4:0;;;;:::i;:::-;;;;46871:218;;;;47123:5;:13;;;47103:17;:33;47099:99;;;47173:5;:13;;;47153:33;;47099:99;47258:4;47251:3;;47231:17;:23;;;;:::i;:::-;47230:32;;;;:::i;:::-;47208:55;;;;:::i;:::-;;46610:661;-1:-1:-1;;;;;;46610:661:0:o;19856:227::-;19973:11;20025:6;;:50;;-1:-1:-1;;;20025:50:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;19973:11:0;;-1:-1:-1;;;;;20025:6:0;;:28;;19121:18:1;;20025:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20018:57;;;;19856:227;;;;;;:::o;43611:109::-;43660:16;43696;43689:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43611:109;:::o;44097:699::-;44182:32;44232;44267:4;-1:-1:-1;;;;;44267:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44267:24:0;;;;;;;;;;;;:::i;:::-;44232:59;;44302:39;44388:15;:22;44344:77;;;;;;-1:-1:-1;;;44344:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;44344:77:0;;;;;;;;;;;;;;;;44302:119;;44437:9;44432:333;44456:15;:22;44452:1;:26;44432:333;;;44521:16;;44569:18;;44500;;-1:-1:-1;;;;;44521:16:0;;:29;;44569:15;;44585:1;;44569:18;;;;-1:-1:-1;;;44569:18:0;;;;;;;;;;;;;;;44521:81;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;44521:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44521:81:0;;;;;;;;;;;;:::i;:::-;44500:102;;44617:15;44635:4;-1:-1:-1;;;;;44635:18:0;;44654:15;44670:1;44654:18;;;;;;-1:-1:-1;;;44654:18:0;;;;;;;;;;;;;;;44635:38;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;44635:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44617:56;;44710:5;44688:6;44695:1;44688:9;;;;;;-1:-1:-1;;;44688:9:0;;;;;;;;;;;;;;;:19;;:27;;;;44746:7;44730:6;44737:1;44730:9;;;;;;-1:-1:-1;;;44730:9:0;;;;;;;;;;;;;;;:13;;:23;;;;;44432:333;;44480:3;;;;;:::i;:::-;;;;44432:333;;43815:115;43867:16;43903:19;43896:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43815:115;:::o;24337:184::-;24444:4;24473:6;;:40;;-1:-1:-1;;;24473:40:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;-1:-1:-1;;;;;24473:6:0;;;;:18;;19121::1;;24473:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24466:47;;24337:184;;;;;:::o;41797:480::-;41859:7;41916:14;;;:4;:14;;;;;:21;41912:67;;-1:-1:-1;41966:1:0;41959:8;;41912:67;41992:27;42023:26;42040:8;42023:16;:26::i;:::-;42060:19;42082:14;;;:4;:14;;;;;42097:21;;41989:60;;-1:-1:-1;42060:19:0;;-1:-1:-1;42082:14:0;42097:25;;42121:1;;42097:25;:::i;:::-;42082:41;;;;;;-1:-1:-1;;;42082:41:0;;;;;;;;;;;;;;;;;;42060:63;;;;;;;;42082:41;;;;;;;42060:63;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42138:40:0;;42134:136;;;42202:15;;-1:-1:-1;42195:22:0;;-1:-1:-1;42195:22:0;42134:136;42257:1;42250:8;;;;41797:480;;;;:::o;42465:182::-;42542:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42542:18:0;-1:-1:-1;42581:40:0;42590:30;;;:21;:30;;;;;;;;;42581:40;;:8;:40;;;;;;:49;;;;;;;;;;42573:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42465:182::o;28150:33::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28150:33:0;:::o;33055:2636::-;33194:18;33215;;;:8;:18;;;;;;;;:27;;;;;;;;33272:21;;;;33312:12;33304:57;;;;-1:-1:-1;;;33304:57:0;;30375:2:1;33304:57:0;;;30357:21:1;;;30394:18;;;30387:30;30453:34;30433:18;;;30426:62;30505:18;;33304:57:0;;;;;;;;;33372:25;;33408:1828;33429:23;;;33408:1828;;;33537:8;33519:11;;33531:2;33519:15;;;;;-1:-1:-1;;;33519:15:0;;;;;;;;;;;;;;;33501;:33;;;;:::i;:::-;:44;33475:132;;;;-1:-1:-1;;;33475:132:0;;23998:2:1;33475:132:0;;;23980:21:1;24037:2;24017:18;;;24010:30;24076:28;24056:18;;;24049:56;24122:18;;33475:132:0;23970:176:1;33475:132:0;33701:10;33648:49;33671:8;33681:11;;33693:2;33681:15;;;;;-1:-1:-1;;;33681:15:0;;;;;;;;;;;;;;;33648:22;:49::i;:::-;-1:-1:-1;;;;;33648:63:0;;33622:184;;;;-1:-1:-1;;;33622:184:0;;27009:2:1;33622:184:0;;;26991:21:1;27048:2;27028:18;;;27021:30;27087:34;27067:18;;;27060:62;27158:29;27138:18;;;27131:57;27205:19;;33622:184:0;26981:249:1;33622:184:0;33842:118;33877:7;33903:8;33930:11;;33942:2;33930:15;;;;;-1:-1:-1;;;33930:15:0;;;;;;;;33842:118;33821:139;;;;:::i;:::-;;;34000:8;33979:17;:29;33975:1192;;34102:22;34123:1;34102:11;:22;:::i;:::-;34096:2;:28;34066:151;;;;-1:-1:-1;;;34066:151:0;;28149:2:1;34066:151:0;;;28131:21:1;28188:2;28168:18;;;28161:30;28227:34;28207:18;;;28200:62;-1:-1:-1;;;28278:18:1;;;28271:47;28335:19;;34066:151:0;28121:239:1;34066:151:0;34337:16;:23;34256:8;;-1:-1:-1;34363:1:0;-1:-1:-1;34333:720:0;;;34404:35;;;;34389:12;;34404:39;;34442:1;;34404:39;:::i;:::-;34564:16;34607:23;;34389:54;;-1:-1:-1;34564:16:0;34607:27;;34633:1;;34607:27;:::i;:::-;34564:93;;;;;;-1:-1:-1;;;34564:93:0;;;;;;;;;;;;;;;;;34539:16;34556:4;34539:22;;;;;;-1:-1:-1;;;34539:22:0;;;;;;;;;;;;;;;;:118;;;;34680:25;34708:16;34725:4;34708:22;;;;;;-1:-1:-1;;;34708:22:0;;;;;;;;;;;;;;;;;;;;;34782:88;;;:21;:88;;;;;;;;34708:22;;-1:-1:-1;35025:8:0;:4;35032:1;35025:8;:::i;:::-;34893:28;;;;:8;:28;;;;;;;;:47;;;;;;;;;:129;;:140;-1:-1:-1;34333:720:0;35071:16;:22;;;;;-1:-1:-1;;;35071:22:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;35071:22:0;;;;;;;;;;;;35112:35;;;:39;33975:1192;35220:4;35181:5;:19;;:36;35201:11;;35213:2;35201:15;;;;;-1:-1:-1;;;35201:15:0;;;;;;;;;;;;;;;35181:36;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;33454:4;;;;;:::i;:::-;;;;33408:1828;;;;35271:17;35246:5;:13;;:21;;;:42;;;;;;;:::i;:::-;;;;-1:-1:-1;;35321:5:0;;35425:3;;-1:-1:-1;;;;;35321:5:0;;;;:14;;35354:10;;35432:4;;35405:23;;:17;:23;:::i;:::-;35404:32;;;;:::i;:::-;35383:54;;:17;:54;:::i;:::-;35321:131;;-1:-1:-1;;;;;;35321:131:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;35321:131:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;35321:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35299:164;;;;;;35474:5;;;35496:6;35526:3;;-1:-1:-1;;;;;35474:5:0;;;;:13;;35496:6;;35533:4;;35506:23;;:17;:23;:::i;:::-;35505:32;;;;:::i;:::-;35474:64;;-1:-1:-1;;;;;;35474:64:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;35474:64:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;35474:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35549:6:0;;35595:3;;-1:-1:-1;;;;;35549:6:0;;;;:24;;35602:4;;35575:23;;:17;:23;:::i;:::-;35574:32;;;;:::i;:::-;35549:58;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;35549:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35623:60:0;;35672:10;11215:74:1;;35653:17:0;;-1:-1:-1;35643:8:0;;-1:-1:-1;35634:7:0;;35623:60;;11203:2:1;11188:18;35623:60:0;;;;;;;33055:2636;;;;;;;:::o;45260:132::-;45338:12;45370:4;:14;45375:8;45370:14;;;;;;;;;;;45363:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45260:132;;;:::o;14562:547::-;14670:19;14691:27;14737:11;14750:14;14768:79;14803:8;14826:10;14768:20;:79::i;:::-;14736:111;;;;14863:6;14858:54;;14898:1;14886:14;;;;;;;;;;;;;;;;;;;;;14858:54;14944:47;14974:8;14984:6;14944:29;:47::i;:::-;14922:69;;15011:43;15024:8;15034:19;15011:12;:43::i;:::-;15002:52;;15065:36;;14562:547;;;;;:::o;39586:1716::-;39759:10;;39749:21;;;;;;;:::i;:::-;;;;;;;;39737:8;:33;39715:112;;;;-1:-1:-1;;;39715:112:0;;25116:2:1;39715:112:0;;;25098:21:1;25155:2;25135:18;;;25128:30;25194:31;25174:18;;;25167:59;25243:18;;39715:112:0;25088:179:1;39715:112:0;39856:1;39846:7;:11;39838:53;;;;-1:-1:-1;;;39838:53:0;;27791:2:1;39838:53:0;;;27773:21:1;27830:2;27810:18;;;27803:30;27869:31;27849:18;;;27842:59;27918:18;;39838:53:0;27763:179:1;39838:53:0;39902:19;39924:14;;;:4;:14;;;;;39953:12;;39949:817;;39987:5;39998:42;;;;;;;;40002:7;39998:42;;;;40011:15;40029:1;40011:19;;;;:::i;:::-;39998:42;;;;;;;;;39987:54;;;;;;;;-1:-1:-1;39987:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40056:16;;:38;;-1:-1:-1;;;40056:38:0;;-1:-1:-1;;;;;40056:16:0;;;;:26;;:38;;40083:10;;;;40056:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39949:817;;;40130:27;40161:26;40178:8;40161:16;:26::i;:::-;40234:12;;40127:60;;-1:-1:-1;40228:5:0;;-1:-1:-1;40234:16:0;;40249:1;;40234:16;:::i;:::-;40228:23;;;;;;-1:-1:-1;;;40228:23:0;;;;;;;;;;;;;;;;;;;:33;;;40206:19;:55;40202:553;;;40318:19;:15;40336:1;40318:19;:::i;:::-;40288:12;;40282:5;;40288:16;;40303:1;;40288:16;:::i;:::-;40282:23;;;;;;-1:-1:-1;;;40282:23:0;;;;;;;;;;;;;;;;;;;:33;;:55;;;;40390:7;40356:5;40377:1;40362:5;:12;;;;:16;;;;:::i;:::-;40356:23;;;;;;-1:-1:-1;;;40356:23:0;;;;;;;;;;;;;;;;;;;:30;;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;;40422:12:0;;40458:7;;40416:5;;40422:16;;40437:1;;40422:16;:::i;:::-;40416:23;;;;;;-1:-1:-1;;;40416:23:0;;;;;;;;;;;;;;;;;;;:38;;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;40202:553:0;;-1:-1:-1;40202:553:0;;40506:5;40539:181;;;;;;;;40569:7;40539:181;;;;40603:15;40621:1;40603:19;;;;:::i;:::-;40539:181;;;;40690:7;40649:5;40670:1;40655:5;:12;;;;:16;;;;:::i;:::-;40649:23;;;;;;-1:-1:-1;;;40649:23:0;;;;;;;;;;;;;;;;;;;:38;;;:48;;;;:::i;:::-;40539:181;;40506:233;;;;;;;;-1:-1:-1;40506:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40202:553;39949:817;;40794:34;;;;:24;:34;;;;;;:39;:83;;;;;40876:1;40850:23;40864:8;40850:13;:23::i;:::-;:27;40794:83;40776:252;;;40904:19;:34;;;;;;;;;;;;40990:26;-1:-1:-1;40953:34:0;;;:24;40904:34;40953;;;;:63;40776:252;41060:5;;:54;;-1:-1:-1;;;41060:54:0;;41079:10;41060:54;;;11563:34:1;41099:4:0;11613:18:1;;;11606:43;11665:18;;;11658:34;;;-1:-1:-1;;;;;41060:5:0;;;;:18;;11475::1;;41060:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41038:142;;;;-1:-1:-1;;;41038:142:0;;;;;;;:::i;:::-;41205:10;41191:25;;;;:13;:25;;;;;:36;;41220:7;;41191:25;:36;;41220:7;;41191:36;:::i;:::-;;;;;;;;41262:7;41252:8;41243:51;41271:10;;41283;41243:51;;;;;;;;:::i;:::-;;;;;;;;39586:1716;;;;;:::o;22837:183::-;22938:7;22970:6;;:42;;-1:-1:-1;;;22970:42:0;;;;;18938:25:1;;;-1:-1:-1;;;;;22970:6:0;;;;:32;;18911:18:1;;22970:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27989:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:37:0;;-1:-1:-1;27989:37:0;:::o;35958:861::-;36080:25;36108:18;;;:8;:18;;;;;;;;:27;;;;;;;;36162:12;;36154:44;;;;-1:-1:-1;;;36154:44:0;;29328:2:1;36154:44:0;;;29310:21:1;29367:2;29347:18;;;29340:30;-1:-1:-1;;;29386:18:1;;;29379:45;29441:18;;36154:44:0;29300:165:1;36154:44:0;36227:1;36217:7;:11;36209:49;;;;-1:-1:-1;;;36209:49:0;;27437:2:1;36209:49:0;;;27419:21:1;27476:2;27456:18;;;27449:30;27515:27;27495:18;;;27488:55;27560:18;;36209:49:0;27409:175:1;36209:49:0;36286:7;36269:5;:13;;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;36326:5:0;;:54;;-1:-1:-1;;;36326:54:0;;36345:10;36326:54;;;11563:34:1;36365:4:0;11613:18:1;;;11606:43;11665:18;;;11658:34;;;-1:-1:-1;;;;;36326:5:0;;;;:18;;11475::1;;36326:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36304:142;;;;-1:-1:-1;;;36304:142:0;;;;;;;:::i;:::-;36508:27;;;;:32;:53;;;;;36560:1;36544:5;:13;;;:17;36508:53;36504:184;;;36578:16;:30;;;;;;;-1:-1:-1;36578:30:0;;;;;;;;36653:23;36623:27;;;:53;36504:184;36712:10;36698:25;;;;:13;:25;;;;;:36;;36727:7;;36698:25;:36;;36727:7;;36698:36;:::i;:::-;;;;-1:-1:-1;;36750:61:0;;;36793:10;11937:74:1;;12047:13;;12042:2;12027:18;;12020:41;12115:4;12103:17;;12097:24;12077:18;;;12070:52;12176:4;12164:17;;12158:24;12153:2;12138:18;;12131:52;12238:4;12226:17;;12220:24;12214:3;12199:19;;12192:53;12300:4;12288:17;;12282:24;12276:3;12261:19;;12254:53;12362:4;12350:17;;12344:24;12338:3;12323:19;;12316:53;12424:4;12412:17;;12406:24;12400:3;12385:19;;12378:53;12486:4;12474:17;;12468:24;12462:3;12447:19;;12440:53;36750:61:0;;36784:7;;36774:8;;36765:7;;36750:61;;;;;;11924:3:1;36750:61:0;;;35958:861;;;;:::o;41486:148::-;41604:22;;;;:12;:22;;;;;;;;;41597:29;;;;;;;;;;;;;;;;;41568:16;;41597:29;;;41604:22;41597:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41486:148;;;:::o;37605:1760::-;37928:15;38000:10;;37990:21;;;;;;;:::i;:::-;;;;;;;;37978:8;:33;37956:112;;;;-1:-1:-1;;;37956:112:0;;25116:2:1;37956:112:0;;;25098:21:1;25155:2;25135:18;;;25128:30;25194:31;25174:18;;;25167:59;25243:18;;37956:112:0;25088:179:1;37956:112:0;38113:238;;;;;;19542:25:1;;;19583:18;;;19576:34;;;19626:18;;;19619:34;;;19669:18;;;19662:34;;;19712:19;;;19705:35;;;19756:19;;;19749:35;;;19800:19;;;19793:35;;;19514:19;;38113:238:0;;;-1:-1:-1;;38113:238:0;;;;;;;;;38089:273;;38113:238;38089:273;;;;38373:25;38401:18;;;:8;:18;;;;;:27;;;;;;;;38455:12;;38089:273;;-1:-1:-1;38401:27:0;38455:17;38447:61;;;;-1:-1:-1;;;38447:61:0;;26649:2:1;38447:61:0;;;26631:21:1;26688:2;26668:18;;;26661:30;26727:33;26707:18;;;26700:61;26778:18;;38447:61:0;26621:181:1;38447:61:0;38537:1;38527:7;:11;38519:56;;;;-1:-1:-1;;;38519:56:0;;24755:2:1;38519:56:0;;;24737:21:1;;;24774:18;;;24767:30;24833:34;24813:18;;;24806:62;24885:18;;38519:56:0;24727:182:1;38519:56:0;38606:1;38594:9;:13;38586:60;;;;-1:-1:-1;;;38586:60:0;;22904:2:1;38586:60:0;;;22886:21:1;22943:2;22923:18;;;22916:30;22982:34;22962:18;;;22955:62;-1:-1:-1;;;23033:18:1;;;23026:32;23075:19;;38586:60:0;22876:224:1;38586:60:0;38689:9;38679:7;:19;38657:109;;;;-1:-1:-1;;;38657:109:0;;26240:2:1;38657:109:0;;;26222:21:1;26279:2;26259:18;;;26252:30;26318:34;26298:18;;;26291:62;-1:-1:-1;;;26369:18:1;;;26362:38;26417:19;;38657:109:0;26212:230:1;38657:109:0;38777:22;;;38810:15;;;:28;;;38849:14;;;;:26;;;38886:12;;;;:22;;;38919:20;;;;:38;;;38968:29;;;:56;;;38777:12;39035:22;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;39082:30;;;:21;:30;;;;;;:41;;;39134:16;;:38;;-1:-1:-1;;;39134:38:0;;-1:-1:-1;;;;;39134:16:0;;;;:26;;:38;;39161:10;;;;39134:38;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39210:7;39200:8;39188:54;39219:10;;39231;39188:54;;;;;;;;:::i;:::-;;;;;;;;39257:11;;39253:80;;39285:36;39294:7;39303:8;39313:7;39285:8;:36::i;:::-;39343:14;37605:1760;;;;;;;;;;;;:::o;15453:296::-;15583:27;15662:6;;:79;;-1:-1:-1;;;15662:79:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;15562:19:0;;15583:27;-1:-1:-1;;;;;15662:6:0;;:20;;19121:18:1;;15662:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15662:79:0;;;;;;;;;;;;:::i;:::-;15628:113;;;;-1:-1:-1;15453:296:0;-1:-1:-1;;;;15453:296:0:o;45613:169::-;45722:10;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;45722:10:0;45752:14;;;;:4;:14;;;;;:22;;45767:6;;45752:22;;;;-1:-1:-1;;;45752:22:0;;;;;;;;;;;;;;;;;;;45745:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45613:169;;;;:::o;48064:455::-;48221:13;48247:21;48282:10;48271:29;;;;;;-1:-1:-1;;;48271:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48271:29:0;;48247:53;;48316:9;48311:176;48331:21;;;48311:176;;;48387:18;;;;:8;:18;;;;;;;;:27;;;;;;;;:41;;;48447:10;;48458:1;48447:13;;;;;-1:-1:-1;;;48447:13:0;;;;;;;;;;;;;;;48387:88;;;;;;;;;;;;;;;;;;;;;48374:7;48382:1;48374:10;;;;;;-1:-1:-1;;;48374:10:0;;;;;;;;;:101;;;:10;;;;;;;;;;;:101;48354:3;;;;:::i;:::-;;;;48311:176;;;-1:-1:-1;48504:7:0;48064:455;-1:-1:-1;;;;;48064:455:0:o;24766:194::-;24911:6;;:41;;-1:-1:-1;;;24911:41:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;24874:12:0;;-1:-1:-1;;;;;24911:6:0;;:19;;19121:18:1;;24911:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24911:41:0;;;;;;;;;;;;:::i;28232:36::-;;;;;;;;;;;;23821:215;23942:7;23974:6;;:54;;-1:-1:-1;;;23974:54:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;-1:-1:-1;;;;;23974:6:0;;;;:36;;19121:18:1;;23974:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23388:209::-;23506:7;23538:6;;:51;;-1:-1:-1;;;23538:51:0;;;;;19148:25:1;;;19189:18;;;19182:34;;;-1:-1:-1;;;;;23538:6:0;;;;:29;;19121:18:1;;23538:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16196:3213::-;16312:11;16325:14;16357;16374:35;16400:8;16374:25;:35::i;:::-;16357:52;-1:-1:-1;16424:11:0;16420:34;;16445:5;16452:1;16437:17;;;;;;;16420:34;16465:8;;;;:::i;:::-;;-1:-1:-1;16499:4:0;;-1:-1:-1;16484:12:0;;16465:8;16484:12;16753:45;16783:8;16465;16753:29;:45::i;:::-;16731:67;;16836:10;16813:19;:33;16809:56;;16856:5;16863:1;16848:17;;;;;;;;;;;;16809:56;16898:47;16928:8;16938:6;16898:29;:47::i;:::-;16876:69;;16982:10;16960:19;:32;16956:132;;;17071:5;17061:15;;16956:132;17178:7;17171:1374;;;17230:1;17213:13;17220:6;17213:4;:13;:::i;:::-;17212:19;;;;:::i;:::-;17202:29;;17268:97;17316:8;17343:7;17268:29;:97::i;:::-;17246:119;;17406:10;17384:19;:32;17380:1154;;;17486:17;17506:113;17558:8;17589:11;17599:1;17589:7;:11;:::i;17506:113::-;17486:133;;17655:10;17642:9;:23;17638:279;;17760:5;17750:15;;17638:279;;;17886:11;17896:1;17886:7;:11;:::i;:::-;17879:18;;17638:279;17380:1154;;;;18002:17;18022:113;18074:8;18105:11;:7;18115:1;18105:11;:::i;18022:113::-;18002:133;;18170:10;18158:9;:22;18154:365;;;18275:5;;-1:-1:-1;18303:9:0;;;;:::i;:::-;;;;18357;18335:31;;18154:365;;;18488:11;:7;18498:1;18488:11;:::i;:::-;18479:20;;18154:365;17380:1154;;17171:1374;;;18615:42;18627:8;18637:19;18615:11;:42::i;:::-;18610:792;;18729:4;18735:7;18721:22;;;;;;;;;;;;18610:792;18868:42;18880:8;18890:19;18868:11;:42::i;:::-;:62;;;;;18924:6;18914:7;:16;18868:62;18843:297;;;18965:9;;;;:::i;:::-;;;;19015:109;19067:8;19098:7;19015:29;:109::i;:::-;18993:131;;18843:297;;;19187:6;19176:7;:17;:63;;;;;19197:42;19209:8;19219:19;19197:11;:42::i;:::-;19154:153;;;19282:5;19289:1;19274:17;;;;;;;;;;;;19154:153;19376:4;19382:7;19368:22;;;;;;;;;;;;25593:649;25833:17;;:34;;-1:-1:-1;;;25833:34:0;;;;;18938:25:1;;;25706:13:0;;;;;;;;-1:-1:-1;;;;;25833:17:0;;;;:29;;18911:18:1;;25833:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25814:53;-1:-1:-1;25878:24:0;25941:81;25814:53;25992:19;:15;26010:1;25992:19;:::i;25941:81::-;25913:109;-1:-1:-1;25913:109:0;-1:-1:-1;26037:15:0;26033:66;;26077:1;26080;26083:3;26069:18;;;;;;;;;;26033:66;26109:18;26130:23;26141:11;26130:10;:23::i;:::-;26109:44;-1:-1:-1;26230:3:0;;-1:-1:-1;;;;25593:649:0;;;;;;:::o;20620:1988::-;20818:22;;20935:16;;20976:89;21011:8;21034:20;21047:7;21034:10;:20;:::i;20976:89::-;20934:131;;;;21115:11;21110:86;;21151:14;;;21163:1;21151:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21167:16:0;;;21181:1;21167:16;;;;;;;;21143:41;;-1:-1:-1;21167:16:0;-1:-1:-1;21143:41:0;;-1:-1:-1;;21143:41:0;21110:86;21206:17;21306:43;21328:8;21338:10;21306:21;:43::i;:::-;21279:70;;-1:-1:-1;21279:70:0;-1:-1:-1;21279:70:0;21399:86;;21440:14;;;21452:1;21440:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21456:16:0;;;21470:1;21456:16;;;;;;;;21432:41;;-1:-1:-1;21456:16:0;-1:-1:-1;21432:41:0;;-1:-1:-1;;;21432:41:0;21399:86;21495:17;21527:14;21556:37;21610:9;21596:24;;;;;;-1:-1:-1;;;21596:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21596:24:0;;21556:64;;21698:439;21717:9;21705;:21;:61;;;;-1:-1:-1;21755:11:0;21746:6;21730:13;:9;21742:1;21730:13;:::i;:::-;:22;;;;:::i;:::-;:36;21705:61;21698:439;;;21783:27;21813:108;21861:8;21888:18;21900:6;21888:9;:18;:::i;21813:108::-;21783:138;;21941:42;21953:8;21963:19;21941:11;:42::i;:::-;21936:167;;22038:19;22004:20;22025:9;22004:31;;;;;;-1:-1:-1;;;22004:31:0;;;;;;;;;;;;;;;;;;:53;22076:11;;;;:::i;:::-;;;;21936:167;22117:8;;;;:::i;:::-;;;;21698:439;;;;22149:27;22191:9;22179:22;;;;;;-1:-1:-1;;;22179:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22149:52;;22212:33;22262:9;22248:24;;;;;;-1:-1:-1;;;22248:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22248:24:0;;22212:60;;22345:10;22340:211;22366:9;22361:2;:14;22340:211;;;22421:20;22458:2;22442:13;22454:1;22442:9;:13;:::i;:::-;:18;;;;:::i;:::-;22421:40;;;;;;-1:-1:-1;;;22421:40:0;;;;;;;;;;;;;;;22398:16;22415:2;22398:20;;;;;;-1:-1:-1;;;22398:20:0;;;;;;;;;;;;;;:63;;;;;22495:44;22508:8;22518:16;22535:2;22518:20;;;;;;-1:-1:-1;;;22518:20:0;;;;;;;;;;;;;;;22495:12;:44::i;:::-;22476:12;22489:2;22476:16;;;;;;-1:-1:-1;;;22476:16:0;;;;;;;;;;;;;;:63;;;;22377:4;;;;;:::i;:::-;;;;22340:211;;;-1:-1:-1;22569:12:0;;-1:-1:-1;22583:16:0;-1:-1:-1;;;;;;;20620:1988:0;;;;;;;;:::o;31251:1530::-;31417:1;31393:14;;;:4;:14;;;;;:21;31371:109;;;;-1:-1:-1;;;31371:109:0;;22501:2:1;31371:109:0;;;22483:21:1;22540:2;22520:18;;;22513:30;22579:34;22559:18;;;22552:62;-1:-1:-1;;;22630:18:1;;;22623:32;22672:19;;31371:109:0;22473:224:1;31371:109:0;31491:25;;31527:196;31548:23;;;31527:196;;;31615:96;31654:8;31681:11;;31693:2;31681:15;;;;;-1:-1:-1;;;31681:15:0;;;;;;;;;;;;;;;31615:20;:96::i;:::-;31594:117;;;;:::i;:::-;;-1:-1:-1;31573:4:0;;;;:::i;:::-;;;;31527:196;;;-1:-1:-1;31755:5:0;;31859:3;;-1:-1:-1;;;;;31755:5:0;;;;:14;;31788:10;;31866:4;;31839:23;;:17;:23;:::i;:::-;31838:32;;;;:::i;:::-;31817:54;;:17;:54;:::i;:::-;31755:131;;-1:-1:-1;;;;;;31755:131:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;31755:131:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;31755:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31733:164;;;;;;31908:5;;;31930:6;31960:3;;-1:-1:-1;;;;;31908:5:0;;;;:13;;31930:6;;31967:4;;31940:23;;:17;:23;:::i;:::-;31939:32;;;;:::i;:::-;31908:64;;-1:-1:-1;;;;;;31908:64:0;;;;;;;-1:-1:-1;;;;;12696:55:1;;;31908:64:0;;;12678:74:1;12768:18;;;12761:34;12651:18;;31908:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;31983:6:0;;32029:3;;-1:-1:-1;;;;;31983:6:0;;;;:24;;32036:4;;32009:23;;:17;:23;:::i;:::-;32008:32;;;;:::i;:::-;31983:58;;;;;;;;;;;;;18938:25:1;;18926:2;18911:18;;18893:76;31983:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32056:23;32070:8;32056:13;:23::i;:::-;32052:648;;32105:34;;;;:24;:34;;;;;;:39;32101:588;;32165:12;32180:34;;;:24;:34;;;;;;:38;;32217:1;;32180:38;:::i;:::-;32334:19;32376:26;;32165:53;;-1:-1:-1;32334:19:0;32376:30;;32405:1;;32376:30;:::i;:::-;32334:91;;;;;;-1:-1:-1;;;32334:91:0;;;;;;;;;;;;;;;;;32306:19;32326:4;32306:25;;;;;;-1:-1:-1;;;32306:25:0;;;;;;;;;;;;;;;;:119;;;;32444:26;32473:19;32493:4;32473:25;;;;;;-1:-1:-1;;;32473:25:0;;;;;;;;;;;;;;;;;32444:54;;32564:4;32571:1;32564:8;;;;:::i;:::-;32517:44;;;;:24;:44;;;;;;:55;;;;32591:34;;;;;;:38;32648:19;:25;;;;;-1:-1:-1;;;32648:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;32101:588;;;32715:58;;32762:10;;32743:17;;32733:8;;32715:58;;;;;31251:1530;;;;:::o;53418:2288::-;53556:21;53643:7;53612:28;53630:10;53612:15;:28;:::i;:::-;:38;53590:118;;;;-1:-1:-1;;;53590:118:0;;30736:2:1;53590:118:0;;;30718:21:1;30775:2;30755:18;;;30748:30;30814:32;30794:18;;;30787:60;30864:18;;53590:118:0;30708:180:1;53590:118:0;53719:18;53740;;;:8;:18;;;;;;;;:27;;;;;;;;53787:31;;;:19;;;:31;;;;;;;;;53786:32;53778:67;;;;-1:-1:-1;;;53778:67:0;;30024:2:1;53778:67:0;;;30006:21:1;30063:2;30043:18;;;30036:30;30102:24;30082:18;;;30075:52;30144:18;;53778:67:0;29996:172:1;53778:67:0;53923:22;;;;53883:23;;;;53856:10;;53923:22;53870:36;;:10;:36;:::i;:::-;53869:76;;;;:::i;:::-;53856:89;;53998:10;54062:2;54037:5;:13;;:22;;;:27;;;;:::i;:::-;54011:23;;;;:53;;;;:::i;:::-;53998:66;;54118:28;54149:34;54162:8;54172:10;54149:12;:34::i;:::-;54118:65;;54202:15;:22;54228:1;54202:27;;54194:68;;;;-1:-1:-1;;;54194:68:0;;28567:2:1;54194:68:0;;;28549:21:1;28606:2;28586:18;;;28579:30;28645;28625:18;;;28618:58;28693:18;;54194:68:0;28539:178:1;54194:68:0;54288:34;54337:24;54375:35;54389:8;54399:10;54375:13;:35::i;:::-;54509:28;;;;54273:137;;-1:-1:-1;54273:137:0;-1:-1:-1;54421:20:0;;54509:33;54505:438;;54559:11;54573:29;54586:15;54573:12;:29::i;:::-;54559:43;;54617:11;54631:35;54644:21;54631:12;:35::i;:::-;54617:49;-1:-1:-1;54685:8:0;54681:251;;54729:5;54714:20;;54681:251;;;54767:3;54760;:10;54756:176;;54830:3;54816:9;54830:3;54816;:9;:::i;:::-;54807:19;;:5;:19;:::i;:::-;54806:27;;;;:::i;:::-;54791:42;;54756:176;;;54913:3;54899:9;54905:3;54913;54899:9;:::i;:::-;54890:19;;:5;:19;:::i;:::-;54889:27;;;;:::i;:::-;54874:42;;54756:176;54505:438;;;54969:20;;;-1:-1:-1;54969:13:0;55020:15;55033:2;55020:10;:15;:::i;:::-;55226:20;;;;55000:35;;-1:-1:-1;55214:32:0;;:57;;;;;55269:2;55250:16;:21;55214:57;55210:370;;;55358:37;;;;:49;;55398:9;;55358:49;:::i;:::-;55341:66;;;;:::i;:::-;;;55210:370;;;55481:28;;;;55466:43;;55440:128;;;;-1:-1:-1;;;55440:128:0;;29672:2:1;55440:128:0;;;29654:21:1;29711:2;29691:18;;;29684:30;29750:25;29730:18;;;29723:53;29793:18;;55440:128:0;29644:173:1;55440:128:0;55596:21;;;;:37;-1:-1:-1;55592:107:0;;;55666:21;;;;;-1:-1:-1;55592:107:0;53418:2288;;;;;;;;;;;;;:::o;52374:681::-;52457:19;52478:27;52518:14;52535:35;52561:8;52535:25;:35::i;:::-;52518:52;-1:-1:-1;52585:11:0;52581:65;;52621:9;;;;;;;;;;;;52632:1;52613:21;;;;;;;52581:65;52656:13;52741:271;52748:10;;52741:271;;52775:8;;;;:::i;:::-;;;;52806:47;52836:8;52846:6;52806:29;:47::i;:::-;52798:55;;52877:29;52890:8;52900:5;52877:12;:29::i;:::-;52925:13;;52868:38;;-1:-1:-1;52925:17:0;52921:80;;52979:5;-1:-1:-1;52963:22:0;;-1:-1:-1;52963:22:0;52921:80;52741:271;;;53030:9;;;;;;;;;-1:-1:-1;53030:9:0;;;-1:-1:-1;53041:5:0;-1:-1:-1;;52374:681:0;;;;:::o;26438:236::-;26525:15;;26558:109;26584:2;:9;26579:2;:14;26558:109;;;26648:2;26651;26648:6;;;;;;-1:-1:-1;;;26648:6:0;;;;;;;;;;;;;;;26626:13;:7;26636:3;26626:13;:::i;:::-;:29;;;;:::i;:::-;26616:39;-1:-1:-1;26595:4:0;;;;:::i;:::-;;;;26558:109;;;;26438:236;;;:::o;49560:2537::-;49671:18;49755:8;49724:28;49742:10;49724:15;:28;:::i;:::-;:39;49702:115;;;;-1:-1:-1;;;49702:115:0;;23998:2:1;49702:115:0;;;23980:21:1;24037:2;24017:18;;;24010:30;24076:28;24056:18;;;24049:56;24122:18;;49702:115:0;23970:176:1;49702:115:0;49837:33;49849:8;49859:10;49837:11;:33::i;:::-;49836:34;49828:61;;;;-1:-1:-1;;;49828:61:0;;23307:2:1;49828:61:0;;;23289:21:1;23346:2;23326:18;;;23319:30;-1:-1:-1;;;23365:18:1;;;23358:44;23419:18;;49828:61:0;23279:164:1;49828:61:0;49936:44;49959:8;49969:10;49936:22;:44::i;:::-;-1:-1:-1;;;;;49922:58:0;:10;-1:-1:-1;;;;;49922:58:0;;49900:143;;;;-1:-1:-1;;;49900:143:0;;28924:2:1;49900:143:0;;;28906:21:1;28963:2;28943:18;;;28936:30;29002:34;28982:18;;;28975:62;-1:-1:-1;;;29053:18:1;;;29046:33;29096:19;;49900:143:0;28896:225:1;49900:143:0;50054:19;50076:14;;;:4;:14;;;;;50143:12;;50076:14;;50054:19;;50189:227;50210:1;50196:11;50203:4;50196;:11;:::i;:::-;:15;50189:227;;;50251:1;50236:11;50243:4;50236;:11;:::i;:::-;50235:17;;;;:::i;:::-;50228:24;;50295:10;50271:5;50277:4;50271:11;;;;;;-1:-1:-1;;;50271:11:0;;;;;;;;;;;;;;;;;;;:21;;;:34;50267:138;;;50333:4;50326:11;;50267:138;;;50385:4;50378:11;;50267:138;50189:227;;;50429:24;50457:35;50471:8;50481:10;50457:13;:35::i;:::-;50426:66;;;50544:5;50550:4;50544:11;;;;;;-1:-1:-1;;;50544:11:0;;;;;;;;;;;;;;;;;;;:21;;;50525:16;:40;50503:123;;;;-1:-1:-1;;;50503:123:0;;24353:2:1;50503:123:0;;;24335:21:1;24392:2;24372:18;;;24365:30;24431:34;24411:18;;;24404:62;-1:-1:-1;;;24482:18:1;;;24475:31;24523:19;;50503:123:0;24325:223:1;50503:123:0;50673:5;50679:4;50673:11;;;;;;-1:-1:-1;;;50673:11:0;;;;;;;;;;;;;;;;;;;:21;;;50659:10;:35;;50637:115;;;;-1:-1:-1;;;50637:115:0;;25474:2:1;50637:115:0;;;25456:21:1;25513:2;25493:18;;;25486:30;25552:32;25532:18;;;25525:60;25602:18;;50637:115:0;25446:180:1;50637:115:0;50792:1;50771:5;50777:4;50771:11;;;;;;-1:-1:-1;;;50771:11:0;;;;;;;;;;;;;;;;;;;:18;;;:22;50763:54;;;;-1:-1:-1;;;50763:54:0;;23650:2:1;50763:54:0;;;23632:21:1;23689:2;23669:18;;;23662:30;-1:-1:-1;;;23708:18:1;;;23701:49;23767:18;;50763:54:0;23622:169:1;50763:54:0;50841:5;50847:4;50841:11;;;;;;-1:-1:-1;;;50841:11:0;;;;;;;;;;;;;;;;;;;:18;;;50828:31;;50891:1;50870:5;50876:4;50870:11;;;;;;-1:-1:-1;;;50870:11:0;;;;;;;;;;;;;;;;;;;;;:22;;;;50924:4;;51041:47;51063:8;51073:14;:10;51086:1;51073:14;:::i;51041:47::-;51017:71;-1:-1:-1;51100:11:0;;-1:-1:-1;51100:11:0;51137:90;51173:8;51196:20;:16;51215:1;51196:20;:::i;51137:90::-;51099:128;;-1:-1:-1;51099:128:0;-1:-1:-1;51269:1:0;51242:24;51099:128;51242:9;:24;:::i;:::-;:28;:39;;;;51275:6;51274:7;51242:39;51238:852;;;51303:6;51298:781;;51343:5;51349:10;51343:17;;;;;;-1:-1:-1;;;51343:17:0;;;;;;;;;;;;;;;;;;;:32;;;51330:45;;51298:781;;;51453:1;;51423:4;-1:-1:-1;51496:289:0;51517:1;51503:11;51510:4;51503;:11;:::i;:::-;:15;51496:289;;;51566:1;51551:11;51558:4;51551;:11;:::i;:::-;51550:17;;;;:::i;:::-;51543:24;;51618:16;51594:5;51600:4;51594:11;;;;;;-1:-1:-1;;;51594:11:0;;;;;;;;;;;;;;;;;;;:21;;;:40;51590:176;;;51670:4;51663:11;;51590:176;;;51738:4;51731:11;;51590:176;51496:289;;;51803:6;;;;:::i;:::-;;;;51839:10;51832:4;:17;51828:236;;;52026:5;52032:4;52026:11;;;;;;-1:-1:-1;;;52026:11:0;;;;;;;;;;;;;;;;;;;:18;;;51972:5;51978:4;51972:11;;;;;;-1:-1:-1;;;51972:11:0;;;;;;;;;;;;;;;;;;;:26;;;51912:5;51918:10;51912:17;;;;;;-1:-1:-1;;;51912:17:0;;;;;;;;;;;;;;;;;;;:32;;;:86;;;;:::i;:::-;:132;;;;:::i;:::-;51874:170;;51828:236;49560:2537;;;;;;;;;;;;;:::o;49087:222::-;49165:15;;49193:109;49219:2;:9;49214:2;:14;49193:109;;;49283:2;49286;49283:6;;;;;;-1:-1:-1;;;49283:6:0;;;;;;;;;;;;;;;49261:13;:7;49271:3;49261:13;:::i;:::-;:29;;;;:::i;:::-;49251:39;-1:-1:-1;49230:4:0;;;;:::i;:::-;;;;49193:109;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:395:1:-;;;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;414:164;490:13;;539;;532:21;522:32;;512:2;;568:1;565;558:12;583:375;;;698:3;691:4;683:6;679:17;675:27;665:2;;723:8;713;706:26;665:2;-1:-1:-1;753:20:1;;796:18;785:30;;782:2;;;835:8;825;818:26;782:2;879:4;871:6;867:17;855:29;;931:3;924:4;915:6;907;903:19;899:30;896:39;893:2;;;948:1;945;938:12;963:512;;1069:3;1062:4;1054:6;1050:17;1046:27;1036:2;;1091:5;1084;1077:20;1036:2;1124:6;1118:13;1150:18;1146:2;1143:26;1140:2;;;1172:18;;:::i;:::-;1216:55;1259:2;1240:13;;-1:-1:-1;;1236:27:1;1265:4;1232:38;1216:55;:::i;:::-;1296:2;1287:7;1280:19;1342:3;1335:4;1330:2;1322:6;1318:15;1314:26;1311:35;1308:2;;;1363:5;1356;1349:20;1308:2;1380:64;1441:2;1434:4;1425:7;1421:18;1414:4;1406:6;1402:17;1380:64;:::i;:::-;1462:7;1026:449;-1:-1:-1;;;;1026:449:1:o;1480:257::-;;1592:2;1580:9;1571:7;1567:23;1563:32;1560:2;;;1613:6;1605;1598:22;1560:2;1657:9;1644:23;1676:31;1701:5;1676:31;:::i;:::-;1726:5;1550:187;-1:-1:-1;;;1550:187:1:o;1742:261::-;;1865:2;1853:9;1844:7;1840:23;1836:32;1833:2;;;1886:6;1878;1871:22;1833:2;1923:9;1917:16;1942:31;1967:5;1942:31;:::i;2008:992::-;;2134:2;2177;2165:9;2156:7;2152:23;2148:32;2145:2;;;2198:6;2190;2183:22;2145:2;2236:9;2230:16;2265:18;2306:2;2298:6;2295:14;2292:2;;;2327:6;2319;2312:22;2292:2;2370:6;2359:9;2355:22;2345:32;;2415:7;2408:4;2404:2;2400:13;2396:27;2386:2;;2442:6;2434;2427:22;2386:2;2476;2470:9;2498:2;2494;2491:10;2488:2;;;2504:18;;:::i;:::-;2550:2;2547:1;2543:10;2533:20;;2573:28;2597:2;2593;2589:11;2573:28;:::i;:::-;2635:15;;;2666:12;;;;2698:11;;;2728;;;2724:20;;2721:33;-1:-1:-1;2718:2:1;;;2772:6;2764;2757:22;2718:2;2799:6;2790:15;;2814:156;2828:2;2825:1;2822:9;2814:156;;;2885:10;;2873:23;;2846:1;2839:9;;;;;2916:12;;;;2948;;2814:156;;;-1:-1:-1;2989:5:1;2114:886;-1:-1:-1;;;;;;;;2114:886:1:o;3005:212::-;;3125:2;3113:9;3104:7;3100:23;3096:32;3093:2;;;3146:6;3138;3131:22;3093:2;3174:37;3201:9;3174:37;:::i;3222:495::-;;;;3385:2;3373:9;3364:7;3360:23;3356:32;3353:2;;;3406:6;3398;3391:22;3353:2;3434:37;3461:9;3434:37;:::i;:::-;3424:47;;3515:2;3504:9;3500:18;3494:25;3542:18;3534:6;3531:30;3528:2;;;3579:6;3571;3564:22;3528:2;3607:60;3659:7;3650:6;3639:9;3635:22;3607:60;:::i;:::-;3597:70;;;3707:2;3696:9;3692:18;3686:25;3676:35;;3343:374;;;;;:::o;3722:273::-;;;3859:2;3847:9;3838:7;3834:23;3830:32;3827:2;;;3880:6;3872;3865:22;3827:2;3908:37;3935:9;3908:37;:::i;:::-;3898:47;;3985:2;3974:9;3970:18;3964:25;3954:35;;3817:178;;;;;:::o;4000:190::-;;4112:2;4100:9;4091:7;4087:23;4083:32;4080:2;;;4133:6;4125;4118:22;4080:2;-1:-1:-1;4161:23:1;;4070:120;-1:-1:-1;4070:120:1:o;4195:194::-;;4318:2;4306:9;4297:7;4293:23;4289:32;4286:2;;;4339:6;4331;4324:22;4286:2;-1:-1:-1;4367:16:1;;4276:113;-1:-1:-1;4276:113:1:o;4394:525::-;;;;4558:2;4546:9;4537:7;4533:23;4529:32;4526:2;;;4579:6;4571;4564:22;4526:2;4620:9;4607:23;4597:33;;4681:2;4670:9;4666:18;4653:32;4708:18;4700:6;4697:30;4694:2;;;4745:6;4737;4730:22;4694:2;4789:70;4851:7;4842:6;4831:9;4827:22;4789:70;:::i;:::-;4516:403;;4878:8;;-1:-1:-1;4763:96:1;;-1:-1:-1;;;;4516:403:1:o;4924:593::-;;;;;5105:2;5093:9;5084:7;5080:23;5076:32;5073:2;;;5126:6;5118;5111:22;5073:2;5167:9;5154:23;5144:33;;5224:2;5213:9;5209:18;5196:32;5186:42;;5279:2;5268:9;5264:18;5251:32;5306:18;5298:6;5295:30;5292:2;;;5343:6;5335;5328:22;5292:2;5387:70;5449:7;5440:6;5429:9;5425:22;5387:70;:::i;:::-;5063:454;;;;-1:-1:-1;5476:8:1;-1:-1:-1;;;;5063:454:1:o;5522:326::-;;;;5668:2;5656:9;5647:7;5643:23;5639:32;5636:2;;;5689:6;5681;5674:22;5636:2;-1:-1:-1;;5717:23:1;;;5787:2;5772:18;;5759:32;;-1:-1:-1;5838:2:1;5823:18;;;5810:32;;5626:222;-1:-1:-1;5626:222:1:o;5853:258::-;;;5982:2;5970:9;5961:7;5957:23;5953:32;5950:2;;;6003:6;5995;5988:22;5950:2;-1:-1:-1;;6031:23:1;;;6101:2;6086:18;;;6073:32;;-1:-1:-1;5940:171:1:o;6116:565::-;;;;;6281:2;6269:9;6260:7;6256:23;6252:32;6249:2;;;6302:6;6294;6287:22;6249:2;6343:9;6330:23;6320:33;;6400:2;6389:9;6385:18;6372:32;6362:42;;6455:2;6444:9;6440:18;6427:32;6482:18;6474:6;6471:30;6468:2;;;6519:6;6511;6504:22;6468:2;6563:58;6613:7;6604:6;6593:9;6589:22;6563:58;:::i;6686:395::-;;;;;6849:3;6837:9;6828:7;6824:23;6820:33;6817:2;;;6871:6;6863;6856:22;6817:2;-1:-1:-1;;6899:23:1;;;6969:2;6954:18;;6941:32;;-1:-1:-1;7020:2:1;7005:18;;6992:32;;7071:2;7056:18;7043:32;;-1:-1:-1;6807:274:1;-1:-1:-1;6807:274:1:o;7086:979::-;;;;;;;;;;;7353:3;7341:9;7332:7;7328:23;7324:33;7321:2;;;7375:6;7367;7360:22;7321:2;7416:9;7403:23;7393:33;;7473:2;7462:9;7458:18;7445:32;7435:42;;7524:2;7513:9;7509:18;7496:32;7486:42;;7575:2;7564:9;7560:18;7547:32;7537:42;;7626:3;7615:9;7611:19;7598:33;7588:43;;7678:3;7667:9;7663:19;7650:33;7640:43;;7730:3;7719:9;7715:19;7702:33;7692:43;;7786:3;7775:9;7771:19;7758:33;7814:18;7806:6;7803:30;7800:2;;;7851:6;7843;7836:22;7800:2;7895:58;7945:7;7936:6;7925:9;7921:22;7895:58;:::i;:::-;7869:84;;7972:8;7962:18;;;7999:8;7989:18;;;8054:3;8043:9;8039:19;8026:33;8016:43;;7311:754;;;;;;;;;;;;;:::o;8070:355::-;;8202:2;8190:9;8181:7;8177:23;8173:32;8170:2;;;8223:6;8215;8208:22;8170:2;8261:9;8255:16;8294:18;8286:6;8283:30;8280:2;;;8331:6;8323;8316:22;8280:2;8359:60;8411:7;8402:6;8391:9;8387:22;8359:60;:::i;8430:729::-;;8560:3;8604:2;8592:9;8583:7;8579:23;8575:32;8572:2;;;8625:6;8617;8610:22;8572:2;8656:19;8672:2;8656:19;:::i;:::-;8643:32;;8704:9;8698:16;8691:5;8684:31;8768:2;8757:9;8753:18;8747:25;8742:2;8735:5;8731:14;8724:49;8826:2;8815:9;8811:18;8805:25;8800:2;8793:5;8789:14;8782:49;8884:2;8873:9;8869:18;8863:25;8858:2;8851:5;8847:14;8840:49;8943:3;8932:9;8928:19;8922:26;8916:3;8909:5;8905:15;8898:51;9003:3;8992:9;8988:19;8982:26;8976:3;8969:5;8965:15;8958:51;9063:3;9052:9;9048:19;9042:26;9036:3;9029:5;9025:15;9018:51;9123:3;9112:9;9108:19;9102:26;9096:3;9089:5;9085:15;9078:51;9148:5;9138:15;;;8540:619;;;;:::o;9558:268::-;;9646:6;9641:3;9634:19;9698:6;9691:5;9684:4;9679:3;9675:14;9662:43;9750:3;9743:4;9734:6;9729:3;9725:16;9721:27;9714:40;9815:4;9808:2;9804:7;9799:2;9791:6;9787:15;9783:29;9778:3;9774:39;9770:50;9763:57;;9624:202;;;;;:::o;9831:257::-;;9910:5;9904:12;9937:6;9932:3;9925:19;9953:63;10009:6;10002:4;9997:3;9993:14;9986:4;9979:5;9975:16;9953:63;:::i;:::-;10070:2;10049:15;-1:-1:-1;;10045:29:1;10036:39;;;;10077:4;10032:50;;9880:208;-1:-1:-1;;9880:208:1:o;10791:273::-;;10974:6;10966;10961:3;10948:33;11000:16;;11025:15;;;11000:16;10938:126;-1:-1:-1;10938:126:1:o;12806:645::-;12971:2;13023:21;;;13093:13;;12996:18;;;13115:22;;;12806:645;;12971:2;13194:15;;;;13168:2;13153:18;;;12806:645;13240:185;13254:6;13251:1;13248:13;13240:185;;;13329:13;;13322:21;13315:29;13303:42;;13400:15;;;;13365:12;;;;13276:1;13269:9;13240:185;;;-1:-1:-1;13442:3:1;;12951:500;-1:-1:-1;;;;;;12951:500:1:o;13456:635::-;13627:2;13679:21;;;13749:13;;13652:18;;;13771:22;;;13456:635;;13627:2;13850:15;;;;13824:2;13809:18;;;13456:635;13896:169;13910:6;13907:1;13904:13;13896:169;;;13971:13;;13959:26;;14040:15;;;;14005:12;;;;13932:1;13925:9;13896:169;;14096:1335;;14382:2;14371:9;14367:18;14412:2;14401:9;14394:21;14435:6;14470;14464:13;14501:6;14493;14486:22;14539:2;14528:9;14524:18;14517:25;;14601:2;14591:6;14588:1;14584:14;14573:9;14569:30;14565:39;14551:53;;14623:4;14662:2;14654:6;14650:15;14683:4;14696:254;14710:6;14707:1;14704:13;14696:254;;;14803:2;14799:7;14787:9;14779:6;14775:22;14771:36;14766:3;14759:49;14831:39;14863:6;14854;14848:13;14831:39;:::i;:::-;14821:49;-1:-1:-1;14928:12:1;;;;14893:15;;;;14732:1;14725:9;14696:254;;;-1:-1:-1;;14986:22:1;;;14966:18;;;14959:50;15062:13;;15084:24;;;15166:15;;;;15126;;;-1:-1:-1;15062:13:1;-1:-1:-1;15201:4:1;15214:189;15230:8;15225:3;15222:17;15214:189;;;15299:15;;15285:30;;15376:17;;;;15337:14;;;;15258:1;15249:11;15214:189;;;-1:-1:-1;15420:5:1;;14343:1088;-1:-1:-1;;;;;;;14343:1088:1:o;15436:1098::-;;15691:2;15731;15720:9;15716:18;15761:2;15750:9;15743:21;15784:6;15819;15813:13;15850:6;15842;15835:22;15888:2;15877:9;15873:18;15866:25;;15950:2;15940:6;15937:1;15933:14;15922:9;15918:30;15914:39;15900:53;;15988:2;15980:6;15976:15;16009:4;16022:483;16036:6;16033:1;16030:13;16022:483;;;16129:2;16125:7;16113:9;16105:6;16101:22;16097:36;16092:3;16085:49;16163:6;16157:13;16193:6;16212:48;16253:6;16248:2;16242:9;10176:5;10170:12;10165:3;10158:25;10232:4;10225:5;10221:16;10215:23;10208:4;10203:3;10199:14;10192:47;10288:4;10281:5;10277:16;10271:23;10264:4;10259:3;10255:14;10248:47;10344:4;10337:5;10333:16;10327:23;10320:4;10315:3;10311:14;10304:47;10400:4;10393:5;10389:16;10383:23;10376:4;10371:3;10367:14;10360:47;10456:4;10449:5;10445:16;10439:23;10432:4;10427:3;10423:14;10416:47;10512:4;10505:5;10501:16;10495:23;10488:4;10483:3;10479:14;10472:47;10568:4;10561:5;10557:16;10551:23;10544:4;10539:3;10535:14;10528:47;10148:433;;;16212:48;16307:2;16303;16299:11;16293:18;16273:38;;16352:2;16343:6;16335;16331:19;16324:31;16378:47;16421:2;16413:6;16409:15;16395:12;16378:47;:::i;:::-;16368:57;-1:-1:-1;;;16483:12:1;;;;16448:15;;;;16058:1;16051:9;16022:483;;;-1:-1:-1;16522:6:1;;15671:863;-1:-1:-1;;;;;;;15671:863:1:o;16539:1094::-;;16792:2;16832;16821:9;16817:18;16862:2;16851:9;16844:21;16885:6;16920;16914:13;16951:6;16943;16936:22;16977:2;16967:12;;17010:2;16999:9;16995:18;16988:25;;17072:2;17062:6;17059:1;17055:14;17044:9;17040:30;17036:39;17110:2;17102:6;17098:15;17131:4;17144:460;17158:6;17155:1;17152:13;17144:460;;;17223:22;;;-1:-1:-1;;17219:36:1;17207:49;;17279:13;;17325:9;;17347:18;;;17392:47;17423:15;;;17325:9;17392:47;:::i;:::-;17482:11;;;17476:18;17459:15;;;17452:43;;;;17582:12;;;;17378:61;-1:-1:-1;17547:15:1;;;;17180:1;17173:9;17144:460;;;-1:-1:-1;17621:6:1;;16772:861;-1:-1:-1;;;;;;;;16772:861:1:o;17638:694::-;17851:2;17903:21;;;17973:13;;17876:18;;;17995:22;;;17638:694;;17851:2;18074:15;;;;18048:2;18033:18;;;17638:694;18120:186;18134:6;18131:1;18128:13;18120:186;;;18183:41;18220:3;18211:6;18205:13;10655:12;;10643:25;;10717:4;10706:16;;;10700:23;10684:14;;;10677:47;10773:4;10762:16;;;10756:23;10740:14;;10733:47;10633:153;18183:41;18281:15;;;;18253:4;18244:14;;;;;18156:1;18149:9;18120:186;;19839:244;;19996:2;19985:9;19978:21;20016:61;20073:2;20062:9;20058:18;20050:6;20042;20016:61;:::i;20088:364::-;;20273:2;20262:9;20255:21;20293:61;20350:2;20339:9;20335:18;20327:6;20319;20293:61;:::i;:::-;20285:69;;-1:-1:-1;;;;;20394:6:1;20390:55;20385:2;20374:9;20370:18;20363:83;20245:207;;;;;;:::o;20457:217::-;;20604:2;20593:9;20586:21;20624:44;20664:2;20653:9;20649:18;20641:6;20624:44;:::i;20679:288::-;;20854:2;20843:9;20836:21;20874:44;20914:2;20903:9;20899:18;20891:6;20874:44;:::i;:::-;20866:52;;20954:6;20949:2;20938:9;20934:18;20927:34;20826:141;;;;;:::o;25631:402::-;25833:2;25815:21;;;25872:2;25852:18;;;25845:30;25911:34;25906:2;25891:18;;25884:62;-1:-1:-1;;;25977:2:1;25962:18;;25955:36;26023:3;26008:19;;25805:228::o;30893:259::-;31085:3;31070:19;;31098:48;31074:9;31128:6;10176:5;10170:12;10165:3;10158:25;10232:4;10225:5;10221:16;10215:23;10208:4;10203:3;10199:14;10192:47;10288:4;10281:5;10277:16;10271:23;10264:4;10259:3;10255:14;10248:47;10344:4;10337:5;10333:16;10327:23;10320:4;10315:3;10311:14;10304:47;10400:4;10393:5;10389:16;10383:23;10376:4;10371:3;10367:14;10360:47;10456:4;10449:5;10445:16;10439:23;10432:4;10427:3;10423:14;10416:47;10512:4;10505:5;10501:16;10495:23;10488:4;10483:3;10479:14;10472:47;10568:4;10561:5;10557:16;10551:23;10544:4;10539:3;10535:14;10528:47;10148:433;;;31157:234;10655:12;;10643:25;;10717:4;10706:16;;;10700:23;10684:14;;;10677:47;10773:4;10762:16;;;10756:23;10740:14;;;10733:47;31333:2;31318:18;;31345:40;10633:153;31902:275;31973:2;31967:9;32038:2;32019:13;;-1:-1:-1;;32015:27:1;32003:40;;32073:18;32058:34;;32094:22;;;32055:62;32052:2;;;32120:18;;:::i;:::-;32156:2;32149:22;31947:230;;-1:-1:-1;31947:230:1:o;32182:128::-;;32253:1;32249:6;32246:1;32243:13;32240:2;;;32259:18;;:::i;:::-;-1:-1:-1;32295:9:1;;32230:80::o;32315:217::-;;32381:1;32371:2;;-1:-1:-1;;;32406:31:1;;32460:4;32457:1;32450:15;32488:4;32413:1;32478:15;32371:2;-1:-1:-1;32517:9:1;;32361:171::o;32537:168::-;;32643:1;32639;32635:6;32631:14;32628:1;32625:21;32620:1;32613:9;32606:17;32602:45;32599:2;;;32650:18;;:::i;:::-;-1:-1:-1;32690:9:1;;32589:116::o;32710:125::-;;32778:1;32775;32772:8;32769:2;;;32783:18;;:::i;:::-;-1:-1:-1;32820:9:1;;32759:76::o;32840:258::-;32912:1;32922:113;32936:6;32933:1;32930:13;32922:113;;;33012:11;;;33006:18;32993:11;;;32986:39;32958:2;32951:10;32922:113;;;33053:6;33050:1;33047:13;33044:2;;;33088:1;33079:6;33074:3;33070:16;33063:27;33044:2;;32893:205;;;:::o;33103:136::-;;33170:5;33160:2;;33179:18;;:::i;:::-;-1:-1:-1;;;33215:18:1;;33150:89::o;33244:135::-;;-1:-1:-1;;33304:17:1;;33301:2;;;33324:18;;:::i;:::-;-1:-1:-1;33371:1:1;33360:13;;33291:88::o;33384:127::-;33445:10;33440:3;33436:20;33433:1;33426:31;33476:4;33473:1;33466:15;33500:4;33497:1;33490:15;33516:127;33577:10;33572:3;33568:20;33565:1;33558:31;33608:4;33605:1;33598:15;33632:4;33629:1;33622:15;33648:154;-1:-1:-1;;;;;33727:5:1;33723:54;33716:5;33713:65;33703:2;;33792:1;33789;33782:12;33703:2;33693:109;:::o
Swarm Source
ipfs://9e7893de646a1a68e4a9d5a068f3acec5a127b5909b0a75e1cc218e439522891
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.