Token

Scale Gauge for Equalizer Classic AMM - Wrapped So... (SG:v-WS/EQUAL)

Overview

Max Total Supply

0.001271487526276684 SG:v-WS/EQUAL

Holders

5

Market

Price

-

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 SG:v-WS/EQUAL

Value
$0.00
0x33b1f5ffadba3bc96830c4460240c0c8a36d400a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x49309F28...B3e17Deeb
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
GaugeEquivalent

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2024-12-19
*/

/**
 *  EQUALIZER EXCHANGE
 *  The New Liquidity Hub of Fantom chain!
 *  https://equalizer.exchange  (Dapp)
 *  https://discord.gg/MaMhbgHMby   (Community)
 *
 *
 *  Contributors:
 *   -   Synthetix Network
 *   -   Curve Finance
 *   -   Andre Cronje, Solidly.Exchange
 *   -   543 (Sam), ftm.guru, Eliteness.netowork & Equalizer.exchange
 *
 *	Version: v4.11.0
 *	- Prohibit notifyRewards without existing farmers
 *	- Trap dust from last farmer
 *
 *	Version: v1.3.0
 *	- Split `baseReward`
 *	  - veRewards Split Ratio
 *	  - SplitLockTime
 *	- Gauge Receipts (ERC20) Tracker
 *
 *
 *	SPDX-License-Identifier: UNLICENSED
*/


/**
 *v1.5.5
 *0xf438b2fdf46ea176ebf99ec7852c4699e8e38b1f
 *Submitted for verification at FtmScan.com on 2023-03-27
*/



pragma solidity 0.8.9;


// File: contracts/interfaces/IGaugeFactory.sol

interface IGaugeFactory {
    function createGauge(address, address, address, bool, address[] memory) external returns (address);
}

// File: contracts/interfaces/IVotingEscrow.sol

interface IVotingEscrow {

    struct Point {
        int128 bias;
        int128 slope; // # -dweight / dt
        uint256 ts;
        uint256 blk; // block
    }

    function token() external view returns (address);
    function team() external returns (address);
    function epoch() external view returns (uint);
    function point_history(uint loc) external view returns (Point memory);
    function user_point_history(uint tokenId, uint loc) external view returns (Point memory);
    function user_point_epoch(uint tokenId) external view returns (uint);

    function ownerOf(uint) external view returns (address);
    function isApprovedOrOwner(address, uint) external view returns (bool);
    function transferFrom(address, address, uint) external;

    function voting(uint tokenId) external;
    function abstain(uint tokenId) external;
    function attach(uint tokenId) external;
    function detach(uint tokenId) external;

    function checkpoint() external;
    function deposit_for(uint tokenId, uint value) external;
    function create_lock_for(uint, uint, address) external returns (uint);

    function balanceOfNFT(uint) external view returns (uint);
    function totalSupply() external view returns (uint);
}

// File: contracts/interfaces/IVoter.sol

interface IVoter {
    function _ve() external view returns (address);
    function governor() external view returns (address);
    function emergencyCouncil() external view returns (address);
    function protocolFeesTaker() external view returns (address);
    function attachTokenToGauge(uint _tokenId, address account) external;
    function attachable() external view returns (bool);
    function protocolFeesPerMillion() external view returns (uint);
    function detachTokenFromGauge(uint _tokenId, address account) external;
    function emitDeposit(uint _tokenId, address account, uint amount) external;
    function emitWithdraw(uint _tokenId, address account, uint amount) external;
    function isWhitelisted(address token) external view returns (bool);
    function notifyRewardAmount(uint amount) external;
    function distribute(address _gauge) external;
}
// File: contracts/interfaces/IPair.sol

interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function claimFees() external returns (uint, uint);
    function tokens() external returns (address, address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

// File: contracts/interfaces/IERC20.sol

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function decimals() external view returns (uint8);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

// File: contracts/interfaces/IBribe.sol

interface IBribe {
    function _deposit(uint amount, uint tokenId) external;
    function _withdraw(uint amount, uint tokenId) external;
    function getRewardForOwner(uint tokenId, address[] memory tokens) external;
    function notifyRewardAmount(address token, uint amount) external;
    function left(address token) external view returns (uint);
    function rewardsListLength() external view returns (uint);
    function rewards(uint) external view returns (address);
}


library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "RG!");
    }
}


library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: non-zero to non-zero"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: LLC fail"); //low-level call fail

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: !success");
        }
    }
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: +OF"); // addition overflow

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: -OF"); // subtraction overflow
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: *OF"); // multiplication overflow

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: /0"); // division by zero
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: %0"); // modulo by zero"
        return a % b;
    }
}

contract GaugeEquivalent is ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /* ========== STATE VARIABLES ========== */

    struct Reward {
        address rewardsDistributor;
        uint256 rewardsDuration;
        uint256 periodFinish;
        uint256 rewardRate;
        uint256 lastUpdateTime;
        uint256 rewardPerTokenStored;
    }

    // Constants
    IERC20 public stake;
    IVotingEscrow public ve;
    IVoter public voter;
    bool public isForPair;
    address public baseReward;

    bool public paused;
    mapping(address => Reward) public rewardData;
    address[] public rewardTokens;
    address[] public bribeTokens;
    IBribe public bribe;

    // user -> reward token -> amount
    mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;
    mapping(address => mapping(address => uint256)) public rewards;
    mapping(address => bool) public isReward;
    mapping(address => bool) public isBribeToken;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    address public feeTaker;
    uint256 public splitRatio;	//per million
    uint256 public splitLocktime;

    mapping(address => uint) public payouts;
    mapping(address => uint) public payoutsNotified;
    mapping(address => mapping(address => uint)) public earnings;
    mapping(address => uint) public totalFeesPayouts;

    /* ========== CONSTRUCTOR ========== */

    constructor(
        address _stake,
        address _ebribe,
        address  __ve,
        address _voter,
        bool _forPair,
        address[] memory _allowedRewardTokens
    ) {

        stake = IERC20(_stake);
        bribe = IBribe(_ebribe);
        ve = IVotingEscrow(__ve);
        voter = IVoter(_voter);
        isForPair = _forPair;
        address _baseReward = ve.token();
        baseReward = _baseReward;
        splitLocktime = 26 weeks;

        for (uint i; i < _allowedRewardTokens.length; i++) {
            if (_allowedRewardTokens[i] != address(0)) {
                isReward[_allowedRewardTokens[i]] = true;
                rewardTokens.push(_allowedRewardTokens[i]);
                rewardData[_allowedRewardTokens[i]].rewardsDistributor = _voter;
                rewardData[_allowedRewardTokens[i]].rewardsDuration = 7 days;
            }
        }
        if(_forPair) {
            //claimFees : Bribe Rewards
            //Pre-approve to save gas, since both Bribe & Gauge are immutable
            (address _token0, address _token1) = IPair(_stake).tokens();
            IERC20(_token0).approve(_ebribe, type(uint256).max);
            IERC20(_token1).approve(_ebribe, type(uint256).max);
            bribeTokens.push(_token0);
            bribeTokens.push(_token1);
            isBribeToken[_token0] = true;
            isBribeToken[_token1] = true;
            emit BribeTokenSet(_token0, _ebribe, true);
            emit BribeTokenSet(_token1, _ebribe, true);
        }
        ///else ve.team() must manually `addBribeTokens()`
        IERC20(_baseReward).approve(address(__ve), type(uint256).max);
    }

    /* ========== VIEWS ========== */

    function name() external view returns (string memory) {
        return string(abi.encodePacked("Scale Gauge for ", stake.name()));
    }

    function symbol() external view returns (string memory) {
        return string(abi.encodePacked("SG:", stake.symbol()));
    }

    function decimals() external view returns (uint256) {
        return stake.decimals();
    }

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external view returns (uint256) {
        return _balances[account];
    }

    function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) {
        return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish);
    }

    function rewardPerToken(address _rewardsToken) public view returns (uint256) {
        if (_totalSupply == 0) {
            return rewardData[_rewardsToken].rewardPerTokenStored;
        }
        return
            rewardData[_rewardsToken].rewardPerTokenStored.add(
                lastTimeRewardApplicable(_rewardsToken).sub(rewardData[_rewardsToken].lastUpdateTime).mul(rewardData[_rewardsToken].rewardRate).mul(1e18).div(_totalSupply)
            );
    }

    /// @param account 1
    /// @param _rewardsToken 2
    function earnedBy(address account, address _rewardsToken) public view returns (uint256) {
        return _balances[account].mul(rewardPerToken(_rewardsToken).sub(userRewardPerTokenPaid[account][_rewardsToken])).div(1e18).add(rewards[account][_rewardsToken]);
    }

    /// Backwards compatible view with 3qu471738 <= v1.3
    /// @param _rewardsToken 1
    /// @param account 2
    function earned(address _rewardsToken, address account) public view returns (uint256) {
        return earnedBy(account, _rewardsToken);
    }

    function getRewardForDuration(address _rewardsToken) external view returns (uint256) {
        return rewardData[_rewardsToken].rewardRate.mul(rewardData[_rewardsToken].rewardsDuration);
    }

    function left(address _rewardsToken) external view returns (uint) {
        if (block.timestamp >= rewardData[_rewardsToken].periodFinish) return 0;
        uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp);
        return remaining.mul(rewardData[_rewardsToken].rewardRate);
    }

    function rewardsListLength() external view returns (uint) {
        return rewardTokens.length;
    }

    function bribesListLength() external view returns (uint) {
        return bribeTokens.length;
    }

    /* ========== BACKWARDS-COMPATIBLE VIEW FUNCTIONS ========== */

    function _ve() external view returns (address) {
        return address(ve);
    }

    function periodFinish(address _tkn) external view returns (uint) {
        return rewardData[_tkn].periodFinish;
    }

    function rewardRate(address _tkn) external view returns (uint) {
        return rewardData[_tkn].rewardRate;
    }

    function lastUpdateTime(address _tkn) external view returns (uint) {
        return rewardData[_tkn].lastUpdateTime;
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    function setRewardsDistributor(address _rewardsToken, address _rewardsDistributor) external onlyOwner {
        rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor;
    }

    function deposit(uint256 amount) public nonReentrant notPaused updateReward(msg.sender) {
        require(amount > 0, "0a"); // Cannot stake 0
        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        stake.safeTransferFrom(msg.sender, address(this), amount);
        emit Deposit(msg.sender, amount);
        emit Transfer(address(0), msg.sender, amount);
        //_claimFees();
    }

    function depositFor(address _user, uint256 amount) public nonReentrant notPaused updateReward(_user) {
        require(amount > 0, "0a"); // Cannot stake 0
        _totalSupply = _totalSupply.add(amount);
        _balances[_user] = _balances[_user].add(amount);
        stake.safeTransferFrom(msg.sender, address(this), amount);
        emit Deposit(_user, amount);
        emit Transfer(address(0), _user, amount);
        //_claimFees();
    }

    function depositAll() external {
        deposit(stake.balanceOf(msg.sender));
    }

    function depositAllFor(address _user) external {
        depositFor(_user, stake.balanceOf(msg.sender));
    }

    function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) {
        require(amount > 0, "0a"); // Cannot withdraw 0
        require(amount < _totalSupply, "0t"); // Last Farmer should reduce withdraw amount by 1; Please use (amount-1)
        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        stake.safeTransfer(msg.sender, amount);
        emit Withdrawn(msg.sender, amount);
        emit Transfer(msg.sender, address(0), amount);
        //_claimFees();
    }

    function withdrawAll() external {
        withdraw(_balances[msg.sender]);
    }

    function exit() external {
        withdraw(_balances[msg.sender]);
        getReward();
    }


    function getReward() public nonReentrant updateReward(msg.sender) {

        for (uint i; i < rewardTokens.length; i++) {
            address _rewardsToken = rewardTokens[i];
            uint256 _reward = rewards[msg.sender][_rewardsToken];
            _sendReward(msg.sender, _rewardsToken, _reward);
        }
        _claimFees();
    }

    function getReward(address account, address[] memory tokens) external {
        require(msg.sender == account || msg.sender == address(voter), "Un-authorized claim!");
        voter.distribute(address(this));
        _getReward(account, tokens);
    }

    function _getReward(address account, address[] memory _tokens) internal nonReentrant updateReward(account) {
        for (uint i; i < _tokens.length; i++) {
            address _rewardsToken = _tokens[i];
            uint256 _reward = rewards[account][_rewardsToken];
            _sendReward(account, _rewardsToken, _reward);
        }
        _claimFees();
    }

    function _sendReward(address _acc, address _toke, uint _rew) internal {
        if (_rew > 0) {
            rewards[_acc][_toke] = 0;
            if(_toke == baseReward) {
            	uint _spr = splitRatio;
                if(_spr > 0) {
                    uint _toLock = ( _rew.mul(_spr) ).div(1e6);
                    ve.create_lock_for(_toLock, splitLocktime, _acc);
                    IERC20(_toke).safeTransfer(_acc, _rew.sub(_toLock));
                }
            }
            else {
                IERC20(_toke).safeTransfer(_acc, _rew);
            }
            emit ClaimRewards(_toke, _acc, _rew);
            payouts[_toke] += _rew;
            earnings[_acc][_toke] += _rew;
        }
    }

    function notifyRewardAmount(address _rewardsToken, uint256 _reward) external nonReentrant updateReward(address(0)) {
        require(_rewardsToken != address(stake), "!!stk"); // Can't distribute staked token as reward!
        require(isReward[_rewardsToken], "Not a reward!!" );
        require(_totalSupply>0,"No Farmers!");
        /// The old pattern to get force collection of fees at least once a week during emission distribution to this gauge
        /// & distribute it to voters over the next week via the (external) Bribe
        _claimFees();

        /// Support feeOnTransfer tokens like ELITE etc.
        uint rtbb = IERC20(_rewardsToken).balanceOf(address(this));
        // handle the transfer of reward tokens via `transferFrom` to reduce the number
        // of transactions required and ensure correctness of the reward amount
        IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), _reward);
        uint rtba = IERC20(_rewardsToken).balanceOf(address(this));
        _reward = rtba - rtbb;
        require(_reward > 0, "0r"); // Reward amount must be greater than 0!

        if (block.timestamp >= rewardData[_rewardsToken].periodFinish) {
            rewardData[_rewardsToken].rewardRate = _reward.div(rewardData[_rewardsToken].rewardsDuration);
        } else {
            //Griefing Protection Enabled for Unknown reward adders
            uint _oldRewardRate = rewardData[_rewardsToken].rewardRate;
            uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate);
            rewardData[_rewardsToken].rewardRate = _reward.add(leftover).div(rewardData[_rewardsToken].rewardsDuration);
            if(
                msg.sender!=address(voter)
                || msg.sender!=rewardData[_rewardsToken].rewardsDistributor
                || msg.sender!=ve.team()
            ) {
                require(
                    (
                        rewardData[_rewardsToken].rewardRate >= _oldRewardRate
                        || _reward > leftover
                    ), "EGPE" // Enhanced Griefing Protection Enabled!
                );
            }
        }

        rewardData[_rewardsToken].lastUpdateTime = block.timestamp;
        rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardData[_rewardsToken].rewardsDuration);
        emit RewardAdded(_rewardsToken, msg.sender, _reward);
        payoutsNotified[_rewardsToken] += _reward;
    }

    function claimFees() external nonReentrant returns (uint claimed0, uint claimed1) {
        return _claimFees();
    }

    function _claimFees() internal returns (uint claimed0, uint claimed1)  {
        uint _pfpm = voter.protocolFeesPerMillion();
        address _pft = _pfpm > 0 ? voter.protocolFeesTaker() : address(0);
        /// Equa7izer v1.5: Support Custom pools to be Gaugable
        if (!isForPair) {
        	/// For non-official/external/independent gauges only
        	/// If compatible, the claimed fees should be notified to Bribe
        	/// Else, this contract will hold the fees & ve.team() can rescue()
            uint _bn = bribeTokens.length;
        	IERC20[] memory _brews = new IERC20[](_bn);
        	uint[] memory _brewbals = new uint[](_bn);
        	for(uint _n; _n < _bn; _n++) {
        	    _brews[_n] = IERC20( bribeTokens[_n] );
        	    /// Record current balance to protect gauge deposits & rewards.
                /// Also Support feeOnTransfer tokens like ELITE etc.
                /// Also makes sure a bribe-reward isnt 'killed' or uninitialized.
        	    _brewbals[_n] =
        	        address(_brews[_n]) == address(0)
        	        ? 0
        	        : _brews[_n].balanceOf(address(this));
        	}
            try IPair(address(stake)).claimFees() {
                /// if call succeeds, gauge will have a surplus of extra tokens which can be sent to bribes
                /// useful in cases of non-equa1izer lps, like conc., weighted or multi-token Liquidity pools
                for(uint _n = 0; _n < _bn; _n++) {
                    /// Don't trigger bribes for 0x00 rewards
                    uint _a =
        	            address(_brews[_n]) == address(0)
        	            ? 0
        	            : _brews[_n].balanceOf(address(this));
                    /// Trigger only when a token balance increases when we try IPair(stake).claimFees()
                    /// because there could possibly be an overlap between rewardTokens & bribeTokens
                    if(_a > _brewbals[_n]) {
                        ///Protocol Fees
                        if( ( (_a - _brewbals[_n]) * _pfpm) / 1e6 > 0) {
                            _brews[_n].transfer(_pft, ( (_a.sub(_brewbals[_n])) * _pfpm) / 1e6 );
                            emit ProtocolFees(msg.sender,_pft,address(_brews[_n]),((_a.sub(_brewbals[_n])) * _pfpm) / 1e6);
                            _a = _brews[_n].balanceOf(address(this));
                        }
                        ///Normal Fees -> Bribe
                        if (feeTaker == address(0)) {
                            bribe.notifyRewardAmount( address(_brews[_n]), (_a.sub(_brewbals[_n])) );
                            emit ClaimFees(msg.sender, address(bribe), address(_brews[_n]), (_a - _brewbals[_n]) );
                            totalFeesPayouts[ address(_brews[_n]) ] += (_a - _brewbals[_n]);
                        }
                        ///Re-channeled Fees -> FeesTaker
                        else {
                            _brews[_n].transfer(feeTaker, (_a.sub(_brewbals[_n])) );
                            emit ClaimFees(msg.sender, feeTaker, address(_brews[_n]), (_a - _brewbals[_n]) );
                            totalFeesPayouts[ address(_brews[_n]) ] += (_a - _brewbals[_n]);
                        }
                    }
                    /// else: we dont have any fees here ser!
                }
                return (0, 0);
            }
            catch {
                /// if call fails, do nothing (much).
                return (0, 0);
            }
        }

        //else:
        /// For actual Protocol gauges, created by Voter, for E9ua1izer Factory Pairs
        (address _token0, address _token1) = IPair(address(stake)).tokens();
        /// Support feeOnTransfer tokens like ELITE etc.
        uint t0bb = IERC20(_token0).balanceOf(address(this));
        uint t1bb = IERC20(_token1).balanceOf(address(this));
        //(claimed0, claimed1) =
        try IPair(address(stake)).claimFees() {
            claimed0 = IERC20(_token0).balanceOf(address(this)) - t0bb;
            claimed1 = IERC20(_token1).balanceOf(address(this)) - t1bb;
            //claimed0 = t0ba - t0bb;
            //claimed1 = t1ba - t1bb;

            ///ProtocolFees
            if( ( claimed0 * _pfpm) / 1e6 > 0) {
                IERC20(_token0).transfer(_pft, (claimed0*_pfpm)/1e6 );
                emit ProtocolFees(msg.sender,_token0,_pft,(claimed0*_pfpm)/1e6);
                claimed0 = IERC20(_token0).balanceOf(address(this)).sub(t0bb);
            }
            if( ( claimed1 * _pfpm) / 1e6 > 0) {
                IERC20(_token1).transfer(_pft, (claimed1*_pfpm)/1e6 );
                emit ProtocolFees(msg.sender,_token1,_pft,(claimed1*_pfpm)/1e6);
                claimed1 = IERC20(_token1).balanceOf(address(this)).sub(t1bb);
            }

            ///Normal Fees -> Bribe
		    if (feeTaker == address(0)) {
            	if (claimed0 > 0) {
                	bribe.notifyRewardAmount(_token0, claimed0);
                	totalFeesPayouts[ _token0 ] += claimed0;	// stores total token0 fees claimed since genesis
                    emit ClaimFees(msg.sender, address(bribe), _token0, claimed0);
            	}
            	if (claimed1 > 0) {
                	bribe.notifyRewardAmount(_token1, claimed1);
                	totalFeesPayouts[ _token1 ] += claimed1;	// stores total token1 fees claimed since genesis
                    emit ClaimFees(msg.sender, address(bribe), _token1, claimed1);
            	}
            }

            ///Re-channeled Fees -> FeesTaker
            else {
            	IERC20(_token0).transfer(feeTaker, claimed0);
            	IERC20(_token1).transfer(feeTaker, claimed1);
                emit ClaimFees(msg.sender, feeTaker, _token0, claimed0);
                emit ClaimFees(msg.sender, feeTaker, _token1, claimed1);
                totalFeesPayouts[ _token0 ] += claimed0;	// stores total token0 fees claimed since genesis
                totalFeesPayouts[ _token1 ] += claimed1;	// stores total token1 fees claimed since genesis
            }

            return (claimed0, claimed1);
        }
        catch {
            ///dont revert if _claimFees_ fails, just skip it. Useful with fee-on-transfer tokens.
            return (0, 0);
        }
    }


    /* ========== RESTRICTED FUNCTIONS ========== */

    function addReward(address _rewardsToken, address _rewardsDistributor, uint256 _rewardsDuration) public onlyOwner {
        require(
            isReward[_rewardsToken] == false
            && rewardData[_rewardsToken].rewardsDuration == 0
            , "AI" // Already Initialized!
        );
        require( _rewardsToken != address(stake), "!!stk"); // Cannot reward staking token!
        rewardTokens.push(_rewardsToken);
        isReward[_rewardsToken] = true;
        rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor;
        rewardData[_rewardsToken].rewardsDuration = _rewardsDuration;
    }

    /// This can break claims of rewards!
    /// Useful during a platform-wide upgrade (optional)
    function rescue(uint _amt, address _token, address _to) external onlyOwner {
        if(_token == address(stake)) {
            /// totalSupply marks the sum of all user deposits.
            /// surplus checks for any additional holdings that are not user-deposits
            /// Helps rescue of extra rewards from single-side same-token staking.
            uint _surplus = (stake.balanceOf(address(this))).sub(_totalSupply);
            require( _amt <= _surplus, "!!stk"); // Rescuing User Deposits Prohibited!
        }
        IERC20(_token).transfer(_to, _amt);
        emit Recovered(_token, _amt);
    }

    function setRewardsDuration(address _rewardsToken, uint256 _rewardsDuration) external onlyOwner {
        require(
            block.timestamp > rewardData[_rewardsToken].periodFinish,
            "RPa" // Reward period still active
        );
        require(_rewardsDuration > 0, "0d"); // Reward duration must be non-zero
        rewardData[_rewardsToken].rewardsDuration = _rewardsDuration;
        emit RewardsDurationUpdated(_rewardsToken, rewardData[_rewardsToken].rewardsDuration);
    }

    function addBribeToken(address _t) public onlyOwner {
        require(isBribeToken[_t] == false, "BTa"); // Bribe Token already Active!
        require( _t != address(stake), "!!stk"); // Cannot bribe staking token!
        IERC20(_t).approve(address(bribe), type(uint256).max);
        bribeTokens.push(_t);
        isBribeToken[_t] = true;
        emit BribeTokenSet(_t, address(bribe), true);
    }

    function removeBribeToken(address _t) public onlyOwner {
        require(isBribeToken[_t] == true, "BTi"); // Bribe Token Inactive!
        IERC20(_t).approve(address(bribe), 0);
        uint _bl = bribeTokens.length;
        if(bribeTokens[_bl-1]==_t) {
            bribeTokens.pop();
            isBribeToken[_t] = false;
        }
        else {
            for(uint i; i < bribeTokens.length - 1; i++) {
                if(bribeTokens[i]==_t) {
                    bribeTokens[i] = bribeTokens[_bl-1];
                    bribeTokens.pop();
                    isBribeToken[_t] = false;
                }
            }
        }
        emit BribeTokenSet(_t, address(bribe), false);
    }

    function addBribeTokens(address[] memory _tks) external onlyOwner {
        for(uint _j; _j < _tks.length; _j++) {
            addBribeToken(_tks[_j]);
        }
    }

    function removeBribeTokens(address[] memory _tks) external onlyOwner {
        for(uint _j; _j < _tks.length; _j++) {
            removeBribeToken(_tks[_j]);
        }
    }

    /// When feeTaker is set, all Fees Claims go to it instead of going to the Bribe.
    /// Useful during a platform-wide upgrade (optional)
    function setFeeTaker(address _ft) external onlyOwner {
        feeTaker = _ft;
    }

    function setPaused(bool _b) external onlyOwner {
        paused = _b;
    }

    function setBribe(address _b) external {
        require(msg.sender==address(voter), "Who U"); // Un-authorized!
        address _ob = address(bribe);
        for(uint i;i<bribeTokens.length;i++) {
            address _rt = bribeTokens[i];
            IERC20(_rt).approve(_ob, 0);	// revoke old-bribe allowances
            IERC20(_rt).approve(_b, type(uint256).max); // approve new bribe
        }
        bribe = IBribe(_b);
    }

    function setSplitParameters(uint256 _sr, uint256 _st) external onlyOwner {
        require(_sr<=1e6, "+SR"); // SR: Must be under a million!
        splitRatio = _sr;
        splitLocktime = _st;
    }


    /* ========== MODIFIERS ========== */

    modifier updateReward(address account) {
        for (uint i; i < rewardTokens.length; i++) {
            address token = rewardTokens[i];
            rewardData[token].rewardPerTokenStored = rewardPerToken(token);
            rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token);
            if (account != address(0)) {
                rewards[account][token] = earnedBy(account, token);
                userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored;
            }
        }
        _;
    }

    modifier onlyOwner {
        require(msg.sender==ve.team(), "!TEAM"); // Only ve.team!
        _;
    }

    modifier notPaused {
        require(!paused, "PAUSE"); // Paused
        _;
    }

    /* ========== EVENTS ========== */

    event RewardAdded(address indexed token, address indexed notifier, uint256 reward);
    event Deposit(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event Transfer(address indexed from, address indexed to, uint256 amount);
    event ClaimRewards(address indexed token, address indexed user, uint256 reward);
    event RewardsDurationUpdated(address indexed token, uint256 newDuration);
    event Recovered(address indexed token, uint256 amount);
    event BribeTokenSet(address indexed token, address indexed bribe, bool indexed active);
    event ProtocolFees(address indexed initiator, address indexed taker, address indexed token, uint amount);
    event ClaimFees(address indexed initiator, address indexed beneficiary, address indexed token, uint amount);

}

