ETH Price: $2,574.34 (+1.60%)
Gas: 2.09 Gwei

Token

Stable Yield Credit (yCREDIT)
 

Overview

Max Total Supply

13,727,869,276,381,378.41484504 yCREDIT

Holders

186

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Filtered by Token Holder
niktrix.eth
Balance
0.26267963 yCREDIT

Value
$0.00
0xcf1e4c0455e69c3a82c2344648be76c72dbcda06
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
StableYieldCredit

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-31
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library SafeERC20 {
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

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

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

interface Oracle {
    function getPriceUSD(address reserve) external view returns (uint);
}

interface ISushiswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface ISushiswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}



library SushiswapV2Library {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'SushiswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'SushiswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
            )))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ISushiswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
    

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'SushiswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'SushiswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = amountA * reserveB / reserveA;
    }
}

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

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

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

contract StableYieldCredit is ReentrancyGuard {
    using SafeERC20 for IERC20;

    /// @notice EIP-20 token name for this token
    string public constant name = "Stable Yield Credit";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "yCREDIT";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 8;

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 0;
    
    /// @notice Total number of tokens staked for yield
    uint public stakedSupply = 0;

    mapping(address => mapping (address => uint)) internal allowances;
    mapping(address => uint) internal balances;
    mapping(address => uint) public stakes;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint chainId,address verifyingContract)");
    bytes32 public immutable DOMAINSEPARATOR;

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint value,uint nonce,uint deadline)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint amount);
    
    /// @notice Stake event for claiming rewards
    event Staked(address indexed from, uint amount);
    
    // @notice Unstake event
    event Unstaked(address indexed from, uint amount);
    
    event Earned(address indexed from, uint amount);
    event Fees(uint amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint amount);

    // Oracle used for price debt data (external to the AMM balance to avoid internal manipulation)
    Oracle public constant LINK = Oracle(0x271bf4568fb737cc2e6277e9B1EE0034098cDA2a);
    ISushiswapV2Factory public constant FACTORY = ISushiswapV2Factory(0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac);
    
    // user => token => collateral
    mapping (address => mapping(address => uint)) public collateral;
    // user => token => credit
    mapping (address => mapping(address => uint)) public collateralCredit;
    
    address[] private _markets;
    mapping (address => bool) pairs;
    
    uint public rewardRate = 0;
    uint public periodFinish = 0;
    uint public DURATION = 7 days;
    uint public lastUpdateTime;
    uint public rewardPerTokenStored;
    
    mapping(address => uint) public userRewardPerTokenPaid;
    mapping(address => uint) public rewards;
    
    event Deposit(address indexed creditor, address indexed collateral, uint creditOut, uint amountIn, uint creditMinted);
    event Withdraw(address indexed creditor, address indexed collateral, uint creditIn, uint creditOut, uint amountOut);
    
    constructor () {
        DOMAINSEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), _getChainId(), address(this)));
    }
    
    uint public FEE = 50;
    uint public BASE = 10000;
    
    function lastTimeRewardApplicable() public view returns (uint) {
        return Math.min(block.timestamp, periodFinish);
    }
    
    function rewardPerToken() public view returns (uint) {
        if (stakedSupply == 0) {
            return rewardPerTokenStored;
        }
        return
            rewardPerTokenStored +
                ((lastTimeRewardApplicable() - 
                lastUpdateTime) * 
                rewardRate * 1e18 / stakedSupply);
    }
    
    function earned(address account) public view returns (uint) {
        return (stakes[account] * (rewardPerToken() - userRewardPerTokenPaid[account]) / 1e18) + rewards[account];
    }

    function getRewardForDuration() external view returns (uint) {
        return rewardRate * DURATION;
    }
    
    modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
        }
        _;
    }
    
    function stake(uint256 amount) external nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        stakedSupply += amount;
        stakes[msg.sender] += amount;
        _transferTokens(msg.sender, address(this), amount);
        emit Staked(msg.sender, amount);
    }

    function unstake(uint amount) public nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        stakedSupply -= amount;
        stakes[msg.sender] -= amount;
        _transferTokens(address(this), msg.sender, amount);
        emit Unstaked(msg.sender, amount);
    }

    function getReward() public nonReentrant updateReward(msg.sender) {
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            _transferTokens(address(this), msg.sender, reward);
            emit Earned(msg.sender, reward);
        }
    }

    function exit() external {
        unstake(stakes[msg.sender]);
        getReward();
    }
    
    function notifyFeeAmount(uint reward) internal updateReward(address(0)) {
        if (block.timestamp >= periodFinish) {
            rewardRate = reward / DURATION;
        } else {
            uint remaining = periodFinish - block.timestamp;
            uint leftover = remaining * rewardRate;
            rewardRate = (reward + leftover) / DURATION;
        }

        // Ensure the provided reward amount is not more than the balance in the contract.
        // This keeps the reward rate in the right range, preventing overflows due to
        // very high values of rewardRate in the earned and rewardsPerToken functions;
        // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
        uint balance = balances[address(this)];
        require(rewardRate <= balance / DURATION, "Provided reward too high");

        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp + DURATION;
        emit Fees(reward);
    }
    
    function markets() external view returns (address[] memory) {
        return _markets;
    }
    
    function _mint(address dst, uint amount) internal {
        // mint the amount
        totalSupply += amount;
        // transfer the amount to the recipient
        balances[dst] += amount;
        emit Transfer(address(0), dst, amount);
    }
    
    function _burn(address dst, uint amount) internal {
        // burn the amount
        totalSupply -= amount;
        // transfer the amount from the recipient
        balances[dst] -= amount;
        emit Transfer(dst, address(0), amount);
    }
    
    function depositAll(IERC20 token) external {
        _deposit(token, token.balanceOf(msg.sender));
    }
    
    function deposit(IERC20 token, uint amount) external {
        _deposit(token, amount);
    }
    
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired
    ) internal virtual returns (address pair, uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        pair = FACTORY.getPair(tokenA, tokenB);
        if (pair == address(0)) {
            pair = FACTORY.createPair(tokenA, tokenB);
            pairs[pair] = true;
            _markets.push(tokenA);
        } else if (!pairs[pair]) {
            pairs[pair] = true;
            _markets.push(tokenA);
        }
        
        (uint reserveA, uint reserveB) = SushiswapV2Library.getReserves(address(FACTORY), tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = SushiswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = SushiswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    
    function _deposit(IERC20 token, uint amount) internal {
        uint _value = LINK.getPriceUSD(address(token)) * amount / uint256(10)**token.decimals();
        require(_value > 0, "!value");
        
        (address _pair, uint amountA,) = _addLiquidity(address(token), address(this), amount, _value);
        
        token.safeTransferFrom(msg.sender, _pair, amountA);
        _mint(_pair, _value); // Amount of scUSD to mint
        
        uint _liquidity = ISushiswapV2Pair(_pair).mint(address(this));
        collateral[msg.sender][address(token)] += _liquidity;
        
        collateralCredit[msg.sender][address(token)] += _value;
        uint _fee = _value * FEE / BASE;
        _mint(msg.sender, _value - _fee);
        _mint(address(this), _fee);
        notifyFeeAmount(_fee);
        
        emit Deposit(msg.sender, address(token), _value, amount, _value);
    }
    
    function withdrawAll(IERC20 token) external {
        _withdraw(token, IERC20(address(this)).balanceOf(msg.sender));
    }
    
    function withdraw(IERC20 token, uint amount) external {
        _withdraw(token, amount);
    }
    
    function _withdraw(IERC20 token, uint amount) internal {
        uint _credit = collateralCredit[msg.sender][address(token)];
        uint _collateral = collateral[msg.sender][address(token)];
        
        if (_credit < amount) {
            amount = _credit;
        }
        
        // Calculate % of collateral to release
        uint _burned = _collateral * amount / _credit;
        address _pair = FACTORY.getPair(address(token), address(this));
        
        IERC20(_pair).safeTransfer(_pair, _burned); // send liquidity to pair
        (uint _amount0, uint _amount1) = ISushiswapV2Pair(_pair).burn(msg.sender);
        (address _token0,) = SushiswapV2Library.sortTokens(address(token), address(this));
        (uint _amountA, uint _amountB) = address(token) == _token0 ? (_amount0, _amount1) : (_amount1, _amount0);
        
        collateralCredit[msg.sender][address(token)] -= amount;
        collateral[msg.sender][address(token)] -= _burned;
        _burn(msg.sender, _amountB+amount); // Amount of scUSD to burn (value of A leaving the system)
        
        emit Withdraw(msg.sender, address(token), amount, _amountB, _amountA);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint amount) external returns (bool) {
        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "permit: signature");
        require(signatory == owner, "permit: unauthorized");
        require(block.timestamp <= deadline, "permit: expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint amount) external returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint amount) external returns (bool) {
        address spender = msg.sender;
        uint spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != type(uint).max) {
            uint newAllowance = spenderAllowance - amount;
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    function _transferTokens(address src, address dst, uint amount) internal {
        balances[src] -= amount;
        balances[dst] += amount;
        
        emit Transfer(src, dst, amount);
        
        if (pairs[src]) {
            uint _fee = amount * FEE / BASE;
            _transferTokens(dst, address(this), _fee);
            notifyFeeAmount(_fee);
        }
    }

    function _getChainId() internal view returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":true,"internalType":"address","name":"collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"creditOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditMinted","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","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":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creditor","type":"address"},{"indexed":true,"internalType":"address","name":"collateral","type":"address"},{"indexed":false,"internalType":"uint256","name":"creditIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creditOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAINSEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"contract ISushiswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LINK","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collateralCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"markets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600060015560006002556000600b556000600c5562093a80600d5560326012556127106013553480156200003757600080fd5b50600160005560408051808201909152601381527f537461626c65205969656c6420437265646974000000000000000000000000006020909101527f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f357f731d4321f0316462c5e2d7805654a6b50447396c1df9b8234424c9752f8ec7d2620000be620000f5565b30604051602001620000d49493929190620000f9565b60408051601f1981840301815291905280516020909101206080526200011d565b4690565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805161299f620001406000396000818161061a0152610d9c015261299f6000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ecebe0011610146578063cd3daf9d116100c3578063df136d6511610087578063df136d6514610496578063e9fad8ee1461049e578063ebe2b12b146104a6578063ec342ad0146104ae578063f3fef3a3146104b6578063fa09e630146104c95761025d565b8063cd3daf9d1461044d578063d41ce4b114610455578063d505accf1461045d578063dd62ed3e14610470578063de3db0fe146104835761025d565b8063a694fc3a1161010a578063a694fc3a14610404578063a9059cbb14610417578063c57981b51461042a578063c8f33c9114610432578063cc218ece1461043a5761025d565b80637ecebe00146103bb57806380faa57d146103ce5780638b876347146103d657806395d89b41146103e95780639f0d5f27146103f15761025d565b806320606b70116101df578063313ce567116101a3578063313ce5671461035b5780633ac2a032146103705780633d18b9121461038557806347e7ef241461038d57806370a08231146103a05780637b0a47ee146103b35761025d565b806320606b701461031b57806323b872dd146103235780632dd31000146103365780632e17de781461033e57806330adf81f146103535761025d565b80631778e29c116102265780631778e29c146102e657806318160ddd146102ee5780631b6b6d23146102f65780631be052891461030b5780631c1f78eb146103135761025d565b80628cc2621461026257806306fdde031461028b5780630700037d146102a0578063095ea7b3146102b357806316934fc4146102d3575b600080fd5b610275610270366004612015565b6104dc565b604051610282919061239d565b60405180910390f35b61029361055b565b60405161028291906123f8565b6102756102ae366004612015565b61058a565b6102c66102c136600461213a565b61059c565b6040516102829190612392565b6102756102e1366004612015565b610606565b610275610618565b61027561063c565b6102fe610642565b60405161028291906122da565b61027561065a565b610275610660565b610275610678565b6102c6610331366004612085565b61069c565b6102fe61076a565b61035161034c3660046121d3565b610782565b005b6102756108bf565b6103636108e3565b6040516102829190612767565b6103786108e8565b6040516102829190612345565b61035161094a565b61035161039b36600461213a565b610a41565b6102756103ae366004612015565b610a4f565b610275610a6a565b6102756103c9366004612015565b610a70565b610275610a82565b6102756103e4366004612015565b610a90565b610293610aa2565b6103516103ff366004612015565b610ac5565b6103516104123660046121d3565b610b4d565b6102c661042536600461213a565b610c70565b610275610c86565b610275610c8c565b61027561044836600461204d565b610c92565b610275610caf565b610275610d13565b61035161046b3660046120c5565b610d19565b61027561047e36600461204d565b610f1f565b61027561049136600461204d565b610f4a565b610275610f67565b610351610f6d565b610275610f90565b610275610f96565b6103516104c436600461213a565b610f9c565b6103516104d7366004612015565b610fa6565b6001600160a01b0381166000908152601160209081526040808320546010909252822054670de0b6b3a764000090610512610caf565b61051c91906128e0565b6001600160a01b03851660009081526005602052604090205461053f91906128c1565b610549919061278d565b6105539190612775565b90505b919050565b6040518060400160405280601381526020017214dd18589b1948165a595b190810dc99591a5d606a1b81525081565b60116020526000908152604090205481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906105f590869061239d565b60405180910390a350600192915050565b60056020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b600d5481565b6000600d54600b5461067291906128c1565b90505b90565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906106d657506000198114155b156107515760006106e785836128e0565b6001600160a01b03808916600081815260036020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061074790859061239d565b60405180910390a3505b61075c868686611024565b6001925050505b9392505050565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b600260005414156107ae5760405162461bcd60e51b81526004016107a5906126e3565b60405180910390fd5b6002600055336107bc610caf565b600f556107c7610a82565b600e556001600160a01b0381161561080e576107e2816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b6000821161082e5760405162461bcd60e51b81526004016107a5906125c5565b816002600082825461084091906128e0565b909155505033600090815260056020526040812080548492906108649084906128e0565b909155506108759050303384611024565b336001600160a01b03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75836040516108ae919061239d565b60405180910390a250506001600055565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600980548060200260200160405190810160405280929190818152602001828054801561094057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610922575b5050505050905090565b6002600054141561096d5760405162461bcd60e51b81526004016107a5906126e3565b60026000553361097b610caf565b600f55610986610a82565b600e556001600160a01b038116156109cd576109a1816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b336000908152601160205260409020548015610a3857336000818152601160205260408120556109ff90309083611024565b336001600160a01b03167f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a826040516108ae919061239d565b50506001600055565b610a4b8282611126565b5050565b6001600160a01b031660009081526004602052604090205490565b600b5481565b60066020526000908152604090205481565b600061067242600c5461142b565b60106020526000908152604090205481565b604051806040016040528060078152602001661e50d49151125560ca1b81525081565b610b4a81826001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610af591906122da565b60206040518083038186803b158015610b0d57600080fd5b505afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4591906121eb565b611126565b50565b60026000541415610b705760405162461bcd60e51b81526004016107a5906126e3565b600260005533610b7e610caf565b600f55610b89610a82565b600e556001600160a01b03811615610bd057610ba4816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b60008211610bf05760405162461bcd60e51b81526004016107a5906124dc565b8160026000828254610c029190612775565b90915550503360009081526005602052604081208054849290610c26908490612775565b90915550610c379050333084611024565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d836040516108ae919061239d565b6000610c7d338484611024565b50600192915050565b60125481565b600e5481565b600760209081526000928352604080842090915290825290205481565b600060025460001415610cc55750600f54610675565b600254600b54600e54610cd6610a82565b610ce091906128e0565b610cea91906128c1565b610cfc90670de0b6b3a76400006128c1565b610d06919061278d565b600f546106729190612775565b60025481565b6001600160a01b038716600090815260066020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610d6683612923565b9190505589604051602001610d80969594939291906123a6565b60405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000082604051602001610dcd929190612269565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610e0a94939291906123da565b6020604051602081039080840390855afa158015610e2c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5f5760405162461bcd60e51b81526004016107a59061266e565b896001600160a01b0316816001600160a01b031614610e905760405162461bcd60e51b81526004016107a590612597565b86421115610eb05760405162461bcd60e51b81526004016107a590612539565b6001600160a01b03808b166000818152600360209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f0b908c9061239d565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600860209081526000928352604080842090915290825290205481565b600f5481565b33600090815260056020526040902054610f8690610782565b610f8e61094a565b565b600c5481565b60135481565b610a4b8282611441565b6040516370a0823160e01b8152610b4a90829030906370a0823190610fcf9033906004016122da565b60206040518083038186803b158015610fe757600080fd5b505afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f91906121eb565b611441565b6001600160a01b0383166000908152600460205260408120805483929061104c9084906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611079908490612775565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110c3919061239d565b60405180910390a36001600160a01b0383166000908152600a602052604090205460ff1615611121576000601354601254836110ff91906128c1565b611109919061278d565b9050611116833083611024565b61111f81611704565b505b505050565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119991906121eb565b6111a490600a6127f3565b604051635708447d60e01b8152839073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906111dd9088906004016122da565b60206040518083038186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d91906121eb565b61123791906128c1565b611241919061278d565b9050600081116112635760405162461bcd60e51b81526004016107a5906124bc565b60008061127285308686611850565b50909250905061128d6001600160a01b038616338484611b1f565b6112978284611b77565b6040516335313c2160e11b81526000906001600160a01b03841690636a627842906112c69030906004016122da565b602060405180830381600087803b1580156112e057600080fd5b505af11580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131891906121eb565b3360009081526007602090815260408083206001600160a01b038b168452909152812080549293508392909190611350908490612775565b90915550503360009081526008602090815260408083206001600160a01b038a16845290915281208054869290611388908490612775565b9091555050601354601254600091906113a190876128c1565b6113ab919061278d565b90506113c0336113bb83886128e0565b611b77565b6113ca3082611b77565b6113d381611704565b866001600160a01b0316336001600160a01b03167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f687898960405161141a93929190612751565b60405180910390a350505050505050565b600081831061143a5781610763565b5090919050565b3360008181526008602090815260408083206001600160a01b038716808552908352818420549484526007835281842090845290915290205482821015611486578192505b60008261149385846128c1565b61149d919061278d565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a43905906114dc90899030906004016122ee565b60206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190612031565b90506115426001600160a01b0382168284611c05565b600080826001600160a01b03166389afcb44336040518263ffffffff1660e01b815260040161157191906122da565b6040805180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c29190612203565b9150915060006115d28930611c24565b509050600080826001600160a01b03168b6001600160a01b0316146115f85783856115fb565b84845b915091508960086000336001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461165791906128e0565b90915550503360009081526007602090815260408083206001600160a01b038f1684529091528120805489929061168f9084906128e0565b909155506116a89050336116a38c84612775565b611cae565b8a6001600160a01b0316336001600160a01b03167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8c84866040516116ef93929190612751565b60405180910390a35050505050505050505050565b600061170e610caf565b600f55611719610a82565b600e556001600160a01b0381161561176057611734816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600c54421061177e57600d54611776908361278d565b600b556117c0565b600042600c5461178e91906128e0565b90506000600b54826117a091906128c1565b600d549091506117b08286612775565b6117ba919061278d565b600b5550505b30600090815260046020526040902054600d546117dd908261278d565b600b5411156117fe5760405162461bcd60e51b81526004016107a5906125f0565b42600e819055600d5461181091612775565b600c556040517f6860fd583f67fab4724ed49beb2ba910ec616cb579289e3726f71d72389d40649061184390859061239d565b60405180910390a1505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611890908a908a906004016122ee565b60206040518083038186803b1580156118a857600080fd5b505afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e09190612031565b92506001600160a01b0383166119ed576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611929908a908a906004016122ee565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b9190612031565b6001600160a01b038181166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916918a169190911790559250611a79565b6001600160a01b0383166000908152600a602052604090205460ff16611a79576001600160a01b038381166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169189169190911790555b600080611a9b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611d30565b91509150816000148015611aad575080155b15611abd57869350859250611b13565b6000611aca888484611e09565b9050868111611ade57879450925082611b11565b6000611aeb888486611e09565b905088811115611b0b57634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b61111f846323b872dd60e01b858585604051602401611b4093929190612308565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e73565b8060016000828254611b899190612775565b90915550506001600160a01b03821660009081526004602052604081208054839290611bb6908490612775565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b60405180910390a35050565b6111218363a9059cbb60e01b8484604051602401611b4092919061232c565b600080826001600160a01b0316846001600160a01b03161415611c595760405162461bcd60e51b81526004016107a590612475565b826001600160a01b0316846001600160a01b031610611c79578284611c7c565b83835b90925090506001600160a01b038216611ca75760405162461bcd60e51b81526004016107a590612562565b9250929050565b8060016000828254611cc091906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611ced9084906128e0565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b6000806000611d3f8585611c24565b509050600080611d50888888611f57565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d8857600080fd5b505afa158015611d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc09190612185565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611df7578082611dfa565b81815b90999098509650505050505050565b6000808411611e2a5760405162461bcd60e51b81526004016107a590612627565b600083118015611e3a5750600082115b611e565760405162461bcd60e51b81526004016107a59061242b565b82611e6183866128c1565b611e6b919061278d565b949350505050565b611e85826001600160a01b0316611fc7565b611ea15760405162461bcd60e51b81526004016107a59061271a565b600080836001600160a01b031683604051611ebc919061224d565b6000604051808303816000865af19150503d8060008114611ef9576040519150601f19603f3d011682016040523d82523d6000602084013e611efe565b606091505b509150915081611f205760405162461bcd60e51b81526004016107a590612504565b80511561111f5780806020019051810190611f3b9190612165565b61111f5760405162461bcd60e51b81526004016107a590612699565b6000806000611f668585611c24565b91509150858282604051602001611f7e929190612226565b60405160208183030381529060405280519060200120604051602001611fa5929190612284565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e6b5750141592915050565b80516001600160701b038116811461055657600080fd5b600060208284031215612026578081fd5b813561076381612954565b600060208284031215612042578081fd5b815161076381612954565b6000806040838503121561205f578081fd5b823561206a81612954565b9150602083013561207a81612954565b809150509250929050565b600080600060608486031215612099578081fd5b83356120a481612954565b925060208401356120b481612954565b929592945050506040919091013590565b600080600080600080600060e0888a0312156120df578283fd5b87356120ea81612954565b965060208801356120fa81612954565b95506040880135945060608801359350608088013560ff8116811461211d578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561214c578182fd5b823561215781612954565b946020939093013593505050565b600060208284031215612176578081fd5b81518015158114610763578182fd5b600080600060608486031215612199578283fd5b6121a284611ffe565b92506121b060208501611ffe565b9150604084015163ffffffff811681146121c8578182fd5b809150509250925092565b6000602082840312156121e4578081fd5b5035919050565b6000602082840312156121fc578081fd5b5051919050565b60008060408385031215612215578182fd5b505080516020909101519092909150565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b6000825161225f8184602087016128f7565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156123865783516001600160a01b031683529284019291840191600101612361565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282518060208401526124178160408501602087016128f7565b601f01601f19169190910160400192915050565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526018908201527f50726f76696465642072657761726420746f6f20686967680000000000000000604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b600082198211156127885761278861293e565b500190565b6000826127a857634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116127bf57506127ea565b8187048211156127d1576127d161293e565b808616156127de57918102915b9490941c9380026127b0565b94509492505050565b6000610763600019848460008261280c57506001610763565b8161281957506000610763565b816001811461282f576002811461283957612866565b6001915050610763565b60ff84111561284a5761284a61293e565b6001841b9150848211156128605761286061293e565b50610763565b5060208310610133831016604e8410600b8410161715612899575081810a838111156128945761289461293e565b610763565b6128a684848460016127ad565b8086048211156128b8576128b861293e565b02949350505050565b60008160001904831182151516156128db576128db61293e565b500290565b6000828210156128f2576128f261293e565b500390565b60005b838110156129125781810151838201526020016128fa565b8381111561111f5750506000910152565b60006000198214156129375761293761293e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610b4a57600080fdfea2646970667358221220c16ab7e80e9c19ad986fe514c380a4512ce143ef0c9f8c39a435e87077c210bf64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ecebe0011610146578063cd3daf9d116100c3578063df136d6511610087578063df136d6514610496578063e9fad8ee1461049e578063ebe2b12b146104a6578063ec342ad0146104ae578063f3fef3a3146104b6578063fa09e630146104c95761025d565b8063cd3daf9d1461044d578063d41ce4b114610455578063d505accf1461045d578063dd62ed3e14610470578063de3db0fe146104835761025d565b8063a694fc3a1161010a578063a694fc3a14610404578063a9059cbb14610417578063c57981b51461042a578063c8f33c9114610432578063cc218ece1461043a5761025d565b80637ecebe00146103bb57806380faa57d146103ce5780638b876347146103d657806395d89b41146103e95780639f0d5f27146103f15761025d565b806320606b70116101df578063313ce567116101a3578063313ce5671461035b5780633ac2a032146103705780633d18b9121461038557806347e7ef241461038d57806370a08231146103a05780637b0a47ee146103b35761025d565b806320606b701461031b57806323b872dd146103235780632dd31000146103365780632e17de781461033e57806330adf81f146103535761025d565b80631778e29c116102265780631778e29c146102e657806318160ddd146102ee5780631b6b6d23146102f65780631be052891461030b5780631c1f78eb146103135761025d565b80628cc2621461026257806306fdde031461028b5780630700037d146102a0578063095ea7b3146102b357806316934fc4146102d3575b600080fd5b610275610270366004612015565b6104dc565b604051610282919061239d565b60405180910390f35b61029361055b565b60405161028291906123f8565b6102756102ae366004612015565b61058a565b6102c66102c136600461213a565b61059c565b6040516102829190612392565b6102756102e1366004612015565b610606565b610275610618565b61027561063c565b6102fe610642565b60405161028291906122da565b61027561065a565b610275610660565b610275610678565b6102c6610331366004612085565b61069c565b6102fe61076a565b61035161034c3660046121d3565b610782565b005b6102756108bf565b6103636108e3565b6040516102829190612767565b6103786108e8565b6040516102829190612345565b61035161094a565b61035161039b36600461213a565b610a41565b6102756103ae366004612015565b610a4f565b610275610a6a565b6102756103c9366004612015565b610a70565b610275610a82565b6102756103e4366004612015565b610a90565b610293610aa2565b6103516103ff366004612015565b610ac5565b6103516104123660046121d3565b610b4d565b6102c661042536600461213a565b610c70565b610275610c86565b610275610c8c565b61027561044836600461204d565b610c92565b610275610caf565b610275610d13565b61035161046b3660046120c5565b610d19565b61027561047e36600461204d565b610f1f565b61027561049136600461204d565b610f4a565b610275610f67565b610351610f6d565b610275610f90565b610275610f96565b6103516104c436600461213a565b610f9c565b6103516104d7366004612015565b610fa6565b6001600160a01b0381166000908152601160209081526040808320546010909252822054670de0b6b3a764000090610512610caf565b61051c91906128e0565b6001600160a01b03851660009081526005602052604090205461053f91906128c1565b610549919061278d565b6105539190612775565b90505b919050565b6040518060400160405280601381526020017214dd18589b1948165a595b190810dc99591a5d606a1b81525081565b60116020526000908152604090205481565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906105f590869061239d565b60405180910390a350600192915050565b60056020526000908152604090205481565b7f636e940c6e0b9a383949256d4dea314c874dc3ac442beba74cc2e7b5faf674bd81565b60015481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b600d5481565b6000600d54600b5461067291906128c1565b90505b90565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b0383166000818152600360209081526040808320338085529252822054919290919082148015906106d657506000198114155b156107515760006106e785836128e0565b6001600160a01b03808916600081815260036020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061074790859061239d565b60405180910390a3505b61075c868686611024565b6001925050505b9392505050565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b600260005414156107ae5760405162461bcd60e51b81526004016107a5906126e3565b60405180910390fd5b6002600055336107bc610caf565b600f556107c7610a82565b600e556001600160a01b0381161561080e576107e2816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b6000821161082e5760405162461bcd60e51b81526004016107a5906125c5565b816002600082825461084091906128e0565b909155505033600090815260056020526040812080548492906108649084906128e0565b909155506108759050303384611024565b336001600160a01b03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75836040516108ae919061239d565b60405180910390a250506001600055565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600980548060200260200160405190810160405280929190818152602001828054801561094057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610922575b5050505050905090565b6002600054141561096d5760405162461bcd60e51b81526004016107a5906126e3565b60026000553361097b610caf565b600f55610986610a82565b600e556001600160a01b038116156109cd576109a1816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b336000908152601160205260409020548015610a3857336000818152601160205260408120556109ff90309083611024565b336001600160a01b03167f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a826040516108ae919061239d565b50506001600055565b610a4b8282611126565b5050565b6001600160a01b031660009081526004602052604090205490565b600b5481565b60066020526000908152604090205481565b600061067242600c5461142b565b60106020526000908152604090205481565b604051806040016040528060078152602001661e50d49151125560ca1b81525081565b610b4a81826001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610af591906122da565b60206040518083038186803b158015610b0d57600080fd5b505afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4591906121eb565b611126565b50565b60026000541415610b705760405162461bcd60e51b81526004016107a5906126e3565b600260005533610b7e610caf565b600f55610b89610a82565b600e556001600160a01b03811615610bd057610ba4816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b60008211610bf05760405162461bcd60e51b81526004016107a5906124dc565b8160026000828254610c029190612775565b90915550503360009081526005602052604081208054849290610c26908490612775565b90915550610c379050333084611024565b336001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d836040516108ae919061239d565b6000610c7d338484611024565b50600192915050565b60125481565b600e5481565b600760209081526000928352604080842090915290825290205481565b600060025460001415610cc55750600f54610675565b600254600b54600e54610cd6610a82565b610ce091906128e0565b610cea91906128c1565b610cfc90670de0b6b3a76400006128c1565b610d06919061278d565b600f546106729190612775565b60025481565b6001600160a01b038716600090815260066020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610d6683612923565b9190505589604051602001610d80969594939291906123a6565b60405160208183030381529060405280519060200120905060007f636e940c6e0b9a383949256d4dea314c874dc3ac442beba74cc2e7b5faf674bd82604051602001610dcd929190612269565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610e0a94939291906123da565b6020604051602081039080840390855afa158015610e2c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e5f5760405162461bcd60e51b81526004016107a59061266e565b896001600160a01b0316816001600160a01b031614610e905760405162461bcd60e51b81526004016107a590612597565b86421115610eb05760405162461bcd60e51b81526004016107a590612539565b6001600160a01b03808b166000818152600360209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f0b908c9061239d565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600860209081526000928352604080842090915290825290205481565b600f5481565b33600090815260056020526040902054610f8690610782565b610f8e61094a565b565b600c5481565b60135481565b610a4b8282611441565b6040516370a0823160e01b8152610b4a90829030906370a0823190610fcf9033906004016122da565b60206040518083038186803b158015610fe757600080fd5b505afa158015610ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101f91906121eb565b611441565b6001600160a01b0383166000908152600460205260408120805483929061104c9084906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611079908490612775565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110c3919061239d565b60405180910390a36001600160a01b0383166000908152600a602052604090205460ff1615611121576000601354601254836110ff91906128c1565b611109919061278d565b9050611116833083611024565b61111f81611704565b505b505050565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119991906121eb565b6111a490600a6127f3565b604051635708447d60e01b8152839073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906111dd9088906004016122da565b60206040518083038186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d91906121eb565b61123791906128c1565b611241919061278d565b9050600081116112635760405162461bcd60e51b81526004016107a5906124bc565b60008061127285308686611850565b50909250905061128d6001600160a01b038616338484611b1f565b6112978284611b77565b6040516335313c2160e11b81526000906001600160a01b03841690636a627842906112c69030906004016122da565b602060405180830381600087803b1580156112e057600080fd5b505af11580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131891906121eb565b3360009081526007602090815260408083206001600160a01b038b168452909152812080549293508392909190611350908490612775565b90915550503360009081526008602090815260408083206001600160a01b038a16845290915281208054869290611388908490612775565b9091555050601354601254600091906113a190876128c1565b6113ab919061278d565b90506113c0336113bb83886128e0565b611b77565b6113ca3082611b77565b6113d381611704565b866001600160a01b0316336001600160a01b03167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f687898960405161141a93929190612751565b60405180910390a350505050505050565b600081831061143a5781610763565b5090919050565b3360008181526008602090815260408083206001600160a01b038716808552908352818420549484526007835281842090845290915290205482821015611486578192505b60008261149385846128c1565b61149d919061278d565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a43905906114dc90899030906004016122ee565b60206040518083038186803b1580156114f457600080fd5b505afa158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152c9190612031565b90506115426001600160a01b0382168284611c05565b600080826001600160a01b03166389afcb44336040518263ffffffff1660e01b815260040161157191906122da565b6040805180830381600087803b15801561158a57600080fd5b505af115801561159e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c29190612203565b9150915060006115d28930611c24565b509050600080826001600160a01b03168b6001600160a01b0316146115f85783856115fb565b84845b915091508960086000336001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461165791906128e0565b90915550503360009081526007602090815260408083206001600160a01b038f1684529091528120805489929061168f9084906128e0565b909155506116a89050336116a38c84612775565b611cae565b8a6001600160a01b0316336001600160a01b03167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8c84866040516116ef93929190612751565b60405180910390a35050505050505050505050565b600061170e610caf565b600f55611719610a82565b600e556001600160a01b0381161561176057611734816104dc565b6001600160a01b038216600090815260116020908152604080832093909355600f546010909152919020555b600c54421061177e57600d54611776908361278d565b600b556117c0565b600042600c5461178e91906128e0565b90506000600b54826117a091906128c1565b600d549091506117b08286612775565b6117ba919061278d565b600b5550505b30600090815260046020526040902054600d546117dd908261278d565b600b5411156117fe5760405162461bcd60e51b81526004016107a5906125f0565b42600e819055600d5461181091612775565b600c556040517f6860fd583f67fab4724ed49beb2ba910ec616cb579289e3726f71d72389d40649061184390859061239d565b60405180910390a1505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611890908a908a906004016122ee565b60206040518083038186803b1580156118a857600080fd5b505afa1580156118bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e09190612031565b92506001600160a01b0383166119ed576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611929908a908a906004016122ee565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b9190612031565b6001600160a01b038181166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916918a169190911790559250611a79565b6001600160a01b0383166000908152600a602052604090205460ff16611a79576001600160a01b038381166000908152600a602052604081208054600160ff1990911681179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169189169190911790555b600080611a9b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611d30565b91509150816000148015611aad575080155b15611abd57869350859250611b13565b6000611aca888484611e09565b9050868111611ade57879450925082611b11565b6000611aeb888486611e09565b905088811115611b0b57634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b61111f846323b872dd60e01b858585604051602401611b4093929190612308565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e73565b8060016000828254611b899190612775565b90915550506001600160a01b03821660009081526004602052604081208054839290611bb6908490612775565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b60405180910390a35050565b6111218363a9059cbb60e01b8484604051602401611b4092919061232c565b600080826001600160a01b0316846001600160a01b03161415611c595760405162461bcd60e51b81526004016107a590612475565b826001600160a01b0316846001600160a01b031610611c79578284611c7c565b83835b90925090506001600160a01b038216611ca75760405162461bcd60e51b81526004016107a590612562565b9250929050565b8060016000828254611cc091906128e0565b90915550506001600160a01b03821660009081526004602052604081208054839290611ced9084906128e0565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf990859061239d565b6000806000611d3f8585611c24565b509050600080611d50888888611f57565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d8857600080fd5b505afa158015611d9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc09190612185565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614611df7578082611dfa565b81815b90999098509650505050505050565b6000808411611e2a5760405162461bcd60e51b81526004016107a590612627565b600083118015611e3a5750600082115b611e565760405162461bcd60e51b81526004016107a59061242b565b82611e6183866128c1565b611e6b919061278d565b949350505050565b611e85826001600160a01b0316611fc7565b611ea15760405162461bcd60e51b81526004016107a59061271a565b600080836001600160a01b031683604051611ebc919061224d565b6000604051808303816000865af19150503d8060008114611ef9576040519150601f19603f3d011682016040523d82523d6000602084013e611efe565b606091505b509150915081611f205760405162461bcd60e51b81526004016107a590612504565b80511561111f5780806020019051810190611f3b9190612165565b61111f5760405162461bcd60e51b81526004016107a590612699565b6000806000611f668585611c24565b91509150858282604051602001611f7e929190612226565b60405160208183030381529060405280519060200120604051602001611fa5929190612284565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e6b5750141592915050565b80516001600160701b038116811461055657600080fd5b600060208284031215612026578081fd5b813561076381612954565b600060208284031215612042578081fd5b815161076381612954565b6000806040838503121561205f578081fd5b823561206a81612954565b9150602083013561207a81612954565b809150509250929050565b600080600060608486031215612099578081fd5b83356120a481612954565b925060208401356120b481612954565b929592945050506040919091013590565b600080600080600080600060e0888a0312156120df578283fd5b87356120ea81612954565b965060208801356120fa81612954565b95506040880135945060608801359350608088013560ff8116811461211d578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561214c578182fd5b823561215781612954565b946020939093013593505050565b600060208284031215612176578081fd5b81518015158114610763578182fd5b600080600060608486031215612199578283fd5b6121a284611ffe565b92506121b060208501611ffe565b9150604084015163ffffffff811681146121c8578182fd5b809150509250925092565b6000602082840312156121e4578081fd5b5035919050565b6000602082840312156121fc578081fd5b5051919050565b60008060408385031215612215578182fd5b505080516020909101519092909150565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b6000825161225f8184602087016128f7565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156123865783516001600160a01b031683529284019291840191600101612361565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825282518060208401526124178160408501602087016128f7565b601f01601f19169190910160400192915050565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252600e908201526d043616e6e6f74207374616b6520360941b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b602080825260119082015270043616e6e6f74207769746864726177203607c1b604082015260600190565b60208082526018908201527f50726f76696465642072657761726420746f6f20686967680000000000000000604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b600082198211156127885761278861293e565b500190565b6000826127a857634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116127bf57506127ea565b8187048211156127d1576127d161293e565b808616156127de57918102915b9490941c9380026127b0565b94509492505050565b6000610763600019848460008261280c57506001610763565b8161281957506000610763565b816001811461282f576002811461283957612866565b6001915050610763565b60ff84111561284a5761284a61293e565b6001841b9150848211156128605761286061293e565b50610763565b5060208310610133831016604e8410600b8410161715612899575081810a838111156128945761289461293e565b610763565b6128a684848460016127ad565b8086048211156128b8576128b861293e565b02949350505050565b60008160001904831182151516156128db576128db61293e565b500290565b6000828210156128f2576128f261293e565b500390565b60005b838110156129125781810151838201526020016128fa565b8381111561111f5750506000910152565b60006000198214156129375761293761293e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610b4a57600080fdfea2646970667358221220c16ab7e80e9c19ad986fe514c380a4512ce143ef0c9f8c39a435e87077c210bf64736f6c63430008000033

Deployed Bytecode Sourcemap

11146:15575:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15067:184;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11284:51;;;:::i;:::-;;;;;;;:::i;14054:39::-;;;;;;:::i;:::-;;:::i;23241:207::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11853:38::-;;;;;;:::i;:::-;;:::i;12090:40::-;;;:::i;11598:27::-;;;:::i;13305:80::-;;;:::i;:::-;;;;;;;:::i;13879:29::-;;;:::i;15259:108::-;;;:::i;11964:119::-;;;:::i;25651:513::-;;;;;;:::i;:::-;;:::i;13392:109::-;;;:::i;16038:311::-;;;;;;:::i;:::-;;:::i;:::-;;12220:128;;;:::i;11500:34::-;;;:::i;:::-;;;;;;;:::i;17769:94::-;;;:::i;:::-;;;;;;;:::i;16357:308::-;;;:::i;18519:95::-;;;;;;:::i;:::-;;:::i;24826:108::-;;;;;;:::i;:::-;;:::i;13811:26::-;;;:::i;12429:39::-;;;;;;:::i;:::-;;:::i;14578:128::-;;;:::i;13993:54::-;;;;;;:::i;:::-;;:::i;11396:41::-;;;:::i;18401:106::-;;;;;;:::i;:::-;;:::i;15721:309::-;;;;;;:::i;:::-;;:::i;25195:149::-;;;;;;:::i;:::-;;:::i;14514:20::-;;;:::i;13915:26::-;;;:::i;13550:63::-;;;;;;:::i;:::-;;:::i;14718:337::-;;;:::i;11695:28::-;;;:::i;23935:688::-;;;;;;:::i;:::-;;:::i;22630:136::-;;;;;;:::i;:::-;;:::i;13652:69::-;;;;;;:::i;:::-;;:::i;13948:32::-;;;:::i;16673:93::-;;;:::i;13844:28::-;;;:::i;14541:24::-;;;:::i;21034:97::-;;;;;;:::i;:::-;;:::i;20898:124::-;;;;;;:::i;:::-;;:::i;15067:184::-;-1:-1:-1;;;;;15227:16:0;;15121:4;15227:16;;;:7;:16;;;;;;;;;15184:22;:31;;;;;;15219:4;;15165:16;:14;:16::i;:::-;:50;;;;:::i;:::-;-1:-1:-1;;;;;15146:15:0;;;;;;:6;:15;;;;;;:70;;;;:::i;:::-;:77;;;;:::i;:::-;15145:98;;;;:::i;:::-;15138:105;;15067:184;;;;:::o;11284:51::-;;;;;;;;;;;;;;-1:-1:-1;;;11284:51:0;;;;:::o;14054:39::-;;;;;;;;;;;;;:::o;23241:207::-;23334:10;23306:4;23323:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;23323:31:0;;;;;;;;;;:40;;;23381:37;23306:4;;23323:31;;23381:37;;;;23357:6;;23381:37;:::i;:::-;;;;;;;;-1:-1:-1;23436:4:0;23241:207;;;;:::o;11853:38::-;;;;;;;;;;;;;:::o;12090:40::-;;;:::o;11598:27::-;;;;:::o;13305:80::-;13342:42;13305:80;:::o;13879:29::-;;;;:::o;15259:108::-;15314:4;15351:8;;15338:10;;:21;;;;:::i;:::-;15331:28;;15259:108;;:::o;11964:119::-;12006:77;11964:119;:::o;25651:513::-;-1:-1:-1;;;;;25810:15:0;;25730:4;25810:15;;;:10;:15;;;;;;;;25765:10;25810:24;;;;;;;;25730:4;;25765:10;;25810:24;25851:14;;;;;:52;;;-1:-1:-1;;25869:16:0;:34;;25851:52;25847:242;;;25920:17;25940:25;25959:6;25940:16;:25;:::i;:::-;-1:-1:-1;;;;;25980:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;26041:36;25920:45;;-1:-1:-1;25980:24:0;;26041:36;;;;25920:45;;26041:36;:::i;:::-;;;;;;;;25847:242;;26101:33;26117:3;26122;26127:6;26101:15;:33::i;:::-;26152:4;26145:11;;;;25651:513;;;;;;:::o;13392:109::-;13458:42;13392:109;:::o;16038:311::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;;;;;;;;;7458:1;8188:7;:18;16101:10:::1;15452:16;:14;:16::i;:::-;15429:20;:39:::0;15496:26:::1;:24;:26::i;:::-;15479:14;:43:::0;-1:-1:-1;;;;;15537:21:0;::::1;::::0;15533:157:::1;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1::0;;;;;15575:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15658:20:::1;::::0;15624:22:::1;:31:::0;;;;;;:54;15533:157:::1;16141:1:::2;16132:6;:10;16124:40;;;;-1:-1:-1::0;;;16124:40:0::2;;;;;;;:::i;:::-;16191:6;16175:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16215:10:0::2;16208:18;::::0;;;:6:::2;:18;::::0;;;;:28;;16230:6;;16208:18;:28:::2;::::0;16230:6;;16208:28:::2;:::i;:::-;::::0;;;-1:-1:-1;16247:50:0::2;::::0;-1:-1:-1;16271:4:0::2;16278:10;16290:6:::0;16247:15:::2;:50::i;:::-;16322:10;-1:-1:-1::0;;;;;16313:28:0::2;;16334:6;16313:28;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;7414:1:0;8367:7;:22;16038:311::o;12220:128::-;12262:86;12220:128;:::o;11500:34::-;11533:1;11500:34;:::o;17769:94::-;17811:16;17847:8;17840:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17840:15:0;;;;;;;;;;;;;;;;;;;;;;;17769:94;:::o;16357:308::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;7458:1;8188:7;:18;16411:10:::1;15452:16;:14;:16::i;:::-;15429:20;:39:::0;15496:26:::1;:24;:26::i;:::-;15479:14;:43:::0;-1:-1:-1;;;;;15537:21:0;::::1;::::0;15533:157:::1;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1::0;;;;;15575:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15658:20:::1;::::0;15624:22:::1;:31:::0;;;;;;:54;15533:157:::1;16459:10:::2;16434:14;16451:19:::0;;;:7:::2;:19;::::0;;;;;16485:10;;16481:177:::2;;16520:10;16534:1;16512:19:::0;;;:7:::2;:19;::::0;;;;:23;16550:50:::2;::::0;16574:4:::2;::::0;16593:6;16550:15:::2;:50::i;:::-;16627:10;-1:-1:-1::0;;;;;16620:26:0::2;;16639:6;16620:26;;;;;;:::i;16481:177::-;-1:-1:-1::0;;7414:1:0;8367:7;:22;16357:308::o;18519:95::-;18583:23;18592:5;18599:6;18583:8;:23::i;:::-;18519:95;;:::o;24826:108::-;-1:-1:-1;;;;;24909:17:0;24885:4;24909:17;;;:8;:17;;;;;;;24826:108::o;13811:26::-;;;;:::o;12429:39::-;;;;;;;;;;;;;:::o;14578:128::-;14635:4;14659:39;14668:15;14685:12;;14659:8;:39::i;13993:54::-;;;;;;;;;;;;;:::o;11396:41::-;;;;;;;;;;;;;;-1:-1:-1;;;11396:41:0;;;;:::o;18401:106::-;18455:44;18464:5;18471;-1:-1:-1;;;;;18471:15:0;;18487:10;18471:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18455:8;:44::i;:::-;18401:106;:::o;15721:309::-;7458:1;8055:7;;:19;;8047:63;;;;-1:-1:-1;;;8047:63:0;;;;;;;:::i;:::-;7458:1;8188:7;:18;15787:10:::1;15452:16;:14;:16::i;:::-;15429:20;:39:::0;15496:26:::1;:24;:26::i;:::-;15479:14;:43:::0;-1:-1:-1;;;;;15537:21:0;::::1;::::0;15533:157:::1;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1::0;;;;;15575:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;15658:20:::1;::::0;15624:22:::1;:31:::0;;;;;;:54;15533:157:::1;15827:1:::2;15818:6;:10;15810:37;;;;-1:-1:-1::0;;;15810:37:0::2;;;;;;;:::i;:::-;15874:6;15858:12;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15898:10:0::2;15891:18;::::0;;;:6:::2;:18;::::0;;;;:28;;15913:6;;15891:18;:28:::2;::::0;15913:6;;15891:28:::2;:::i;:::-;::::0;;;-1:-1:-1;15930:50:0::2;::::0;-1:-1:-1;15946:10:0::2;15966:4;15973:6:::0;15930:15:::2;:50::i;:::-;16003:10;-1:-1:-1::0;;;;;15996:26:0::2;;16015:6;15996:26;;;;;;:::i;25195:149::-:0;25257:4;25274:40;25290:10;25302:3;25307:6;25274:15;:40::i;:::-;-1:-1:-1;25332:4:0;25195:149;;;;:::o;14514:20::-;;;;:::o;13915:26::-;;;;:::o;13550:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14718:337::-;14765:4;14786:12;;14802:1;14786:17;14782:77;;;-1:-1:-1;14827:20:0;;14820:27;;14782:77;15034:12;;15014:10;;14978:14;;14931:26;:24;:26::i;:::-;:61;;;;:::i;:::-;14930:94;;;;:::i;:::-;:101;;15027:4;14930:101;:::i;:::-;:116;;;;:::i;:::-;14889:20;;:158;;;;:::i;11695:28::-;;;;:::o;23935:688::-;-1:-1:-1;;;;;24145:13:0;;24062:18;24145:13;;;:6;:13;;;;;:15;;12262:86;;24121:5;;24128:7;;24137:6;;24145:15;24062:18;24145:15;;;:::i;:::-;;;;;24162:8;24093:78;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24083:89;;;;;;24062:110;;24183:14;24239:15;24256:10;24210:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24200:68;;;;;;24183:85;;24279:17;24299:26;24309:6;24317:1;24320;24323;24299:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24299:26:0;;-1:-1:-1;;24299:26:0;;;-1:-1:-1;;;;;;;24344:23:0;;24336:53;;;;-1:-1:-1;;;24336:53:0;;;;;;;:::i;:::-;24421:5;-1:-1:-1;;;;;24408:18:0;:9;-1:-1:-1;;;;;24408:18:0;;24400:51;;;;-1:-1:-1;;;24400:51:0;;;;;;;:::i;:::-;24489:8;24470:15;:27;;24462:55;;;;-1:-1:-1;;;24462:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24530:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;;:35;;;24583:32;;;;;24559:6;;24583:32;:::i;:::-;;;;;;;;23935:688;;;;;;;;;;:::o;22630:136::-;-1:-1:-1;;;;;22730:19:0;;;22706:4;22730:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;22630:136::o;13652:69::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;13948:32::-;;;;:::o;16673:93::-;16724:10;16717:18;;;;:6;:18;;;;;;16709:27;;:7;:27::i;:::-;16747:11;:9;:11::i;:::-;16673:93::o;13844:28::-;;;;:::o;14541:24::-;;;;:::o;21034:97::-;21099:24;21109:5;21116:6;21099:9;:24::i;20898:124::-;20970:43;;-1:-1:-1;;;20970:43:0;;20953:61;;20963:5;;20985:4;;20970:31;;:43;;21002:10;;20970:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20953:9;:61::i;26172:387::-;-1:-1:-1;;;;;26256:13:0;;;;;;:8;:13;;;;;:23;;26273:6;;26256:13;:23;;26273:6;;26256:23;:::i;:::-;;;;-1:-1:-1;;;;;;;26290:13:0;;;;;;:8;:13;;;;;:23;;26307:6;;26290:13;:23;;26307:6;;26290:23;:::i;:::-;;;;;;;;26353:3;-1:-1:-1;;;;;26339:26:0;26348:3;-1:-1:-1;;;;;26339:26:0;;26358:6;26339:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;26390:10:0;;;;;;:5;:10;;;;;;;;26386:166;;;26417:9;26444:4;;26438:3;;26429:6;:12;;;;:::i;:::-;:19;;;;:::i;:::-;26417:31;;26463:41;26479:3;26492:4;26499;26463:15;:41::i;:::-;26519:21;26535:4;26519:15;:21::i;:::-;26386:166;;26172:387;;;:::o;19984:902::-;20049:11;20120:5;-1:-1:-1;;;;;20120:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20107:29;;20115:2;20107:29;:::i;:::-;20063:32;;-1:-1:-1;;;20063:32:0;;20098:6;;13342:42;;20063:16;;:32;;20088:5;;20063:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;:73;;;;:::i;:::-;20049:87;;20164:1;20155:6;:10;20147:29;;;;-1:-1:-1;;;20147:29:0;;;;;;;:::i;:::-;20198:13;20213:12;20230:60;20252:5;20268:4;20275:6;20283;20230:13;:60::i;:::-;-1:-1:-1;20197:93:0;;-1:-1:-1;20197:93:0;-1:-1:-1;20311:50:0;-1:-1:-1;;;;;20311:22:0;;20334:10;20197:93;;20311:22;:50::i;:::-;20372:20;20378:5;20385:6;20372:5;:20::i;:::-;20458:43;;-1:-1:-1;;;20458:43:0;;20440:15;;-1:-1:-1;;;;;20458:28:0;;;;;:43;;20495:4;;20458:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20523:10;20512:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;20512:38:0;;;;;;;;;:52;;20440:61;;-1:-1:-1;20440:61:0;;20512:38;;:22;:52;;20440:61;;20512:52;:::i;:::-;;;;-1:-1:-1;;20602:10:0;20585:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;20585:44:0;;;;;;;;;:54;;20633:6;;20585:28;:54;;20633:6;;20585:54;:::i;:::-;;;;-1:-1:-1;;20677:4:0;;20671:3;;20650:9;;20677:4;20662:12;;:6;:12;:::i;:::-;:19;;;;:::i;:::-;20650:31;-1:-1:-1;20692:32:0;20698:10;20710:13;20650:31;20710:6;:13;:::i;:::-;20692:5;:32::i;:::-;20735:26;20749:4;20756;20735:5;:26::i;:::-;20772:21;20788:4;20772:15;:21::i;:::-;20847:5;-1:-1:-1;;;;;20819:59:0;20827:10;-1:-1:-1;;;;;20819:59:0;;20855:6;20863;20871;20819:59;;;;;;;;:::i;:::-;;;;;;;;19984:902;;;;;;;:::o;10721:106::-;10779:7;10810:1;10806;:5;:13;;10818:1;10806:13;;;-1:-1:-1;10814:1:0;;10799:20;-1:-1:-1;10721:106:0:o;21143:1183::-;21241:10;21209:12;21224:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;21224:44:0;;;;;;;;;;;;21298:22;;;:10;:22;;;;;:38;;;;;;;;;21361:16;;;21357:65;;;21403:7;21394:16;;21357:65;21491:12;21529:7;21506:20;21520:6;21506:11;:20;:::i;:::-;:30;;;;:::i;:::-;21563:46;;-1:-1:-1;;;21563:46:0;;21491:45;;-1:-1:-1;21547:13:0;;13458:42;;21563:15;;:46;;21587:5;;21603:4;;21563:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21547:62;-1:-1:-1;21630:42:0;-1:-1:-1;;;;;21630:26:0;;21547:62;21664:7;21630:26;:42::i;:::-;21710:13;21725;21759:5;-1:-1:-1;;;;;21742:28:0;;21771:10;21742:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21709:73;;;;21794:15;21814:60;21852:5;21868:4;21814:29;:60::i;:::-;21793:81;;;21886:13;21901;21936:7;-1:-1:-1;;;;;21918:25:0;21926:5;-1:-1:-1;;;;;21918:25:0;;:71;;21970:8;21980;21918:71;;;21947:8;21957;21918:71;21885:104;;;;22058:6;22010:16;:28;22027:10;-1:-1:-1;;;;;22010:28:0;-1:-1:-1;;;;;22010:28:0;;;;;;;;;;;;:44;22047:5;-1:-1:-1;;;;;22010:44:0;-1:-1:-1;;;;;22010:44:0;;;;;;;;;;;;;:54;;;;;;;:::i;:::-;;;;-1:-1:-1;;22086:10:0;22075:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;22075:38:0;;;;;;;;;:49;;22117:7;;22075:22;:49;;22117:7;;22075:49;:::i;:::-;;;;-1:-1:-1;22135:34:0;;-1:-1:-1;22141:10:0;22153:15;22162:6;22153:8;:15;:::i;:::-;22135:5;:34::i;:::-;22283:5;-1:-1:-1;;;;;22254:64:0;22263:10;-1:-1:-1;;;;;22254:64:0;;22291:6;22299:8;22309;22254:64;;;;;;;;:::i;:::-;;;;;;;;21143:1183;;;;;;;;;;;:::o;16778:979::-;16846:1;15452:16;:14;:16::i;:::-;15429:20;:39;15496:26;:24;:26::i;:::-;15479:14;:43;-1:-1:-1;;;;;15537:21:0;;;15533:157;;15594:15;15601:7;15594:6;:15::i;:::-;-1:-1:-1;;;;;15575:16:0;;;;;;:7;:16;;;;;;;;:34;;;;15658:20;;15624:22;:31;;;;;;:54;15533:157;16884:12:::1;;16865:15;:31;16861:285;;16935:8;::::0;16926:17:::1;::::0;:6;:17:::1;:::i;:::-;16913:10;:30:::0;16861:285:::1;;;16976:14;17008:15;16993:12;;:30;;;;:::i;:::-;16976:47;;17038:13;17066:10;;17054:9;:22;;;;:::i;:::-;17126:8;::::0;17038:38;;-1:-1:-1;17105:17:0::1;17038:38:::0;17105:6;:17:::1;:::i;:::-;17104:30;;;;:::i;:::-;17091:10;:43:::0;-1:-1:-1;;16861:285:0::1;17538:4;17506:12;17521:23:::0;;;:8:::1;:23;::::0;;;;;17587:8:::1;::::0;17577:18:::1;::::0;17521:23;17577:18:::1;:::i;:::-;17563:10;;:32;;17555:69;;;;-1:-1:-1::0;;;17555:69:0::1;;;;;;;:::i;:::-;17654:15;17637:14;:32:::0;;;17713:8:::1;::::0;17695:26:::1;::::0;::::1;:::i;:::-;17680:12;:41:::0;17737:12:::1;::::0;::::1;::::0;::::1;::::0;17742:6;;17737:12:::1;:::i;:::-;;;;;;;;15700:1;16778:979:::0;;:::o;18626:1346::-;18904:31;;-1:-1:-1;;;18904:31:0;;18792:12;;;;;;13458:42;;18904:15;;:31;;18920:6;;18928;;18904:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18897:38;-1:-1:-1;;;;;;18950:18:0;;18946:266;;18992:34;;-1:-1:-1;;;18992:34:0;;13458:42;;18992:18;;:34;;19011:6;;19019;;18992:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19041:11:0;;;;;;;:5;:11;;;;;:18;;19055:4;-1:-1:-1;;19041:18:0;;;;;;;;19074:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;19074:21:0;;;;;;;;;;19041:11;-1:-1:-1;18946:266:0;;;-1:-1:-1;;;;;19118:11:0;;;;;;:5;:11;;;;;;;;19113:99;;-1:-1:-1;;;;;19146:11:0;;;;;;;:5;:11;;;;;:18;;19160:4;-1:-1:-1;;19146:18:0;;;;;;;;19179:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;19179:21:0;;;;;;;;;;19113:99;19233:13;19248;19265:64;13458:42;19314:6;19322;19265:30;:64::i;:::-;19232:97;;;;19344:8;19356:1;19344:13;:30;;;;-1:-1:-1;19361:13:0;;19344:30;19340:625;;;19413:14;;-1:-1:-1;19429:14:0;;-1:-1:-1;19340:625:0;;;19477:19;19499:60;19524:14;19540:8;19550;19499:24;:60::i;:::-;19477:82;;19596:14;19578;:32;19574:380;;19653:14;;-1:-1:-1;19669:14:0;-1:-1:-1;19669:14:0;19574:380;;;19725:19;19747:60;19772:14;19788:8;19798;19747:24;:60::i;:::-;19725:82;;19851:14;19833;:32;;19826:40;;-1:-1:-1;;;19826:40:0;;;;;;;;;19907:14;-1:-1:-1;19923:14:0;;-1:-1:-1;19574:380:0;19340:625;;18626:1346;;;;;;;;;;:::o;1439:201::-;1537:95;1556:5;1586:27;;;1615:4;1621:2;1625:5;1563:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1563:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;1563:68:0;-1:-1:-1;;;;;;1563:68:0;;;;;;;;;;1537:18;:95::i;17875:250::-;17979:6;17964:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18045:13:0;;;;;;:8;:13;;;;;:23;;18062:6;;18045:13;:23;;18062:6;;18045:23;:::i;:::-;;;;-1:-1:-1;;18084:33:0;;-1:-1:-1;;;;;18084:33:0;;;18101:1;;18084:33;;;;18110:6;;18084:33;:::i;:::-;;;;;;;;17875:250;;:::o;1258:173::-;1338:85;1357:5;1387:23;;;1412:2;1416:5;1364:58;;;;;;;;;:::i;8543:353::-;8618:14;8634;8679:6;-1:-1:-1;;;;;8669:16:0;:6;-1:-1:-1;;;;;8669:16:0;;;8661:68;;;;-1:-1:-1;;;8661:68:0;;;;;;;:::i;:::-;8768:6;-1:-1:-1;;;;;8759:15:0;:6;-1:-1:-1;;;;;8759:15:0;;:53;;8797:6;8805;8759:53;;;8778:6;8786;8759:53;8740:72;;-1:-1:-1;8740:72:0;-1:-1:-1;;;;;;8831:20:0;;8823:65;;;;-1:-1:-1;;;8823:65:0;;;;;;;:::i;:::-;8543:353;;;;;:::o;18137:252::-;18241:6;18226:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18309:13:0;;;;;;:8;:13;;;;;:23;;18326:6;;18309:13;:23;;18326:6;;18309:23;:::i;:::-;;;;-1:-1:-1;;18348:33:0;;18370:1;;-1:-1:-1;;;;;18348:33:0;;;;;;;18374:6;;18348:33;:::i;9533:393::-;9626:13;9641;9668:14;9687:26;9698:6;9706;9687:10;:26::i;:::-;9667:46;;;9725:13;9740;9775:32;9783:7;9792:6;9800;9775:7;:32::i;:::-;-1:-1:-1;;;;;9758:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9724:98;-1:-1:-1;;;;;9724:98:0;;;-1:-1:-1;;;;;9724:98:0;;;9866:6;-1:-1:-1;;;;;9856:16:0;:6;-1:-1:-1;;;;;9856:16:0;;:62;;9899:8;9909;9856:62;;;9876:8;9886;9856:62;9833:85;;;;-1:-1:-1;9533:393:0;-1:-1:-1;;;;;;;9533:393:0:o;10045:322::-;10127:12;10170:1;10160:7;:11;10152:63;;;;-1:-1:-1;;;10152:63:0;;;;;;;:::i;:::-;10245:1;10234:8;:12;:28;;;;;10261:1;10250:8;:12;10234:28;10226:83;;;;-1:-1:-1;;;10226:83:0;;;;;;;:::i;:::-;10351:8;10330:18;10340:8;10330:7;:18;:::i;:::-;:29;;;;:::i;:::-;10320:39;10045:322;-1:-1:-1;;;;10045:322:0:o;1998:598::-;2086:27;2094:5;-1:-1:-1;;;;;2086:25:0;;:27::i;:::-;2078:71;;;;-1:-1:-1;;;2078:71:0;;;;;;;:::i;:::-;2223:12;2237:23;2272:5;-1:-1:-1;;;;;2264:19:0;2284:4;2264:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2222:67;;;;2308:7;2300:52;;;;-1:-1:-1;;;2300:52:0;;;;;;;:::i;:::-;2369:17;;:21;2365:224;;2511:10;2500:30;;;;;;;;;;;;:::i;:::-;2492:85;;;;-1:-1:-1;;;2492:85:0;;;;;;;:::i;8988:487::-;9077:12;9103:14;9119;9137:26;9148:6;9156;9137:10;:26::i;:::-;9102:61;;;;9273:7;9326:6;9334;9309:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9299:43;;;;;;9212:251;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9212:251:0;;;;;;;;;9202:262;;9212:251;9202:262;;;;;8988:487;-1:-1:-1;;;;;;8988:487:0:o;818:374::-;878:4;1101:20;;944:66;1141:15;;;;;:42;;-1:-1:-1;1160:23:0;;;1133:51;-1:-1:-1;;818:374:0:o;14:190:1:-;95:13;;-1:-1:-1;;;;;137:42:1;;127:53;;117:2;;194:1;191;184:12;209:259;;321:2;309:9;300:7;296:23;292:32;289:2;;;342:6;334;327:22;289:2;386:9;373:23;405:33;432:5;405:33;:::i;473:263::-;;596:2;584:9;575:7;571:23;567:32;564:2;;;617:6;609;602:22;564:2;654:9;648:16;673:33;700:5;673:33;:::i;741:402::-;;;870:2;858:9;849:7;845:23;841:32;838:2;;;891:6;883;876:22;838:2;935:9;922:23;954:33;981:5;954:33;:::i;:::-;1006:5;-1:-1:-1;1063:2:1;1048:18;;1035:32;1076:35;1035:32;1076:35;:::i;:::-;1130:7;1120:17;;;828:315;;;;;:::o;1148:470::-;;;;1294:2;1282:9;1273:7;1269:23;1265:32;1262:2;;;1315:6;1307;1300:22;1262:2;1359:9;1346:23;1378:33;1405:5;1378:33;:::i;:::-;1430:5;-1:-1:-1;1487:2:1;1472:18;;1459:32;1500:35;1459:32;1500:35;:::i;:::-;1252:366;;1554:7;;-1:-1:-1;;;1608:2:1;1593:18;;;;1580:32;;1252:366::o;1623:853::-;;;;;;;;1835:3;1823:9;1814:7;1810:23;1806:33;1803:2;;;1857:6;1849;1842:22;1803:2;1901:9;1888:23;1920:33;1947:5;1920:33;:::i;:::-;1972:5;-1:-1:-1;2029:2:1;2014:18;;2001:32;2042:35;2001:32;2042:35;:::i;:::-;2096:7;-1:-1:-1;2150:2:1;2135:18;;2122:32;;-1:-1:-1;2201:2:1;2186:18;;2173:32;;-1:-1:-1;2257:3:1;2242:19;;2229:33;2306:4;2293:18;;2281:31;;2271:2;;2331:6;2323;2316:22;2271:2;1793:683;;;;-1:-1:-1;1793:683:1;;;;2359:7;2413:3;2398:19;;2385:33;;-1:-1:-1;2465:3:1;2450:19;;;2437:33;;1793:683;-1:-1:-1;;1793:683:1:o;2481:327::-;;;2610:2;2598:9;2589:7;2585:23;2581:32;2578:2;;;2631:6;2623;2616:22;2578:2;2675:9;2662:23;2694:33;2721:5;2694:33;:::i;:::-;2746:5;2798:2;2783:18;;;;2770:32;;-1:-1:-1;;;2568:240:1:o;2813:297::-;;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;2954:6;2946;2939:22;2901:2;2991:9;2985:16;3044:5;3037:13;3030:21;3023:5;3020:32;3010:2;;3071:6;3063;3056:22;3737:474;;;;3893:2;3881:9;3872:7;3868:23;3864:32;3861:2;;;3914:6;3906;3899:22;3861:2;3942:42;3974:9;3942:42;:::i;:::-;3932:52;;4003:51;4050:2;4039:9;4035:18;4003:51;:::i;:::-;3993:61;;4097:2;4086:9;4082:18;4076:25;4141:10;4134:5;4130:22;4123:5;4120:33;4110:2;;4172:6;4164;4157:22;4110:2;4200:5;4190:15;;;3851:360;;;;;:::o;4216:190::-;;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4349:6;4341;4334:22;4296:2;-1:-1:-1;4377:23:1;;4286:120;-1:-1:-1;4286:120:1:o;4411:194::-;;4534:2;4522:9;4513:7;4509:23;4505:32;4502:2;;;4555:6;4547;4540:22;4502:2;-1:-1:-1;4583:16:1;;4492:113;-1:-1:-1;4492:113:1:o;4610:255::-;;;4750:2;4738:9;4729:7;4725:23;4721:32;4718:2;;;4771:6;4763;4756:22;4718:2;-1:-1:-1;;4799:16:1;;4855:2;4840:18;;;4834:25;4799:16;;4834:25;;-1:-1:-1;4708:157:1:o;4870:333::-;-1:-1:-1;;5097:2:1;5093:15;;;5089:24;;5077:37;;5148:15;;;;5144:24;5139:2;5130:12;;5123:46;5194:2;5185:12;;5017:186::o;5208:274::-;;5375:6;5369:13;5391:53;5437:6;5432:3;5425:4;5417:6;5413:17;5391:53;:::i;:::-;5460:16;;;;;5345:137;-1:-1:-1;;5345:137:1:o;5487:392::-;-1:-1:-1;;;5745:27:1;;5797:1;5788:11;;5781:27;;;;5833:2;5824:12;;5817:28;5870:2;5861:12;;5735:144::o;5884:636::-;-1:-1:-1;;;;;;6243:26:1;;6306:2;6302:15;;;;-1:-1:-1;;6298:53:1;6294:1;6285:11;;6278:74;6377:2;6368:12;;6361:28;6419:66;6414:2;6405:12;;6398:88;6511:2;6502:12;;6233:287::o;6525:203::-;-1:-1:-1;;;;;6689:32:1;;;;6671:51;;6659:2;6644:18;;6626:102::o;6733:304::-;-1:-1:-1;;;;;6963:15:1;;;6945:34;;7015:15;;7010:2;6995:18;;6988:43;6895:2;6880:18;;6862:175::o;7042:375::-;-1:-1:-1;;;;;7300:15:1;;;7282:34;;7352:15;;;;7347:2;7332:18;;7325:43;7399:2;7384:18;;7377:34;;;;7232:2;7217:18;;7199:218::o;7422:274::-;-1:-1:-1;;;;;7614:32:1;;;;7596:51;;7678:2;7663:18;;7656:34;7584:2;7569:18;;7551:145::o;7701:661::-;7872:2;7924:21;;;7994:13;;7897:18;;;8016:22;;;7701:661;;7872:2;8095:15;;;;8069:2;8054:18;;;7701:661;8141:195;8155:6;8152:1;8149:13;8141:195;;;8220:13;;-1:-1:-1;;;;;8216:39:1;8204:52;;8311:15;;;;8276:12;;;;8252:1;8170:9;8141:195;;;-1:-1:-1;8353:3:1;;7852:510;-1:-1:-1;;;;;;7852:510:1:o;8367:187::-;8532:14;;8525:22;8507:41;;8495:2;8480:18;;8462:92::o;8559:177::-;8705:25;;;8693:2;8678:18;;8660:76::o;8741:591::-;9028:25;;;-1:-1:-1;;;;;9127:15:1;;;9122:2;9107:18;;9100:43;9179:15;;;;9174:2;9159:18;;9152:43;9226:2;9211:18;;9204:34;9269:3;9254:19;;9247:35;;;;9080:3;9298:19;;9291:35;9015:3;9000:19;;8982:350::o;9337:398::-;9564:25;;;9637:4;9625:17;;;;9620:2;9605:18;;9598:45;9674:2;9659:18;;9652:34;9717:2;9702:18;;9695:34;9551:3;9536:19;;9518:217::o;10197:383::-;;10346:2;10335:9;10328:21;10378:6;10372:13;10421:6;10416:2;10405:9;10401:18;10394:34;10437:66;10496:6;10491:2;10480:9;10476:18;10471:2;10463:6;10459:15;10437:66;:::i;:::-;10564:2;10543:15;-1:-1:-1;;10539:29:1;10524:45;;;;10571:2;10520:54;;10318:262;-1:-1:-1;;10318:262:1:o;10585:406::-;10787:2;10769:21;;;10826:2;10806:18;;;10799:30;10865:34;10860:2;10845:18;;10838:62;-1:-1:-1;;;10931:2:1;10916:18;;10909:40;10981:3;10966:19;;10759:232::o;10996:403::-;11198:2;11180:21;;;11237:2;11217:18;;;11210:30;11276:34;11271:2;11256:18;;11249:62;-1:-1:-1;;;11342:2:1;11327:18;;11320:37;11389:3;11374:19;;11170:229::o;11404:329::-;11606:2;11588:21;;;11645:1;11625:18;;;11618:29;-1:-1:-1;;;11678:2:1;11663:18;;11656:36;11724:2;11709:18;;11578:155::o;11738:338::-;11940:2;11922:21;;;11979:2;11959:18;;;11952:30;-1:-1:-1;;;12013:2:1;11998:18;;11991:44;12067:2;12052:18;;11912:164::o;12081:356::-;12283:2;12265:21;;;12302:18;;;12295:30;12361:34;12356:2;12341:18;;12334:62;12428:2;12413:18;;12255:182::o;12442:339::-;12644:2;12626:21;;;12683:2;12663:18;;;12656:30;-1:-1:-1;;;12717:2:1;12702:18;;12695:45;12772:2;12757:18;;12616:165::o;12786:356::-;12988:2;12970:21;;;13007:18;;;13000:30;13066:34;13061:2;13046:18;;13039:62;13133:2;13118:18;;12960:182::o;13147:344::-;13349:2;13331:21;;;13388:2;13368:18;;;13361:30;-1:-1:-1;;;13422:2:1;13407:18;;13400:50;13482:2;13467:18;;13321:170::o;13496:341::-;13698:2;13680:21;;;13737:2;13717:18;;;13710:30;-1:-1:-1;;;13771:2:1;13756:18;;13749:47;13828:2;13813:18;;13670:167::o;13842:348::-;14044:2;14026:21;;;14083:2;14063:18;;;14056:30;14122:26;14117:2;14102:18;;14095:54;14181:2;14166:18;;14016:174::o;14195:403::-;14397:2;14379:21;;;14436:2;14416:18;;;14409:30;14475:34;14470:2;14455:18;;14448:62;-1:-1:-1;;;14541:2:1;14526:18;;14519:37;14588:3;14573:19;;14369:229::o;14603:341::-;14805:2;14787:21;;;14844:2;14824:18;;;14817:30;-1:-1:-1;;;14878:2:1;14863:18;;14856:47;14935:2;14920:18;;14777:167::o;14949:406::-;15151:2;15133:21;;;15190:2;15170:18;;;15163:30;15229:34;15224:2;15209:18;;15202:62;-1:-1:-1;;;15295:2:1;15280:18;;15273:40;15345:3;15330:19;;15123:232::o;15360:355::-;15562:2;15544:21;;;15601:2;15581:18;;;15574:30;15640:33;15635:2;15620:18;;15613:61;15706:2;15691:18;;15534:181::o;15720:355::-;15922:2;15904:21;;;15961:2;15941:18;;;15934:30;16000:33;15995:2;15980:18;;15973:61;16066:2;16051:18;;15894:181::o;16262:319::-;16464:25;;;16520:2;16505:18;;16498:34;;;;16563:2;16548:18;;16541:34;16452:2;16437:18;;16419:162::o;16586:184::-;16758:4;16746:17;;;;16728:36;;16716:2;16701:18;;16683:87::o;16775:128::-;;16846:1;16842:6;16839:1;16836:13;16833:2;;;16852:18;;:::i;:::-;-1:-1:-1;16888:9:1;;16823:80::o;16908:217::-;;16974:1;16964:2;;-1:-1:-1;;;16999:31:1;;17053:4;17050:1;17043:15;17081:4;17006:1;17071:15;16964:2;-1:-1:-1;17110:9:1;;16954:171::o;17130:453::-;17226:6;17249:5;17263:314;17312:1;17349:2;17339:8;17336:16;17326:2;;17356:5;;;17326:2;17397:4;17392:3;17388:14;17382:4;17379:24;17376:2;;;17406:18;;:::i;:::-;17456:2;17446:8;17442:17;17439:2;;;17471:16;;;;17439:2;17550:17;;;;;17510:15;;17263:314;;;17207:376;;;;;;;:::o;17588:139::-;;17677:44;-1:-1:-1;;17704:8:1;17698:4;17732:922;17816:8;17806:2;;-1:-1:-1;17857:1:1;17871:5;;17806:2;17905:4;17895:2;;-1:-1:-1;17942:1:1;17956:5;;17895:2;17987:4;18005:1;18000:59;;;;18073:1;18068:183;;;;17980:271;;18000:59;18030:1;18021:10;;18044:5;;;18068:183;18105:3;18095:8;18092:17;18089:2;;;18112:18;;:::i;:::-;18168:1;18158:8;18154:16;18145:25;;18196:3;18189:5;18186:14;18183:2;;;18203:18;;:::i;:::-;18236:5;;;17980:271;;18335:2;18325:8;18322:16;18316:3;18310:4;18307:13;18303:36;18297:2;18287:8;18284:16;18279:2;18273:4;18270:12;18266:35;18263:77;18260:2;;;-1:-1:-1;18372:19:1;;;18407:14;;;18404:2;;;18424:18;;:::i;:::-;18457:5;;18260:2;18504:42;18542:3;18532:8;18526:4;18523:1;18504:42;:::i;:::-;18579:6;18574:3;18570:16;18561:7;18558:29;18555:2;;;18590:18;;:::i;:::-;18628:20;;17796:858;-1:-1:-1;;;;17796:858:1:o;18659:168::-;;18765:1;18761;18757:6;18753:14;18750:1;18747:21;18742:1;18735:9;18728:17;18724:45;18721:2;;;18772:18;;:::i;:::-;-1:-1:-1;18812:9:1;;18711:116::o;18832:125::-;;18900:1;18897;18894:8;18891:2;;;18905:18;;:::i;:::-;-1:-1:-1;18942:9:1;;18881:76::o;18962:258::-;19034:1;19044:113;19058:6;19055:1;19052:13;19044:113;;;19134:11;;;19128:18;19115:11;;;19108:39;19080:2;19073:10;19044:113;;;19175:6;19172:1;19169:13;19166:2;;;-1:-1:-1;;19210:1:1;19192:16;;19185:27;19015:205::o;19225:135::-;;-1:-1:-1;;19285:17:1;;19282:2;;;19305:18;;:::i;:::-;-1:-1:-1;19352:1:1;19341:13;;19272:88::o;19365:127::-;19426:10;19421:3;19417:20;19414:1;19407:31;19457:4;19454:1;19447:15;19481:4;19478:1;19471:15;19497:133;-1:-1:-1;;;;;19574:31:1;;19564:42;;19554:2;;19620:1;19617;19610:12

Swarm Source

ipfs://c16ab7e80e9c19ad986fe514c380a4512ce143ef0c9f8c39a435e87077c210bf
Loading...
Loading
Loading...
Loading
[ 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.