ETH Price: $3,385.66 (+0.85%)

Token

StellaryAI (stelAI)
 

Overview

Max Total Supply

1,000,000,000 stelAI

Holders

1,458 ( 0.887%)

Market

Price

$0.00 @ 0.000001 ETH (-22.71%)

Onchain Market Cap

$3,109,940.00

Circulating Supply Market Cap

$2,288,278.00

Other Info

Token Contract (WITH 9 Decimals)

Balance
36,801.523155083 stelAI

Value
$114.45 ( ~0.03380432149046 Eth) [0.0037%]
0xf284129780a4e1a54433337081494aa0a3731c8c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

StellaryAI is a trailblazing all-in-one AI creativity platform that empowers creators by aggregating a wide range of generative AI tools for images, videos, voiceovers, and music into a unified, web3-powered interface.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
StellaryAI

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-31
*/

/**
 *         ## ##   #### ##  ### ###  ####     ####       ##     ### ##   ##  ##     ##       ####   
 *        ##   ##  # ## ##   ##  ##   ##       ##         ##     ##  ##  ##  ##      ##       ##    
 *        ####       ##      ##       ##       ##       ## ##    ##  ##  ##  ##    ## ##      ##    
 *         #####     ##      ## ##    ##       ##       ##  ##   ## ##    ## ##    ##  ##     ##    
 *            ###    ##      ##       ##       ##       ## ###   ## ##     ##      ## ###     ##    
 *        ##   ##    ##      ##  ##   ##  ##   ##  ##   ##  ##   ##  ##    ##      ##  ##     ##    
 *         ## ##    ####    ### ###  ### ###  ### ###  ###  ##  #### ##    ##     ###  ##    ####                   
 * 
 * StellaryAI : The Aggregator of AI Creativity | Every Thought, Every Sound, Every Vision - Endlessly Created
 * 
 * Twitter: twitter.com/StellaryAI
 * Homepage: https://stellaryai.com
 * APP: https://app.stellaryai.com
 * 
 *   
 * 4% Buy Tax | 4% Sell Tax
 *
 * Set slippage to 4-5% : 1% to LP, 3% tax for Marketing & Development Costs.
 * 
 * MAX WALLET - 10 Million
 * Single MAX Transaction - 10 Million
*/

