Contract 0x7B49420008BcA14782F2700547764AdAdD54F813 5

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0xfc6361dd6fedbed6d9076621009be1a697a6792b4a63a785882f02f4b064d0930x60806040321077662022-06-10 18:09:5261 days 23 hrs ago0x1b9c9643f6ea991ba089e6b27abef49fafdb97f4 IN  Create: Autopay0 Ether0.‍00433837 1.‍5
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Autopay

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-10
*/

/**
 *Submitted for verification at Etherscan.io on 2022-06-10
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

/**
 @author Tellor Inc.
 @title Autopay
 @dev This is contract for automatically paying for Tellor oracle data at
 * specific time intervals. Any non-rebasing ERC20 token can be used for payment.
 * Only the first data submission within each time window gets a reward.
*/

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 changeTellorContract(address _tContract) external;
    function changeControllerContract(address _newController) external;
    function changeGovernanceContract(address _newGovernance) external;
    function changeOracleContract(address _newOracle) external;
    function changeTreasuryContract(address _newTreasury) 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, uint _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(uint);
    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,uint);
    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 getReportsSubmittedByAddress(address _reporter) external view returns(uint256);
    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 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 getTimeOfLastNewValue() external view returns(uint256);
    //Treasury
    function issueTreasury(uint256 _maxAmount, uint256 _rate, uint256 _duration) external;
    function payTreasury(address _investor,uint256 _id) external;
    function buyTreasury(uint256 _id,uint256 _amount) external;
    function getTreasuryDetails(uint256 _id) external view returns(uint256,uint256,uint256,uint256);
    function getTreasuryFundsByUser(address _user) external view returns(uint256);
    function getTreasuryAccount(uint256 _id, address _investor) external view returns(uint256,uint256,bool);
    function getTreasuryCount() external view returns(uint256);
    function getTreasuryOwners(uint256 _id) external view returns(address[] memory);
    function wasPaid(uint256 _id, address _investor) external view returns(bool);
    //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;
}


/**
 * @title UserContract
 * This contract allows for easy integration with the Tellor System
 * by helping smart contracts to read data from Tellor
 */
