ETH Price: $2,687.25 (+0.52%)

Token

XToken 1 (XT-1)
 

Overview

Max Total Supply

0.01832695605007004 XT-1

Holders

1

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 XT-1

Value
$0.00
0x6c046abe6585f5b103559fb95c19a31bbc6a5f9b
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:
CoFiXV2Pair

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 6666 runs

Other Settings:
istanbul EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-17
*/

// File: contracts/interface/ICoFiXV2DAO.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.6.12;

interface ICoFiXV2DAO {

    function setGovernance(address gov) external;
    function start() external; 

    // function addETHReward() external payable; 

    event FlagSet(address gov, uint256 flag);
    event CoFiBurn(address gov, uint256 amount);
}
// File: contracts/lib/TransferHelper.sol

pragma solidity 0.6.12;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/interface/IWETH.sol

pragma solidity 0.6.12;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
    function balanceOf(address account) external view returns (uint);
}

// File: contracts/interface/ICoFiXV2Controller.sol

pragma solidity 0.6.12;

interface ICoFiXV2Controller {

    event NewK(address token, uint256 K, uint256 sigma, uint256 T, uint256 ethAmount, uint256 erc20Amount, uint256 blockNum);
    event NewGovernance(address _new);
    event NewOracle(address _priceOracle);
    event NewKTable(address _kTable);
    event NewTimespan(uint256 _timeSpan);
    event NewKRefreshInterval(uint256 _interval);
    event NewKLimit(int128 maxK0);
    event NewGamma(int128 _gamma);
    event NewTheta(address token, uint32 theta);
    event NewK(address token, uint32 k);
    event NewCGamma(address token, uint32 gamma);

    function addCaller(address caller) external;

    function setCGamma(address token, uint32 gamma) external;

    function queryOracle(address token, uint8 op, bytes memory data) external payable returns (uint256 k, uint256 ethAmount, uint256 erc20Amount, uint256 blockNum, uint256 theta);

    function getKInfo(address token) external view returns (uint32 k, uint32 updatedAt, uint32 theta);

    function getLatestPriceAndAvgVola(address token) external payable returns (uint256, uint256, uint256, uint256);
}
// File: contracts/interface/ICoFiXV2Factory.sol

pragma solidity 0.6.12;

interface ICoFiXV2Factory {
    // All pairs: {ETH <-> ERC20 Token}
    event PairCreated(address indexed token, address pair, uint256);
    event NewGovernance(address _new);
    event NewController(address _new);
    event NewFeeReceiver(address _new);
    event NewFeeVaultForLP(address token, address feeVault);
    event NewVaultForLP(address _new);
    event NewVaultForTrader(address _new);
    event NewVaultForCNode(address _new);
    event NewDAO(address _new);

    /// @dev Create a new token pair for trading
    /// @param  token the address of token to trade
    /// @param  initToken0Amount the initial asset ratio (initToken0Amount:initToken1Amount)
    /// @param  initToken1Amount the initial asset ratio (initToken0Amount:initToken1Amount)
    /// @return pair the address of new token pair
    function createPair(
        address token,
	    uint256 initToken0Amount,
        uint256 initToken1Amount
        )
        external
        returns (address pair);

    function getPair(address token) external view returns (address pair);
    function allPairs(uint256) external view returns (address pair);
    function allPairsLength() external view returns (uint256);

    function getTradeMiningStatus(address token) external view returns (bool status);
    function setTradeMiningStatus(address token, bool status) external;
    function getFeeVaultForLP(address token) external view returns (address feeVault); // for LPs
    function setFeeVaultForLP(address token, address feeVault) external;

    function setGovernance(address _new) external;
    function setController(address _new) external;
    function setFeeReceiver(address _new) external;
    function setVaultForLP(address _new) external;
    function setVaultForTrader(address _new) external;
    function setVaultForCNode(address _new) external;
    function setDAO(address _new) external;
    function getController() external view returns (address controller);
    function getFeeReceiver() external view returns (address feeReceiver); // For CoFi Holders
    function getVaultForLP() external view returns (address vaultForLP);
    function getVaultForTrader() external view returns (address vaultForTrader);
    function getVaultForCNode() external view returns (address vaultForCNode);
    function getDAO() external view returns (address dao);
}

// File: contracts/interface/ICoFiXERC20.sol

pragma solidity 0.6.12;

interface ICoFiXERC20 {
    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;
}

// File: contracts/CoFiXERC20.sol

pragma experimental ABIEncoderV2;

pragma solidity 0.6.12;

// ERC20 token implementation, inherited by CoFiXPair contract, no owner or governance
contract CoFiXERC20 is ICoFiXERC20 {
    using SafeMath for uint;

    string public constant nameForDomain = 'CoFiX Pool Token';
    uint8 public override constant decimals = 18;
    uint  public override totalSupply;
    mapping(address => uint) public override balanceOf;
    mapping(address => mapping(address => uint)) public override allowance;

    bytes32 public override DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public override constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public override nonces;

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

    constructor() public {
        uint chainId;
        assembly {
            chainId := chainid()
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes(nameForDomain)),
                keccak256(bytes('1')),
                chainId,
                address(this)
            )
        );
    }

    function _mint(address to, uint value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) external override returns (bool) {
        if (allowance[from][msg.sender] != uint(-1)) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
        require(deadline >= block.timestamp, 'CERC20: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'CERC20: INVALID_SIGNATURE');
        _approve(owner, spender, value);
    }
}

// File: contracts/interface/ICoFiXV2Pair.sol

pragma solidity 0.6.12;

interface ICoFiXV2Pair is ICoFiXERC20 {

    struct OraclePrice {
        uint256 ethAmount;
        uint256 erc20Amount;
        uint256 blockNum;
        uint256 K;
        uint256 theta;
    }

    // All pairs: {ETH <-> ERC20 Token}
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, address outToken, uint outAmount, address indexed to);
    event Swap(
        address indexed sender,
        uint amountIn,
        uint amountOut,
        address outToken,
        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);

    function mint(address to, uint amountETH, uint amountToken) external payable returns (uint liquidity, uint oracleFeeChange);
    function burn(address tokenTo, address ethTo) external payable returns (uint amountTokenOut, uint amountETHOut, uint oracleFeeChange);
    function swapWithExact(address outToken, address to) external payable returns (uint amountIn, uint amountOut, uint oracleFeeChange, uint256[5] memory tradeInfo);
    // function swapForExact(address outToken, uint amountOutExact, address to) external payable returns (uint amountIn, uint amountOut, uint oracleFeeChange, uint256[4] memory tradeInfo);
    function skim(address to) external;
    function sync() external;

    function initialize(address, address, string memory, string memory, uint256, uint256) external;

    /// @dev get Net Asset Value Per Share
    /// @param  ethAmount ETH side of Oracle price {ETH <-> ERC20 Token}
    /// @param  erc20Amount Token side of Oracle price {ETH <-> ERC20 Token}
    /// @return navps The Net Asset Value Per Share (liquidity) represents
    function getNAVPerShare(uint256 ethAmount, uint256 erc20Amount) external view returns (uint256 navps);

    /// @dev get initial asset ratio
    /// @return _initToken0Amount Token0(ETH) side of initial asset ratio {ETH <-> ERC20 Token}
    /// @return _initToken1Amount Token1(ERC20) side of initial asset ratio {ETH <-> ERC20 Token}
    function getInitialAssetRatio() external view returns (uint256 _initToken0Amount, uint256 _initToken1Amount);
}

// File: contracts/CoFiXV2Pair.sol

pragma solidity 0.6.12;