// 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 StellaryAI is ERC20, Ownable {
    // TOKENOMICS START ==========================================================>
    string private _name = "StellaryAI";
    string private _symbol = "stelAI";
    uint8 private _decimals = 9;
    uint256 private _supply = 1000000000;
    uint256 public taxForLiquidity = 47; //sniper protection, to be lowered to 1% after launch
    uint256 public taxForMarketing = 47; //sniper protection, to be lowered to 2% after launch
    uint256 public maxTxAmount = 10000001 * 10**_decimals;
    uint256 public maxWalletAmount = 10000001 * 10**_decimals;
    address public marketingWallet = 0x008597D4Af900e4BD5dEd7fFe82d3A24b43E3E87;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _marketingReserves = 0;
    mapping(address => bool) public _isExcludedFromFee;
    uint256 public numTokensSellToAddToLiquidity = 200000 * 10**_decimals;
    uint256 public numTokensSellToAddToETH = 100000 * 10**_decimals;

    function postLaunch() external onlyOwner {
        taxForLiquidity = 1;
        taxForMarketing = 3;
        maxTxAmount = 10000001 * 10**_decimals;
        maxWalletAmount = 10000001 * 10**_decimals;
    }
    // TOKENOMICS END ============================================================>

    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.01 ether;
    uint public userCostTokens = 10000 * 10**_decimals;

    uint public channelCostEth = 0.1 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);

    //with all eth payments, reserve is held on the contract until the sending threshold is reached.
    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);
    }

    //Some simple ABIv1 getters below
    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);
    }

    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 must not be greater than 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% of the supply at once!");
        require(_numTokensSellToAddToETH < _supply / 98, "Cannot liquidate more than 2% of the supply at once!");
        numTokensSellToAddToLiquidity = _numTokensSellToAddToLiquidity * 10**_decimals;
        numTokensSellToAddToETH = _numTokensSellToAddToETH * 10**_decimals;

        return true;
    }

    function changeMaxTxAmount(uint256 _maxTxAmount)
        public
        onlyOwner
        returns (bool)
    {
        maxTxAmount = _maxTxAmount;

        return true;
    }

    function changeMaxWalletAmount(uint256 _maxWalletAmount)
        public
        onlyOwner
        returns (bool)
    {
        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":"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":"postLaunch","outputs":[],"stateMutability":"nonpayable","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"}]

60a06040526040518060400160405280600a81526020017f5374656c6c617279414900000000000000000000000000000000000000000000815250600690816200004a919062000c02565b506040518060400160405280600681526020017f7374656c414900000000000000000000000000000000000000000000000000008152506007908162000091919062000c02565b506009600860006101000a81548160ff021916908360ff160217905550633b9aca00600955602f600a55602f600b55600860009054906101000a900460ff16600a620000de919062000e79565b62989681620000ee919062000eca565b600c55600860009054906101000a900460ff16600a6200010f919062000e79565b629896816200011f919062000eca565b600d55728597d4af900e4bd5ded7ffe82d3a24b43e3e87600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601055600860009054906101000a900460ff16600a620001dc919062000e79565b62030d40620001ec919062000eca565b601255600860009054906101000a900460ff16600a6200020d919062000e79565b620186a06200021d919062000eca565b601355662386f26fc10000601655600860009054906101000a900460ff16600a62000249919062000e79565b61271062000258919062000eca565b60175567016345785d8a0000601855600860009054906101000a900460ff16600a62000285919062000e79565b620186a062000295919062000eca565b601955348015620002a557600080fd5b5060068054620002b590620009f1565b80601f0160208091040260200160405190810160405280929190818152602001828054620002e390620009f1565b8015620003345780601f10620003085761010080835404028352916020019162000334565b820191906000526020600020905b8154815290600101906020018083116200031657829003601f168201915b5050505050600780546200034890620009f1565b80601f01602080910402602001604051908101604052809291908181526020018280546200037690620009f1565b8015620003c75780601f106200039b57610100808354040283529160200191620003c7565b820191906000526020600020905b815481529060010190602001808311620003a957829003601f168201915b50505050508160039081620003dd919062000c02565b508060049081620003ef919062000c02565b50505062000412620004066200077560201b60201c565b6200077d60201b60201c565b6200045033600860009054906101000a900460ff16600a62000435919062000e79565b60095462000444919062000eca565b6200084360201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004db919062000f95565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000543573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000569919062000f95565b6040518363ffffffff1660e01b81526004016200058892919062000fd8565b6020604051808303816000875af1158015620005a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ce919062000f95565b601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060016011600060805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050620010f1565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620008b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008ac9062001066565b60405180910390fd5b8060026000828254620008c9919062001088565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200097c9190620010d4565b60405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a0a57607f821691505b60208210810362000a205762000a1f620009c2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a8a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a4b565b62000a96868362000a4b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ae362000add62000ad78462000aae565b62000ab8565b62000aae565b9050919050565b6000819050919050565b62000aff8362000ac2565b62000b1762000b0e8262000aea565b84845462000a58565b825550505050565b600090565b62000b2e62000b1f565b62000b3b81848462000af4565b505050565b5b8181101562000b635762000b5760008262000b24565b60018101905062000b41565b5050565b601f82111562000bb25762000b7c8162000a26565b62000b878462000a3b565b8101602085101562000b97578190505b62000baf62000ba68562000a3b565b83018262000b40565b50505b505050565b600082821c905092915050565b600062000bd76000198460080262000bb7565b1980831691505092915050565b600062000bf2838362000bc4565b9150826002028217905092915050565b62000c0d8262000988565b67ffffffffffffffff81111562000c295762000c2862000993565b5b62000c358254620009f1565b62000c4282828562000b67565b600060209050601f83116001811462000c7a576000841562000c65578287015190505b62000c71858262000be4565b86555062000ce1565b601f19841662000c8a8662000a26565b60005b8281101562000cb45784890151825560018201915060208501945060208101905062000c8d565b8683101562000cd4578489015162000cd0601f89168262000bc4565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000d775780860481111562000d4f5762000d4e62000ce9565b5b600185161562000d5f5780820291505b808102905062000d6f8562000d18565b945062000d2f565b94509492505050565b60008262000d92576001905062000e65565b8162000da2576000905062000e65565b816001811462000dbb576002811462000dc65762000dfc565b600191505062000e65565b60ff84111562000ddb5762000dda62000ce9565b5b8360020a91508482111562000df55762000df462000ce9565b5b5062000e65565b5060208310610133831016604e8410600b841016171562000e365782820a90508381111562000e305762000e2f62000ce9565b5b62000e65565b62000e45848484600162000d25565b9250905081840481111562000e5f5762000e5e62000ce9565b5b81810290505b9392505050565b600060ff82169050919050565b600062000e868262000aae565b915062000e938362000e6c565b925062000ec27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000d80565b905092915050565b600062000ed78262000aae565b915062000ee48362000aae565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000f205762000f1f62000ce9565b5b828202905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000f5d8262000f30565b9050919050565b62000f6f8162000f50565b811462000f7b57600080fd5b50565b60008151905062000f8f8162000f64565b92915050565b60006020828403121562000fae5762000fad62000f2b565b5b600062000fbe8482850162000f7e565b91505092915050565b62000fd28162000f50565b82525050565b600060408201905062000fef600083018562000fc7565b62000ffe602083018462000fc7565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200104e601f8362001005565b91506200105b8262001016565b602082019050919050565b6000602082019050818103600083015262001081816200103f565b9050919050565b6000620010958262000aae565b9150620010a28362000aae565b9250828201905080821115620010bd57620010bc62000ce9565b5b92915050565b620010ce8162000aae565b82525050565b6000602082019050620010eb6000830184620010c3565b92915050565b6080516149286200113060003960008181610e3a0152818161299101528181612a7201528181612a9901528181612dcb0152612df201526149286000f3fe60806040526004361061028c5760003560e01c8063768dc7101161015a578063af8af690116100c1578063df1d099e1161007a578063df1d099e14610a67578063df8408fe14610a92578063f1b2b3d914610abb578063f2fde38b14610af8578063f345bd8514610b21578063fbee93ba14610b4c57610293565b8063af8af6901461091d578063b5c78e8a1461095a578063bb85c6d114610997578063c0fdea57146109d4578063d12a7688146109ff578063dd62ed3e14610a2a57610293565b8063a2330d9711610113578063a2330d97146107f6578063a3996f7b14610836578063a457c2d71461084d578063a9059cbb1461088a578063aa4bde28146108c7578063ad16a0cf146108f257610293565b8063768dc710146106d05780637930ef691461070d57806381bfdcca146107385780638c0b5e22146107755780638da5cb5b146107a057806395d89b41146107cb57610293565b806330b63d80116101fe57806363cdf60f116101b757806363cdf60f146105ab578063677daa57146105eb57806370a0823114610628578063715018a61461066557806373c503b31461067c57806375f0a874146106a557610293565b806330b63d8014610473578063313ce567146104b057806339509351146104db57806349bd5a5e146105185780634fa74c4d14610543578063527ffabd1461058057610293565b80631694505e116102505780631694505e1461037257806316a7b1601461039d57806318160ddd146103b957806318bc47f6146103e45780631b56bbf91461040d57806323b872dd1461043657610293565b806303fd2a4514610298578063054dee0f146102c357806306fdde03146102ee578063095ea7b3146103195780630f1d7ad91461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610b77565b6040516102ba9190612f1d565b60405180910390f35b3480156102cf57600080fd5b506102d8610b9d565b6040516102e59190612f51565b60405180910390f35b3480156102fa57600080fd5b50610303610ba3565b6040516103109190612ffc565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b919061308a565b610c35565b60405161034d91906130e5565b60405180910390f35b610370600480360381019061036b9190613235565b610c58565b005b34801561037e57600080fd5b50610387610e38565b60405161039491906132dd565b60405180910390f35b6103b760048036038101906103b29190613235565b610e5c565b005b3480156103c557600080fd5b506103ce61103c565b6040516103db9190612f51565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190613324565b611046565b005b34801561041957600080fd5b50610434600480360381019061042f91906133bb565b6111bc565b005b34801561044257600080fd5b5061045d600480360381019061045891906133e8565b61133e565b60405161046a91906130e5565b60405180910390f35b34801561047f57600080fd5b5061049a6004803603810190610495919061343b565b61136d565b6040516104a791906130e5565b60405180910390f35b3480156104bc57600080fd5b506104c561147b565b6040516104d29190613497565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd919061308a565b611484565b60405161050f91906130e5565b60405180910390f35b34801561052457600080fd5b5061052d6114bb565b60405161053a9190612f1d565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906134b2565b6114e1565b60405161057791906130e5565b60405180910390f35b34801561058c57600080fd5b50610595611557565b6040516105a29190612f51565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613235565b61155d565b6040516105e2949392919061350e565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d919061355a565b611638565b60405161061f91906130e5565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906133bb565b611652565b60405161065c9190612f51565b60405180910390f35b34801561067157600080fd5b5061067a61169a565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613587565b6116ae565b005b3480156106b157600080fd5b506106ba611782565b6040516106c79190612f1d565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906133bb565b6117a8565b60405161070491906130e5565b60405180910390f35b34801561071957600080fd5b506107226117c8565b60405161072f9190612f51565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a919061355a565b6117ce565b60405161076c91906130e5565b60405180910390f35b34801561078157600080fd5b5061078a6117e8565b6040516107979190612f51565b60405180910390f35b3480156107ac57600080fd5b506107b56117ee565b6040516107c29190612f1d565b60405180910390f35b3480156107d757600080fd5b506107e0611818565b6040516107ed9190612ffc565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613235565b6118aa565b60405161082d949392919061350e565b60405180910390f35b34801561084257600080fd5b5061084b611985565b005b34801561085957600080fd5b50610874600480360381019061086f919061308a565b6119ff565b60405161088191906130e5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061308a565b611a76565b6040516108be91906130e5565b60405180910390f35b3480156108d357600080fd5b506108dc611a99565b6040516108e99190612f51565b60405180910390f35b3480156108fe57600080fd5b50610907611a9f565b6040516109149190612f51565b60405180910390f35b34801561092957600080fd5b50610944600480360381019061093f919061343b565b611aa5565b60405161095191906130e5565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c91906134b2565b611b16565b60405161098e9190612f51565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b991906133bb565b611b72565b6040516109cb91906130e5565b60405180910390f35b3480156109e057600080fd5b506109e9611cc5565b6040516109f69190612f51565b60405180910390f35b348015610a0b57600080fd5b50610a14611ccb565b604051610a219190612f51565b60405180910390f35b348015610a3657600080fd5b50610a516004803603810190610a4c91906135da565b611cd1565b604051610a5e9190612f51565b60405180910390f35b348015610a7357600080fd5b50610a7c611d58565b604051610a899190612f51565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab4919061361a565b611d5e565b005b348015610ac757600080fd5b50610ae26004803603810190610add91906134b2565b611dfa565b604051610aef9190612f51565b60405180910390f35b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906133bb565b611e56565b005b348015610b2d57600080fd5b50610b36611ed9565b604051610b439190612f51565b60405180910390f35b348015610b5857600080fd5b50610b61611edf565b604051610b6e9190612f51565b60405180910390f35b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b606060038054610bb290613689565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde90613689565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b5050505050905090565b600080610c40611ee5565b9050610c4d818585611eed565b600191505092915050565b601654341015610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090613772565b60405180910390fd5b3460106000828254610d0b91906137c1565b92505081905550610d4133600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601584604051610d729190613831565b908152602001604051809103902060030154610d8e91906137c1565b815250601582604051610da19190613831565b90815260200160405180910390206000820151816000019081610dc491906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f1151228142604051610e2d929190613abc565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b601654341015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613772565b60405180910390fd5b3460106000828254610f0f91906137c1565b92505081905550610f4533600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601484604051610f769190613831565b908152602001604051809103902060030154610f9291906137c1565b815250601482604051610fa59190613831565b90815260200160405180910390206000820151816000019081610fc891906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c5088142604051611031929190613abc565b60405180910390a150565b6000600254905090565b61104e612646565b83156110e75760405180608001604052808681526020018415158152602001838152602001828152506015866040516110879190613831565b908152602001604051809103902060008201518160000190816110aa91906139ea565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030155905050611176565b604051806080016040528086815260200184151581526020018381526020018281525060148660405161111a9190613831565b9081526020016040518091039020600082015181600001908161113d91906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050505b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf85858585856040516111ad959493929190613aec565b60405180910390a15050505050565b6111c4612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b90613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613bb8565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f816040516113339190612f1d565b60405180910390a150565b600080611349611ee5565b90506113568582856126c4565b6113618585856120b6565b60019150509392505050565b6000611377612646565b60626009546113869190613c07565b83106113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90613caa565b60405180910390fd5b60626009546113d69190613c07565b8210611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90613caa565b60405180910390fd5b600860009054906101000a900460ff16600a6114339190613dfd565b8361143e9190613e48565b601281905550600860009054906101000a900460ff16600a6114609190613dfd565b8261146b9190613e48565b6013819055506001905092915050565b60006009905090565b60008061148f611ee5565b90506114b08185856114a18589611cd1565b6114ab91906137c1565b611eed565b600191505092915050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000811561151f576015836040516114f99190613831565b908152602001604051809103902060010160009054906101000a900460ff169050611551565b60148360405161152f9190613831565b908152602001604051809103902060010160009054906101000a900460ff1690505b92915050565b600b5481565b60148180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461159690613689565b80601f01602080910402602001604051908101604052809291908181526020018280546115c290613689565b801561160f5780601f106115e45761010080835404028352916020019161160f565b820191906000526020600020905b8154815290600101906020018083116115f257829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b6000611642612646565b81600c8190555060019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116a2612646565b6116ac6000612750565b565b6116b6612646565b82156116db5781156116ce57806018819055506116d6565b806016819055505b611742565b811561171357600860009054906101000a900460ff16600a6116fd9190613dfd565b816117089190613e48565b601981905550611741565b600860009054906101000a900460ff16600a61172f9190613dfd565b8161173a9190613e48565b6017819055505b5b7fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda283838360405161177593929190613ea2565b60405180910390a1505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60185481565b60006117d8612646565b81600d8190555060019050919050565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461182790613689565b80601f016020809104026020016040519081016040528092919081815260200182805461185390613689565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090508060000180546118e390613689565b80601f016020809104026020016040519081016040528092919081815260200182805461190f90613689565b801561195c5780601f106119315761010080835404028352916020019161195c565b820191906000526020600020905b81548152906001019060200180831161193f57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b61198d612646565b6001600a819055506003600b81905550600860009054906101000a900460ff16600a6119b99190613dfd565b629896816119c79190613e48565b600c81905550600860009054906101000a900460ff16600a6119e99190613dfd565b629896816119f79190613e48565b600d81905550565b600080611a0a611ee5565b90506000611a188286611cd1565b905083811015611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613f4b565b60405180910390fd5b611a6a8286868403611eed565b60019250505092915050565b600080611a81611ee5565b9050611a8e8185856120b6565b600191505092915050565b600d5481565b60135481565b6000611aaf612646565b600a8284611abd91906137c1565b1115611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613fdd565b60405180910390fd5b82600a8190555081600b819055506001905092915050565b60008115611b4757601583604051611b2e9190613831565b9081526020016040518091039020600301549050611b6c565b601483604051611b579190613831565b90815260200160405180910390206003015490505b92915050565b6000611b7c612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613bb8565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60105481565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60195481565b611d66612646565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff28282604051611dee929190613ffd565b60405180910390a15050565b60008115611e2b57601583604051611e129190613831565b9081526020016040518091039020600201549050611e50565b601483604051611e3b9190613831565b90815260200160405180910390206002015490505b92915050565b611e5e612646565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614098565b60405180910390fd5b611ed681612750565b50565b600a5481565b60175481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f539061412a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906141bc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120a99190612f51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c9061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906142e0565b60405180910390fd5b8061219e84611652565b10156121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614372565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806122885750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80156122a15750601a60149054906101000a900460ff16155b1561263557601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123fa57600060105461230930611652565b6123139190614392565b9050601254811061232a57612329601254612816565b5b601354601054106123f8576123406013546128d7565b601354601060008282546123549190614392565b925050819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050509050806123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614412565b60405180910390fd5b505b505b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061249d5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156124aa57819050612624565b600c548211156124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e6906144a4565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361259d57600d5461255084611652565b8361255b91906137c1565b111561259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614536565b60405180910390fd5b5b60006064600b54846125af9190613e48565b6125b99190613c07565b905060006064600a54856125cd9190613e48565b6125d79190613c07565b905080826125e591906137c1565b846125f09190614392565b9250816010600082825461260491906137c1565b925050819055506126218630838561261c91906137c1565b612b4a565b50505b61262f848483612b4a565b50612641565b612640838383612b4a565b5b505050565b61264e611ee5565b73ffffffffffffffffffffffffffffffffffffffff1661266c6117ee565b73ffffffffffffffffffffffffffffffffffffffff16146126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b9906145a2565b60405180910390fd5b565b60006126d08484611cd1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461274a578181101561273c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127339061460e565b60405180910390fd5b6127498484848403611eed565b5b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601a60146101000a81548160ff02191690831515021790555060006002826128409190613c07565b9050600081836128509190614392565b90506000479050612860836128d7565b6000814761286e9190614392565b905061287a8382612daa565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516128ad9392919061462e565b60405180910390a1505050506000601a60146101000a81548160ff02191690831515021790555050565b6001601a60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff81111561290f5761290e61310a565b5b60405190808252806020026020018201604052801561293d5781602001602082028036833780820191505090505b509050308160008151811061295557612954614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e91906146a9565b81600181518110612a3257612a31614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a97307f000000000000000000000000000000000000000000000000000000000000000084611eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612af99594939291906147cf565b600060405180830381600087803b158015612b1357600080fd5b505af1158015612b27573d6000803e3d6000fd5b50505050506000601a60146101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb09061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1f906142e0565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590614372565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d9c9190612f51565b60405180910390a350505050565b6001601a60146101000a81548160ff021916908315150217905550612df0307f000000000000000000000000000000000000000000000000000000000000000084611eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612e7796959493929190614829565b60606040518083038185885af1158015612e95573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612eba919061489f565b5050506000601a60146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f0782612edc565b9050919050565b612f1781612efc565b82525050565b6000602082019050612f326000830184612f0e565b92915050565b6000819050919050565b612f4b81612f38565b82525050565b6000602082019050612f666000830184612f42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa6578082015181840152602081019050612f8b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fce82612f6c565b612fd88185612f77565b9350612fe8818560208601612f88565b612ff181612fb2565b840191505092915050565b600060208201905081810360008301526130168184612fc3565b905092915050565b6000604051905090565b600080fd5b600080fd5b61303b81612efc565b811461304657600080fd5b50565b60008135905061305881613032565b92915050565b61306781612f38565b811461307257600080fd5b50565b6000813590506130848161305e565b92915050565b600080604083850312156130a1576130a0613028565b5b60006130af85828601613049565b92505060206130c085828601613075565b9150509250929050565b60008115159050919050565b6130df816130ca565b82525050565b60006020820190506130fa60008301846130d6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61314282612fb2565b810181811067ffffffffffffffff821117156131615761316061310a565b5b80604052505050565b600061317461301e565b90506131808282613139565b919050565b600067ffffffffffffffff8211156131a05761319f61310a565b5b6131a982612fb2565b9050602081019050919050565b82818337600083830152505050565b60006131d86131d384613185565b61316a565b9050828152602081018484840111156131f4576131f3613105565b5b6131ff8482856131b6565b509392505050565b600082601f83011261321c5761321b613100565b5b813561322c8482602086016131c5565b91505092915050565b60006020828403121561324b5761324a613028565b5b600082013567ffffffffffffffff8111156132695761326861302d565b5b61327584828501613207565b91505092915050565b6000819050919050565b60006132a361329e61329984612edc565b61327e565b612edc565b9050919050565b60006132b582613288565b9050919050565b60006132c7826132aa565b9050919050565b6132d7816132bc565b82525050565b60006020820190506132f260008301846132ce565b92915050565b613301816130ca565b811461330c57600080fd5b50565b60008135905061331e816132f8565b92915050565b600080600080600060a086880312156133405761333f613028565b5b600086013567ffffffffffffffff81111561335e5761335d61302d565b5b61336a88828901613207565b955050602061337b8882890161330f565b945050604061338c8882890161330f565b935050606061339d88828901613075565b92505060806133ae88828901613075565b9150509295509295909350565b6000602082840312156133d1576133d0613028565b5b60006133df84828501613049565b91505092915050565b60008060006060848603121561340157613400613028565b5b600061340f86828701613049565b935050602061342086828701613049565b925050604061343186828701613075565b9150509250925092565b6000806040838503121561345257613451613028565b5b600061346085828601613075565b925050602061347185828601613075565b9150509250929050565b600060ff82169050919050565b6134918161347b565b82525050565b60006020820190506134ac6000830184613488565b92915050565b600080604083850312156134c9576134c8613028565b5b600083013567ffffffffffffffff8111156134e7576134e661302d565b5b6134f385828601613207565b92505060206135048582860161330f565b9150509250929050565b600060808201905081810360008301526135288187612fc3565b905061353760208301866130d6565b6135446040830185612f42565b6135516060830184612f42565b95945050505050565b6000602082840312156135705761356f613028565b5b600061357e84828501613075565b91505092915050565b6000806000606084860312156135a05761359f613028565b5b60006135ae8682870161330f565b93505060206135bf8682870161330f565b92505060406135d086828701613075565b9150509250925092565b600080604083850312156135f1576135f0613028565b5b60006135ff85828601613049565b925050602061361085828601613049565b9150509250929050565b6000806040838503121561363157613630613028565b5b600061363f85828601613049565b92505060206136508582860161330f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136a157607f821691505b6020821081036136b4576136b361365a565b5b50919050565b7f4e6f7420656e6f756768204554482073656e7421000000000000000000000000600082015250565b60006136f0601483612f77565b91506136fb826136ba565b602082019050919050565b6000602082019050818103600083015261371f816136e3565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b600061375c601283612f77565b915061376782613726565b602082019050919050565b6000602082019050818103600083015261378b8161374f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137cc82612f38565b91506137d783612f38565b92508282019050808211156137ef576137ee613792565b5b92915050565b600081905092915050565b600061380b82612f6c565b61381581856137f5565b9350613825818560208601612f88565b80840191505092915050565b600061383d8284613800565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261386d565b6138b4868361386d565b95508019841693508086168417925050509392505050565b60006138e76138e26138dd84612f38565b61327e565b612f38565b9050919050565b6000819050919050565b613901836138cc565b61391561390d826138ee565b84845461387a565b825550505050565b600090565b61392a61391d565b6139358184846138f8565b505050565b5b818110156139595761394e600082613922565b60018101905061393b565b5050565b601f82111561399e5761396f81613848565b6139788461385d565b81016020851015613987578190505b61399b6139938561385d565b83018261393a565b50505b505050565b600082821c905092915050565b60006139c1600019846008026139a3565b1980831691505092915050565b60006139da83836139b0565b9150826002028217905092915050565b6139f382612f6c565b67ffffffffffffffff811115613a0c57613a0b61310a565b5b613a168254613689565b613a2182828561395d565b600060209050601f831160018114613a545760008415613a42578287015190505b613a4c85826139ce565b865550613ab4565b601f198416613a6286613848565b60005b82811015613a8a57848901518255600182019150602085019450602081019050613a65565b86831015613aa75784890151613aa3601f8916826139b0565b8355505b6001600288020188555050505b505050505050565b60006040820190508181036000830152613ad68185612fc3565b9050613ae56020830184612f42565b9392505050565b600060a0820190508181036000830152613b068188612fc3565b9050613b1560208301876130d6565b613b2260408301866130d6565b613b2f6060830185612f42565b613b3c6080830184612f42565b9695505050505050565b7f4c5020506169722063616e6e6f742062652074686520446561642077616c6c6560008201527f742c206f72203021000000000000000000000000000000000000000000000000602082015250565b6000613ba2602883612f77565b9150613bad82613b46565b604082019050919050565b60006020820190508181036000830152613bd181613b95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c1282612f38565b9150613c1d83612f38565b925082613c2d57613c2c613bd8565b5b828204905092915050565b7f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f6660008201527f2074686520737570706c79206174206f6e636521000000000000000000000000602082015250565b6000613c94603483612f77565b9150613c9f82613c38565b604082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613d2157808604811115613cfd57613cfc613792565b5b6001851615613d0c5780820291505b8081029050613d1a85613cca565b9450613ce1565b94509492505050565b600082613d3a5760019050613df6565b81613d485760009050613df6565b8160018114613d5e5760028114613d6857613d97565b6001915050613df6565b60ff841115613d7a57613d79613792565b5b8360020a915084821115613d9157613d90613792565b5b50613df6565b5060208310610133831016604e8410600b8410161715613dcc5782820a905083811115613dc757613dc6613792565b5b613df6565b613dd98484846001613cd7565b92509050818404811115613df057613def613792565b5b81810290505b9392505050565b6000613e0882612f38565b9150613e138361347b565b9250613e407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d2a565b905092915050565b6000613e5382612f38565b9150613e5e83612f38565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9757613e96613792565b5b828202905092915050565b6000606082019050613eb760008301866130d6565b613ec460208301856130d6565b613ed16040830184612f42565b949350505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613f35602583612f77565b9150613f4082613ed9565b604082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f45524332303a20746f74616c20746178206d757374206e6f742062652067726560008201527f61746572207468616e2031302500000000000000000000000000000000000000602082015250565b6000613fc7602d83612f77565b9150613fd282613f6b565b604082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b60006040820190506140126000830185612f0e565b61401f60208301846130d6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614082602683612f77565b915061408d82614026565b604082019050919050565b600060208201905081810360008301526140b181614075565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614114602483612f77565b915061411f826140b8565b604082019050919050565b6000602082019050818103600083015261414381614107565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a6602283612f77565b91506141b18261414a565b604082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614238602583612f77565b9150614243826141dc565b604082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006142ca602383612f77565b91506142d58261426e565b604082019050919050565b600060208201905081810360008301526142f9816142bd565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061435c602683612f77565b915061436782614300565b604082019050919050565b6000602082019050818103600083015261438b8161434f565b9050919050565b600061439d82612f38565b91506143a883612f38565b92508282039050818111156143c0576143bf613792565b5b92915050565b7f4661696c656420746f2073656e64204554480000000000000000000000000000600082015250565b60006143fc601283612f77565b9150614407826143c6565b602082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473207460008201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000602082015250565b600061448e603983612f77565b915061449982614432565b604082019050919050565b600060208201905081810360008301526144bd81614481565b9050919050565b7f45524332303a2062616c616e636520616d6f756e74206578636565646564206d60008201527f61782077616c6c657420616d6f756e74206c696d697400000000000000000000602082015250565b6000614520603683612f77565b915061452b826144c4565b604082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061458c602083612f77565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006145f8601d83612f77565b9150614603826145c2565b602082019050919050565b60006020820190508181036000830152614627816145eb565b9050919050565b60006060820190506146436000830186612f42565b6146506020830185612f42565b61465d6040830184612f42565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146a381613032565b92915050565b6000602082840312156146bf576146be613028565b5b60006146cd84828501614694565b91505092915050565b6000819050919050565b60006146fb6146f66146f1846146d6565b61327e565b612f38565b9050919050565b61470b816146e0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474681612efc565b82525050565b6000614758838361473d565b60208301905092915050565b6000602082019050919050565b600061477c82614711565b614786818561471c565b93506147918361472d565b8060005b838110156147c25781516147a9888261474c565b97506147b483614764565b925050600181019050614795565b5085935050505092915050565b600060a0820190506147e46000830188612f42565b6147f16020830187614702565b81810360408301526148038186614771565b90506148126060830185612f0e565b61481f6080830184612f42565b9695505050505050565b600060c08201905061483e6000830189612f0e565b61484b6020830188612f42565b6148586040830187614702565b6148656060830186614702565b6148726080830185612f0e565b61487f60a0830184612f42565b979650505050505050565b6000815190506148998161305e565b92915050565b6000806000606084860312156148b8576148b7613028565b5b60006148c68682870161488a565b93505060206148d78682870161488a565b92505060406148e88682870161488a565b915050925092509256fea2646970667358221220a5080f79a00d365a6765d7583ff8bbbdb85b3a4bac6bb905fcbf2803df067bba64736f6c63430008100033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063768dc7101161015a578063af8af690116100c1578063df1d099e1161007a578063df1d099e14610a67578063df8408fe14610a92578063f1b2b3d914610abb578063f2fde38b14610af8578063f345bd8514610b21578063fbee93ba14610b4c57610293565b8063af8af6901461091d578063b5c78e8a1461095a578063bb85c6d114610997578063c0fdea57146109d4578063d12a7688146109ff578063dd62ed3e14610a2a57610293565b8063a2330d9711610113578063a2330d97146107f6578063a3996f7b14610836578063a457c2d71461084d578063a9059cbb1461088a578063aa4bde28146108c7578063ad16a0cf146108f257610293565b8063768dc710146106d05780637930ef691461070d57806381bfdcca146107385780638c0b5e22146107755780638da5cb5b146107a057806395d89b41146107cb57610293565b806330b63d80116101fe57806363cdf60f116101b757806363cdf60f146105ab578063677daa57146105eb57806370a0823114610628578063715018a61461066557806373c503b31461067c57806375f0a874146106a557610293565b806330b63d8014610473578063313ce567146104b057806339509351146104db57806349bd5a5e146105185780634fa74c4d14610543578063527ffabd1461058057610293565b80631694505e116102505780631694505e1461037257806316a7b1601461039d57806318160ddd146103b957806318bc47f6146103e45780631b56bbf91461040d57806323b872dd1461043657610293565b806303fd2a4514610298578063054dee0f146102c357806306fdde03146102ee578063095ea7b3146103195780630f1d7ad91461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610b77565b6040516102ba9190612f1d565b60405180910390f35b3480156102cf57600080fd5b506102d8610b9d565b6040516102e59190612f51565b60405180910390f35b3480156102fa57600080fd5b50610303610ba3565b6040516103109190612ffc565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b919061308a565b610c35565b60405161034d91906130e5565b60405180910390f35b610370600480360381019061036b9190613235565b610c58565b005b34801561037e57600080fd5b50610387610e38565b60405161039491906132dd565b60405180910390f35b6103b760048036038101906103b29190613235565b610e5c565b005b3480156103c557600080fd5b506103ce61103c565b6040516103db9190612f51565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190613324565b611046565b005b34801561041957600080fd5b50610434600480360381019061042f91906133bb565b6111bc565b005b34801561044257600080fd5b5061045d600480360381019061045891906133e8565b61133e565b60405161046a91906130e5565b60405180910390f35b34801561047f57600080fd5b5061049a6004803603810190610495919061343b565b61136d565b6040516104a791906130e5565b60405180910390f35b3480156104bc57600080fd5b506104c561147b565b6040516104d29190613497565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd919061308a565b611484565b60405161050f91906130e5565b60405180910390f35b34801561052457600080fd5b5061052d6114bb565b60405161053a9190612f1d565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906134b2565b6114e1565b60405161057791906130e5565b60405180910390f35b34801561058c57600080fd5b50610595611557565b6040516105a29190612f51565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613235565b61155d565b6040516105e2949392919061350e565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d919061355a565b611638565b60405161061f91906130e5565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906133bb565b611652565b60405161065c9190612f51565b60405180910390f35b34801561067157600080fd5b5061067a61169a565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613587565b6116ae565b005b3480156106b157600080fd5b506106ba611782565b6040516106c79190612f1d565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906133bb565b6117a8565b60405161070491906130e5565b60405180910390f35b34801561071957600080fd5b506107226117c8565b60405161072f9190612f51565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a919061355a565b6117ce565b60405161076c91906130e5565b60405180910390f35b34801561078157600080fd5b5061078a6117e8565b6040516107979190612f51565b60405180910390f35b3480156107ac57600080fd5b506107b56117ee565b6040516107c29190612f1d565b60405180910390f35b3480156107d757600080fd5b506107e0611818565b6040516107ed9190612ffc565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613235565b6118aa565b60405161082d949392919061350e565b60405180910390f35b34801561084257600080fd5b5061084b611985565b005b34801561085957600080fd5b50610874600480360381019061086f919061308a565b6119ff565b60405161088191906130e5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061308a565b611a76565b6040516108be91906130e5565b60405180910390f35b3480156108d357600080fd5b506108dc611a99565b6040516108e99190612f51565b60405180910390f35b3480156108fe57600080fd5b50610907611a9f565b6040516109149190612f51565b60405180910390f35b34801561092957600080fd5b50610944600480360381019061093f919061343b565b611aa5565b60405161095191906130e5565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c91906134b2565b611b16565b60405161098e9190612f51565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b991906133bb565b611b72565b6040516109cb91906130e5565b60405180910390f35b3480156109e057600080fd5b506109e9611cc5565b6040516109f69190612f51565b60405180910390f35b348015610a0b57600080fd5b50610a14611ccb565b604051610a219190612f51565b60405180910390f35b348015610a3657600080fd5b50610a516004803603810190610a4c91906135da565b611cd1565b604051610a5e9190612f51565b60405180910390f35b348015610a7357600080fd5b50610a7c611d58565b604051610a899190612f51565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab4919061361a565b611d5e565b005b348015610ac757600080fd5b50610ae26004803603810190610add91906134b2565b611dfa565b604051610aef9190612f51565b60405180910390f35b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906133bb565b611e56565b005b348015610b2d57600080fd5b50610b36611ed9565b604051610b439190612f51565b60405180910390f35b348015610b5857600080fd5b50610b61611edf565b604051610b6e9190612f51565b60405180910390f35b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b606060038054610bb290613689565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde90613689565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b5050505050905090565b600080610c40611ee5565b9050610c4d818585611eed565b600191505092915050565b601654341015610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090613772565b60405180910390fd5b3460106000828254610d0b91906137c1565b92505081905550610d4133600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601584604051610d729190613831565b908152602001604051809103902060030154610d8e91906137c1565b815250601582604051610da19190613831565b90815260200160405180910390206000820151816000019081610dc491906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f1151228142604051610e2d929190613abc565b60405180910390a150565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b601654341015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613772565b60405180910390fd5b3460106000828254610f0f91906137c1565b92505081905550610f4533600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601484604051610f769190613831565b908152602001604051809103902060030154610f9291906137c1565b815250601482604051610fa59190613831565b90815260200160405180910390206000820151816000019081610fc891906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c5088142604051611031929190613abc565b60405180910390a150565b6000600254905090565b61104e612646565b83156110e75760405180608001604052808681526020018415158152602001838152602001828152506015866040516110879190613831565b908152602001604051809103902060008201518160000190816110aa91906139ea565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030155905050611176565b604051806080016040528086815260200184151581526020018381526020018281525060148660405161111a9190613831565b9081526020016040518091039020600082015181600001908161113d91906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050505b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf85858585856040516111ad959493929190613aec565b60405180910390a15050505050565b6111c4612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b90613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613bb8565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f816040516113339190612f1d565b60405180910390a150565b600080611349611ee5565b90506113568582856126c4565b6113618585856120b6565b60019150509392505050565b6000611377612646565b60626009546113869190613c07565b83106113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90613caa565b60405180910390fd5b60626009546113d69190613c07565b8210611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90613caa565b60405180910390fd5b600860009054906101000a900460ff16600a6114339190613dfd565b8361143e9190613e48565b601281905550600860009054906101000a900460ff16600a6114609190613dfd565b8261146b9190613e48565b6013819055506001905092915050565b60006009905090565b60008061148f611ee5565b90506114b08185856114a18589611cd1565b6114ab91906137c1565b611eed565b600191505092915050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000811561151f576015836040516114f99190613831565b908152602001604051809103902060010160009054906101000a900460ff169050611551565b60148360405161152f9190613831565b908152602001604051809103902060010160009054906101000a900460ff1690505b92915050565b600b5481565b60148180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461159690613689565b80601f01602080910402602001604051908101604052809291908181526020018280546115c290613689565b801561160f5780601f106115e45761010080835404028352916020019161160f565b820191906000526020600020905b8154815290600101906020018083116115f257829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b6000611642612646565b81600c8190555060019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116a2612646565b6116ac6000612750565b565b6116b6612646565b82156116db5781156116ce57806018819055506116d6565b806016819055505b611742565b811561171357600860009054906101000a900460ff16600a6116fd9190613dfd565b816117089190613e48565b601981905550611741565b600860009054906101000a900460ff16600a61172f9190613dfd565b8161173a9190613e48565b6017819055505b5b7fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda283838360405161177593929190613ea2565b60405180910390a1505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60185481565b60006117d8612646565b81600d8190555060019050919050565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461182790613689565b80601f016020809104026020016040519081016040528092919081815260200182805461185390613689565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090508060000180546118e390613689565b80601f016020809104026020016040519081016040528092919081815260200182805461190f90613689565b801561195c5780601f106119315761010080835404028352916020019161195c565b820191906000526020600020905b81548152906001019060200180831161193f57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b61198d612646565b6001600a819055506003600b81905550600860009054906101000a900460ff16600a6119b99190613dfd565b629896816119c79190613e48565b600c81905550600860009054906101000a900460ff16600a6119e99190613dfd565b629896816119f79190613e48565b600d81905550565b600080611a0a611ee5565b90506000611a188286611cd1565b905083811015611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613f4b565b60405180910390fd5b611a6a8286868403611eed565b60019250505092915050565b600080611a81611ee5565b9050611a8e8185856120b6565b600191505092915050565b600d5481565b60135481565b6000611aaf612646565b600a8284611abd91906137c1565b1115611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613fdd565b60405180910390fd5b82600a8190555081600b819055506001905092915050565b60008115611b4757601583604051611b2e9190613831565b9081526020016040518091039020600301549050611b6c565b601483604051611b579190613831565b90815260200160405180910390206003015490505b92915050565b6000611b7c612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613bb8565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60105481565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60195481565b611d66612646565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff28282604051611dee929190613ffd565b60405180910390a15050565b60008115611e2b57601583604051611e129190613831565b9081526020016040518091039020600201549050611e50565b601483604051611e3b9190613831565b90815260200160405180910390206002015490505b92915050565b611e5e612646565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614098565b60405180910390fd5b611ed681612750565b50565b600a5481565b60175481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f539061412a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906141bc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120a99190612f51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c9061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906142e0565b60405180910390fd5b8061219e84611652565b10156121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614372565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806122885750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80156122a15750601a60149054906101000a900460ff16155b1561263557601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123fa57600060105461230930611652565b6123139190614392565b9050601254811061232a57612329601254612816565b5b601354601054106123f8576123406013546128d7565b601354601060008282546123549190614392565b925050819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050509050806123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614412565b60405180910390fd5b505b505b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061249d5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156124aa57819050612624565b600c548211156124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e6906144a4565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361259d57600d5461255084611652565b8361255b91906137c1565b111561259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614536565b60405180910390fd5b5b60006064600b54846125af9190613e48565b6125b99190613c07565b905060006064600a54856125cd9190613e48565b6125d79190613c07565b905080826125e591906137c1565b846125f09190614392565b9250816010600082825461260491906137c1565b925050819055506126218630838561261c91906137c1565b612b4a565b50505b61262f848483612b4a565b50612641565b612640838383612b4a565b5b505050565b61264e611ee5565b73ffffffffffffffffffffffffffffffffffffffff1661266c6117ee565b73ffffffffffffffffffffffffffffffffffffffff16146126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b9906145a2565b60405180910390fd5b565b60006126d08484611cd1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461274a578181101561273c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127339061460e565b60405180910390fd5b6127498484848403611eed565b5b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601a60146101000a81548160ff02191690831515021790555060006002826128409190613c07565b9050600081836128509190614392565b90506000479050612860836128d7565b6000814761286e9190614392565b905061287a8382612daa565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516128ad9392919061462e565b60405180910390a1505050506000601a60146101000a81548160ff02191690831515021790555050565b6001601a60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff81111561290f5761290e61310a565b5b60405190808252806020026020018201604052801561293d5781602001602082028036833780820191505090505b509050308160008151811061295557612954614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e91906146a9565b81600181518110612a3257612a31614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a97307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611eed565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612af99594939291906147cf565b600060405180830381600087803b158015612b1357600080fd5b505af1158015612b27573d6000803e3d6000fd5b50505050506000601a60146101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb09061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1f906142e0565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590614372565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d9c9190612f51565b60405180910390a350505050565b6001601a60146101000a81548160ff021916908315150217905550612df0307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611eed565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612e7796959493929190614829565b60606040518083038185885af1158015612e95573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612eba919061489f565b5050506000601a60146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f0782612edc565b9050919050565b612f1781612efc565b82525050565b6000602082019050612f326000830184612f0e565b92915050565b6000819050919050565b612f4b81612f38565b82525050565b6000602082019050612f666000830184612f42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa6578082015181840152602081019050612f8b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fce82612f6c565b612fd88185612f77565b9350612fe8818560208601612f88565b612ff181612fb2565b840191505092915050565b600060208201905081810360008301526130168184612fc3565b905092915050565b6000604051905090565b600080fd5b600080fd5b61303b81612efc565b811461304657600080fd5b50565b60008135905061305881613032565b92915050565b61306781612f38565b811461307257600080fd5b50565b6000813590506130848161305e565b92915050565b600080604083850312156130a1576130a0613028565b5b60006130af85828601613049565b92505060206130c085828601613075565b9150509250929050565b60008115159050919050565b6130df816130ca565b82525050565b60006020820190506130fa60008301846130d6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61314282612fb2565b810181811067ffffffffffffffff821117156131615761316061310a565b5b80604052505050565b600061317461301e565b90506131808282613139565b919050565b600067ffffffffffffffff8211156131a05761319f61310a565b5b6131a982612fb2565b9050602081019050919050565b82818337600083830152505050565b60006131d86131d384613185565b61316a565b9050828152602081018484840111156131f4576131f3613105565b5b6131ff8482856131b6565b509392505050565b600082601f83011261321c5761321b613100565b5b813561322c8482602086016131c5565b91505092915050565b60006020828403121561324b5761324a613028565b5b600082013567ffffffffffffffff8111156132695761326861302d565b5b61327584828501613207565b91505092915050565b6000819050919050565b60006132a361329e61329984612edc565b61327e565b612edc565b9050919050565b60006132b582613288565b9050919050565b60006132c7826132aa565b9050919050565b6132d7816132bc565b82525050565b60006020820190506132f260008301846132ce565b92915050565b613301816130ca565b811461330c57600080fd5b50565b60008135905061331e816132f8565b92915050565b600080600080600060a086880312156133405761333f613028565b5b600086013567ffffffffffffffff81111561335e5761335d61302d565b5b61336a88828901613207565b955050602061337b8882890161330f565b945050604061338c8882890161330f565b935050606061339d88828901613075565b92505060806133ae88828901613075565b9150509295509295909350565b6000602082840312156133d1576133d0613028565b5b60006133df84828501613049565b91505092915050565b60008060006060848603121561340157613400613028565b5b600061340f86828701613049565b935050602061342086828701613049565b925050604061343186828701613075565b9150509250925092565b6000806040838503121561345257613451613028565b5b600061346085828601613075565b925050602061347185828601613075565b9150509250929050565b600060ff82169050919050565b6134918161347b565b82525050565b60006020820190506134ac6000830184613488565b92915050565b600080604083850312156134c9576134c8613028565b5b600083013567ffffffffffffffff8111156134e7576134e661302d565b5b6134f385828601613207565b92505060206135048582860161330f565b9150509250929050565b600060808201905081810360008301526135288187612fc3565b905061353760208301866130d6565b6135446040830185612f42565b6135516060830184612f42565b95945050505050565b6000602082840312156135705761356f613028565b5b600061357e84828501613075565b91505092915050565b6000806000606084860312156135a05761359f613028565b5b60006135ae8682870161330f565b93505060206135bf8682870161330f565b92505060406135d086828701613075565b9150509250925092565b600080604083850312156135f1576135f0613028565b5b60006135ff85828601613049565b925050602061361085828601613049565b9150509250929050565b6000806040838503121561363157613630613028565b5b600061363f85828601613049565b92505060206136508582860161330f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136a157607f821691505b6020821081036136b4576136b361365a565b5b50919050565b7f4e6f7420656e6f756768204554482073656e7421000000000000000000000000600082015250565b60006136f0601483612f77565b91506136fb826136ba565b602082019050919050565b6000602082019050818103600083015261371f816136e3565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b600061375c601283612f77565b915061376782613726565b602082019050919050565b6000602082019050818103600083015261378b8161374f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137cc82612f38565b91506137d783612f38565b92508282019050808211156137ef576137ee613792565b5b92915050565b600081905092915050565b600061380b82612f6c565b61381581856137f5565b9350613825818560208601612f88565b80840191505092915050565b600061383d8284613800565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261386d565b6138b4868361386d565b95508019841693508086168417925050509392505050565b60006138e76138e26138dd84612f38565b61327e565b612f38565b9050919050565b6000819050919050565b613901836138cc565b61391561390d826138ee565b84845461387a565b825550505050565b600090565b61392a61391d565b6139358184846138f8565b505050565b5b818110156139595761394e600082613922565b60018101905061393b565b5050565b601f82111561399e5761396f81613848565b6139788461385d565b81016020851015613987578190505b61399b6139938561385d565b83018261393a565b50505b505050565b600082821c905092915050565b60006139c1600019846008026139a3565b1980831691505092915050565b60006139da83836139b0565b9150826002028217905092915050565b6139f382612f6c565b67ffffffffffffffff811115613a0c57613a0b61310a565b5b613a168254613689565b613a2182828561395d565b600060209050601f831160018114613a545760008415613a42578287015190505b613a4c85826139ce565b865550613ab4565b601f198416613a6286613848565b60005b82811015613a8a57848901518255600182019150602085019450602081019050613a65565b86831015613aa75784890151613aa3601f8916826139b0565b8355505b6001600288020188555050505b505050505050565b60006040820190508181036000830152613ad68185612fc3565b9050613ae56020830184612f42565b9392505050565b600060a0820190508181036000830152613b068188612fc3565b9050613b1560208301876130d6565b613b2260408301866130d6565b613b2f6060830185612f42565b613b3c6080830184612f42565b9695505050505050565b7f4c5020506169722063616e6e6f742062652074686520446561642077616c6c6560008201527f742c206f72203021000000000000000000000000000000000000000000000000602082015250565b6000613ba2602883612f77565b9150613bad82613b46565b604082019050919050565b60006020820190508181036000830152613bd181613b95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c1282612f38565b9150613c1d83612f38565b925082613c2d57613c2c613bd8565b5b828204905092915050565b7f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f6660008201527f2074686520737570706c79206174206f6e636521000000000000000000000000602082015250565b6000613c94603483612f77565b9150613c9f82613c38565b604082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613d2157808604811115613cfd57613cfc613792565b5b6001851615613d0c5780820291505b8081029050613d1a85613cca565b9450613ce1565b94509492505050565b600082613d3a5760019050613df6565b81613d485760009050613df6565b8160018114613d5e5760028114613d6857613d97565b6001915050613df6565b60ff841115613d7a57613d79613792565b5b8360020a915084821115613d9157613d90613792565b5b50613df6565b5060208310610133831016604e8410600b8410161715613dcc5782820a905083811115613dc757613dc6613792565b5b613df6565b613dd98484846001613cd7565b92509050818404811115613df057613def613792565b5b81810290505b9392505050565b6000613e0882612f38565b9150613e138361347b565b9250613e407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d2a565b905092915050565b6000613e5382612f38565b9150613e5e83612f38565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9757613e96613792565b5b828202905092915050565b6000606082019050613eb760008301866130d6565b613ec460208301856130d6565b613ed16040830184612f42565b949350505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613f35602583612f77565b9150613f4082613ed9565b604082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f45524332303a20746f74616c20746178206d757374206e6f742062652067726560008201527f61746572207468616e2031302500000000000000000000000000000000000000602082015250565b6000613fc7602d83612f77565b9150613fd282613f6b565b604082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b60006040820190506140126000830185612f0e565b61401f60208301846130d6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614082602683612f77565b915061408d82614026565b604082019050919050565b600060208201905081810360008301526140b181614075565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614114602483612f77565b915061411f826140b8565b604082019050919050565b6000602082019050818103600083015261414381614107565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a6602283612f77565b91506141b18261414a565b604082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614238602583612f77565b9150614243826141dc565b604082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006142ca602383612f77565b91506142d58261426e565b604082019050919050565b600060208201905081810360008301526142f9816142bd565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061435c602683612f77565b915061436782614300565b604082019050919050565b6000602082019050818103600083015261438b8161434f565b9050919050565b600061439d82612f38565b91506143a883612f38565b92508282039050818111156143c0576143bf613792565b5b92915050565b7f4661696c656420746f2073656e64204554480000000000000000000000000000600082015250565b60006143fc601283612f77565b9150614407826143c6565b602082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473207460008201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000602082015250565b600061448e603983612f77565b915061449982614432565b604082019050919050565b600060208201905081810360008301526144bd81614481565b9050919050565b7f45524332303a2062616c616e636520616d6f756e74206578636565646564206d60008201527f61782077616c6c657420616d6f756e74206c696d697400000000000000000000602082015250565b6000614520603683612f77565b915061452b826144c4565b604082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061458c602083612f77565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006145f8601d83612f77565b9150614603826145c2565b602082019050919050565b60006020820190508181036000830152614627816145eb565b9050919050565b60006060820190506146436000830186612f42565b6146506020830185612f42565b61465d6040830184612f42565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146a381613032565b92915050565b6000602082840312156146bf576146be613028565b5b60006146cd84828501614694565b91505092915050565b6000819050919050565b60006146fb6146f66146f1846146d6565b61327e565b612f38565b9050919050565b61470b816146e0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474681612efc565b82525050565b6000614758838361473d565b60208301905092915050565b6000602082019050919050565b600061477c82614711565b614786818561471c565b93506147918361472d565b8060005b838110156147c25781516147a9888261474c565b97506147b483614764565b925050600181019050614795565b5085935050505092915050565b600060a0820190506147e46000830188612f42565b6147f16020830187614702565b81810360408301526148038186614771565b90506148126060830185612f0e565b61481f6080830184612f42565b9695505050505050565b600060c08201905061483e6000830189612f0e565b61484b6020830188612f42565b6148586040830187614702565b6148656060830186614702565b6148726080830185612f0e565b61487f60a0830184612f42565b979650505050505050565b6000815190506148998161305e565b92915050565b6000806000606084860312156148b8576148b7613028565b5b60006148c68682870161488a565b93505060206148d78682870161488a565b92505060406148e88682870161488a565b915050925092509256fea2646970667358221220a5080f79a00d365a6765d7583ff8bbbdb85b3a4bac6bb905fcbf2803df067bba64736f6c63430008100033

Deployed Bytecode Sourcemap

29314:13336:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30001:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31041:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19032:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21306:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32375:594;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35083:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31791:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20170:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33849:694;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36348:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22130:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41612:602;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20013:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23846:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35141:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33016:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29699:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30919:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;42222:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19197:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16291:103;;;;;;;;;;;;;:::i;:::-;;34551:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29919:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30116:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31143:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42412:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29795:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15643:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18856:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30976:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;30321:211;;;;;;;;;;;;;:::i;:::-;;22930:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20750:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29855:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30249:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41213:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33278:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40855:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30072:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30173:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20343:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31188:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39266:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33548:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16549:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29603:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31084:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30001:64;;;;;;;;;;;;;:::o;31041:36::-;;;;:::o;19032:102::-;19088:13;19121:5;19114:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19032:102;:::o;21306:244::-;21427:4;21449:13;21465:12;:10;:12::i;:::-;21449:28;;21488:32;21497:5;21504:7;21513:6;21488:8;:32::i;:::-;21538:4;21531:11;;;21306:244;;;;:::o;32375:594::-;32473:11;;32460:9;:24;;32452:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32550:14;;32528:10;:18;;;:36;;32520:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32620:9;32598:18;;:31;;;;;;;:::i;:::-;;;;;;;;32640:43;32650:10;32662:4;;;;;;;;;;;32668:14;;32640:9;:43::i;:::-;32735:166;;;;;;;;32763:10;32735:166;;;;32788:4;32735:166;;;;;;32807:15;32735:166;;;;32881:9;32837:16;32854:10;32837:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;:53;;;;:::i;:::-;32735:166;;;32704:16;32721:10;32704:28;;;;;;:::i;:::-;;;;;;;;;;;;;:197;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32917:44;32933:10;32945:15;32917:44;;;;;;;:::i;:::-;;;;;;;;32375:594;:::o;35083:51::-;;;:::o;31791:576::-;31887:11;;31874:9;:24;;31866:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31964:14;;31942:10;:18;;;:36;;31934:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32034:9;32012:18;;:31;;;;;;;:::i;:::-;;;;;;;;32054:43;32064:10;32076:4;;;;;;;;;;;32082:14;;32054:9;:43::i;:::-;32139:162;;;;;;;;32164:11;32139:162;;;;32190:4;32139:162;;;;;;32209:15;32139:162;;;;32281:9;32239:13;32253:11;32239:26;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;:51;;;;:::i;:::-;32139:162;;;32110:13;32124:11;32110:26;;;;;;:::i;:::-;;;;;;;;;;;;;:191;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32317:42;32330:11;32343:15;32317:42;;;;;;;:::i;:::-;;;;;;;;31791:576;:::o;20170:110::-;20233:7;20260:12;;20253:19;;20170:110;:::o;33849:694::-;15529:13;:11;:13::i;:::-;34015:10:::1;34011:430;;;34075:147;;;;;;;;34107:12;34075:147;;;;34138:11;34075:147;;;;;;34168:12;34075:147;;;;34199:8;34075:147;;::::0;34042:16:::1;34059:12;34042:30;;;;;;:::i;:::-;;;;;;;;;;;;;:180;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34011:430;;;34285:144;;;;;;;;34314:12;34285:144;;;;34345:11;34285:144;;;;;;34375:12;34285:144;;;;34406:8;34285:144;;::::0;34255:13:::1;34269:12;34255:27;;;;;;:::i;:::-;;;;;;;;;;;;;:174;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34011:430;34456:79;34473:12;34487:10;34499:11;34512:12;34526:8;34456:79;;;;;;;;;;:::i;:::-;;;;;;;;33849:694:::0;;;;;:::o;36348:288::-;15529:13;:11;:13::i;:::-;36430:4:::1;;;;;;;;;;;36421:13;;:5;:13;;::::0;36413:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36515:1;36498:19;;:5;:19;;::::0;36490:72:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36589:5;36573:13;;:21;;;;;;;;;;;;;;;;;;36610:18;36622:5;36610:18;;;;;;:::i;:::-;;;;;;;;36348:288:::0;:::o;22130:297::-;22263:4;22280:15;22298:12;:10;:12::i;:::-;22280:30;;22321:38;22337:4;22343:7;22352:6;22321:15;:38::i;:::-;22370:27;22380:4;22386:2;22390:6;22370:9;:27::i;:::-;22415:4;22408:11;;;22130:297;;;;;:::o;41612:602::-;41769:4;15529:13;:11;:13::i;:::-;41842:2:::1;41832:7;;:12;;;;:::i;:::-;41799:30;:45;41791:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41957:2;41947:7;;:12;;;;:::i;:::-;41920:24;:39;41912:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;42096:9;;;;;;;;;;;42092:2;:13;;;;:::i;:::-;42059:30;:46;;;;:::i;:::-;42027:29;:78;;;;42173:9;;;;;;;;;;;42169:2;:13;;;;:::i;:::-;42142:24;:40;;;;:::i;:::-;42116:23;:66;;;;42202:4;42195:11;;41612:602:::0;;;;:::o;20013:92::-;20071:5;20096:1;20089:8;;20013:92;:::o;23846:272::-;23963:4;23985:13;24001:12;:10;:12::i;:::-;23985:28;;24024:64;24033:5;24040:7;24077:10;24049:25;24059:5;24066:7;24049:9;:25::i;:::-;:38;;;;:::i;:::-;24024:8;:64::i;:::-;24106:4;24099:11;;;23846:272;;;;:::o;35141:28::-;;;;;;;;;;;;;:::o;33016:254::-;33103:4;33124:10;33120:89;;;33158:16;33175:12;33158:30;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;;;;;;;33151:46;;;;33120:89;33226:13;33240:12;33226:27;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;;;;;;;;;;33219:43;;33016:254;;;;;:::o;29699:35::-;;;;:::o;30919:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42222:182::-;42324:4;15529:13;:11;:13::i;:::-;42360:12:::1;42346:11;:26;;;;42392:4;42385:11;;42222:182:::0;;;:::o;19197:177::-;19316:7;19348:9;:18;19358:7;19348:18;;;;;;;;;;;;;;;;19341:25;;19197:177;;;:::o;16291:103::-;15529:13;:11;:13::i;:::-;16356:30:::1;16383:1;16356:18;:30::i;:::-;16291:103::o:0;34551:524::-;15529:13;:11;:13::i;:::-;34644:6:::1;34640:374;;;34671:10;34667:133;;;34719:5;34702:14;:22;;;;34667:133;;;34779:5;34765:11;:19;;;;34667:133;34640:374;;;34836:10;34832:171;;;34899:9;;;;;;;;;;;34895:2;:13;;;;:::i;:::-;34887:5;:21;;;;:::i;:::-;34867:17;:41;;;;34832:171;;;34978:9;;;;;;;;;;;34974:2;:13;;;;:::i;:::-;34966:5;:21;;;;:::i;:::-;34949:14;:38;;;;34832:171;34640:374;35029:38;35041:6;35049:10;35061:5;35029:38;;;;;;;;:::i;:::-;;;;;;;;34551:524:::0;;;:::o;29919:75::-;;;;;;;;;;;;;:::o;30116:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;31143:38::-;;;;:::o;42412:198::-;42522:4;15529:13;:11;:13::i;:::-;42562:16:::1;42544:15;:34;;;;42598:4;42591:11;;42412:198:::0;;;:::o;29795:53::-;;;;:::o;15643:87::-;15689:7;15716:6;;;;;;;;;;;15709:13;;15643:87;:::o;18856:106::-;18914:13;18947:7;18940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18856:106;:::o;30976:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30321:211::-;15529:13;:11;:13::i;:::-;30391:1:::1;30373:15;:19;;;;30421:1;30403:15;:19;;;;30462:9;;;;;;;;;;;30458:2;:13;;;;:::i;:::-;30447:8;:24;;;;:::i;:::-;30433:11;:38;;;;30515:9;;;;;;;;;;;30511:2;:13;;;;:::i;:::-;30500:8;:24;;;;:::i;:::-;30482:15;:42;;;;30321:211::o:0;22930:507::-;23052:4;23074:13;23090:12;:10;:12::i;:::-;23074:28;;23113:24;23140:25;23150:5;23157:7;23140:9;:25::i;:::-;23113:52;;23218:15;23198:16;:35;;23176:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;23334:60;23343:5;23350:7;23378:15;23359:16;:34;23334:8;:60::i;:::-;23425:4;23418:11;;;;22930:507;;;;:::o;20750:236::-;20867:4;20889:13;20905:12;:10;:12::i;:::-;20889:28;;20928;20938:5;20945:2;20949:6;20928:9;:28::i;:::-;20974:4;20967:11;;;20750:236;;;;:::o;29855:57::-;;;;:::o;30249:63::-;;;;:::o;41213:391::-;41361:4;15529:13;:11;:13::i;:::-;41430:2:::1;41409:16;41392;:33;;;;:::i;:::-;41391:41;;41383:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41511:16;41493:15;:34;;;;41556:16;41538:15;:34;;;;41592:4;41585:11;;41213:391:::0;;;;:::o;33278:262::-;33365:4;33386:10;33382:93;;;33420:16;33437:12;33420:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;33413:50;;;;33382:93;33492:13;33506:12;33492:27;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;33485:47;;33278:262;;;;;:::o;40855:350::-;40958:4;15529:13;:11;:13::i;:::-;41001:4:::1;;;;;;;;;;;40988:17;;:9;:17;;::::0;40980:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41090:1;41069:23;;:9;:23;;::::0;41061:76:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41166:9;41148:15;;:27;;;;;;;;;;;;;;;;;;41193:4;41186:11;;40855:350:::0;;;:::o;30072:37::-;;;;:::o;30173:69::-;;;;:::o;20343:201::-;20477:7;20509:11;:18;20521:5;20509:18;;;;;;;;;;;;;;;:27;20528:7;20509:27;;;;;;;;;;;;;;;;20502:34;;20343:201;;;;:::o;31188:54::-;;;;:::o;39266:189::-;15529:13;:11;:13::i;:::-;39383:7:::1;39352:18;:28;39371:8;39352:28;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;39406:41;39429:8;39439:7;39406:41;;;;;;;:::i;:::-;;;;;;;;39266:189:::0;;:::o;33548:262::-;33639:4;33660:10;33656:91;;;33694:16;33711:12;33694:30;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;33687:48;;;;33656:91;33764:13;33778:12;33764:27;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;;33757:45;;33548:262;;;;;:::o;16549:238::-;15529:13;:11;:13::i;:::-;16672:1:::1;16652:22;;:8;:22;;::::0;16630:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16751:28;16770:8;16751:18;:28::i;:::-;16549:238:::0;:::o;29603:35::-;;;;:::o;31084:50::-;;;;:::o;14436:98::-;14489:7;14516:10;14509:17;;14436:98;:::o;26153:380::-;26306:1;26289:19;;:5;:19;;;26281:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26387:1;26368:21;;:7;:21;;;26360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26471:6;26441:11;:18;26453:5;26441:18;;;;;;;;;;;;;;;:27;26460:7;26441:27;;;;;;;;;;;;;;;:36;;;;26509:7;26493:32;;26502:5;26493:32;;;26518:6;26493:32;;;;;;:::i;:::-;;;;;;;;26153:380;;;:::o;37114:2144::-;37228:1;37212:18;;:4;:18;;;37204:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37305:1;37291:16;;:2;:16;;;37283:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37385:6;37366:15;37376:4;37366:9;:15::i;:::-;:25;;37358:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37460:13;;;;;;;;;;;37452:21;;:4;:21;;;:44;;;;37483:13;;;;;;;;;;;37477:19;;:2;:19;;;37452:44;37451:67;;;;;37502:16;;;;;;;;;;;37501:17;37451:67;37447:1804;;;37547:13;;;;;;;;;;;37539:21;;:4;:21;;;37535:681;;37581:32;37643:18;;37616:24;37634:4;37616:9;:24::i;:::-;:45;;;;:::i;:::-;37581:80;;37712:29;;37684:24;:57;37680:152;;37766:46;37782:29;;37766:15;:46::i;:::-;37680:152;37878:23;;37855:18;;37854:47;37850:351;;37926:42;37944:23;;37926:17;:42::i;:::-;38013:23;;37991:18;;:45;;;;;;;:::i;:::-;;;;;;;;38059:9;38079:15;;;;;;;;;;;38071:29;;:52;38101:21;38071:52;;;;;;;;;;;;;;;;;;;;;;;38059:64;;38154:4;38146:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;37903:298;37850:351;37562:654;37535:681;38232:22;38273:18;:24;38292:4;38273:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;38301:18;:22;38320:2;38301:22;;;;;;;;;;;;;;;;;;;;;;;;;38273:50;38269:839;;;38361:6;38344:23;;38269:839;;;38440:11;;38430:6;:21;;38422:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;38543:13;;;;;;;;;;;38535:21;;:4;:21;;;38532:178;;38616:15;;38598:13;38608:2;38598:9;:13::i;:::-;38589:6;:22;;;;:::i;:::-;38588:43;;38580:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38532:178;38730:22;38785:3;38766:15;;38757:6;:24;;;;:::i;:::-;38756:32;;;;:::i;:::-;38730:59;;38808:22;38863:3;38844:15;;38835:6;:24;;;;:::i;:::-;38834:32;;;;:::i;:::-;38808:59;;38930:14;38913;:31;;;;:::i;:::-;38903:6;:42;;;;:::i;:::-;38886:59;;38986:14;38964:18;;:36;;;;;;;:::i;:::-;;;;;;;;39021:71;39037:4;39051;39076:14;39059;:31;;;;:::i;:::-;39021:15;:71::i;:::-;38403:705;;38269:839;39122:41;39138:4;39144:2;39148:14;39122:15;:41::i;:::-;37520:1655;37447:1804;;;39206:33;39222:4;39228:2;39232:6;39206:15;:33::i;:::-;37447:1804;37114:2144;;;:::o;15808:132::-;15883:12;:10;:12::i;:::-;15872:23;;:7;:5;:7::i;:::-;:23;;;15864:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15808:132::o;26824:502::-;26959:24;26986:25;26996:5;27003:7;26986:9;:25::i;:::-;26959:52;;27046:17;27026:16;:37;27022:297;;27126:6;27106:16;:26;;27080:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27241:51;27250:5;27257:7;27285:6;27266:16;:25;27241:8;:51::i;:::-;27022:297;26948:378;26824:502;;;:::o;16947:191::-;17021:16;17040:6;;;;;;;;;;;17021:25;;17066:8;17057:6;;:17;;;;;;;;;;;;;;;;;;17121:8;17090:40;;17111:8;17090:40;;;;;;;;;;;;17010:128;16947:191;:::o;39463:474::-;35400:4;35381:16;;:23;;;;;;;;;;;;;;;;;;39549:12:::1;39588:1;39565:20;:24;;;;:::i;:::-;39549:41;;39601:17;39645:4;39622:20;:27;;;;:::i;:::-;39601:49;;39663:22;39688:21;39663:46;;39722:23;39740:4;39722:17;:23::i;:::-;39758:18;39804:14;39780:21;:38;;;;:::i;:::-;39758:61;;39832:36;39846:9;39857:10;39832:13;:36::i;:::-;39886:43;39901:4;39907:10;39919:9;39886:43;;;;;;;;:::i;:::-;;;;;;;;39538:399;;;;35446:5:::0;35427:16;;:24;;;;;;;;;;;;;;;;;;39463:474;:::o;39945:488::-;35400:4;35381:16;;:23;;;;;;;;;;;;;;;;;;40024:21:::1;40062:1;40048:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40024:40;;40093:4;40075;40080:1;40075:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;40119:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40109:4;40114:1;40109:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;40154:62;40171:4;40186:15;40204:11;40154:8;:62::i;:::-;40229:15;:66;;;40310:11;40336:1;40352:4;40379;40399:15;40229:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40013:420;35446:5:::0;35427:16;;:24;;;;;;;;;;;;;;;;;;39945:488;:::o;27334:776::-;27481:1;27465:18;;:4;:18;;;27457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27558:1;27544:16;;:2;:16;;;27536:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27613:19;27635:9;:15;27645:4;27635:15;;;;;;;;;;;;;;;;27613:37;;27698:6;27683:11;:21;;27661:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;27838:6;27824:11;:20;27806:9;:15;27816:4;27806:15;;;;;;;;;;;;;;;:38;;;;28041:6;28024:9;:13;28034:2;28024:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;28091:2;28076:26;;28085:4;28076:26;;;28095:6;28076:26;;;;;;:::i;:::-;;;;;;;;27446:664;27334:776;;;:::o;40441:406::-;35400:4;35381:16;;:23;;;;;;;;;;;;;;;;;;40558:62:::1;40575:4;40590:15;40608:11;40558:8;:62::i;:::-;40633:15;:31;;;40672:9;40705:4;40725:11;40751:1;40767::::0;40783:15:::1;;;;;;;;;;;40813;40633:206;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;35446:5:::0;35427:16;;:24;;;;;;;;;;;;;;;;;;40441:406;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:77::-;630:7;659:5;648:16;;593:77;;;:::o;676:118::-;763:24;781:5;763:24;:::i;:::-;758:3;751:37;676:118;;:::o;800:222::-;893:4;931:2;920:9;916:18;908:26;;944:71;1012:1;1001:9;997:17;988:6;944:71;:::i;:::-;800:222;;;;:::o;1028:99::-;1080:6;1114:5;1108:12;1098:22;;1028:99;;;:::o;1133:169::-;1217:11;1251:6;1246:3;1239:19;1291:4;1286:3;1282:14;1267:29;;1133:169;;;;:::o;1308:246::-;1389:1;1399:113;1413:6;1410:1;1407:13;1399:113;;;1498:1;1493:3;1489:11;1483:18;1479:1;1474:3;1470:11;1463:39;1435:2;1432:1;1428:10;1423:15;;1399:113;;;1546:1;1537:6;1532:3;1528:16;1521:27;1370:184;1308:246;;;:::o;1560:102::-;1601:6;1652:2;1648:7;1643:2;1636:5;1632:14;1628:28;1618:38;;1560:102;;;:::o;1668:377::-;1756:3;1784:39;1817:5;1784:39;:::i;:::-;1839:71;1903:6;1898:3;1839:71;:::i;:::-;1832:78;;1919:65;1977:6;1972:3;1965:4;1958:5;1954:16;1919:65;:::i;:::-;2009:29;2031:6;2009:29;:::i;:::-;2004:3;2000:39;1993:46;;1760:285;1668:377;;;;:::o;2051:313::-;2164:4;2202:2;2191:9;2187:18;2179:26;;2251:9;2245:4;2241:20;2237:1;2226:9;2222:17;2215:47;2279:78;2352:4;2343:6;2279:78;:::i;:::-;2271:86;;2051:313;;;;:::o;2370:75::-;2403:6;2436:2;2430:9;2420:19;;2370:75;:::o;2451:117::-;2560:1;2557;2550:12;2574:117;2683:1;2680;2673:12;2697:122;2770:24;2788:5;2770:24;:::i;:::-;2763:5;2760:35;2750:63;;2809:1;2806;2799:12;2750:63;2697:122;:::o;2825:139::-;2871:5;2909:6;2896:20;2887:29;;2925:33;2952:5;2925:33;:::i;:::-;2825:139;;;;:::o;2970:122::-;3043:24;3061:5;3043:24;:::i;:::-;3036:5;3033:35;3023:63;;3082:1;3079;3072:12;3023:63;2970:122;:::o;3098:139::-;3144:5;3182:6;3169:20;3160:29;;3198:33;3225:5;3198:33;:::i;:::-;3098:139;;;;:::o;3243:474::-;3311:6;3319;3368:2;3356:9;3347:7;3343:23;3339:32;3336:119;;;3374:79;;:::i;:::-;3336:119;3494:1;3519:53;3564:7;3555:6;3544:9;3540:22;3519:53;:::i;:::-;3509:63;;3465:117;3621:2;3647:53;3692:7;3683:6;3672:9;3668:22;3647:53;:::i;:::-;3637:63;;3592:118;3243:474;;;;;:::o;3723:90::-;3757:7;3800:5;3793:13;3786:21;3775:32;;3723:90;;;:::o;3819:109::-;3900:21;3915:5;3900:21;:::i;:::-;3895:3;3888:34;3819:109;;:::o;3934:210::-;4021:4;4059:2;4048:9;4044:18;4036:26;;4072:65;4134:1;4123:9;4119:17;4110:6;4072:65;:::i;:::-;3934:210;;;;:::o;4150:117::-;4259:1;4256;4249:12;4273:117;4382:1;4379;4372:12;4396:180;4444:77;4441:1;4434:88;4541:4;4538:1;4531:15;4565:4;4562:1;4555:15;4582:281;4665:27;4687:4;4665:27;:::i;:::-;4657:6;4653:40;4795:6;4783:10;4780:22;4759:18;4747:10;4744:34;4741:62;4738:88;;;4806:18;;:::i;:::-;4738:88;4846:10;4842:2;4835:22;4625:238;4582:281;;:::o;4869:129::-;4903:6;4930:20;;:::i;:::-;4920:30;;4959:33;4987:4;4979:6;4959:33;:::i;:::-;4869:129;;;:::o;5004:308::-;5066:4;5156:18;5148:6;5145:30;5142:56;;;5178:18;;:::i;:::-;5142:56;5216:29;5238:6;5216:29;:::i;:::-;5208:37;;5300:4;5294;5290:15;5282:23;;5004:308;;;:::o;5318:146::-;5415:6;5410:3;5405;5392:30;5456:1;5447:6;5442:3;5438:16;5431:27;5318:146;;;:::o;5470:425::-;5548:5;5573:66;5589:49;5631:6;5589:49;:::i;:::-;5573:66;:::i;:::-;5564:75;;5662:6;5655:5;5648:21;5700:4;5693:5;5689:16;5738:3;5729:6;5724:3;5720:16;5717:25;5714:112;;;5745:79;;:::i;:::-;5714:112;5835:54;5882:6;5877:3;5872;5835:54;:::i;:::-;5554:341;5470:425;;;;;:::o;5915:340::-;5971:5;6020:3;6013:4;6005:6;6001:17;5997:27;5987:122;;6028:79;;:::i;:::-;5987:122;6145:6;6132:20;6170:79;6245:3;6237:6;6230:4;6222:6;6218:17;6170:79;:::i;:::-;6161:88;;5977:278;5915:340;;;;:::o;6261:509::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6533:1;6522:9;6518:17;6505:31;6563:18;6555:6;6552:30;6549:117;;;6585:79;;:::i;:::-;6549:117;6690:63;6745:7;6736:6;6725:9;6721:22;6690:63;:::i;:::-;6680:73;;6476:287;6261:509;;;;:::o;6776:60::-;6804:3;6825:5;6818:12;;6776:60;;;:::o;6842:142::-;6892:9;6925:53;6943:34;6952:24;6970:5;6952:24;:::i;:::-;6943:34;:::i;:::-;6925:53;:::i;:::-;6912:66;;6842:142;;;:::o;6990:126::-;7040:9;7073:37;7104:5;7073:37;:::i;:::-;7060:50;;6990:126;;;:::o;7122:152::-;7198:9;7231:37;7262:5;7231:37;:::i;:::-;7218:50;;7122:152;;;:::o;7280:183::-;7393:63;7450:5;7393:63;:::i;:::-;7388:3;7381:76;7280:183;;:::o;7469:274::-;7588:4;7626:2;7615:9;7611:18;7603:26;;7639:97;7733:1;7722:9;7718:17;7709:6;7639:97;:::i;:::-;7469:274;;;;:::o;7749:116::-;7819:21;7834:5;7819:21;:::i;:::-;7812:5;7809:32;7799:60;;7855:1;7852;7845:12;7799:60;7749:116;:::o;7871:133::-;7914:5;7952:6;7939:20;7930:29;;7968:30;7992:5;7968:30;:::i;:::-;7871:133;;;;:::o;8010:1079::-;8109:6;8117;8125;8133;8141;8190:3;8178:9;8169:7;8165:23;8161:33;8158:120;;;8197:79;;:::i;:::-;8158:120;8345:1;8334:9;8330:17;8317:31;8375:18;8367:6;8364:30;8361:117;;;8397:79;;:::i;:::-;8361:117;8502:63;8557:7;8548:6;8537:9;8533:22;8502:63;:::i;:::-;8492:73;;8288:287;8614:2;8640:50;8682:7;8673:6;8662:9;8658:22;8640:50;:::i;:::-;8630:60;;8585:115;8739:2;8765:50;8807:7;8798:6;8787:9;8783:22;8765:50;:::i;:::-;8755:60;;8710:115;8864:2;8890:53;8935:7;8926:6;8915:9;8911:22;8890:53;:::i;:::-;8880:63;;8835:118;8992:3;9019:53;9064:7;9055:6;9044:9;9040:22;9019:53;:::i;:::-;9009:63;;8963:119;8010:1079;;;;;;;;:::o;9095:329::-;9154:6;9203:2;9191:9;9182:7;9178:23;9174:32;9171:119;;;9209:79;;:::i;:::-;9171:119;9329:1;9354:53;9399:7;9390:6;9379:9;9375:22;9354:53;:::i;:::-;9344:63;;9300:117;9095:329;;;;:::o;9430:619::-;9507:6;9515;9523;9572:2;9560:9;9551:7;9547:23;9543:32;9540:119;;;9578:79;;:::i;:::-;9540:119;9698:1;9723:53;9768:7;9759:6;9748:9;9744:22;9723:53;:::i;:::-;9713:63;;9669:117;9825:2;9851:53;9896:7;9887:6;9876:9;9872:22;9851:53;:::i;:::-;9841:63;;9796:118;9953:2;9979:53;10024:7;10015:6;10004:9;10000:22;9979:53;:::i;:::-;9969:63;;9924:118;9430:619;;;;;:::o;10055:474::-;10123:6;10131;10180:2;10168:9;10159:7;10155:23;10151:32;10148:119;;;10186:79;;:::i;:::-;10148:119;10306:1;10331:53;10376:7;10367:6;10356:9;10352:22;10331:53;:::i;:::-;10321:63;;10277:117;10433:2;10459:53;10504:7;10495:6;10484:9;10480:22;10459:53;:::i;:::-;10449:63;;10404:118;10055:474;;;;;:::o;10535:86::-;10570:7;10610:4;10603:5;10599:16;10588:27;;10535:86;;;:::o;10627:112::-;10710:22;10726:5;10710:22;:::i;:::-;10705:3;10698:35;10627:112;;:::o;10745:214::-;10834:4;10872:2;10861:9;10857:18;10849:26;;10885:67;10949:1;10938:9;10934:17;10925:6;10885:67;:::i;:::-;10745:214;;;;:::o;10965:648::-;11040:6;11048;11097:2;11085:9;11076:7;11072:23;11068:32;11065:119;;;11103:79;;:::i;:::-;11065:119;11251:1;11240:9;11236:17;11223:31;11281:18;11273:6;11270:30;11267:117;;;11303:79;;:::i;:::-;11267:117;11408:63;11463:7;11454:6;11443:9;11439:22;11408:63;:::i;:::-;11398:73;;11194:287;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;10965:648;;;;;:::o;11619:632::-;11810:4;11848:3;11837:9;11833:19;11825:27;;11898:9;11892:4;11888:20;11884:1;11873:9;11869:17;11862:47;11926:78;11999:4;11990:6;11926:78;:::i;:::-;11918:86;;12014:66;12076:2;12065:9;12061:18;12052:6;12014:66;:::i;:::-;12090:72;12158:2;12147:9;12143:18;12134:6;12090:72;:::i;:::-;12172;12240:2;12229:9;12225:18;12216:6;12172:72;:::i;:::-;11619:632;;;;;;;:::o;12257:329::-;12316:6;12365:2;12353:9;12344:7;12340:23;12336:32;12333:119;;;12371:79;;:::i;:::-;12333:119;12491:1;12516:53;12561:7;12552:6;12541:9;12537:22;12516:53;:::i;:::-;12506:63;;12462:117;12257:329;;;;:::o;12592:607::-;12663:6;12671;12679;12728:2;12716:9;12707:7;12703:23;12699:32;12696:119;;;12734:79;;:::i;:::-;12696:119;12854:1;12879:50;12921:7;12912:6;12901:9;12897:22;12879:50;:::i;:::-;12869:60;;12825:114;12978:2;13004:50;13046:7;13037:6;13026:9;13022:22;13004:50;:::i;:::-;12994:60;;12949:115;13103:2;13129:53;13174:7;13165:6;13154:9;13150:22;13129:53;:::i;:::-;13119:63;;13074:118;12592:607;;;;;:::o;13205:474::-;13273:6;13281;13330:2;13318:9;13309:7;13305:23;13301:32;13298:119;;;13336:79;;:::i;:::-;13298:119;13456:1;13481:53;13526:7;13517:6;13506:9;13502:22;13481:53;:::i;:::-;13471:63;;13427:117;13583:2;13609:53;13654:7;13645:6;13634:9;13630:22;13609:53;:::i;:::-;13599:63;;13554:118;13205:474;;;;;:::o;13685:468::-;13750:6;13758;13807:2;13795:9;13786:7;13782:23;13778:32;13775:119;;;13813:79;;:::i;:::-;13775:119;13933:1;13958:53;14003:7;13994:6;13983:9;13979:22;13958:53;:::i;:::-;13948:63;;13904:117;14060:2;14086:50;14128:7;14119:6;14108:9;14104:22;14086:50;:::i;:::-;14076:60;;14031:115;13685:468;;;;;:::o;14159:180::-;14207:77;14204:1;14197:88;14304:4;14301:1;14294:15;14328:4;14325:1;14318:15;14345:320;14389:6;14426:1;14420:4;14416:12;14406:22;;14473:1;14467:4;14463:12;14494:18;14484:81;;14550:4;14542:6;14538:17;14528:27;;14484:81;14612:2;14604:6;14601:14;14581:18;14578:38;14575:84;;14631:18;;:::i;:::-;14575:84;14396:269;14345:320;;;:::o;14671:170::-;14811:22;14807:1;14799:6;14795:14;14788:46;14671:170;:::o;14847:366::-;14989:3;15010:67;15074:2;15069:3;15010:67;:::i;:::-;15003:74;;15086:93;15175:3;15086:93;:::i;:::-;15204:2;15199:3;15195:12;15188:19;;14847:366;;;:::o;15219:419::-;15385:4;15423:2;15412:9;15408:18;15400:26;;15472:9;15466:4;15462:20;15458:1;15447:9;15443:17;15436:47;15500:131;15626:4;15500:131;:::i;:::-;15492:139;;15219:419;;;:::o;15644:168::-;15784:20;15780:1;15772:6;15768:14;15761:44;15644:168;:::o;15818:366::-;15960:3;15981:67;16045:2;16040:3;15981:67;:::i;:::-;15974:74;;16057:93;16146:3;16057:93;:::i;:::-;16175:2;16170:3;16166:12;16159:19;;15818:366;;;:::o;16190:419::-;16356:4;16394:2;16383:9;16379:18;16371:26;;16443:9;16437:4;16433:20;16429:1;16418:9;16414:17;16407:47;16471:131;16597:4;16471:131;:::i;:::-;16463:139;;16190:419;;;:::o;16615:180::-;16663:77;16660:1;16653:88;16760:4;16757:1;16750:15;16784:4;16781:1;16774:15;16801:191;16841:3;16860:20;16878:1;16860:20;:::i;:::-;16855:25;;16894:20;16912:1;16894:20;:::i;:::-;16889:25;;16937:1;16934;16930:9;16923:16;;16958:3;16955:1;16952:10;16949:36;;;16965:18;;:::i;:::-;16949:36;16801:191;;;;:::o;16998:148::-;17100:11;17137:3;17122:18;;16998:148;;;;:::o;17152:390::-;17258:3;17286:39;17319:5;17286:39;:::i;:::-;17341:89;17423:6;17418:3;17341:89;:::i;:::-;17334:96;;17439:65;17497:6;17492:3;17485:4;17478:5;17474:16;17439:65;:::i;:::-;17529:6;17524:3;17520:16;17513:23;;17262:280;17152:390;;;;:::o;17548:275::-;17680:3;17702:95;17793:3;17784:6;17702:95;:::i;:::-;17695:102;;17814:3;17807:10;;17548:275;;;;:::o;17829:141::-;17878:4;17901:3;17893:11;;17924:3;17921:1;17914:14;17958:4;17955:1;17945:18;17937:26;;17829:141;;;:::o;17976:93::-;18013:6;18060:2;18055;18048:5;18044:14;18040:23;18030:33;;17976:93;;;:::o;18075:107::-;18119:8;18169:5;18163:4;18159:16;18138:37;;18075:107;;;;:::o;18188:393::-;18257:6;18307:1;18295:10;18291:18;18330:97;18360:66;18349:9;18330:97;:::i;:::-;18448:39;18478:8;18467:9;18448:39;:::i;:::-;18436:51;;18520:4;18516:9;18509:5;18505:21;18496:30;;18569:4;18559:8;18555:19;18548:5;18545:30;18535:40;;18264:317;;18188:393;;;;;:::o;18587:142::-;18637:9;18670:53;18688:34;18697:24;18715:5;18697:24;:::i;:::-;18688:34;:::i;:::-;18670:53;:::i;:::-;18657:66;;18587:142;;;:::o;18735:75::-;18778:3;18799:5;18792:12;;18735:75;;;:::o;18816:269::-;18926:39;18957:7;18926:39;:::i;:::-;18987:91;19036:41;19060:16;19036:41;:::i;:::-;19028:6;19021:4;19015:11;18987:91;:::i;:::-;18981:4;18974:105;18892:193;18816:269;;;:::o;19091:73::-;19136:3;19091:73;:::o;19170:189::-;19247:32;;:::i;:::-;19288:65;19346:6;19338;19332:4;19288:65;:::i;:::-;19223:136;19170:189;;:::o;19365:186::-;19425:120;19442:3;19435:5;19432:14;19425:120;;;19496:39;19533:1;19526:5;19496:39;:::i;:::-;19469:1;19462:5;19458:13;19449:22;;19425:120;;;19365:186;;:::o;19557:543::-;19658:2;19653:3;19650:11;19647:446;;;19692:38;19724:5;19692:38;:::i;:::-;19776:29;19794:10;19776:29;:::i;:::-;19766:8;19762:44;19959:2;19947:10;19944:18;19941:49;;;19980:8;19965:23;;19941:49;20003:80;20059:22;20077:3;20059:22;:::i;:::-;20049:8;20045:37;20032:11;20003:80;:::i;:::-;19662:431;;19647:446;19557:543;;;:::o;20106:117::-;20160:8;20210:5;20204:4;20200:16;20179:37;;20106:117;;;;:::o;20229:169::-;20273:6;20306:51;20354:1;20350:6;20342:5;20339:1;20335:13;20306:51;:::i;:::-;20302:56;20387:4;20381;20377:15;20367:25;;20280:118;20229:169;;;;:::o;20403:295::-;20479:4;20625:29;20650:3;20644:4;20625:29;:::i;:::-;20617:37;;20687:3;20684:1;20680:11;20674:4;20671:21;20663:29;;20403:295;;;;:::o;20703:1395::-;20820:37;20853:3;20820:37;:::i;:::-;20922:18;20914:6;20911:30;20908:56;;;20944:18;;:::i;:::-;20908:56;20988:38;21020:4;21014:11;20988:38;:::i;:::-;21073:67;21133:6;21125;21119:4;21073:67;:::i;:::-;21167:1;21191:4;21178:17;;21223:2;21215:6;21212:14;21240:1;21235:618;;;;21897:1;21914:6;21911:77;;;21963:9;21958:3;21954:19;21948:26;21939:35;;21911:77;22014:67;22074:6;22067:5;22014:67;:::i;:::-;22008:4;22001:81;21870:222;21205:887;;21235:618;21287:4;21283:9;21275:6;21271:22;21321:37;21353:4;21321:37;:::i;:::-;21380:1;21394:208;21408:7;21405:1;21402:14;21394:208;;;21487:9;21482:3;21478:19;21472:26;21464:6;21457:42;21538:1;21530:6;21526:14;21516:24;;21585:2;21574:9;21570:18;21557:31;;21431:4;21428:1;21424:12;21419:17;;21394:208;;;21630:6;21621:7;21618:19;21615:179;;;21688:9;21683:3;21679:19;21673:26;21731:48;21773:4;21765:6;21761:17;21750:9;21731:48;:::i;:::-;21723:6;21716:64;21638:156;21615:179;21840:1;21836;21828:6;21824:14;21820:22;21814:4;21807:36;21242:611;;;21205:887;;20795:1303;;;20703:1395;;:::o;22104:423::-;22245:4;22283:2;22272:9;22268:18;22260:26;;22332:9;22326:4;22322:20;22318:1;22307:9;22303:17;22296:47;22360:78;22433:4;22424:6;22360:78;:::i;:::-;22352:86;;22448:72;22516:2;22505:9;22501:18;22492:6;22448:72;:::i;:::-;22104:423;;;;;:::o;22533:731::-;22746:4;22784:3;22773:9;22769:19;22761:27;;22834:9;22828:4;22824:20;22820:1;22809:9;22805:17;22798:47;22862:78;22935:4;22926:6;22862:78;:::i;:::-;22854:86;;22950:66;23012:2;23001:9;22997:18;22988:6;22950:66;:::i;:::-;23026;23088:2;23077:9;23073:18;23064:6;23026:66;:::i;:::-;23102:72;23170:2;23159:9;23155:18;23146:6;23102:72;:::i;:::-;23184:73;23252:3;23241:9;23237:19;23228:6;23184:73;:::i;:::-;22533:731;;;;;;;;:::o;23270:227::-;23410:34;23406:1;23398:6;23394:14;23387:58;23479:10;23474:2;23466:6;23462:15;23455:35;23270:227;:::o;23503:366::-;23645:3;23666:67;23730:2;23725:3;23666:67;:::i;:::-;23659:74;;23742:93;23831:3;23742:93;:::i;:::-;23860:2;23855:3;23851:12;23844:19;;23503:366;;;:::o;23875:419::-;24041:4;24079:2;24068:9;24064:18;24056:26;;24128:9;24122:4;24118:20;24114:1;24103:9;24099:17;24092:47;24156:131;24282:4;24156:131;:::i;:::-;24148:139;;23875:419;;;:::o;24300:180::-;24348:77;24345:1;24338:88;24445:4;24442:1;24435:15;24469:4;24466:1;24459:15;24486:185;24526:1;24543:20;24561:1;24543:20;:::i;:::-;24538:25;;24577:20;24595:1;24577:20;:::i;:::-;24572:25;;24616:1;24606:35;;24621:18;;:::i;:::-;24606:35;24663:1;24660;24656:9;24651:14;;24486:185;;;;:::o;24677:239::-;24817:34;24813:1;24805:6;24801:14;24794:58;24886:22;24881:2;24873:6;24869:15;24862:47;24677:239;:::o;24922:366::-;25064:3;25085:67;25149:2;25144:3;25085:67;:::i;:::-;25078:74;;25161:93;25250:3;25161:93;:::i;:::-;25279:2;25274:3;25270:12;25263:19;;24922:366;;;:::o;25294:419::-;25460:4;25498:2;25487:9;25483:18;25475:26;;25547:9;25541:4;25537:20;25533:1;25522:9;25518:17;25511:47;25575:131;25701:4;25575:131;:::i;:::-;25567:139;;25294:419;;;:::o;25719:102::-;25761:8;25808:5;25805:1;25801:13;25780:34;;25719:102;;;:::o;25827:848::-;25888:5;25895:4;25919:6;25910:15;;25943:5;25934:14;;25957:712;25978:1;25968:8;25965:15;25957:712;;;26073:4;26068:3;26064:14;26058:4;26055:24;26052:50;;;26082:18;;:::i;:::-;26052:50;26132:1;26122:8;26118:16;26115:451;;;26547:4;26540:5;26536:16;26527:25;;26115:451;26597:4;26591;26587:15;26579:23;;26627:32;26650:8;26627:32;:::i;:::-;26615:44;;25957:712;;;25827:848;;;;;;;:::o;26681:1073::-;26735:5;26926:8;26916:40;;26947:1;26938:10;;26949:5;;26916:40;26975:4;26965:36;;26992:1;26983:10;;26994:5;;26965:36;27061:4;27109:1;27104:27;;;;27145:1;27140:191;;;;27054:277;;27104:27;27122:1;27113:10;;27124:5;;;27140:191;27185:3;27175:8;27172:17;27169:43;;;27192:18;;:::i;:::-;27169:43;27241:8;27238:1;27234:16;27225:25;;27276:3;27269:5;27266:14;27263:40;;;27283:18;;:::i;:::-;27263:40;27316:5;;;27054:277;;27440:2;27430:8;27427:16;27421:3;27415:4;27412:13;27408:36;27390:2;27380:8;27377:16;27372:2;27366:4;27363:12;27359:35;27343:111;27340:246;;;27496:8;27490:4;27486:19;27477:28;;27531:3;27524:5;27521:14;27518:40;;;27538:18;;:::i;:::-;27518:40;27571:5;;27340:246;27611:42;27649:3;27639:8;27633:4;27630:1;27611:42;:::i;:::-;27596:57;;;;27685:4;27680:3;27676:14;27669:5;27666:25;27663:51;;;27694:18;;:::i;:::-;27663:51;27743:4;27736:5;27732:16;27723:25;;26681:1073;;;;;;:::o;27760:281::-;27818:5;27842:23;27860:4;27842:23;:::i;:::-;27834:31;;27886:25;27902:8;27886:25;:::i;:::-;27874:37;;27930:104;27967:66;27957:8;27951:4;27930:104;:::i;:::-;27921:113;;27760:281;;;;:::o;28047:348::-;28087:7;28110:20;28128:1;28110:20;:::i;:::-;28105:25;;28144:20;28162:1;28144:20;:::i;:::-;28139:25;;28332:1;28264:66;28260:74;28257:1;28254:81;28249:1;28242:9;28235:17;28231:105;28228:131;;;28339:18;;:::i;:::-;28228:131;28387:1;28384;28380:9;28369:20;;28047:348;;;;:::o;28401:418::-;28538:4;28576:2;28565:9;28561:18;28553:26;;28589:65;28651:1;28640:9;28636:17;28627:6;28589:65;:::i;:::-;28664:66;28726:2;28715:9;28711:18;28702:6;28664:66;:::i;:::-;28740:72;28808:2;28797:9;28793:18;28784:6;28740:72;:::i;:::-;28401:418;;;;;;:::o;28825:224::-;28965:34;28961:1;28953:6;28949:14;28942:58;29034:7;29029:2;29021:6;29017:15;29010:32;28825:224;:::o;29055:366::-;29197:3;29218:67;29282:2;29277:3;29218:67;:::i;:::-;29211:74;;29294:93;29383:3;29294:93;:::i;:::-;29412:2;29407:3;29403:12;29396:19;;29055:366;;;:::o;29427:419::-;29593:4;29631:2;29620:9;29616:18;29608:26;;29680:9;29674:4;29670:20;29666:1;29655:9;29651:17;29644:47;29708:131;29834:4;29708:131;:::i;:::-;29700:139;;29427:419;;;:::o;29852:232::-;29992:34;29988:1;29980:6;29976:14;29969:58;30061:15;30056:2;30048:6;30044:15;30037:40;29852:232;:::o;30090:366::-;30232:3;30253:67;30317:2;30312:3;30253:67;:::i;:::-;30246:74;;30329:93;30418:3;30329:93;:::i;:::-;30447:2;30442:3;30438:12;30431:19;;30090:366;;;:::o;30462:419::-;30628:4;30666:2;30655:9;30651:18;30643:26;;30715:9;30709:4;30705:20;30701:1;30690:9;30686:17;30679:47;30743:131;30869:4;30743:131;:::i;:::-;30735:139;;30462:419;;;:::o;30887:320::-;31002:4;31040:2;31029:9;31025:18;31017:26;;31053:71;31121:1;31110:9;31106:17;31097:6;31053:71;:::i;:::-;31134:66;31196:2;31185:9;31181:18;31172:6;31134:66;:::i;:::-;30887:320;;;;;:::o;31213:225::-;31353:34;31349:1;31341:6;31337:14;31330:58;31422:8;31417:2;31409:6;31405:15;31398:33;31213:225;:::o;31444:366::-;31586:3;31607:67;31671:2;31666:3;31607:67;:::i;:::-;31600:74;;31683:93;31772:3;31683:93;:::i;:::-;31801:2;31796:3;31792:12;31785:19;;31444:366;;;:::o;31816:419::-;31982:4;32020:2;32009:9;32005:18;31997:26;;32069:9;32063:4;32059:20;32055:1;32044:9;32040:17;32033:47;32097:131;32223:4;32097:131;:::i;:::-;32089:139;;31816:419;;;:::o;32241:223::-;32381:34;32377:1;32369:6;32365:14;32358:58;32450:6;32445:2;32437:6;32433:15;32426:31;32241:223;:::o;32470:366::-;32612:3;32633:67;32697:2;32692:3;32633:67;:::i;:::-;32626:74;;32709:93;32798:3;32709:93;:::i;:::-;32827:2;32822:3;32818:12;32811:19;;32470:366;;;:::o;32842:419::-;33008:4;33046:2;33035:9;33031:18;33023:26;;33095:9;33089:4;33085:20;33081:1;33070:9;33066:17;33059:47;33123:131;33249:4;33123:131;:::i;:::-;33115:139;;32842:419;;;:::o;33267:221::-;33407:34;33403:1;33395:6;33391:14;33384:58;33476:4;33471:2;33463:6;33459:15;33452:29;33267:221;:::o;33494:366::-;33636:3;33657:67;33721:2;33716:3;33657:67;:::i;:::-;33650:74;;33733:93;33822:3;33733:93;:::i;:::-;33851:2;33846:3;33842:12;33835:19;;33494:366;;;:::o;33866:419::-;34032:4;34070:2;34059:9;34055:18;34047:26;;34119:9;34113:4;34109:20;34105:1;34094:9;34090:17;34083:47;34147:131;34273:4;34147:131;:::i;:::-;34139:139;;33866:419;;;:::o;34291:224::-;34431:34;34427:1;34419:6;34415:14;34408:58;34500:7;34495:2;34487:6;34483:15;34476:32;34291:224;:::o;34521:366::-;34663:3;34684:67;34748:2;34743:3;34684:67;:::i;:::-;34677:74;;34760:93;34849:3;34760:93;:::i;:::-;34878:2;34873:3;34869:12;34862:19;;34521:366;;;:::o;34893:419::-;35059:4;35097:2;35086:9;35082:18;35074:26;;35146:9;35140:4;35136:20;35132:1;35121:9;35117:17;35110:47;35174:131;35300:4;35174:131;:::i;:::-;35166:139;;34893:419;;;:::o;35318:222::-;35458:34;35454:1;35446:6;35442:14;35435:58;35527:5;35522:2;35514:6;35510:15;35503:30;35318:222;:::o;35546:366::-;35688:3;35709:67;35773:2;35768:3;35709:67;:::i;:::-;35702:74;;35785:93;35874:3;35785:93;:::i;:::-;35903:2;35898:3;35894:12;35887:19;;35546:366;;;:::o;35918:419::-;36084:4;36122:2;36111:9;36107:18;36099:26;;36171:9;36165:4;36161:20;36157:1;36146:9;36142:17;36135:47;36199:131;36325:4;36199:131;:::i;:::-;36191:139;;35918:419;;;:::o;36343:225::-;36483:34;36479:1;36471:6;36467:14;36460:58;36552:8;36547:2;36539:6;36535:15;36528:33;36343:225;:::o;36574:366::-;36716:3;36737:67;36801:2;36796:3;36737:67;:::i;:::-;36730:74;;36813:93;36902:3;36813:93;:::i;:::-;36931:2;36926:3;36922:12;36915:19;;36574:366;;;:::o;36946:419::-;37112:4;37150:2;37139:9;37135:18;37127:26;;37199:9;37193:4;37189:20;37185:1;37174:9;37170:17;37163:47;37227:131;37353:4;37227:131;:::i;:::-;37219:139;;36946:419;;;:::o;37371:194::-;37411:4;37431:20;37449:1;37431:20;:::i;:::-;37426:25;;37465:20;37483:1;37465:20;:::i;:::-;37460:25;;37509:1;37506;37502:9;37494:17;;37533:1;37527:4;37524:11;37521:37;;;37538:18;;:::i;:::-;37521:37;37371:194;;;;:::o;37571:168::-;37711:20;37707:1;37699:6;37695:14;37688:44;37571:168;:::o;37745:366::-;37887:3;37908:67;37972:2;37967:3;37908:67;:::i;:::-;37901:74;;37984:93;38073:3;37984:93;:::i;:::-;38102:2;38097:3;38093:12;38086:19;;37745:366;;;:::o;38117:419::-;38283:4;38321:2;38310:9;38306:18;38298:26;;38370:9;38364:4;38360:20;38356:1;38345:9;38341:17;38334:47;38398:131;38524:4;38398:131;:::i;:::-;38390:139;;38117:419;;;:::o;38542:244::-;38682:34;38678:1;38670:6;38666:14;38659:58;38751:27;38746:2;38738:6;38734:15;38727:52;38542:244;:::o;38792:366::-;38934:3;38955:67;39019:2;39014:3;38955:67;:::i;:::-;38948:74;;39031:93;39120:3;39031:93;:::i;:::-;39149:2;39144:3;39140:12;39133:19;;38792:366;;;:::o;39164:419::-;39330:4;39368:2;39357:9;39353:18;39345:26;;39417:9;39411:4;39407:20;39403:1;39392:9;39388:17;39381:47;39445:131;39571:4;39445:131;:::i;:::-;39437:139;;39164:419;;;:::o;39589:241::-;39729:34;39725:1;39717:6;39713:14;39706:58;39798:24;39793:2;39785:6;39781:15;39774:49;39589:241;:::o;39836:366::-;39978:3;39999:67;40063:2;40058:3;39999:67;:::i;:::-;39992:74;;40075:93;40164:3;40075:93;:::i;:::-;40193:2;40188:3;40184:12;40177:19;;39836:366;;;:::o;40208:419::-;40374:4;40412:2;40401:9;40397:18;40389:26;;40461:9;40455:4;40451:20;40447:1;40436:9;40432:17;40425:47;40489:131;40615:4;40489:131;:::i;:::-;40481:139;;40208:419;;;:::o;40633:182::-;40773:34;40769:1;40761:6;40757:14;40750:58;40633:182;:::o;40821:366::-;40963:3;40984:67;41048:2;41043:3;40984:67;:::i;:::-;40977:74;;41060:93;41149:3;41060:93;:::i;:::-;41178:2;41173:3;41169:12;41162:19;;40821:366;;;:::o;41193:419::-;41359:4;41397:2;41386:9;41382:18;41374:26;;41446:9;41440:4;41436:20;41432:1;41421:9;41417:17;41410:47;41474:131;41600:4;41474:131;:::i;:::-;41466:139;;41193:419;;;:::o;41618:179::-;41758:31;41754:1;41746:6;41742:14;41735:55;41618:179;:::o;41803:366::-;41945:3;41966:67;42030:2;42025:3;41966:67;:::i;:::-;41959:74;;42042:93;42131:3;42042:93;:::i;:::-;42160:2;42155:3;42151:12;42144:19;;41803:366;;;:::o;42175:419::-;42341:4;42379:2;42368:9;42364:18;42356:26;;42428:9;42422:4;42418:20;42414:1;42403:9;42399:17;42392:47;42456:131;42582:4;42456:131;:::i;:::-;42448:139;;42175:419;;;:::o;42600:442::-;42749:4;42787:2;42776:9;42772:18;42764:26;;42800:71;42868:1;42857:9;42853:17;42844:6;42800:71;:::i;:::-;42881:72;42949:2;42938:9;42934:18;42925:6;42881:72;:::i;:::-;42963;43031:2;43020:9;43016:18;43007:6;42963:72;:::i;:::-;42600:442;;;;;;:::o;43048:180::-;43096:77;43093:1;43086:88;43193:4;43190:1;43183:15;43217:4;43214:1;43207:15;43234:143;43291:5;43322:6;43316:13;43307:22;;43338:33;43365:5;43338:33;:::i;:::-;43234:143;;;;:::o;43383:351::-;43453:6;43502:2;43490:9;43481:7;43477:23;43473:32;43470:119;;;43508:79;;:::i;:::-;43470:119;43628:1;43653:64;43709:7;43700:6;43689:9;43685:22;43653:64;:::i;:::-;43643:74;;43599:128;43383:351;;;;:::o;43740:85::-;43785:7;43814:5;43803:16;;43740:85;;;:::o;43831:158::-;43889:9;43922:61;43940:42;43949:32;43975:5;43949:32;:::i;:::-;43940:42;:::i;:::-;43922:61;:::i;:::-;43909:74;;43831:158;;;:::o;43995:147::-;44090:45;44129:5;44090:45;:::i;:::-;44085:3;44078:58;43995:147;;:::o;44148:114::-;44215:6;44249:5;44243:12;44233:22;;44148:114;;;:::o;44268:184::-;44367:11;44401:6;44396:3;44389:19;44441:4;44436:3;44432:14;44417:29;;44268:184;;;;:::o;44458:132::-;44525:4;44548:3;44540:11;;44578:4;44573:3;44569:14;44561:22;;44458:132;;;:::o;44596:108::-;44673:24;44691:5;44673:24;:::i;:::-;44668:3;44661:37;44596:108;;:::o;44710:179::-;44779:10;44800:46;44842:3;44834:6;44800:46;:::i;:::-;44878:4;44873:3;44869:14;44855:28;;44710:179;;;;:::o;44895:113::-;44965:4;44997;44992:3;44988:14;44980:22;;44895:113;;;:::o;45044:732::-;45163:3;45192:54;45240:5;45192:54;:::i;:::-;45262:86;45341:6;45336:3;45262:86;:::i;:::-;45255:93;;45372:56;45422:5;45372:56;:::i;:::-;45451:7;45482:1;45467:284;45492:6;45489:1;45486:13;45467:284;;;45568:6;45562:13;45595:63;45654:3;45639:13;45595:63;:::i;:::-;45588:70;;45681:60;45734:6;45681:60;:::i;:::-;45671:70;;45527:224;45514:1;45511;45507:9;45502:14;;45467:284;;;45471:14;45767:3;45760:10;;45168:608;;;45044:732;;;;:::o;45782:831::-;46045:4;46083:3;46072:9;46068:19;46060:27;;46097:71;46165:1;46154:9;46150:17;46141:6;46097:71;:::i;:::-;46178:80;46254:2;46243:9;46239:18;46230:6;46178:80;:::i;:::-;46305:9;46299:4;46295:20;46290:2;46279:9;46275:18;46268:48;46333:108;46436:4;46427:6;46333:108;:::i;:::-;46325:116;;46451:72;46519:2;46508:9;46504:18;46495:6;46451:72;:::i;:::-;46533:73;46601:3;46590:9;46586:19;46577:6;46533:73;:::i;:::-;45782:831;;;;;;;;:::o;46619:807::-;46868:4;46906:3;46895:9;46891:19;46883:27;;46920:71;46988:1;46977:9;46973:17;46964:6;46920:71;:::i;:::-;47001:72;47069:2;47058:9;47054:18;47045:6;47001:72;:::i;:::-;47083:80;47159:2;47148:9;47144:18;47135:6;47083:80;:::i;:::-;47173;47249:2;47238:9;47234:18;47225:6;47173:80;:::i;:::-;47263:73;47331:3;47320:9;47316:19;47307:6;47263:73;:::i;:::-;47346;47414:3;47403:9;47399:19;47390:6;47346:73;:::i;:::-;46619:807;;;;;;;;;:::o;47432:143::-;47489:5;47520:6;47514:13;47505:22;;47536:33;47563:5;47536:33;:::i;:::-;47432:143;;;;:::o;47581:663::-;47669:6;47677;47685;47734:2;47722:9;47713:7;47709:23;47705:32;47702:119;;;47740:79;;:::i;:::-;47702:119;47860:1;47885:64;47941:7;47932:6;47921:9;47917:22;47885:64;:::i;:::-;47875:74;;47831:128;47998:2;48024:64;48080:7;48071:6;48060:9;48056:22;48024:64;:::i;:::-;48014:74;;47969:129;48137:2;48163:64;48219:7;48210:6;48199:9;48195:22;48163:64;:::i;:::-;48153:74;;48108:129;47581:663;;;;;:::o

Swarm Source

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