// File: contracts/factories/GaugeFactory.sol



contract GaugeFactory is IGaugeFactory {
    address public lastGauge;
    event GaugeCreated(address indexed maker, address indexed pool, address g, address b, address v, bool i, address[] a);
    function createGauge(
        address _pool,
        address _bribe,
        address _ve,
        bool isPair,
        address[] memory _allowedRewards
    ) external returns (address) {
        GaugeEquivalent gauge = new GaugeEquivalent(
            _pool,
            _bribe,
            _ve,
            msg.sender,
            isPair,
            _allowedRewards
        );
        lastGauge = address(gauge);
        emit GaugeCreated(msg.sender, _pool, address(gauge), _bribe, _ve, isPair, _allowedRewards);
        return lastGauge;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_ebribe","type":"address"},{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_voter","type":"address"},{"internalType":"bool","name":"_forPair","type":"bool"},{"internalType":"address[]","name":"_allowedRewardTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"bribe","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"BribeTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProtocolFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"notifier","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_t","type":"address"}],"name":"addBribeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tks","type":"address[]"}],"name":"addBribeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribe","outputs":[{"internalType":"contract IBribe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bribeTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bribesListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"depositAllFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"earnedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"earnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBribeToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isForPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tkn","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"left","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"payoutsNotified","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tkn","type":"address"}],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_t","type":"address"}],"name":"removeBribeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tks","type":"address[]"}],"name":"removeBribeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amt","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"address","name":"rewardsDistributor","type":"address"},{"internalType":"uint256","name":"rewardsDuration","type":"uint256"},{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tkn","type":"address"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_b","type":"address"}],"name":"setBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ft","type":"address"}],"name":"setFeeTaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setRewardsDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sr","type":"uint256"},{"internalType":"uint256","name":"_st","type":"uint256"}],"name":"setSplitParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splitLocktime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"splitRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalFeesPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ve","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005bf838038062005bf883398101604081905262000034916200063b565b6001600081815581546001600160a01b03808a166001600160a01b031992831617909355600880548985169083161790556002805488851692168217905560038054861515600160a01b026001600160a81b0319909116948816949094179390931790925560408051637e062a3560e11b8152905191929163fc0c546a91600480820192602092909190829003018186803b158015620000d357600080fd5b505afa158015620000e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200010e91906200076c565b600480546001600160a01b0319166001600160a01b03831617905562eff100601155905060005b8251811015620002f05760006001600160a01b03168382815181106200015f576200015f62000791565b60200260200101516001600160a01b031614620002db576001600b600085848151811062000191576200019162000791565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506006838281518110620001e757620001e762000791565b6020908102919091018101518254600181018455600093845291832090910180546001600160a01b0319166001600160a01b03909216919091179055835186916005918690859081106200023f576200023f62000791565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555062093a8060056000858481518110620002ab57620002ab62000791565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101819055505b80620002e781620007a7565b91505062000135565b5082156200056257600080886001600160a01b0316639d63848a6040518163ffffffff1660e01b81526004016040805180830381600087803b1580156200033657600080fd5b505af11580156200034b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003719190620007d1565b60405163095ea7b360e01b81526001600160a01b038b8116600483015260001960248301529294509092509083169063095ea7b390604401602060405180830381600087803b158015620003c457600080fd5b505af1158015620003d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ff919062000809565b5060405163095ea7b360e01b81526001600160a01b038981166004830152600019602483015282169063095ea7b390604401602060405180830381600087803b1580156200044c57600080fd5b505af115801562000461573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000487919062000809565b5060078054600181810183557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68891820180546001600160a01b038088166001600160a01b0319928316811790935585548085019096559490930180548686169416841790556000818152600c6020526040808220805460ff19908116861790915594825280822080549095168417909455925191938c1692909160008051602062005bd88339815191529190a46040516001906001600160a01b03808b16919084169060008051602062005bd883398151915290600090a450505b60405163095ea7b360e01b81526001600160a01b038681166004830152600019602483015282169063095ea7b390604401602060405180830381600087803b158015620005ae57600080fd5b505af1158015620005c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005e9919062000809565b505050505050505062000827565b80516001600160a01b03811681146200060f57600080fd5b919050565b805180151581146200060f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c087890312156200065557600080fd5b6200066087620005f7565b9550602062000671818901620005f7565b95506200068160408901620005f7565b94506200069160608901620005f7565b9350620006a16080890162000614565b60a08901519093506001600160401b0380821115620006bf57600080fd5b818a0191508a601f830112620006d457600080fd5b815181811115620006e957620006e962000625565b8060051b604051601f19603f8301168101818110858211171562000711576200071162000625565b60405291825284820192508381018501918d8311156200073057600080fd5b938501935b8285101562000759576200074985620005f7565b8452938501939285019262000735565b8096505050505050509295509295509295565b6000602082840312156200077f57600080fd5b6200078a82620005f7565b9392505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620007ca57634e487b7160e01b600052601160045260246000fd5b5060010190565b60008060408385031215620007e557600080fd5b620007f083620005f7565b91506200080060208401620005f7565b90509250929050565b6000602082840312156200081c57600080fd5b6200078a8262000614565b6153a180620008376000396000f3fe608060405234801561001057600080fd5b50600436106103af5760003560e01c80635a6e6eab116101f457806399bcc0521161011a578063de5f6268116100ad578063e81defce1161007c578063e81defce14610931578063e9fad8ee14610944578063f12297771461094c578063f5ae22401461095f57600080fd5b8063de5f6268146108e2578063e5748213146108ea578063e6886396146108fe578063e70b9e271461090657600080fd5b8063d0ed26ae116100e9578063d0ed26ae14610863578063d294f09314610876578063da09d19d14610893578063dd501205146108bf57600080fd5b806399bcc05214610817578063b66503cf1461082a578063b6b55f251461083d578063bcd110141461085057600080fd5b8063749f1044116101925780638a501100116101615780638a501100146107e35780638dd598fb146107f65780638f27f1041461080757806395d89b411461080f57600080fd5b8063749f1044146107a257806376ad03bc146107b55780637bb7bed1146107c8578063853828b6146107db57600080fd5b8063638634ee116101ce578063638634ee1461071b57806365bcfbe71461072e5780637035ab981461074e57806370a082311461077957600080fd5b80635a6e6eab146106eb5780635c59f3bb146106fe5780635c975abb1461070757600080fd5b80632f4f21e2116102d95780633f695b45116102775780634d5ce038116102465780634d5ce0381461067f5780634ec5908d146106b257806352f18405146106c55780635557cc61146106d857600080fd5b80633f695b45146105c257806345797e67146105d557806346c96aac146105e857806348e5d9f8146105fb57600080fd5b8063313ce567116102b3578063313ce5671461058c57806337d0208c146105945780633a4b66f1146105a75780633d18b912146105ba57600080fd5b80632f4f21e2146105535780633010d8ef1461056657806331279d3d1461057957600080fd5b806318160ddd116103515780632378bea6116103205780632378bea6146104d65780632af2cecc146104e95780632ce9aead146105145780632e1a7d4d1461054057600080fd5b806318160ddd146104645780631f8507161461046c578063211dc32d14610497578063221ca18c146104aa57600080fd5b80630efeb2fb1161038d5780630efeb2fb146103fe578063102a7ad41461041e57806315ae92f71461043157806316c38b3c1461045157600080fd5b8063023df767146103b457806306fdde03146103c95780630a91a2c4146103e7575b600080fd5b6103c76103c2366004614cf3565b610972565b005b6103d1610bcc565b6040516103de9190614d3c565b60405180910390f35b6103f060115481565b6040519081526020016103de565b6103f061040c366004614cf3565b60136020526000908152604090205481565b6103f061042c366004614d6f565b610c71565b6103f061043f366004614cf3565b60156020526000908152604090205481565b6103c761045f366004614db6565b610d0c565b600d546103f0565b60025461047f906001600160a01b031681565b6040516001600160a01b0390911681526020016103de565b6103f06104a5366004614d6f565b610de2565b6103f06104b8366004614cf3565b6001600160a01b031660009081526005602052604090206003015490565b6103c76104e4366004614dd3565b610dee565b6103f06104f7366004614d6f565b601460209081526000928352604080842090915290825290205481565b6103f0610522366004614cf3565b6001600160a01b031660009081526005602052604090206004015490565b6103c761054e366004614dff565b610f87565b6103c7610561366004614dd3565b6111dc565b6103c7610574366004614cf3565b61145d565b6103c7610587366004614ee8565b6114e1565b6103f06115ac565b60085461047f906001600160a01b031681565b60015461047f906001600160a01b031681565b6103c7611631565b6103c76105d0366004614d6f565b6117ea565b6103c76105e3366004614f38565b6118d0565b60035461047f906001600160a01b031681565b610648610609366004614cf3565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501546001600160a01b03909316949193909286565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016103de565b6106a261068d366004614cf3565b600b6020526000908152604090205460ff1681565b60405190151581526020016103de565b6103c76106c0366004614cf3565b6119cc565b6103c76106d3366004614f5a565b611aa6565b6103c76106e6366004614cf3565b611b9e565b6103c76106f9366004614f5a565b611f41565b6103f060105481565b6004546106a290600160a01b900460ff1681565b6103f0610729366004614cf3565b612039565b6103f061073c366004614cf3565b60126020526000908152604090205481565b6103f061075c366004614d6f565b600960209081526000928352604080842090915290825290205481565b6103f0610787366004614cf3565b6001600160a01b03166000908152600e602052604090205490565b600f5461047f906001600160a01b031681565b60045461047f906001600160a01b031681565b61047f6107d6366004614dff565b612060565b6103c761208a565b6103c76107f1366004614f8f565b6120a5565b6002546001600160a01b031661047f565b6007546103f0565b6103d16122e8565b6103f0610825366004614cf3565b612379565b6103c7610838366004614dd3565b6123fa565b6103c761084b366004614dff565b612a4e565b6103f061085e366004614cf3565b612c85565b6103c7610871366004614fd1565b612cb1565b61087e612e8c565b604080519283526020830191909152016103de565b6103f06108a1366004614cf3565b6001600160a01b031660009081526005602052604090206002015490565b6106a26108cd366004614cf3565b600c6020526000908152604090205460ff1681565b6103c7612edb565b6003546106a290600160a01b900460ff1681565b6006546103f0565b6103f0610914366004614d6f565b600a60209081526000928352604080842090915290825290205481565b6103c761093f366004614cf3565b612f58565b6103c7613111565b6103f061095a366004614cf3565b613132565b61047f61096d366004614dff565b6131d6565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156109c257600080fd5b505af11580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fa9190615012565b6001600160a01b0316336001600160a01b031614610a335760405162461bcd60e51b8152600401610a2a9061502f565b60405180910390fd5b6001600160a01b0381166000908152600c602052604090205460ff1615610a825760405162461bcd60e51b815260206004820152600360248201526242546160e81b6044820152606401610a2a565b6001546001600160a01b0382811691161415610ab05760405162461bcd60e51b8152600401610a2a9061504e565b60085460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392610ae692909116906000199060040161506d565b602060405180830381600087803b158015610b0057600080fd5b505af1158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190615086565b506007805460018082019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038481169182179092556000818152600c6020526040808220805460ff19168617905560085490519316927f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d059190a450565b600154604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b158015610c1157600080fd5b505afa158015610c25573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4d91908101906150a3565b604051602001610c5d9190615137565b604051602081830303815290604052905090565b6001600160a01b038083166000818152600a60209081526040808320948616808452948252808320549383526009825280832094835293905291822054610d039190610cfd90670de0b6b3a764000090610cf790610cd890610cd289613132565b906131e6565b6001600160a01b0389166000908152600e60205260409020549061323c565b906132a1565b906132ed565b90505b92915050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190615012565b6001600160a01b0316336001600160a01b031614610dc45760405162461bcd60e51b8152600401610a2a9061502f565b60048054911515600160a01b0260ff60a01b19909216919091179055565b6000610d038284610c71565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e769190615012565b6001600160a01b0316336001600160a01b031614610ea65760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b0382166000908152600560205260409020600201544211610ef65760405162461bcd60e51b815260206004820152600360248201526252506160e81b6044820152606401610a2a565b60008111610f2b5760405162461bcd60e51b81526020600482015260026024820152610c1960f21b6044820152606401610a2a565b6001600160a01b03821660008181526005602052604090819020600101839055517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954590610f7b9084815260200190565b60405180910390a25050565b6001600080828254610f999190615185565b9091555050600080549033905b60065481101561109b57600060068281548110610fc557610fc561519d565b6000918252602090912001546001600160a01b03169050610fe581613132565b6001600160a01b0382166000908152600560208190526040909120015561100b81612039565b6001600160a01b038083166000908152600560205260409020600401919091558316156110885761103c8382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080611093816151b3565b915050610fa6565b50600083116110bc5760405162461bcd60e51b8152600401610a2a906151ce565b600d5483106110f25760405162461bcd60e51b81526020600482015260026024820152610c1d60f21b6044820152606401610a2a565b600d546110ff90846131e6565b600d55336000908152600e602052604090205461111c90846131e6565b336000818152600e6020526040902091909155600154611148916001600160a01b03909116908561333c565b60405183815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35060005481146111d85760405162461bcd60e51b8152600401610a2a906151ea565b5050565b60016000808282546111ee9190615185565b9091555050600054600454600160a01b900460ff16156112385760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610a2a565b8260005b6006548110156113315760006006828154811061125b5761125b61519d565b6000918252602090912001546001600160a01b0316905061127b81613132565b6001600160a01b038216600090815260056020819052604090912001556112a181612039565b6001600160a01b0380831660009081526005602052604090206004019190915583161561131e576112d28382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080611329816151b3565b91505061123c565b50600083116113525760405162461bcd60e51b8152600401610a2a906151ce565b600d5461135f90846132ed565b600d556001600160a01b0384166000908152600e602052604090205461138590846132ed565b6001600160a01b038086166000908152600e60205260409020919091556001546113b29116333086613392565b836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c846040516113ed91815260200190565b60405180910390a26040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35060005481146114585760405162461bcd60e51b8152600401610a2a906151ea565b505050565b6001546040516370a0823160e01b81523360048201526114de9183916001600160a01b03909116906370a082319060240160206040518083038186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105619190615207565b50565b336001600160a01b038316148061150257506003546001600160a01b031633145b6115455760405162461bcd60e51b8152602060048201526014602482015273556e2d617574686f72697a656420636c61696d2160601b6044820152606401610a2a565b6003546040516363453ae160e01b81523060048201526001600160a01b03909116906363453ae190602401600060405180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506111d882826133d0565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116299190615220565b60ff16905090565b60016000808282546116439190615185565b9091555050600080549033905b6006548110156117455760006006828154811061166f5761166f61519d565b6000918252602090912001546001600160a01b0316905061168f81613132565b6001600160a01b038216600090815260056020819052604090912001556116b581612039565b6001600160a01b03808316600090815260056020526040902060040191909155831615611732576116e68382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b508061173d816151b3565b915050611650565b5060005b6006548110156117bd576000600682815481106117685761176861519d565b600091825260208083209091015433808452600a835260408085206001600160a01b039093168086529290935291909220549192506117a8908383613587565b505080806117b5906151b3565b915050611749565b506117c6613769565b50505060005481146114de5760405162461bcd60e51b8152600401610a2a906151ea565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118729190615012565b6001600160a01b0316336001600160a01b0316146118a25760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561192057600080fd5b505af1158015611934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119589190615012565b6001600160a01b0316336001600160a01b0316146119885760405162461bcd60e51b8152600401610a2a9061502f565b620f42408211156119c15760405162461bcd60e51b815260206004820152600360248201526215a9a960e91b6044820152606401610a2a565b601091909155601155565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a549190615012565b6001600160a01b0316336001600160a01b031614611a845760405162461bcd60e51b8152600401610a2a9061502f565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190615012565b6001600160a01b0316336001600160a01b031614611b5e5760405162461bcd60e51b8152600401610a2a9061502f565b60005b81518110156111d857611b8c828281518110611b7f57611b7f61519d565b6020026020010151610972565b80611b96816151b3565b915050611b61565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bee57600080fd5b505af1158015611c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c269190615012565b6001600160a01b0316336001600160a01b031614611c565760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b0381166000908152600c602052604090205460ff161515600114611ca95760405162461bcd60e51b815260206004820152600360248201526242546960e81b6044820152606401610a2a565b60085460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392611cde929091169060009060040161506d565b602060405180830381600087803b158015611cf857600080fd5b505af1158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d309190615086565b5060078054906001600160a01b03831690611d4c600184615243565b81548110611d5c57611d5c61519d565b6000918252602090912001546001600160a01b03161415611dcf576007805480611d8857611d8861525a565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0384168252600c905260409020805460ff19169055611eff565b60005b600754611de190600190615243565b811015611efd57826001600160a01b031660078281548110611e0557611e0561519d565b6000918252602090912001546001600160a01b03161415611eeb576007611e2d600184615243565b81548110611e3d57611e3d61519d565b600091825260209091200154600780546001600160a01b039092169183908110611e6957611e6961519d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506007805480611ea857611ea861525a565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0385168252600c905260409020805460ff191690555b80611ef5816151b3565b915050611dd2565b505b6008546040516000916001600160a01b0390811691908516907f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d05908490a45050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611f9157600080fd5b505af1158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190615012565b6001600160a01b0316336001600160a01b031614611ff95760405162461bcd60e51b8152600401610a2a9061502f565b60005b81518110156111d85761202782828151811061201a5761201a61519d565b6020026020010151611b9e565b80612031816151b3565b915050611ffc565b6001600160a01b038116600090815260056020526040812060020154610d06904290614b6f565b6006818154811061207057600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600e60205260409020546120a390610f87565b565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156120f557600080fd5b505af1158015612109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212d9190615012565b6001600160a01b0316336001600160a01b03161461215d5760405162461bcd60e51b8152600401610a2a9061502f565b6001546001600160a01b038381169116141561221f57600d546001546040516370a0823160e01b81523060048201526000926121fb9290916001600160a01b03909116906370a08231906024015b60206040518083038186803b1580156121c357600080fd5b505afa1580156121d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190615207565b90508084111561221d5760405162461bcd60e51b8152600401610a2a9061504e565b505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb9061224d908490879060040161506d565b602060405180830381600087803b15801561226757600080fd5b505af115801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615086565b50816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28846040516122db91815260200190565b60405180910390a2505050565b600154604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561232d57600080fd5b505afa158015612341573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261236991908101906150a3565b604051602001610c5d9190615270565b6001600160a01b03811660009081526005602052604081206002015442106123a357506000919050565b6001600160a01b0382166000908152600560205260408120600201546123c990426131e6565b6001600160a01b0384166000908152600560205260409020600301549091506123f390829061323c565b9392505050565b600160008082825461240c9190615185565b90915550506000805490805b60065481101561250d576000600682815481106124375761243761519d565b6000918252602090912001546001600160a01b0316905061245781613132565b6001600160a01b0382166000908152600560208190526040909120015561247d81612039565b6001600160a01b038083166000908152600560205260409020600401919091558316156124fa576124ae8382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080612505816151b3565b915050612418565b506001546001600160a01b038581169116141561253c5760405162461bcd60e51b8152600401610a2a9061504e565b6001600160a01b0384166000908152600b602052604090205460ff166125955760405162461bcd60e51b815260206004820152600e60248201526d4e6f74206120726577617264212160901b6044820152606401610a2a565b6000600d54116125d55760405162461bcd60e51b815260206004820152600b60248201526a4e6f204661726d6572732160a81b6044820152606401610a2a565b6125dd613769565b50506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b15801561262157600080fd5b505afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126599190615207565b90506126706001600160a01b038616333087613392565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b1580156126b257600080fd5b505afa1580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea9190615207565b90506126f68282615243565b94506000851161272d5760405162461bcd60e51b8152602060048201526002602482015261183960f11b6044820152606401610a2a565b6001600160a01b0386166000908152600560205260409020600201544210612797576001600160a01b0386166000908152600560205260409020600101546127769086906132a1565b6001600160a01b038716600090815260056020526040902060030155612977565b6001600160a01b038616600090815260056020526040812060038101546002909101549091906127c790426131e6565b6001600160a01b038916600090815260056020526040812060030154919250906127f290839061323c565b6001600160a01b038a1660009081526005602052604090206001015490915061281f90610cf78a846132ed565b6001600160a01b038a811660009081526005602052604090206003908101929092559054163314158061286c57506001600160a01b03898116600090815260056020526040902054163314155b806129105750600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156128c257600080fd5b505af11580156128d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fa9190615012565b6001600160a01b0316336001600160a01b031614155b15612973576001600160a01b0389166000908152600560205260409020600301548311158061293e57508088115b6129735760405162461bcd60e51b8152600401610a2a906020808252600490820152634547504560e01b604082015260600190565b5050505b6001600160a01b038616600090815260056020526040902042600482018190556001909101546129a791906132ed565b6001600160a01b038716600081815260056020908152604091829020600201939093555187815233927f0f7cde3c0518e1cc590491be5861d70a2e333f7e65af2e1ebd91a3c9a3cc638d910160405180910390a36001600160a01b03861660009081526013602052604081208054879290612a23908490615185565b9250508190555050505060005481146114585760405162461bcd60e51b8152600401610a2a906151ea565b6001600080828254612a609190615185565b9091555050600054600454600160a01b900460ff1615612aaa5760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610a2a565b3360005b600654811015612ba357600060068281548110612acd57612acd61519d565b6000918252602090912001546001600160a01b03169050612aed81613132565b6001600160a01b03821660009081526005602081905260409091200155612b1381612039565b6001600160a01b03808316600090815260056020526040902060040191909155831615612b9057612b448382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080612b9b816151b3565b915050612aae565b5060008311612bc45760405162461bcd60e51b8152600401610a2a906151ce565b600d54612bd190846132ed565b600d55336000908152600e6020526040902054612bee90846132ed565b336000818152600e6020526040902091909155600154612c1b916001600160a01b03909116903086613392565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a260405183815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016111ae565b6001600160a01b03811660009081526005602052604081206001810154600390910154610d069161323c565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0157600080fd5b505af1158015612d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d399190615012565b6001600160a01b0316336001600160a01b031614612d695760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b0383166000908152600b602052604090205460ff16158015612dab57506001600160a01b038316600090815260056020526040902060010154155b612ddc5760405162461bcd60e51b8152602060048201526002602482015261414960f01b6044820152606401610a2a565b6001546001600160a01b0384811691161415612e0a5760405162461bcd60e51b8152600401610a2a9061504e565b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039586166001600160a01b031991821681179092556000918252600b60209081526040808420805460ff19168617905560059091529091208054949095169316929092178355910155565b6000806001600080828254612ea19190615185565b9091555050600054612eb1613769565b925092506000548114612ed65760405162461bcd60e51b8152600401610a2a906151ea565b509091565b6001546040516370a0823160e01b81523360048201526120a3916001600160a01b0316906370a082319060240160206040518083038186803b158015612f2057600080fd5b505afa158015612f34573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084b9190615207565b6003546001600160a01b03163314612f9a5760405162461bcd60e51b815260206004820152600560248201526457686f205560d81b6044820152606401610a2a565b6008546001600160a01b031660005b6007548110156130ed57600060078281548110612fc857612fc861519d565b600091825260208220015460405163095ea7b360e01b81526001600160a01b039091169250829163095ea7b39161300391879160040161506d565b602060405180830381600087803b15801561301d57600080fd5b505af1158015613031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130559190615086565b5060405163095ea7b360e01b81526001600160a01b0382169063095ea7b3906130869087906000199060040161506d565b602060405180830381600087803b1580156130a057600080fd5b505af11580156130b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d89190615086565b505080806130e5906151b3565b915050612fa9565b5050600880546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600e602052604090205461312a90610f87565b6120a3611631565b6000600d546000141561315f57506001600160a01b03166000908152600560208190526040909120015490565b600d546001600160a01b03831660009081526005602052604090206003810154600490910154610d06926131b3929091610cf791670de0b6b3a7640000916131ad91908290610cd28b612039565b9061323c565b6001600160a01b03841660009081526005602081905260409091200154906132ed565b6007818154811061207057600080fd5b6000828211156132285760405162461bcd60e51b815260206004820152600d60248201526c29b0b332a6b0ba341d1016a7a360991b6044820152606401610a2a565b60006132348385615243565b949350505050565b60008261324b57506000610d06565b6000613257838561529b565b90508261326485836152ba565b14610d035760405162461bcd60e51b815260206004820152600d60248201526c29b0b332a6b0ba341d101527a360991b6044820152606401610a2a565b60008082116132e15760405162461bcd60e51b815260206004820152600c60248201526b0536166654d6174683a202f360a41b6044820152606401610a2a565b600061323483856152ba565b6000806132fa8385615185565b905083811015610d035760405162461bcd60e51b815260206004820152600d60248201526c29b0b332a6b0ba341d1015a7a360991b6044820152606401610a2a565b6114588363a9059cbb60e01b848460405160240161335b92919061506d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614b85565b6040516001600160a01b03808516602483015283166044820152606481018290526133ca9085906323b872dd60e01b9060840161335b565b50505050565b60016000808282546133e29190615185565b9091555050600080549083905b6006548110156134e45760006006828154811061340e5761340e61519d565b6000918252602090912001546001600160a01b0316905061342e81613132565b6001600160a01b0382166000908152600560208190526040909120015561345481612039565b6001600160a01b038083166000908152600560205260409020600401919091558316156134d1576134858382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b50806134dc816151b3565b9150506133ef565b5060005b835181101561355a5760008482815181106135055761350561519d565b6020908102919091018101516001600160a01b038089166000908152600a8452604080822092841682529190935290912054909150613545878383613587565b50508080613552906151b3565b9150506134e8565b50613563613769565b50505060005481146114585760405162461bcd60e51b8152600401610a2a906151ea565b8015611458576001600160a01b038084166000908152600a602090815260408083208685168085529252822091909155600454909116141561369a5760105480156136945760006135df620f4240610cf7858561323c565b60025460115460405163d4e54c3b60e01b81526004810184905260248101919091526001600160a01b03888116604483015292935091169063d4e54c3b90606401602060405180830381600087803b15801561363a57600080fd5b505af115801561364e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136729190615207565b506136928561368185846131e6565b6001600160a01b038716919061333c565b505b506136ae565b6136ae6001600160a01b038316848361333c565b826001600160a01b0316826001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc9836040516136f391815260200190565b60405180910390a36001600160a01b03821660009081526012602052604081208054839290613723908490615185565b90915550506001600160a01b0380841660009081526014602090815260408083209386168352929052908120805483929061375f908490615185565b9091555050505050565b6000806000600360009054906101000a90046001600160a01b03166001600160a01b0316633f6678256040518163ffffffff1660e01b815260040160206040518083038186803b1580156137bc57600080fd5b505afa1580156137d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f49190615207565b9050600080821161380657600061388c565b600360009054906101000a90046001600160a01b03166001600160a01b03166313416d996040518163ffffffff1660e01b815260040160206040518083038186803b15801561385457600080fd5b505afa158015613868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388c9190615012565b600354909150600160a01b900460ff1661424a5760075460008167ffffffffffffffff8111156138be576138be614e18565b6040519080825280602002602001820160405280156138e7578160200160208202803683370190505b50905060008267ffffffffffffffff81111561390557613905614e18565b60405190808252806020026020018201604052801561392e578160200160208202803683370190505b50905060005b83811015613a9e576007818154811061394f5761394f61519d565b9060005260206000200160009054906101000a90046001600160a01b031683828151811061397f5761397f61519d565b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b03168382815181106139bc576139bc61519d565b60200260200101516001600160a01b031614613a6c578281815181106139e4576139e461519d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613a2f57600080fd5b505afa158015613a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a679190615207565b613a6f565b60005b828281518110613a8157613a8161519d565b602090810291909101015280613a96816151b3565b915050613934565b506001546040805163d294f09360e01b815281516001600160a01b039093169263d294f093926004808401939192918290030181600087803b158015613ae357600080fd5b505af1925050508015613b13575060408051601f3d908101601f19168201909252613b10918101906152dc565b60015b613b265750600096879650945050505050565b505060005b8381101561423a576000806001600160a01b0316848381518110613b5157613b5161519d565b60200260200101516001600160a01b031614613c0157838281518110613b7957613b7961519d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613bc457600080fd5b505afa158015613bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bfc9190615207565b613c04565b60005b9050828281518110613c1857613c1861519d565b6020026020010151811115614227576000620f424088858581518110613c4057613c4061519d565b602002602001015184613c539190615243565b613c5d919061529b565b613c6791906152ba565b1115613e9157838281518110613c7f57613c7f61519d565b60200260200101516001600160a01b031663a9059cbb87620f42408a613cc7888881518110613cb057613cb061519d565b6020026020010151876131e690919063ffffffff16565b613cd1919061529b565b613cdb91906152ba565b6040518363ffffffff1660e01b8152600401613cf892919061506d565b602060405180830381600087803b158015613d1257600080fd5b505af1158015613d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4a9190615086565b50838281518110613d5d57613d5d61519d565b60200260200101516001600160a01b0316866001600160a01b0316336001600160a01b03167f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42408b613dd4898981518110613dbd57613dbd61519d565b6020026020010151886131e690919063ffffffff16565b613dde919061529b565b613de891906152ba565b60405190815260200160405180910390a4838281518110613e0b57613e0b61519d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613e5657600080fd5b505afa158015613e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8e9190615207565b90505b600f546001600160a01b031661405b5760085484516001600160a01b039091169063b66503cf90869085908110613eca57613eca61519d565b6020026020010151613efe868681518110613ee757613ee761519d565b6020026020010151856131e690919063ffffffff16565b6040518363ffffffff1660e01b8152600401613f1b92919061506d565b600060405180830381600087803b158015613f3557600080fd5b505af1158015613f49573d6000803e3d6000fd5b50505050838281518110613f5f57613f5f61519d565b60200260200101516001600160a01b0316600860009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b031660008051602061534c833981519152868681518110613fba57613fba61519d565b602002602001015185613fcd9190615243565b60405190815260200160405180910390a4828281518110613ff057613ff061519d565b6020026020010151816140039190615243565b601560008685815181106140195761401961519d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546140509190615185565b909155506142279050565b83828151811061406d5761406d61519d565b60200260200101516001600160a01b031663a9059cbb600f60009054906101000a90046001600160a01b03166140ae868681518110613ee757613ee761519d565b6040518363ffffffff1660e01b81526004016140cb92919061506d565b602060405180830381600087803b1580156140e557600080fd5b505af11580156140f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411d9190615086565b508382815181106141305761413061519d565b60200260200101516001600160a01b0316600f60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b031660008051602061534c83398151915286868151811061418b5761418b61519d565b60200260200101518561419e9190615243565b60405190815260200160405180910390a48282815181106141c1576141c161519d565b6020026020010151816141d49190615243565b601560008685815181106141ea576141ea61519d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142219190615185565b90915550505b5080614232816151b3565b915050613b2b565b5060009788975095505050505050565b60015460408051634eb1c24560e11b8152815160009384936001600160a01b0390911692639d63848a926004808301939282900301818787803b15801561429057600080fd5b505af11580156142a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142c89190615300565b6040516370a0823160e01b815230600482015291935091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561430f57600080fd5b505afa158015614323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143479190615207565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561438c57600080fd5b505afa1580156143a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c49190615207565b6001546040805163d294f09360e01b815281519394506001600160a01b039092169263d294f0939260048082019392918290030181600087803b15801561440a57600080fd5b505af192505050801561443a575060408051601f3d908101601f19168201909252614437918101906152dc565b60015b61444e575060009788975095505050505050565b50506040516370a0823160e01b815230600482015282906001600160a01b038616906370a082319060240160206040518083038186803b15801561449157600080fd5b505afa1580156144a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c99190615207565b6144d39190615243565b6040516370a0823160e01b815230600482015290985081906001600160a01b038516906370a082319060240160206040518083038186803b15801561451757600080fd5b505afa15801561452b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454f9190615207565b6145599190615243565b96506000620f424061456b888b61529b565b61457591906152ba565b11156146a1576001600160a01b03841663a9059cbb86620f42406145998a8d61529b565b6145a391906152ba565b6040518363ffffffff1660e01b81526004016145c092919061506d565b602060405180830381600087803b1580156145da57600080fd5b505af11580156145ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146129190615086565b506001600160a01b03808616908516337f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42406146518b8e61529b565b61465b91906152ba565b60405190815260200160405180910390a46040516370a0823160e01b815230600482015261469e9083906001600160a01b038716906370a08231906024016121ab565b97505b6000620f42406146b1888a61529b565b6146bb91906152ba565b11156147e7576001600160a01b03831663a9059cbb86620f42406146df8a8c61529b565b6146e991906152ba565b6040518363ffffffff1660e01b815260040161470692919061506d565b602060405180830381600087803b15801561472057600080fd5b505af1158015614734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147589190615086565b506001600160a01b03808616908416337f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42406147978b8d61529b565b6147a191906152ba565b60405190815260200160405180910390a46040516370a0823160e01b81523060048201526147e49082906001600160a01b038616906370a08231906024016121ab565b96505b600f546001600160a01b03166149945787156148c35760085460405163b66503cf60e01b81526001600160a01b039091169063b66503cf9061482f9087908c9060040161506d565b600060405180830381600087803b15801561484957600080fd5b505af115801561485d573d6000803e3d6000fd5b505050506001600160a01b038416600090815260156020526040812080548a9290614889908490615185565b90915550506008546040518981526001600160a01b03868116921690339060008051602061534c8339815191529060200160405180910390a45b861561498f5760085460405163b66503cf60e01b81526001600160a01b039091169063b66503cf906148fb9086908b9060040161506d565b600060405180830381600087803b15801561491557600080fd5b505af1158015614929573d6000803e3d6000fd5b505050506001600160a01b03831660009081526015602052604081208054899290614955908490615185565b90915550506008546040518881526001600160a01b03858116921690339060008051602061534c8339815191529060200160405180910390a45b614b65565b600f5460405163a9059cbb60e01b81526001600160a01b038681169263a9059cbb926149c892909116908c9060040161506d565b602060405180830381600087803b1580156149e257600080fd5b505af11580156149f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a1a9190615086565b50600f5460405163a9059cbb60e01b81526001600160a01b038581169263a9059cbb92614a4f92909116908b9060040161506d565b602060405180830381600087803b158015614a6957600080fd5b505af1158015614a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614aa19190615086565b50600f546040518981526001600160a01b03868116921690339060008051602061534c8339815191529060200160405180910390a4600f546040518881526001600160a01b03858116921690339060008051602061534c8339815191529060200160405180910390a46001600160a01b038416600090815260156020526040812080548a9290614b32908490615185565b90915550506001600160a01b03831660009081526015602052604081208054899290614b5f908490615185565b90915550505b5050505050509091565b6000818310614b7e5781610d03565b5090919050565b6001600160a01b0382163b614bdc5760405162461bcd60e51b815260206004820152601760248201527f5361666545524332303a206e6f6e2d636f6e74726163740000000000000000006044820152606401610a2a565b600080836001600160a01b031683604051614bf7919061532f565b6000604051808303816000865af19150503d8060008114614c34576040519150601f19603f3d011682016040523d82523d6000602084013e614c39565b606091505b509150915081614c815760405162461bcd60e51b815260206004820152601360248201527214d85999515490cc8c0e88131310c819985a5b606a1b6044820152606401610a2a565b8051156133ca5780806020019051810190614c9c9190615086565b6133ca5760405162461bcd60e51b81526020600482015260136024820152725361666545524332303a20217375636365737360681b6044820152606401610a2a565b6001600160a01b03811681146114de57600080fd5b600060208284031215614d0557600080fd5b8135610d0381614cde565b60005b83811015614d2b578181015183820152602001614d13565b838111156133ca5750506000910152565b6020815260008251806020840152614d5b816040850160208701614d10565b601f01601f19169190910160400192915050565b60008060408385031215614d8257600080fd5b8235614d8d81614cde565b91506020830135614d9d81614cde565b809150509250929050565b80151581146114de57600080fd5b600060208284031215614dc857600080fd5b8135610d0381614da8565b60008060408385031215614de657600080fd5b8235614df181614cde565b946020939093013593505050565b600060208284031215614e1157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5757614e57614e18565b604052919050565b600082601f830112614e7057600080fd5b8135602067ffffffffffffffff821115614e8c57614e8c614e18565b8160051b614e9b828201614e2e565b9283528481018201928281019087851115614eb557600080fd5b83870192505b84831015614edd578235614ece81614cde565b82529183019190830190614ebb565b979650505050505050565b60008060408385031215614efb57600080fd5b8235614f0681614cde565b9150602083013567ffffffffffffffff811115614f2257600080fd5b614f2e85828601614e5f565b9150509250929050565b60008060408385031215614f4b57600080fd5b50508035926020909101359150565b600060208284031215614f6c57600080fd5b813567ffffffffffffffff811115614f8357600080fd5b61323484828501614e5f565b600080600060608486031215614fa457600080fd5b833592506020840135614fb681614cde565b91506040840135614fc681614cde565b809150509250925092565b600080600060608486031215614fe657600080fd5b8335614ff181614cde565b9250602084013561500181614cde565b929592945050506040919091013590565b60006020828403121561502457600080fd5b8151610d0381614cde565b602080825260059082015264215445414d60d81b604082015260600190565b602080825260059082015264212173746b60d81b604082015260600190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561509857600080fd5b8151610d0381614da8565b6000602082840312156150b557600080fd5b815167ffffffffffffffff808211156150cd57600080fd5b818401915084601f8301126150e157600080fd5b8151818111156150f3576150f3614e18565b615106601f8201601f1916602001614e2e565b915080825285602082850101111561511d57600080fd5b61512e816020840160208601614d10565b50949350505050565b6f029b1b0b6329023b0bab3b2903337b9160851b815260008251615162816010850160208701614d10565b9190910160100192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156151985761519861516f565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156151c7576151c761516f565b5060010190565b602080825260029082015261306160f01b604082015260600190565b60208082526003908201526252472160e81b604082015260600190565b60006020828403121561521957600080fd5b5051919050565b60006020828403121561523257600080fd5b815160ff81168114610d0357600080fd5b6000828210156152555761525561516f565b500390565b634e487b7160e01b600052603160045260246000fd5b6229a39d60e91b81526000825161528e816003850160208701614d10565b9190910160030192915050565b60008160001904831182151516156152b5576152b561516f565b500290565b6000826152d757634e487b7160e01b600052601260045260246000fd5b500490565b600080604083850312156152ef57600080fd5b505080516020909101519092909150565b6000806040838503121561531357600080fd5b825161531e81614cde565b6020840151909250614d9d81614cde565b60008251615341818460208701614d10565b919091019291505056feee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a558a264697066735822122027e16db70021782cf8493b168033bc999b4e2d303e5694723810d2afb42e408864736f6c634300080900336f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d050000000000000000000000007df07f9dbd05df3eaee293e4f3c21171e1461f7400000000000000000000000018f0df926fa5d6fe30e862ca6b75b109d6ff64080000000000000000000000003045119766352ff250b3d45312bd0973cbf7235a00000000000000000000000017fa9da6e01ad59513707f92033a6eb03ccb10b4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ddf26b42c1d903de8962d3f79a74a501420d5f19

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103af5760003560e01c80635a6e6eab116101f457806399bcc0521161011a578063de5f6268116100ad578063e81defce1161007c578063e81defce14610931578063e9fad8ee14610944578063f12297771461094c578063f5ae22401461095f57600080fd5b8063de5f6268146108e2578063e5748213146108ea578063e6886396146108fe578063e70b9e271461090657600080fd5b8063d0ed26ae116100e9578063d0ed26ae14610863578063d294f09314610876578063da09d19d14610893578063dd501205146108bf57600080fd5b806399bcc05214610817578063b66503cf1461082a578063b6b55f251461083d578063bcd110141461085057600080fd5b8063749f1044116101925780638a501100116101615780638a501100146107e35780638dd598fb146107f65780638f27f1041461080757806395d89b411461080f57600080fd5b8063749f1044146107a257806376ad03bc146107b55780637bb7bed1146107c8578063853828b6146107db57600080fd5b8063638634ee116101ce578063638634ee1461071b57806365bcfbe71461072e5780637035ab981461074e57806370a082311461077957600080fd5b80635a6e6eab146106eb5780635c59f3bb146106fe5780635c975abb1461070757600080fd5b80632f4f21e2116102d95780633f695b45116102775780634d5ce038116102465780634d5ce0381461067f5780634ec5908d146106b257806352f18405146106c55780635557cc61146106d857600080fd5b80633f695b45146105c257806345797e67146105d557806346c96aac146105e857806348e5d9f8146105fb57600080fd5b8063313ce567116102b3578063313ce5671461058c57806337d0208c146105945780633a4b66f1146105a75780633d18b912146105ba57600080fd5b80632f4f21e2146105535780633010d8ef1461056657806331279d3d1461057957600080fd5b806318160ddd116103515780632378bea6116103205780632378bea6146104d65780632af2cecc146104e95780632ce9aead146105145780632e1a7d4d1461054057600080fd5b806318160ddd146104645780631f8507161461046c578063211dc32d14610497578063221ca18c146104aa57600080fd5b80630efeb2fb1161038d5780630efeb2fb146103fe578063102a7ad41461041e57806315ae92f71461043157806316c38b3c1461045157600080fd5b8063023df767146103b457806306fdde03146103c95780630a91a2c4146103e7575b600080fd5b6103c76103c2366004614cf3565b610972565b005b6103d1610bcc565b6040516103de9190614d3c565b60405180910390f35b6103f060115481565b6040519081526020016103de565b6103f061040c366004614cf3565b60136020526000908152604090205481565b6103f061042c366004614d6f565b610c71565b6103f061043f366004614cf3565b60156020526000908152604090205481565b6103c761045f366004614db6565b610d0c565b600d546103f0565b60025461047f906001600160a01b031681565b6040516001600160a01b0390911681526020016103de565b6103f06104a5366004614d6f565b610de2565b6103f06104b8366004614cf3565b6001600160a01b031660009081526005602052604090206003015490565b6103c76104e4366004614dd3565b610dee565b6103f06104f7366004614d6f565b601460209081526000928352604080842090915290825290205481565b6103f0610522366004614cf3565b6001600160a01b031660009081526005602052604090206004015490565b6103c761054e366004614dff565b610f87565b6103c7610561366004614dd3565b6111dc565b6103c7610574366004614cf3565b61145d565b6103c7610587366004614ee8565b6114e1565b6103f06115ac565b60085461047f906001600160a01b031681565b60015461047f906001600160a01b031681565b6103c7611631565b6103c76105d0366004614d6f565b6117ea565b6103c76105e3366004614f38565b6118d0565b60035461047f906001600160a01b031681565b610648610609366004614cf3565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501546001600160a01b03909316949193909286565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016103de565b6106a261068d366004614cf3565b600b6020526000908152604090205460ff1681565b60405190151581526020016103de565b6103c76106c0366004614cf3565b6119cc565b6103c76106d3366004614f5a565b611aa6565b6103c76106e6366004614cf3565b611b9e565b6103c76106f9366004614f5a565b611f41565b6103f060105481565b6004546106a290600160a01b900460ff1681565b6103f0610729366004614cf3565b612039565b6103f061073c366004614cf3565b60126020526000908152604090205481565b6103f061075c366004614d6f565b600960209081526000928352604080842090915290825290205481565b6103f0610787366004614cf3565b6001600160a01b03166000908152600e602052604090205490565b600f5461047f906001600160a01b031681565b60045461047f906001600160a01b031681565b61047f6107d6366004614dff565b612060565b6103c761208a565b6103c76107f1366004614f8f565b6120a5565b6002546001600160a01b031661047f565b6007546103f0565b6103d16122e8565b6103f0610825366004614cf3565b612379565b6103c7610838366004614dd3565b6123fa565b6103c761084b366004614dff565b612a4e565b6103f061085e366004614cf3565b612c85565b6103c7610871366004614fd1565b612cb1565b61087e612e8c565b604080519283526020830191909152016103de565b6103f06108a1366004614cf3565b6001600160a01b031660009081526005602052604090206002015490565b6106a26108cd366004614cf3565b600c6020526000908152604090205460ff1681565b6103c7612edb565b6003546106a290600160a01b900460ff1681565b6006546103f0565b6103f0610914366004614d6f565b600a60209081526000928352604080842090915290825290205481565b6103c761093f366004614cf3565b612f58565b6103c7613111565b6103f061095a366004614cf3565b613132565b61047f61096d366004614dff565b6131d6565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156109c257600080fd5b505af11580156109d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fa9190615012565b6001600160a01b0316336001600160a01b031614610a335760405162461bcd60e51b8152600401610a2a9061502f565b60405180910390fd5b6001600160a01b0381166000908152600c602052604090205460ff1615610a825760405162461bcd60e51b815260206004820152600360248201526242546160e81b6044820152606401610a2a565b6001546001600160a01b0382811691161415610ab05760405162461bcd60e51b8152600401610a2a9061504e565b60085460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392610ae692909116906000199060040161506d565b602060405180830381600087803b158015610b0057600080fd5b505af1158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190615086565b506007805460018082019092557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b038481169182179092556000818152600c6020526040808220805460ff19168617905560085490519316927f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d059190a450565b600154604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b158015610c1157600080fd5b505afa158015610c25573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4d91908101906150a3565b604051602001610c5d9190615137565b604051602081830303815290604052905090565b6001600160a01b038083166000818152600a60209081526040808320948616808452948252808320549383526009825280832094835293905291822054610d039190610cfd90670de0b6b3a764000090610cf790610cd890610cd289613132565b906131e6565b6001600160a01b0389166000908152600e60205260409020549061323c565b906132a1565b906132ed565b90505b92915050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190615012565b6001600160a01b0316336001600160a01b031614610dc45760405162461bcd60e51b8152600401610a2a9061502f565b60048054911515600160a01b0260ff60a01b19909216919091179055565b6000610d038284610c71565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e769190615012565b6001600160a01b0316336001600160a01b031614610ea65760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b0382166000908152600560205260409020600201544211610ef65760405162461bcd60e51b815260206004820152600360248201526252506160e81b6044820152606401610a2a565b60008111610f2b5760405162461bcd60e51b81526020600482015260026024820152610c1960f21b6044820152606401610a2a565b6001600160a01b03821660008181526005602052604090819020600101839055517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954590610f7b9084815260200190565b60405180910390a25050565b6001600080828254610f999190615185565b9091555050600080549033905b60065481101561109b57600060068281548110610fc557610fc561519d565b6000918252602090912001546001600160a01b03169050610fe581613132565b6001600160a01b0382166000908152600560208190526040909120015561100b81612039565b6001600160a01b038083166000908152600560205260409020600401919091558316156110885761103c8382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080611093816151b3565b915050610fa6565b50600083116110bc5760405162461bcd60e51b8152600401610a2a906151ce565b600d5483106110f25760405162461bcd60e51b81526020600482015260026024820152610c1d60f21b6044820152606401610a2a565b600d546110ff90846131e6565b600d55336000908152600e602052604090205461111c90846131e6565b336000818152600e6020526040902091909155600154611148916001600160a01b03909116908561333c565b60405183815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35060005481146111d85760405162461bcd60e51b8152600401610a2a906151ea565b5050565b60016000808282546111ee9190615185565b9091555050600054600454600160a01b900460ff16156112385760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610a2a565b8260005b6006548110156113315760006006828154811061125b5761125b61519d565b6000918252602090912001546001600160a01b0316905061127b81613132565b6001600160a01b038216600090815260056020819052604090912001556112a181612039565b6001600160a01b0380831660009081526005602052604090206004019190915583161561131e576112d28382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080611329816151b3565b91505061123c565b50600083116113525760405162461bcd60e51b8152600401610a2a906151ce565b600d5461135f90846132ed565b600d556001600160a01b0384166000908152600e602052604090205461138590846132ed565b6001600160a01b038086166000908152600e60205260409020919091556001546113b29116333086613392565b836001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c846040516113ed91815260200190565b60405180910390a26040518381526001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35060005481146114585760405162461bcd60e51b8152600401610a2a906151ea565b505050565b6001546040516370a0823160e01b81523360048201526114de9183916001600160a01b03909116906370a082319060240160206040518083038186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105619190615207565b50565b336001600160a01b038316148061150257506003546001600160a01b031633145b6115455760405162461bcd60e51b8152602060048201526014602482015273556e2d617574686f72697a656420636c61696d2160601b6044820152606401610a2a565b6003546040516363453ae160e01b81523060048201526001600160a01b03909116906363453ae190602401600060405180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506111d882826133d0565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116299190615220565b60ff16905090565b60016000808282546116439190615185565b9091555050600080549033905b6006548110156117455760006006828154811061166f5761166f61519d565b6000918252602090912001546001600160a01b0316905061168f81613132565b6001600160a01b038216600090815260056020819052604090912001556116b581612039565b6001600160a01b03808316600090815260056020526040902060040191909155831615611732576116e68382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b508061173d816151b3565b915050611650565b5060005b6006548110156117bd576000600682815481106117685761176861519d565b600091825260208083209091015433808452600a835260408085206001600160a01b039093168086529290935291909220549192506117a8908383613587565b505080806117b5906151b3565b915050611749565b506117c6613769565b50505060005481146114de5760405162461bcd60e51b8152600401610a2a906151ea565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118729190615012565b6001600160a01b0316336001600160a01b0316146118a25760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561192057600080fd5b505af1158015611934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119589190615012565b6001600160a01b0316336001600160a01b0316146119885760405162461bcd60e51b8152600401610a2a9061502f565b620f42408211156119c15760405162461bcd60e51b815260206004820152600360248201526215a9a960e91b6044820152606401610a2a565b601091909155601155565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a549190615012565b6001600160a01b0316336001600160a01b031614611a845760405162461bcd60e51b8152600401610a2a9061502f565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611af657600080fd5b505af1158015611b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2e9190615012565b6001600160a01b0316336001600160a01b031614611b5e5760405162461bcd60e51b8152600401610a2a9061502f565b60005b81518110156111d857611b8c828281518110611b7f57611b7f61519d565b6020026020010151610972565b80611b96816151b3565b915050611b61565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bee57600080fd5b505af1158015611c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c269190615012565b6001600160a01b0316336001600160a01b031614611c565760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b0381166000908152600c602052604090205460ff161515600114611ca95760405162461bcd60e51b815260206004820152600360248201526242546960e81b6044820152606401610a2a565b60085460405163095ea7b360e01b81526001600160a01b038381169263095ea7b392611cde929091169060009060040161506d565b602060405180830381600087803b158015611cf857600080fd5b505af1158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d309190615086565b5060078054906001600160a01b03831690611d4c600184615243565b81548110611d5c57611d5c61519d565b6000918252602090912001546001600160a01b03161415611dcf576007805480611d8857611d8861525a565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0384168252600c905260409020805460ff19169055611eff565b60005b600754611de190600190615243565b811015611efd57826001600160a01b031660078281548110611e0557611e0561519d565b6000918252602090912001546001600160a01b03161415611eeb576007611e2d600184615243565b81548110611e3d57611e3d61519d565b600091825260209091200154600780546001600160a01b039092169183908110611e6957611e6961519d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506007805480611ea857611ea861525a565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0385168252600c905260409020805460ff191690555b80611ef5816151b3565b915050611dd2565b505b6008546040516000916001600160a01b0390811691908516907f6f3d0c80b7142a8d817dfedfe293680f67ba78aacbbc59db82973fd195982d05908490a45050565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611f9157600080fd5b505af1158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190615012565b6001600160a01b0316336001600160a01b031614611ff95760405162461bcd60e51b8152600401610a2a9061502f565b60005b81518110156111d85761202782828151811061201a5761201a61519d565b6020026020010151611b9e565b80612031816151b3565b915050611ffc565b6001600160a01b038116600090815260056020526040812060020154610d06904290614b6f565b6006818154811061207057600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600e60205260409020546120a390610f87565b565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156120f557600080fd5b505af1158015612109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212d9190615012565b6001600160a01b0316336001600160a01b03161461215d5760405162461bcd60e51b8152600401610a2a9061502f565b6001546001600160a01b038381169116141561221f57600d546001546040516370a0823160e01b81523060048201526000926121fb9290916001600160a01b03909116906370a08231906024015b60206040518083038186803b1580156121c357600080fd5b505afa1580156121d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190615207565b90508084111561221d5760405162461bcd60e51b8152600401610a2a9061504e565b505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb9061224d908490879060040161506d565b602060405180830381600087803b15801561226757600080fd5b505af115801561227b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229f9190615086565b50816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28846040516122db91815260200190565b60405180910390a2505050565b600154604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561232d57600080fd5b505afa158015612341573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261236991908101906150a3565b604051602001610c5d9190615270565b6001600160a01b03811660009081526005602052604081206002015442106123a357506000919050565b6001600160a01b0382166000908152600560205260408120600201546123c990426131e6565b6001600160a01b0384166000908152600560205260409020600301549091506123f390829061323c565b9392505050565b600160008082825461240c9190615185565b90915550506000805490805b60065481101561250d576000600682815481106124375761243761519d565b6000918252602090912001546001600160a01b0316905061245781613132565b6001600160a01b0382166000908152600560208190526040909120015561247d81612039565b6001600160a01b038083166000908152600560205260409020600401919091558316156124fa576124ae8382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080612505816151b3565b915050612418565b506001546001600160a01b038581169116141561253c5760405162461bcd60e51b8152600401610a2a9061504e565b6001600160a01b0384166000908152600b602052604090205460ff166125955760405162461bcd60e51b815260206004820152600e60248201526d4e6f74206120726577617264212160901b6044820152606401610a2a565b6000600d54116125d55760405162461bcd60e51b815260206004820152600b60248201526a4e6f204661726d6572732160a81b6044820152606401610a2a565b6125dd613769565b50506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b15801561262157600080fd5b505afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126599190615207565b90506126706001600160a01b038616333087613392565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b1580156126b257600080fd5b505afa1580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea9190615207565b90506126f68282615243565b94506000851161272d5760405162461bcd60e51b8152602060048201526002602482015261183960f11b6044820152606401610a2a565b6001600160a01b0386166000908152600560205260409020600201544210612797576001600160a01b0386166000908152600560205260409020600101546127769086906132a1565b6001600160a01b038716600090815260056020526040902060030155612977565b6001600160a01b038616600090815260056020526040812060038101546002909101549091906127c790426131e6565b6001600160a01b038916600090815260056020526040812060030154919250906127f290839061323c565b6001600160a01b038a1660009081526005602052604090206001015490915061281f90610cf78a846132ed565b6001600160a01b038a811660009081526005602052604090206003908101929092559054163314158061286c57506001600160a01b03898116600090815260056020526040902054163314155b806129105750600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156128c257600080fd5b505af11580156128d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fa9190615012565b6001600160a01b0316336001600160a01b031614155b15612973576001600160a01b0389166000908152600560205260409020600301548311158061293e57508088115b6129735760405162461bcd60e51b8152600401610a2a906020808252600490820152634547504560e01b604082015260600190565b5050505b6001600160a01b038616600090815260056020526040902042600482018190556001909101546129a791906132ed565b6001600160a01b038716600081815260056020908152604091829020600201939093555187815233927f0f7cde3c0518e1cc590491be5861d70a2e333f7e65af2e1ebd91a3c9a3cc638d910160405180910390a36001600160a01b03861660009081526013602052604081208054879290612a23908490615185565b9250508190555050505060005481146114585760405162461bcd60e51b8152600401610a2a906151ea565b6001600080828254612a609190615185565b9091555050600054600454600160a01b900460ff1615612aaa5760405162461bcd60e51b8152602060048201526005602482015264504155534560d81b6044820152606401610a2a565b3360005b600654811015612ba357600060068281548110612acd57612acd61519d565b6000918252602090912001546001600160a01b03169050612aed81613132565b6001600160a01b03821660009081526005602081905260409091200155612b1381612039565b6001600160a01b03808316600090815260056020526040902060040191909155831615612b9057612b448382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b5080612b9b816151b3565b915050612aae565b5060008311612bc45760405162461bcd60e51b8152600401610a2a906151ce565b600d54612bd190846132ed565b600d55336000908152600e6020526040902054612bee90846132ed565b336000818152600e6020526040902091909155600154612c1b916001600160a01b03909116903086613392565b60405183815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a260405183815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016111ae565b6001600160a01b03811660009081526005602052604081206001810154600390910154610d069161323c565b600260009054906101000a90046001600160a01b03166001600160a01b03166385f2aef26040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612d0157600080fd5b505af1158015612d15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d399190615012565b6001600160a01b0316336001600160a01b031614612d695760405162461bcd60e51b8152600401610a2a9061502f565b6001600160a01b0383166000908152600b602052604090205460ff16158015612dab57506001600160a01b038316600090815260056020526040902060010154155b612ddc5760405162461bcd60e51b8152602060048201526002602482015261414960f01b6044820152606401610a2a565b6001546001600160a01b0384811691161415612e0a5760405162461bcd60e51b8152600401610a2a9061504e565b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039586166001600160a01b031991821681179092556000918252600b60209081526040808420805460ff19168617905560059091529091208054949095169316929092178355910155565b6000806001600080828254612ea19190615185565b9091555050600054612eb1613769565b925092506000548114612ed65760405162461bcd60e51b8152600401610a2a906151ea565b509091565b6001546040516370a0823160e01b81523360048201526120a3916001600160a01b0316906370a082319060240160206040518083038186803b158015612f2057600080fd5b505afa158015612f34573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084b9190615207565b6003546001600160a01b03163314612f9a5760405162461bcd60e51b815260206004820152600560248201526457686f205560d81b6044820152606401610a2a565b6008546001600160a01b031660005b6007548110156130ed57600060078281548110612fc857612fc861519d565b600091825260208220015460405163095ea7b360e01b81526001600160a01b039091169250829163095ea7b39161300391879160040161506d565b602060405180830381600087803b15801561301d57600080fd5b505af1158015613031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130559190615086565b5060405163095ea7b360e01b81526001600160a01b0382169063095ea7b3906130869087906000199060040161506d565b602060405180830381600087803b1580156130a057600080fd5b505af11580156130b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d89190615086565b505080806130e5906151b3565b915050612fa9565b5050600880546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600e602052604090205461312a90610f87565b6120a3611631565b6000600d546000141561315f57506001600160a01b03166000908152600560208190526040909120015490565b600d546001600160a01b03831660009081526005602052604090206003810154600490910154610d06926131b3929091610cf791670de0b6b3a7640000916131ad91908290610cd28b612039565b9061323c565b6001600160a01b03841660009081526005602081905260409091200154906132ed565b6007818154811061207057600080fd5b6000828211156132285760405162461bcd60e51b815260206004820152600d60248201526c29b0b332a6b0ba341d1016a7a360991b6044820152606401610a2a565b60006132348385615243565b949350505050565b60008261324b57506000610d06565b6000613257838561529b565b90508261326485836152ba565b14610d035760405162461bcd60e51b815260206004820152600d60248201526c29b0b332a6b0ba341d101527a360991b6044820152606401610a2a565b60008082116132e15760405162461bcd60e51b815260206004820152600c60248201526b0536166654d6174683a202f360a41b6044820152606401610a2a565b600061323483856152ba565b6000806132fa8385615185565b905083811015610d035760405162461bcd60e51b815260206004820152600d60248201526c29b0b332a6b0ba341d1015a7a360991b6044820152606401610a2a565b6114588363a9059cbb60e01b848460405160240161335b92919061506d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614b85565b6040516001600160a01b03808516602483015283166044820152606481018290526133ca9085906323b872dd60e01b9060840161335b565b50505050565b60016000808282546133e29190615185565b9091555050600080549083905b6006548110156134e45760006006828154811061340e5761340e61519d565b6000918252602090912001546001600160a01b0316905061342e81613132565b6001600160a01b0382166000908152600560208190526040909120015561345481612039565b6001600160a01b038083166000908152600560205260409020600401919091558316156134d1576134858382610c71565b6001600160a01b038085166000818152600a6020908152604080832094871680845294825280832095909555600580825285832001549282526009815284822093825292909252919020555b50806134dc816151b3565b9150506133ef565b5060005b835181101561355a5760008482815181106135055761350561519d565b6020908102919091018101516001600160a01b038089166000908152600a8452604080822092841682529190935290912054909150613545878383613587565b50508080613552906151b3565b9150506134e8565b50613563613769565b50505060005481146114585760405162461bcd60e51b8152600401610a2a906151ea565b8015611458576001600160a01b038084166000908152600a602090815260408083208685168085529252822091909155600454909116141561369a5760105480156136945760006135df620f4240610cf7858561323c565b60025460115460405163d4e54c3b60e01b81526004810184905260248101919091526001600160a01b03888116604483015292935091169063d4e54c3b90606401602060405180830381600087803b15801561363a57600080fd5b505af115801561364e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136729190615207565b506136928561368185846131e6565b6001600160a01b038716919061333c565b505b506136ae565b6136ae6001600160a01b038316848361333c565b826001600160a01b0316826001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc9836040516136f391815260200190565b60405180910390a36001600160a01b03821660009081526012602052604081208054839290613723908490615185565b90915550506001600160a01b0380841660009081526014602090815260408083209386168352929052908120805483929061375f908490615185565b9091555050505050565b6000806000600360009054906101000a90046001600160a01b03166001600160a01b0316633f6678256040518163ffffffff1660e01b815260040160206040518083038186803b1580156137bc57600080fd5b505afa1580156137d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f49190615207565b9050600080821161380657600061388c565b600360009054906101000a90046001600160a01b03166001600160a01b03166313416d996040518163ffffffff1660e01b815260040160206040518083038186803b15801561385457600080fd5b505afa158015613868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388c9190615012565b600354909150600160a01b900460ff1661424a5760075460008167ffffffffffffffff8111156138be576138be614e18565b6040519080825280602002602001820160405280156138e7578160200160208202803683370190505b50905060008267ffffffffffffffff81111561390557613905614e18565b60405190808252806020026020018201604052801561392e578160200160208202803683370190505b50905060005b83811015613a9e576007818154811061394f5761394f61519d565b9060005260206000200160009054906101000a90046001600160a01b031683828151811061397f5761397f61519d565b60200260200101906001600160a01b031690816001600160a01b03168152505060006001600160a01b03168382815181106139bc576139bc61519d565b60200260200101516001600160a01b031614613a6c578281815181106139e4576139e461519d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613a2f57600080fd5b505afa158015613a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a679190615207565b613a6f565b60005b828281518110613a8157613a8161519d565b602090810291909101015280613a96816151b3565b915050613934565b506001546040805163d294f09360e01b815281516001600160a01b039093169263d294f093926004808401939192918290030181600087803b158015613ae357600080fd5b505af1925050508015613b13575060408051601f3d908101601f19168201909252613b10918101906152dc565b60015b613b265750600096879650945050505050565b505060005b8381101561423a576000806001600160a01b0316848381518110613b5157613b5161519d565b60200260200101516001600160a01b031614613c0157838281518110613b7957613b7961519d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613bc457600080fd5b505afa158015613bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bfc9190615207565b613c04565b60005b9050828281518110613c1857613c1861519d565b6020026020010151811115614227576000620f424088858581518110613c4057613c4061519d565b602002602001015184613c539190615243565b613c5d919061529b565b613c6791906152ba565b1115613e9157838281518110613c7f57613c7f61519d565b60200260200101516001600160a01b031663a9059cbb87620f42408a613cc7888881518110613cb057613cb061519d565b6020026020010151876131e690919063ffffffff16565b613cd1919061529b565b613cdb91906152ba565b6040518363ffffffff1660e01b8152600401613cf892919061506d565b602060405180830381600087803b158015613d1257600080fd5b505af1158015613d26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4a9190615086565b50838281518110613d5d57613d5d61519d565b60200260200101516001600160a01b0316866001600160a01b0316336001600160a01b03167f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42408b613dd4898981518110613dbd57613dbd61519d565b6020026020010151886131e690919063ffffffff16565b613dde919061529b565b613de891906152ba565b60405190815260200160405180910390a4838281518110613e0b57613e0b61519d565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015613e5657600080fd5b505afa158015613e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8e9190615207565b90505b600f546001600160a01b031661405b5760085484516001600160a01b039091169063b66503cf90869085908110613eca57613eca61519d565b6020026020010151613efe868681518110613ee757613ee761519d565b6020026020010151856131e690919063ffffffff16565b6040518363ffffffff1660e01b8152600401613f1b92919061506d565b600060405180830381600087803b158015613f3557600080fd5b505af1158015613f49573d6000803e3d6000fd5b50505050838281518110613f5f57613f5f61519d565b60200260200101516001600160a01b0316600860009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b031660008051602061534c833981519152868681518110613fba57613fba61519d565b602002602001015185613fcd9190615243565b60405190815260200160405180910390a4828281518110613ff057613ff061519d565b6020026020010151816140039190615243565b601560008685815181106140195761401961519d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546140509190615185565b909155506142279050565b83828151811061406d5761406d61519d565b60200260200101516001600160a01b031663a9059cbb600f60009054906101000a90046001600160a01b03166140ae868681518110613ee757613ee761519d565b6040518363ffffffff1660e01b81526004016140cb92919061506d565b602060405180830381600087803b1580156140e557600080fd5b505af11580156140f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061411d9190615086565b508382815181106141305761413061519d565b60200260200101516001600160a01b0316600f60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b031660008051602061534c83398151915286868151811061418b5761418b61519d565b60200260200101518561419e9190615243565b60405190815260200160405180910390a48282815181106141c1576141c161519d565b6020026020010151816141d49190615243565b601560008685815181106141ea576141ea61519d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546142219190615185565b90915550505b5080614232816151b3565b915050613b2b565b5060009788975095505050505050565b60015460408051634eb1c24560e11b8152815160009384936001600160a01b0390911692639d63848a926004808301939282900301818787803b15801561429057600080fd5b505af11580156142a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142c89190615300565b6040516370a0823160e01b815230600482015291935091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561430f57600080fd5b505afa158015614323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143479190615207565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561438c57600080fd5b505afa1580156143a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143c49190615207565b6001546040805163d294f09360e01b815281519394506001600160a01b039092169263d294f0939260048082019392918290030181600087803b15801561440a57600080fd5b505af192505050801561443a575060408051601f3d908101601f19168201909252614437918101906152dc565b60015b61444e575060009788975095505050505050565b50506040516370a0823160e01b815230600482015282906001600160a01b038616906370a082319060240160206040518083038186803b15801561449157600080fd5b505afa1580156144a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c99190615207565b6144d39190615243565b6040516370a0823160e01b815230600482015290985081906001600160a01b038516906370a082319060240160206040518083038186803b15801561451757600080fd5b505afa15801561452b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061454f9190615207565b6145599190615243565b96506000620f424061456b888b61529b565b61457591906152ba565b11156146a1576001600160a01b03841663a9059cbb86620f42406145998a8d61529b565b6145a391906152ba565b6040518363ffffffff1660e01b81526004016145c092919061506d565b602060405180830381600087803b1580156145da57600080fd5b505af11580156145ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146129190615086565b506001600160a01b03808616908516337f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42406146518b8e61529b565b61465b91906152ba565b60405190815260200160405180910390a46040516370a0823160e01b815230600482015261469e9083906001600160a01b038716906370a08231906024016121ab565b97505b6000620f42406146b1888a61529b565b6146bb91906152ba565b11156147e7576001600160a01b03831663a9059cbb86620f42406146df8a8c61529b565b6146e991906152ba565b6040518363ffffffff1660e01b815260040161470692919061506d565b602060405180830381600087803b15801561472057600080fd5b505af1158015614734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147589190615086565b506001600160a01b03808616908416337f78c0b7f8dc279098cd35e7f6ed62faef6b268eb5f31ece1326f32e1bc1d5a048620f42406147978b8d61529b565b6147a191906152ba565b60405190815260200160405180910390a46040516370a0823160e01b81523060048201526147e49082906001600160a01b038616906370a08231906024016121ab565b96505b600f546001600160a01b03166149945787156148c35760085460405163b66503cf60e01b81526001600160a01b039091169063b66503cf9061482f9087908c9060040161506d565b600060405180830381600087803b15801561484957600080fd5b505af115801561485d573d6000803e3d6000fd5b505050506001600160a01b038416600090815260156020526040812080548a9290614889908490615185565b90915550506008546040518981526001600160a01b03868116921690339060008051602061534c8339815191529060200160405180910390a45b861561498f5760085460405163b66503cf60e01b81526001600160a01b039091169063b66503cf906148fb9086908b9060040161506d565b600060405180830381600087803b15801561491557600080fd5b505af1158015614929573d6000803e3d6000fd5b505050506001600160a01b03831660009081526015602052604081208054899290614955908490615185565b90915550506008546040518881526001600160a01b03858116921690339060008051602061534c8339815191529060200160405180910390a45b614b65565b600f5460405163a9059cbb60e01b81526001600160a01b038681169263a9059cbb926149c892909116908c9060040161506d565b602060405180830381600087803b1580156149e257600080fd5b505af11580156149f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a1a9190615086565b50600f5460405163a9059cbb60e01b81526001600160a01b038581169263a9059cbb92614a4f92909116908b9060040161506d565b602060405180830381600087803b158015614a6957600080fd5b505af1158015614a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614aa19190615086565b50600f546040518981526001600160a01b03868116921690339060008051602061534c8339815191529060200160405180910390a4600f546040518881526001600160a01b03858116921690339060008051602061534c8339815191529060200160405180910390a46001600160a01b038416600090815260156020526040812080548a9290614b32908490615185565b90915550506001600160a01b03831660009081526015602052604081208054899290614b5f908490615185565b90915550505b5050505050509091565b6000818310614b7e5781610d03565b5090919050565b6001600160a01b0382163b614bdc5760405162461bcd60e51b815260206004820152601760248201527f5361666545524332303a206e6f6e2d636f6e74726163740000000000000000006044820152606401610a2a565b600080836001600160a01b031683604051614bf7919061532f565b6000604051808303816000865af19150503d8060008114614c34576040519150601f19603f3d011682016040523d82523d6000602084013e614c39565b606091505b509150915081614c815760405162461bcd60e51b815260206004820152601360248201527214d85999515490cc8c0e88131310c819985a5b606a1b6044820152606401610a2a565b8051156133ca5780806020019051810190614c9c9190615086565b6133ca5760405162461bcd60e51b81526020600482015260136024820152725361666545524332303a20217375636365737360681b6044820152606401610a2a565b6001600160a01b03811681146114de57600080fd5b600060208284031215614d0557600080fd5b8135610d0381614cde565b60005b83811015614d2b578181015183820152602001614d13565b838111156133ca5750506000910152565b6020815260008251806020840152614d5b816040850160208701614d10565b601f01601f19169190910160400192915050565b60008060408385031215614d8257600080fd5b8235614d8d81614cde565b91506020830135614d9d81614cde565b809150509250929050565b80151581146114de57600080fd5b600060208284031215614dc857600080fd5b8135610d0381614da8565b60008060408385031215614de657600080fd5b8235614df181614cde565b946020939093013593505050565b600060208284031215614e1157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5757614e57614e18565b604052919050565b600082601f830112614e7057600080fd5b8135602067ffffffffffffffff821115614e8c57614e8c614e18565b8160051b614e9b828201614e2e565b9283528481018201928281019087851115614eb557600080fd5b83870192505b84831015614edd578235614ece81614cde565b82529183019190830190614ebb565b979650505050505050565b60008060408385031215614efb57600080fd5b8235614f0681614cde565b9150602083013567ffffffffffffffff811115614f2257600080fd5b614f2e85828601614e5f565b9150509250929050565b60008060408385031215614f4b57600080fd5b50508035926020909101359150565b600060208284031215614f6c57600080fd5b813567ffffffffffffffff811115614f8357600080fd5b61323484828501614e5f565b600080600060608486031215614fa457600080fd5b833592506020840135614fb681614cde565b91506040840135614fc681614cde565b809150509250925092565b600080600060608486031215614fe657600080fd5b8335614ff181614cde565b9250602084013561500181614cde565b929592945050506040919091013590565b60006020828403121561502457600080fd5b8151610d0381614cde565b602080825260059082015264215445414d60d81b604082015260600190565b602080825260059082015264212173746b60d81b604082015260600190565b6001600160a01b03929092168252602082015260400190565b60006020828403121561509857600080fd5b8151610d0381614da8565b6000602082840312156150b557600080fd5b815167ffffffffffffffff808211156150cd57600080fd5b818401915084601f8301126150e157600080fd5b8151818111156150f3576150f3614e18565b615106601f8201601f1916602001614e2e565b915080825285602082850101111561511d57600080fd5b61512e816020840160208601614d10565b50949350505050565b6f029b1b0b6329023b0bab3b2903337b9160851b815260008251615162816010850160208701614d10565b9190910160100192915050565b634e487b7160e01b600052601160045260246000fd5b600082198211156151985761519861516f565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156151c7576151c761516f565b5060010190565b602080825260029082015261306160f01b604082015260600190565b60208082526003908201526252472160e81b604082015260600190565b60006020828403121561521957600080fd5b5051919050565b60006020828403121561523257600080fd5b815160ff81168114610d0357600080fd5b6000828210156152555761525561516f565b500390565b634e487b7160e01b600052603160045260246000fd5b6229a39d60e91b81526000825161528e816003850160208701614d10565b9190910160030192915050565b60008160001904831182151516156152b5576152b561516f565b500290565b6000826152d757634e487b7160e01b600052601260045260246000fd5b500490565b600080604083850312156152ef57600080fd5b505080516020909101519092909150565b6000806040838503121561531357600080fd5b825161531e81614cde565b6020840151909250614d9d81614cde565b60008251615341818460208701614d10565b919091019291505056feee447878094bcc87bd81b55e4831b5e9e3d095866fce10f4f7e4caa64ea7a558a264697066735822122027e16db70021782cf8493b168033bc999b4e2d303e5694723810d2afb42e408864736f6c63430008090033