// Pair contract for each trading pair, storing assets and handling settlement
// No owner or governance
contract CoFiXV2Pair is ICoFiXV2Pair, CoFiXERC20 {
    using SafeMath for uint;

    enum CoFiX_OP { QUERY, MINT, BURN, SWAP_WITH_EXACT, SWAP_FOR_EXACT } // operations in CoFiX

    uint public override constant MINIMUM_LIQUIDITY = 10**9; // it's negligible because we calc liquidity in ETH
    bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)")));

    uint256 constant public K_BASE = 1E8; // K
    uint256 constant public NAVPS_BASE = 1E18; // NAVPS (Net Asset Value Per Share), need accuracy
    uint256 constant public THETA_BASE = 1E8; // theta

    string public name;
    string public symbol;

    address public override immutable factory;
    address public override token0; // WETH token
    address public override token1; // any ERC20 token

    uint112 private reserve0;           // uses single storage slot, accessible via getReserves
    uint112 private reserve1;           // uses single storage slot, accessible via getReserves

    uint256 public initToken1Amount;
    uint256 public initToken0Amount;

    uint private unlocked = 1;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, address outToken, uint outAmount, address indexed to);
    event Swap(
        address indexed sender,
        uint amountIn,
        uint amountOut,
        address outToken,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    modifier lock() {
        require(unlocked == 1, "CPair: LOCKED");
        unlocked = 0;
        _;
        unlocked = 1;
    }

    constructor() public {
        factory = msg.sender;
    }

    receive() external payable {}

    // called once by the factory at time of deployment
    function initialize(address _token0, address _token1, string memory _name, string memory _symbol, uint256 _initToken0Amount, uint256 _initToken1Amount) external override {
        require(msg.sender == factory, "CPair: FORBIDDEN"); // sufficient check
        token0 = _token0;
        token1 = _token1;
        name = _name;
        symbol = _symbol;
        initToken1Amount = _initToken1Amount;
        initToken0Amount = _initToken0Amount;
    }

    function getInitialAssetRatio() public override view returns (uint256 _initToken0Amount, uint256 _initToken1Amount) {
        _initToken1Amount = initToken1Amount;
        _initToken0Amount = initToken0Amount;
    }

    function getReserves() public override view returns (uint112 _reserve0, uint112 _reserve1) {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
    }

    function _safeTransfer(address token, address to, uint value) private {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "CPair: TRANSFER_FAILED");
    }

    // update reserves
    function _update(uint balance0, uint balance1) private {
        require(balance0 <= uint112(-1) && balance1 <= uint112(-1), "CPair: OVERFLOW");
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        emit Sync(reserve0, reserve1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(address to, uint amountETH, uint amountToken) external payable override lock returns (uint liquidity, uint oracleFeeChange) {
        address _token0 = token0;                                // gas savings
        address _token1 = token1;                                // gas savings
        (uint112 _reserve0, uint112 _reserve1) = getReserves(); // gas savings
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint amount0 = balance0.sub(_reserve0);
        uint amount1 = balance1.sub(_reserve1);

        require(amountETH <= amount0 && amountToken <= amount1, "CPair: illegal ammount");
        
        amount0 = amountETH;
        amount1 = amountToken;
        require(amount0.mul(initToken1Amount) == amount1.mul(initToken0Amount), "CPair: invalid asset ratio");
        
        uint256 _ethBalanceBefore = address(this).balance;
        { // scope for ethAmount/erc20Amount/blockNum to avoid stack too deep error
            bytes memory data = abi.encode(msg.sender, to, amount0, amount1);
            // query price
            OraclePrice memory _op;
            (_op.K, _op.ethAmount, _op.erc20Amount, _op.blockNum, _op.theta) = _queryOracle(_token1, CoFiX_OP.MINT, data);
            uint256 navps = calcNAVPerShare(_reserve0, _reserve1, _op.ethAmount, _op.erc20Amount);
            if (totalSupply == 0) {
                liquidity = calcLiquidity(amount0, navps).sub(MINIMUM_LIQUIDITY);
                _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
            } else {
                liquidity = calcLiquidity(amount0, navps);
            }
        }
        oracleFeeChange = msg.value.sub(_ethBalanceBefore.sub(address(this).balance));

        require(liquidity > 0, "CPair: SHORT_LIQUIDITY_MINTED");
        _mint(to, liquidity);

        _update(balance0, balance1);
        if (oracleFeeChange > 0) TransferHelper.safeTransferETH(msg.sender, oracleFeeChange);

        emit Mint(msg.sender, amount0, amount1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(address tokenTo, address ethTo) external payable override lock returns (uint amountTokenOut, uint amountEthOut, uint oracleFeeChange) {
        address _token0 = token0;                                // gas savings
        address _token1 = token1;                                // gas savings
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint liquidity = balanceOf[address(this)];

        uint256 _ethBalanceBefore = address(this).balance;
        // uint256 fee;
        {
            bytes memory data = abi.encode(msg.sender, liquidity);
            // query price
            OraclePrice memory _op;
            (_op.K, _op.ethAmount, _op.erc20Amount, _op.blockNum, _op.theta) = _queryOracle(_token1, CoFiX_OP.BURN, data);

            (amountTokenOut, amountEthOut) = calcOutTokenAndETHForBurn(liquidity, _op); // navps calculated
        }
        oracleFeeChange = msg.value.sub(_ethBalanceBefore.sub(address(this).balance));

        require(amountTokenOut > 0 && amountEthOut > 0, "CPair: SHORT_LIQUIDITY_BURNED");

        _burn(address(this), liquidity);
        _safeTransfer(_token1, tokenTo, amountTokenOut);
        _safeTransfer(_token0, ethTo, amountEthOut);

        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));

        _update(balance0, balance1);
        if (oracleFeeChange > 0) TransferHelper.safeTransferETH(msg.sender, oracleFeeChange);

        emit Burn(msg.sender, _token0, amountEthOut, ethTo);
        emit Burn(msg.sender, _token1, amountTokenOut, tokenTo);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swapWithExact(address outToken, address to)
        external
        payable override lock
        returns (uint amountIn, uint amountOut, uint oracleFeeChange, uint256[5] memory tradeInfo)
    {
        // tradeInfo[0]: thetaFee, tradeInfo[1]: ethAmount, tradeInfo[2]: erc20Amount
        address _token0 = token0;
        address _token1 = token1;
        uint256 balance0 = IERC20(_token0).balanceOf(address(this));
        uint256 balance1 = IERC20(_token1).balanceOf(address(this));

        // uint256 fee;
        { // scope for ethAmount/erc20Amount/blockNum to avoid stack too deep error
            uint256 _ethBalanceBefore = address(this).balance;
            (uint112 _reserve0, uint112 _reserve1) = getReserves(); // gas savings

            // calc amountIn
            if (outToken == _token1) {
                amountIn = balance0.sub(_reserve0);
            } else if (outToken == _token0) {
                amountIn = balance1.sub(_reserve1);
            } else {
                revert("CPair: wrong outToken");
            }
            require(amountIn > 0, "CPair: wrong amountIn");
            bytes memory data = abi.encode(msg.sender, outToken, to, amountIn);
            // query price
            OraclePrice memory _op;
            (_op.K, _op.ethAmount, _op.erc20Amount, _op.blockNum, _op.theta) = _queryOracle(_token1, CoFiX_OP.SWAP_WITH_EXACT, data);
            
            if (outToken == _token1) {
                (amountOut, tradeInfo[0]) = calcOutToken1(amountIn, _op);
            } else if (outToken == _token0) {
                (amountOut, tradeInfo[0]) = calcOutToken0(amountIn, _op);
            }
            oracleFeeChange = msg.value.sub(_ethBalanceBefore.sub(address(this).balance));
            tradeInfo[1] = _op.ethAmount;
            tradeInfo[2] = _op.erc20Amount;
        }
        
        require(to != _token0 && to != _token1, "CPair: INVALID_TO");

        _safeTransfer(outToken, to, amountOut); // optimistically transfer tokens
        if (tradeInfo[0] > 0) {
            if (ICoFiXV2Factory(factory).getTradeMiningStatus(_token1)) {
                // only transfer fee to protocol feeReceiver when trade mining is enabled for this trading pair
                _safeSendFeeForDAO(_token0, tradeInfo[0]);
            } else {
                _safeSendFeeForLP(_token0, _token1, tradeInfo[0]);
                tradeInfo[0] = 0; // so router won't go into the trade mining logic (reduce one more call gas cost)
            }
        }
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));

        _update(balance0, balance1);
        if (oracleFeeChange > 0) TransferHelper.safeTransferETH(msg.sender, oracleFeeChange);

        emit Swap(msg.sender, amountIn, amountOut, outToken, to);
    }

    // force balances to match reserves
    function skim(address to) external override lock {
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));
        _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));
    }

    // force reserves to match balances
    function sync() external override lock {
        _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)));
    }

    // calc Net Asset Value Per Share (no K)
    // use it in this contract, for optimized gas usage
    function calcNAVPerShare(uint256 balance0, uint256 balance1, uint256 ethAmount, uint256 erc20Amount) public view returns (uint256 navps) {
        uint _totalSupply = totalSupply;
        if (_totalSupply == 0) {
            navps = NAVPS_BASE;
        } else {
            /*
            NV  = \frac{E_t + U_t/P_t}{(1 + \frac{k_0}{P_t})*F_t}\\\\
                = \frac{E_t + U_t * \frac{ethAmount}{erc20Amount}}{(1 + \frac{initToken1Amount}{initToken0Amount} * \frac{ethAmount}{erc20Amount})*F_t}\\\\
                = \frac{E_t * erc20Amount + U_t * ethAmount}{(erc20Amount + \frac{initToken1Amount * ethAmount}{initToken0Amount}) * F_t}\\\\
                = \frac{E_t * erc20Amount * initToken0Amount + U_t * ethAmount * initToken0Amount}{( erc20Amount * initToken0Amount + initToken1Amount * ethAmount) * F_t} \\\\
                = \frac{balance0 * erc20Amount * initToken0Amount + balance1 * ethAmount * initToken0Amount}{(erc20Amount * initToken0Amount + initToken1Amount * ethAmount) * totalSupply}
             */
            uint256 balance0MulErc20AmountMulInitToken0Amount = balance0.mul(erc20Amount).mul(initToken0Amount);
            uint256 balance1MulEthAmountMulInitToken0Amount = balance1.mul(ethAmount).mul(initToken0Amount);
            uint256 initToken1AmountMulEthAmount = initToken1Amount.mul(ethAmount);
            uint256 initToken0AmountMulErc20Amount = erc20Amount.mul(initToken0Amount);

            navps = (balance0MulErc20AmountMulInitToken0Amount.add(balance1MulEthAmountMulInitToken0Amount))
                        .div(_totalSupply).mul(NAVPS_BASE)
                        .div(initToken1AmountMulEthAmount.add(initToken0AmountMulErc20Amount));
        }
    }

    // use it in this contract, for optimized gas usage
    function calcLiquidity(uint256 amount0, uint256 navps) public pure returns (uint256 liquidity) {
        liquidity = amount0.mul(NAVPS_BASE).div(navps);
    }

    // get Net Asset Value Per Share for mint
    // only for read, could cost more gas if use it directly in contract
    function getNAVPerShareForMint(OraclePrice memory _op) public view returns (uint256 navps) {
        return calcNAVPerShare(reserve0, reserve1, _op.ethAmount, _op.erc20Amount);
    }

    // get Net Asset Value Per Share for burn
    // only for read, could cost more gas if use it directly in contract
    function getNAVPerShareForBurn(OraclePrice memory _op) external view returns (uint256 navps) {
        return calcNAVPerShare(reserve0, reserve1, _op.ethAmount, _op.erc20Amount);
    }

    // get Net Asset Value Per Share
    // only for read, could cost more gas if use it directly in contract
    function getNAVPerShare(uint256 ethAmount, uint256 erc20Amount) external override view returns (uint256 navps) {
        return calcNAVPerShare(reserve0, reserve1, ethAmount, erc20Amount);
    }

    // get estimated liquidity amount (it represents the amount of pool tokens will be minted if someone provide liquidity to the pool)
    // only for read, could cost more gas if use it directly in contract
    function getLiquidity(uint256 amount0, OraclePrice memory _op) external view returns (uint256 liquidity) {
        uint256 navps = getNAVPerShareForMint(_op);
        return calcLiquidity(amount0, navps);
    }

    function calcOutTokenAndETHForBurn(uint256 liquidity, OraclePrice memory _op) public view returns (uint256 amountTokenOut, uint256 amountEthOut) {
        // amountEthOut = liquidity * navps * (THETA_BASE - theta) / THETA_BASE
        // amountTokenOut = liquidity * navps * (THETA_BASE - theta) * initToken1Amount / (initToken0Amount * THETA_BASE)
        uint256 navps;
        {
            navps = calcNAVPerShare(reserve0, reserve1, _op.ethAmount, _op.erc20Amount);
            uint256 amountEth = liquidity.mul(navps);

            uint256 amountEthOutLarge = amountEth.mul(THETA_BASE.sub(_op.theta));
            amountEthOut = amountEthOutLarge.div(NAVPS_BASE).div(THETA_BASE);
            amountTokenOut = amountEthOutLarge.mul(initToken1Amount).div(NAVPS_BASE).div(initToken0Amount).div(THETA_BASE);
            // amountTokenOut = amountEthOut.mul(initToken1Amount).div(initToken0Amount);
        }

        // recalc amountOut when has no enough reserve0 or reserve1 to out in initAssetRatio
        {
            if (amountEthOut > reserve0) {
                // user first, out eth as much as possibile. And may leave over a few amounts of reserve1. 
                uint256 amountEthInsufficient = amountEthOut - reserve0;
                uint256 amountTokenEquivalent = amountEthInsufficient.mul(_op.erc20Amount).div(_op.ethAmount);
                amountTokenOut = amountTokenOut.add(amountTokenEquivalent);
                if (amountTokenOut > reserve1) {
                    amountTokenOut = reserve1;
                }
                amountEthOut = reserve0;
                // amountEthOut = reserve0 - fee;    
            } else if (amountTokenOut > reserve1) {
                uint256 amountTokenInsufficient = amountTokenOut - reserve1;
                uint256 amountEthEquivalent = amountTokenInsufficient.mul(_op.ethAmount).div(_op.erc20Amount);
                amountEthOut = amountEthOut.add(amountEthEquivalent);
                if (amountEthOut > reserve0) {
                    amountEthOut = reserve0;
                }
                amountTokenOut = reserve1;
            }
        }   
    }

    // get estimated amountOut for token0 (WETH) when swapWithExact
    function calcOutToken0(uint256 amountIn, OraclePrice memory _op) public pure returns (uint256 amountOut, uint256 fee) {
        /*
        x &= (a/P_{b}^{'})*\frac{THETA_{BASE} - \theta}{THETA_{BASE}} \\\\
          &= a / (\frac{erc20Amount}{ethAmount} * \frac{(k_{BASE} + k)}{(k_{BASE})}) * \frac{THETA_{BASE} - \theta}{THETA_{BASE}} \\\\
          &= \frac{a*ethAmount*k_{BASE}}{erc20Amount*(k_{BASE} + k)} * \frac{THETA_{BASE} - \theta}{THETA_{BASE}} \\\\
          &= \frac{a*ethAmount*k_{BASE}*(THETA_{BASE} - \theta)}{erc20Amount*(k_{BASE} + k)*THETA_{BASE}} \\\\
        // amountOut = amountIn * _op.ethAmount * K_BASE * (THETA_BASE - _op.theta) / _op.erc20Amount / (K_BASE + _op.K) / THETA_BASE;
        */
        amountOut = amountIn.mul(_op.ethAmount).mul(K_BASE).mul(THETA_BASE.sub(_op.theta)).div(_op.erc20Amount).div(K_BASE.add(_op.K)).div(THETA_BASE);
        if (_op.theta != 0) {
            // fee = amountIn * _op.ethAmount * K_BASE * (_op.theta) / _op.erc20Amount / (K_BASE + _op.K) / THETA_BASE;
            fee = amountIn.mul(_op.ethAmount).mul(K_BASE).mul(_op.theta).div(_op.erc20Amount).div(K_BASE.add(_op.K)).div(THETA_BASE);
        }
        return (amountOut, fee);
    }

    // get estimated amountOut for token1 (ERC20 token) when swapWithExact
    function calcOutToken1(uint256 amountIn, OraclePrice memory _op) public pure returns (uint256 amountOut, uint256 fee) {
        /*
        y &= b*P_{s}^{'}*\frac{THETA_{BASE} - \theta}{THETA_{BASE}} \\\\
          &= b * \frac{erc20Amount}{ethAmount} * \frac{(k_{BASE} - k)}{(k_{BASE})} * \frac{THETA_{BASE} - \theta}{THETA_{BASE}} \\\\
          &= \frac{b*erc20Amount*(k_{BASE} - k)*(THETA_{BASE} - \theta)}{ethAmount*k_{BASE}*THETA_{BASE}} \\\\
        // amountOut = amountIn * _op.erc20Amount * (K_BASE - _op.K) * (THETA_BASE - _op.theta) / _op.ethAmount / K_BASE / THETA_BASE;
        */
        amountOut = amountIn.mul(_op.erc20Amount).mul(K_BASE.sub(_op.K)).mul(THETA_BASE.sub(_op.theta)).div(_op.ethAmount).div(K_BASE).div(THETA_BASE);
        if (_op.theta != 0) {
            // fee = amountIn * _op.theta / THETA_BASE;
            fee = amountIn.mul(_op.theta).div(THETA_BASE);
        }
        return (amountOut, fee);
    }

    // get estimate amountInNeeded for token0 (WETH) when swapForExact
    function calcInNeededToken0(uint256 amountOut, OraclePrice memory _op) public pure returns (uint256 amountInNeeded, uint256 fee) {
        // inverse of calcOutToken1
        // amountOut = amountIn.mul(_op.erc20Amount).mul(K_BASE.sub(_op.K)).mul(THETA_BASE.sub(_op.theta)).div(_op.ethAmount).div(K_BASE).div(THETA_BASE);
        amountInNeeded = amountOut.mul(_op.ethAmount).mul(K_BASE).mul(THETA_BASE).div(_op.erc20Amount).div(K_BASE.sub(_op.K)).div(THETA_BASE.sub(_op.theta));
        if (_op.theta != 0) {
            // fee = amountIn * _op.theta / THETA_BASE;
            fee = amountInNeeded.mul(_op.theta).div(THETA_BASE);
        }
        return (amountInNeeded, fee);
    }

    // get estimate amountInNeeded for token1 (ERC20 token) when swapForExact
    function calcInNeededToken1(uint256 amountOut, OraclePrice memory _op) public pure returns (uint256 amountInNeeded, uint256 fee) {
        // inverse of calcOutToken0
        // amountOut = amountIn.mul(_op.ethAmount).mul(K_BASE).mul(THETA_BASE.sub(_op.theta)).div(_op.erc20Amount).div(K_BASE.add(_op.K)).div(THETA_BASE);
        amountInNeeded = amountOut.mul(_op.erc20Amount).mul(K_BASE.add(_op.K)).mul(THETA_BASE).div(_op.ethAmount).div(K_BASE).div(THETA_BASE.sub(_op.theta));
        if (_op.theta != 0) {
            // fee = amountIn * _op.ethAmount * K_BASE * (_op.theta) / _op.erc20Amount / (K_BASE + _op.K) / THETA_BASE;
            fee = amountInNeeded.mul(_op.ethAmount).mul(K_BASE).mul(_op.theta).div(_op.erc20Amount).div(K_BASE.add(_op.K)).div(THETA_BASE);
        }
        return (amountInNeeded, fee);
    }

    function _queryOracle(address token, CoFiX_OP op, bytes memory data) internal returns (uint256, uint256, uint256, uint256, uint256) {
        return ICoFiXV2Controller(ICoFiXV2Factory(factory).getController()).queryOracle{value: msg.value}(token, uint8(op), data);
    }

    function _safeSendFeeForDAO(address _token0, uint256 _fee) internal {
        address feeReceiver = ICoFiXV2Factory(factory).getFeeReceiver();
        if (feeReceiver == address(0)) {
            return; // if feeReceiver not set, theta fee keeps in pair pool
        }
        uint256 bal = IWETH(_token0).balanceOf(address(this));
        if (_fee > bal) {
            _fee = bal;
        }

        IWETH(_token0).withdraw(_fee);
        if (_fee > 0) TransferHelper.safeTransferETH(feeReceiver, _fee); // transfer fee to protocol dao for redeem Cofi
        // ICoFiXV2DAO(dao).addETHReward{value: _fee}(); 
    }

    // Safe WETH transfer function, just in case not having enough WETH. LP will earn these fees.
    function _safeSendFeeForLP(address _token0, address _token1, uint256 _fee) internal {
        address feeVault = ICoFiXV2Factory(factory).getFeeVaultForLP(_token1);
        if (feeVault == address(0)) {
            return; // if fee vault not set, theta fee keeps in pair pool
        }
        _safeSendFee(_token0, feeVault, _fee); // transfer fee to protocol fee reward pool for LP
    }

    function _safeSendFee(address _token0, address _receiver, uint256 _fee) internal {
        uint256 wethBal = IERC20(_token0).balanceOf(address(this));
        if (_fee > wethBal) {
            _fee = wethBal;
        }
        if (_fee > 0) _safeTransfer(_token0, _receiver, _fee); 
    }
}
// 🦄 & CoFi Rocks

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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"outToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"outAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"outToken","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"K_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAVPS_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THETA_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"address","name":"ethTo","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amountTokenOut","type":"uint256"},{"internalType":"uint256","name":"amountEthOut","type":"uint256"},{"internalType":"uint256","name":"oracleFeeChange","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"calcInNeededToken0","outputs":[{"internalType":"uint256","name":"amountInNeeded","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"calcInNeededToken1","outputs":[{"internalType":"uint256","name":"amountInNeeded","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"navps","type":"uint256"}],"name":"calcLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance0","type":"uint256"},{"internalType":"uint256","name":"balance1","type":"uint256"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"}],"name":"calcNAVPerShare","outputs":[{"internalType":"uint256","name":"navps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"calcOutToken0","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"calcOutToken1","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"calcOutTokenAndETHForBurn","outputs":[{"internalType":"uint256","name":"amountTokenOut","type":"uint256"},{"internalType":"uint256","name":"amountEthOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInitialAssetRatio","outputs":[{"internalType":"uint256","name":"_initToken0Amount","type":"uint256"},{"internalType":"uint256","name":"_initToken1Amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"getLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"}],"name":"getNAVPerShare","outputs":[{"internalType":"uint256","name":"navps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"getNAVPerShareForBurn","outputs":[{"internalType":"uint256","name":"navps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"K","type":"uint256"},{"internalType":"uint256","name":"theta","type":"uint256"}],"internalType":"struct ICoFiXV2Pair.OraclePrice","name":"_op","type":"tuple"}],"name":"getNAVPerShareForMint","outputs":[{"internalType":"uint256","name":"navps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initToken0Amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initToken1Amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_initToken0Amount","type":"uint256"},{"internalType":"uint256","name":"_initToken1Amount","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"oracleFeeChange","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameForDomain","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"outToken","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"swapWithExact","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"oracleFeeChange","type":"uint256"},{"internalType":"uint256[5]","name":"tradeInfo","type":"uint256[5]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526001600c553480156200001657600080fd5b50604080518082018252601081526f21b7a334ac102837b7b6102a37b5b2b760811b6020918201528151808301835260018152603160f81b9082015290514691620000cc917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f917f70f1d8d3a2b874a116643bbbdb7e2937ce56e0359f9c3070aac2ec77a8354ccc917fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6918691309101620000f5565b60408051601f198184030181529190528051602090910120600355503360601b60805262000121565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60805160601c61392c620001586000398061148e5280611a6f5280611f0652806123b95280612a095280612bff525061392c6000f3fe6080604052600436106102d55760003560e01c806395d89b4111610179578063bc25cf77116100d6578063d385a3ad1161008a578063e5eac39011610064578063e5eac39014610731578063f22e2ae014610751578063fff6cae914610766576102dc565b8063d385a3ad146106d1578063d505accf146106f1578063dd62ed3e14610711576102dc565b8063bf36aac2116100bb578063bf36aac214610687578063c45a0155146106a7578063d21220a7146106bc576102dc565b8063bc25cf7714610667578063be5b32f8146104a4576102dc565b8063a661dbda1161012d578063aaf07e9211610112578063aaf07e921461047a578063ac931c5a14610632578063ba9a7a5614610652576102dc565b8063a661dbda146105fd578063a9059cbb14610612576102dc565b80639c673c521161015e5780639c673c52146105a55780639f44296a146105c5578063a1da4d24146105e8576102dc565b806395d89b411461057057806399f45e4814610585576102dc565b806330adf81f116102325780634f6ec2dd116101e657806379c2c954116101c057806379c2c954146105195780637ecebe001461053b5780638a2ffb961461055b576102dc565b80634f6ec2dd146104c45780635ad6bd30146104d957806370a08231146104f9576102dc565b80633298613111610217578063329861311461047a5780633644e5151461048f57806339818b66146104a4576102dc565b806330adf81f14610443578063313ce56714610458576102dc565b806318160ddd1161028957806323b872dd1161026e57806323b872dd146103e157806324334be81461040157806327fc84a314610421576102dc565b806318160ddd1461039f5780631feb1886146103c1576102dc565b8063095ea7b3116102ba578063095ea7b31461032f5780630dfe16811461035c578063156e29f61461037e576102dc565b806306fdde03146102e15780630902f1ac1461030c576102dc565b366102dc57005b600080fd5b3480156102ed57600080fd5b506102f661077b565b6040516103039190613391565b60405180910390f35b34801561031857600080fd5b50610321610827565b6040516103039291906137ce565b34801561033b57600080fd5b5061034f61034a366004613093565b610854565b604051610303919061332b565b34801561036857600080fd5b5061037161086b565b6040516103039190613277565b61039161038c3660046130be565b61087a565b6040516103039291906137ef565b3480156103ab57600080fd5b506103b4610bfe565b6040516103039190613336565b3480156103cd57600080fd5b506103916103dc366004613145565b610c04565b3480156103ed57600080fd5b5061034f6103fc366004612fde565b610e80565b34801561040d57600080fd5b506103b461041c366004613168565b610f32565b61043461042f366004612f0e565b610f70565b6040516103039392919061381c565b34801561044f57600080fd5b506103b4611345565b34801561046457600080fd5b5061046d611369565b604051610303919061387d565b34801561048657600080fd5b506103b461136e565b34801561049b57600080fd5b506103b4611376565b3480156104b057600080fd5b506103b46104bf366004613112565b61137c565b3480156104d057600080fd5b506103b46113ba565b3480156104e557600080fd5b506103916104f4366004613145565b6113c6565b34801561050557600080fd5b506103b4610514366004612ed6565b611471565b34801561052557600080fd5b50610539610534366004612f46565b611483565b005b34801561054757600080fd5b506103b4610556366004612ed6565b611547565b34801561056757600080fd5b506103b4611559565b34801561057c57600080fd5b506102f661155f565b34801561059157600080fd5b506103b46105a0366004613189565b6115d8565b3480156105b157600080fd5b506103916105c0366004613145565b61168b565b6105d86105d3366004612f0e565b61171f565b6040516103039493929190613832565b3480156105f457600080fd5b50610391611c99565b34801561060957600080fd5b506102f6611ca2565b34801561061e57600080fd5b5061034f61062d366004613093565b611cdb565b34801561063e57600080fd5b506103b461064d366004613168565b611ce8565b34801561065e57600080fd5b506103b4611d00565b34801561067357600080fd5b50610539610682366004612ed6565b611d08565b34801561069357600080fd5b506103916106a2366004613145565b611e4a565b3480156106b357600080fd5b50610371611f04565b3480156106c857600080fd5b50610371611f28565b3480156106dd57600080fd5b506103b46106ec366004613145565b611f37565b3480156106fd57600080fd5b5061053961070c36600461301e565b611f57565b34801561071d57600080fd5b506103b461072c366004612f0e565b6120c6565b34801561073d57600080fd5b5061039161074c366004613145565b6120e3565b34801561075d57600080fd5b506103b46121aa565b34801561077257600080fd5b506105396121b0565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561081f5780601f106107f45761010080835404028352916020019161081f565b820191906000526020600020905b81548152906001019060200180831161080257829003601f168201915b505050505081565b6009546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000009092041690565b60006108613384846122e5565b5060015b92915050565b6007546001600160a01b031681565b600080600c546001146108a85760405162461bcd60e51b815260040161089f906133a4565b60405180910390fd5b6000600c8190556007546008546001600160a01b0391821692911690806108cd610827565b915091506000846001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108ff9190613277565b60206040518083038186803b15801561091757600080fd5b505afa15801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f919061312d565b90506000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161097f9190613277565b60206040518083038186803b15801561099757600080fd5b505afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf919061312d565b905060006109ed836dffffffffffffffffffffffffffff871661234d565b90506000610a0b836dffffffffffffffffffffffffffff871661234d565b9050818c11158015610a1d5750808b11155b610a395760405162461bcd60e51b815260040161089f906135f0565b5050600b548a908a90610a4d908290612375565b600a54610a5b908490612375565b14610a785760405162461bcd60e51b815260040161089f906134ee565b60004790506060338f8585604051602001610a9694939291906132b5565b6040516020818303038152906040529050610aaf612d3e565b610abb8a6001846123af565b60808601526040850152602084018190528184526060840192909252600091610afb916dffffffffffffffffffffffffffff808e1692908d1691906115d8565b905060005460001415610b3657610b20633b9aca00610b1a8884611ce8565b9061234d565b9d50610b316000633b9aca006124e9565b610b43565b610b408682611ce8565b9d505b50610b5c9150610b559050824761234d565b349061234d565b995060008b11610b7e5760405162461bcd60e51b815260040161089f9061365e565b610b888e8c6124e9565b610b928585612576565b8915610ba257610ba2338b61267c565b336001600160a01b03167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f8484604051610bdd9291906137ef565b60405180910390a25050505050505050506001600c81905550935093915050565b60005481565b6009548151602083015160009283928392610c46926dffffffffffffffffffffffffffff808216936e01000000000000000000000000000090920416916115d8565b90506000610c548683612375565b90506000610c7d610c7687608001516305f5e10061234d90919063ffffffff16565b8390612375565b9050610c9f6305f5e100610c9983670de0b6b3a764000061270e565b9061270e565b9350610cd06305f5e100610c99600b54610c99670de0b6b3a7640000610c99600a548861237590919063ffffffff16565b6009549095506dffffffffffffffffffffffffffff168411159150610da1905057600954845160208601516dffffffffffffffffffffffffffff909216840391600091610d2291610c99908590612375565b9050610d2e8582612740565b6009549095506e01000000000000000000000000000090046dffffffffffffffffffffffffffff16851115610d85576009546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1694505b50506009546dffffffffffffffffffffffffffff169150610e78565b6009546e01000000000000000000000000000090046dffffffffffffffffffffffffffff16831115610e7857600954602085015185516e0100000000000000000000000000009092046dffffffffffffffffffffffffffff16850391600091610e0f91610c99908590612375565b9050610e1b8482612740565b6009549094506dffffffffffffffffffffffffffff16841115610e4e576009546dffffffffffffffffffffffffffff1693505b50506009546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1692505b509250929050565b6001600160a01b03831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610f1d576001600160a01b0384166000908152600260209081526040808320338452909152902054610ef8908361234d565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610f28848484612765565b5060019392505050565b600954600090610f69906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041685856115d8565b9392505050565b6000806000600c54600114610f975760405162461bcd60e51b815260040161089f906133a4565b6000600c8190556007546008546040516370a0823160e01b81526001600160a01b0392831693919092169183906370a0823190610fd8903090600401613277565b60206040518083038186803b158015610ff057600080fd5b505afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611028919061312d565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016110589190613277565b60206040518083038186803b15801561107057600080fd5b505afa158015611084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a8919061312d565b30600090815260016020908152604091829020549151929350909147916060916110d69133918691016132de565b60405160208183030381529060405290506110ef612d3e565b6110fb876002846123af565b6080860152604085015260208401528252606082015261111b8482610c04565b909b5099506111319150610b559050824761234d565b96506000891180156111435750600088115b61115f5760405162461bcd60e51b815260040161089f90613627565b6111693083612809565b611174858c8b612893565b61117f868b8a612893565b6040516370a0823160e01b81526001600160a01b038716906370a08231906111ab903090600401613277565b60206040518083038186803b1580156111c357600080fd5b505afa1580156111d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fb919061312d565b6040516370a0823160e01b81529094506001600160a01b038616906370a082319061122a903090600401613277565b60206040518083038186803b15801561124257600080fd5b505afa158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a919061312d565b92506112868484612576565b861561129657611296338861267c565b896001600160a01b0316336001600160a01b03167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373888b6040516112db9291906132de565b60405180910390a38a6001600160a01b0316336001600160a01b03167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373878c6040516113289291906132de565b60405180910390a35050505050506001600c819055509250925092565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6305f5e10081565b60035481565b60095481516020830151600092610865926dffffffffffffffffffffffffffff808316936e01000000000000000000000000000090930416916115d8565b670de0b6b3a764000081565b60008061143a6113e784608001516305f5e10061234d90919063ffffffff16565b610c9961140586606001516305f5e10061234d90919063ffffffff16565b610c998760200151610c996305f5e1006114346305f5e1006114348d600001518f61237590919063ffffffff16565b90612375565b9150826080015160001461146a576114676305f5e100610c9985608001518561237590919063ffffffff16565b90505b9250929050565b60016020526000908152604090205481565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114cb5760405162461bcd60e51b815260040161089f90613695565b600780546001600160a01b038089167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560088054928816929091169190911790558351611526906005906020870190612d6d565b50825161153a906006906020860190612d6d565b50600a55600b5550505050565b60046020526000908152604090205481565b600b5481565b6006805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561081f5780601f106107f45761010080835404028352916020019161081f565b60008054806115f157670de0b6b3a76400009150611682565b600b54600090611605906114348987612375565b90506000611622600b54611434888a61237590919063ffffffff16565b9050600061163b87600a5461237590919063ffffffff16565b90506000611654600b548861237590919063ffffffff16565b905061167b6116638383612740565b610c99670de0b6b3a764000061143489838a8a612740565b9550505050505b50949350505050565b6000806116f26305f5e100610c996305f5e100610c998760000151610c996116c48a608001516305f5e10061234d90919063ffffffff16565b6114346116e28c606001516305f5e10061234d90919063ffffffff16565b60208d0151611434908f90612375565b9150826080015160001461146a576114676305f5e100610c9985608001518761237590919063ffffffff16565b600080600061172c612deb565b600c5460011461174e5760405162461bcd60e51b815260040161089f906133a4565b6000600c8190556007546008546040516370a0823160e01b81526001600160a01b0392831693919092169183906370a082319061178f903090600401613277565b60206040518083038186803b1580156117a757600080fd5b505afa1580156117bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df919061312d565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161180f9190613277565b60206040518083038186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185f919061312d565b90504760008061186d610827565b91509150856001600160a01b03168d6001600160a01b031614156118ac576118a5856dffffffffffffffffffffffffffff841661234d565b9a506118f8565b866001600160a01b03168d6001600160a01b031614156118e0576118a5846dffffffffffffffffffffffffffff831661234d565b60405162461bcd60e51b815260040161089f906135b9565b60008b116119185760405162461bcd60e51b815260040161089f90613797565b6060338e8e8e604051602001611931949392919061328b565b604051602081830303815290604052905061194a612d3e565b611956886003846123af565b608086015260408501526020840152825260608201526001600160a01b038f811690891614156119935761198a8d8261168b565b8b529b506119bc565b886001600160a01b03168f6001600160a01b031614156119bc576119b78d826120e3565b8b529b505b6119c9610b55864761234d565b815160208c8101919091529091015160408b01529950505050506001600160a01b03848116908a1614801590611a115750826001600160a01b0316896001600160a01b031614155b611a2d5760405162461bcd60e51b815260040161089f90613480565b611a388a8a89612893565b845115611b1f576040517f80feb3980000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906380feb39890611aa4908690600401613277565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af491906130f2565b15611b0b578451611b06908590612a05565b611b1f565b8451611b1a9085908590612bcc565b600085525b6040516370a0823160e01b81526001600160a01b038516906370a0823190611b4b903090600401613277565b60206040518083038186803b158015611b6357600080fd5b505afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b919061312d565b6040516370a0823160e01b81529092506001600160a01b038416906370a0823190611bca903090600401613277565b60206040518083038186803b158015611be257600080fd5b505afa158015611bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1a919061312d565b9050611c268282612576565b8515611c3657611c36338761267c565b886001600160a01b0316336001600160a01b03167f053d794b2310b8d186a24ae24a65ee066983a52a6efa6bd3df09a7601a3cb4f38a8a8e604051611c7d939291906137fd565b60405180910390a350506001600c555093969295509093509150565b600a54600b5491565b6040518060400160405280601081526020017f436f46695820506f6f6c20546f6b656e0000000000000000000000000000000081525081565b6000610861338484612765565b6000610f6982610c9985670de0b6b3a7640000612375565b633b9aca0081565b600c54600114611d2a5760405162461bcd60e51b815260040161089f906133a4565b6000600c556007546008546009546040516370a0823160e01b81526001600160a01b039384169390921691611ddf9184918691611dda916dffffffffffffffffffffffffffff9091169084906370a0823190611d8a903090600401613277565b60206040518083038186803b158015611da257600080fd5b505afa158015611db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a919061312d565b612893565b611e408184611dda6009600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16856001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611d8a9190613277565b50506001600c5550565b600080611ea1611e6b84608001516305f5e10061234d90919063ffffffff16565b610c996305f5e100610c998760000151610c996305f5e1006114346116e28c606001516305f5e10061274090919063ffffffff16565b9150826080015160001461146a576114676305f5e100610c99611ed586606001516305f5e10061274090919063ffffffff16565b610c998760200151610c9989608001516114346305f5e1006114348d600001518d61237590919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000081565b6008546001600160a01b031681565b600080611f438361137c565b9050611f4f8482611ce8565b949350505050565b42841015611f775760405162461bcd60e51b815260040161089f90613582565b6003546001600160a01b03881660009081526004602090815260408083208054600181019091559051929392611fd8927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d910161333f565b60405160208183030381529060405280519060200120604051602001611fff929190613241565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161203c9493929190613373565b6020604051602081039080840390855afa15801561205e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906120945750886001600160a01b0316816001600160a01b0316145b6120b05760405162461bcd60e51b815260040161089f906133db565b6120bb8989896122e5565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b6000806121476305f5e100610c9961210c86606001516305f5e10061274090919063ffffffff16565b610c998760200151610c996121328a608001516305f5e10061234d90919063ffffffff16565b8a51611434906305f5e1009082908f90612375565b9150826080015160001461146a576114676305f5e100610c9961217b86606001516305f5e10061274090919063ffffffff16565b610c998760200151610c9989608001516114346305f5e1006114348d600001518f61237590919063ffffffff16565b600a5481565b600c546001146121d25760405162461bcd60e51b815260040161089f906133a4565b6000600c556007546040516370a0823160e01b81526122de916001600160a01b0316906370a0823190612209903090600401613277565b60206040518083038186803b15801561222157600080fd5b505afa158015612235573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612259919061312d565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190612289903090600401613277565b60206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d9919061312d565b612576565b6001600c55565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612340908590613336565b60405180910390a3505050565b60008282111561236f5760405162461bcd60e51b815260040161089f90613449565b50900390565b60008261238457506000610865565b8282028284828161239157fe5b0414610f695760405162461bcd60e51b815260040161089f90613525565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633018205f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561241057600080fd5b505afa158015612424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124489190612ef2565b6001600160a01b0316638dba9329348a8a600481111561246457fe5b8a6040518563ffffffff1660e01b8152600401612483939291906132f7565b60a0604051808303818588803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124d591906131ba565b939c929b5090995097509095509350505050565b6000546124f69082612740565b60009081556001600160a01b03831681526001602052604090205461251b9082612740565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061256a908590613336565b60405180910390a35050565b6dffffffffffffffffffffffffffff82118015906125a257506dffffffffffffffffffffffffffff8111155b6125be5760405162461bcd60e51b815260040161089f90613760565b600980547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff848116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e010000000000000000000000000000848316810291909117928390556040517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad193612670938181169390910416906137ce565b60405180910390a15050565b604080516000808252602082019092526001600160a01b0384169083906040516126a69190613225565b60006040518083038185875af1925050503d80600081146126e3576040519150601f19603f3d011682016040523d82523d6000602084013e6126e8565b606091505b50509050806127095760405162461bcd60e51b815260040161089f906136cc565b505050565b600080821161272f5760405162461bcd60e51b815260040161089f906134b7565b81838161273857fe5b049392505050565b600082820183811015610f695760405162461bcd60e51b815260040161089f90613412565b6001600160a01b038316600090815260016020526040902054612788908261234d565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546127b79082612740565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612340908590613336565b6001600160a01b03821660009081526001602052604090205461282c908261234d565b6001600160a01b03831660009081526001602052604081209190915554612853908261234d565b60009081556040516001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061256a908590613336565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602090910152516000906060906001600160a01b038616907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b9061290b90879087906024016132de565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129769190613225565b6000604051808303816000865af19150503d80600081146129b3576040519150601f19603f3d011682016040523d82523d6000602084013e6129b8565b606091505b50915091508180156129e25750805115806129e25750808060200190518101906129e291906130f2565b6129fe5760405162461bcd60e51b815260040161089f90613729565b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e8a353926040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6057600080fd5b505afa158015612a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a989190612ef2565b90506001600160a01b038116612aae5750612bc8565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190612add903090600401613277565b60206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d919061312d565b905080831115612b3b578092505b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690632e1a7d4d90612b80908690600401613336565b600060405180830381600087803b158015612b9a57600080fd5b505af1158015612bae573d6000803e3d6000fd5b505050506000831115612bc557612bc5828461267c565b50505b5050565b6040517f72b8cbcc0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906372b8cbcc90612c34908690600401613277565b60206040518083038186803b158015612c4c57600080fd5b505afa158015612c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c849190612ef2565b90506001600160a01b038116612c9a5750612709565b612bc58482846040516370a0823160e01b81526000906001600160a01b038516906370a0823190612ccf903090600401613277565b60206040518083038186803b158015612ce757600080fd5b505afa158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f919061312d565b905080821115612d2d578091505b8115612bc557612bc5848484612893565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612dae57805160ff1916838001178555612ddb565b82800160010185558215612ddb579182015b82811115612ddb578251825591602001919060010190612dc0565b50612de7929150612e09565b5090565b6040518060a001604052806005906020820280368337509192915050565b5b80821115612de75760008155600101612e0a565b600082601f830112612e2e578081fd5b813567ffffffffffffffff811115612e44578182fd5b612e576020601f19601f8401160161388b565b9150808252836020828501011115612e6e57600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215612e98578081fd5b612ea260a061388b565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b600060208284031215612ee7578081fd5b8135610f69816138de565b600060208284031215612f03578081fd5b8151610f69816138de565b60008060408385031215612f20578081fd5b8235612f2b816138de565b91506020830135612f3b816138de565b809150509250929050565b60008060008060008060c08789031215612f5e578182fd5b8635612f69816138de565b95506020870135612f79816138de565b9450604087013567ffffffffffffffff80821115612f95578384fd5b612fa18a838b01612e1e565b95506060890135915080821115612fb6578384fd5b50612fc389828a01612e1e565b9350506080870135915060a087013590509295509295509295565b600080600060608486031215612ff2578283fd5b8335612ffd816138de565b9250602084013561300d816138de565b929592945050506040919091013590565b600080600080600080600060e0888a031215613038578081fd5b8735613043816138de565b96506020880135613053816138de565b95506040880135945060608801359350608088013560ff81168114613076578182fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156130a5578182fd5b82356130b0816138de565b946020939093013593505050565b6000806000606084860312156130d2578283fd5b83356130dd816138de565b95602085013595506040909401359392505050565b600060208284031215613103578081fd5b81518015158114610f69578182fd5b600060a08284031215613123578081fd5b610f698383612e87565b60006020828403121561313e578081fd5b5051919050565b60008060c08385031215613157578182fd5b823591506114678460208501612e87565b6000806040838503121561317a578182fd5b50508035926020909101359150565b6000806000806080858703121561319e578182fd5b5050823594602084013594506040840135936060013592509050565b600080600080600060a086880312156131d1578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b600081518084526132118160208601602086016138b2565b601f01601f19169290920160200192915050565b600082516132378184602087016138b2565b9190910192915050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b038516825260ff841660208301526060604083015261332260608301846131f9565b95945050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610f6960208301846131f9565b6020808252600d908201527f43506169723a204c4f434b454400000000000000000000000000000000000000604082015260600190565b60208082526019908201527f4345524332303a20494e56414c49445f5349474e415455524500000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526011908201527f43506169723a20494e56414c49445f544f000000000000000000000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601a908201527f43506169723a20696e76616c696420617373657420726174696f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600f908201527f4345524332303a20455850495245440000000000000000000000000000000000604082015260600190565b60208082526015908201527f43506169723a2077726f6e67206f7574546f6b656e0000000000000000000000604082015260600190565b60208082526016908201527f43506169723a20696c6c6567616c20616d6d6f756e7400000000000000000000604082015260600190565b6020808252601d908201527f43506169723a2053484f52545f4c49515549444954595f4255524e4544000000604082015260600190565b6020808252601d908201527f43506169723a2053484f52545f4c49515549444954595f4d494e544544000000604082015260600190565b60208082526010908201527f43506169723a20464f5242494444454e00000000000000000000000000000000604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201527f4c45440000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526016908201527f43506169723a205452414e534645525f4641494c454400000000000000000000604082015260600190565b6020808252600f908201527f43506169723a204f564552464c4f570000000000000000000000000000000000604082015260600190565b60208082526015908201527f43506169723a2077726f6e6720616d6f756e74496e0000000000000000000000604082015260600190565b6dffffffffffffffffffffffffffff92831681529116602082015260400190565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b9283526020830191909152604082015260600190565b60006101008201905085825260208581840152846040840152606083018460005b600581101561387057815183529183019190830190600101613853565b5050505095945050505050565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156138aa57600080fd5b604052919050565b60005b838110156138cd5781810151838201526020016138b5565b83811115612bc55750506000910152565b6001600160a01b03811681146138f357600080fd5b5056fea264697066735822122075fd8b231a5e9a3ccabafbc24c4617be2296d370b66ce185fd035003fd69a2ba64736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106102d55760003560e01c806395d89b4111610179578063bc25cf77116100d6578063d385a3ad1161008a578063e5eac39011610064578063e5eac39014610731578063f22e2ae014610751578063fff6cae914610766576102dc565b8063d385a3ad146106d1578063d505accf146106f1578063dd62ed3e14610711576102dc565b8063bf36aac2116100bb578063bf36aac214610687578063c45a0155146106a7578063d21220a7146106bc576102dc565b8063bc25cf7714610667578063be5b32f8146104a4576102dc565b8063a661dbda1161012d578063aaf07e9211610112578063aaf07e921461047a578063ac931c5a14610632578063ba9a7a5614610652576102dc565b8063a661dbda146105fd578063a9059cbb14610612576102dc565b80639c673c521161015e5780639c673c52146105a55780639f44296a146105c5578063a1da4d24146105e8576102dc565b806395d89b411461057057806399f45e4814610585576102dc565b806330adf81f116102325780634f6ec2dd116101e657806379c2c954116101c057806379c2c954146105195780637ecebe001461053b5780638a2ffb961461055b576102dc565b80634f6ec2dd146104c45780635ad6bd30146104d957806370a08231146104f9576102dc565b80633298613111610217578063329861311461047a5780633644e5151461048f57806339818b66146104a4576102dc565b806330adf81f14610443578063313ce56714610458576102dc565b806318160ddd1161028957806323b872dd1161026e57806323b872dd146103e157806324334be81461040157806327fc84a314610421576102dc565b806318160ddd1461039f5780631feb1886146103c1576102dc565b8063095ea7b3116102ba578063095ea7b31461032f5780630dfe16811461035c578063156e29f61461037e576102dc565b806306fdde03146102e15780630902f1ac1461030c576102dc565b366102dc57005b600080fd5b3480156102ed57600080fd5b506102f661077b565b6040516103039190613391565b60405180910390f35b34801561031857600080fd5b50610321610827565b6040516103039291906137ce565b34801561033b57600080fd5b5061034f61034a366004613093565b610854565b604051610303919061332b565b34801561036857600080fd5b5061037161086b565b6040516103039190613277565b61039161038c3660046130be565b61087a565b6040516103039291906137ef565b3480156103ab57600080fd5b506103b4610bfe565b6040516103039190613336565b3480156103cd57600080fd5b506103916103dc366004613145565b610c04565b3480156103ed57600080fd5b5061034f6103fc366004612fde565b610e80565b34801561040d57600080fd5b506103b461041c366004613168565b610f32565b61043461042f366004612f0e565b610f70565b6040516103039392919061381c565b34801561044f57600080fd5b506103b4611345565b34801561046457600080fd5b5061046d611369565b604051610303919061387d565b34801561048657600080fd5b506103b461136e565b34801561049b57600080fd5b506103b4611376565b3480156104b057600080fd5b506103b46104bf366004613112565b61137c565b3480156104d057600080fd5b506103b46113ba565b3480156104e557600080fd5b506103916104f4366004613145565b6113c6565b34801561050557600080fd5b506103b4610514366004612ed6565b611471565b34801561052557600080fd5b50610539610534366004612f46565b611483565b005b34801561054757600080fd5b506103b4610556366004612ed6565b611547565b34801561056757600080fd5b506103b4611559565b34801561057c57600080fd5b506102f661155f565b34801561059157600080fd5b506103b46105a0366004613189565b6115d8565b3480156105b157600080fd5b506103916105c0366004613145565b61168b565b6105d86105d3366004612f0e565b61171f565b6040516103039493929190613832565b3480156105f457600080fd5b50610391611c99565b34801561060957600080fd5b506102f6611ca2565b34801561061e57600080fd5b5061034f61062d366004613093565b611cdb565b34801561063e57600080fd5b506103b461064d366004613168565b611ce8565b34801561065e57600080fd5b506103b4611d00565b34801561067357600080fd5b50610539610682366004612ed6565b611d08565b34801561069357600080fd5b506103916106a2366004613145565b611e4a565b3480156106b357600080fd5b50610371611f04565b3480156106c857600080fd5b50610371611f28565b3480156106dd57600080fd5b506103b46106ec366004613145565b611f37565b3480156106fd57600080fd5b5061053961070c36600461301e565b611f57565b34801561071d57600080fd5b506103b461072c366004612f0e565b6120c6565b34801561073d57600080fd5b5061039161074c366004613145565b6120e3565b34801561075d57600080fd5b506103b46121aa565b34801561077257600080fd5b506105396121b0565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561081f5780601f106107f45761010080835404028352916020019161081f565b820191906000526020600020905b81548152906001019060200180831161080257829003601f168201915b505050505081565b6009546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000009092041690565b60006108613384846122e5565b5060015b92915050565b6007546001600160a01b031681565b600080600c546001146108a85760405162461bcd60e51b815260040161089f906133a4565b60405180910390fd5b6000600c8190556007546008546001600160a01b0391821692911690806108cd610827565b915091506000846001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016108ff9190613277565b60206040518083038186803b15801561091757600080fd5b505afa15801561092b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094f919061312d565b90506000846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161097f9190613277565b60206040518083038186803b15801561099757600080fd5b505afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf919061312d565b905060006109ed836dffffffffffffffffffffffffffff871661234d565b90506000610a0b836dffffffffffffffffffffffffffff871661234d565b9050818c11158015610a1d5750808b11155b610a395760405162461bcd60e51b815260040161089f906135f0565b5050600b548a908a90610a4d908290612375565b600a54610a5b908490612375565b14610a785760405162461bcd60e51b815260040161089f906134ee565b60004790506060338f8585604051602001610a9694939291906132b5565b6040516020818303038152906040529050610aaf612d3e565b610abb8a6001846123af565b60808601526040850152602084018190528184526060840192909252600091610afb916dffffffffffffffffffffffffffff808e1692908d1691906115d8565b905060005460001415610b3657610b20633b9aca00610b1a8884611ce8565b9061234d565b9d50610b316000633b9aca006124e9565b610b43565b610b408682611ce8565b9d505b50610b5c9150610b559050824761234d565b349061234d565b995060008b11610b7e5760405162461bcd60e51b815260040161089f9061365e565b610b888e8c6124e9565b610b928585612576565b8915610ba257610ba2338b61267c565b336001600160a01b03167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f8484604051610bdd9291906137ef565b60405180910390a25050505050505050506001600c81905550935093915050565b60005481565b6009548151602083015160009283928392610c46926dffffffffffffffffffffffffffff808216936e01000000000000000000000000000090920416916115d8565b90506000610c548683612375565b90506000610c7d610c7687608001516305f5e10061234d90919063ffffffff16565b8390612375565b9050610c9f6305f5e100610c9983670de0b6b3a764000061270e565b9061270e565b9350610cd06305f5e100610c99600b54610c99670de0b6b3a7640000610c99600a548861237590919063ffffffff16565b6009549095506dffffffffffffffffffffffffffff168411159150610da1905057600954845160208601516dffffffffffffffffffffffffffff909216840391600091610d2291610c99908590612375565b9050610d2e8582612740565b6009549095506e01000000000000000000000000000090046dffffffffffffffffffffffffffff16851115610d85576009546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1694505b50506009546dffffffffffffffffffffffffffff169150610e78565b6009546e01000000000000000000000000000090046dffffffffffffffffffffffffffff16831115610e7857600954602085015185516e0100000000000000000000000000009092046dffffffffffffffffffffffffffff16850391600091610e0f91610c99908590612375565b9050610e1b8482612740565b6009549094506dffffffffffffffffffffffffffff16841115610e4e576009546dffffffffffffffffffffffffffff1693505b50506009546e01000000000000000000000000000090046dffffffffffffffffffffffffffff1692505b509250929050565b6001600160a01b03831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610f1d576001600160a01b0384166000908152600260209081526040808320338452909152902054610ef8908361234d565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610f28848484612765565b5060019392505050565b600954600090610f69906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041685856115d8565b9392505050565b6000806000600c54600114610f975760405162461bcd60e51b815260040161089f906133a4565b6000600c8190556007546008546040516370a0823160e01b81526001600160a01b0392831693919092169183906370a0823190610fd8903090600401613277565b60206040518083038186803b158015610ff057600080fd5b505afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611028919061312d565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016110589190613277565b60206040518083038186803b15801561107057600080fd5b505afa158015611084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a8919061312d565b30600090815260016020908152604091829020549151929350909147916060916110d69133918691016132de565b60405160208183030381529060405290506110ef612d3e565b6110fb876002846123af565b6080860152604085015260208401528252606082015261111b8482610c04565b909b5099506111319150610b559050824761234d565b96506000891180156111435750600088115b61115f5760405162461bcd60e51b815260040161089f90613627565b6111693083612809565b611174858c8b612893565b61117f868b8a612893565b6040516370a0823160e01b81526001600160a01b038716906370a08231906111ab903090600401613277565b60206040518083038186803b1580156111c357600080fd5b505afa1580156111d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fb919061312d565b6040516370a0823160e01b81529094506001600160a01b038616906370a082319061122a903090600401613277565b60206040518083038186803b15801561124257600080fd5b505afa158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a919061312d565b92506112868484612576565b861561129657611296338861267c565b896001600160a01b0316336001600160a01b03167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373888b6040516112db9291906132de565b60405180910390a38a6001600160a01b0316336001600160a01b03167f3dd1df88dc92e2788892542d81f999d720a44b4c127065d45c128f4f59fdc373878c6040516113289291906132de565b60405180910390a35050505050506001600c819055509250925092565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6305f5e10081565b60035481565b60095481516020830151600092610865926dffffffffffffffffffffffffffff808316936e01000000000000000000000000000090930416916115d8565b670de0b6b3a764000081565b60008061143a6113e784608001516305f5e10061234d90919063ffffffff16565b610c9961140586606001516305f5e10061234d90919063ffffffff16565b610c998760200151610c996305f5e1006114346305f5e1006114348d600001518f61237590919063ffffffff16565b90612375565b9150826080015160001461146a576114676305f5e100610c9985608001518561237590919063ffffffff16565b90505b9250929050565b60016020526000908152604090205481565b336001600160a01b037f00000000000000000000000039816b841436a57729723d9da127805755d2cb5116146114cb5760405162461bcd60e51b815260040161089f90613695565b600780546001600160a01b038089167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560088054928816929091169190911790558351611526906005906020870190612d6d565b50825161153a906006906020860190612d6d565b50600a55600b5550505050565b60046020526000908152604090205481565b600b5481565b6006805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561081f5780601f106107f45761010080835404028352916020019161081f565b60008054806115f157670de0b6b3a76400009150611682565b600b54600090611605906114348987612375565b90506000611622600b54611434888a61237590919063ffffffff16565b9050600061163b87600a5461237590919063ffffffff16565b90506000611654600b548861237590919063ffffffff16565b905061167b6116638383612740565b610c99670de0b6b3a764000061143489838a8a612740565b9550505050505b50949350505050565b6000806116f26305f5e100610c996305f5e100610c998760000151610c996116c48a608001516305f5e10061234d90919063ffffffff16565b6114346116e28c606001516305f5e10061234d90919063ffffffff16565b60208d0151611434908f90612375565b9150826080015160001461146a576114676305f5e100610c9985608001518761237590919063ffffffff16565b600080600061172c612deb565b600c5460011461174e5760405162461bcd60e51b815260040161089f906133a4565b6000600c8190556007546008546040516370a0823160e01b81526001600160a01b0392831693919092169183906370a082319061178f903090600401613277565b60206040518083038186803b1580156117a757600080fd5b505afa1580156117bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df919061312d565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161180f9190613277565b60206040518083038186803b15801561182757600080fd5b505afa15801561183b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185f919061312d565b90504760008061186d610827565b91509150856001600160a01b03168d6001600160a01b031614156118ac576118a5856dffffffffffffffffffffffffffff841661234d565b9a506118f8565b866001600160a01b03168d6001600160a01b031614156118e0576118a5846dffffffffffffffffffffffffffff831661234d565b60405162461bcd60e51b815260040161089f906135b9565b60008b116119185760405162461bcd60e51b815260040161089f90613797565b6060338e8e8e604051602001611931949392919061328b565b604051602081830303815290604052905061194a612d3e565b611956886003846123af565b608086015260408501526020840152825260608201526001600160a01b038f811690891614156119935761198a8d8261168b565b8b529b506119bc565b886001600160a01b03168f6001600160a01b031614156119bc576119b78d826120e3565b8b529b505b6119c9610b55864761234d565b815160208c8101919091529091015160408b01529950505050506001600160a01b03848116908a1614801590611a115750826001600160a01b0316896001600160a01b031614155b611a2d5760405162461bcd60e51b815260040161089f90613480565b611a388a8a89612893565b845115611b1f576040517f80feb3980000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000039816b841436a57729723d9da127805755d2cb5116906380feb39890611aa4908690600401613277565b60206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af491906130f2565b15611b0b578451611b06908590612a05565b611b1f565b8451611b1a9085908590612bcc565b600085525b6040516370a0823160e01b81526001600160a01b038516906370a0823190611b4b903090600401613277565b60206040518083038186803b158015611b6357600080fd5b505afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b919061312d565b6040516370a0823160e01b81529092506001600160a01b038416906370a0823190611bca903090600401613277565b60206040518083038186803b158015611be257600080fd5b505afa158015611bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1a919061312d565b9050611c268282612576565b8515611c3657611c36338761267c565b886001600160a01b0316336001600160a01b03167f053d794b2310b8d186a24ae24a65ee066983a52a6efa6bd3df09a7601a3cb4f38a8a8e604051611c7d939291906137fd565b60405180910390a350506001600c555093969295509093509150565b600a54600b5491565b6040518060400160405280601081526020017f436f46695820506f6f6c20546f6b656e0000000000000000000000000000000081525081565b6000610861338484612765565b6000610f6982610c9985670de0b6b3a7640000612375565b633b9aca0081565b600c54600114611d2a5760405162461bcd60e51b815260040161089f906133a4565b6000600c556007546008546009546040516370a0823160e01b81526001600160a01b039384169390921691611ddf9184918691611dda916dffffffffffffffffffffffffffff9091169084906370a0823190611d8a903090600401613277565b60206040518083038186803b158015611da257600080fd5b505afa158015611db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a919061312d565b612893565b611e408184611dda6009600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16856001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611d8a9190613277565b50506001600c5550565b600080611ea1611e6b84608001516305f5e10061234d90919063ffffffff16565b610c996305f5e100610c998760000151610c996305f5e1006114346116e28c606001516305f5e10061274090919063ffffffff16565b9150826080015160001461146a576114676305f5e100610c99611ed586606001516305f5e10061274090919063ffffffff16565b610c998760200151610c9989608001516114346305f5e1006114348d600001518d61237590919063ffffffff16565b7f00000000000000000000000039816b841436a57729723d9da127805755d2cb5181565b6008546001600160a01b031681565b600080611f438361137c565b9050611f4f8482611ce8565b949350505050565b42841015611f775760405162461bcd60e51b815260040161089f90613582565b6003546001600160a01b03881660009081526004602090815260408083208054600181019091559051929392611fd8927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d910161333f565b60405160208183030381529060405280519060200120604051602001611fff929190613241565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161203c9493929190613373565b6020604051602081039080840390855afa15801561205e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906120945750886001600160a01b0316816001600160a01b0316145b6120b05760405162461bcd60e51b815260040161089f906133db565b6120bb8989896122e5565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b6000806121476305f5e100610c9961210c86606001516305f5e10061274090919063ffffffff16565b610c998760200151610c996121328a608001516305f5e10061234d90919063ffffffff16565b8a51611434906305f5e1009082908f90612375565b9150826080015160001461146a576114676305f5e100610c9961217b86606001516305f5e10061274090919063ffffffff16565b610c998760200151610c9989608001516114346305f5e1006114348d600001518f61237590919063ffffffff16565b600a5481565b600c546001146121d25760405162461bcd60e51b815260040161089f906133a4565b6000600c556007546040516370a0823160e01b81526122de916001600160a01b0316906370a0823190612209903090600401613277565b60206040518083038186803b15801561222157600080fd5b505afa158015612235573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612259919061312d565b6008546040516370a0823160e01b81526001600160a01b03909116906370a0823190612289903090600401613277565b60206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d9919061312d565b612576565b6001600c55565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612340908590613336565b60405180910390a3505050565b60008282111561236f5760405162461bcd60e51b815260040161089f90613449565b50900390565b60008261238457506000610865565b8282028284828161239157fe5b0414610f695760405162461bcd60e51b815260040161089f90613525565b60008060008060007f00000000000000000000000039816b841436a57729723d9da127805755d2cb516001600160a01b0316633018205f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561241057600080fd5b505afa158015612424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124489190612ef2565b6001600160a01b0316638dba9329348a8a600481111561246457fe5b8a6040518563ffffffff1660e01b8152600401612483939291906132f7565b60a0604051808303818588803b15801561249c57600080fd5b505af11580156124b0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124d591906131ba565b939c929b5090995097509095509350505050565b6000546124f69082612740565b60009081556001600160a01b03831681526001602052604090205461251b9082612740565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061256a908590613336565b60405180910390a35050565b6dffffffffffffffffffffffffffff82118015906125a257506dffffffffffffffffffffffffffff8111155b6125be5760405162461bcd60e51b815260040161089f90613760565b600980547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff848116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e010000000000000000000000000000848316810291909117928390556040517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad193612670938181169390910416906137ce565b60405180910390a15050565b604080516000808252602082019092526001600160a01b0384169083906040516126a69190613225565b60006040518083038185875af1925050503d80600081146126e3576040519150601f19603f3d011682016040523d82523d6000602084013e6126e8565b606091505b50509050806127095760405162461bcd60e51b815260040161089f906136cc565b505050565b600080821161272f5760405162461bcd60e51b815260040161089f906134b7565b81838161273857fe5b049392505050565b600082820183811015610f695760405162461bcd60e51b815260040161089f90613412565b6001600160a01b038316600090815260016020526040902054612788908261234d565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546127b79082612740565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612340908590613336565b6001600160a01b03821660009081526001602052604090205461282c908261234d565b6001600160a01b03831660009081526001602052604081209190915554612853908261234d565b60009081556040516001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061256a908590613336565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602090910152516000906060906001600160a01b038616907fa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b9061290b90879087906024016132de565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516129769190613225565b6000604051808303816000865af19150503d80600081146129b3576040519150601f19603f3d011682016040523d82523d6000602084013e6129b8565b606091505b50915091508180156129e25750805115806129e25750808060200190518101906129e291906130f2565b6129fe5760405162461bcd60e51b815260040161089f90613729565b5050505050565b60007f00000000000000000000000039816b841436a57729723d9da127805755d2cb516001600160a01b031663e8a353926040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6057600080fd5b505afa158015612a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a989190612ef2565b90506001600160a01b038116612aae5750612bc8565b6040516370a0823160e01b81526000906001600160a01b038516906370a0823190612add903090600401613277565b60206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d919061312d565b905080831115612b3b578092505b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690632e1a7d4d90612b80908690600401613336565b600060405180830381600087803b158015612b9a57600080fd5b505af1158015612bae573d6000803e3d6000fd5b505050506000831115612bc557612bc5828461267c565b50505b5050565b6040517f72b8cbcc0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000039816b841436a57729723d9da127805755d2cb5116906372b8cbcc90612c34908690600401613277565b60206040518083038186803b158015612c4c57600080fd5b505afa158015612c60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c849190612ef2565b90506001600160a01b038116612c9a5750612709565b612bc58482846040516370a0823160e01b81526000906001600160a01b038516906370a0823190612ccf903090600401613277565b60206040518083038186803b158015612ce757600080fd5b505afa158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f919061312d565b905080821115612d2d578091505b8115612bc557612bc5848484612893565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612dae57805160ff1916838001178555612ddb565b82800160010185558215612ddb579182015b82811115612ddb578251825591602001919060010190612dc0565b50612de7929150612e09565b5090565b6040518060a001604052806005906020820280368337509192915050565b5b80821115612de75760008155600101612e0a565b600082601f830112612e2e578081fd5b813567ffffffffffffffff811115612e44578182fd5b612e576020601f19601f8401160161388b565b9150808252836020828501011115612e6e57600080fd5b8060208401602084013760009082016020015292915050565b600060a08284031215612e98578081fd5b612ea260a061388b565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015292915050565b600060208284031215612ee7578081fd5b8135610f69816138de565b600060208284031215612f03578081fd5b8151610f69816138de565b60008060408385031215612f20578081fd5b8235612f2b816138de565b91506020830135612f3b816138de565b809150509250929050565b60008060008060008060c08789031215612f5e578182fd5b8635612f69816138de565b95506020870135612f79816138de565b9450604087013567ffffffffffffffff80821115612f95578384fd5b612fa18a838b01612e1e565b95506060890135915080821115612fb6578384fd5b50612fc389828a01612e1e565b9350506080870135915060a087013590509295509295509295565b600080600060608486031215612ff2578283fd5b8335612ffd816138de565b9250602084013561300d816138de565b929592945050506040919091013590565b600080600080600080600060e0888a031215613038578081fd5b8735613043816138de565b96506020880135613053816138de565b95506040880135945060608801359350608088013560ff81168114613076578182fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156130a5578182fd5b82356130b0816138de565b946020939093013593505050565b6000806000606084860312156130d2578283fd5b83356130dd816138de565b95602085013595506040909401359392505050565b600060208284031215613103578081fd5b81518015158114610f69578182fd5b600060a08284031215613123578081fd5b610f698383612e87565b60006020828403121561313e578081fd5b5051919050565b60008060c08385031215613157578182fd5b823591506114678460208501612e87565b6000806040838503121561317a578182fd5b50508035926020909101359150565b6000806000806080858703121561319e578182fd5b5050823594602084013594506040840135936060013592509050565b600080600080600060a086880312156131d1578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b600081518084526132118160208601602086016138b2565b601f01601f19169290920160200192915050565b600082516132378184602087016138b2565b9190910192915050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b038516825260ff841660208301526060604083015261332260608301846131f9565b95945050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610f6960208301846131f9565b6020808252600d908201527f43506169723a204c4f434b454400000000000000000000000000000000000000604082015260600190565b60208082526019908201527f4345524332303a20494e56414c49445f5349474e415455524500000000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526011908201527f43506169723a20494e56414c49445f544f000000000000000000000000000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601a908201527f43506169723a20696e76616c696420617373657420726174696f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600f908201527f4345524332303a20455850495245440000000000000000000000000000000000604082015260600190565b60208082526015908201527f43506169723a2077726f6e67206f7574546f6b656e0000000000000000000000604082015260600190565b60208082526016908201527f43506169723a20696c6c6567616c20616d6d6f756e7400000000000000000000604082015260600190565b6020808252601d908201527f43506169723a2053484f52545f4c49515549444954595f4255524e4544000000604082015260600190565b6020808252601d908201527f43506169723a2053484f52545f4c49515549444954595f4d494e544544000000604082015260600190565b60208082526010908201527f43506169723a20464f5242494444454e00000000000000000000000000000000604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201527f4c45440000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526016908201527f43506169723a205452414e534645525f4641494c454400000000000000000000604082015260600190565b6020808252600f908201527f43506169723a204f564552464c4f570000000000000000000000000000000000604082015260600190565b60208082526015908201527f43506169723a2077726f6e6720616d6f756e74496e0000000000000000000000604082015260600190565b6dffffffffffffffffffffffffffff92831681529116602082015260400190565b918252602082015260400190565b92835260208301919091526001600160a01b0316604082015260600190565b9283526020830191909152604082015260600190565b60006101008201905085825260208581840152846040840152606083018460005b600581101561387057815183529183019190830190600101613853565b5050505095945050505050565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156138aa57600080fd5b604052919050565b60005b838110156138cd5781810151838201526020016138b5565b83811115612bc55750506000910152565b6001600160a01b03811681146138f357600080fd5b5056fea264697066735822122075fd8b231a5e9a3ccabafbc24c4617be2296d370b66ce185fd035003fd69a2ba64736f6c634300060c0033

Deployed Bytecode Sourcemap

23842:22259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24446:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26339:161;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;19780:156::-;;;;;;;;;;-1:-1:-1;19780:156:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24548:30::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27205:2133::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;17806:33::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38190:2165::-;;;;;;;;;;-1:-1:-1;38190:2165:0;;;;;:::i;:::-;;:::i;20100:310::-;;;;;;;;;;-1:-1:-1;20100:310:0;;;;;:::i;:::-;;:::i;37554:196::-;;;;;;;;;;-1:-1:-1;37554:196:0;;;;;:::i;:::-;;:::i;29450:1709::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;18134:117::-;;;;;;;;;;;;;:::i;17755:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24240:36::-;;;;;;;;;;;;;:::i;17982:40::-;;;;;;;;;;;;;:::i;36935:184::-;;;;;;;;;;-1:-1:-1;36935:184:0;;;;;:::i;:::-;;:::i;24288:41::-;;;;;;;;;;;;;:::i;42763:693::-;;;;;;;;;;-1:-1:-1;42763:693:0;;;;;:::i;:::-;;:::i;17846:50::-;;;;;;;;;;-1:-1:-1;17846:50:0;;;;;:::i;:::-;;:::i;25648:457::-;;;;;;;;;;-1:-1:-1;25648:457:0;;;;;:::i;:::-;;:::i;:::-;;18258:47;;;;;;;;;;-1:-1:-1;18258:47:0;;;;;:::i;:::-;;:::i;24891:31::-;;;;;;;;;;;;;:::i;24471:20::-;;;;;;;;;;;;;:::i;34861:1720::-;;;;;;;;;;-1:-1:-1;34861:1720:0;;;;;:::i;:::-;;:::i;41731:952::-;;;;;;;;;;-1:-1:-1;41731:952:0;;;;;:::i;:::-;;:::i;31271:2891::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;26113:218::-;;;;;;;;;;;;;:::i;17691:57::-;;;;;;;;;;;;;:::i;19944:148::-;;;;;;;;;;-1:-1:-1;19944:148:0;;;;;:::i;:::-;;:::i;36646:160::-;;;;;;;;;;-1:-1:-1;36646:160:0;;;;;:::i;:::-;;:::i;24029:55::-;;;;;;;;;;;;;:::i;34211:343::-;;;;;;;;;;-1:-1:-1;34211:343:0;;;;;:::i;:::-;;:::i;43543:832::-;;;;;;;;;;-1:-1:-1;43543:832:0;;;;;:::i;:::-;;:::i;24500:41::-;;;;;;;;;;;;;:::i;24599:30::-;;;;;;;;;;;;;:::i;37969:213::-;;;;;;;;;;-1:-1:-1;37969:213:0;;;;;:::i;:::-;;:::i;20418:677::-;;;;;;;;;;-1:-1:-1;20418:677:0;;;;;:::i;:::-;;:::i;17903:70::-;;;;;;;;;;-1:-1:-1;17903:70:0;;;;;:::i;:::-;;:::i;40432:1215::-;;;;;;;;;;-1:-1:-1;40432:1215:0;;;;;:::i;:::-;;:::i;24853:31::-;;;;;;;;;;;;;:::i;34603:147::-;;;;;;;;;;;;;:::i;24446:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26339:161::-;26453:8;;;;;;;26484;;;;;;26339:161::o;19780:156::-;19853:4;19870:36;19879:10;19891:7;19900:5;19870:8;:36::i;:::-;-1:-1:-1;19924:4:0;19780:156;;;;;:::o;24548:30::-;;;-1:-1:-1;;;;;24548:30:0;;:::o;27205:2133::-;27305:14;27321:20;25381:8;;25393:1;25381:13;25373:39;;;;-1:-1:-1;;;25373:39:0;;;;;;;:::i;:::-;;;;;;;;;25434:1;25423:8;:12;;;27372:6:::1;::::0;27453::::1;::::0;-1:-1:-1;;;;;27372:6:0;;::::1;::::0;27453;::::1;::::0;25434:1;27557:13:::1;:11;:13::i;:::-;27516:54;;;;27596:13;27619:7;-1:-1:-1::0;;;;;27612:25:0::1;;27646:4;27612:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27596:56;;27663:13;27686:7;-1:-1:-1::0;;;;;27679:25:0::1;;27713:4;27679:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27663:56:::0;-1:-1:-1;27730:12:0::1;27745:23;:8:::0;:23:::1;::::0;::::1;:12;:23::i;:::-;27730:38:::0;-1:-1:-1;27779:12:0::1;27794:23;:8:::0;:23:::1;::::0;::::1;:12;:23::i;:::-;27779:38;;27851:7;27838:9;:20;;:46;;;;;27877:7;27862:11;:22;;27838:46;27830:81;;;;-1:-1:-1::0;;;27830:81:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;28047:16:0::1;::::0;27942:9;;27972:11;;28035:29:::1;::::0;27972:11;;28035::::1;:29::i;:::-;28014:16;::::0;28002:29:::1;::::0;:7;;:11:::1;:29::i;:::-;:62;27994:101;;;;-1:-1:-1::0;;;27994:101:0::1;;;;;;;:::i;:::-;28116:25;28144:21;28116:49;;28265:17;28296:10;28308:2;28312:7;28321;28285:44;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28265:64;;28372:22;;:::i;:::-;28476:42;28489:7;28498:13;28513:4;28476:12;:42::i;:::-;28463:9;::::0;::::1;28409:109:::0;28449:12:::1;::::0;::::1;28409:109:::0;28432:15:::1;::::0;::::1;28409:109:::0;;;;;;28410:5:::1;::::0;::::1;28409:109:::0;;;;28417:13:::1;::::0;28549:69:::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;28409:109;28549:15:::1;:69::i;:::-;28533:85;;28637:11;;28652:1;28637:16;28633:313;;;28686:52;24079:5;28686:29;28700:7;28709:5;28686:13;:29::i;:::-;:33:::0;::::1;:52::i;:::-;28674:64;;28757:36;28771:1;24079:5;28757;:36::i;:::-;28633:313;;;28901:29;28915:7;28924:5;28901:13;:29::i;:::-;28889:41;;28633:313;-1:-1:-1::0;28985:59:0::1;::::0;-1:-1:-1;28999:44:0::1;::::0;-1:-1:-1;28999:17:0;29021:21:::1;28999;:44::i;:::-;28985:9;::::0;:13:::1;:59::i;:::-;28967:77;;29077:1;29065:9;:13;29057:55;;;;-1:-1:-1::0;;;29057:55:0::1;;;;;;;:::i;:::-;29123:20;29129:2;29133:9;29123:5;:20::i;:::-;29156:27;29164:8;29174;29156:7;:27::i;:::-;29198:19:::0;;29194:84:::1;;29219:59;29250:10;29262:15;29219:30;:59::i;:::-;29301:10;-1:-1:-1::0;;;;;29296:34:0::1;;29313:7;29322;29296:34;;;;;;;:::i;:::-;;;;;;;;25446:1;;;;;;;;;25469::::0;25458:8;:12;;;;27205:2133;;;;;;:::o;17806:33::-;;;;:::o;38190:2165::-;38613:8;;38633:13;;38648:15;;;;38289:22;;;;;;38597:67;;38613:8;;;;;38623;;;;;;38597:15;:67::i;:::-;38589:75;-1:-1:-1;38679:17:0;38699:20;:9;38589:75;38699:13;:20::i;:::-;38679:40;;38736:25;38764:40;38778:25;38793:3;:9;;;24425:3;38778:14;;:25;;;;:::i;:::-;38764:9;;:13;:40::i;:::-;38736:68;-1:-1:-1;38834:49:0;24425:3;38834:33;38736:68;24325:4;38834:21;:33::i;:::-;:37;;:49::i;:::-;38819:64;;38915:93;24425:3;38915:77;38975:16;;38915:55;24325:4;38915:39;38937:16;;38915:17;:21;;:39;;;;:::i;:93::-;39251:8;;38898:110;;-1:-1:-1;39251:8:0;;39236:23;;39232:1102;;-1:-1:-1;39232:1102:0;;-1:-1:-1;39232:1102:0;39436:8;;39542:13;;39521:15;;;;39436:8;;;;39421:23;;;39389:29;;39495:61;;:42;;39421:23;;39495:25;:42::i;:61::-;39463:93;-1:-1:-1;39592:41:0;:14;39463:93;39592:18;:41::i;:::-;39673:8;;39575:58;;-1:-1:-1;39673:8:0;;;;;39656:25;;39652:99;;;39723:8;;;;;;;;-1:-1:-1;39652:99:0;-1:-1:-1;;39784:8:0;;;;;-1:-1:-1;39232:1102:0;;;39890:8;;;;;;;39873:25;;39869:465;;;39970:8;;40074:15;;;;40055:13;;39970:8;;;;;;39953:25;;;39919:31;;40027:63;;:42;;39953:25;;40027:27;:42::i;:63::-;39997:93;-1:-1:-1;40124:37:0;:12;39997:93;40124:16;:37::i;:::-;40199:8;;40109:52;;-1:-1:-1;40199:8:0;;40184:23;;40180:95;;;40247:8;;;;;-1:-1:-1;40180:95:0;-1:-1:-1;;40310:8:0;;;;;;;;-1:-1:-1;39869:465:0;38190:2165;;;;;;:::o;20100:310::-;-1:-1:-1;;;;;20208:15:0;;20187:4;20208:15;;;:9;:15;;;;;;;;20224:10;20208:27;;;;;;;;20244:2;20208:39;20204:140;;-1:-1:-1;;;;;20294:15:0;;;;;;:9;:15;;;;;;;;20310:10;20294:27;;;;;;;;:38;;20326:5;20294:31;:38::i;:::-;-1:-1:-1;;;;;20264:15:0;;;;;;:9;:15;;;;;;;;20280:10;20264:27;;;;;;;:68;20204:140;20354:26;20364:4;20370:2;20374:5;20354:9;:26::i;:::-;-1:-1:-1;20398:4:0;20100:310;;;;;:::o;37554:196::-;37699:8;;37650:13;;37683:59;;37699:8;;;;;37709;;;;37719:9;37730:11;37683:15;:59::i;:::-;37676:66;37554:196;-1:-1:-1;;;37554:196:0:o;29450:1709::-;29536:19;29557:17;29576:20;25381:8;;25393:1;25381:13;25373:39;;;;-1:-1:-1;;;25373:39:0;;;;;;;:::i;:::-;25434:1;25423:8;:12;;;29627:6:::1;::::0;29708::::1;::::0;29787:40:::1;::::0;-1:-1:-1;;;29787:40:0;;-1:-1:-1;;;;;29627:6:0;;::::1;::::0;29708;;;::::1;::::0;29627;;29787:25:::1;::::0;:40:::1;::::0;29821:4:::1;::::0;29787:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29771:56;;29838:13;29861:7;-1:-1:-1::0;;;;;29854:25:0::1;;29888:4;29854:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29940:4;29905:14;29922:24:::0;;;:9:::1;:24;::::0;;;;;;;;;30079:33;;29838:56;;-1:-1:-1;29922:24:0;;29987:21:::1;::::0;30059:17:::1;::::0;30079:33:::1;::::0;30090:10:::1;::::0;29922:24;;30079:33:::1;;:::i;:::-;;;;;;;;;;;;;30059:53;;30155:22;;:::i;:::-;30259:42;30272:7;30281:13;30296:4;30259:12;:42::i;:::-;30246:9;::::0;::::1;30192:109:::0;30232:12:::1;::::0;::::1;30192:109:::0;30215:15:::1;::::0;::::1;30192:109:::0;;;30193:5:::1;::::0;::::1;30192:109:::0;30351:41:::1;30377:9:::0;30193:3;30351:25:::1;:41::i;:::-;30318:74:::0;;-1:-1:-1;30318:74:0;-1:-1:-1;30452:59:0::1;::::0;-1:-1:-1;30466:44:0::1;::::0;-1:-1:-1;30466:17:0;30488:21:::1;30466;:44::i;30452:59::-;30434:77;;30549:1;30532:14;:18;:38;;;;;30569:1;30554:12;:16;30532:38;30524:80;;;;-1:-1:-1::0;;;30524:80:0::1;;;;;;;:::i;:::-;30617:31;30631:4;30638:9;30617:5;:31::i;:::-;30659:47;30673:7;30682;30691:14;30659:13;:47::i;:::-;30717:43;30731:7;30740:5;30747:12;30717:13;:43::i;:::-;30784:40;::::0;-1:-1:-1;;;30784:40:0;;-1:-1:-1;;;;;30784:25:0;::::1;::::0;::::1;::::0;:40:::1;::::0;30818:4:::1;::::0;30784:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30846;::::0;-1:-1:-1;;;30846:40:0;;30773:51;;-1:-1:-1;;;;;;30846:25:0;::::1;::::0;::::1;::::0;:40:::1;::::0;30880:4:::1;::::0;30846:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30835:51;;30899:27;30907:8;30917;30899:7;:27::i;:::-;30941:19:::0;;30937:84:::1;;30962:59;30993:10;31005:15;30962:30;:59::i;:::-;31079:5;-1:-1:-1::0;;;;;31039:46:0::1;31044:10;-1:-1:-1::0;;;;;31039:46:0::1;;31056:7;31065:12;31039:46;;;;;;;:::i;:::-;;;;;;;;31143:7;-1:-1:-1::0;;;;;31101:50:0::1;31106:10;-1:-1:-1::0;;;;;31101:50:0::1;;31118:7;31127:14;31101:50;;;;;;;:::i;:::-;;;;;;;;25446:1;;;;;;25469::::0;25458:8;:12;;;;29450:1709;;;;;:::o;18134:117::-;18185:66;18134:117;:::o;17755:44::-;17797:2;17755:44;:::o;24240:36::-;24273:3;24240:36;:::o;17982:40::-;;;;:::o;36935:184::-;37060:8;;37080:13;;37095:15;;;;37011:13;;37044:67;;37060:8;;;;;37070;;;;;;37044:15;:67::i;24288:41::-;24325:4;24288:41;:::o;42763:693::-;42855:22;42879:11;43113:131;43218:25;43233:3;:9;;;24425:3;43218:14;;:25;;;;:::i;:::-;43113:100;43195:17;43206:3;:5;;;24273:3;43195:10;;:17;;;;:::i;:::-;43113:77;43174:3;:15;;;43113:56;24425:3;43113:40;24273:3;43113:28;43127:3;:13;;;43113:9;:13;;:28;;;;:::i;:::-;:32;;:40::i;:131::-;43096:148;;43259:3;:9;;;43272:1;43259:14;43255:155;;43353:45;24425:3;43353:29;43372:3;:9;;;43353:14;:18;;:29;;;;:::i;:45::-;43347:51;;43255:155;42763:693;;;;;:::o;17846:50::-;;;;;;;;;;;;;:::o;25648:457::-;25837:10;-1:-1:-1;;;;;25851:7:0;25837:21;;25829:50;;;;-1:-1:-1;;;25829:50:0;;;;;;;:::i;:::-;25910:6;:16;;-1:-1:-1;;;;;25910:16:0;;;;;;;;;;;25937:6;:16;;;;;;;;;;;;;;;25964:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;25987:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;26014:16:0;:36;26061:16;:36;-1:-1:-1;;;;25648:457:0:o;18258:47::-;;;;;;;;;;;;;:::o;24891:31::-;;;;:::o;24471:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34861:1720;34983:13;35029:11;;35055:17;35051:1523;;24325:4;35089:18;;35051:1523;;;35992:16;;35910:49;;35962:47;;:25;:8;35975:11;35962:12;:25::i;:47::-;35910:99;;36024:47;36074:45;36102:16;;36074:23;36087:9;36074:8;:12;;:23;;;;:::i;:45::-;36024:95;;36134:36;36173:31;36194:9;36173:16;;:20;;:31;;;;:::i;:::-;36134:70;;36219:38;36260:33;36276:16;;36260:11;:15;;:33;;;;:::i;:::-;36219:74;-1:-1:-1;36318:244:0;36497:64;:28;36219:74;36497:32;:64::i;:::-;36318:148;24325:4;36318:132;36437:12;36318:148;36319:41;36365:39;36319:45;:86::i;36318:244::-;36310:252;;35051:1523;;;;;34861:1720;;;;;;;:::o;41731:952::-;41817:17;41836:11;42352:130;24425:3;42352:114;24273:3;42352:102;42440:3;:13;;;42352:83;42409:25;42424:3;:9;;;24425:3;42409:14;;:25;;;;:::i;:::-;42352:52;42386:17;42397:3;:5;;;24273:3;42386:10;;:17;;;;:::i;:::-;42365:15;;;;42352:29;;:8;;:12;:29::i;:130::-;42340:142;;42497:3;:9;;;42510:1;42497:14;42493:149;;42591:39;24425:3;42591:23;42604:3;:9;;;42591:8;:12;;:23;;;;:::i;31271:2891::-;31391:13;31406:14;31422:20;31444:27;;:::i;:::-;25381:8;;25393:1;25381:13;25373:39;;;;-1:-1:-1;;;25373:39:0;;;;;;;:::i;:::-;25434:1;25423:8;:12;;;31594:6:::1;::::0;31629::::1;::::0;31665:40:::1;::::0;-1:-1:-1;;;31665:40:0;;-1:-1:-1;;;;;31594:6:0;;::::1;::::0;31629;;;::::1;::::0;31594;;31665:25:::1;::::0;:40:::1;::::0;31699:4:::1;::::0;31665:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31646:59;;31716:16;31742:7;-1:-1:-1::0;;;;;31735:25:0::1;;31769:4;31735:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31716:59:::0;-1:-1:-1;31930:21:0::1;31902:25;::::0;32007:13:::1;:11;:13::i;:::-;31966:54;;;;32098:7;-1:-1:-1::0;;;;;32086:19:0::1;:8;-1:-1:-1::0;;;;;32086:19:0::1;;32082:266;;;32137:23;:8:::0;:23:::1;::::0;::::1;:12;:23::i;:::-;32126:34;;32082:266;;;32198:7;-1:-1:-1::0;;;;;32186:19:0::1;:8;-1:-1:-1::0;;;;;32186:19:0::1;;32182:166;;;32237:23;:8:::0;:23:::1;::::0;::::1;:12;:23::i;32182:166::-;32301:31;;-1:-1:-1::0;;;32301:31:0::1;;;;;;;:::i;32182:166::-;32381:1;32370:8;:12;32362:46;;;;-1:-1:-1::0;;;32362:46:0::1;;;;;;;:::i;:::-;32423:17;32454:10;32466:8;32476:2;32480:8;32443:46;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32423:66;;32532:22;;:::i;:::-;32636:53;32649:7;32658:24;32684:4;32636:12;:53::i;:::-;32623:9;::::0;::::1;32569:120:::0;32609:12:::1;::::0;::::1;32569:120:::0;32592:15:::1;::::0;::::1;32569:120:::0;;;32570:5:::1;::::0;::::1;32569:120:::0;-1:-1:-1;;;;;32722:19:0;;::::1;::::0;;::::1;;32718:238;;;32790:28;32804:8;32814:3;32790:13;:28::i;:::-;32762:56:::0;;;-1:-1:-1;32718:238:0::1;;;32856:7;-1:-1:-1::0;;;;;32844:19:0::1;:8;-1:-1:-1::0;;;;;32844:19:0::1;;32840:116;;;32912:28;32926:8;32936:3;32912:13;:28::i;:::-;32884:56:::0;;;-1:-1:-1;32840:116:0::1;32988:59;33002:44;:17:::0;33024:21:::1;33002;:44::i;32988:59::-;33077:13:::0;;33062:12:::1;::::0;;::::1;:28:::0;;;;33120:15;;::::1;::::0;33105:12;;::::1;:30:::0;32970:77;-1:-1:-1;;;;;;;;;;33175:13:0;;::::1;::::0;;::::1;;::::0;::::1;::::0;:30:::1;;;33198:7;-1:-1:-1::0;;;;;33192:13:0::1;:2;-1:-1:-1::0;;;;;33192:13:0::1;;;33175:30;33167:60;;;;-1:-1:-1::0;;;33167:60:0::1;;;;;;;:::i;:::-;33240:38;33254:8;33264:2;33268:9;33240:13;:38::i;:::-;33327:12:::0;;:16;33323:504:::1;;33364:54;::::0;;;;-1:-1:-1;;;;;33380:7:0::1;33364:45;::::0;::::1;::::0;:54:::1;::::0;33410:7;;33364:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33360:456;;;33580:12:::0;;33552:41:::1;::::0;33571:7;;33552:18:::1;:41::i;:::-;33360:456;;;33670:12:::0;;33634:49:::1;::::0;33652:7;;33661;;33634:17:::1;:49::i;:::-;33717:1;33702:16:::0;;33360:456:::1;33848:40;::::0;-1:-1:-1;;;33848:40:0;;-1:-1:-1;;;;;33848:25:0;::::1;::::0;::::1;::::0;:40:::1;::::0;33882:4:::1;::::0;33848:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33910;::::0;-1:-1:-1;;;33910:40:0;;33837:51;;-1:-1:-1;;;;;;33910:25:0;::::1;::::0;::::1;::::0;:40:::1;::::0;33944:4:::1;::::0;33910:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33899:51;;33963:27;33971:8;33981;33963:7;:27::i;:::-;34005:19:::0;;34001:84:::1;;34026:59;34057:10;34069:15;34026:30;:59::i;:::-;34151:2;-1:-1:-1::0;;;;;34103:51:0::1;34108:10;-1:-1:-1::0;;;;;34103:51:0::1;;34120:8;34130:9;34141:8;34103:51;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;25469:1:0;25458:8;:12;-1:-1:-1;31271:2891:0;;;;-1:-1:-1;31271:2891:0;;-1:-1:-1;31271:2891:0;-1:-1:-1;31271:2891:0:o;26113:218::-;26260:16;;26307;;;26113:218::o;17691:57::-;;;;;;;;;;;;;;;;;;;:::o;19944:148::-;20013:4;20030:32;20040:10;20052:2;20056:5;20030:9;:32::i;36646:160::-;36722:17;36764:34;36792:5;36764:23;:7;24325:4;36764:11;:23::i;24029:55::-;24079:5;24029:55;:::o;34211:343::-;25381:8;;25393:1;25381:13;25373:39;;;;-1:-1:-1;;;25373:39:0;;;;;;;:::i;:::-;25434:1;25423:8;:12;34289:6:::1;::::0;34339::::1;::::0;34443:8:::1;::::0;34398:40:::1;::::0;-1:-1:-1;;;34398:40:0;;-1:-1:-1;;;;;34289:6:0;;::::1;::::0;34339;;::::1;::::0;34371:82:::1;::::0;34289:6;;34394:2;;34398:54:::1;::::0;34443:8:::1;::::0;;::::1;::::0;34289:6;;34398:25:::1;::::0;:40:::1;::::0;34432:4:::1;::::0;34398:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:54::-;34371:13;:82::i;:::-;34464;34478:7;34487:2;34491:54;34536:8;;;;;;;;;;;34491:54;;34498:7;-1:-1:-1::0;;;;;34491:25:0::1;;34525:4;34491:40;;;;;;;;;;;;;;;:::i;34464:82::-;-1:-1:-1::0;;25469:1:0;25458:8;:12;-1:-1:-1;34211:343:0:o;43543:832::-;43635:22;43659:11;43893:131;43998:25;44013:3;:9;;;24425:3;43998:14;;:25;;;;:::i;:::-;43893:100;24273:3;43893:88;43967:3;:13;;;43893:69;24425:3;43893:53;43928:17;43939:3;:5;;;24273:3;43928:10;;:17;;;;:::i;43893:131::-;43876:148;;44039:3;:9;;;44052:1;44039:14;44035:294;;44197:120;24425:3;44197:104;44283:17;44294:3;:5;;;24273:3;44283:10;;:17;;;;:::i;:::-;44197:81;44262:3;:15;;;44197:60;44247:3;:9;;;44197:45;24273:3;44197:33;44216:3;:13;;;44197:14;:18;;:33;;;;:::i;24500:41::-;;;:::o;24599:30::-;;;-1:-1:-1;;;;;24599:30:0;;:::o;37969:213::-;38055:17;38085:13;38101:26;38123:3;38101:21;:26::i;:::-;38085:42;;38145:29;38159:7;38168:5;38145:13;:29::i;:::-;38138:36;37969:213;-1:-1:-1;;;;37969:213:0:o;20418:677::-;20573:15;20561:8;:27;;20553:55;;;;-1:-1:-1;;;20553:55:0;;;;;;;:::i;:::-;20724:16;;-1:-1:-1;;;;;20820:13:0;;20619:14;20820:13;;;:6;:13;;;;;;;;:15;;;;;;;;20769:77;;20619:14;;20724:16;20769:77;;18185:66;;20797:5;;20804:7;;20813:5;;20820:15;20837:8;;20769:77;;:::i;:::-;;;;;;;;;;;;;20759:88;;;;;;20660:202;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20636:237;;;;;;20619:254;;20884:24;20911:26;20921:6;20929:1;20932;20935;20911:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20911:26:0;;-1:-1:-1;;20911:26:0;;;-1:-1:-1;;;;;;;20956:30:0;;;;;;:59;;;21010:5;-1:-1:-1;;;;;20990:25:0;:16;-1:-1:-1;;;;;20990:25:0;;20956:59;20948:97;;;;-1:-1:-1;;;20948:97:0;;;;;;;:::i;:::-;21056:31;21065:5;21072:7;21081:5;21056:8;:31::i;:::-;20418:677;;;;;;;;;:::o;17903:70::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;40432:1215::-;40518:17;40537:11;41177:130;24425:3;41177:114;41273:17;41284:3;:5;;;24273:3;41273:10;;:17;;;;:::i;:::-;41177:91;41252:3;:15;;;41177:70;41221:25;41236:3;:9;;;24425:3;41221:14;;:25;;;;:::i;:::-;41190:13;;41177:39;;24273:3;;41177:39;;:8;;:12;:27::i;:130::-;41165:142;;41322:3;:9;;;41335:1;41322:14;41318:288;;41480:114;24425:3;41480:98;41560:17;41571:3;:5;;;24273:3;41560:10;;:17;;;;:::i;:::-;41480:75;41539:3;:15;;;41480:54;41524:3;:9;;;41480:39;24273:3;41480:27;41493:3;:13;;;41480:8;:12;;:27;;;;:::i;24853:31::-;;;;:::o;34603:147::-;25381:8;;25393:1;25381:13;25373:39;;;;-1:-1:-1;;;25373:39:0;;;;;;;:::i;:::-;25434:1;25423:8;:12;34668:6:::1;::::0;34661:39:::1;::::0;-1:-1:-1;;;34661:39:0;;34653:89:::1;::::0;-1:-1:-1;;;;;34668:6:0::1;::::0;34661:24:::1;::::0;:39:::1;::::0;34694:4:::1;::::0;34661:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34709:6;::::0;34702:39:::1;::::0;-1:-1:-1;;;34702:39:0;;-1:-1:-1;;;;;34709:6:0;;::::1;::::0;34702:24:::1;::::0;:39:::1;::::0;34735:4:::1;::::0;34702:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34653:7;:89::i;:::-;25469:1:::0;25458:8;:12;34603:147::o;19375:169::-;-1:-1:-1;;;;;19456:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;;:33;;;19505:31;;;;;19484:5;;19505:31;:::i;:::-;;;;;;;;19375:169;;;:::o;5205:158::-;5263:7;5296:1;5291;:6;;5283:49;;;;-1:-1:-1;;;5283:49:0;;;;;;;:::i;:::-;-1:-1:-1;5350:5:0;;;5205:158::o;5622:220::-;5680:7;5704:6;5700:20;;-1:-1:-1;5719:1:0;5712:8;;5700:20;5743:5;;;5747:1;5743;:5;:1;5767:5;;;;;:10;5759:56;;;;-1:-1:-1;;;5759:56:0;;;;;;;:::i;44383:272::-;44470:7;44479;44488;44497;44506;44568;-1:-1:-1;;;;;44552:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44533:72:0;;44613:9;44624:5;44637:2;44631:9;;;;;;;;44642:4;44533:114;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44526:121;;;;-1:-1:-1;44526:121:0;;-1:-1:-1;44526:121:0;-1:-1:-1;44526:121:0;;-1:-1:-1;44383:272:0;-1:-1:-1;;;;44383:272:0:o;18949:201::-;19022:11;;:22;;19038:5;19022:15;:22::i;:::-;19008:11;:36;;;-1:-1:-1;;;;;19071:13:0;;;;:9;:13;;;;;;:24;;19089:5;19071:17;:24::i;:::-;-1:-1:-1;;;;;19055:13:0;;;;;;:9;:13;;;;;;:40;;;;19111:31;;19055:13;;;19111:31;;;;19136:5;;19111:31;:::i;:::-;;;;;;;;18949:201;;:::o;26823:270::-;26897:23;;;;;;:50;;-1:-1:-1;26924:23:0;;;;26897:50;26889:78;;;;-1:-1:-1;;;26889:78:0;;;;;;;:::i;:::-;26978:8;:28;;;;;;;;;;;;27017;;;;;;;;;;;;;;;;27061:24;;;;;;27066:8;;;;27076;;;;;27061:24;:::i;:::-;;;;;;;;26823:270;;:::o;1748:195::-;1856:12;;;1818;1856;;;;;;;;;-1:-1:-1;;;;;1835:7:0;;;1849:5;;1835:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1817:52;;;1888:7;1880:55;;;;-1:-1:-1;;;1880:55:0;;;;;;;:::i;:::-;1748:195;;;:::o;6320:153::-;6378:7;6410:1;6406;:5;6398:44;;;;-1:-1:-1;;;6398:44:0;;;;;;;:::i;:::-;6464:1;6460;:5;;;;;;;6320:153;-1:-1:-1;;;6320:153:0:o;4743:179::-;4801:7;4833:5;;;4857:6;;;;4849:46;;;;-1:-1:-1;;;4849:46:0;;;;;;;:::i;19552:220::-;-1:-1:-1;;;;;19646:15:0;;;;;;:9;:15;;;;;;:26;;19666:5;19646:19;:26::i;:::-;-1:-1:-1;;;;;19628:15:0;;;;;;;:9;:15;;;;;;:44;;;;19699:13;;;;;;;:24;;19717:5;19699:17;:24::i;:::-;-1:-1:-1;;;;;19683:13:0;;;;;;;:9;:13;;;;;;;:40;;;;19739:25;;;;;;;;;;19758:5;;19739:25;:::i;19158:209::-;-1:-1:-1;;;;;19237:15:0;;;;;;:9;:15;;;;;;:26;;19257:5;19237:19;:26::i;:::-;-1:-1:-1;;;;;19219:15:0;;;;;;:9;:15;;;;;:44;;;;19288:11;:22;;19304:5;19288:15;:22::i;:::-;19274:11;:36;;;19326:33;;-1:-1:-1;;;;;19326:33:0;;;;;;;19353:5;;19326:33;:::i;26508:283::-;24195:34;;;;;;;;;;;;;;;;;26636:43;26590:12;;26604:17;;-1:-1:-1;;;;;26625:10:0;;;24185:45;;26636:43;;26669:2;;26673:5;;26636:43;;;:::i;:::-;;;;-1:-1:-1;;26636:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26625:55;;;;26636:43;26625:55;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26589:91;;;;26699:7;:57;;;;-1:-1:-1;26711:11:0;;:16;;:44;;;26742:4;26731:24;;;;;;;;;;;;:::i;:::-;26691:92;;;;-1:-1:-1;;;26691:92:0;;;;;;;:::i;:::-;26508:283;;;;;:::o;44663:630::-;44742:19;44780:7;-1:-1:-1;;;;;44764:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44742:63;-1:-1:-1;;;;;;44820:25:0;;44816:120;;44862:7;;;44816:120;44960:39;;-1:-1:-1;;;44960:39:0;;44946:11;;-1:-1:-1;;;;;44960:24:0;;;;;:39;;44993:4;;44960:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44946:53;;45021:3;45014:4;:10;45010:53;;;45048:3;45041:10;;45010:53;45075:29;;;;;-1:-1:-1;;;;;45075:23:0;;;;;:29;;45099:4;;45075:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45126:1;45119:4;:8;45115:63;;;45129:49;45160:11;45173:4;45129:30;:49::i;:::-;44663:630;;;;;:::o;45400:396::-;45514:50;;;;;45495:16;;-1:-1:-1;;;;;45530:7:0;45514:41;;;;:50;;45556:7;;45514:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45495:69;-1:-1:-1;;;;;;45579:22:0;;45575:115;;45618:7;;;45575:115;45700:37;45713:7;45722:8;45732:4;45914:40;;-1:-1:-1;;;45914:40:0;;45896:15;;-1:-1:-1;;;;;45914:25:0;;;;;:40;;45948:4;;45914:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45896:58;;45976:7;45969:4;:14;45965:61;;;46007:7;46000:14;;45965:61;46040:8;;46036:53;;46050:39;46064:7;46073:9;46084:4;46050:13;:39::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;556:442;;658:3;651:4;643:6;639:17;635:27;625:2;;-1:-1;;666:12;625:2;713:6;700:20;36154:18;36146:6;36143:30;36140:2;;;-1:-1;;36176:12;36140:2;735:65;36317:4;-1:-1;;651:4;36234:6;36230:17;36226:33;36307:15;735:65;:::i;:::-;726:74;;820:6;813:5;806:21;924:3;36317:4;915:6;848;906:16;;903:25;900:2;;;941:1;;931:12;900:2;38974:6;36317:4;848:6;844:17;36317:4;882:5;878:16;38951:30;39030:1;39012:16;;;36317:4;39012:16;39005:27;882:5;618:380;-1:-1;;618:380::o;1044:918::-;;1162:4;1150:9;1145:3;1141:19;1137:30;1134:2;;;-1:-1;;1170:12;1134:2;1198:20;1162:4;1198:20;:::i;:::-;1189:29;;2049:6;2036:20;1287:16;1280:75;1423:2;1481:9;1477:22;2036:20;1423:2;1442:5;1438:16;1431:75;1571:2;1629:9;1625:22;2036:20;1571:2;1590:5;1586:16;1579:75;1712:2;1770:9;1766:22;2036:20;1712:2;1731:5;1727:16;1720:75;1857:3;1916:9;1912:22;2036:20;1857:3;1877:5;1873:16;1866:75;1128:834;;;;:::o;2380:241::-;;2484:2;2472:9;2463:7;2459:23;2455:32;2452:2;;;-1:-1;;2490:12;2452:2;85:6;72:20;97:33;124:5;97:33;:::i;2628:263::-;;2743:2;2731:9;2722:7;2718:23;2714:32;2711:2;;;-1:-1;;2749:12;2711:2;226:6;220:13;238:33;265:5;238:33;:::i;2898:366::-;;;3019:2;3007:9;2998:7;2994:23;2990:32;2987:2;;;-1:-1;;3025:12;2987:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3077:63;-1:-1;3177:2;3216:22;;72:20;97:33;72:20;97:33;:::i;:::-;3185:63;;;;2981:283;;;;;:::o;3271:1081::-;;;;;;;3480:3;3468:9;3459:7;3455:23;3451:33;3448:2;;;-1:-1;;3487:12;3448:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3539:63;-1:-1;3639:2;3678:22;;72:20;97:33;72:20;97:33;:::i;:::-;3647:63;-1:-1;3775:2;3760:18;;3747:32;3799:18;3788:30;;;3785:2;;;-1:-1;;3821:12;3785:2;3851:63;3906:7;3897:6;3886:9;3882:22;3851:63;:::i;:::-;3841:73;;3979:2;3968:9;3964:18;3951:32;3937:46;;3799:18;3995:6;3992:30;3989:2;;;-1:-1;;4025:12;3989:2;;4055:63;4110:7;4101:6;4090:9;4086:22;4055:63;:::i;:::-;4045:73;;;4155:3;4199:9;4195:22;2036:20;4164:63;;4264:3;4308:9;4304:22;2036:20;4273:63;;3442:910;;;;;;;;:::o;4359:491::-;;;;4497:2;4485:9;4476:7;4472:23;4468:32;4465:2;;;-1:-1;;4503:12;4465:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4555:63;-1:-1;4655:2;4694:22;;72:20;97:33;72:20;97:33;:::i;:::-;4459:391;;4663:63;;-1:-1;;;4763:2;4802:22;;;;2036:20;;4459:391::o;4857:991::-;;;;;;;;5061:3;5049:9;5040:7;5036:23;5032:33;5029:2;;;-1:-1;;5068:12;5029:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5120:63;-1:-1;5220:2;5259:22;;72:20;97:33;72:20;97:33;:::i;:::-;5228:63;-1:-1;5328:2;5367:22;;2036:20;;-1:-1;5436:2;5475:22;;2036:20;;-1:-1;5544:3;5582:22;;2312:20;38496:4;38485:16;;40056:33;;40046:2;;-1:-1;;40093:12;40046:2;5023:825;;;;-1:-1;5023:825;;;;5553:61;5651:3;5691:22;;485:20;;-1:-1;5760:3;5800:22;;;485:20;;5023:825;-1:-1;;5023:825::o;5855:366::-;;;5976:2;5964:9;5955:7;5951:23;5947:32;5944:2;;;-1:-1;;5982:12;5944:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6034:63;6134:2;6173:22;;;;2036:20;;-1:-1;;;5938:283::o;6228:491::-;;;;6366:2;6354:9;6345:7;6341:23;6337:32;6334:2;;;-1:-1;;6372:12;6334:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6424:63;6524:2;6563:22;;2036:20;;-1:-1;6632:2;6671:22;;;2036:20;;6328:391;-1:-1;;;6328:391::o;6726:257::-;;6838:2;6826:9;6817:7;6813:23;6809:32;6806:2;;;-1:-1;;6844:12;6806:2;364:6;358:13;39714:5;37997:13;37990:21;39692:5;39689:32;39679:2;;-1:-1;;39725:12;6990:300;;7123:3;7111:9;7102:7;7098:23;7094:33;7091:2;;;-1:-1;;7130:12;7091:2;7192:82;7266:7;7242:22;7192:82;:::i;7297:263::-;;7412:2;7400:9;7391:7;7387:23;7383:32;7380:2;;;-1:-1;;7418:12;7380:2;-1:-1;2184:13;;7374:186;-1:-1;7374:186::o;7567:425::-;;;7717:3;7705:9;7696:7;7692:23;7688:33;7685:2;;;-1:-1;;7724:12;7685:2;2049:6;2036:20;7776:63;;7894:82;7968:7;7876:2;7948:9;7944:22;7894:82;:::i;7999:366::-;;;8120:2;8108:9;8099:7;8095:23;8091:32;8088:2;;;-1:-1;;8126:12;8088:2;-1:-1;;2036:20;;;8278:2;8317:22;;;2036:20;;-1:-1;8082:283::o;8372:617::-;;;;;8527:3;8515:9;8506:7;8502:23;8498:33;8495:2;;;-1:-1;;8534:12;8495:2;-1:-1;;2036:20;;;8686:2;8725:22;;2036:20;;-1:-1;8794:2;8833:22;;2036:20;;8902:2;8941:22;2036:20;;-1:-1;8489:500;-1:-1;8489:500::o;8996:809::-;;;;;;9179:3;9167:9;9158:7;9154:23;9150:33;9147:2;;;-1:-1;;9186:12;9147:2;-1:-1;;2184:13;;9349:2;9399:22;;2184:13;9468:2;9518:22;;2184:13;9587:2;9637:22;;2184:13;9706:3;9757:22;;;2184:13;;;;;-1:-1;2184:13;;-1:-1;2184:13;;-1:-1;9141:664;-1:-1;9141:664::o;11498:343::-;;11640:5;36645:12;37192:6;37187:3;37180:19;11733:52;11778:6;37229:4;37224:3;37220:14;37229:4;11759:5;11755:16;11733:52;:::i;:::-;39492:2;39472:14;-1:-1;;39468:28;11797:39;;;;37229:4;11797:39;;11588:253;-1:-1;;11588:253::o;19494:271::-;;12008:5;36645:12;12119:52;12164:6;12159:3;12152:4;12145:5;12141:16;12119:52;:::i;:::-;12183:16;;;;;19628:137;-1:-1;;19628:137::o;19772:659::-;13517:66;13497:87;;13482:1;13603:11;;11290:37;;;;20283:12;;;11290:37;20394:12;;;20017:414::o;20438:222::-;-1:-1;;;;;38280:54;;;;10230:45;;20565:2;20550:18;;20536:124::o;20912:588::-;-1:-1;;;;;38280:54;;;10230:45;;38280:54;;;21320:2;21305:18;;10230:45;38280:54;;21403:2;21388:18;;10230:45;21486:2;21471:18;;11290:37;;;;21139:3;21124:19;;21110:390::o;21507:588::-;-1:-1;;;;;38280:54;;;10230:45;;38280:54;;;;21915:2;21900:18;;10230:45;21998:2;21983:18;;11290:37;22081:2;22066:18;;11290:37;;;;21734:3;21719:19;;21705:390::o;22102:365::-;-1:-1;;;;;38280:54;;;;10230:45;;22453:2;22438:18;;11290:37;22273:2;22258:18;;22244:223::o;22814:520::-;;-1:-1;;;;;38284:5;38280:54;10237:3;10230:45;38496:4;19475:5;38485:16;23171:2;23160:9;23156:18;19447:35;23011:2;23208;23197:9;23193:18;23186:48;23248:76;23011:2;23000:9;22996:18;23310:6;23248:76;:::i;:::-;23240:84;22982:352;-1:-1;;;;;22982:352::o;23341:210::-;37997:13;;37990:21;11173:34;;23462:2;23447:18;;23433:118::o;23558:222::-;11290:37;;;23685:2;23670:18;;23656:124::o;23787:780::-;11290:37;;;-1:-1;;;;;38280:54;;;24219:2;24204:18;;10230:45;38280:54;;;;24302:2;24287:18;;10230:45;24385:2;24370:18;;11290:37;24468:3;24453:19;;11290:37;;;;24552:3;24537:19;;11290:37;24054:3;24039:19;;24025:542::o;24574:548::-;11290:37;;;38496:4;38485:16;;;;24942:2;24927:18;;19447:35;25025:2;25010:18;;11290:37;25108:2;25093:18;;11290:37;24781:3;24766:19;;24752:370::o;25129:310::-;;25276:2;25297:17;25290:47;25351:78;25276:2;25265:9;25261:18;25415:6;25351:78;:::i;25446:416::-;25646:2;25660:47;;;12790:2;25631:18;;;37180:19;12826:15;37220:14;;;12806:36;12861:12;;;25617:245::o;25869:416::-;26069:2;26083:47;;;13112:2;26054:18;;;37180:19;13148:27;37220:14;;;13128:48;13195:12;;;26040:245::o;26292:416::-;26492:2;26506:47;;;13853:2;26477:18;;;37180:19;13889:29;37220:14;;;13869:50;13938:12;;;26463:245::o;26715:416::-;26915:2;26929:47;;;14189:2;26900:18;;;37180:19;14225:32;37220:14;;;14205:53;14277:12;;;26886:245::o;27138:416::-;27338:2;27352:47;;;14528:2;27323:18;;;37180:19;14564;37220:14;;;14544:40;14603:12;;;27309:245::o;27561:416::-;27761:2;27775:47;;;14854:2;27746:18;;;37180:19;14890:28;37220:14;;;14870:49;14938:12;;;27732:245::o;27984:416::-;28184:2;28198:47;;;15189:2;28169:18;;;37180:19;15225:28;37220:14;;;15205:49;15273:12;;;28155:245::o;28407:416::-;28607:2;28621:47;;;15524:2;28592:18;;;37180:19;15560:34;37220:14;;;15540:55;15629:3;15615:12;;;15608:25;15652:12;;;28578:245::o;28830:416::-;29030:2;29044:47;;;15903:2;29015:18;;;37180:19;15939:17;37220:14;;;15919:38;15976:12;;;29001:245::o;29253:416::-;29453:2;29467:47;;;16227:2;29438:18;;;37180:19;16263:23;37220:14;;;16243:44;16306:12;;;29424:245::o;29676:416::-;29876:2;29890:47;;;16557:2;29861:18;;;37180:19;16593:24;37220:14;;;16573:45;16637:12;;;29847:245::o;30099:416::-;30299:2;30313:47;;;16888:2;30284:18;;;37180:19;16924:31;37220:14;;;16904:52;16975:12;;;30270:245::o;30522:416::-;30722:2;30736:47;;;17226:2;30707:18;;;37180:19;17262:31;37220:14;;;17242:52;17313:12;;;30693:245::o;30945:416::-;31145:2;31159:47;;;17564:2;31130:18;;;37180:19;17600:18;37220:14;;;17580:39;17638:12;;;31116:245::o;31368:416::-;31568:2;31582:47;;;17889:2;31553:18;;;37180:19;17925:34;37220:14;;;17905:55;17994:5;17980:12;;;17973:27;18019:12;;;31539:245::o;31791:416::-;31991:2;32005:47;;;18270:2;31976:18;;;37180:19;18306:24;37220:14;;;18286:45;18350:12;;;31962:245::o;32214:416::-;32414:2;32428:47;;;18601:2;32399:18;;;37180:19;18637:17;37220:14;;;18617:38;18674:12;;;32385:245::o;32637:416::-;32837:2;32851:47;;;18925:2;32822:18;;;37180:19;18961:23;37220:14;;;18941:44;19004:12;;;32808:245::o;33060:333::-;38175:30;38164:42;;;19101:37;;38164:42;;33379:2;33364:18;;19101:37;33215:2;33200:18;;33186:207::o;33629:333::-;11290:37;;;33948:2;33933:18;;11290:37;33784:2;33769:18;;33755:207::o;33969:444::-;11290:37;;;34316:2;34301:18;;11290:37;;;;-1:-1;;;;;38280:54;34399:2;34384:18;;10230:45;34152:2;34137:18;;34123:290::o;34420:444::-;11290:37;;;34767:2;34752:18;;11290:37;;;;34850:2;34835:18;;11290:37;34603:2;34588:18;;34574:290::o;34871:648::-;;35128:3;35117:9;35113:19;35105:27;;11320:5;11297:3;11290:37;35293:2;11320:5;35293:2;35282:9;35278:18;11290:37;11320:5;35376:2;35365:9;35361:18;11290:37;35505:2;35494:9;35490:18;10803:21;10845:1;10830:258;36537:4;10852:1;10849:13;10830:258;;;10916:13;;11290:37;;9966:14;;;;36902;;;;10877:1;10870:9;10830:258;;;10834:14;;;;35099:420;;;;;;;:::o;35526:214::-;38496:4;38485:16;;;;19447:35;;35649:2;35634:18;;35620:120::o;35747:256::-;35809:2;35803:9;35835:17;;;35910:18;35895:34;;35931:22;;;35892:62;35889:2;;;35967:1;;35957:12;35889:2;35809;35976:22;35787:216;;-1:-1;35787:216::o;39047:268::-;39112:1;39119:101;39133:6;39130:1;39127:13;39119:101;;;39200:11;;;39194:18;39181:11;;;39174:39;39155:2;39148:10;39119:101;;;39235:6;39232:1;39229:13;39226:2;;;-1:-1;;39112:1;39282:16;;39275:27;39096:219::o;39509:117::-;-1:-1;;;;;39596:5;38280:54;39571:5;39568:35;39558:2;;39617:1;;39607:12;39558:2;39552:74;:::o

Swarm Source

ipfs://75fd8b231a5e9a3ccabafbc24c4617be2296d370b66ce185fd035003fd69a2ba
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.