ETH Price: $3,299.57 (+1.53%)
Gas: 2 Gwei

Token

Darkpool AI (DPAI)
 

Overview

Max Total Supply

1,000,000,000 DPAI

Holders

49

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,174.113554282 DPAI

Value
$0.00
0x6007b5111ccf41f4956fac66d6c5ddfd1ec75310
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:
Darkpool

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-09
*/

// DarkPool AI
// $DPAI
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function allPairsLength() external view returns (uint256);

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

    function allPairs(uint256) external view returns (address pair);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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
    );

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);
}

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() external view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() external view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
 contract Darkpool is ERC20, Ownable {
    // TOKENOMICS  ==========================================================>
    string private _name = "Darkpool AI";
    string private _symbol = "DPAI";

    uint8 private _decimals = 9;
    uint256 private _supply = 1000000000;
    uint256 public taxForLiquidity = 48; // antisniper
    uint256 public taxForMarketing = 48; // antisniper
    uint256 public maxTxAmount = 15000000 * 10**_decimals;
    uint256 public maxWalletAmount = 15000000 * 10**_decimals;
    address public marketingWallet = 0x4C61CCb98c02aECAc1CCeD36Cb5E008f13Abe5F8;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _marketingReserves = 0;
    mapping(address => bool) public _isExcludedFromFee;

    uint256 public numTokensSellToAddToLiquidity = 600000 * 10**_decimals;
    uint256 public numTokensSellToAddToETH = 7400000 * 10**_decimals;      


    // Antibot - Dont make me put in a blacklist!  ==============================================>
    function Antibot() external onlyOwner {
        require(taxForMarketing > 46, "Antibot stage one 51%");     // Do not ape!
        taxForLiquidity = 6;
        taxForMarketing = 45;
        maxTxAmount = 15000000 * 10**_decimals;
        maxWalletAmount = 15000000 * 10**_decimals;
    }
	
	    function Antibot2() external onlyOwner {
        require(taxForMarketing > 35, "Antibot stage two 24%");    // Ape at your own risk
        taxForLiquidity = 2;
        taxForMarketing = 22;
        maxTxAmount = 15000000 * 10**_decimals;
        maxWalletAmount = 15000000 * 10**_decimals;
    }
	
	    function Antibot3() external onlyOwner {
        require(taxForMarketing > 20, "Antibot stage three 10%");  // Lets go!
        taxForLiquidity = 2;
        taxForMarketing = 8;
        maxTxAmount = 15000000 * 10**_decimals;
        maxWalletAmount = 15000000 * 10**_decimals;
    }
	
	
      // Access  ==============================================>
    struct userUnlock {
        string tgUserName;
        bool unlocked;
        uint256 unlockedAt;
        uint256 totalEthPaid;
    }

    struct channelUnlock {
        string tgChannel;
        bool unlocked;
        uint256 unlockedAt;
        uint256 totalEthPaid;
    }

    mapping(string => userUnlock) public unlockedUsers;
    mapping(string => channelUnlock) public unlockedChannels;

    uint public userCostEth = 0.05 ether;
    uint public userCostTokens = 10000 * 10**_decimals;

    uint public channelCostEth = 0.3 ether;
    uint public channelCostTokens = 100000 * 10**_decimals;

    event UserUnlocked(string tg_username, uint256 unlockTime);
    event ChannelUnlocked(string tg_channel, uint256 unlockTime);
    event CostUpdated(bool _isEth, bool _isChannel, uint _cost);
    event ExcludedFromFeeUpdated(address _address, bool _status);
    event AdminModifierSet(string tg_user_chan, bool _isChannel, bool _isUnlocked, 
        uint _unlockBlock, uint _amtPaid);
    event PairUpdated(address _address);

    // Unlocks AI through contract
    function unlockUser(string memory tg_username) external payable {
        require(msg.value >= userCostEth, "Not enough ETH sent!");
        require(msg.sender.balance >= userCostTokens, "Not enough tokens!");
        _marketingReserves += msg.value;
        _transfer(msg.sender, DEAD, userCostTokens);

        unlockedUsers[tg_username] = userUnlock(
            tg_username,
            true,
            block.timestamp,
            unlockedUsers[tg_username].totalEthPaid + msg.value
        );
        emit UserUnlocked(tg_username, block.timestamp);
    }

    function unlockChannel(string memory tg_channel) external payable {
        require(msg.value >= userCostEth, "Not enough ETH sent!");
        require(msg.sender.balance >= userCostTokens, "Not enough tokens!");
        _marketingReserves += msg.value;
        _transfer(msg.sender, DEAD, userCostTokens);
        
        unlockedChannels[tg_channel] = channelUnlock(
            tg_channel,
            true,
            block.timestamp,
            unlockedChannels[tg_channel].totalEthPaid + msg.value
        );
        emit ChannelUnlocked(tg_channel, block.timestamp);
    }

    //ABI getters
    function isUnlocked(string memory tg_user_chan, bool _isChannel) external view returns(bool) {
        if (_isChannel) {
            return unlockedChannels[tg_user_chan].unlocked;
        }
        return unlockedUsers[tg_user_chan].unlocked;
    }

    function getAmtPaid(string memory tg_user_chan, bool _isChannel) external view returns(uint) {
        if (_isChannel) {
            return unlockedChannels[tg_user_chan].totalEthPaid;
        }
        return unlockedUsers[tg_user_chan].totalEthPaid;
    }

    function getUnlockBlock(string memory tg_user_chan, bool _isChannel) external view returns(uint) {
        if (_isChannel) {
            return unlockedChannels[tg_user_chan].unlockedAt;
        }
        return unlockedUsers[tg_user_chan].unlockedAt;
    }

    //Admin modifier function
    function setUnlockStatus(string memory tg_user_chan, bool _isChannel, 
        bool _isUnlocked, uint _unlockBlock, uint _amtPaid) external onlyOwner {
        if (_isChannel) {
            unlockedChannels[tg_user_chan] = channelUnlock(
                tg_user_chan,
                _isUnlocked,
                _unlockBlock,
                _amtPaid
            );
        } else {
            unlockedUsers[tg_user_chan] = userUnlock(
                tg_user_chan,
                _isUnlocked,
                _unlockBlock,
                _amtPaid
            );
        }
        emit AdminModifierSet(tg_user_chan, _isChannel, _isUnlocked, _unlockBlock, _amtPaid);
    }

    function setCost(bool _isEth, bool _isChannel, uint _cost) external onlyOwner {
        if (_isEth) {
            if (_isChannel) {
                channelCostEth = _cost;
            } else {
                userCostEth = _cost;
            }
        } else {
            if (_isChannel) {
                channelCostTokens = _cost * 10**_decimals;
            } else {
                userCostTokens = _cost * 10**_decimals;
            }
        }
        emit CostUpdated(_isEth, _isChannel, _cost);
    }
    // Rest --->

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    
    bool inSwapAndLiquify;

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor() ERC20(_name, _symbol) {
        _mint(msg.sender, (_supply * 10**_decimals));

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //eth mainnet
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[address(uniswapV2Router)] = true;
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[marketingWallet] = true;
    }

    function updatePair(address _pair) external onlyOwner {
        require(_pair != DEAD, "LP Pair cannot be the Dead wallet, or 0!");
        require(_pair != address(0), "LP Pair cannot be the Dead wallet, or 0!");
        uniswapV2Pair = _pair;
        emit PairUpdated(_pair);
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(balanceOf(from) >= amount, "ERC20: transfer amount exceeds balance");

        if ((from == uniswapV2Pair || to == uniswapV2Pair) && !inSwapAndLiquify) {
            if (from != uniswapV2Pair) {
                uint256 contractLiquidityBalance = balanceOf(address(this)) - _marketingReserves;
                if (contractLiquidityBalance >= numTokensSellToAddToLiquidity) {
                    _swapAndLiquify(numTokensSellToAddToLiquidity);
                }
                if ((_marketingReserves) >= numTokensSellToAddToETH) {
                    _swapTokensForEth(numTokensSellToAddToETH);
                    _marketingReserves -= numTokensSellToAddToETH;
                    bool sent = payable(marketingWallet).send(address(this).balance);
                    require(sent, "Failed to send ETH");
                }
            }

            uint256 transferAmount;
            if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
                transferAmount = amount;
            } 
            else {
                require(amount <= maxTxAmount, "ERC20: transfer amount exceeds the max transaction amount");
                if(from == uniswapV2Pair){
                    require((amount + balanceOf(to)) <= maxWalletAmount, "ERC20: balance amount exceeded max wallet amount limit");
                }

                uint256 marketingShare = ((amount * taxForMarketing) / 100);
                uint256 liquidityShare = ((amount * taxForLiquidity) / 100);
                transferAmount = amount - (marketingShare + liquidityShare);
                _marketingReserves += marketingShare;

                super._transfer(from, address(this), (marketingShare + liquidityShare));
            }
            super._transfer(from, to, transferAmount);
        } 
        else {
            super._transfer(from, to, amount);
        }
    }

    function excludeFromFee(address _address, bool _status) external onlyOwner {
        _isExcludedFromFee[_address] = _status;
        emit ExcludedFromFeeUpdated(_address, _status);
    }

    function _swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 half = (contractTokenBalance / 2);
        uint256 otherHalf = (contractTokenBalance - half);

        uint256 initialBalance = address(this).balance;

        _swapTokensForEth(half);

        uint256 newBalance = (address(this).balance - initialBalance);

        _addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function _swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount)
        private
        lockTheSwap
    {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            marketingWallet,
            block.timestamp
        );
    }

    function changeMarketingWallet(address newWallet)
        public
        onlyOwner
        returns (bool)
    {
        require(newWallet != DEAD, "LP Pair cannot be the Dead wallet, or 0!");
        require(newWallet != address(0), "LP Pair cannot be the Dead wallet, or 0!");
        marketingWallet = newWallet;
        return true;
    }

    function changeTaxForLiquidityAndMarketing(uint256 _taxForLiquidity, uint256 _taxForMarketing)
        public
        onlyOwner
        returns (bool)
    {
        require((_taxForLiquidity+_taxForMarketing) <= 10, "ERC20: total tax cannot exceed 10%");
        taxForLiquidity = _taxForLiquidity;
        taxForMarketing = _taxForMarketing;

        return true;
    }

    function changeSwapThresholds(uint256 _numTokensSellToAddToLiquidity, uint256 _numTokensSellToAddToETH)
        public
        onlyOwner
        returns (bool)
    {
        require(_numTokensSellToAddToLiquidity < _supply / 98, "Cannot liquidate more than 2% at once!");
        require(_numTokensSellToAddToETH < _supply / 98, "Cannot liquidate more than 2% at once!");
        numTokensSellToAddToLiquidity = _numTokensSellToAddToLiquidity * 10**_decimals;
        numTokensSellToAddToETH = _numTokensSellToAddToETH * 10**_decimals;

        return true;
    }

    function changeMaxTxAmount(uint256 _maxTxAmount)
        public
        onlyOwner
        returns (bool)
    {
        require(_maxTxAmount > 10000000000000000, "Minimum transaction size 1%");
        maxTxAmount = _maxTxAmount;

        return true;
    }

    function changeMaxWalletAmount(uint256 _maxWalletAmount)
        public
        onlyOwner
        returns (bool)
    {
        require(_maxWalletAmount > 10000000000000000, "Minimum wallet size 1%");
        maxWalletAmount = _maxWalletAmount;

        return true;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tg_user_chan","type":"string"},{"indexed":false,"internalType":"bool","name":"_isChannel","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isUnlocked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_unlockBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amtPaid","type":"uint256"}],"name":"AdminModifierSet","type":"event"},{"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":false,"internalType":"string","name":"tg_channel","type":"string"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"ChannelUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isEth","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isChannel","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"CostUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"ExcludedFromFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"PairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tg_username","type":"string"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"UserUnlocked","type":"event"},{"inputs":[],"name":"Antibot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Antibot2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Antibot3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"changeMaxTxAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"changeMaxWalletAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokensSellToAddToLiquidity","type":"uint256"},{"internalType":"uint256","name":"_numTokensSellToAddToETH","type":"uint256"}],"name":"changeSwapThresholds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxForLiquidity","type":"uint256"},{"internalType":"uint256","name":"_taxForMarketing","type":"uint256"}],"name":"changeTaxForLiquidityAndMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"channelCostEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"channelCostTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"getAmtPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"getUnlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"isUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEth","type":"bool"},{"internalType":"bool","name":"_isChannel","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"},{"internalType":"bool","name":"_isUnlocked","type":"bool"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"},{"internalType":"uint256","name":"_amtPaid","type":"uint256"}],"name":"setUnlockStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tg_channel","type":"string"}],"name":"unlockChannel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_username","type":"string"}],"name":"unlockUser","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"unlockedChannels","outputs":[{"internalType":"string","name":"tgChannel","type":"string"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlockedAt","type":"uint256"},{"internalType":"uint256","name":"totalEthPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"unlockedUsers","outputs":[{"internalType":"string","name":"tgUserName","type":"string"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlockedAt","type":"uint256"},{"internalType":"uint256","name":"totalEthPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"updatePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCostEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userCostTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600b60a09081526a4461726b706f6f6c20414960a81b60c0526006906200002c9082620006d4565b506040805180820190915260048152634450414960e01b6020820152600790620000579082620006d4565b506008805460ff19166009908117909155633b9aca0081556030600a818155600b91909155620000889190620008b5565b620000979062e4e1c0620008cd565b600c55600854620000ad9060ff16600a620008b5565b620000bc9062e4e1c0620008cd565b600d55600e80546001600160a01b0319908116734c61ccb98c02aecac1cced36cb5e008f13abe5f817909155600f805490911661dead17905560006010556008546200010d9060ff16600a620008b5565b6200011c90620927c0620008cd565b601255600854620001329060ff16600a620008b5565b62000141906270ea40620008cd565b60135566b1a2bc2ec50000601655600854620001629060ff16600a620008b5565b6200017090612710620008cd565b601755670429d069189e0000601855600854620001929060ff16600a620008b5565b620001a190620186a0620008cd565b601955348015620001b157600080fd5b5060068054620001c19062000645565b80601f0160208091040260200160405190810160405280929190818152602001828054620001ef9062000645565b8015620002405780601f10620002145761010080835404028352916020019162000240565b820191906000526020600020905b8154815290600101906020018083116200022257829003601f168201915b505050505060078054620002549062000645565b80601f0160208091040260200160405190810160405280929190818152602001828054620002829062000645565b8015620002d35780601f10620002a757610100808354040283529160200191620002d3565b820191906000526020600020905b815481529060010190602001808311620002b557829003601f168201915b50505050508160039081620002e99190620006d4565b506004620002f88282620006d4565b505050620003156200030f6200051360201b60201c565b62000517565b600854620003449033906200032f9060ff16600a620008b5565b6009546200033e9190620008cd565b62000569565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200039c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c29190620008ef565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000410573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004369190620008ef565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000484573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004aa9190620008ef565b601a80546001600160a01b0319166001600160a01b039283161790559081166080819052600090815260116020526040808220805460ff1990811660019081179092553384528284208054821683179055600e5490941683529120805490921617905562000930565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620005c45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620005d891906200091a565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200065a57607f821691505b6020821081036200067b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006cf57600081815260208120601f850160051c81016020861015620006aa5750805b601f850160051c820191505b81811015620006cb57828155600101620006b6565b5050505b505050565b81516001600160401b03811115620006f057620006f06200062f565b620007088162000701845462000645565b8462000681565b602080601f831160018114620007405760008415620007275750858301515b600019600386901b1c1916600185901b178555620006cb565b600085815260208120601f198616915b82811015620007715788860151825594840194600190910190840162000750565b5085821015620007905787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007f7578160001904821115620007db57620007db620007a0565b80851615620007e957918102915b93841c9390800290620007bb565b509250929050565b6000826200081057506001620008af565b816200081f57506000620008af565b8160018114620008385760028114620008435762000863565b6001915050620008af565b60ff841115620008575762000857620007a0565b50506001821b620008af565b5060208310610133831016604e8410600b841016171562000888575081810a620008af565b620008948383620007b6565b8060001904821115620008ab57620008ab620007a0565b0290505b92915050565b6000620008c660ff841683620007ff565b9392505050565b6000816000190483118215151615620008ea57620008ea620007a0565b500290565b6000602082840312156200090257600080fd5b81516001600160a01b0381168114620008c657600080fd5b80820180821115620008af57620008af620007a0565b608051612b2c6200096f6000396000818161039801528181611e7101528181611f2a01528181611f66015281816120ec01526121540152612b2c6000f3fe6080604052600436106102b25760003560e01c806373c503b311610175578063ad16a0cf116100dc578063dd62ed3e11610095578063f1b2b3d91161006f578063f1b2b3d91461082b578063f2fde38b1461084b578063f345bd851461086b578063fbee93ba1461088157600080fd5b8063dd62ed3e146107d5578063df1d099e146107f5578063df8408fe1461080b57600080fd5b8063ad16a0cf14610733578063af8af69014610749578063b5c78e8a14610769578063bb85c6d114610789578063c0fdea57146107a9578063d12a7688146107bf57600080fd5b80638da5cb5b1161012e5780638da5cb5b1461068a57806395d89b41146106a8578063a2330d97146106bd578063a457c2d7146106dd578063a9059cbb146106fd578063aa4bde281461071d57600080fd5b806373c503b3146105ce57806375f0a874146105ee578063768dc7101461060e5780637930ef691461063e57806381bfdcca146106545780638c0b5e221461067457600080fd5b8063248efac7116102195780634fa74c4d116101d25780634fa74c4d146104fd578063527ffabd1461051d57806363cdf60f14610533578063677daa571461056357806370a0823114610583578063715018a6146105b957600080fd5b8063248efac7146104575780632d5e9d911461046c57806330b63d8014610481578063313ce567146104a157806339509351146104bd57806349bd5a5e146104dd57600080fd5b806316a7b1601161026b57806316a7b160146103ba57806318160ddd146103cd57806318bc47f6146103e25780631939837d146104025780631b56bbf91461041757806323b872dd1461043757600080fd5b806303fd2a45146102be578063054dee0f146102fb57806306fdde031461031f578063095ea7b3146103415780630f1d7ad9146103715780631694505e1461038657600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b50600f546102de906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030757600080fd5b5061031160165481565b6040519081526020016102f2565b34801561032b57600080fd5b50610334610897565b6040516102f29190612229565b34801561034d57600080fd5b5061036161035c366004612258565b610929565b60405190151581526020016102f2565b61038461037f366004612327565b610943565b005b34801561039257600080fd5b506102de7f000000000000000000000000000000000000000000000000000000000000000081565b6103846103c8366004612327565b610af5565b3480156103d957600080fd5b50600254610311565b3480156103ee57600080fd5b506103846103fd366004612374565b610c97565b34801561040e57600080fd5b50610384610def565b34801561042357600080fd5b506103846104323660046123e4565b610e9a565b34801561044357600080fd5b50610361610452366004612401565b610f44565b34801561046357600080fd5b50610384610f68565b34801561047857600080fd5b50610384610fd8565b34801561048d57600080fd5b5061036161049c366004612442565b611048565b3480156104ad57600080fd5b50604051600981526020016102f2565b3480156104c957600080fd5b506103616104d8366004612258565b6110f1565b3480156104e957600080fd5b50601a546102de906001600160a01b031681565b34801561050957600080fd5b50610361610518366004612464565b611113565b34801561052957600080fd5b50610311600b5481565b34801561053f57600080fd5b5061055361054e366004612327565b611176565b6040516102f294939291906124b2565b34801561056f57600080fd5b5061036161057e3660046124e1565b611237565b34801561058f57600080fd5b5061031161059e3660046123e4565b6001600160a01b031660009081526020819052604090205490565b3480156105c557600080fd5b506103846112a5565b3480156105da57600080fd5b506103846105e93660046124fa565b6112b9565b3480156105fa57600080fd5b50600e546102de906001600160a01b031681565b34801561061a57600080fd5b506103616106293660046123e4565b60116020526000908152604090205460ff1681565b34801561064a57600080fd5b5061031160185481565b34801561066057600080fd5b5061036161066f3660046124e1565b611372565b34801561068057600080fd5b50610311600c5481565b34801561069657600080fd5b506005546001600160a01b03166102de565b3480156106b457600080fd5b506103346113d4565b3480156106c957600080fd5b506105536106d8366004612327565b6113e3565b3480156106e957600080fd5b506103616106f8366004612258565b611409565b34801561070957600080fd5b50610361610718366004612258565b611484565b34801561072957600080fd5b50610311600d5481565b34801561073f57600080fd5b5061031160135481565b34801561075557600080fd5b50610361610764366004612442565b611492565b34801561077557600080fd5b50610311610784366004612464565b611510565b34801561079557600080fd5b506103616107a43660046123e4565b61156b565b3480156107b557600080fd5b5061031160105481565b3480156107cb57600080fd5b5061031160125481565b3480156107e157600080fd5b506103116107f0366004612536565b6115ee565b34801561080157600080fd5b5061031160195481565b34801561081757600080fd5b5061038461082636600461256f565b611619565b34801561083757600080fd5b50610311610846366004612464565b611684565b34801561085757600080fd5b506103846108663660046123e4565b6116df565b34801561087757600080fd5b50610311600a5481565b34801561088d57600080fd5b5061031160175481565b6060600380546108a69061259b565b80601f01602080910402602001604051908101604052809291908181526020018280546108d29061259b565b801561091f5780601f106108f45761010080835404028352916020019161091f565b820191906000526020600020905b81548152906001019060200180831161090257829003601f168201915b5050505050905090565b600033610937818585611758565b60019150505b92915050565b6016543410156109915760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b60448201526064015b60405180910390fd5b601754333110156109d95760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b34601060008282546109eb91906125eb565b9091555050600f54601754610a0d9133916001600160a01b039091169061187c565b604051806080016040528082815260200160011515815260200142815260200134601584604051610a3e91906125fe565b908152602001604051809103902060030154610a5a91906125eb565b815250601582604051610a6d91906125fe565b90815260405190819003602001902081518190610a8a9082612668565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610aea9083904290612728565b60405180910390a150565b601654341015610b3e5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b6044820152606401610988565b60175433311015610b865760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b3460106000828254610b9891906125eb565b9091555050600f54601754610bba9133916001600160a01b039091169061187c565b604051806080016040528082815260200160011515815260200142815260200134601484604051610beb91906125fe565b908152602001604051809103902060030154610c0791906125eb565b815250601482604051610c1a91906125fe565b90815260405190819003602001902081518190610c379082612668565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610aea9083904290612728565b610c9f611c40565b8315610d29576040518060800160405280868152602001841515815260200183815260200182815250601586604051610cd891906125fe565b90815260405190819003602001902081518190610cf59082612668565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610da9565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d5c91906125fe565b90815260405190819003602001902081518190610d799082612668565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610de095949392919061274a565b60405180910390a15050505050565b610df7611c40565b6014600b5411610e495760405162461bcd60e51b815260206004820152601760248201527f416e7469626f74207374616765207468726565203130250000000000000000006044820152606401610988565b6002600a9081556008600b81905554610e679160ff90911690612865565b610e749062e4e1c0612874565b600c55600854610e889060ff16600a612865565b610e959062e4e1c0612874565b600d55565b610ea2611c40565b600f546001600160a01b0390811690821603610ed05760405162461bcd60e51b815260040161098890612893565b6001600160a01b038116610ef65760405162461bcd60e51b815260040161098890612893565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610aea565b600033610f52858285611c9a565b610f5d85858561187c565b506001949350505050565b610f70611c40565b6023600b5411610fba5760405162461bcd60e51b8152602060048201526015602482015274416e7469626f742073746167652074776f2032342560581b6044820152606401610988565b6002600a9081556016600b55600854610e679160ff90911690612865565b610fe0611c40565b602e600b541161102a5760405162461bcd60e51b8152602060048201526015602482015274416e7469626f74207374616765206f6e652035312560581b6044820152606401610988565b6006600a908155602d600b55600854610e679160ff90911690612865565b6000611052611c40565b606260095461106191906128db565b831061107f5760405162461bcd60e51b8152600401610988906128fd565b606260095461108e91906128db565b82106110ac5760405162461bcd60e51b8152600401610988906128fd565b6008546110bd9060ff16600a612865565b6110c79084612874565b6012556008546110db9060ff16600a612865565b6110e59083612874565b60135550600192915050565b60003361093781858561110483836115ee565b61110e91906125eb565b611758565b600081156111485760158360405161112b91906125fe565b9081526040519081900360200190206001015460ff16905061093d565b60148360405161115891906125fe565b9081526040519081900360200190206001015460ff16905092915050565b805160208183018101805160148252928201919093012091528054819061119c9061259b565b80601f01602080910402602001604051908101604052809291908181526020018280546111c89061259b565b80156112155780601f106111ea57610100808354040283529160200191611215565b820191906000526020600020905b8154815290600101906020018083116111f857829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b6000611241611c40565b662386f26fc1000082116112975760405162461bcd60e51b815260206004820152601b60248201527f4d696e696d756d207472616e73616374696f6e2073697a6520312500000000006044820152606401610988565b50600c81905560015b919050565b6112ad611c40565b6112b76000611d0e565b565b6112c1611c40565b82156112e15781156112d7576018819055611329565b6016819055611329565b811561130a576008546112f89060ff16600a612865565b6113029082612874565b601955611329565b60085461131b9060ff16600a612865565b6113259082612874565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b600061137c611c40565b662386f26fc1000082116113cb5760405162461bcd60e51b81526020600482015260166024820152754d696e696d756d2077616c6c65742073697a6520312560501b6044820152606401610988565b50600d55600190565b6060600480546108a69061259b565b805160208183018101805160158252928201919093012091528054819061119c9061259b565b6000338161141782866115ee565b9050838110156114775760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610988565b610f5d8286868403611758565b60003361093781858561187c565b600061149c611c40565b600a6114a883856125eb565b11156115015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20746f74616c207461782063616e6e6f74206578636565642031604482015261302560f01b6064820152608401610988565b50600a91909155600b55600190565b600081156115415760158360405161152891906125fe565b908152602001604051809103902060030154905061093d565b60148360405161155191906125fe565b908152602001604051809103902060030154905092915050565b6000611575611c40565b600f546001600160a01b03908116908316036115a35760405162461bcd60e51b815260040161098890612893565b6001600160a01b0382166115c95760405162461bcd60e51b815260040161098890612893565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611621611c40565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b600081156116b55760158360405161169c91906125fe565b908152602001604051809103902060020154905061093d565b6014836040516116c591906125fe565b908152602001604051809103902060020154905092915050565b6116e7611c40565b6001600160a01b03811661174c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610988565b61175581611d0e565b50565b6001600160a01b0383166117ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610988565b6001600160a01b03821661181b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610988565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118a25760405162461bcd60e51b815260040161098890612943565b6001600160a01b0382166118c85760405162461bcd60e51b815260040161098890612988565b806118e8846001600160a01b031660009081526020819052604090205490565b10156119065760405162461bcd60e51b8152600401610988906129cb565b601a546001600160a01b038481169116148061192f5750601a546001600160a01b038381169116145b80156119455750601a54600160a01b900460ff16155b15611c3057601a546001600160a01b03848116911614611a325760105430600090815260208190526040812054909161197d91612a11565b9050601254811061199357611993601254611d60565b60135460105410611a30576119a9601354611e07565b601354601060008282546119bd9190612a11565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f19350505050905080611a2e5760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610988565b505b505b6001600160a01b03831660009081526011602052604081205460ff1680611a7157506001600160a01b03831660009081526011602052604090205460ff165b15611a7d575080611c1f565b600c54821115611af55760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e74000000000000006064820152608401610988565b601a546001600160a01b0390811690851603611b9e57600d546001600160a01b038416600090815260208190526040902054611b3190846125eb565b1115611b9e5760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b6064820152608401610988565b60006064600b5484611bb09190612874565b611bba91906128db565b905060006064600a5485611bce9190612874565b611bd891906128db565b9050611be481836125eb565b611bee9085612a11565b92508160106000828254611c0291906125eb565b90915550611c1c90508630611c1784866125eb565b611fe7565b50505b611c2a848483611fe7565b50505050565b611c3b838383611fe7565b505050565b6005546001600160a01b031633146112b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610988565b6000611ca684846115ee565b90506000198114611c2a5781811015611d015760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610988565b611c2a8484848403611758565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611d806002836128db565b90506000611d8e8284612a11565b905047611d9a83611e07565b6000611da68247612a11565b9050611db283826120d3565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611e4f57611e4f612a24565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190612a3a565b81600181518110611f0457611f04612a24565b60200260200101906001600160a01b031690816001600160a01b031681525050611f4f307f000000000000000000000000000000000000000000000000000000000000000084611758565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611fa4908590600090869030904290600401612a57565b600060405180830381600087803b158015611fbe57600080fd5b505af1158015611fd2573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b03831661200d5760405162461bcd60e51b815260040161098890612943565b6001600160a01b0382166120335760405162461bcd60e51b815260040161098890612988565b6001600160a01b0383166000908152602081905260409020548181101561206c5760405162461bcd60e51b8152600401610988906129cb565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b179055612111307f000000000000000000000000000000000000000000000000000000000000000084611758565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af11580156121a0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121c59190612ac8565b5050601a805460ff60a01b19169055505050565b60005b838110156121f45781810151838201526020016121dc565b50506000910152565b600081518084526122158160208601602086016121d9565b601f01601f19169290920160200192915050565b60208152600061223c60208301846121fd565b9392505050565b6001600160a01b038116811461175557600080fd5b6000806040838503121561226b57600080fd5b823561227681612243565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122ab57600080fd5b813567ffffffffffffffff808211156122c6576122c6612284565b604051601f8301601f19908116603f011681019082821181831017156122ee576122ee612284565b8160405283815286602085880101111561230757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561233957600080fd5b813567ffffffffffffffff81111561235057600080fd5b61235c8482850161229a565b949350505050565b803580151581146112a057600080fd5b600080600080600060a0868803121561238c57600080fd5b853567ffffffffffffffff8111156123a357600080fd5b6123af8882890161229a565b9550506123be60208701612364565b93506123cc60408701612364565b94979396509394606081013594506080013592915050565b6000602082840312156123f657600080fd5b813561223c81612243565b60008060006060848603121561241657600080fd5b833561242181612243565b9250602084013561243181612243565b929592945050506040919091013590565b6000806040838503121561245557600080fd5b50508035926020909101359150565b6000806040838503121561247757600080fd5b823567ffffffffffffffff81111561248e57600080fd5b61249a8582860161229a565b9250506124a960208401612364565b90509250929050565b6080815260006124c560808301876121fd565b9415156020830152506040810192909252606090910152919050565b6000602082840312156124f357600080fd5b5035919050565b60008060006060848603121561250f57600080fd5b61251884612364565b925061252660208501612364565b9150604084013590509250925092565b6000806040838503121561254957600080fd5b823561255481612243565b9150602083013561256481612243565b809150509250929050565b6000806040838503121561258257600080fd5b823561258d81612243565b91506124a960208401612364565b600181811c908216806125af57607f821691505b6020821081036125cf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561093d5761093d6125d5565b600082516126108184602087016121d9565b9190910192915050565b601f821115611c3b57600081815260208120601f850160051c810160208610156126415750805b601f850160051c820191505b818110156126605782815560010161264d565b505050505050565b815167ffffffffffffffff81111561268257612682612284565b61269681612690845461259b565b8461261a565b602080601f8311600181146126cb57600084156126b35750858301515b600019600386901b1c1916600185901b178555612660565b600085815260208120601f198616915b828110156126fa578886015182559484019460019091019084016126db565b50858210156127185787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061273b60408301856121fd565b90508260208301529392505050565b60a08152600061275d60a08301886121fd565b95151560208301525092151560408401526060830191909152608090910152919050565b600181815b808511156127bc5781600019048211156127a2576127a26125d5565b808516156127af57918102915b93841c9390800290612786565b509250929050565b6000826127d35750600161093d565b816127e05750600061093d565b81600181146127f657600281146128005761281c565b600191505061093d565b60ff841115612811576128116125d5565b50506001821b61093d565b5060208310610133831016604e8410600b841016171561283f575081810a61093d565b6128498383612781565b806000190482111561285d5761285d6125d5565b029392505050565b600061223c60ff8416836127c4565b600081600019048311821515161561288e5761288e6125d5565b500290565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b6000826128f857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526026908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206174604082015265206f6e63652160d01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561093d5761093d6125d5565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a4c57600080fd5b815161223c81612243565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612aa75784516001600160a01b031683529383019391830191600101612a82565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612add57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122063538b707b69ca34408559d628146699da49e614815246e99798bb27e489495d64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806373c503b311610175578063ad16a0cf116100dc578063dd62ed3e11610095578063f1b2b3d91161006f578063f1b2b3d91461082b578063f2fde38b1461084b578063f345bd851461086b578063fbee93ba1461088157600080fd5b8063dd62ed3e146107d5578063df1d099e146107f5578063df8408fe1461080b57600080fd5b8063ad16a0cf14610733578063af8af69014610749578063b5c78e8a14610769578063bb85c6d114610789578063c0fdea57146107a9578063d12a7688146107bf57600080fd5b80638da5cb5b1161012e5780638da5cb5b1461068a57806395d89b41146106a8578063a2330d97146106bd578063a457c2d7146106dd578063a9059cbb146106fd578063aa4bde281461071d57600080fd5b806373c503b3146105ce57806375f0a874146105ee578063768dc7101461060e5780637930ef691461063e57806381bfdcca146106545780638c0b5e221461067457600080fd5b8063248efac7116102195780634fa74c4d116101d25780634fa74c4d146104fd578063527ffabd1461051d57806363cdf60f14610533578063677daa571461056357806370a0823114610583578063715018a6146105b957600080fd5b8063248efac7146104575780632d5e9d911461046c57806330b63d8014610481578063313ce567146104a157806339509351146104bd57806349bd5a5e146104dd57600080fd5b806316a7b1601161026b57806316a7b160146103ba57806318160ddd146103cd57806318bc47f6146103e25780631939837d146104025780631b56bbf91461041757806323b872dd1461043757600080fd5b806303fd2a45146102be578063054dee0f146102fb57806306fdde031461031f578063095ea7b3146103415780630f1d7ad9146103715780631694505e1461038657600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b50600f546102de906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030757600080fd5b5061031160165481565b6040519081526020016102f2565b34801561032b57600080fd5b50610334610897565b6040516102f29190612229565b34801561034d57600080fd5b5061036161035c366004612258565b610929565b60405190151581526020016102f2565b61038461037f366004612327565b610943565b005b34801561039257600080fd5b506102de7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6103846103c8366004612327565b610af5565b3480156103d957600080fd5b50600254610311565b3480156103ee57600080fd5b506103846103fd366004612374565b610c97565b34801561040e57600080fd5b50610384610def565b34801561042357600080fd5b506103846104323660046123e4565b610e9a565b34801561044357600080fd5b50610361610452366004612401565b610f44565b34801561046357600080fd5b50610384610f68565b34801561047857600080fd5b50610384610fd8565b34801561048d57600080fd5b5061036161049c366004612442565b611048565b3480156104ad57600080fd5b50604051600981526020016102f2565b3480156104c957600080fd5b506103616104d8366004612258565b6110f1565b3480156104e957600080fd5b50601a546102de906001600160a01b031681565b34801561050957600080fd5b50610361610518366004612464565b611113565b34801561052957600080fd5b50610311600b5481565b34801561053f57600080fd5b5061055361054e366004612327565b611176565b6040516102f294939291906124b2565b34801561056f57600080fd5b5061036161057e3660046124e1565b611237565b34801561058f57600080fd5b5061031161059e3660046123e4565b6001600160a01b031660009081526020819052604090205490565b3480156105c557600080fd5b506103846112a5565b3480156105da57600080fd5b506103846105e93660046124fa565b6112b9565b3480156105fa57600080fd5b50600e546102de906001600160a01b031681565b34801561061a57600080fd5b506103616106293660046123e4565b60116020526000908152604090205460ff1681565b34801561064a57600080fd5b5061031160185481565b34801561066057600080fd5b5061036161066f3660046124e1565b611372565b34801561068057600080fd5b50610311600c5481565b34801561069657600080fd5b506005546001600160a01b03166102de565b3480156106b457600080fd5b506103346113d4565b3480156106c957600080fd5b506105536106d8366004612327565b6113e3565b3480156106e957600080fd5b506103616106f8366004612258565b611409565b34801561070957600080fd5b50610361610718366004612258565b611484565b34801561072957600080fd5b50610311600d5481565b34801561073f57600080fd5b5061031160135481565b34801561075557600080fd5b50610361610764366004612442565b611492565b34801561077557600080fd5b50610311610784366004612464565b611510565b34801561079557600080fd5b506103616107a43660046123e4565b61156b565b3480156107b557600080fd5b5061031160105481565b3480156107cb57600080fd5b5061031160125481565b3480156107e157600080fd5b506103116107f0366004612536565b6115ee565b34801561080157600080fd5b5061031160195481565b34801561081757600080fd5b5061038461082636600461256f565b611619565b34801561083757600080fd5b50610311610846366004612464565b611684565b34801561085757600080fd5b506103846108663660046123e4565b6116df565b34801561087757600080fd5b50610311600a5481565b34801561088d57600080fd5b5061031160175481565b6060600380546108a69061259b565b80601f01602080910402602001604051908101604052809291908181526020018280546108d29061259b565b801561091f5780601f106108f45761010080835404028352916020019161091f565b820191906000526020600020905b81548152906001019060200180831161090257829003601f168201915b5050505050905090565b600033610937818585611758565b60019150505b92915050565b6016543410156109915760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b60448201526064015b60405180910390fd5b601754333110156109d95760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b34601060008282546109eb91906125eb565b9091555050600f54601754610a0d9133916001600160a01b039091169061187c565b604051806080016040528082815260200160011515815260200142815260200134601584604051610a3e91906125fe565b908152602001604051809103902060030154610a5a91906125eb565b815250601582604051610a6d91906125fe565b90815260405190819003602001902081518190610a8a9082612668565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610aea9083904290612728565b60405180910390a150565b601654341015610b3e5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b6044820152606401610988565b60175433311015610b865760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b3460106000828254610b9891906125eb565b9091555050600f54601754610bba9133916001600160a01b039091169061187c565b604051806080016040528082815260200160011515815260200142815260200134601484604051610beb91906125fe565b908152602001604051809103902060030154610c0791906125eb565b815250601482604051610c1a91906125fe565b90815260405190819003602001902081518190610c379082612668565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610aea9083904290612728565b610c9f611c40565b8315610d29576040518060800160405280868152602001841515815260200183815260200182815250601586604051610cd891906125fe565b90815260405190819003602001902081518190610cf59082612668565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610da9565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d5c91906125fe565b90815260405190819003602001902081518190610d799082612668565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610de095949392919061274a565b60405180910390a15050505050565b610df7611c40565b6014600b5411610e495760405162461bcd60e51b815260206004820152601760248201527f416e7469626f74207374616765207468726565203130250000000000000000006044820152606401610988565b6002600a9081556008600b81905554610e679160ff90911690612865565b610e749062e4e1c0612874565b600c55600854610e889060ff16600a612865565b610e959062e4e1c0612874565b600d55565b610ea2611c40565b600f546001600160a01b0390811690821603610ed05760405162461bcd60e51b815260040161098890612893565b6001600160a01b038116610ef65760405162461bcd60e51b815260040161098890612893565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610aea565b600033610f52858285611c9a565b610f5d85858561187c565b506001949350505050565b610f70611c40565b6023600b5411610fba5760405162461bcd60e51b8152602060048201526015602482015274416e7469626f742073746167652074776f2032342560581b6044820152606401610988565b6002600a9081556016600b55600854610e679160ff90911690612865565b610fe0611c40565b602e600b541161102a5760405162461bcd60e51b8152602060048201526015602482015274416e7469626f74207374616765206f6e652035312560581b6044820152606401610988565b6006600a908155602d600b55600854610e679160ff90911690612865565b6000611052611c40565b606260095461106191906128db565b831061107f5760405162461bcd60e51b8152600401610988906128fd565b606260095461108e91906128db565b82106110ac5760405162461bcd60e51b8152600401610988906128fd565b6008546110bd9060ff16600a612865565b6110c79084612874565b6012556008546110db9060ff16600a612865565b6110e59083612874565b60135550600192915050565b60003361093781858561110483836115ee565b61110e91906125eb565b611758565b600081156111485760158360405161112b91906125fe565b9081526040519081900360200190206001015460ff16905061093d565b60148360405161115891906125fe565b9081526040519081900360200190206001015460ff16905092915050565b805160208183018101805160148252928201919093012091528054819061119c9061259b565b80601f01602080910402602001604051908101604052809291908181526020018280546111c89061259b565b80156112155780601f106111ea57610100808354040283529160200191611215565b820191906000526020600020905b8154815290600101906020018083116111f857829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b6000611241611c40565b662386f26fc1000082116112975760405162461bcd60e51b815260206004820152601b60248201527f4d696e696d756d207472616e73616374696f6e2073697a6520312500000000006044820152606401610988565b50600c81905560015b919050565b6112ad611c40565b6112b76000611d0e565b565b6112c1611c40565b82156112e15781156112d7576018819055611329565b6016819055611329565b811561130a576008546112f89060ff16600a612865565b6113029082612874565b601955611329565b60085461131b9060ff16600a612865565b6113259082612874565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b600061137c611c40565b662386f26fc1000082116113cb5760405162461bcd60e51b81526020600482015260166024820152754d696e696d756d2077616c6c65742073697a6520312560501b6044820152606401610988565b50600d55600190565b6060600480546108a69061259b565b805160208183018101805160158252928201919093012091528054819061119c9061259b565b6000338161141782866115ee565b9050838110156114775760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610988565b610f5d8286868403611758565b60003361093781858561187c565b600061149c611c40565b600a6114a883856125eb565b11156115015760405162461bcd60e51b815260206004820152602260248201527f45524332303a20746f74616c207461782063616e6e6f74206578636565642031604482015261302560f01b6064820152608401610988565b50600a91909155600b55600190565b600081156115415760158360405161152891906125fe565b908152602001604051809103902060030154905061093d565b60148360405161155191906125fe565b908152602001604051809103902060030154905092915050565b6000611575611c40565b600f546001600160a01b03908116908316036115a35760405162461bcd60e51b815260040161098890612893565b6001600160a01b0382166115c95760405162461bcd60e51b815260040161098890612893565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611621611c40565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b600081156116b55760158360405161169c91906125fe565b908152602001604051809103902060020154905061093d565b6014836040516116c591906125fe565b908152602001604051809103902060020154905092915050565b6116e7611c40565b6001600160a01b03811661174c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610988565b61175581611d0e565b50565b6001600160a01b0383166117ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610988565b6001600160a01b03821661181b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610988565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118a25760405162461bcd60e51b815260040161098890612943565b6001600160a01b0382166118c85760405162461bcd60e51b815260040161098890612988565b806118e8846001600160a01b031660009081526020819052604090205490565b10156119065760405162461bcd60e51b8152600401610988906129cb565b601a546001600160a01b038481169116148061192f5750601a546001600160a01b038381169116145b80156119455750601a54600160a01b900460ff16155b15611c3057601a546001600160a01b03848116911614611a325760105430600090815260208190526040812054909161197d91612a11565b9050601254811061199357611993601254611d60565b60135460105410611a30576119a9601354611e07565b601354601060008282546119bd9190612a11565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f19350505050905080611a2e5760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610988565b505b505b6001600160a01b03831660009081526011602052604081205460ff1680611a7157506001600160a01b03831660009081526011602052604090205460ff165b15611a7d575080611c1f565b600c54821115611af55760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e74000000000000006064820152608401610988565b601a546001600160a01b0390811690851603611b9e57600d546001600160a01b038416600090815260208190526040902054611b3190846125eb565b1115611b9e5760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b6064820152608401610988565b60006064600b5484611bb09190612874565b611bba91906128db565b905060006064600a5485611bce9190612874565b611bd891906128db565b9050611be481836125eb565b611bee9085612a11565b92508160106000828254611c0291906125eb565b90915550611c1c90508630611c1784866125eb565b611fe7565b50505b611c2a848483611fe7565b50505050565b611c3b838383611fe7565b505050565b6005546001600160a01b031633146112b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610988565b6000611ca684846115ee565b90506000198114611c2a5781811015611d015760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610988565b611c2a8484848403611758565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611d806002836128db565b90506000611d8e8284612a11565b905047611d9a83611e07565b6000611da68247612a11565b9050611db283826120d3565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611e4f57611e4f612a24565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190612a3a565b81600181518110611f0457611f04612a24565b60200260200101906001600160a01b031690816001600160a01b031681525050611f4f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611758565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611fa4908590600090869030904290600401612a57565b600060405180830381600087803b158015611fbe57600080fd5b505af1158015611fd2573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b03831661200d5760405162461bcd60e51b815260040161098890612943565b6001600160a01b0382166120335760405162461bcd60e51b815260040161098890612988565b6001600160a01b0383166000908152602081905260409020548181101561206c5760405162461bcd60e51b8152600401610988906129cb565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b179055612111307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611758565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af11580156121a0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121c59190612ac8565b5050601a805460ff60a01b19169055505050565b60005b838110156121f45781810151838201526020016121dc565b50506000910152565b600081518084526122158160208601602086016121d9565b601f01601f19169290920160200192915050565b60208152600061223c60208301846121fd565b9392505050565b6001600160a01b038116811461175557600080fd5b6000806040838503121561226b57600080fd5b823561227681612243565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122ab57600080fd5b813567ffffffffffffffff808211156122c6576122c6612284565b604051601f8301601f19908116603f011681019082821181831017156122ee576122ee612284565b8160405283815286602085880101111561230757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561233957600080fd5b813567ffffffffffffffff81111561235057600080fd5b61235c8482850161229a565b949350505050565b803580151581146112a057600080fd5b600080600080600060a0868803121561238c57600080fd5b853567ffffffffffffffff8111156123a357600080fd5b6123af8882890161229a565b9550506123be60208701612364565b93506123cc60408701612364565b94979396509394606081013594506080013592915050565b6000602082840312156123f657600080fd5b813561223c81612243565b60008060006060848603121561241657600080fd5b833561242181612243565b9250602084013561243181612243565b929592945050506040919091013590565b6000806040838503121561245557600080fd5b50508035926020909101359150565b6000806040838503121561247757600080fd5b823567ffffffffffffffff81111561248e57600080fd5b61249a8582860161229a565b9250506124a960208401612364565b90509250929050565b6080815260006124c560808301876121fd565b9415156020830152506040810192909252606090910152919050565b6000602082840312156124f357600080fd5b5035919050565b60008060006060848603121561250f57600080fd5b61251884612364565b925061252660208501612364565b9150604084013590509250925092565b6000806040838503121561254957600080fd5b823561255481612243565b9150602083013561256481612243565b809150509250929050565b6000806040838503121561258257600080fd5b823561258d81612243565b91506124a960208401612364565b600181811c908216806125af57607f821691505b6020821081036125cf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561093d5761093d6125d5565b600082516126108184602087016121d9565b9190910192915050565b601f821115611c3b57600081815260208120601f850160051c810160208610156126415750805b601f850160051c820191505b818110156126605782815560010161264d565b505050505050565b815167ffffffffffffffff81111561268257612682612284565b61269681612690845461259b565b8461261a565b602080601f8311600181146126cb57600084156126b35750858301515b600019600386901b1c1916600185901b178555612660565b600085815260208120601f198616915b828110156126fa578886015182559484019460019091019084016126db565b50858210156127185787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061273b60408301856121fd565b90508260208301529392505050565b60a08152600061275d60a08301886121fd565b95151560208301525092151560408401526060830191909152608090910152919050565b600181815b808511156127bc5781600019048211156127a2576127a26125d5565b808516156127af57918102915b93841c9390800290612786565b509250929050565b6000826127d35750600161093d565b816127e05750600061093d565b81600181146127f657600281146128005761281c565b600191505061093d565b60ff841115612811576128116125d5565b50506001821b61093d565b5060208310610133831016604e8410600b841016171561283f575081810a61093d565b6128498383612781565b806000190482111561285d5761285d6125d5565b029392505050565b600061223c60ff8416836127c4565b600081600019048311821515161561288e5761288e6125d5565b500290565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b6000826128f857634e487b7160e01b600052601260045260246000fd5b500490565b60208082526026908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206174604082015265206f6e63652160d01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561093d5761093d6125d5565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a4c57600080fd5b815161223c81612243565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612aa75784516001600160a01b031683529383019391830191600101612a82565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612add57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122063538b707b69ca34408559d628146699da49e614815246e99798bb27e489495d64736f6c63430008100033

Deployed Bytecode Sourcemap

28171:14097:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28772:64;;;;;;;;;;-1:-1:-1;28772:64:0;;;;-1:-1:-1;;;;;28772:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;28772:64:0;;;;;;;;30601:36;;;;;;;;;;;;;;;;;;;368:25:1;;;356:2;341:18;30601:36:0;222:177:1;17889:102:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20163:244::-;;;;;;;;;;-1:-1:-1;20163:244:0;;;;;:::i;:::-;;:::i;:::-;;;1781:14:1;;1774:22;1756:41;;1744:2;1729:18;20163:244:0;1616:187:1;31869:594:0;;;;;;:::i;:::-;;:::i;:::-;;34575:51;;;;;;;;;;;;;;;31285:576;;;;;;:::i;:::-;;:::i;19027:110::-;;;;;;;;;;-1:-1:-1;19117:12:0;;19027:110;;33323:694;;;;;;;;;;-1:-1:-1;33323:694:0;;;;;:::i;:::-;;:::i;29818:289::-;;;;;;;;;;;;;:::i;35840:288::-;;;;;;;;;;-1:-1:-1;35840:288:0;;;;;:::i;:::-;;:::i;20987:297::-;;;;;;;;;;-1:-1:-1;20987:297:0;;;;;:::i;:::-;;:::i;29506:302::-;;;;;;;;;;;;;:::i;29203:293::-;;;;;;;;;;;;;:::i;41093:574::-;;;;;;;;;;-1:-1:-1;41093:574:0;;;;;:::i;:::-;;:::i;18870:92::-;;;;;;;;;;-1:-1:-1;18870:92:0;;18953:1;5099:36:1;;5087:2;5072:18;18870:92:0;4957:184:1;22703:272:0;;;;;;;;;;-1:-1:-1;22703:272:0;;;;;:::i;:::-;;:::i;34633:28::-;;;;;;;;;;-1:-1:-1;34633:28:0;;;;-1:-1:-1;;;;;34633:28:0;;;32490:254;;;;;;;;;;-1:-1:-1;32490:254:0;;;;;:::i;:::-;;:::i;28510:35::-;;;;;;;;;;;;;;;;30479:50;;;;;;;;;;-1:-1:-1;30479:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;41675:265::-;;;;;;;;;;-1:-1:-1;41675:265:0;;;;;:::i;:::-;;:::i;18054:177::-;;;;;;;;;;-1:-1:-1;18054:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;18205:18:0;18173:7;18205:18;;;;;;;;;;;;18054:177;15148:103;;;;;;;;;;;;;:::i;34025:524::-;;;;;;;;;;-1:-1:-1;34025:524:0;;;;;:::i;:::-;;:::i;28690:75::-;;;;;;;;;;-1:-1:-1;28690:75:0;;;;-1:-1:-1;;;;;28690:75:0;;;28887:50;;;;;;;;;;-1:-1:-1;28887:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30703:38;;;;;;;;;;;;;;;;41948:280;;;;;;;;;;-1:-1:-1;41948:280:0;;;;;:::i;:::-;;:::i;28566:53::-;;;;;;;;;;;;;;;;14500:87;;;;;;;;;;-1:-1:-1;14573:6:0;;-1:-1:-1;;;;;14573:6:0;14500:87;;17713:106;;;;;;;;;;;;;:::i;30536:56::-;;;;;;;;;;-1:-1:-1;30536:56:0;;;;;:::i;:::-;;:::i;21787:507::-;;;;;;;;;;-1:-1:-1;21787:507:0;;;;;:::i;:::-;;:::i;19607:236::-;;;;;;;;;;-1:-1:-1;19607:236:0;;;;;:::i;:::-;;:::i;28626:57::-;;;;;;;;;;;;;;;;29022:64;;;;;;;;;;;;;;;;40705:380;;;;;;;;;;-1:-1:-1;40705:380:0;;;;;:::i;:::-;;:::i;32752:262::-;;;;;;;;;;-1:-1:-1;32752:262:0;;;;;:::i;:::-;;:::i;40347:350::-;;;;;;;;;;-1:-1:-1;40347:350:0;;;;;:::i;:::-;;:::i;28843:37::-;;;;;;;;;;;;;;;;28946:69;;;;;;;;;;;;;;;;19200:201;;;;;;;;;;-1:-1:-1;19200:201:0;;;;;:::i;:::-;;:::i;30748:54::-;;;;;;;;;;;;;;;;38758:189;;;;;;;;;;-1:-1:-1;38758:189:0;;;;;:::i;:::-;;:::i;33022:262::-;;;;;;;;;;-1:-1:-1;33022:262:0;;;;;:::i;:::-;;:::i;15406:238::-;;;;;;;;;;-1:-1:-1;15406:238:0;;;;;:::i;:::-;;:::i;28454:35::-;;;;;;;;;;;;;;;;30644:50;;;;;;;;;;;;;;;;17889:102;17945:13;17978:5;17971:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17889:102;:::o;20163:244::-;20284:4;13373:10;20345:32;13373:10;20361:7;20370:6;20345:8;:32::i;:::-;20395:4;20388:11;;;20163:244;;;;;:::o;31869:594::-;31967:11;;31954:9;:24;;31946:57;;;;-1:-1:-1;;;31946:57:0;;7797:2:1;31946:57:0;;;7779:21:1;7836:2;7816:18;;;7809:30;-1:-1:-1;;;7855:18:1;;;7848:50;7915:18;;31946:57:0;;;;;;;;;32044:14;;32022:10;:18;:36;;32014:67;;;;-1:-1:-1;;;32014:67:0;;8146:2:1;32014:67:0;;;8128:21:1;8185:2;8165:18;;;8158:30;-1:-1:-1;;;8204:18:1;;;8197:48;8262:18;;32014:67:0;7944:342:1;32014:67:0;32114:9;32092:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;32156:4:0;;32162:14;;32134:43;;32144:10;;-1:-1:-1;;;;;32156:4:0;;;;32134:9;:43::i;:::-;32229:166;;;;;;;;32257:10;32229:166;;;;32282:4;32229:166;;;;;;32301:15;32229:166;;;;32375:9;32331:16;32348:10;32331:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;:53;;;;:::i;:::-;32229:166;;;32198:16;32215:10;32198:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:197;;:28;;:197;;:28;:197;:::i;:::-;-1:-1:-1;32198:197:0;;;;;;;;;-1:-1:-1;;32198:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32411:44;;;;;32427:10;;32439:15;;32411:44;:::i;:::-;;;;;;;;31869:594;:::o;31285:576::-;31381:11;;31368:9;:24;;31360:57;;;;-1:-1:-1;;;31360:57:0;;7797:2:1;31360:57:0;;;7779:21:1;7836:2;7816:18;;;7809:30;-1:-1:-1;;;7855:18:1;;;7848:50;7915:18;;31360:57:0;7595:344:1;31360:57:0;31458:14;;31436:10;:18;:36;;31428:67;;;;-1:-1:-1;;;31428:67:0;;8146:2:1;31428:67:0;;;8128:21:1;8185:2;8165:18;;;8158:30;-1:-1:-1;;;8204:18:1;;;8197:48;8262:18;;31428:67:0;7944:342:1;31428:67:0;31528:9;31506:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;31570:4:0;;31576:14;;31548:43;;31558:10;;-1:-1:-1;;;;;31570:4:0;;;;31548:9;:43::i;:::-;31633:162;;;;;;;;31658:11;31633:162;;;;31684:4;31633:162;;;;;;31703:15;31633:162;;;;31775:9;31733:13;31747:11;31733:26;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;:51;;;;:::i;:::-;31633:162;;;31604:13;31618:11;31604:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:191;;:26;;:191;;:26;:191;:::i;:::-;-1:-1:-1;31604:191:0;;;;;;;;;-1:-1:-1;;31604:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31811:42;;;;;31824:11;;31837:15;;31811:42;:::i;33323:694::-;14386:13;:11;:13::i;:::-;33489:10:::1;33485:430;;;33549:147;;;;;;;;33581:12;33549:147;;;;33612:11;33549:147;;;;;;33642:12;33549:147;;;;33673:8;33549:147;;::::0;33516:16:::1;33533:12;33516:30;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:180;;:30;;:180:::1;::::0;:30;:180:::1;:::i;:::-;-1:-1:-1::0;33516:180:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;33516:180:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;33485:430:::1;;;33759:144;;;;;;;;33788:12;33759:144;;;;33819:11;33759:144;;;;;;33849:12;33759:144;;;;33880:8;33759:144;;::::0;33729:13:::1;33743:12;33729:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:174;;:27;;:174:::1;::::0;:27;:174:::1;:::i;:::-;-1:-1:-1::0;33729:174:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;33729:174:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;33485:430:::1;33930:79;33947:12;33961:10;33973:11;33986:12;34000:8;33930:79;;;;;;;;;;:::i;:::-;;;;;;;;33323:694:::0;;;;;:::o;29818:289::-;14386:13;:11;:13::i;:::-;29894:2:::1;29876:15;;:20;29868:56;;;::::0;-1:-1:-1;;;29868:56:0;;12081:2:1;29868:56:0::1;::::0;::::1;12063:21:1::0;12120:2;12100:18;;;12093:30;12159:25;12139:18;;;12132:53;12202:18;;29868:56:0::1;11879:347:1::0;29868:56:0::1;29966:1;29948:15;:19:::0;;;29996:1:::1;29978:15;:19:::0;;;30037:9;30033:13:::1;::::0;30037:9:::1;::::0;;::::1;::::0;30033:13:::1;:::i;:::-;30022:24;::::0;:8:::1;:24;:::i;:::-;30008:11;:38:::0;30090:9:::1;::::0;30086:13:::1;::::0;30090:9:::1;;30086:2;:13;:::i;:::-;30075:24;::::0;:8:::1;:24;:::i;:::-;30057:15;:42:::0;29818:289::o;35840:288::-;14386:13;:11;:13::i;:::-;35922:4:::1;::::0;-1:-1:-1;;;;;35922:4:0;;::::1;35913:13:::0;;::::1;::::0;35905:66:::1;;;;-1:-1:-1::0;;;35905:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35990:19:0;::::1;35982:72;;;;-1:-1:-1::0;;;35982:72:0::1;;;;;;;:::i;:::-;36065:13;:21:::0;;-1:-1:-1;;;;;;36065:21:0::1;-1:-1:-1::0;;;;;36065:21:0;::::1;::::0;;::::1;::::0;;;36102:18:::1;::::0;160:51:1;;;36102:18:0::1;::::0;148:2:1;133:18;36102::0::1;14:203:1::0;20987:297:0;21120:4;13373:10;21178:38;21194:4;13373:10;21209:6;21178:15;:38::i;:::-;21227:27;21237:4;21243:2;21247:6;21227:9;:27::i;:::-;-1:-1:-1;21272:4:0;;20987:297;-1:-1:-1;;;;20987:297:0:o;29506:302::-;14386:13;:11;:13::i;:::-;29582:2:::1;29564:15;;:20;29556:54;;;::::0;-1:-1:-1;;;29556:54:0;;14398:2:1;29556:54:0::1;::::0;::::1;14380:21:1::0;14437:2;14417:18;;;14410:30;-1:-1:-1;;;14456:18:1;;;14449:51;14517:18;;29556:54:0::1;14196:345:1::0;29556:54:0::1;29666:1;29648:15;:19:::0;;;29696:2:::1;29678:15;:20:::0;29738:9:::1;::::0;29734:13:::1;::::0;29738:9:::1;::::0;;::::1;::::0;29734:13:::1;:::i;29203:293::-:0;14386:13;:11;:13::i;:::-;29278:2:::1;29260:15;;:20;29252:54;;;::::0;-1:-1:-1;;;29252:54:0;;14748:2:1;29252:54:0::1;::::0;::::1;14730:21:1::0;14787:2;14767:18;;;14760:30;-1:-1:-1;;;14806:18:1;;;14799:51;14867:18;;29252:54:0::1;14546:345:1::0;29252:54:0::1;29354:1;29336:15;:19:::0;;;29384:2:::1;29366:15;:20:::0;29426:9:::1;::::0;29422:13:::1;::::0;29426:9:::1;::::0;;::::1;::::0;29422:13:::1;:::i;41093:574::-:0;41250:4;14386:13;:11;:13::i;:::-;41323:2:::1;41313:7;;:12;;;;:::i;:::-;41280:30;:45;41272:96;;;;-1:-1:-1::0;;;41272:96:0::1;;;;;;;:::i;:::-;41424:2;41414:7;;:12;;;;:::i;:::-;41387:24;:39;41379:90;;;;-1:-1:-1::0;;;41379:90:0::1;;;;;;;:::i;:::-;41549:9;::::0;41545:13:::1;::::0;41549:9:::1;;41545:2;:13;:::i;:::-;41512:46;::::0;:30;:46:::1;:::i;:::-;41480:29;:78:::0;41626:9:::1;::::0;41622:13:::1;::::0;41626:9:::1;;41622:2;:13;:::i;:::-;41595:40;::::0;:24;:40:::1;:::i;:::-;41569:23;:66:::0;-1:-1:-1;41655:4:0::1;41093:574:::0;;;;:::o;22703:272::-;22820:4;13373:10;22881:64;13373:10;22897:7;22934:10;22906:25;13373:10;22897:7;22906:9;:25::i;:::-;:38;;;;:::i;:::-;22881:8;:64::i;32490:254::-;32577:4;32598:10;32594:89;;;32632:16;32649:12;32632:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;-1:-1:-1;32625:46:0;;32594:89;32700:13;32714:12;32700:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;;;;-1:-1:-1;32490:254:0;;;;:::o;30479:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;30479:50:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30479:50:0;:::o;41675:265::-;41777:4;14386:13;:11;:13::i;:::-;41822:17:::1;41807:12;:32;41799:72;;;::::0;-1:-1:-1;;;41799:72:0;;15727:2:1;41799:72:0::1;::::0;::::1;15709:21:1::0;15766:2;15746:18;;;15739:30;15805:29;15785:18;;;15778:57;15852:18;;41799:72:0::1;15525:351:1::0;41799:72:0::1;-1:-1:-1::0;41882:11:0::1;:26:::0;;;41928:4:::1;14410:1;41675:265:::0;;;:::o;15148:103::-;14386:13;:11;:13::i;:::-;15213:30:::1;15240:1;15213:18;:30::i;:::-;15148:103::o:0;34025:524::-;14386:13;:11;:13::i;:::-;34118:6:::1;34114:374;;;34145:10;34141:133;;;34176:14;:22:::0;;;34114:374:::1;;34141:133;34239:11;:19:::0;;;34114:374:::1;;;34310:10;34306:171;;;34373:9;::::0;34369:13:::1;::::0;34373:9:::1;;34369:2;:13;:::i;:::-;34361:21;::::0;:5;:21:::1;:::i;:::-;34341:17;:41:::0;34306:171:::1;;;34452:9;::::0;34448:13:::1;::::0;34452:9:::1;;34448:2;:13;:::i;:::-;34440:21;::::0;:5;:21:::1;:::i;:::-;34423:14;:38:::0;34306:171:::1;34503:38;::::0;;16096:14:1;;16089:22;16071:41;;16155:14;;16148:22;16143:2;16128:18;;16121:50;16187:18;;;16180:34;;;34503:38:0::1;::::0;16059:2:1;16044:18;34503:38:0::1;;;;;;;34025:524:::0;;;:::o;41948:280::-;42058:4;14386:13;:11;:13::i;:::-;42107:17:::1;42088:16;:36;42080:71;;;::::0;-1:-1:-1;;;42080:71:0;;16427:2:1;42080:71:0::1;::::0;::::1;16409:21:1::0;16466:2;16446:18;;;16439:30;-1:-1:-1;;;16485:18:1;;;16478:52;16547:18;;42080:71:0::1;16225:346:1::0;42080:71:0::1;-1:-1:-1::0;42162:15:0::1;:34:::0;42216:4:::1;::::0;41948:280::o;17713:106::-;17771:13;17804:7;17797:14;;;;;:::i;30536:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21787:507::-;21909:4;13373:10;21909:4;21997:25;13373:10;22014:7;21997:9;:25::i;:::-;21970:52;;22075:15;22055:16;:35;;22033:122;;;;-1:-1:-1;;;22033:122:0;;16778:2:1;22033:122:0;;;16760:21:1;16817:2;16797:18;;;16790:30;16856:34;16836:18;;;16829:62;-1:-1:-1;;;16907:18:1;;;16900:35;16952:19;;22033:122:0;16576:401:1;22033:122:0;22191:60;22200:5;22207:7;22235:15;22216:16;:34;22191:8;:60::i;19607:236::-;19724:4;13373:10;19785:28;13373:10;19802:2;19806:6;19785:9;:28::i;40705:380::-;40853:4;14386:13;:11;:13::i;:::-;40922:2:::1;40884:33;40901:16:::0;40884;:33:::1;:::i;:::-;40883:41;;40875:88;;;::::0;-1:-1:-1;;;40875:88:0;;17184:2:1;40875:88:0::1;::::0;::::1;17166:21:1::0;17223:2;17203:18;;;17196:30;17262:34;17242:18;;;17235:62;-1:-1:-1;;;17313:18:1;;;17306:32;17355:19;;40875:88:0::1;16982:398:1::0;40875:88:0::1;-1:-1:-1::0;40974:15:0::1;:34:::0;;;;41019:15:::1;:34:::0;41073:4:::1;::::0;40705:380::o;32752:262::-;32839:4;32860:10;32856:93;;;32894:16;32911:12;32894:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;32887:50;;;;32856:93;32966:13;32980:12;32966:27;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;32959:47;;32752:262;;;;:::o;40347:350::-;40450:4;14386:13;:11;:13::i;:::-;40493:4:::1;::::0;-1:-1:-1;;;;;40493:4:0;;::::1;40480:17:::0;;::::1;::::0;40472:70:::1;;;;-1:-1:-1::0;;;40472:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40561:23:0;::::1;40553:76;;;;-1:-1:-1::0;;;40553:76:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;40640:15:0::1;:27:::0;;-1:-1:-1;;;;;40640:27:0;::::1;-1:-1:-1::0;;;;;;40640:27:0;;::::1;;::::0;;;40347:350;;;:::o;19200:201::-;-1:-1:-1;;;;;19366:18:0;;;19334:7;19366:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19200:201::o;38758:189::-;14386:13;:11;:13::i;:::-;-1:-1:-1;;;;;38844:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;;:38;;-1:-1:-1;;38844:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38898:41;;17553:51:1;;;17620:18;;;17613:50;38898:41:0::1;::::0;17526:18:1;38898:41:0::1;;;;;;;38758:189:::0;;:::o;33022:262::-;33113:4;33134:10;33130:91;;;33168:16;33185:12;33168:30;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;33161:48;;;;33130:91;33238:13;33252:12;33238:27;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;;33231:45;;33022:262;;;;:::o;15406:238::-;14386:13;:11;:13::i;:::-;-1:-1:-1;;;;;15509:22:0;::::1;15487:110;;;::::0;-1:-1:-1;;;15487:110:0;;17876:2:1;15487:110:0::1;::::0;::::1;17858:21:1::0;17915:2;17895:18;;;17888:30;17954:34;17934:18;;;17927:62;-1:-1:-1;;;18005:18:1;;;17998:36;18051:19;;15487:110:0::1;17674:402:1::0;15487:110:0::1;15608:28;15627:8;15608:18;:28::i;:::-;15406:238:::0;:::o;25010:380::-;-1:-1:-1;;;;;25146:19:0;;25138:68;;;;-1:-1:-1;;;25138:68:0;;18283:2:1;25138:68:0;;;18265:21:1;18322:2;18302:18;;;18295:30;18361:34;18341:18;;;18334:62;-1:-1:-1;;;18412:18:1;;;18405:34;18456:19;;25138:68:0;18081:400:1;25138:68:0;-1:-1:-1;;;;;25225:21:0;;25217:68;;;;-1:-1:-1;;;25217:68:0;;18688:2:1;25217:68:0;;;18670:21:1;18727:2;18707:18;;;18700:30;18766:34;18746:18;;;18739:62;-1:-1:-1;;;18817:18:1;;;18810:32;18859:19;;25217:68:0;18486:398:1;25217:68:0;-1:-1:-1;;;;;25298:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25350:32;;368:25:1;;;25350:32:0;;341:18:1;25350:32:0;;;;;;;25010:380;;;:::o;36606:2144::-;-1:-1:-1;;;;;36704:18:0;;36696:68;;;;-1:-1:-1;;;36696:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36783:16:0;;36775:64;;;;-1:-1:-1;;;36775:64:0;;;;;;;:::i;:::-;36877:6;36858:15;36868:4;-1:-1:-1;;;;;18205:18:0;18173:7;18205:18;;;;;;;;;;;;18054:177;36858:15;:25;;36850:76;;;;-1:-1:-1;;;36850:76:0;;;;;;;:::i;:::-;36952:13;;-1:-1:-1;;;;;36944:21:0;;;36952:13;;36944:21;;:44;;-1:-1:-1;36975:13:0;;-1:-1:-1;;;;;36969:19:0;;;36975:13;;36969:19;36944:44;36943:67;;;;-1:-1:-1;36994:16:0;;-1:-1:-1;;;36994:16:0;;;;36993:17;36943:67;36939:1804;;;37039:13;;-1:-1:-1;;;;;37031:21:0;;;37039:13;;37031:21;37027:681;;37135:18;;37126:4;37073:32;18205:18;;;;;;;;;;;37073:32;;37108:45;;;:::i;:::-;37073:80;;37204:29;;37176:24;:57;37172:152;;37258:46;37274:29;;37258:15;:46::i;:::-;37370:23;;37347:18;;37346:47;37342:351;;37418:42;37436:23;;37418:17;:42::i;:::-;37505:23;;37483:18;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;37571:15:0;;37563:52;;37551:9;;-1:-1:-1;;;;;37571:15:0;;37593:21;37563:52;;;;;37551:9;37563:52;37551:9;37563:52;37593:21;37571:15;37563:52;;;;;;;37551:64;;37646:4;37638:35;;;;-1:-1:-1;;;37638:35:0;;20441:2:1;37638:35:0;;;20423:21:1;20480:2;20460:18;;;20453:30;-1:-1:-1;;;20499:18:1;;;20492:48;20557:18;;37638:35:0;20239:342:1;37638:35:0;37395:298;37342:351;37054:654;37027:681;-1:-1:-1;;;;;37765:24:0;;37724:22;37765:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;37793:22:0;;;;;;:18;:22;;;;;;;;37765:50;37761:839;;;-1:-1:-1;37853:6:0;37761:839;;;37932:11;;37922:6;:21;;37914:91;;;;-1:-1:-1;;;37914:91:0;;20788:2:1;37914:91:0;;;20770:21:1;20827:2;20807:18;;;20800:30;20866:34;20846:18;;;20839:62;20937:27;20917:18;;;20910:55;20982:19;;37914:91:0;20586:421:1;37914:91:0;38035:13;;-1:-1:-1;;;;;38035:13:0;;;38027:21;;;;38024:178;;38108:15;;-1:-1:-1;;;;;18205:18:0;;18173:7;18205:18;;;;;;;;;;;38081:22;;:6;:22;:::i;:::-;38080:43;;38072:110;;;;-1:-1:-1;;;38072:110:0;;21214:2:1;38072:110:0;;;21196:21:1;21253:2;21233:18;;;21226:30;21292:34;21272:18;;;21265:62;-1:-1:-1;;;21343:18:1;;;21336:52;21405:19;;38072:110:0;21012:418:1;38072:110:0;38222:22;38277:3;38258:15;;38249:6;:24;;;;:::i;:::-;38248:32;;;;:::i;:::-;38222:59;;38300:22;38355:3;38336:15;;38327:6;:24;;;;:::i;:::-;38326:32;;;;:::i;:::-;38300:59;-1:-1:-1;38405:31:0;38300:59;38405:14;:31;:::i;:::-;38395:42;;:6;:42;:::i;:::-;38378:59;;38478:14;38456:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;38513:71:0;;-1:-1:-1;38529:4:0;38543;38551:31;38568:14;38551;:31;:::i;:::-;38513:15;:71::i;:::-;37895:705;;37761:839;38614:41;38630:4;38636:2;38640:14;38614:15;:41::i;:::-;37012:1655;36606:2144;;;:::o;36939:1804::-;38698:33;38714:4;38720:2;38724:6;38698:15;:33::i;:::-;36606:2144;;;:::o;14665:132::-;14573:6;;-1:-1:-1;;;;;14573:6:0;13373:10;14729:23;14721:68;;;;-1:-1:-1;;;14721:68:0;;21637:2:1;14721:68:0;;;21619:21:1;;;21656:18;;;21649:30;21715:34;21695:18;;;21688:62;21767:18;;14721:68:0;21435:356:1;25681:502:0;25816:24;25843:25;25853:5;25860:7;25843:9;:25::i;:::-;25816:52;;-1:-1:-1;;25883:16:0;:37;25879:297;;25983:6;25963:16;:26;;25937:117;;;;-1:-1:-1;;;25937:117:0;;21998:2:1;25937:117:0;;;21980:21:1;22037:2;22017:18;;;22010:30;22076:31;22056:18;;;22049:59;22125:18;;25937:117:0;21796:353:1;25937:117:0;26098:51;26107:5;26114:7;26142:6;26123:16;:25;26098:8;:51::i;15804:191::-;15897:6;;;-1:-1:-1;;;;;15914:17:0;;;-1:-1:-1;;;;;;15914:17:0;;;;;;;15947:40;;15897:6;;;15914:17;15897:6;;15947:40;;15878:16;;15947:40;15867:128;15804:191;:::o;38955:474::-;34873:16;:23;;-1:-1:-1;;;;34873:23:0;-1:-1:-1;;;34873:23:0;;;;39057:24:::1;39080:1;39057:20:::0;:24:::1;:::i;:::-;39041:41:::0;-1:-1:-1;39093:17:0::1;39114:27;39041:41:::0;39114:20;:27:::1;:::i;:::-;39093:49:::0;-1:-1:-1;39180:21:0::1;39214:23;39232:4:::0;39214:17:::1;:23::i;:::-;39250:18;39272:38;39296:14:::0;39272:21:::1;:38;:::i;:::-;39250:61;;39324:36;39338:9;39349:10;39324:13;:36::i;:::-;39378:43;::::0;;22356:25:1;;;22412:2;22397:18;;22390:34;;;22440:18;;;22433:34;;;39378:43:0::1;::::0;22344:2:1;22329:18;39378:43:0::1;;;;;;;-1:-1:-1::0;;34919:16:0;:24;;-1:-1:-1;;;;34919:24:0;;;-1:-1:-1;;;38955:474:0:o;39437:488::-;34873:16;:23;;-1:-1:-1;;;;34873:23:0;-1:-1:-1;;;34873:23:0;;;39540:16:::1;::::0;;39554:1:::1;39540:16:::0;;;;;::::1;::::0;;-1:-1:-1;;39540:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;39540:16:0::1;39516:40;;39585:4;39567;39572:1;39567:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;39567:23:0::1;;;-1:-1:-1::0;;;;;39567:23:0::1;;;::::0;::::1;39611:15;-1:-1:-1::0;;;;;39611:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39601:4;39606:1;39601:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;39601:32:0::1;;;-1:-1:-1::0;;;;;39601:32:0::1;;;::::0;::::1;39646:62;39663:4;39678:15;39696:11;39646:8;:62::i;:::-;39721:196;::::0;-1:-1:-1;;;39721:196:0;;-1:-1:-1;;;;;39721:15:0::1;:66;::::0;::::1;::::0;:196:::1;::::0;39802:11;;39828:1:::1;::::0;39844:4;;39871::::1;::::0;39891:15:::1;::::0;39721:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34919:16:0;:24;;-1:-1:-1;;;;34919:24:0;;;-1:-1:-1;;;;39437:488:0:o;26191:776::-;-1:-1:-1;;;;;26322:18:0;;26314:68;;;;-1:-1:-1;;;26314:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26401:16:0;;26393:64;;;;-1:-1:-1;;;26393:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26492:15:0;;26470:19;26492:15;;;;;;;;;;;26540:21;;;;26518:109;;;;-1:-1:-1;;;26518:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26663:15:0;;;:9;:15;;;;;;;;;;;26681:20;;;26663:38;;26881:13;;;;;;;;;;:23;;;;;;26933:26;;368:25:1;;;26881:13:0;;26933:26;;341:18:1;26933:26:0;;;;;;;26303:664;26191:776;;;:::o;39933:406::-;34873:16;:23;;-1:-1:-1;;;;34873:23:0;-1:-1:-1;;;34873:23:0;;;40050:62:::1;40067:4;40082:15;40100:11:::0;40050:8:::1;:62::i;:::-;40275:15;::::0;40125:206:::1;::::0;-1:-1:-1;;;40125:206:0;;40197:4:::1;40125:206;::::0;::::1;24192:34:1::0;24242:18;;;24235:34;;;40243:1:0::1;24285:18:1::0;;;24278:34;;;24328:18;;;24321:34;-1:-1:-1;;;;;40275:15:0;;::::1;24371:19:1::0;;;24364:44;40305:15:0::1;24424:19:1::0;;;24417:35;40125:15:0::1;:31:::0;;::::1;::::0;::::1;::::0;40164:9;;24126:19:1;;40125:206:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;34919:16:0;:24;;-1:-1:-1;;;;34919:24:0;;;-1:-1:-1;;;39933:406:0:o;404:250:1:-;489:1;499:113;513:6;510:1;507:13;499:113;;;589:11;;;583:18;570:11;;;563:39;535:2;528:10;499:113;;;-1:-1:-1;;646:1:1;628:16;;621:27;404:250::o;659:271::-;701:3;739:5;733:12;766:6;761:3;754:19;782:76;851:6;844:4;839:3;835:14;828:4;821:5;817:16;782:76;:::i;:::-;912:2;891:15;-1:-1:-1;;887:29:1;878:39;;;;919:4;874:50;;659:271;-1:-1:-1;;659:271:1:o;935:220::-;1084:2;1073:9;1066:21;1047:4;1104:45;1145:2;1134:9;1130:18;1122:6;1104:45;:::i;:::-;1096:53;935:220;-1:-1:-1;;;935:220:1:o;1160:131::-;-1:-1:-1;;;;;1235:31:1;;1225:42;;1215:70;;1281:1;1278;1271:12;1296:315;1364:6;1372;1425:2;1413:9;1404:7;1400:23;1396:32;1393:52;;;1441:1;1438;1431:12;1393:52;1480:9;1467:23;1499:31;1524:5;1499:31;:::i;:::-;1549:5;1601:2;1586:18;;;;1573:32;;-1:-1:-1;;;1296:315:1:o;1808:127::-;1869:10;1864:3;1860:20;1857:1;1850:31;1900:4;1897:1;1890:15;1924:4;1921:1;1914:15;1940:719;1983:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:55;;2054:1;2051;2044:12;2003:55;2090:6;2077:20;2116:18;2153:2;2149;2146:10;2143:36;;;2159:18;;:::i;:::-;2234:2;2228:9;2202:2;2288:13;;-1:-1:-1;;2284:22:1;;;2308:2;2280:31;2276:40;2264:53;;;2332:18;;;2352:22;;;2329:46;2326:72;;;2378:18;;:::i;:::-;2418:10;2414:2;2407:22;2453:2;2445:6;2438:18;2499:3;2492:4;2487:2;2479:6;2475:15;2471:26;2468:35;2465:55;;;2516:1;2513;2506:12;2465:55;2580:2;2573:4;2565:6;2561:17;2554:4;2546:6;2542:17;2529:54;2627:1;2620:4;2615:2;2607:6;2603:15;2599:26;2592:37;2647:6;2638:15;;;;;;1940:719;;;;:::o;2664:322::-;2733:6;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2842:9;2829:23;2875:18;2867:6;2864:30;2861:50;;;2907:1;2904;2897:12;2861:50;2930;2972:7;2963:6;2952:9;2948:22;2930:50;:::i;:::-;2920:60;2664:322;-1:-1:-1;;;;2664:322:1:o;3225:160::-;3290:20;;3346:13;;3339:21;3329:32;;3319:60;;3375:1;3372;3365:12;3390:596;3489:6;3497;3505;3513;3521;3574:3;3562:9;3553:7;3549:23;3545:33;3542:53;;;3591:1;3588;3581:12;3542:53;3631:9;3618:23;3664:18;3656:6;3653:30;3650:50;;;3696:1;3693;3686:12;3650:50;3719;3761:7;3752:6;3741:9;3737:22;3719:50;:::i;:::-;3709:60;;;3788:35;3819:2;3808:9;3804:18;3788:35;:::i;:::-;3778:45;;3842:35;3873:2;3862:9;3858:18;3842:35;:::i;:::-;3390:596;;;;-1:-1:-1;3832:45:1;;3924:2;3909:18;;3896:32;;-1:-1:-1;3975:3:1;3960:19;3947:33;;3390:596;-1:-1:-1;;3390:596:1:o;3991:247::-;4050:6;4103:2;4091:9;4082:7;4078:23;4074:32;4071:52;;;4119:1;4116;4109:12;4071:52;4158:9;4145:23;4177:31;4202:5;4177:31;:::i;4243:456::-;4320:6;4328;4336;4389:2;4377:9;4368:7;4364:23;4360:32;4357:52;;;4405:1;4402;4395:12;4357:52;4444:9;4431:23;4463:31;4488:5;4463:31;:::i;:::-;4513:5;-1:-1:-1;4570:2:1;4555:18;;4542:32;4583:33;4542:32;4583:33;:::i;:::-;4243:456;;4635:7;;-1:-1:-1;;;4689:2:1;4674:18;;;;4661:32;;4243:456::o;4704:248::-;4772:6;4780;4833:2;4821:9;4812:7;4808:23;4804:32;4801:52;;;4849:1;4846;4839:12;4801:52;-1:-1:-1;;4872:23:1;;;4942:2;4927:18;;;4914:32;;-1:-1:-1;4704:248:1:o;5146:390::-;5221:6;5229;5282:2;5270:9;5261:7;5257:23;5253:32;5250:52;;;5298:1;5295;5288:12;5250:52;5338:9;5325:23;5371:18;5363:6;5360:30;5357:50;;;5403:1;5400;5393:12;5357:50;5426;5468:7;5459:6;5448:9;5444:22;5426:50;:::i;:::-;5416:60;;;5495:35;5526:2;5515:9;5511:18;5495:35;:::i;:::-;5485:45;;5146:390;;;;;:::o;5541:445::-;5768:3;5757:9;5750:22;5731:4;5789:46;5830:3;5819:9;5815:19;5807:6;5789:46;:::i;:::-;5878:14;;5871:22;5866:2;5851:18;;5844:50;-1:-1:-1;5925:2:1;5910:18;;5903:34;;;;5968:2;5953:18;;;5946:34;5781:54;5541:445;-1:-1:-1;5541:445:1:o;5991:180::-;6050:6;6103:2;6091:9;6082:7;6078:23;6074:32;6071:52;;;6119:1;6116;6109:12;6071:52;-1:-1:-1;6142:23:1;;5991:180;-1:-1:-1;5991:180:1:o;6176:316::-;6247:6;6255;6263;6316:2;6304:9;6295:7;6291:23;6287:32;6284:52;;;6332:1;6329;6322:12;6284:52;6355:26;6371:9;6355:26;:::i;:::-;6345:36;;6400:35;6431:2;6420:9;6416:18;6400:35;:::i;:::-;6390:45;;6482:2;6471:9;6467:18;6454:32;6444:42;;6176:316;;;;;:::o;6497:388::-;6565:6;6573;6626:2;6614:9;6605:7;6601:23;6597:32;6594:52;;;6642:1;6639;6632:12;6594:52;6681:9;6668:23;6700:31;6725:5;6700:31;:::i;:::-;6750:5;-1:-1:-1;6807:2:1;6792:18;;6779:32;6820:33;6779:32;6820:33;:::i;:::-;6872:7;6862:17;;;6497:388;;;;;:::o;6890:315::-;6955:6;6963;7016:2;7004:9;6995:7;6991:23;6987:32;6984:52;;;7032:1;7029;7022:12;6984:52;7071:9;7058:23;7090:31;7115:5;7090:31;:::i;:::-;7140:5;-1:-1:-1;7164:35:1;7195:2;7180:18;;7164:35;:::i;7210:380::-;7289:1;7285:12;;;;7332;;;7353:61;;7407:4;7399:6;7395:17;7385:27;;7353:61;7460:2;7452:6;7449:14;7429:18;7426:38;7423:161;;7506:10;7501:3;7497:20;7494:1;7487:31;7541:4;7538:1;7531:15;7569:4;7566:1;7559:15;7423:161;;7210:380;;;:::o;8291:127::-;8352:10;8347:3;8343:20;8340:1;8333:31;8383:4;8380:1;8373:15;8407:4;8404:1;8397:15;8423:125;8488:9;;;8509:10;;;8506:36;;;8522:18;;:::i;8553:289::-;8684:3;8722:6;8716:13;8738:66;8797:6;8792:3;8785:4;8777:6;8773:17;8738:66;:::i;:::-;8820:16;;;;;8553:289;-1:-1:-1;;8553:289:1:o;8973:545::-;9075:2;9070:3;9067:11;9064:448;;;9111:1;9136:5;9132:2;9125:17;9181:4;9177:2;9167:19;9251:2;9239:10;9235:19;9232:1;9228:27;9222:4;9218:38;9287:4;9275:10;9272:20;9269:47;;;-1:-1:-1;9310:4:1;9269:47;9365:2;9360:3;9356:12;9353:1;9349:20;9343:4;9339:31;9329:41;;9420:82;9438:2;9431:5;9428:13;9420:82;;;9483:17;;;9464:1;9453:13;9420:82;;;9424:3;;;8973:545;;;:::o;9694:1352::-;9820:3;9814:10;9847:18;9839:6;9836:30;9833:56;;;9869:18;;:::i;:::-;9898:97;9988:6;9948:38;9980:4;9974:11;9948:38;:::i;:::-;9942:4;9898:97;:::i;:::-;10050:4;;10114:2;10103:14;;10131:1;10126:663;;;;10833:1;10850:6;10847:89;;;-1:-1:-1;10902:19:1;;;10896:26;10847:89;-1:-1:-1;;9651:1:1;9647:11;;;9643:24;9639:29;9629:40;9675:1;9671:11;;;9626:57;10949:81;;10096:944;;10126:663;8920:1;8913:14;;;8957:4;8944:18;;-1:-1:-1;;10162:20:1;;;10280:236;10294:7;10291:1;10288:14;10280:236;;;10383:19;;;10377:26;10362:42;;10475:27;;;;10443:1;10431:14;;;;10310:19;;10280:236;;;10284:3;10544:6;10535:7;10532:19;10529:201;;;10605:19;;;10599:26;-1:-1:-1;;10688:1:1;10684:14;;;10700:3;10680:24;10676:37;10672:42;10657:58;10642:74;;10529:201;-1:-1:-1;;;;;10776:1:1;10760:14;;;10756:22;10743:36;;-1:-1:-1;9694:1352:1:o;11051:291::-;11228:2;11217:9;11210:21;11191:4;11248:45;11289:2;11278:9;11274:18;11266:6;11248:45;:::i;:::-;11240:53;;11329:6;11324:2;11313:9;11309:18;11302:34;11051:291;;;;;:::o;11347:527::-;11596:3;11585:9;11578:22;11559:4;11617:46;11658:3;11647:9;11643:19;11635:6;11617:46;:::i;:::-;11706:14;;11699:22;11694:2;11679:18;;11672:50;-1:-1:-1;11765:14:1;;11758:22;11753:2;11738:18;;11731:50;11812:2;11797:18;;11790:34;;;;11855:3;11840:19;;;11833:35;11609:54;11347:527;-1:-1:-1;11347:527:1:o;12231:422::-;12320:1;12363:5;12320:1;12377:270;12398:7;12388:8;12385:21;12377:270;;;12457:4;12453:1;12449:6;12445:17;12439:4;12436:27;12433:53;;;12466:18;;:::i;:::-;12516:7;12506:8;12502:22;12499:55;;;12536:16;;;;12499:55;12615:22;;;;12575:15;;;;12377:270;;;12381:3;12231:422;;;;;:::o;12658:806::-;12707:5;12737:8;12727:80;;-1:-1:-1;12778:1:1;12792:5;;12727:80;12826:4;12816:76;;-1:-1:-1;12863:1:1;12877:5;;12816:76;12908:4;12926:1;12921:59;;;;12994:1;12989:130;;;;12901:218;;12921:59;12951:1;12942:10;;12965:5;;;12989:130;13026:3;13016:8;13013:17;13010:43;;;13033:18;;:::i;:::-;-1:-1:-1;;13089:1:1;13075:16;;13104:5;;12901:218;;13203:2;13193:8;13190:16;13184:3;13178:4;13175:13;13171:36;13165:2;13155:8;13152:16;13147:2;13141:4;13138:12;13134:35;13131:77;13128:159;;;-1:-1:-1;13240:19:1;;;13272:5;;13128:159;13319:34;13344:8;13338:4;13319:34;:::i;:::-;13389:6;13385:1;13381:6;13377:19;13368:7;13365:32;13362:58;;;13400:18;;:::i;:::-;13438:20;;12658:806;-1:-1:-1;;;12658:806:1:o;13469:140::-;13527:5;13556:47;13597:4;13587:8;13583:19;13577:4;13556:47;:::i;13614:168::-;13654:7;13720:1;13716;13712:6;13708:14;13705:1;13702:21;13697:1;13690:9;13683:17;13679:45;13676:71;;;13727:18;;:::i;:::-;-1:-1:-1;13767:9:1;;13614:168::o;13787:404::-;13989:2;13971:21;;;14028:2;14008:18;;;14001:30;14067:34;14062:2;14047:18;;14040:62;-1:-1:-1;;;14133:2:1;14118:18;;14111:38;14181:3;14166:19;;13787:404::o;14896:217::-;14936:1;14962;14952:132;;15006:10;15001:3;14997:20;14994:1;14987:31;15041:4;15038:1;15031:15;15069:4;15066:1;15059:15;14952:132;-1:-1:-1;15098:9:1;;14896:217::o;15118:402::-;15320:2;15302:21;;;15359:2;15339:18;;;15332:30;15398:34;15393:2;15378:18;;15371:62;-1:-1:-1;;;15464:2:1;15449:18;;15442:36;15510:3;15495:19;;15118:402::o;18889:401::-;19091:2;19073:21;;;19130:2;19110:18;;;19103:30;19169:34;19164:2;19149:18;;19142:62;-1:-1:-1;;;19235:2:1;19220:18;;19213:35;19280:3;19265:19;;18889:401::o;19295:399::-;19497:2;19479:21;;;19536:2;19516:18;;;19509:30;19575:34;19570:2;19555:18;;19548:62;-1:-1:-1;;;19641:2:1;19626:18;;19619:33;19684:3;19669:19;;19295:399::o;19699:402::-;19901:2;19883:21;;;19940:2;19920:18;;;19913:30;19979:34;19974:2;19959:18;;19952:62;-1:-1:-1;;;20045:2:1;20030:18;;20023:36;20091:3;20076:19;;19699:402::o;20106:128::-;20173:9;;;20194:11;;;20191:37;;;20208:18;;:::i;22478:127::-;22539:10;22534:3;22530:20;22527:1;22520:31;22570:4;22567:1;22560:15;22594:4;22591:1;22584:15;22610:251;22680:6;22733:2;22721:9;22712:7;22708:23;22704:32;22701:52;;;22749:1;22746;22739:12;22701:52;22781:9;22775:16;22800:31;22825:5;22800:31;:::i;22866:980::-;23128:4;23176:3;23165:9;23161:19;23207:6;23196:9;23189:25;23233:2;23271:6;23266:2;23255:9;23251:18;23244:34;23314:3;23309:2;23298:9;23294:18;23287:31;23338:6;23373;23367:13;23404:6;23396;23389:22;23442:3;23431:9;23427:19;23420:26;;23481:2;23473:6;23469:15;23455:29;;23502:1;23512:195;23526:6;23523:1;23520:13;23512:195;;;23591:13;;-1:-1:-1;;;;;23587:39:1;23575:52;;23682:15;;;;23647:12;;;;23623:1;23541:9;23512:195;;;-1:-1:-1;;;;;;;23763:32:1;;;;23758:2;23743:18;;23736:60;-1:-1:-1;;;23827:3:1;23812:19;23805:35;23724:3;22866:980;-1:-1:-1;;;22866:980:1:o;24463:306::-;24551:6;24559;24567;24620:2;24608:9;24599:7;24595:23;24591:32;24588:52;;;24636:1;24633;24626:12;24588:52;24665:9;24659:16;24649:26;;24715:2;24704:9;24700:18;24694:25;24684:35;;24759:2;24748:9;24744:18;24738:25;24728:35;;24463:306;;;;;:::o

Swarm Source

ipfs://63538b707b69ca34408559d628146699da49e614815246e99798bb27e489495d
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.