Deployed Bytecode Sourcemap

14313:25454:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35597:408;;;;;;:::i;:::-;;:::i;:::-;;17549:138;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15510:28;;;;;;;;;1199:25:1;;;1187:2;1172:18;15510:28:0;1053:177:1;15593:47:0;;;;;;:::i;:::-;;;;;;;;;;;;;;18875:266;;;;;;:::i;:::-;;:::i;15714:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;37335:77;;;;;;:::i;:::-;;:::i;17934:93::-;18007:12;;17934:93;;14760:23;;;;;-1:-1:-1;;;;;14760:23:0;;;;;;-1:-1:-1;;;;;2182:32:1;;;2164:51;;2152:2;2137:18;14760:23:0;1997:224:1;19265:144:0;;;;;;:::i;:::-;;:::i;20453:116::-;;;;;;:::i;:::-;-1:-1:-1;;;;;20534:16:0;20510:4;20534:16;;;:10;:16;;;;;:27;;;;20453:116;35086:503;;;;;;:::i;:::-;;:::i;15647:60::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;20577:124;;;;;;:::i;:::-;-1:-1:-1;;;;;20662:16:0;20638:4;20662:16;;;:10;:16;;;;;:31;;;;20577:124;22101:557;;;;;;:::i;:::-;;:::i;21426:453::-;;;;;;:::i;:::-;;:::i;21981:112::-;;;;;;:::i;:::-;;:::i;23218:255::-;;;;;;:::i;:::-;;:::i;17832:94::-;;;:::i;15025:19::-;;;;;-1:-1:-1;;;;;15025:19:0;;;14734;;;;;-1:-1:-1;;;;;14734:19:0;;;22863:347;;;:::i;20763:187::-;;;;;;:::i;:::-;;:::i;37869:205::-;;;;;;:::i;:::-;;:::i;14790:19::-;;;;;-1:-1:-1;;;;;14790:19:0;;;14903:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14903:44:0;;;;;;;;;;;;;;-1:-1:-1;;;;;5647:32:1;;;5629:51;;5711:2;5696:18;;5689:34;;;;5739:18;;;5732:34;;;;5797:2;5782:18;;5775:34;5840:3;5825:19;;5818:35;5667:3;5869:19;;5862:35;5616:3;5601:19;14903:44:0;5342:561:1;15245:40:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6073:14:1;;6066:22;6048:41;;6036:2;6021:18;15245:40:0;5908:187:1;37241:86:0;;;;;;:::i;:::-;;:::i;36732:171::-;;;;;;:::i;:::-;;:::i;36013:711::-;;;;;;:::i;:::-;;:::i;36911:177::-;;;;;;:::i;:::-;;:::i;15464:25::-;;;;;;14878:18;;;;;-1:-1:-1;;;14878:18:0;;;;;;18155:178;;;;;;:::i;:::-;;:::i;15547:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;15092:77;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;18035:112;;;;;;:::i;:::-;-1:-1:-1;;;;;18121:18:0;18094:7;18121:18;;;:9;:18;;;;;;;18035:112;15434:23;;;;;-1:-1:-1;;;;;15434:23:0;;;14844:25;;;;;-1:-1:-1;;;;;14844:25:0;;;14954:29;;;;;;:::i;:::-;;:::i;22666:82::-;;;:::i;34455:623::-;;;;;;:::i;:::-;;:::i;20233:84::-;20306:2;;-1:-1:-1;;;;;20306:2:0;20233:84;;20053:101;20128:11;:18;20053:101;;17695:129;;;:::i;19619:315::-;;;;;;:::i;:::-;;:::i;24597:2567::-;;;;;;:::i;:::-;;:::i;20958:460::-;;;;;;:::i;:::-;;:::i;19417:194::-;;;;;;:::i;:::-;;:::i;33716:630::-;;;;;;:::i;:::-;;:::i;27172:120::-;;;:::i;:::-;;;;7757:25:1;;;7813:2;7798:18;;7791:34;;;;7730:18;27172:120:0;7583:248:1;20325:120:0;;;;;;:::i;:::-;-1:-1:-1;;;;;20408:16:0;20384:4;20408:16;;;:10;:16;;;;;:29;;;;20325:120;15292:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21887:86;;;:::i;14816:21::-;;;;;-1:-1:-1;;;14816:21:0;;;;;;19942:103;20018:12;:19;19942:103;;15176:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;37420:441;;;;;;:::i;:::-;;:::i;22756:97::-;;;:::i;18341:468::-;;;;;;:::i;:::-;;:::i;14990:28::-;;;;;;:::i;:::-;;:::i;35597:408::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;35668:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:25;35660:41;;;::::0;-1:-1:-1;;;35660:41:0;;8627:2:1;35660:41:0::1;::::0;::::1;8609:21:1::0;8666:1;8646:18;;;8639:29;-1:-1:-1;;;8684:18:1;;;8677:33;8727:18;;35660:41:0::1;8425:326:1::0;35660:41:0::1;35766:5;::::0;-1:-1:-1;;;;;35752:20:0;;::::1;35766:5:::0;::::1;35752:20;;35743:39;;;;-1:-1:-1::0;;;35743:39:0::1;;;;;;;:::i;:::-;35851:5;::::0;35824:53:::1;::::0;-1:-1:-1;;;35824:53:0;;-1:-1:-1;;;;;35824:18:0;;::::1;::::0;::::1;::::0;:53:::1;::::0;35851:5;;::::1;::::0;-1:-1:-1;;35859:17:0;35824:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;35888:11:0::1;:20:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;35888:20:0::1;-1:-1:-1::0;;;;;35888:20:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;35919:16:0;;;:12:::1;35888:20;35919:16:::0;;;;;:23;;-1:-1:-1;;35919:23:0::1;::::0;::::1;::::0;;35984:5:::1;::::0;35958:39;;35984:5;::::1;::::0;35958:39:::1;::::0;-1:-1:-1;35958:39:0::1;35597:408:::0;:::o;17549:138::-;17665:5;;:12;;;-1:-1:-1;;;17665:12:0;;;;17588:13;;-1:-1:-1;;;;;17665:5:0;;:10;;:12;;;;;:5;;:12;;;;;;;:5;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17665:12:0;;;;;;;;;;;;:::i;:::-;17628:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;17614:65;;17549:138;:::o;18875:266::-;-1:-1:-1;;;;;19101:16:0;;;18954:7;19101:16;;;:7;:16;;;;;;;;:31;;;;;;;;;;;;;19038;;;:22;:31;;;;;:46;;;;;;;;;;18981:152;;19101:31;18981:115;;19091:4;;18981:105;;19004:81;;:29;19118:13;19004:14;:29::i;:::-;:33;;:81::i;:::-;-1:-1:-1;;;;;18981:18:0;;;;;;:9;:18;;;;;;;:22;:105::i;:::-;:109;;:115::i;:::-;:119;;:152::i;:::-;18974:159;;18875:266;;;;;:::o;37335:77::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;37393:6:::1;:11:::0;;;::::1;;-1:-1:-1::0;;;37393:11:0::1;-1:-1:-1::0;;;;37393:11:0;;::::1;::::0;;;::::1;::::0;;37335:77::o;19265:144::-;19342:7;19369:32;19378:7;19387:13;19369:8;:32::i;35086:503::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35233:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:38:::1;;::::0;35215:15:::1;:56;35193:139;;;::::0;-1:-1:-1;;;35193:139:0;;10971:2:1;35193:139:0::1;::::0;::::1;10953:21:1::0;11010:1;10990:18;;;10983:29;-1:-1:-1;;;11028:18:1;;;11021:33;11071:18;;35193:139:0::1;10769:326:1::0;35193:139:0::1;35370:1;35351:16;:20;35343:35;;;::::0;-1:-1:-1;;;35343:35:0;;11302:2:1;35343:35:0::1;::::0;::::1;11284:21:1::0;11341:1;11321:18;;;11314:29;-1:-1:-1;;;11359:18:1;;;11352:32;11401:18;;35343:35:0::1;11100:325:1::0;35343:35:0::1;-1:-1:-1::0;;;;;35425:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;;;:41:::1;;:60:::0;;;35501:80;::::1;::::0;::::1;::::0;35469:16;1199:25:1;;1187:2;1172:18;;1053:177;35501:80:0::1;;;;;;;;35086:503:::0;;:::o;22101:557::-;7951:1;7934:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;7963:20:0;7986:13;;;22168:10:::1;::::0;38179:483:::1;38196:12;:19:::0;38192:23;::::1;38179:483;;;38237:13;38253:12;38266:1;38253:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38253:15:0::1;::::0;-1:-1:-1;38324:21:0::1;38253:15:::0;38324:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38283:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;38395:31:::1;38294:5:::0;38395:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38360:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38445:21;::::1;::::0;38441:210:::1;;38513:24;38522:7;38531:5;38513:8;:24::i;:::-;-1:-1:-1::0;;;;;38487:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38597:10:::1;:17:::0;;;;;;:38:::1;::::0;38556:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;38441:210:::1;-1:-1:-1::0;38217:3:0;::::1;::::0;::::1;:::i;:::-;;;;38179:483;;;;22208:1:::2;22199:6;:10;22191:25;;;;-1:-1:-1::0;;;22191:25:0::2;;;;;;;:::i;:::-;22265:12;;22256:6;:21;22248:36;;;::::0;-1:-1:-1;;;22248:36:0;;12499:2:1;22248:36:0::2;::::0;::::2;12481:21:1::0;12538:1;12518:18;;;12511:29;-1:-1:-1;;;12556:18:1;;;12549:32;12598:18;;22248:36:0::2;12297:325:1::0;22248:36:0::2;22383:12;::::0;:24:::2;::::0;22400:6;22383:16:::2;:24::i;:::-;22368:12;:39:::0;22452:10:::2;22442:21;::::0;;;:9:::2;:21;::::0;;;;;:33:::2;::::0;22468:6;22442:25:::2;:33::i;:::-;22428:10;22418:21;::::0;;;:9:::2;:21;::::0;;;;:57;;;;22486:5:::2;::::0;:38:::2;::::0;-1:-1:-1;;;;;22486:5:0;;::::2;::::0;22517:6;22486:18:::2;:38::i;:::-;22540:29;::::0;1199:25:1;;;22550:10:0::2;::::0;22540:29:::2;::::0;1187:2:1;1172:18;22540:29:0::2;;;;;;;22585:40;::::0;1199:25:1;;;22614:1:0::2;::::0;22594:10:::2;::::0;22585:40:::2;::::0;1187:2:1;1172:18;22585:40:0::2;;;;;;;;8010:1:::1;8046:13:::0;;8030:12;:29;8022:45;;;;-1:-1:-1;;;8022:45:0;;;;;;;:::i;:::-;7923:152;22101:557;:::o;21426:453::-;7951:1;7934:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;7963:20:0;7986:13;38842:6:::1;::::0;-1:-1:-1;;;38842:6:0;::::1;;;38841:7;38833:25;;;::::0;-1:-1:-1;;;38833:25:0;;13160:2:1;38833:25:0::1;::::0;::::1;13142:21:1::0;13199:1;13179:18;;;13172:29;-1:-1:-1;;;13217:18:1;;;13210:35;13262:18;;38833:25:0::1;12958:328:1::0;38833:25:0::1;21520:5:::2;38184:6;38179:483;38196:12;:19:::0;38192:23;::::2;38179:483;;;38237:13;38253:12;38266:1;38253:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;38253:15:0::2;::::0;-1:-1:-1;38324:21:0::2;38253:15:::0;38324:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;38283:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;;;;:38:::2;:62:::0;38395:31:::2;38294:5:::0;38395:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;38360:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;38445:21;::::2;::::0;38441:210:::2;;38513:24;38522:7;38531:5;38513:8;:24::i;:::-;-1:-1:-1::0;;;;;38487:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;38597:10:::2;:17:::0;;;;;;:38:::2;::::0;38556:31;;;:22:::2;:31:::0;;;;;:38;;;;;;;;;;:79;38441:210:::2;-1:-1:-1::0;38217:3:0;::::2;::::0;::::2;:::i;:::-;;;;38179:483;;;;21555:1:::3;21546:6;:10;21538:25;;;;-1:-1:-1::0;;;21538:25:0::3;;;;;;;:::i;:::-;21607:12;::::0;:24:::3;::::0;21624:6;21607:16:::3;:24::i;:::-;21592:12;:39:::0;-1:-1:-1;;;;;21661:16:0;::::3;;::::0;;;:9:::3;:16;::::0;;;;;:28:::3;::::0;21682:6;21661:20:::3;:28::i;:::-;-1:-1:-1::0;;;;;21642:16:0;;::::3;;::::0;;;:9:::3;:16;::::0;;;;:47;;;;21700:5:::3;::::0;:57:::3;::::0;:5:::3;21723:10;21743:4;21750:6:::0;21700:22:::3;:57::i;:::-;21781:5;-1:-1:-1::0;;;;;21773:22:0::3;;21788:6;21773:22;;;;1199:25:1::0;;1187:2;1172:18;;1053:177;21773:22:0::3;;;;;;;;21811:35;::::0;1199:25:1;;;-1:-1:-1;;;;;21811:35:0;::::3;::::0;21828:1:::3;::::0;21811:35:::3;::::0;1187:2:1;1172:18;21811:35:0::3;;;;;;;38879:1:::2;8046:13:::0;;8030:12;:29;8022:45;;;;-1:-1:-1;;;8022:45:0;;;;;;;:::i;:::-;7923:152;21426:453;;:::o;21981:112::-;22057:5;;:27;;-1:-1:-1;;;22057:27:0;;22073:10;22057:27;;;2164:51:1;22039:46:0;;22050:5;;-1:-1:-1;;;;;22057:5:0;;;;:15;;2137:18:1;;22057:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22039:46::-;21981:112;:::o;23218:255::-;23307:10;-1:-1:-1;;;;;23307:21:0;;;;:53;;-1:-1:-1;23354:5:0;;-1:-1:-1;;;;;23354:5:0;23332:10;:28;23307:53;23299:86;;;;-1:-1:-1;;;23299:86:0;;13682:2:1;23299:86:0;;;13664:21:1;13721:2;13701:18;;;13694:30;-1:-1:-1;;;13740:18:1;;;13733:50;13800:18;;23299:86:0;13480:344:1;23299:86:0;23396:5;;:31;;-1:-1:-1;;;23396:31:0;;23421:4;23396:31;;;2164:51:1;-1:-1:-1;;;;;23396:5:0;;;;:16;;2137:18:1;;23396:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23438:27;23449:7;23458:6;23438:10;:27::i;17832:94::-;17902:5;;:16;;;-1:-1:-1;;;17902:16:0;;;;17875:7;;-1:-1:-1;;;;;17902:5:0;;:14;;:16;;;;;;;;;;;;;;:5;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17895:23;;;;17832:94;:::o;22863:347::-;7951:1;7934:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;7963:20:0;7986:13;;;22917:10:::1;::::0;38179:483:::1;38196:12;:19:::0;38192:23;::::1;38179:483;;;38237:13;38253:12;38266:1;38253:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38253:15:0::1;::::0;-1:-1:-1;38324:21:0::1;38253:15:::0;38324:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38283:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;38395:31:::1;38294:5:::0;38395:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38360:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38445:21;::::1;::::0;38441:210:::1;;38513:24;38522:7;38531:5;38513:8;:24::i;:::-;-1:-1:-1::0;;;;;38487:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38597:10:::1;:17:::0;;;;;;:38:::1;::::0;38556:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;38441:210:::1;-1:-1:-1::0;38217:3:0;::::1;::::0;::::1;:::i;:::-;;;;38179:483;;;;22947:6:::2;22942:238;22959:12;:19:::0;22955:23;::::2;22942:238;;;23000:21;23024:12;23037:1;23024:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;;::::2;::::0;23080:10:::2;23072:19:::0;;;:7:::2;:19:::0;;;;;;-1:-1:-1;;;;;23024:15:0;;::::2;23072:34:::0;;;;;;;;;;;;23024:15;;-1:-1:-1;23121:47:0::2;::::0;23024:15;23072:34;23121:11:::2;:47::i;:::-;22985:195;;22980:3;;;;;:::i;:::-;;;;22942:238;;;;23190:12;:10;:12::i;:::-;;;8010:1:::1;8046:13:::0;;8030:12;:29;8022:45;;;;-1:-1:-1;;;8022:45:0;;;;;;;:::i;20763:187::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20876:25:0;;::::1;;::::0;;;:10:::1;:25;::::0;;;;:66;;-1:-1:-1;;;;;;20876:66:0::1;::::0;;;::::1;;::::0;;20763:187::o;37869:205::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;37966:3:::1;37961;:8;;37953:24;;;::::0;-1:-1:-1;;;37953:24:0;;14309:2:1;37953:24:0::1;::::0;::::1;14291:21:1::0;14348:1;14328:18;;;14321:29;-1:-1:-1;;;14366:18:1;;;14359:33;14409:18;;37953:24:0::1;14107:326:1::0;37953:24:0::1;38020:10;:16:::0;;;;38047:13:::1;:19:::0;37869:205::o;37241:86::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;37305:8:::1;:14:::0;;-1:-1:-1;;;;;;37305:14:0::1;-1:-1:-1::0;;;;;37305:14:0;;;::::1;::::0;;;::::1;::::0;;37241:86::o;36732:171::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;36813:7:::1;36809:87;36827:4;:11;36822:2;:16;36809:87;;;36861:23;36875:4;36880:2;36875:8;;;;;;;;:::i;:::-;;;;;;;36861:13;:23::i;:::-;36840:4:::0;::::1;::::0;::::1;:::i;:::-;;;;36809:87;;36013:711:::0;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36087:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;36079:40;;;::::0;-1:-1:-1;;;36079:40:0;;14640:2:1;36079:40:0::1;::::0;::::1;14622:21:1::0;14679:1;14659:18;;;14652:29;-1:-1:-1;;;14697:18:1;;;14690:33;14740:18;;36079:40:0::1;14438:326:1::0;36079:40:0::1;36182:5;::::0;36155:37:::1;::::0;-1:-1:-1;;;36155:37:0;;-1:-1:-1;;;;;36155:18:0;;::::1;::::0;::::1;::::0;:37:::1;::::0;36182:5;;::::1;::::0;::::1;::::0;36155:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;36214:11:0::1;:18:::0;;;-1:-1:-1;;;;;36246:22:0;::::1;::::0;36258:5:::1;36262:1;36214:18:::0;36258:5:::1;:::i;:::-;36246:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36246:18:0::1;:22;36243:418;;;36285:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;36285:17:0;;;;;-1:-1:-1;;;;;;36285:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;36317:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;36317:24:0::1;::::0;;36243:418:::1;;;36387:6;36383:267;36399:11;:18:::0;:22:::1;::::0;36420:1:::1;::::0;36399:22:::1;:::i;:::-;36395:1;:26;36383:267;;;36466:2;-1:-1:-1::0;;;;;36450:18:0::1;:11;36462:1;36450:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36450:14:0::1;:18;36447:188;;;36510:11;36522:5;36526:1;36522:3:::0;:5:::1;:::i;:::-;36510:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;36493:11:::1;:14:::0;;-1:-1:-1;;;;;36510:18:0;;::::1;::::0;36505:1;;36493:14;::::1;;;;;:::i;:::-;;;;;;;;;:35;;;;;-1:-1:-1::0;;;;;36493:35:0::1;;;;;-1:-1:-1::0;;;;;36493:35:0::1;;;;;;36551:11;:17;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;36551:17:0;;;;;-1:-1:-1;;;;;;36551:17:0::1;::::0;;;;;;;;-1:-1:-1;;;;;36591:16:0;::::1;::::0;;:12:::1;:16:::0;;;;;:24;;-1:-1:-1;;36591:24:0::1;::::0;;36447:188:::1;36423:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36383:267;;;;36243:418;36702:5;::::0;36676:40:::1;::::0;36710:5:::1;::::0;-1:-1:-1;;;;;36702:5:0;;::::1;::::0;36676:40;;::::1;::::0;::::1;::::0;36710:5;;36676:40:::1;36068:656;36013:711:::0;:::o;36911:177::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;36995:7:::1;36991:90;37009:4;:11;37004:2;:16;36991:90;;;37043:26;37060:4;37065:2;37060:8;;;;;;;;:::i;:::-;;;;;;;37043:16;:26::i;:::-;37022:4:::0;::::1;::::0;::::1;:::i;:::-;;;;36991:90;;18155:178:::0;-1:-1:-1;;;;;18286:25:0;;18233:7;18286:25;;;:10;:25;;;;;:38;;;18260:65;;18269:15;;18260:8;:65::i;14954:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14954:29:0;;-1:-1:-1;14954:29:0;:::o;22666:82::-;22728:10;22718:21;;;;:9;:21;;;;;;22709:31;;:8;:31::i;:::-;22666:82::o;34455:623::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;34562:5:::1;::::0;-1:-1:-1;;;;;34544:24:0;;::::1;34562:5:::0;::::1;34544:24;34541:446;;;34874:12;::::0;34838:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;34838:30:0;;34862:4:::1;34838:30;::::0;::::1;2164:51:1::0;34821:13:0::1;::::0;34837:50:::1;::::0;34874:12;;-1:-1:-1;;;;;34838:5:0;;::::1;::::0;:15:::1;::::0;2137:18:1;;34838:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34837:50::-;34821:66;;34919:8;34911:4;:16;;34902:35;;;;-1:-1:-1::0;;;34902:35:0::1;;;;;;;:::i;:::-;34570:417;34541:446;34997:34;::::0;-1:-1:-1;;;34997:34:0;;-1:-1:-1;;;;;34997:23:0;::::1;::::0;::::1;::::0;:34:::1;::::0;35021:3;;35026:4;;34997:34:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35057:6;-1:-1:-1::0;;;;;35047:23:0::1;;35065:4;35047:23;;;;1199:25:1::0;;1187:2;1172:18;;1053:177;35047:23:0::1;;;;;;;;34455:623:::0;;;:::o;17695:129::-;17800:5;;:14;;;-1:-1:-1;;;17800:14:0;;;;17736:13;;-1:-1:-1;;;;;17800:5:0;;:12;;:14;;;;;:5;;:14;;;;;;;:5;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17800:14:0;;;;;;;;;;;;:::i;:::-;17776:39;;;;;;;;:::i;19619:315::-;-1:-1:-1;;;;;19719:25:0;;19679:4;19719:25;;;:10;:25;;;;;:38;;;19700:15;:57;19696:71;;-1:-1:-1;19766:1:0;;19619:315;-1:-1:-1;19619:315:0:o;19696:71::-;-1:-1:-1;;;;;19798:25:0;;19778:17;19798:25;;;:10;:25;;;;;:38;;;:59;;19841:15;19798:42;:59::i;:::-;-1:-1:-1;;;;;19889:25:0;;;;;;:10;:25;;;;;:36;;;19778:79;;-1:-1:-1;19875:51:0;;19778:79;;19875:13;:51::i;:::-;19868:58;19619:315;-1:-1:-1;;;19619:315:0:o;24597:2567::-;7951:1;7934:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;7963:20:0;7986:13;;;7963:20;38179:483:::1;38196:12;:19:::0;38192:23;::::1;38179:483;;;38237:13;38253:12;38266:1;38253:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38253:15:0::1;::::0;-1:-1:-1;38324:21:0::1;38253:15:::0;38324:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38283:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;38395:31:::1;38294:5:::0;38395:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38360:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38445:21;::::1;::::0;38441:210:::1;;38513:24;38522:7;38531:5;38513:8;:24::i;:::-;-1:-1:-1::0;;;;;38487:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38597:10:::1;:17:::0;;;;;;:38:::1;::::0;38556:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;38441:210:::1;-1:-1:-1::0;38217:3:0;::::1;::::0;::::1;:::i;:::-;;;;38179:483;;;-1:-1:-1::0;24756:5:0::2;::::0;-1:-1:-1;;;;;24731:31:0;;::::2;24756:5:::0;::::2;24731:31;;24723:49;;;;-1:-1:-1::0;;;24723:49:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24835:23:0;::::2;;::::0;;;:8:::2;:23;::::0;;;;;::::2;;24827:51;;;::::0;-1:-1:-1;;;24827:51:0;;15945:2:1;24827:51:0::2;::::0;::::2;15927:21:1::0;15984:2;15964:18;;;15957:30;-1:-1:-1;;;16003:18:1;;;15996:44;16057:18;;24827:51:0::2;15743:338:1::0;24827:51:0::2;24910:1;24897:12;;:14;24889:37;;;::::0;-1:-1:-1;;;24889:37:0;;16288:2:1;24889:37:0::2;::::0;::::2;16270:21:1::0;16327:2;16307:18;;;16300:30;-1:-1:-1;;;16346:18:1;;;16339:41;16397:18;;24889:37:0::2;16086:335:1::0;24889:37:0::2;25145:12;:10;:12::i;:::-;-1:-1:-1::0;;25240:46:0::2;::::0;-1:-1:-1;;;25240:46:0;;25280:4:::2;25240:46;::::0;::::2;2164:51:1::0;25228:9:0::2;::::0;-1:-1:-1;;;;;25240:31:0;::::2;::::0;::::2;::::0;2137:18:1;;25240:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25228:58:::0;-1:-1:-1;25467:74:0::2;-1:-1:-1::0;;;;;25467:38:0;::::2;25506:10;25526:4;25533:7:::0;25467:38:::2;:74::i;:::-;25564:46;::::0;-1:-1:-1;;;25564:46:0;;25604:4:::2;25564:46;::::0;::::2;2164:51:1::0;25552:9:0::2;::::0;-1:-1:-1;;;;;25564:31:0;::::2;::::0;::::2;::::0;2137:18:1;;25564:46:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25552:58:::0;-1:-1:-1;25631:11:0::2;25638:4:::0;25552:58;25631:11:::2;:::i;:::-;25621:21;;25671:1;25661:7;:11;25653:26;;;::::0;-1:-1:-1;;;25653:26:0;;16628:2:1;25653:26:0::2;::::0;::::2;16610:21:1::0;16667:1;16647:18;;;16640:29;-1:-1:-1;;;16685:18:1;;;16678:32;16727:18;;25653:26:0::2;16426:325:1::0;25653:26:0::2;-1:-1:-1::0;;;;;25756:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:38:::2;;::::0;25737:15:::2;:57;25733:1124;;-1:-1:-1::0;;;;;25862:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;25850:54:::2;::::0;:7;;:11:::2;:54::i;:::-;-1:-1:-1::0;;;;;25811:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;:93:::0;25733:1124:::2;;;-1:-1:-1::0;;;;;26028:25:0;::::2;26006:19;26028:25:::0;;;:10:::2;:25;::::0;;;;:36:::2;::::0;::::2;::::0;26099:38:::2;::::0;;::::2;::::0;26028:36;;26006:19;26099:59:::2;::::0;26142:15:::2;26099:42;:59::i;:::-;-1:-1:-1::0;;;;;26206:25:0;::::2;26173:16;26206:25:::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;26079:79;;-1:-1:-1;26173:16:0;26192:51:::2;::::0;26079:79;;26192:13:::2;:51::i;:::-;-1:-1:-1::0;;;;;26323:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:41:::2;;::::0;26173:70;;-1:-1:-1;26297:68:0::2;::::0;:21:::2;:7:::0;26173:70;26297:11:::2;:21::i;:68::-;-1:-1:-1::0;;;;;26258:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;::::0;;::::2;:107:::0;;;;26421:5;;::::2;26401:10;:26;;::::0;:103:::2;;-1:-1:-1::0;;;;;;26460:25:0;;::::2;;::::0;;;:10:::2;:25;::::0;;;;:44;::::2;26448:10;:56;;26401:103;:145;;;;26537:2;;;;;;;;;-1:-1:-1::0;;;;;26537:2:0::2;-1:-1:-1::0;;;;;26537:7:0::2;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26525:21:0::2;:10;-1:-1:-1::0;;;;;26525:21:0::2;;;26401:145;26380:466;;;-1:-1:-1::0;;;;;26638:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;:36:::2;;::::0;:54;-1:-1:-1;26638:54:0::2;::::0;:101:::2;;;26731:8;26721:7;:18;26638:101;26581:249;;;;-1:-1:-1::0;;;26581:249:0::2;;;;;;16958:2:1::0;16940:21;;;16997:1;16977:18;;;16970:29;-1:-1:-1;;;17030:2:1;17015:18;;17008:34;17074:2;17059:18;;16756:327;26581:249:0::2;25922:935;;;25733:1124;-1:-1:-1::0;;;;;26869:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;26912:15:::2;26869:40;::::0;::::2;:58:::0;;;26999:41:::2;::::0;;::::2;::::0;26979:62:::2;::::0;26912:15;26979:19:::2;:62::i;:::-;-1:-1:-1::0;;;;;26938:25:0;::::2;;::::0;;;:10:::2;:25;::::0;;;;;;;;:38:::2;;:103:::0;;;;27057:47;1199:25:1;;;27084:10:0::2;::::0;27057:47:::2;::::0;1172:18:1;27057:47:0::2;;;;;;;-1:-1:-1::0;;;;;27115:30:0;::::2;;::::0;;;:15:::2;:30;::::0;;;;:41;;27149:7;;27115:30;:41:::2;::::0;27149:7;;27115:41:::2;:::i;:::-;;;;;;;;24712:2452;;8010:1:::1;8046:13:::0;;8030:12;:29;8022:45;;;;-1:-1:-1;;;8022:45:0;;;;;;;:::i;20958:460::-;7951:1;7934:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;7963:20:0;7986:13;38842:6:::1;::::0;-1:-1:-1;;;38842:6:0;::::1;;;38841:7;38833:25;;;::::0;-1:-1:-1;;;38833:25:0;;13160:2:1;38833:25:0::1;::::0;::::1;13142:21:1::0;13199:1;13179:18;;;13172:29;-1:-1:-1;;;13217:18:1;;;13210:35;13262:18;;38833:25:0::1;12958:328:1::0;38833:25:0::1;21034:10:::2;38184:6;38179:483;38196:12;:19:::0;38192:23;::::2;38179:483;;;38237:13;38253:12;38266:1;38253:15;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;38253:15:0::2;::::0;-1:-1:-1;38324:21:0::2;38253:15:::0;38324:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;38283:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;;;;:38:::2;:62:::0;38395:31:::2;38294:5:::0;38395:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;38360:17:0;;::::2;;::::0;;;:10:::2;:17;::::0;;;;:32:::2;;:66:::0;;;;38445:21;::::2;::::0;38441:210:::2;;38513:24;38522:7;38531:5;38513:8;:24::i;:::-;-1:-1:-1::0;;;;;38487:16:0;;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;;:50;;;;38597:10:::2;:17:::0;;;;;;:38:::2;::::0;38556:31;;;:22:::2;:31:::0;;;;;:38;;;;;;;;;;:79;38441:210:::2;-1:-1:-1::0;38217:3:0;::::2;::::0;::::2;:::i;:::-;;;;38179:483;;;;21074:1:::3;21065:6;:10;21057:25;;;;-1:-1:-1::0;;;21057:25:0::3;;;;;;;:::i;:::-;21126:12;::::0;:24:::3;::::0;21143:6;21126:16:::3;:24::i;:::-;21111:12;:39:::0;21195:10:::3;21185:21;::::0;;;:9:::3;:21;::::0;;;;;:33:::3;::::0;21211:6;21185:25:::3;:33::i;:::-;21171:10;21161:21;::::0;;;:9:::3;:21;::::0;;;;:57;;;;21229:5:::3;::::0;:57:::3;::::0;-1:-1:-1;;;;;21229:5:0;;::::3;::::0;21272:4:::3;21279:6:::0;21229:22:::3;:57::i;:::-;21302:27;::::0;1199:25:1;;;21310:10:0::3;::::0;21302:27:::3;::::0;1187:2:1;1172:18;21302:27:0::3;;;;;;;21345:40;::::0;1199:25:1;;;21366:10:0::3;::::0;21362:1:::3;::::0;21345:40:::3;::::0;1187:2:1;1172:18;21345:40:0::3;1053:177:1::0;19417:194:0;-1:-1:-1;;;;;19561:25:0;;19493:7;19561:25;;;:10;:25;;;;;:41;;;;19520:36;;;;;:83;;:40;:83::i;33716:630::-;38739:2;;;;;;;;;-1:-1:-1;;;;;38739:2:0;-1:-1:-1;;;;;38739:7:0;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38727:21:0;:10;-1:-1:-1;;;;;38727:21:0;;38719:39;;;;-1:-1:-1;;;38719:39:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33863:23:0;::::1;;::::0;;;:8:::1;:23;::::0;;;;;::::1;;:32;::::0;::::1;:95;;-1:-1:-1::0;;;;;;33912:25:0;::::1;;::::0;;;:10:::1;:25;::::0;;;;:41:::1;;::::0;:46;33863:95:::1;33841:172;;;::::0;-1:-1:-1;;;33841:172:0;;17290:2:1;33841:172:0::1;::::0;::::1;17272:21:1::0;17329:1;17309:18;;;17302:29;-1:-1:-1;;;17347:18:1;;;17340:32;17389:18;;33841:172:0::1;17088:325:1::0;33841:172:0::1;34058:5;::::0;-1:-1:-1;;;;;34033:31:0;;::::1;34058:5:::0;::::1;34033:31;;34024:50;;;;-1:-1:-1::0;;;34024:50:0::1;;;;;;;:::i;:::-;34117:12;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;34117:32:0;;::::1;-1:-1:-1::0;;;;;;34117:32:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;34160:23:0;;;:8:::1;34117:32;34160:23:::0;;;;;;;:30;;-1:-1:-1;;34160:30:0::1;::::0;::::1;::::0;;34201:10:::1;:25:::0;;;;;;:66;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;34278:41;::::1;:60:::0;33716:630::o;27172:120::-;27224:13;27239;7951:1;7934:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;7963:20:0;7986:13;27272:12:::1;:10;:12::i;:::-;27265:19;;;;8046:13:::0;;8030:12;:29;8022:45;;;;-1:-1:-1;;;8022:45:0;;;;;;;:::i;:::-;7923:152;27172:120;;:::o;21887:86::-;21937:5;;:27;;-1:-1:-1;;;21937:27:0;;21953:10;21937:27;;;2164:51:1;21929:36:0;;-1:-1:-1;;;;;21937:5:0;;:15;;2137:18:1;;21937:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37420:441::-;37498:5;;-1:-1:-1;;;;;37498:5:0;37478:10;:26;37470:44;;;;-1:-1:-1;;;37470:44:0;;17620:2:1;37470:44:0;;;17602:21:1;17659:1;17639:18;;;17632:29;-1:-1:-1;;;17677:18:1;;;17670:35;17722:18;;37470:44:0;17418:328:1;37470:44:0;37565:5;;-1:-1:-1;;;;;37565:5:0;37543:11;37582:243;37595:11;:18;37593:20;;37582:243;;;37634:11;37648;37660:1;37648:14;;;;;;;;:::i;:::-;;;;;;;;;;37677:27;;-1:-1:-1;;;37677:27:0;;-1:-1:-1;;;;;37648:14:0;;;;-1:-1:-1;37648:14:0;;37677:19;;:27;;37697:3;;37677:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;37750:42:0;;-1:-1:-1;;;37750:42:0;;-1:-1:-1;;;;;37750:19:0;;;;;:42;;37770:2;;-1:-1:-1;;37774:17:0;37750:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37619:206;37614:3;;;;;:::i;:::-;;;;37582:243;;;-1:-1:-1;;37835:5:0;:18;;-1:-1:-1;;;;;;37835:18:0;-1:-1:-1;;;;;37835:18:0;;;;;;;;;;37420:441::o;22756:97::-;22811:10;22801:21;;;;:9;:21;;;;;;22792:31;;:8;:31::i;:::-;22834:11;:9;:11::i;18341:468::-;18409:7;18433:12;;18449:1;18433:17;18429:103;;;-1:-1:-1;;;;;;18474:25:0;;;;;:10;:25;;;;;;;;:46;;;18341:468::o;18429:103::-;18773:12;;-1:-1:-1;;;;;18721:25:0;;;;;;:10;:25;;;;;:36;;;;18675:40;;;;;18562:239;;18631:155;;18773:12;;18631:137;;18763:4;;18631:127;;18721:36;18631:127;;:39;18732:13;18631:24;:39::i;:85::-;:89;;:127::i;:155::-;-1:-1:-1;;;;;18562:25:0;;;;;;:10;:25;;;;;;;;:46;;;:50;:239::i;14990:28::-;;;;;;;;;;;;11964:191;12022:7;12055:1;12050;:6;;12042:32;;;;-1:-1:-1;;;12042:32:0;;17953:2:1;12042:32:0;;;17935:21:1;17992:2;17972:18;;;17965:30;-1:-1:-1;;;18011:18:1;;;18004:43;18064:18;;12042:32:0;17751:337:1;12042:32:0;12109:9;12121:5;12125:1;12121;:5;:::i;:::-;12109:17;11964:191;-1:-1:-1;;;;11964:191:0:o;12406:477::-;12464:7;12708:6;12704:47;;-1:-1:-1;12738:1:0;12731:8;;12704:47;12763:9;12775:5;12779:1;12775;:5;:::i;:::-;12763:17;-1:-1:-1;12808:1:0;12799:5;12803:1;12763:17;12799:5;:::i;:::-;:10;12791:36;;;;-1:-1:-1;;;12791:36:0;;18690:2:1;12791:36:0;;;18672:21:1;18729:2;18709:18;;;18702:30;-1:-1:-1;;;18748:18:1;;;18741:43;18801:18;;12791:36:0;18488:337:1;13351:339:0;13409:7;13508:1;13504;:5;13496:30;;;;-1:-1:-1;;;13496:30:0;;19032:2:1;13496:30:0;;;19014:21:1;19071:2;19051:18;;;19044:30;-1:-1:-1;;;19090:18:1;;;19083:42;19142:18;;13496:30:0;18830:336:1;13496:30:0;13557:9;13569:5;13573:1;13569;:5;:::i;11501:188::-;11559:7;;11591:5;11595:1;11591;:5;:::i;:::-;11579:17;;11620:1;11615;:6;;11607:32;;;;-1:-1:-1;;;11607:32:0;;19373:2:1;11607:32:0;;;19355:21:1;19412:2;19392:18;;;19385:30;-1:-1:-1;;;19431:18:1;;;19424:43;19484:18;;11607:32:0;19171:337:1;8176:176:0;8259:85;8278:5;8308:23;;;8333:2;8337:5;8285:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;8285:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;8285:58:0;-1:-1:-1;;;;;;8285:58:0;;;;;;;;;;8259:18;:85::i;8360:204::-;8487:68;;-1:-1:-1;;;;;19771:15:1;;;8487:68:0;;;19753:34:1;19823:15;;19803:18;;;19796:43;19855:18;;;19848:34;;;8461:95:0;;8480:5;;-1:-1:-1;;;8510:27:0;19688:18:1;;8487:68:0;19513:375:1;8461:95:0;8360:204;;;;:::o;23481:370::-;7951:1;7934:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;7963:20:0;7986:13;;;23579:7;;38179:483:::1;38196:12;:19:::0;38192:23;::::1;38179:483;;;38237:13;38253:12;38266:1;38253:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38253:15:0::1;::::0;-1:-1:-1;38324:21:0::1;38253:15:::0;38324:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;38283:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;:38:::1;:62:::0;38395:31:::1;38294:5:::0;38395:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;38360:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:32:::1;;:66:::0;;;;38445:21;::::1;::::0;38441:210:::1;;38513:24;38522:7;38531:5;38513:8;:24::i;:::-;-1:-1:-1::0;;;;;38487:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:23;;::::1;::::0;;;;;;;;;:50;;;;38597:10:::1;:17:::0;;;;;;:38:::1;::::0;38556:31;;;:22:::1;:31:::0;;;;;:38;;;;;;;;;;:79;38441:210:::1;-1:-1:-1::0;38217:3:0;::::1;::::0;::::1;:::i;:::-;;;;38179:483;;;;23604:6:::2;23599:222;23616:7;:14;23612:1;:18;23599:222;;;23652:21;23676:7;23684:1;23676:10;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;23719:16:0;;::::2;23701:15;23719:16:::0;;;:7:::2;:16:::0;;;;;;:31;;::::2;::::0;;;;;;;;;;23676:10;;-1:-1:-1;23765:44:0::2;23727:7:::0;23676:10;23719:31;23765:11:::2;:44::i;:::-;23637:184;;23632:3;;;;;:::i;:::-;;;;23599:222;;;;23831:12;:10;:12::i;:::-;;;8010:1:::1;8046:13:::0;;8030:12;:29;8022:45;;;;-1:-1:-1;;;8022:45:0;;;;;;;:::i;23859:730::-;23944:8;;23940:642;;-1:-1:-1;;;;;23969:13:0;;;23992:1;23969:13;;;:7;:13;;;;;;;;:20;;;;;;;;;;:24;;;;24020:10;;;;;24011:19;24008:431;;;24060:10;;24092:8;;24089:243;;24125:12;24140:27;24163:3;24142:14;:4;24151;24142:8;:14::i;24140:27::-;24190:2;;24218:13;;24190:48;;-1:-1:-1;;;24190:48:0;;;;;20095:25:1;;;20136:18;;;20129:34;;;;-1:-1:-1;;;;;20199:32:1;;;20179:18;;;20172:60;24125:42:0;;-1:-1:-1;24190:2:0;;;:18;;20068::1;;24190:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24261:51:0;24288:4;24294:17;:4;24303:7;24294:8;:17::i;:::-;-1:-1:-1;;;;;24261:26:0;;;:51;:26;:51::i;:::-;24102:230;24089:243;24032:315;24008:431;;;24385:38;-1:-1:-1;;;;;24385:26:0;;24412:4;24418;24385:26;:38::i;:::-;24478:4;-1:-1:-1;;;;;24458:31:0;24471:5;-1:-1:-1;;;;;24458:31:0;;24484:4;24458:31;;;;1199:25:1;;1187:2;1172:18;;1053:177;24458:31:0;;;;;;;;-1:-1:-1;;;;;24504:14:0;;;;;;:7;:14;;;;;:22;;24522:4;;24504:14;:22;;24522:4;;24504:22;:::i;:::-;;;;-1:-1:-1;;;;;;;24541:14:0;;;;;;;:8;:14;;;;;;;;:21;;;;;;;;;;;:29;;24566:4;;24541:14;:29;;24566:4;;24541:29;:::i;:::-;;;;-1:-1:-1;;23859:730:0;;;:::o;27300:6350::-;27340:13;27355;27382:10;27395:5;;;;;;;;;-1:-1:-1;;;;;27395:5:0;-1:-1:-1;;;;;27395:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27382:43;;27436:12;27459:1;27451:5;:9;:50;;27499:1;27451:50;;;27463:5;;;;;;;;;-1:-1:-1;;;;;27463:5:0;-1:-1:-1;;;;;27463:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27582:9;;27436:65;;-1:-1:-1;;;;27582:9:0;;;;27577:3280;;27835:11;:18;27824:8;27835:18;27890:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27890:17:0;;27865:42;;27919:23;27956:3;27945:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27945:15:0;;27919:41;;27976:7;27972:490;27990:3;27985:2;:8;27972:490;;;28038:11;28050:2;28038:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28038:15:0;28017:6;28024:2;28017:10;;;;;;;;:::i;:::-;;;;;;:38;-1:-1:-1;;;;;28017:38:0;;;-1:-1:-1;;;;;28017:38:0;;;;;28369:1;-1:-1:-1;;;;;28338:33:0;28346:6;28353:2;28346:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28338:33:0;;:111;;28414:6;28421:2;28414:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;28414:35:0;;28443:4;28414:35;;;2164:51:1;-1:-1:-1;;;;;28414:20:0;;;;;;2137:18:1;;28414:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28338:111;;;28392:1;28338:111;28304:9;28314:2;28304:13;;;;;;;;:::i;:::-;;;;;;;;;;:145;27995:4;;;;:::i;:::-;;;;27972:490;;;-1:-1:-1;28494:5:0;;28480:33;;;-1:-1:-1;;;28480:33:0;;;;-1:-1:-1;;;;;28494:5:0;;;;28480:31;;:33;;;;;;;;;;;;;28494:5;;28480:33;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28480:33:0;;;;;;;;-1:-1:-1;;28480:33:0;;;;;;;;;;;;:::i;:::-;;;28476:2370;;-1:-1:-1;30825:1:0;;;;-1:-1:-1;27300:6350:0;-1:-1:-1;;;;;27300:6350:0:o;28476:2370::-;;;28757:7;28753:1923;28775:3;28770:2;:8;28753:1923;;;28872:7;28935:1;-1:-1:-1;;;;;28904:33:0;28912:6;28919:2;28912:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;28904:33:0;;:119;;28988:6;28995:2;28988:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;28988:35:0;;29017:4;28988:35;;;2164:51:1;-1:-1:-1;;;;;28988:20:0;;;;;;2137:18:1;;28988:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28904:119;;;28962:1;28904:119;28872:151;;29263:9;29273:2;29263:13;;;;;;;;:::i;:::-;;;;;;;29258:2;:18;29255:1339;;;29391:1;29385:3;29376:5;29359:9;29369:2;29359:13;;;;;;;;:::i;:::-;;;;;;;29354:2;:18;;;;:::i;:::-;29353:28;;;;:::i;:::-;29351:37;;;;:::i;:::-;:41;29347:370;;;29425:6;29432:2;29425:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29425:19:0;;29445:4;29488:3;29479:5;29454:21;29461:9;29471:2;29461:13;;;;;;;;:::i;:::-;;;;;;;29454:2;:6;;:21;;;;:::i;:::-;29453:31;;;;:::i;:::-;29451:40;;;;:::i;:::-;29425:68;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29566:6;29573:2;29566:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29529:89:0;29553:4;-1:-1:-1;;;;;29529:89:0;29542:10;-1:-1:-1;;;;;29529:89:0;;29614:3;29605:5;29580:21;29587:9;29597:2;29587:13;;;;;;;;:::i;:::-;;;;;;;29580:2;:6;;:21;;;;:::i;:::-;29579:31;;;;:::i;:::-;29578:39;;;;:::i;:::-;29529:89;;1199:25:1;;;1187:2;1172:18;29529:89:0;;;;;;;29654:6;29661:2;29654:10;;;;;;;;:::i;:::-;;;;;;;;;;;:35;;-1:-1:-1;;;29654:35:0;;29683:4;29654:35;;;2164:51:1;-1:-1:-1;;;;;29654:20:0;;;;;;2137:18:1;;29654:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29649:40;;29347:370;29796:8;;-1:-1:-1;;;;;29796:8:0;29792:779;;29851:5;;29885:10;;-1:-1:-1;;;;;29851:5:0;;;;:24;;29885:6;;29892:2;;29885:10;;;;;;:::i;:::-;;;;;;;29899:21;29906:9;29916:2;29906:13;;;;;;;;:::i;:::-;;;;;;;29899:2;:6;;:21;;;;:::i;:::-;29851:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30005:6;30012:2;30005:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29959:81:0;29989:5;;;;;;;;;-1:-1:-1;;;;;29989:5:0;-1:-1:-1;;;;;29959:81:0;29969:10;-1:-1:-1;;;;;29959:81:0;-1:-1:-1;;;;;;;;;;;30024:9:0;30034:2;30024:13;;;;;;;;:::i;:::-;;;;;;;30019:2;:18;;;;:::i;:::-;29959:81;;1199:25:1;;;1187:2;1172:18;29959:81:0;;;;;;;30120:9;30130:2;30120:13;;;;;;;;:::i;:::-;;;;;;;30115:2;:18;;;;:::i;:::-;30071:16;:39;30097:6;30104:2;30097:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30071:39:0;-1:-1:-1;;;;;30071:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;29792:779:0;;-1:-1:-1;29792:779:0;;30283:6;30290:2;30283:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30283:19:0;;30303:8;;;;;;;;;-1:-1:-1;;;;;30303:8:0;30314:21;30321:9;30331:2;30321:13;;;;;;;;:::i;30314:21::-;30283:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30414:6;30421:2;30414:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30374:75:0;30396:8;;;;;;;;;-1:-1:-1;;;;;30396:8:0;-1:-1:-1;;;;;30374:75:0;30384:10;-1:-1:-1;;;;;30374:75:0;-1:-1:-1;;;;;;;;;;;30433:9:0;30443:2;30433:13;;;;;;;;:::i;:::-;;;;;;;30428:2;:18;;;;:::i;:::-;30374:75;;1199:25:1;;;1187:2;1172:18;30374:75:0;;;;;;;30529:9;30539:2;30529:13;;;;;;;;:::i;:::-;;;;;;;30524:2;:18;;;;:::i;:::-;30480:16;:39;30506:6;30513:2;30506:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;30480:39:0;-1:-1:-1;;;;;30480:39:0;;;;;;;;;;;;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;29792:779:0;-1:-1:-1;28780:4:0;;;;:::i;:::-;;;;28753:1923;;;-1:-1:-1;30702:1:0;;;;-1:-1:-1;27300:6350:0;-1:-1:-1;;;;;;27300:6350:0:o;27577:3280::-;31024:5;;31010:30;;;-1:-1:-1;;;31010:30:0;;;;30974:15;;;;-1:-1:-1;;;;;31024:5:0;;;;31010:28;;:30;;;;;;;;;;;30974:15;31024:5;31010:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31121:40;;-1:-1:-1;;;31121:40:0;;31155:4;31121:40;;;2164:51:1;30973:67:0;;-1:-1:-1;30973:67:0;-1:-1:-1;31109:9:0;;-1:-1:-1;;;;;31121:25:0;;;;;2137:18:1;;31121:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31184;;-1:-1:-1;;;31184:40:0;;31218:4;31184:40;;;2164:51:1;31109:52:0;;-1:-1:-1;31172:9:0;;-1:-1:-1;;;;;31184:25:0;;;;;2137:18:1;;31184:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31287:5;;31273:33;;;-1:-1:-1;;;31273:33:0;;;;31172:52;;-1:-1:-1;;;;;;31287:5:0;;;;31273:31;;:33;;;;;;;;;;;;31287:5;;31273:33;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31273:33:0;;;;;;;;-1:-1:-1;;31273:33:0;;;;;;;;;;;;:::i;:::-;;;31269:2374;;-1:-1:-1;33626:1:0;;;;-1:-1:-1;27300:6350:0;-1:-1:-1;;;;;;27300:6350:0:o;31269:2374::-;-1:-1:-1;;31333:40:0;;-1:-1:-1;;;31333:40:0;;31367:4;31333:40;;;2164:51:1;31376:4:0;;-1:-1:-1;;;;;31333:25:0;;;;;2137:18:1;;31333:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;31406:40;;-1:-1:-1;;;31406:40:0;;31440:4;31406:40;;;2164:51:1;31322:58:0;;-1:-1:-1;31449:4:0;;-1:-1:-1;;;;;31406:25:0;;;;;2137:18:1;;31406:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;31395:58;-1:-1:-1;31609:1:0;31603:3;31583:16;31594:5;31583:8;:16;:::i;:::-;31581:25;;;;:::i;:::-;:29;31577:285;;;-1:-1:-1;;;;;31631:24:0;;;31656:4;31679:3;31663:14;31672:5;31663:8;:14;:::i;:::-;31662:20;;;;:::i;:::-;31631:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;31708:58:0;;;;;;31721:10;31708:58;31762:3;31746:14;31755:5;31746:8;:14;:::i;:::-;31745:20;;;;:::i;:::-;31708:58;;1199:25:1;;;1187:2;1172:18;31708:58:0;;;;;;;31796:40;;-1:-1:-1;;;31796:40:0;;31830:4;31796:40;;;2164:51:1;31796:50:0;;31841:4;;-1:-1:-1;;;;;31796:25:0;;;;;2137:18:1;;31796:40:0;1997:224:1;31796:50:0;31785:61;;31577:285;31908:1;31902:3;31882:16;31893:5;31882:8;:16;:::i;:::-;31880:25;;;;:::i;:::-;:29;31876:285;;;-1:-1:-1;;;;;31930:24:0;;;31955:4;31978:3;31962:14;31971:5;31962:8;:14;:::i;:::-;31961:20;;;;:::i;:::-;31930:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;32007:58:0;;;;;;32020:10;32007:58;32061:3;32045:14;32054:5;32045:8;:14;:::i;:::-;32044:20;;;;:::i;:::-;32007:58;;1199:25:1;;;1187:2;1172:18;32007:58:0;;;;;;;32095:40;;-1:-1:-1;;;32095:40:0;;32129:4;32095:40;;;2164:51:1;32095:50:0;;32140:4;;-1:-1:-1;;;;;32095:25:0;;;;;2137:18:1;;32095:40:0;1997:224:1;32095:50:0;32084:61;;31876:285;32212:8;;-1:-1:-1;;;;;32212:8:0;32208:1224;;32256:12;;32252:291;;32290:5;;:43;;-1:-1:-1;;;32290:43:0;;-1:-1:-1;;;;;32290:5:0;;;;:24;;:43;;32315:7;;32324:8;;32290:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;32353:27:0;;;;;;:16;:27;;;;;:39;;32384:8;;32353:27;:39;;32384:8;;32353:39;:::i;:::-;;;;-1:-1:-1;;32500:5:0;;32470:56;;1199:25:1;;;-1:-1:-1;;;;;32470:56:0;;;;32500:5;;32480:10;;-1:-1:-1;;;;;;;;;;;32470:56:0;1187:2:1;1172:18;32470:56:0;;;;;;;32252:291;32562:12;;32558:291;;32596:5;;:43;;-1:-1:-1;;;32596:43:0;;-1:-1:-1;;;;;32596:5:0;;;;:24;;:43;;32621:7;;32630:8;;32596:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;32659:27:0;;;;;;:16;:27;;;;;:39;;32690:8;;32659:27;:39;;32690:8;;32659:39;:::i;:::-;;;;-1:-1:-1;;32806:5:0;;32776:56;;1199:25:1;;;-1:-1:-1;;;;;32776:56:0;;;;32806:5;;32786:10;;-1:-1:-1;;;;;;;;;;;32776:56:0;1187:2:1;1172:18;32776:56:0;;;;;;;32558:291;32208:1224;;;32973:8;;32948:44;;-1:-1:-1;;;32948:44:0;;-1:-1:-1;;;;;32948:24:0;;;;;;:44;;32973:8;;;;32983;;32948:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33033:8:0;;33008:44;;-1:-1:-1;;;33008:44:0;;-1:-1:-1;;;;;33008:24:0;;;;;;:44;;33033:8;;;;33043;;33008:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;33098:8:0;;33076:50;;1199:25:1;;;-1:-1:-1;;;;;33076:50:0;;;;33098:8;;33086:10;;-1:-1:-1;;;;;;;;;;;33076:50:0;1187:2:1;1172:18;33076:50:0;;;;;;;33172:8;;33150:50;;1199:25:1;;;-1:-1:-1;;;;;33150:50:0;;;;33172:8;;33160:10;;-1:-1:-1;;;;;;;;;;;33150:50:0;1187:2:1;1172:18;33150:50:0;;;;;;;-1:-1:-1;;;;;33219:27:0;;;;;;:16;:27;;;;;:39;;33250:8;;33219:27;:39;;33250:8;;33219:39;:::i;:::-;;;;-1:-1:-1;;;;;;;33327:27:0;;;;;;:16;:27;;;;;:39;;33358:8;;33327:27;:39;;33358:8;;33327:39;:::i;:::-;;;;-1:-1:-1;;32208:1224:0;33448:27;;;;;;27300:6350;;:::o;6755:106::-;6813:7;6844:1;6840;:5;:13;;6852:1;6840:13;;;-1:-1:-1;6848:1:0;;6755:106;-1:-1:-1;6755:106:0:o;10147:1092::-;-1:-1:-1;;;;;10751:25:0;;6423:20;10743:63;;;;-1:-1:-1;;;10743:63:0;;21085:2:1;10743:63:0;;;21067:21:1;21124:2;21104:18;;;21097:30;21163:25;21143:18;;;21136:53;21206:18;;10743:63:0;20883:347:1;10743:63:0;10880:12;10894:23;10929:5;-1:-1:-1;;;;;10921:19:0;10941:4;10921:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10879:67;;;;10965:7;10957:39;;;;-1:-1:-1;;;10957:39:0;;21716:2:1;10957:39:0;;;21698:21:1;21755:2;21735:18;;;21728:30;-1:-1:-1;;;21774:18:1;;;21767:49;21833:18;;10957:39:0;21514:343:1;10957:39:0;11035:17;;:21;11031:201;;11177:10;11166:30;;;;;;;;;;;;:::i;:::-;11158:62;;;;-1:-1:-1;;;11158:62:0;;22064:2:1;11158:62:0;;;22046:21:1;22103:2;22083:18;;;22076:30;-1:-1:-1;;;22122:18:1;;;22115:49;22181:18;;11158:62:0;21862:343:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:258::-;474:1;484:113;498:6;495:1;492:13;484:113;;;574:11;;;568:18;555:11;;;548:39;520:2;513:10;484:113;;;615:6;612:1;609:13;606:48;;;-1:-1:-1;;650:1:1;632:16;;625:27;402:258::o;665:383::-;814:2;803:9;796:21;777:4;846:6;840:13;889:6;884:2;873:9;869:18;862:34;905:66;964:6;959:2;948:9;944:18;939:2;931:6;927:15;905:66;:::i;:::-;1032:2;1011:15;-1:-1:-1;;1007:29:1;992:45;;;;1039:2;988:54;;665:383;-1:-1:-1;;665:383:1:o;1235:388::-;1303:6;1311;1364:2;1352:9;1343:7;1339:23;1335:32;1332:52;;;1380:1;1377;1370:12;1332:52;1419:9;1406:23;1438:31;1463:5;1438:31;:::i;:::-;1488:5;-1:-1:-1;1545:2:1;1530:18;;1517:32;1558:33;1517:32;1558:33;:::i;:::-;1610:7;1600:17;;;1235:388;;;;;:::o;1628:118::-;1714:5;1707:13;1700:21;1693:5;1690:32;1680:60;;1736:1;1733;1726:12;1751:241;1807:6;1860:2;1848:9;1839:7;1835:23;1831:32;1828:52;;;1876:1;1873;1866:12;1828:52;1915:9;1902:23;1934:28;1956:5;1934:28;:::i;2226:315::-;2294:6;2302;2355:2;2343:9;2334:7;2330:23;2326:32;2323:52;;;2371:1;2368;2361:12;2323:52;2410:9;2397:23;2429:31;2454:5;2429:31;:::i;:::-;2479:5;2531:2;2516:18;;;;2503:32;;-1:-1:-1;;;2226:315:1:o;2546:180::-;2605:6;2658:2;2646:9;2637:7;2633:23;2629:32;2626:52;;;2674:1;2671;2664:12;2626:52;-1:-1:-1;2697:23:1;;2546:180;-1:-1:-1;2546:180:1:o;2731:127::-;2792:10;2787:3;2783:20;2780:1;2773:31;2823:4;2820:1;2813:15;2847:4;2844:1;2837:15;2863:275;2934:2;2928:9;2999:2;2980:13;;-1:-1:-1;;2976:27:1;2964:40;;3034:18;3019:34;;3055:22;;;3016:62;3013:88;;;3081:18;;:::i;:::-;3117:2;3110:22;2863:275;;-1:-1:-1;2863:275:1:o;3143:787::-;3197:5;3250:3;3243:4;3235:6;3231:17;3227:27;3217:55;;3268:1;3265;3258:12;3217:55;3304:6;3291:20;3330:4;3353:18;3349:2;3346:26;3343:52;;;3375:18;;:::i;:::-;3421:2;3418:1;3414:10;3444:28;3468:2;3464;3460:11;3444:28;:::i;:::-;3506:15;;;3576;;;3572:24;;;3537:12;;;;3608:15;;;3605:35;;;3636:1;3633;3626:12;3605:35;3672:2;3664:6;3660:15;3649:26;;3684:217;3700:6;3695:3;3692:15;3684:217;;;3780:3;3767:17;3797:31;3822:5;3797:31;:::i;:::-;3841:18;;3717:12;;;;3879;;;;3684:217;;;3919:5;3143:787;-1:-1:-1;;;;;;;3143:787:1:o;3935:483::-;4028:6;4036;4089:2;4077:9;4068:7;4064:23;4060:32;4057:52;;;4105:1;4102;4095:12;4057:52;4144:9;4131:23;4163:31;4188:5;4163:31;:::i;:::-;4213:5;-1:-1:-1;4269:2:1;4254:18;;4241:32;4296:18;4285:30;;4282:50;;;4328:1;4325;4318:12;4282:50;4351:61;4404:7;4395:6;4384:9;4380:22;4351:61;:::i;:::-;4341:71;;;3935:483;;;;;:::o;4867:248::-;4935:6;4943;4996:2;4984:9;4975:7;4971:23;4967:32;4964:52;;;5012:1;5009;5002:12;4964:52;-1:-1:-1;;5035:23:1;;;5105:2;5090:18;;;5077:32;;-1:-1:-1;4867:248:1:o;6100:348::-;6184:6;6237:2;6225:9;6216:7;6212:23;6208:32;6205:52;;;6253:1;6250;6243:12;6205:52;6293:9;6280:23;6326:18;6318:6;6315:30;6312:50;;;6358:1;6355;6348:12;6312:50;6381:61;6434:7;6425:6;6414:9;6410:22;6381:61;:::i;6661:456::-;6738:6;6746;6754;6807:2;6795:9;6786:7;6782:23;6778:32;6775:52;;;6823:1;6820;6813:12;6775:52;6859:9;6846:23;6836:33;;6919:2;6908:9;6904:18;6891:32;6932:31;6957:5;6932:31;:::i;:::-;6982:5;-1:-1:-1;7039:2:1;7024:18;;7011:32;7052:33;7011:32;7052:33;:::i;:::-;7104:7;7094:17;;;6661:456;;;;;:::o;7122:::-;7199:6;7207;7215;7268:2;7256:9;7247:7;7243:23;7239:32;7236:52;;;7284:1;7281;7274:12;7236:52;7323:9;7310:23;7342:31;7367:5;7342:31;:::i;:::-;7392:5;-1:-1:-1;7449:2:1;7434:18;;7421:32;7462:33;7421:32;7462:33;:::i;:::-;7122:456;;7514:7;;-1:-1:-1;;;7568:2:1;7553:18;;;;7540:32;;7122:456::o;7836:251::-;7906:6;7959:2;7947:9;7938:7;7934:23;7930:32;7927:52;;;7975:1;7972;7965:12;7927:52;8007:9;8001:16;8026:31;8051:5;8026:31;:::i;8092:328::-;8294:2;8276:21;;;8333:1;8313:18;;;8306:29;-1:-1:-1;;;8366:2:1;8351:18;;8344:35;8411:2;8396:18;;8092:328::o;8756:::-;8958:2;8940:21;;;8997:1;8977:18;;;8970:29;-1:-1:-1;;;9030:2:1;9015:18;;9008:35;9075:2;9060:18;;8756:328::o;9089:274::-;-1:-1:-1;;;;;9281:32:1;;;;9263:51;;9345:2;9330:18;;9323:34;9251:2;9236:18;;9089:274::o;9368:245::-;9435:6;9488:2;9476:9;9467:7;9463:23;9459:32;9456:52;;;9504:1;9501;9494:12;9456:52;9536:9;9530:16;9555:28;9577:5;9555:28;:::i;9618:706::-;9698:6;9751:2;9739:9;9730:7;9726:23;9722:32;9719:52;;;9767:1;9764;9757:12;9719:52;9800:9;9794:16;9829:18;9870:2;9862:6;9859:14;9856:34;;;9886:1;9883;9876:12;9856:34;9924:6;9913:9;9909:22;9899:32;;9969:7;9962:4;9958:2;9954:13;9950:27;9940:55;;9991:1;9988;9981:12;9940:55;10020:2;10014:9;10042:2;10038;10035:10;10032:36;;;10048:18;;:::i;:::-;10090:53;10133:2;10114:13;;-1:-1:-1;;10110:27:1;10139:2;10106:36;10090:53;:::i;:::-;10077:66;;10166:2;10159:5;10152:17;10206:7;10201:2;10196;10192;10188:11;10184:20;10181:33;10178:53;;;10227:1;10224;10217:12;10178:53;10240:54;10291:2;10286;10279:5;10275:14;10270:2;10266;10262:11;10240:54;:::i;:::-;-1:-1:-1;10313:5:1;9618:706;-1:-1:-1;;;;9618:706:1:o;10329:435::-;-1:-1:-1;;;10586:3:1;10579:31;10561:3;10639:6;10633:13;10655:62;10710:6;10705:2;10700:3;10696:12;10689:4;10681:6;10677:17;10655:62;:::i;:::-;10737:16;;;;10755:2;10733:25;;10329:435;-1:-1:-1;;10329:435:1:o;11430:127::-;11491:10;11486:3;11482:20;11479:1;11472:31;11522:4;11519:1;11512:15;11546:4;11543:1;11536:15;11562:128;11602:3;11633:1;11629:6;11626:1;11623:13;11620:39;;;11639:18;;:::i;:::-;-1:-1:-1;11675:9:1;;11562:128::o;11695:127::-;11756:10;11751:3;11747:20;11744:1;11737:31;11787:4;11784:1;11777:15;11811:4;11808:1;11801:15;11827:135;11866:3;-1:-1:-1;;11887:17:1;;11884:43;;;11907:18;;:::i;:::-;-1:-1:-1;11954:1:1;11943:13;;11827:135::o;11967:325::-;12169:2;12151:21;;;12208:1;12188:18;;;12181:29;-1:-1:-1;;;12241:2:1;12226:18;;12219:32;12283:2;12268:18;;11967:325::o;12627:326::-;12829:2;12811:21;;;12868:1;12848:18;;;12841:29;-1:-1:-1;;;12901:2:1;12886:18;;12879:33;12944:2;12929:18;;12627:326::o;13291:184::-;13361:6;13414:2;13402:9;13393:7;13389:23;13385:32;13382:52;;;13430:1;13427;13420:12;13382:52;-1:-1:-1;13453:16:1;;13291:184;-1:-1:-1;13291:184:1:o;13829:273::-;13897:6;13950:2;13938:9;13929:7;13925:23;13921:32;13918:52;;;13966:1;13963;13956:12;13918:52;13998:9;13992:16;14048:4;14041:5;14037:16;14030:5;14027:27;14017:55;;14068:1;14065;14058:12;15056:125;15096:4;15124:1;15121;15118:8;15115:34;;;15129:18;;:::i;:::-;-1:-1:-1;15166:9:1;;15056:125::o;15186:127::-;15247:10;15242:3;15238:20;15235:1;15228:31;15278:4;15275:1;15268:15;15302:4;15299:1;15292:15;15318:420;-1:-1:-1;;;15575:3:1;15568:18;15550:3;15615:6;15609:13;15631:61;15685:6;15681:1;15676:3;15672:11;15665:4;15657:6;15653:17;15631:61;:::i;:::-;15712:16;;;;15730:1;15708:24;;15318:420;-1:-1:-1;;15318:420:1:o;18093:168::-;18133:7;18199:1;18195;18191:6;18187:14;18184:1;18181:21;18176:1;18169:9;18162:17;18158:45;18155:71;;;18206:18;;:::i;:::-;-1:-1:-1;18246:9:1;;18093:168::o;18266:217::-;18306:1;18332;18322:132;;18376:10;18371:3;18367:20;18364:1;18357:31;18411:4;18408:1;18401:15;18439:4;18436:1;18429:15;18322:132;-1:-1:-1;18468:9:1;;18266:217::o;20243:245::-;20322:6;20330;20383:2;20371:9;20362:7;20358:23;20354:32;20351:52;;;20399:1;20396;20389:12;20351:52;-1:-1:-1;;20422:16:1;;20478:2;20463:18;;;20457:25;20422:16;;20457:25;;-1:-1:-1;20243:245:1:o;20493:385::-;20572:6;20580;20633:2;20621:9;20612:7;20608:23;20604:32;20601:52;;;20649:1;20646;20639:12;20601:52;20681:9;20675:16;20700:31;20725:5;20700:31;:::i;:::-;20800:2;20785:18;;20779:25;20750:5;;-1:-1:-1;20813:33:1;20779:25;20813:33;:::i;21235:274::-;21364:3;21402:6;21396:13;21418:53;21464:6;21459:3;21452:4;21444:6;21440:17;21418:53;:::i;:::-;21487:16;;;;;21235:274;-1:-1:-1;;21235:274:1:o

Swarm Source

ipfs://27e16db70021782cf8493b168033bc999b4e2d303e5694723810d2afb42e4088
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.