contract UsingTellor {
    ITellor public tellor;

    /*Constructor*/
    /**
     * @dev the constructor sets the tellor address in storage
     * @param _tellor is the TellorMaster address
     */
    constructor(address payable _tellor) {
        tellor = ITellor(_tellor);
    }

    /*Getters*/
    /**
     * @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 _ifRetrieve bool true if non-zero value successfully retrieved
     * @return _value the value retrieved
     * @return _timestampRetrieved the retrieved value's timestamp
     */
    function getCurrentValue(bytes32 _queryId)
        public
        view
        returns (
            bool _ifRetrieve,
            bytes memory _value,
            uint256 _timestampRetrieved
        )
    {
        uint256 _count = getNewValueCountbyQueryId(_queryId);

        if (_count == 0) {
            return (false, bytes(""), 0);
        }
        uint256 _time = getTimestampbyQueryIdandIndex(_queryId, _count - 1);
        _value = retrieveData(_queryId, _time);
        if (keccak256(_value) != keccak256(bytes("")))
            return (true, _value, _time);
        return (false, bytes(""), _time);
    }

    /**
     * @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 _ifRetrieve bool true if able to retrieve a non-zero value
     * @return _value the value retrieved
     * @return _timestampRetrieved the value's timestamp
     */
    function getDataBefore(bytes32 _queryId, uint256 _timestamp)
        public
        view
        returns (
            bool _ifRetrieve,
            bytes memory _value,
            uint256 _timestampRetrieved
        )
    {
        (bool _found, uint256 _index) = getIndexForDataBefore(
            _queryId,
            _timestamp
        );
        if (!_found) return (false, bytes(""), 0);
        uint256 _time = getTimestampbyQueryIdandIndex(_queryId, _index);
        _value = retrieveData(_queryId, _time);
        if (keccak256(_value) != keccak256(bytes("")))
            return (true, _value, _time);
        return (false, bytes(""), 0);
    }

    /**
     * @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)
    {
        uint256 _count = getNewValueCountbyQueryId(_queryId);

        if (_count > 0) {
            uint256 middle;
            uint256 start = 0;
            uint256 end = _count - 1;
            uint256 _time;

            //Checking Boundaries to short-circuit the algorithm
            _time = getTimestampbyQueryIdandIndex(_queryId, start);
            if (_time >= _timestamp) return (false, 0);
            _time = getTimestampbyQueryIdandIndex(_queryId, end);
            if (_time < _timestamp) return (true, end);

            //Since the value is within our boundaries, do a binary search
            while (true) {
                middle = (end - start) / 2 + 1 + start;
                _time = getTimestampbyQueryIdandIndex(_queryId, middle);
                if (_time < _timestamp) {
                    //get immediate next value
                    uint256 _nextTime = getTimestampbyQueryIdandIndex(
                        _queryId,
                        middle + 1
                    );
                    if (_nextTime >= _timestamp) {
                        //_time is correct
                        return (true, middle);
                    } else {
                        //look from middle + 1(next value) to end
                        start = middle + 1;
                    }
                } else {
                    uint256 _prevTime = getTimestampbyQueryIdandIndex(
                        _queryId,
                        middle - 1
                    );
                    if (_prevTime < _timestamp) {
                        // _prevtime is correct
                        return (true, middle - 1);
                    } else {
                        //look from start to middle -1(prev value)
                        end = middle - 1;
                    }
                }
                //We couldn't find a value
                //if(middle - 1 == start || middle == _count) return (false, 0);
            }
        }
        return (false, 0);
    }

    /**
     * @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)
    {
        //tellorx check rinkeby/ethereum
        if (
            tellor == ITellor(0x18431fd88adF138e8b979A7246eb58EA7126ea16) ||
            tellor == ITellor(0xe8218cACb0a5421BC6409e498d9f8CC8869945ea)
        ) {
            return tellor.getTimestampCountById(_queryId);
        } else {
            return tellor.getNewValueCountbyQueryId(_queryId);
        }
    }

    // /**
    //  * @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)
    {
        //tellorx check rinkeby/ethereum
        if (
            tellor == ITellor(0x18431fd88adF138e8b979A7246eb58EA7126ea16) ||
            tellor == ITellor(0xe8218cACb0a5421BC6409e498d9f8CC8869945ea)
        ) {
            return tellor.getReportTimestampByIndex(_queryId, _index);
        } else {
            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)
    {
        ITellor _governance;
        //tellorx check rinkeby/ethereum
        if (
            tellor == ITellor(0x18431fd88adF138e8b979A7246eb58EA7126ea16) ||
            tellor == ITellor(0xe8218cACb0a5421BC6409e498d9f8CC8869945ea)
        ) {
            ITellor _newTellor = ITellor(
                0x88dF592F8eb5D7Bd38bFeF7dEb0fBc02cf3778a0
            );
            _governance = ITellor(
                _newTellor.addresses(
                    0xefa19baa864049f50491093580c5433e97e8d5e41f8db1a61108b4fa44cacd93
                )
            );
        } else {
            _governance = ITellor(tellor.governance());
        }
        return
            _governance
                .getVoteRounds(
                    keccak256(abi.encodePacked(_queryId, _timestamp))
                )
                .length > 0;
    }

    /**
     * @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)
    {
        //tellorx check rinkeby/ethereum
        if (
            tellor == ITellor(0x18431fd88adF138e8b979A7246eb58EA7126ea16) ||
            tellor == ITellor(0xe8218cACb0a5421BC6409e498d9f8CC8869945ea)
        ) {
            return tellor.getValueByTimestamp(_queryId, _timestamp);
        } else {
            return tellor.retrieveData(_queryId, _timestamp);
        }
    }
}

interface IERC20 {
  function transfer(address _to, uint256 _amount) external returns(bool);
  function transferFrom(address _from, address _to, uint256 _amount) external returns(bool);
}


contract Autopay is UsingTellor {
    // Storage
    ITellor public master; // Tellor contract address
    IERC20 public token; // TRB token address
    address public owner;
    uint256 public fee; // 1000 is 100%, 50 is 5%, etc.

    mapping(bytes32 => mapping(bytes32 => Feed)) dataFeed; // mapping queryId to dataFeedId to details
    mapping(bytes32 => bytes32[]) currentFeeds; // mapping queryId to dataFeedIds array
    mapping(bytes32 => Tip[]) public tips; // mapping queryId to tips
    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)
    bytes32[] public feedsWithFunding; // array of dataFeedIds that have funding
    bytes32[] public queryIdsWithFunding; // array of queryIds that have funding

    // Structs
    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 feedsWithFundingIndex; // index plus one of dataFeedID in feedsWithFunding array (0 if not in array)
    }

    struct Feed {
        FeedDetails details;
        mapping(uint256 => bool) rewardClaimed; // tracks which tips were already paid out
    }

    struct Tip {
        uint256 amount;
        uint256 timestamp;
    }

    // Events
    event NewDataFeed(
        bytes32 _queryId,
        bytes32 _feedId,
        bytes _queryData,
        address _feedCreator
    );
    event DataFeedFunded(
        bytes32 _queryId,
        bytes32 _feedId,
        uint256 _amount,
        address _feedFunder
    );
    event OneTimeTipClaimed(
        bytes32 _queryId,
        uint256 _amount,
        address _reporter
    );
    event TipAdded(
        bytes32 _queryId,
        uint256 _amount,
        bytes _queryData,
        address _tipper
    );
    event TipClaimed(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256 _amount,
        address _reporter
    );

    // Functions
    /**
     * @dev Initializes system parameters
     * @param _tellor address of Tellor contract
     * @param _owner address of fee recipient
     * @param _fee percentage, 1000 is 100%, 50 is 5%, etc.
     */
    constructor(
        address payable _tellor,
        address _token,
        address _owner,
        uint256 _fee
    ) UsingTellor(_tellor) {
        master = ITellor(_tellor);
        token = IERC20(_token);
        owner = _owner;
        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 _reward;
        uint256 _cumulativeReward;
        for (uint256 _i = 0; _i < _timestamps.length; _i++) {
            (_reward) = _claimOneTimeTip(_queryId, _timestamps[_i]);
            _cumulativeReward += _reward;
        }
        require(
            token.transfer(
                msg.sender,
                _cumulativeReward - ((_cumulativeReward * fee) / 1000)
            )
        );
        require(token.transfer(owner, (_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 {
        uint256 _reward;
        uint256 _cumulativeReward;
        for (uint256 _i = 0; _i < _timestamps.length; _i++) {
            _reward = _claimTip(_feedId, _queryId, _timestamps[_i]);
            require(
                master.getReporterByTimestamp(_queryId, _timestamps[_i]) ==
                    msg.sender,
                "reporter mismatch"
            );
            _cumulativeReward += _reward;
        }
        require(
            token.transfer(
                msg.sender,
                _cumulativeReward - ((_cumulativeReward * fee) / 1000)
            )
        );
        require(token.transfer(owner, (_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
    ) external {
        FeedDetails storage _feed = dataFeed[_queryId][_feedId].details;
        require(_feed.reward > 0, "feed not set up");
        _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;
        }
        emit DataFeedFunded(_feedId, _queryId, _amount, msg.sender);
    }

    /**
     * @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 _queryData the data used by reporters to fulfill the query
     */
    function setupDataFeed(
        bytes32 _queryId,
        uint256 _reward,
        uint256 _startTime,
        uint256 _interval,
        uint256 _window,
        uint256 _priceThreshold,
        bytes calldata _queryData
    ) external {
        require(
            _queryId == keccak256(_queryData) || uint256(_queryId) <= 100,
            "id must be hash of bytes data"
        );
        bytes32 _feedId = keccak256(
            abi.encode(
                _queryId,
                _reward,
                _startTime,
                _interval,
                _window,
                _priceThreshold
            )
        );
        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(
            _window < _interval,
            "window must be less than interval length"
        );
        _feed.reward = _reward;
        _feed.startTime = _startTime;
        _feed.interval = _interval;
        _feed.window = _window;
        _feed.priceThreshold = _priceThreshold;

        currentFeeds[_queryId].push(_feedId);
        queryIdFromDataFeedId[_feedId] = _queryId;
        emit NewDataFeed(_queryId, _feedId, _queryData, msg.sender);
    }

    /**
     * @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) || uint256(_queryId) <= 100,
            "id must be hash of bytes data"
        );
        Tip[] storage _tips = tips[_queryId];
        if (_tips.length == 0) {
            _tips.push(Tip(_amount, block.timestamp));
        } else {
            (, , uint256 _timestampRetrieved) = getCurrentValue(_queryId);
            if (_timestampRetrieved < _tips[_tips.length - 1].timestamp) {
                _tips[_tips.length - 1].timestamp = block.timestamp;
                _tips[_tips.length - 1].amount += _amount;
            } else {
                _tips.push(Tip(_amount, block.timestamp));
            }
        }
        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"
        );
        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) {
        (, , 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 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 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 corresponding query ID
     */
    function getQueryIdFromFeedId(bytes32 _feedId)
        external
        view
        returns (bytes32)
    {
        return queryIdFromDataFeedId[_feedId];
    }

    /**
     * @dev Getter function to read if 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];
    }

    // 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 + uint8(_b[i]);
        }
    }

    /**
     ** @dev Internal function which allows Tellor reporters to claim their one time tips
     * @param _queryId id of reported data
     * @param _timestamp timestamp of one time tip
     * @return amount of tip
     */
    function _claimOneTimeTip(bytes32 _queryId, uint256 _timestamp)
        internal
        returns (uint256)
    {
        Tip[] storage _tips = tips[_queryId];
        require(
            block.timestamp - _timestamp > 12 hours,
            "buffer time has not passed"
        );
        require(
            msg.sender == master.getReporterByTimestamp(_queryId, _timestamp),
            "message sender not reporter for given queryId and timestamp"
        );
        bytes memory _valueRetrieved = retrieveData(_queryId, _timestamp);
        require(
            keccak256(_valueRetrieved) != keccak256(bytes("")),
            "no value exists at timestamp"
        );
        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");
        uint256 _tipAmount = _tips[_min].amount;
        _tips[_min].amount = 0;
        return _tipAmount;
    }

    /**
     * @dev Internal function which allows Tellor reporters to claim their autopay tips
     * @param _feedId of dataFeed
     * @param _queryId id of reported data
     * @param _timestamp timestamp of reported data eligible for reward
     * @return uint256 reward amount
     */
    function _claimTip(
        bytes32 _feedId,
        bytes32 _queryId,
        uint256 _timestamp
    ) internal returns (uint256) {
        Feed storage _feed = dataFeed[_queryId][_feedId];
        require(_feed.details.balance > 0, "insufficient feed balance");
        require(!_feed.rewardClaimed[_timestamp], "reward already claimed");
        require(
            block.timestamp - _timestamp > 12 hours,
            "buffer time has not passed"
        );
        require(
            block.timestamp - _timestamp < 12 weeks,
            "timestamp too old to claim tip"
        );
        bytes memory _valueRetrieved = retrieveData(_queryId, _timestamp);
        require(
            keccak256(_valueRetrieved) != keccak256(bytes("")),
            "no value exists at timestamp"
        );
        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 timestamp _c of interval _n
        (
            ,
            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;
            }
        }
        if (_priceChange <= _feed.details.priceThreshold) {
            require(
                _timestamp - _c < _feed.details.window,
                "timestamp not within window"
            );
            require(
                _timestampBefore < _c,
                "timestamp not first report within window"
            );
        }
        uint256 _rewardAmount;
        if (_feed.details.balance > _feed.details.reward) {
            _rewardAmount = _feed.details.reward;
            _feed.details.balance -= _feed.details.reward;
        } else {
            _rewardAmount = _feed.details.balance;
            _feed.details.balance = 0;
            // 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[_timestamp] = true;
        return _rewardAmount;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_tellor","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_feedFunder","type":"address"}],"name":"DataFeedFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"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":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reporter","type":"address"}],"name":"OneTimeTipClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"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":false,"internalType":"bytes32","name":"_feedId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"indexed":false,"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"}],"name":"getCurrentValue","outputs":[{"internalType":"bool","name":"_ifRetrieve","type":"bool"},{"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":"bool","name":"_ifRetrieve","type":"bool"},{"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":"feedsWithFundingIndex","type":"uint256"}],"internalType":"struct Autopay.FeedDetails","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":[{"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"}],"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":"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":"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":"_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":"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":"master","outputs":[{"internalType":"contract ITellor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","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":"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":"bytes","name":"_queryData","type":"bytes"}],"name":"setupDataFeed","outputs":[],"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"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200325238038062003252833981016040819052620000349162000088565b600080546001600160a01b03199081166001600160a01b03968716908117909255600180548216909217909155600280548216948616949094179093556003805490931691909316179055600455620000fa565b600080600080608085870312156200009e578384fd5b8451620000ab81620000e1565b6020860151909450620000be81620000e1565b6040860151909350620000d181620000e1565b6060959095015193969295505050565b6001600160a01b0381168114620000f757600080fd5b50565b613148806200010a6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063868d8b591161010f578063b7c9d376116100a2578063ddca3f4311610071578063ddca3f4314610550578063ee97f7f314610559578063fc0c546a1461056c578063fdb9d0e21461057f576101f0565b8063b7c9d376146104ea578063c5958af91461050a578063c7fafff81461052a578063ce5e11bf1461053d576101f0565b8063997b7990116100de578063997b79901461045b578063a792765f14610495578063a9352c09146104b7578063adf1639d146104d7576101f0565b8063868d8b59146104025780638b353470146104225780638da5cb5b1461043557806393d5393214610448576101f0565b80634fce1e1811610187578063751c895c11610156578063751c895c146103a157806377b03e0d146103b45780637bcdfa7a146103c75780637f23d1ce146103ef576101f0565b80634fce1e18146103395780634fff70991461034c57806357806e701461036c578063579b6d0614610381576101f0565b806342505164116101c3578063425051641461029257806344e87f911461029a57806345740ccc146102bd5780634637de0b146102d0576101f0565b80631959ad5b146101f55780632944908514610225578063353d8ac91461024f57806337db4faf14610264575b600080fd5b600054610208906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610238610233366004612c9c565b610592565b60408051921515835260208301919091520161021c565b6102576106de565b60405161021c9190612e8b565b610284610272366004612bbe565b60096020526000908152604090205481565b60405190815260200161021c565b610257610736565b6102ad6102a8366004612c9c565b61078c565b604051901515815260200161021c565b6102846102cb366004612bbe565b6109d3565b6102e36102de366004612bbe565b610a69565b60405161021c9190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b610284610347366004612bbe565b610b1d565b61028461035a366004612bbe565b60009081526008602052604090205490565b61037f61037a366004612c20565b610b3e565b005b61039461038f366004612bbe565b610e6d565b60405161021c9190612ecf565b61037f6103af366004612cbd565b610ef3565b6102846103c2366004612bbe565b611242565b6103da6103d5366004612c9c565b611348565b6040805192835260208301919091520161021c565b61037f6103fd366004612c71565b611384565b610284610410366004612bbe565b60086020526000908152604090205481565b61037f610430366004612d02565b61153f565b600354610208906001600160a01b031681565b610257610456366004612bbe565b6117ae565b6102ad610469366004612c71565b600091825260056020908152604080842094845293815283832091835260079091019052205460ff1690565b6104a86104a3366004612c9c565b611810565b60405161021c93929190612f26565b6104ca6104c5366004612c9c565b6118d7565b60405161021c9190612fe5565b6104a86104e5366004612bbe565b61194e565b6102846104f8366004612bbe565b60009081526007602052604090205490565b61051d610518366004612c9c565b611a09565b60405161021c9190612f8c565b610284610538366004612bbe565b611b23565b61028461054b366004612c9c565b611b33565b61028460045481565b600154610208906001600160a01b031681565b600254610208906001600160a01b031681565b61037f61058d366004612bd6565b611c40565b60008060006105a085611242565b905080156106ce57600080806105b7600185613084565b905060006105c58984611b33565b90508781106105df576000809650965050505050506106d7565b6105e98983611b33565b90508781101561060357506001955093506106d792505050565b8260026106108285613084565b61061a9190613045565b61062590600161302d565b61062f919061302d565b935061063b8985611b33565b9050878110156106845760006106568a61054b87600161302d565b905088811061067157600185975097505050505050506106d7565b61067c85600161302d565b9350506106c9565b60006106958a61054b600188613084565b9050888110156106ba5760016106ab8187613084565b975097505050505050506106d7565b6106c5600186613084565b9250505b610603565b60008092509250505b9250929050565b6060600a80548060200260200160405190810160405280929190818152602001828054801561072c57602002820191906000526020600020905b815481526020019060010190808311610718575b5050505050905090565b6060600b80548060200260200160405190810160405280929190818152602001828054801561072c5760200282019190600052602060002090815481526020019060010190808311610718575050505050905090565b6000805481906001600160a01b03167318431fd88adf138e8b979a7246eb58ea7126ea1614806107da57506000546001600160a01b031673e8218cacb0a5421bc6409e498d9f8cc8869945ea145b1561088b5760405163699f200f60e01b81527fefa19baa864049f50491093580c5433e97e8d5e41f8db1a61108b4fa44cacd9360048201527388df592f8eb5d7bd38bfef7deb0fbc02cf3778a090819063699f200f9060240160206040518083038186803b15801561084b57600080fd5b505afa15801561085f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108839190612ac8565b915050610912565b60008054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156108d757600080fd5b505afa1580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190612ac8565b90505b6000816001600160a01b031663248638e5868660405160200161093f929190918252602082015260400190565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161097391815260200190565b60006040518083038186803b15801561098b57600080fd5b505afa15801561099f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109c79190810190612af6565b51119150505b92915050565b6000806109df8361194e565b600086815260076020526040812080549295509093509150610a0390600190613084565b81548110610a2157634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805180820190915260029092020180548252600101549181018290529150821015610a5d57519150610a649050565b6000925050505b919050565b610aa96040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b506000818152600860209081526040808320548352600580835281842094845293825291829020825160e0810184528154815260018201549281019290925260028101549282019290925260038201546060820152600482015460808201529181015460a08301526006015460c082015290565b600a8181548110610b2d57600080fd5b600091825260209091200154905081565b60008060005b83811015610c9e57610b7d8787878785818110610b7157634e487b7160e01b600052603260045260246000fd5b90506020020135611ffb565b60015490935033906001600160a01b031663e07c548688888886818110610bb457634e487b7160e01b600052603260045260246000fd5b905060200201356040518363ffffffff1660e01b8152600401610be1929190918252602082015260400190565b60206040518083038186803b158015610bf957600080fd5b505afa158015610c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c319190612ac8565b6001600160a01b031614610c805760405162461bcd60e51b81526020600482015260116024820152700e4cae0dee4e8cae440dad2e6dac2e8c6d607b1b60448201526064015b60405180910390fd5b610c8a838361302d565b915080610c96816130cb565b915050610b44565b506002546004546001600160a01b039091169063a9059cbb9033906103e890610cc79086613065565b610cd19190613045565b610cdb9085613084565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610d2157600080fd5b505af1158015610d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d599190612b9e565b610d6257600080fd5b6002546003546004546001600160a01b039283169263a9059cbb9216906103e890610d8d9086613065565b610d979190613045565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610ddd57600080fd5b505af1158015610df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e159190612b9e565b610e1e57600080fd5b60408051878152602081018790529081018290523360608201527fbe397b811472239aa40c62686337c1611135342d6e238e8aa16580dcd7223adf9060800160405180910390a1505050505050565b606060076000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610ee857838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190610ea2565b505050509050919050565b8181604051610f03929190612e7b565b6040518091039020841480610f19575060648411155b610f655760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610c77565b60008481526007602052604090208054610fb857604080518082019091528481524260208083019182528354600181810186556000868152929092209351600290910290930192835590519101556110ed565b6000610fc38661194e565b8454909350849250610fd89150600190613084565b81548110610ff657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101548110156110b05781544290839061102190600190613084565b8154811061103f57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600101819055508482600184805490506110679190613084565b8154811061108557634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000160008282546110a5919061302d565b909155506110eb9050565b604080518082019091528581524260208083019182528454600181810187556000878152929092209351600290910290930192835590519101555b505b6000858152600960205260409020541580156111115750600061110f866109d3565b115b1561115657600b80546001810182557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901869055546000868152600960205260409020555b6002546040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e09190612b9e565b6111fc5760405162461bcd60e51b8152600401610c7790612f9f565b7ff5ab15991b2cec1142b66b2c57a205c2af5e9d8fc5056bcb33b53b193990b07e8585858533604051611233959493929190612f51565b60405180910390a15050505050565b600080546001600160a01b03167318431fd88adf138e8b979a7246eb58ea7126ea16148061128e57506000546001600160a01b031673e8218cacb0a5421bc6409e498d9f8cc8869945ea145b1561131757600054604051631af3921960e11b8152600481018490526001600160a01b03909116906335e72432906024015b60206040518083038186803b1580156112d857600080fd5b505afa1580156112ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113109190612e0d565b9050610a64565b6000546040516377b03e0d60e01b8152600481018490526001600160a01b03909116906377b03e0d906024016112c0565b6007602052816000526040600020818154811061136457600080fd5b600091825260209091206002909102018054600190910154909250905082565b6000828152600560209081526040808320868452909152902080546113dd5760405162461bcd60e51b815260206004820152600f60248201526e066656564206e6f742073657420757608c1b6044820152606401610c77565b818160010160008282546113f1919061302d565b90915550506002546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114809190612b9e565b61149c5760405162461bcd60e51b8152600401610c7790612f9f565b60068101541580156114b2575060008160010154115b156114f257600a805460018101825560008290527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8018590555460068201555b60408051858152602081018590529081018390523360608201527f8810fdf4922497486a33bc75f6a0f16927dd3d50a8e85ce556fb6ddb5c2844f79060800160405180910390a150505050565b818160405161154f929190612e7b565b6040518091039020881480611565575060648811155b6115b15760405162461bcd60e51b815260206004820152601d60248201527f6964206d7573742062652068617368206f6620627974657320646174610000006044820152606401610c77565b60408051602081018a9052908101889052606081018790526080810186905260a0810185905260c0810184905260009060e00160408051601f19818403018152918152815160209283012060008c8152600584528281208282529093529120805491925090156116635760405162461bcd60e51b815260206004820152601f60248201527f66656564206d757374206e6f742062652073657420757020616c7265616479006044820152606401610c77565b600089116116b35760405162461bcd60e51b815260206004820181905260248201527f726577617264206d7573742062652067726561746572207468616e207a65726f6044820152606401610c77565b8686106117135760405162461bcd60e51b815260206004820152602860248201527f77696e646f77206d757374206265206c657373207468616e20696e74657276616044820152670d840d8cadccee8d60c31b6064820152608401610c77565b8881556002810188905560038101879055600481018690556005810185905560008a81526006602090815260408083208054600181018255908452828420018590558483526008909152908190208b9055517f25b7a245f1298a141e9a73052d47515c64a19a5550bc21f5c896f2097e155efe9061179a908c908590889088903390612f51565b60405180910390a150505050505050505050565b60008181526006602090815260409182902080548351818402810184019094528084526060939283018282801561180457602002820191906000526020600020905b8154815260200190600101908083116117f0575b50505050509050919050565b6000606060008060006118238787610592565b915091508161184d57600060405180602001604052806000815250600094509450945050506118d0565b60006118598883611b33565b90506118658882611a09565b604080516020808201909252600090528151908201209095507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470146118b2576001955092506118d0915050565b60006040518060200160405280600081525060009550955095505050505b9250925092565b6040805180820190915260008082526020820152600083815260076020526040902080548390811061191957634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905092915050565b6000606060008061195e85611242565b905080611981575050604080516020810190915260008082529250905081611a02565b60006119928661054b600185613084565b905061199e8682611a09565b604080516020808201909252600090528151908201209094507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470146119ea57600194509150611a029050565b60408051602081019091526000808252955093509150505b9193909250565b6000546060906001600160a01b03167318431fd88adf138e8b979a7246eb58ea7126ea161480611a5757506000546001600160a01b031673e8218cacb0a5421bc6409e498d9f8cc8869945ea145b15611aeb57600054604051630b2d2b0d60e01b815260048101859052602481018490526001600160a01b0390911690630b2d2b0d906044015b60006040518083038186803b158015611aa857600080fd5b505afa158015611abc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ae49190810190612d7d565b90506109cd565b60005460405163c5958af960e01b815260048101859052602481018490526001600160a01b039091169063c5958af990604401611a90565b600b8181548110610b2d57600080fd5b600080546001600160a01b03167318431fd88adf138e8b979a7246eb58ea7126ea161480611b7f57506000546001600160a01b031673e8218cacb0a5421bc6409e498d9f8cc8869945ea145b15611c0857600054604051631f0dee2d60e21b815260048101859052602481018490526001600160a01b0390911690637c37b8b4906044015b60206040518083038186803b158015611bd057600080fd5b505afa158015611be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae49190612e0d565b60005460405163ce5e11bf60e01b815260048101859052602481018490526001600160a01b039091169063ce5e11bf90604401611bb8565b600083815260076020526040902054611ca65760405162461bcd60e51b815260206004820152602260248201527f6e6f2074697073207375626d697474656420666f722074686973207175657279604482015261125960f21b6064820152608401610c77565b60008060005b83811015611d0457611ce486868684818110611cd857634e487b7160e01b600052603260045260246000fd5b90506020020135612565565b9250611cf0838361302d565b915080611cfc816130cb565b915050611cac565b506002546004546001600160a01b039091169063a9059cbb9033906103e890611d2d9086613065565b611d379190613045565b611d419085613084565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611d8757600080fd5b505af1158015611d9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbf9190612b9e565b611dc857600080fd5b6002546003546004546001600160a01b039283169263a9059cbb9216906103e890611df39086613065565b611dfd9190613045565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611e4357600080fd5b505af1158015611e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7b9190612b9e565b611e8457600080fd5b611e8d856109d3565b611fbb5760008581526009602052604090205415611fbb57600085815260096020526040812054611ec090600190613084565b600b805491925090611ed490600190613084565b81548110611ef257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600b8281548110611f1e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600b8281548110611f4f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050816001611f69919061302d565b6000828152600960205260408082209290925588815290812055600b805480611fa257634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505b604080518681526020810183905233918101919091527fdff45d500502d35c7f1150acbb404c5b2e288e31a74354c8553a283dd1e806e790606001611233565b6000828152600560209081526040808320868452909152812060018101546120655760405162461bcd60e51b815260206004820152601960248201527f696e73756666696369656e7420666565642062616c616e6365000000000000006044820152606401610c77565b600083815260078201602052604090205460ff16156120c65760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c726561647920636c61696d6564000000000000000000006044820152606401610c77565b61a8c06120d38442613084565b116121205760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f74207061737365640000000000006044820152606401610c77565b626ebe0061212e8442613084565b1061217b5760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d7020746f6f206f6c6420746f20636c61696d2074697000006044820152606401610c77565b60006121878585611a09565b604080516020808201909252600090528151908201209091507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561220f5760405162461bcd60e51b815260206004820152601c60248201527f6e6f2076616c7565206578697374732061742074696d657374616d70000000006044820152606401610c77565b60038201546002830154600091906122279087613084565b6122319190613045565b905060008184600001600301546122489190613065565b6002850154612257919061302d565b90506000806122668989611810565b6005890154919450925060009150156122f8576000612284876129ec565b90506000612291856129ec565b9050806122a25761271092506122f5565b8082106122d157806122b48184613084565b6122c090612710613065565b6122ca9190613045565b92506122f5565b806122dc8382613084565b6122e890612710613065565b6122f29190613045565b92505b50505b600587015481116123bf576004870154612312858b613084565b1061235f5760405162461bcd60e51b815260206004820152601b60248201527f74696d657374616d70206e6f742077697468696e2077696e646f7700000000006044820152606401610c77565b8382106123bf5760405162461bcd60e51b815260206004820152602860248201527f74696d657374616d70206e6f74206669727374207265706f72742077697468696044820152676e2077696e646f7760c01b6064820152608401610c77565b8654600188015460009110156123f4575086546001880180548291906000906123e9908490613084565b909155506125389050565b50600180880180546000909155600a54909110156124f957600688015460009061242090600190613084565b600a80549192509061243490600190613084565b8154811061245257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600a828154811061247e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055506000600a82815481106124af57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091015480835260089091526040909120549091506124d983600161302d565b600091825260056020908152604080842094845293905291902060060155505b600a80548061251857634e487b7160e01b600052603160045260246000fd5b600082815260208120820160001990810182905590910190915560068901555b60008a815260079098016020526040909720805460ff191660011790555094955050505050509392505050565b600082815260076020526040812061a8c06125808442613084565b116125cd5760405162461bcd60e51b815260206004820152601a60248201527f6275666665722074696d6520686173206e6f74207061737365640000000000006044820152606401610c77565b60015460405163703e2a4360e11b815260048101869052602481018590526001600160a01b039091169063e07c54869060440160206040518083038186803b15801561261857600080fd5b505afa15801561262c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126509190612ac8565b6001600160a01b0316336001600160a01b0316146126d65760405162461bcd60e51b815260206004820152603b60248201527f6d6573736167652073656e646572206e6f74207265706f7274657220666f722060448201527f676976656e207175657279496420616e642074696d657374616d7000000000006064820152608401610c77565b60006126e28585611a09565b604080516020808201909252600090528151908201209091507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141561276a5760405162461bcd60e51b815260206004820152601c60248201527f6e6f2076616c7565206578697374732061742074696d657374616d70000000006044820152606401610c77565b8154600090815b600161277d8484613084565b11156127e557600261278f848461302d565b6127999190613045565b9050868582815481106127bc57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015411156127dc578091506127e0565b8092505b612771565b60006127f18989611810565b9250505085848154811061281557634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154811061287f5760405162461bcd60e51b815260206004820152602160248201527f746970206561726e65642062792070726576696f7573207375626d697373696f6044820152603760f91b6064820152608401610c77565b85848154811061289f57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015488116128ff5760405162461bcd60e51b815260206004820152601e60248201527f74696d657374616d70206e6f7420656c696769626c6520666f722074697000006044820152606401610c77565b600086858154811061292157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000154116129765760405162461bcd60e51b81526020600482015260136024820152721d1a5c08185b1c9958591e4818db185a5b5959606a1b6044820152606401610c77565b600086858154811061299857634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000154905060008786815481106129ce57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201559998505050505050505050565b6000805b8251811015612a3f57828181518110612a1957634e487b7160e01b600052603260045260246000fd5b0160200151612a2b9060f81c8361302d565b915080612a37816130cb565b9150506129f0565b50919050565b60008083601f840112612a56578182fd5b50813567ffffffffffffffff811115612a6d578182fd5b6020830191508360208260051b85010111156106d757600080fd5b60008083601f840112612a99578182fd5b50813567ffffffffffffffff811115612ab0578182fd5b6020830191508360208285010111156106d757600080fd5b600060208284031215612ad9578081fd5b81516001600160a01b0381168114612aef578182fd5b9392505050565b60006020808385031215612b08578182fd5b825167ffffffffffffffff80821115612b1f578384fd5b818501915085601f830112612b32578384fd5b815181811115612b4457612b446130fc565b8060051b9150612b55848301612ffc565b8181528481019084860184860187018a1015612b6f578788fd5b8795505b83861015612b91578051835260019590950194918601918601612b73565b5098975050505050505050565b600060208284031215612baf578081fd5b81518015158114612aef578182fd5b600060208284031215612bcf578081fd5b5035919050565b600080600060408486031215612bea578182fd5b83359250602084013567ffffffffffffffff811115612c07578283fd5b612c1386828701612a45565b9497909650939450505050565b60008060008060608587031215612c35578081fd5b8435935060208501359250604085013567ffffffffffffffff811115612c59578182fd5b612c6587828801612a45565b95989497509550505050565b600080600060608486031215612c85578283fd5b505081359360208301359350604090920135919050565b60008060408385031215612cae578182fd5b50508035926020909101359150565b60008060008060608587031215612cd2578384fd5b8435935060208501359250604085013567ffffffffffffffff811115612cf6578283fd5b612c6587828801612a88565b60008060008060008060008060e0898b031215612d1d578384fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925060c089013567ffffffffffffffff811115612d5d578283fd5b612d698b828c01612a88565b999c989b5096995094979396929594505050565b600060208284031215612d8e578081fd5b815167ffffffffffffffff80821115612da5578283fd5b818401915084601f830112612db8578283fd5b815181811115612dca57612dca6130fc565b612ddd601f8201601f1916602001612ffc565b9150808252856020828501011115612df3578384fd5b612e0481602084016020860161309b565b50949350505050565b600060208284031215612e1e578081fd5b5051919050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452612e6781602086016020860161309b565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b6020808252825182820181905260009190848201906040850190845b81811015612ec357835183529284019291840191600101612ea7565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612f1957612f0984835180518252602090810151910152565b9284019290850190600101612eec565b5091979650505050505050565b6000841515825260606020830152612f416060830185612e4f565b9050826040830152949350505050565b600086825285602083015260806040830152612f71608083018587612e25565b90506001600160a01b03831660608301529695505050505050565b600060208252612aef6020830184612e4f565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8151815260208083015190820152604081016109cd565b604051601f8201601f1916810167ffffffffffffffff81118282101715613025576130256130fc565b604052919050565b60008219821115613040576130406130e6565b500190565b60008261306057634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561307f5761307f6130e6565b500290565b600082821015613096576130966130e6565b500390565b60005b838110156130b657818101518382015260200161309e565b838111156130c5576000848401525b50505050565b60006000198214156130df576130df6130e6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220488de213d682d4e51dc9955260abd5fff0b1fb0dae0ed045657a4d5d4ce7fbad64736f6c63430008030033000000000000000000000000bb97c038c338c3dcaf06d5be3b4a3e0b24835f9c0000000000000000000000007b8ac044ebce66acdf14197e8de38c1cc802db4a0000000000000000000000007671ea70ce097bc82464b4ab78f79d279356b6cd0000000000000000000000000000000000000000000000000000000000000014

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000bb97c038c338c3dcaf06d5be3b4a3e0b24835f9c0000000000000000000000007b8ac044ebce66acdf14197e8de38c1cc802db4a0000000000000000000000007671ea70ce097bc82464b4ab78f79d279356b6cd0000000000000000000000000000000000000000000000000000000000000014

-----Decoded View---------------
Arg [0] : _tellor (address): 0xbb97c038c338c3dcaf06d5be3b4a3e0b24835f9c
Arg [1] : _token (address): 0x7b8ac044ebce66acdf14197e8de38c1cc802db4a
Arg [2] : _owner (address): 0x7671ea70ce097bc82464b4ab78f79d279356b6cd
Arg [3] : _fee (uint256): 20

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000bb97c038c338c3dcaf06d5be3b4a3e0b24835f9c
Arg [1] : 0000000000000000000000007b8ac044ebce66acdf14197e8de38c1cc802db4a
Arg [2] : 0000000000000000000000007671ea70ce097bc82464b4ab78f79d279356b6cd
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000014


Deployed ByteCode Sourcemap

17781:19666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9002:21;;;;;-1:-1:-1;;;;;9002:21:0;;;;;;-1:-1:-1;;;;;8286:55:1;;;8268:74;;8256:2;8241:18;9002:21:0;;;;;;;;11818:2209;;;;;;:::i;:::-;;:::i;:::-;;;;11175:14:1;;11168:22;11150:41;;11222:2;11207:18;;11200:34;;;;11123:18;11818:2209:0;11105:135:1;29392:109:0;;;:::i;:::-;;;;;;;:::i;18384:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11391:25:1;;;11379:2;11364:18;18384:59:0;11346:76:1;29596:115:0;;;:::i;15839:975::-;;;;;;:::i;:::-;;:::i;:::-;;;10581:14:1;;10574:22;10556:41;;10544:2;10529:18;15839:975:0;10511:92:1;28553:371:0;;;;;;:::i;:::-;;:::i;29112:198::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;22111:621:1;22303:3;22292:9;22288:19;22280:27;;22340:6;22334:13;22323:9;22316:32;22404:4;22396:6;22392:17;22386:24;22379:4;22368:9;22364:20;22357:54;22467:4;22459:6;22455:17;22449:24;22442:4;22431:9;22427:20;22420:54;22530:4;22522:6;22518:17;22512:24;22505:4;22494:9;22490:20;22483:54;22593:4;22585:6;22581:17;22575:24;22568:4;22557:9;22553:20;22546:54;22656:4;22648:6;22644:17;22638:24;22631:4;22620:9;22616:20;22609:54;22719:4;22711:6;22707:17;22701:24;22694:4;22683:9;22679:20;22672:54;22270:462;;;;;18527:33:0;;;;;;:::i;:::-;;:::i;30902:167::-;;;;;;:::i;:::-;30999:7;31031:30;;;:21;:30;;;;;;;30902:167;22635:896;;;;;;:::i;:::-;;:::i;:::-;;30175:148;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26738:1304::-;;;;;;:::i;:::-;;:::i;14256:498::-;;;;;;:::i;:::-;;:::i;18217:37::-;;;;;;:::i;:::-;;:::i;:::-;;;;12559:25:1;;;12615:2;12600:18;;12593:34;;;;12532:18;18217:37:0;12514:119:1;23798:749:0;;;;;;:::i;:::-;;:::i;18288:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;25159:1358;;;;;;:::i;:::-;;:::i;17938:20::-;;;;;-1:-1:-1;;;;;17938:20:0;;;28226:164;;;;;;:::i;:::-;;:::i;31328:229::-;;;;;;:::i;:::-;31472:4;31496:18;;;:8;:18;;;;;;;;:27;;;;;;;;;:53;;;:41;;;;:53;;;;;;;31328:229;10695:676;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;30544:176::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9638:638::-;;;;;;:::i;:::-;;:::i;29877:122::-;;;;;;:::i;:::-;29943:7;29970:14;;;:4;:14;;;;;:21;;29877:122;17059:519;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18609:36::-;;;;;;:::i;:::-;;:::i;14996:542::-;;;;;;:::i;:::-;;:::i;17965:18::-;;;;;;17836:21;;;;;-1:-1:-1;;;;;17836:21:0;;;17891:19;;;;;-1:-1:-1;;;;;17891:19:0;;;20902:1457;;;;;;:::i;:::-;;:::i;11818:2209::-;11935:11;11948:14;11980;11997:35;12023:8;11997:25;:35::i;:::-;11980:52;-1:-1:-1;12049:10:0;;12045:1947;;12076:14;;;12151:10;12160:1;12151:6;:10;:::i;:::-;12137:24;;12176:13;12280:46;12310:8;12320:5;12280:29;:46::i;:::-;12272:54;;12354:10;12345:5;:19;12341:42;;12374:5;12381:1;12366:17;;;;;;;;;;;12341:42;12406:44;12436:8;12446:3;12406:29;:44::i;:::-;12398:52;;12477:10;12469:5;:18;12465:42;;;-1:-1:-1;12497:4:0;;-1:-1:-1;12503:3:0;-1:-1:-1;12489:18:0;;-1:-1:-1;;;12489:18:0;12465:42;12665:5;12657:1;12642:11;12665:5;12642:3;:11;:::i;:::-;12641:17;;;;:::i;:::-;:21;;12661:1;12641:21;:::i;:::-;:29;;;;:::i;:::-;12632:38;;12697:47;12727:8;12737:6;12697:29;:47::i;:::-;12689:55;;12775:10;12767:5;:18;12763:1077;;;12858:17;12878:124;12934:8;12969:10;:6;12978:1;12969:10;:::i;12878:124::-;12858:144;;13042:10;13029:9;:23;13025:287;;13133:4;13139:6;13125:21;;;;;;;;;;;;13025:287;13278:10;:6;13287:1;13278:10;:::i;:::-;13270:18;;12763:1077;;;;13360:17;13380:124;13436:8;13471:10;13480:1;13471:6;:10;:::i;13380:124::-;13360:144;;13543:10;13531:9;:22;13527:294;;;13639:4;13645:10;13639:4;13645:6;:10;:::i;:::-;13631:25;;;;;;;;;;;;13527:294;13787:10;13796:1;13787:6;:10;:::i;:::-;13781:16;;12763:1077;;12600:1381;;12045:1947;14010:5;14017:1;14002:17;;;;;11818:2209;;;;;;:::o;29392:109::-;29441:16;29477;29470:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29392:109;:::o;29596:115::-;29648:16;29684:19;29677:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29596:115;:::o;15839:975::-;15946:4;16058:6;;15946:4;;-1:-1:-1;;;;;16058:6:0;16076:42;16058:61;;:139;;-1:-1:-1;16136:6:0;;-1:-1:-1;;;;;16136:6:0;16154:42;16136:61;16058:139;16040:573;;;16383:128;;-1:-1:-1;;;16383:128:0;;16426:66;16383:128;;;11391:25:1;16271:42:0;;;;16383:20;;11364:18:1;;16383:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16343:183;;16040:573;;;;16581:6;;;;;;;;-1:-1:-1;;;;;16581:6:0;-1:-1:-1;;;;;16581:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16559:42;;16040:573;16805:1;16643:11;-1:-1:-1;;;;;16643:43:0;;16736:8;16746:10;16719:38;;;;;;;;7749:19:1;;;7793:2;7784:12;;7777:28;7830:2;7821:12;;7739:100;16719:38:0;;;;;;;;;;;;;16709:49;;;;;;16643:134;;;;;;;;;;;;;11391:25:1;;11379:2;11364:18;;11346:76;16643:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16643:134:0;;;;;;;;;;;;:::i;:::-;:159;:163;16623:183;;;15839:975;;;;;:::o;28553:371::-;28615:7;28640:27;28671:25;28687:8;28671:15;:25::i;:::-;28707:19;28729:14;;;:4;:14;;;;;28744:21;;28635:61;;-1:-1:-1;28707:19:0;;-1:-1:-1;28729:14:0;-1:-1:-1;28744:25:0;;28768:1;;28744:25;:::i;:::-;28729:41;;;;;;-1:-1:-1;;;28729:41:0;;;;;;;;;;;;;;;;;;28707:63;;;;;;;;;28729:41;;;;;28707:63;;;;;;;;;;;;;;-1:-1:-1;28785:40:0;;28781:136;;;28849:15;;-1:-1:-1;28842:22:0;;-1:-1:-1;28842:22:0;28781:136;28904:1;28897:8;;;;28553:371;;;;:::o;29112:198::-;29200:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29200:18:0;-1:-1:-1;29244:40:0;29253:30;;;:21;:30;;;;;;;;;29244:40;;:8;:40;;;;;;:49;;;;;;;;;;29236:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29112:198::o;18527:33::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18527:33:0;:::o;22635:896::-;22774:15;22800:25;22841:10;22836:362;22857:23;;;22836:362;;;22913:45;22923:7;22932:8;22942:11;;22954:2;22942:15;;;;;-1:-1:-1;;;22942:15:0;;;;;;;;;;;;;;;22913:9;:45::i;:::-;22999:6;;22903:55;;-1:-1:-1;23080:10:0;;-1:-1:-1;;;;;22999:6:0;:29;23029:8;23039:11;;23051:2;23039:15;;;;;-1:-1:-1;;;23039:15:0;;;;;;;;;;;;;;;22999:56;;;;;;;;;;;;;;;12559:25:1;;;12615:2;12600:18;;12593:34;12547:2;12532:18;;12514:119;22999:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22999:91:0;;22973:170;;;;-1:-1:-1;;;22973:170:0;;20848:2:1;22973:170:0;;;20830:21:1;20887:2;20867:18;;;20860:30;-1:-1:-1;;;20906:18:1;;;20899:47;20963:18;;22973:170:0;;;;;;;;;23158:28;23179:7;23158:28;;:::i;:::-;;-1:-1:-1;22882:4:0;;;;:::i;:::-;;;;22836:362;;;-1:-1:-1;23230:5:0;;23334:3;;-1:-1:-1;;;;;23230:5:0;;;;:14;;23263:10;;23341:4;;23314:23;;:17;:23;:::i;:::-;23313:32;;;;:::i;:::-;23292:54;;:17;:54;:::i;:::-;23230:131;;-1:-1:-1;;;;;;23230:131:0;;;;;;;-1:-1:-1;;;;;8948:55:1;;;23230:131:0;;;8930:74:1;9020:18;;;9013:34;8903:18;;23230:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23208:164;;;;;;23391:5;;23406;;23434:3;;-1:-1:-1;;;;;23391:5:0;;;;:14;;23406:5;;23441:4;;23414:23;;:17;:23;:::i;:::-;23413:32;;;;:::i;:::-;23391:55;;-1:-1:-1;;;;;;23391:55:0;;;;;;;-1:-1:-1;;;;;8948:55:1;;;23391::0;;;8930:74:1;9020:18;;;9013:34;8903:18;;23391:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23383:64;;;;;;23463:60;;;12171:25:1;;;12227:2;12212:18;;12205:34;;;12255:18;;;12248:34;;;23512:10:0;12313:2:1;12298:18;;12291:83;23463:60:0;;12158:3:1;12143:19;23463:60:0;;;;;;;22635:896;;;;;;:::o;30175:148::-;30264:12;30301:4;:14;30306:8;30301:14;;;;;;;;;;;30294:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30175:148;;;:::o;26738:1304::-;26911:10;;26901:21;;;;;;;:::i;:::-;;;;;;;;26889:8;:33;:61;;;-1:-1:-1;26947:3:0;26926:24;;;26889:61;26867:140;;;;-1:-1:-1;;;26867:140:0;;17116:2:1;26867:140:0;;;17098:21:1;17155:2;17135:18;;;17128:30;17194:31;17174:18;;;17167:59;17243:18;;26867:140:0;17088:179:1;26867:140:0;27018:19;27040:14;;;:4;:14;;;;;27069:12;;27065:488;;27114:29;;;;;;;;;;;;27127:15;27114:29;;;;;;;27103:41;;;;;;;;-1:-1:-1;27103:41:0;;;;;;;;;;;;;;;;;;;;;;;;27065:488;;;27182:27;27213:25;27229:8;27213:15;:25::i;:::-;27285:12;;27177:61;;-1:-1:-1;27279:5:0;;-1:-1:-1;27285:16:0;;-1:-1:-1;27300:1:0;;27285:16;:::i;:::-;27279:23;;;;;;-1:-1:-1;;;27279:23:0;;;;;;;;;;;;;;;;;;;:33;;;27257:19;:55;27253:289;;;27339:12;;27369:15;;27333:5;;27339:16;;27354:1;;27339:16;:::i;:::-;27333:23;;;;;;-1:-1:-1;;;27333:23:0;;;;;;;;;;;;;;;;;;;:33;;:51;;;;27437:7;27403:5;27424:1;27409:5;:12;;;;:16;;;;:::i;:::-;27403:23;;;;;;-1:-1:-1;;;27403:23:0;;;;;;;;;;;;;;;;;;;:30;;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;27253:289:0;;-1:-1:-1;27253:289:0;;27496:29;;;;;;;;;;;;27509:15;27496:29;;;;;;;27485:41;;;;;;;;-1:-1:-1;27485:41:0;;;;;;;;;;;;;;;;;;;;;;;;27253:289;27065:488;;27581:34;;;;:24;:34;;;;;;:39;:83;;;;;27663:1;27637:23;27651:8;27637:13;:23::i;:::-;:27;27581:83;27563:252;;;27691:19;:34;;;;;;;;;;;;27777:26;-1:-1:-1;27740:34:0;;;:24;27691:34;27740;;;;:63;27563:252;27847:5;;:54;;-1:-1:-1;;;27847:54:0;;27866:10;27847:54;;;8616:34:1;27886:4:0;8666:18:1;;;8659:43;8718:18;;;8711:34;;;-1:-1:-1;;;;;27847:5:0;;;;:18;;8528::1;;27847:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27825:142;;;;-1:-1:-1;;;27825:142:0;;;;;;;:::i;:::-;27983:51;27992:8;28002:7;28011:10;;28023;27983:51;;;;;;;;;;:::i;:::-;;;;;;;;26738:1304;;;;;:::o;14256:498::-;14357:7;14442:6;;-1:-1:-1;;;;;14442:6:0;14460:42;14442:61;;:139;;-1:-1:-1;14520:6:0;;-1:-1:-1;;;;;14520:6:0;14538:42;14520:61;14442:139;14424:323;;;14615:6;;:38;;-1:-1:-1;;;14615:38:0;;;;;11391:25:1;;;-1:-1:-1;;;;;14615:6:0;;;;:28;;11364:18:1;;14615:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14608:45;;;;14424:323;14693:6;;:42;;-1:-1:-1;;;14693:42:0;;;;;11391:25:1;;;-1:-1:-1;;;;;14693:6:0;;;;:32;;11364:18:1;;14693:42:0;11346:76:1;18217:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18217:37:0;-1:-1:-1;18217:37:0;:::o;23798:749::-;23922:25;23950:18;;;:8;:18;;;;;;;;:27;;;;;;;;24004:12;;23996:44;;;;-1:-1:-1;;;23996:44:0;;20504:2:1;23996:44:0;;;20486:21:1;20543:2;20523:18;;;20516:30;-1:-1:-1;;;20562:18:1;;;20555:45;20617:18;;23996:44:0;20476:165:1;23996:44:0;24068:7;24051:5;:13;;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;24108:5:0;;:54;;-1:-1:-1;;;24108:54:0;;24127:10;24108:54;;;8616:34:1;24147:4:0;8666:18:1;;;8659:43;8718:18;;;8711:34;;;-1:-1:-1;;;;;24108:5:0;;;;:18;;8528::1;;24108:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24086:142;;;;-1:-1:-1;;;24086:142:0;;;;;;;:::i;:::-;24290:27;;;;:32;:53;;;;;24342:1;24326:5;:13;;;:17;24290:53;24286:184;;;24360:16;:30;;;;;;;-1:-1:-1;24360:30:0;;;;;;;;24435:23;24405:27;;;:53;24286:184;24485:54;;;12171:25:1;;;12227:2;12212:18;;12205:34;;;12255:18;;;12248:34;;;24528:10:0;12313:2:1;12298:18;;12291:83;24485:54:0;;12158:3:1;12143:19;24485:54:0;;;;;;;23798:749;;;;:::o;25159:1358::-;25459:10;;25449:21;;;;;;;:::i;:::-;;;;;;;;25437:8;:33;:61;;;-1:-1:-1;25495:3:0;25474:24;;;25437:61;25415:140;;;;-1:-1:-1;;;25415:140:0;;17116:2:1;25415:140:0;;;17098:21:1;17155:2;17135:18;;;17128:30;17194:31;17174:18;;;17167:59;17243:18;;25415:140:0;17088:179:1;25415:140:0;25608:195;;;;;;13811:25:1;;;13852:18;;;13845:34;;;13895:18;;;13888:34;;;13938:18;;;13931:34;;;13981:19;;;13974:35;;;14025:19;;;14018:35;;;25566:15:0;;13783:19:1;;25608:195:0;;;-1:-1:-1;;25608:195:0;;;;;;;;;25584:230;;25608:195;25584:230;;;;25825:25;25853:18;;;:8;:18;;;;;:27;;;;;;;;25907:12;;25584:230;;-1:-1:-1;25853:27:0;25907:17;25899:61;;;;-1:-1:-1;;;25899:61:0;;18649:2:1;25899:61:0;;;18631:21:1;18688:2;18668:18;;;18661:30;18727:33;18707:18;;;18700:61;18778:18;;25899:61:0;18621:181:1;25899:61:0;25989:1;25979:7;:11;25971:56;;;;-1:-1:-1;;;25971:56:0;;16755:2:1;25971:56:0;;;16737:21:1;;;16774:18;;;16767:30;16833:34;16813:18;;;16806:62;16885:18;;25971:56:0;16727:182:1;25971:56:0;26070:9;26060:7;:19;26038:109;;;;-1:-1:-1;;;26038:109:0;;18240:2:1;26038:109:0;;;18222:21:1;18279:2;18259:18;;;18252:30;18318:34;18298:18;;;18291:62;-1:-1:-1;;;18369:18:1;;;18362:38;18417:19;;26038:109:0;18212:230:1;26038:109:0;26158:22;;;26191:15;;;:28;;;26230:14;;;:26;;;26267:12;;;:22;;;26300:20;;;:38;;;26158:12;26351:22;;;:12;:22;;;;;;;;:36;;;;;;;;;;;;;;;;;26398:30;;;:21;:30;;;;;;;:41;;;26455:54;;;;;26364:8;;26379:7;;26486:10;;;;26498;;26455:54;:::i;:::-;;;;;;;;25159:1358;;;;;;;;;;:::o;28226:164::-;28360:22;;;;:12;:22;;;;;;;;;28353:29;;;;;;;;;;;;;;;;;28319:16;;28353:29;;;28360:22;28353:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28226:164;;;:::o;10695:676::-;10818:16;10849:19;10883:27;10939:11;10952:14;10970:80;11006:8;11029:10;10970:21;:80::i;:::-;10938:112;;;;11066:6;11061:41;;11082:5;11089:9;;;;;;;;;;;;11100:1;11074:28;;;;;;;;;;11061:41;11113:13;11129:47;11159:8;11169:6;11129:29;:47::i;:::-;11113:63;;11196:29;11209:8;11219:5;11196:12;:29::i;:::-;11271:9;;;;;;;;;;-1:-1:-1;11271:9:0;;11240:17;;;;;;11187:38;;-1:-1:-1;11261:20:0;11240:41;11236:88;;11304:4;;-1:-1:-1;11318:5:0;-1:-1:-1;11296:28:0;;-1:-1:-1;;11296:28:0;11236:88;11343:5;11350:9;;;;;;;;;;;;11361:1;11335:28;;;;;;;;;10695:676;;;;;;:::o;30544:176::-;-1:-1:-1;;;;;;;;;;;;;;;;;30690:14:0;;;;:4;:14;;;;;:22;;30705:6;;30690:22;;;;-1:-1:-1;;;30690:22:0;;;;;;;;;;;;;;;;;;;30683:29;;;;;;;;;;;;;;;;;;;;;;;;;;;30544:176;;;;:::o;9638:638::-;9743:16;9774:19;9808:27;9863:14;9880:35;9906:8;9880:25;:35::i;:::-;9863:52;-1:-1:-1;9932:11:0;9928:72;;-1:-1:-1;;9975:9:0;;;;;;;;;9968:5;9975:9;;;9968:5;-1:-1:-1;9975:9:0;-1:-1:-1;9968:5:0;9960:28;;9928:72;10010:13;10026:51;10056:8;10066:10;10075:1;10066:6;:10;:::i;10026:51::-;10010:67;;10097:29;10110:8;10120:5;10097:12;:29::i;:::-;10172:9;;;;;;;;;;-1:-1:-1;10172:9:0;;10141:17;;;;;;10088:38;;-1:-1:-1;10162:20:0;10141:41;10137:88;;10205:4;;-1:-1:-1;10219:5:0;-1:-1:-1;10197:28:0;;-1:-1:-1;10197:28:0;10137:88;10251:9;;;;;;;;;10244:5;10251:9;;;10244:5;-1:-1:-1;10251:9:0;-1:-1:-1;10262:5:0;-1:-1:-1;;9638:638:0;;;;;;:::o;17059:519::-;17257:6;;17167:12;;-1:-1:-1;;;;;17257:6:0;17275:42;17257:61;;:139;;-1:-1:-1;17335:6:0;;-1:-1:-1;;;;;17335:6:0;17353:42;17335:61;17257:139;17239:332;;;17430:6;;:48;;-1:-1:-1;;;17430:48:0;;;;;12559:25:1;;;12600:18;;;12593:34;;;-1:-1:-1;;;;;17430:6:0;;;;:26;;12532:18:1;;17430:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17430:48:0;;;;;;;;;;;;:::i;:::-;17423:55;;;;17239:332;17518:6;;:41;;-1:-1:-1;;;17518:41:0;;;;;12559:25:1;;;12600:18;;;12593:34;;;-1:-1:-1;;;;;17518:6:0;;;;:19;;12532:18:1;;17518:41:0;12514:119:1;18609:36:0;;;;;;;;;;;;14996:542;15117:7;15202:6;;-1:-1:-1;;;;;15202:6:0;15220:42;15202:61;;:139;;-1:-1:-1;15280:6:0;;-1:-1:-1;;;;;15280:6:0;15298:42;15280:61;15202:139;15184:347;;;15375:6;;:50;;-1:-1:-1;;;15375:50:0;;;;;12559:25:1;;;12600:18;;;12593:34;;;-1:-1:-1;;;;;15375:6:0;;;;:32;;12532:18:1;;15375:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15184:347::-;15465:6;;:54;;-1:-1:-1;;;15465:54:0;;;;;12559:25:1;;;12600:18;;;12593:34;;;-1:-1:-1;;;;;15465:6:0;;;;:36;;12532:18:1;;15465:54:0;12514:119:1;20902:1457:0;21057:1;21033:14;;;:4;:14;;;;;:21;21011:109;;;;-1:-1:-1;;;21011:109:0;;15247:2:1;21011:109:0;;;15229:21:1;15286:2;15266:18;;;15259:30;15325:34;15305:18;;;15298:62;-1:-1:-1;;;15376:18:1;;;15369:32;15418:19;;21011:109:0;15219:224:1;21011:109:0;21131:15;21157:25;21198:10;21193:177;21214:23;;;21193:177;;;21272:43;21289:8;21299:11;;21311:2;21299:15;;;;;-1:-1:-1;;;21299:15:0;;;;;;;;;;;;;;;21272:16;:43::i;:::-;21260:55;-1:-1:-1;21330:28:0;21260:55;21330:28;;:::i;:::-;;-1:-1:-1;21239:4:0;;;;:::i;:::-;;;;21193:177;;;-1:-1:-1;21402:5:0;;21506:3;;-1:-1:-1;;;;;21402:5:0;;;;:14;;21435:10;;21513:4;;21486:23;;:17;:23;:::i;:::-;21485:32;;;;:::i;:::-;21464:54;;:17;:54;:::i;:::-;21402:131;;-1:-1:-1;;;;;;21402:131:0;;;;;;;-1:-1:-1;;;;;8948:55:1;;;21402:131:0;;;8930:74:1;9020:18;;;9013:34;8903:18;;21402:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21380:164;;;;;;21563:5;;21578;;21606:3;;-1:-1:-1;;;;;21563:5:0;;;;:14;;21578:5;;21613:4;;21586:23;;:17;:23;:::i;:::-;21585:32;;;;:::i;:::-;21563:55;;-1:-1:-1;;;;;;21563:55:0;;;;;;;-1:-1:-1;;;;;8948:55:1;;;21563::0;;;8930:74:1;9020:18;;;9013:34;8903:18;;21563:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21555:64;;;;;;21634:23;21648:8;21634:13;:23::i;:::-;21630:648;;21683:34;;;;:24;:34;;;;;;:39;21679:588;;21743:12;21758:34;;;:24;:34;;;;;;:38;;21795:1;;21758:38;:::i;:::-;21912:19;21954:26;;21743:53;;-1:-1:-1;21912:19:0;21954:30;;21983:1;;21954:30;:::i;:::-;21912:91;;;;;;-1:-1:-1;;;21912:91:0;;;;;;;;;;;;;;;;;21884:19;21904:4;21884:25;;;;;;-1:-1:-1;;;21884:25:0;;;;;;;;;;;;;;;;:119;;;;22022:26;22051:19;22071:4;22051:25;;;;;;-1:-1:-1;;;22051:25:0;;;;;;;;;;;;;;;;;22022:54;;22142:4;22149:1;22142:8;;;;:::i;:::-;22095:44;;;;:24;:44;;;;;;:55;;;;22169:34;;;;;;:38;22226:19;:25;;;;;-1:-1:-1;;;22226:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;21679:588;;;22293:58;;;12840:25:1;;;12896:2;12881:18;;12874:34;;;22340:10:0;12924:18:1;;;12917:83;;;;22293:58:0;;12828:2:1;12813:18;22293:58:0;12795:211:1;34093:3351:0;34219:7;34260:18;;;:8;:18;;;;;;;;:27;;;;;;;;34306:21;;;;34298:63;;;;-1:-1:-1;;;34298:63:0;;20150:2:1;34298:63:0;;;20132:21:1;20189:2;20169:18;;;20162:30;20228:27;20208:18;;;20201:55;20273:18;;34298:63:0;20122:175:1;34298:63:0;34381:31;;;;:19;;;:31;;;;;;;;34380:32;34372:67;;;;-1:-1:-1;;;34372:67:0;;21603:2:1;34372:67:0;;;21585:21:1;21642:2;21622:18;;;21615:30;21681:24;21661:18;;;21654:52;21723:18;;34372:67:0;21575:172:1;34372:67:0;34503:8;34472:28;34490:10;34472:15;:28;:::i;:::-;:39;34450:115;;;;-1:-1:-1;;;34450:115:0;;15998:2:1;34450:115:0;;;15980:21:1;16037:2;16017:18;;;16010:30;16076:28;16056:18;;;16049:56;16122:18;;34450:115:0;15970:176:1;34450:115:0;34629:8;34598:28;34616:10;34598:15;:28;:::i;:::-;:39;34576:119;;;;-1:-1:-1;;;34576:119:0;;21954:2:1;34576:119:0;;;21936:21:1;21993:2;21973:18;;;21966:30;22032:32;22012:18;;;22005:60;22082:18;;34576:119:0;21926:180:1;34576:119:0;34706:28;34737:34;34750:8;34760:10;34737:12;:34::i;:::-;34844:9;;;;;;;;;;-1:-1:-1;34844:9:0;;34804:26;;;;;;34706:65;;-1:-1:-1;34834:20:0;34804:50;;34782:128;;;;-1:-1:-1;;;34782:128:0;;19793:2:1;34782:128:0;;;19775:21:1;19832:2;19812:18;;;19805:30;19871;19851:18;;;19844:58;19919:18;;34782:128:0;19765:178:1;34782:128:0;34988:22;;;;34948:23;;;;34921:10;;34988:22;34935:36;;:10;:36;:::i;:::-;34934:76;;;;:::i;:::-;34921:89;;35063:10;35127:2;35102:5;:13;;:22;;;:27;;;;:::i;:::-;35076:23;;;;:53;;;;:::i;:::-;35063:66;;35207:34;35256:24;35294:35;35308:8;35318:10;35294:13;:35::i;:::-;35427:28;;;;35177:152;;-1:-1:-1;35177:152:0;-1:-1:-1;35340:20:0;;-1:-1:-1;35427:33:0;35423:438;;35477:11;35491:29;35504:15;35491:12;:29::i;:::-;35477:43;;35535:11;35549:35;35562:21;35549:12;:35::i;:::-;35535:49;-1:-1:-1;35603:8:0;35599:251;;35647:5;35632:20;;35599:251;;;35685:3;35678;:10;35674:176;;35748:3;35734:9;35748:3;35734;:9;:::i;:::-;35725:19;;:5;:19;:::i;:::-;35724:27;;;;:::i;:::-;35709:42;;35674:176;;;35831:3;35817:9;35823:3;35831;35817:9;:::i;:::-;35808:19;;:5;:19;:::i;:::-;35807:27;;;;:::i;:::-;35792:42;;35674:176;35423:438;;;35891:28;;;;35875:44;;35871:342;;35980:20;;;;35962:15;35975:2;35962:10;:15;:::i;:::-;:38;35936:127;;;;-1:-1:-1;;;35936:127:0;;19009:2:1;35936:127:0;;;18991:21:1;19048:2;19028:18;;;19021:30;19087:29;19067:18;;;19060:57;19134:18;;35936:127:0;18981:177:1;35936:127:0;36123:2;36104:16;:21;36078:123;;;;-1:-1:-1;;;36078:123:0;;21194:2:1;36078:123:0;;;21176:21:1;21233:2;21213:18;;;21206:30;21272:34;21252:18;;;21245:62;-1:-1:-1;;;21323:18:1;;;21316:38;21371:19;;36078:123:0;21166:230:1;36078:123:0;36283:20;;36259:21;;;;36223;;-1:-1:-1;36255:1102:0;;;-1:-1:-1;36336:20:0;;36371:21;;;:45;;36336:20;;36371:21;36336:13;;36371:45;;36336:20;;36371:45;:::i;:::-;;;;-1:-1:-1;36255:1102:0;;-1:-1:-1;36255:1102:0;;-1:-1:-1;36465:21:0;;;;;;:13;36501:25;;;36591:16;:23;36465:21;;-1:-1:-1;36587:668:0;;;36654:35;;;;36639:12;;36654:39;;36692:1;;36654:39;:::i;:::-;36806:16;36845:23;;36639:54;;-1:-1:-1;36806:16:0;36845:27;;36871:1;;36845:27;:::i;:::-;36806:85;;;;;;-1:-1:-1;;;36806:85:0;;;;;;;;;;;;;;;;;36781:16;36798:4;36781:22;;;;;;-1:-1:-1;;;36781:22:0;;;;;;;;;;;;;;;;:110;;;;36910:25;36938:16;36955:4;36938:22;;;;;;-1:-1:-1;;;36938:22:0;;;;;;;;;;;;;;;;;;;;;37008:80;;;:21;:80;;;;;;;;36938:22;;-1:-1:-1;37231:8:0;:4;37238:1;37231:8;:::i;:::-;37107:28;;;;:8;:28;;;;;;;;:47;;;;;;;;;:121;;:132;-1:-1:-1;36587:668:0;37269:16;:22;;;;;-1:-1:-1;;;37269:22:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;37269:22:0;;;;;;;;;;;;37306:35;;;:39;36255:1102;37367:31;;;;:19;;;;:31;;;;;;:38;;-1:-1:-1;;37367:38:0;37401:4;37367:38;;;-1:-1:-1;37423:13:0;;-1:-1:-1;;;;;;34093:3351:0;;;;;:::o;32254:1534::-;32354:7;32401:14;;;:4;:14;;;;;32479:8;32448:28;32466:10;32448:15;:28;:::i;:::-;:39;32426:115;;;;-1:-1:-1;;;32426:115:0;;15998:2:1;32426:115:0;;;15980:21:1;16037:2;16017:18;;;16010:30;16076:28;16056:18;;;16049:56;16122:18;;32426:115:0;15970:176:1;32426:115:0;32588:6;;:51;;-1:-1:-1;;;32588:51:0;;;;;12559:25:1;;;12600:18;;;12593:34;;;-1:-1:-1;;;;;32588:6:0;;;;:29;;12532:18:1;;32588:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32574:65:0;:10;-1:-1:-1;;;;;32574:65:0;;32552:174;;;;-1:-1:-1;;;32552:174:0;;19365:2:1;32552:174:0;;;19347:21:1;19404:2;19384:18;;;19377:30;19443:34;19423:18;;;19416:62;19514:29;19494:18;;;19487:57;19561:19;;32552:174:0;19337:249:1;32552:174:0;32737:28;32768:34;32781:8;32791:10;32768:12;:34::i;:::-;32875:9;;;;;;;;;;-1:-1:-1;32875:9:0;;32835:26;;;;;;32737:65;;-1:-1:-1;32865:20:0;32835:50;;32813:128;;;;-1:-1:-1;;;32813:128:0;;19793:2:1;32813:128:0;;;19775:21:1;19832:2;19812:18;;;19805:30;19871;19851:18;;;19844:58;19919:18;;32813:128:0;19765:178:1;32813:128:0;32994:12;;32952;;;33040:227;33061:1;33047:11;33054:4;33047;:11;:::i;:::-;:15;33040:227;;;33102:1;33087:11;33094:4;33087;:11;:::i;:::-;33086:17;;;;:::i;:::-;33079:24;;33146:10;33122:5;33128:4;33122:11;;;;;;-1:-1:-1;;;33122:11:0;;;;;;;;;;;;;;;;;;;:21;;;:34;33118:138;;;33184:4;33177:11;;33118:138;;;33236:4;33229:11;;33118:138;33040:227;;;33282:24;33310:35;33324:8;33334:10;33310:13;:35::i;:::-;33277:68;;;;33397:5;33403:4;33397:11;;;;;;-1:-1:-1;;;33397:11:0;;;;;;;;;;;;;;;;;;;:21;;;33378:16;:40;33356:123;;;;-1:-1:-1;;;33356:123:0;;16353:2:1;33356:123:0;;;16335:21:1;16392:2;16372:18;;;16365:30;16431:34;16411:18;;;16404:62;-1:-1:-1;;;16482:18:1;;;16475:31;16523:19;;33356:123:0;16325:223:1;33356:123:0;33525:5;33531:4;33525:11;;;;;;-1:-1:-1;;;33525:11:0;;;;;;;;;;;;;;;;;;;:21;;;33512:10;:34;33490:114;;;;-1:-1:-1;;;33490:114:0;;17474:2:1;33490:114:0;;;17456:21:1;17513:2;17493:18;;;17486:30;17552:32;17532:18;;;17525:60;17602:18;;33490:114:0;17446:180:1;33490:114:0;33644:1;33623:5;33629:4;33623:11;;;;;;-1:-1:-1;;;33623:11:0;;;;;;;;;;;;;;;;;;;:18;;;:22;33615:54;;;;-1:-1:-1;;;33615:54:0;;15650:2:1;33615:54:0;;;15632:21:1;15689:2;15669:18;;;15662:30;-1:-1:-1;;;15708:18:1;;;15701:49;15767:18;;33615:54:0;15622:169:1;33615:54:0;33680:18;33701:5;33707:4;33701:11;;;;;;-1:-1:-1;;;33701:11:0;;;;;;;;;;;;;;;;;;;:18;;;33680:39;;33751:1;33730:5;33736:4;33730:11;;;;;;-1:-1:-1;;;33730:11:0;;;;;;;;;;;;;;;;;;;;;;:22;33770:10;32254:1534;-1:-1:-1;;;;;;;;;32254:1534:0:o;31783:228::-;31872:15;;31905:99;31929:2;:9;31925:1;:13;31905:99;;;31986:2;31989:1;31986:5;;;;;;-1:-1:-1;;;31986:5:0;;;;;;;;;;;;;31970:22;;31986:5;;31970:7;:22;:::i;:::-;31960:32;-1:-1:-1;31940:3:0;;;;:::i;:::-;;;;31905:99;;;;31783:228;;;:::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:375;;;529:3;522:4;514:6;510:17;506:27;496:2;;554:8;544;537:26;496:2;-1:-1:-1;584:20:1;;627:18;616:30;;613:2;;;666:8;656;649:26;613:2;710:4;702:6;698:17;686:29;;762:3;755:4;746:6;738;734:19;730:30;727:39;724:2;;;779:1;776;769:12;794:333;;917:2;905:9;896:7;892:23;888:32;885:2;;;938:6;930;923:22;885:2;975:9;969:16;-1:-1:-1;;;;;1018:5:1;1014:54;1007:5;1004:65;994:2;;1088:6;1080;1073:22;994:2;1116:5;875:252;-1:-1:-1;;;875:252:1:o;1132:992::-;;1258:2;1301;1289:9;1280:7;1276:23;1272:32;1269:2;;;1322:6;1314;1307:22;1269:2;1360:9;1354:16;1389:18;1430:2;1422:6;1419:14;1416:2;;;1451:6;1443;1436:22;1416:2;1494:6;1483:9;1479:22;1469:32;;1539:7;1532:4;1528:2;1524:13;1520:27;1510:2;;1566:6;1558;1551:22;1510:2;1600;1594:9;1622:2;1618;1615:10;1612:2;;;1628:18;;:::i;:::-;1674:2;1671:1;1667:10;1657:20;;1697:28;1721:2;1717;1713:11;1697:28;:::i;:::-;1759:15;;;1790:12;;;;1822:11;;;1852;;;1848:20;;1845:33;-1:-1:-1;1842:2:1;;;1896:6;1888;1881:22;1842:2;1923:6;1914:15;;1938:156;1952:2;1949:1;1946:9;1938:156;;;2009:10;;1997:23;;1970:1;1963:9;;;;;2040:12;;;;2072;;1938:156;;;-1:-1:-1;2113:5:1;1238:886;-1:-1:-1;;;;;;;;1238:886:1:o;2129:297::-;;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2270:6;2262;2255:22;2217:2;2307:9;2301:16;2360:5;2353:13;2346:21;2339:5;2336:32;2326:2;;2387:6;2379;2372:22;2431:190;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2564:6;2556;2549:22;2511:2;-1:-1:-1;2592:23:1;;2501:120;-1:-1:-1;2501:120:1:o;2626:525::-;;;;2790:2;2778:9;2769:7;2765:23;2761:32;2758:2;;;2811:6;2803;2796:22;2758:2;2852:9;2839:23;2829:33;;2913:2;2902:9;2898:18;2885:32;2940:18;2932:6;2929:30;2926:2;;;2977:6;2969;2962:22;2926:2;3021:70;3083:7;3074:6;3063:9;3059:22;3021:70;:::i;:::-;2748:403;;3110:8;;-1:-1:-1;2995:96:1;;-1:-1:-1;;;;2748:403:1:o;3156:593::-;;;;;3337:2;3325:9;3316:7;3312:23;3308:32;3305:2;;;3358:6;3350;3343:22;3305:2;3399:9;3386:23;3376:33;;3456:2;3445:9;3441:18;3428:32;3418:42;;3511:2;3500:9;3496:18;3483:32;3538:18;3530:6;3527:30;3524:2;;;3575:6;3567;3560:22;3524:2;3619:70;3681:7;3672:6;3661:9;3657:22;3619:70;:::i;:::-;3295:454;;;;-1:-1:-1;3708:8:1;-1:-1:-1;;;;3295:454:1:o;3754:326::-;;;;3900:2;3888:9;3879:7;3875:23;3871:32;3868:2;;;3921:6;3913;3906:22;3868:2;-1:-1:-1;;3949:23:1;;;4019:2;4004:18;;3991:32;;-1:-1:-1;4070:2:1;4055:18;;;4042:32;;3858:222;-1:-1:-1;3858:222:1:o;4085:258::-;;;4214:2;4202:9;4193:7;4189:23;4185:32;4182:2;;;4235:6;4227;4220:22;4182:2;-1:-1:-1;;4263:23:1;;;4333:2;4318:18;;;4305:32;;-1:-1:-1;4172:171:1:o;4348:565::-;;;;;4513:2;4501:9;4492:7;4488:23;4484:32;4481:2;;;4534:6;4526;4519:22;4481:2;4575:9;4562:23;4552:33;;4632:2;4621:9;4617:18;4604:32;4594:42;;4687:2;4676:9;4672:18;4659:32;4714:18;4706:6;4703:30;4700:2;;;4751:6;4743;4736:22;4700:2;4795:58;4845:7;4836:6;4825:9;4821:22;4795:58;:::i;4918:841::-;;;;;;;;;5151:3;5139:9;5130:7;5126:23;5122:33;5119:2;;;5173:6;5165;5158:22;5119:2;5214:9;5201:23;5191:33;;5271:2;5260:9;5256:18;5243:32;5233:42;;5322:2;5311:9;5307:18;5294:32;5284:42;;5373:2;5362:9;5358:18;5345:32;5335:42;;5424:3;5413:9;5409:19;5396:33;5386:43;;5476:3;5465:9;5461:19;5448:33;5438:43;;5532:3;5521:9;5517:19;5504:33;5560:18;5552:6;5549:30;5546:2;;;5597:6;5589;5582:22;5546:2;5641:58;5691:7;5682:6;5671:9;5667:22;5641:58;:::i;:::-;5109:650;;;;-1:-1:-1;5109:650:1;;-1:-1:-1;5109:650:1;;;;;;5718:8;-1:-1:-1;;;5109:650:1:o;5764:745::-;;5896:2;5884:9;5875:7;5871:23;5867:32;5864:2;;;5917:6;5909;5902:22;5864:2;5955:9;5949:16;5984:18;6025:2;6017:6;6014:14;6011:2;;;6046:6;6038;6031:22;6011:2;6089:6;6078:9;6074:22;6064:32;;6134:7;6127:4;6123:2;6119:13;6115:27;6105:2;;6161:6;6153;6146:22;6105:2;6195;6189:9;6217:2;6213;6210:10;6207:2;;;6223:18;;:::i;:::-;6265:53;6308:2;6289:13;;-1:-1:-1;;6285:27:1;6314:2;6281:36;6265:53;:::i;:::-;6252:66;;6341:2;6334:5;6327:17;6381:7;6376:2;6371;6367;6363:11;6359:20;6356:33;6353:2;;;6407:6;6399;6392:22;6353:2;6425:54;6476:2;6471;6464:5;6460:14;6455:2;6451;6447:11;6425:54;:::i;:::-;-1:-1:-1;6498:5:1;5854:655;-1:-1:-1;;;;5854:655:1:o;6709:194::-;;6832:2;6820:9;6811:7;6807:23;6803:32;6800:2;;;6853:6;6845;6838:22;6800:2;-1:-1:-1;6881:16:1;;6790:113;-1:-1:-1;6790:113:1:o;6908:268::-;;6996:6;6991:3;6984:19;7048:6;7041:5;7034:4;7029:3;7025:14;7012:43;7100:3;7093:4;7084:6;7079:3;7075:16;7071:27;7064:40;7165:4;7158:2;7154:7;7149:2;7141:6;7137:15;7133:29;7128:3;7124:39;7120:50;7113:57;;6974:202;;;;;:::o;7181:257::-;;7260:5;7254:12;7287:6;7282:3;7275:19;7303:63;7359:6;7352:4;7347:3;7343:14;7336:4;7329:5;7325:16;7303:63;:::i;:::-;7420:2;7399:15;-1:-1:-1;;7395:29:1;7386:39;;;;7427:4;7382:50;;7230:208;-1:-1:-1;;7230:208:1:o;7844:273::-;;8027:6;8019;8014:3;8001:33;8053:16;;8078:15;;;8053:16;7991:126;-1:-1:-1;7991:126:1:o;9058:635::-;9229:2;9281:21;;;9351:13;;9254:18;;;9373:22;;;9058:635;;9229:2;9452:15;;;;9426:2;9411:18;;;9058:635;9498:169;9512:6;9509:1;9506:13;9498:169;;;9573:13;;9561:26;;9642:15;;;;9607:12;;;;9534:1;9527:9;9498:169;;;-1:-1:-1;9684:3:1;;9209:484;-1:-1:-1;;;;;;9209:484:1:o;9698:713::-;9911:2;9963:21;;;10033:13;;9936:18;;;10055:22;;;9698:713;;9911:2;10096;;10114:18;;;;10155:15;;;9698:713;10201:184;10215:6;10212:1;10209:13;10201:184;;;10264:41;10301:3;10292:6;10286:13;7512:12;;7500:25;;7574:4;7563:16;;;7557:23;7541:14;;7534:47;7490:97;10264:41;10325:12;;;;10360:15;;;;10237:1;10230:9;10201:184;;;-1:-1:-1;10402:3:1;;9891:520;-1:-1:-1;;;;;;;9891:520:1:o;10608:369::-;;10819:6;10812:14;10805:22;10794:9;10787:41;10864:2;10859;10848:9;10844:18;10837:30;10884:44;10924:2;10913:9;10909:18;10901:6;10884:44;:::i;:::-;10876:52;;10964:6;10959:2;10948:9;10944:18;10937:34;10777:200;;;;;;:::o;11427:508::-;;11668:6;11657:9;11650:25;11711:6;11706:2;11695:9;11691:18;11684:34;11754:3;11749:2;11738:9;11734:18;11727:31;11775:62;11832:3;11821:9;11817:19;11809:6;11801;11775:62;:::i;:::-;11767:70;;-1:-1:-1;;;;;11877:6:1;11873:55;11868:2;11857:9;11853:18;11846:83;11640:295;;;;;;;;:::o;14064:217::-;;14211:2;14200:9;14193:21;14231:44;14271:2;14260:9;14256:18;14248:6;14231:44;:::i;17631:402::-;17833:2;17815:21;;;17872:2;17852:18;;;17845:30;17911:34;17906:2;17891:18;;17884:62;-1:-1:-1;;;17977:2:1;17962:18;;17955:36;18023:3;18008:19;;17805:228::o;22737:234::-;7512:12;;7500:25;;7574:4;7563:16;;;7557:23;7541:14;;;7534:47;22913:2;22898:18;;22925:40;7490:97;23411:275;23482:2;23476:9;23547:2;23528:13;;-1:-1:-1;;23524:27:1;23512:40;;23582:18;23567:34;;23603:22;;;23564:62;23561:2;;;23629:18;;:::i;:::-;23665:2;23658:22;23456:230;;-1:-1:-1;23456:230:1:o;23691:128::-;;23762:1;23758:6;23755:1;23752:13;23749:2;;;23768:18;;:::i;:::-;-1:-1:-1;23804:9:1;;23739:80::o;23824:217::-;;23890:1;23880:2;;-1:-1:-1;;;23915:31:1;;23969:4;23966:1;23959:15;23997:4;23922:1;23987:15;23880:2;-1:-1:-1;24026:9:1;;23870:171::o;24046:168::-;;24152:1;24148;24144:6;24140:14;24137:1;24134:21;24129:1;24122:9;24115:17;24111:45;24108:2;;;24159:18;;:::i;:::-;-1:-1:-1;24199:9:1;;24098:116::o;24219:125::-;;24287:1;24284;24281:8;24278:2;;;24292:18;;:::i;:::-;-1:-1:-1;24329:9:1;;24268:76::o;24349:258::-;24421:1;24431:113;24445:6;24442:1;24439:13;24431:113;;;24521:11;;;24515:18;24502:11;;;24495:39;24467:2;24460:10;24431:113;;;24562:6;24559:1;24556:13;24553:2;;;24597:1;24588:6;24583:3;24579:16;24572:27;24553:2;;24402:205;;;:::o;24612:135::-;;-1:-1:-1;;24672:17:1;;24669:2;;;24692:18;;:::i;:::-;-1:-1:-1;24739:1:1;24728:13;;24659:88::o;24752:127::-;24813:10;24808:3;24804:20;24801:1;24794:31;24844:4;24841:1;24834:15;24868:4;24865:1;24858:15;24884:127;24945:10;24940:3;24936:20;24933:1;24926:31;24976:4;24973:1;24966:15;25000:4;24997:1;24990:15

Swarm Source

ipfs://488de213d682d4e51dc9955260abd5fff0b1fb0dae0ed045657a4d5d4ce7fbad
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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.