ETH Price: $3,121.37 (+1.09%)
Gas: 5 Gwei

Token

AI-Hubs (AIHUBS)
 

Overview

Max Total Supply

1,000,000,000 AIHUBS

Holders

35

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
5,647,058.823529412 AIHUBS

Value
$0.00
0x9bf3a1fd4fa973e3912085852836947b887abd03
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AIHubs

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

/**

    * Welcome To AI-HUBS.com!

    * Access Bot from here - https://t.me/AIHUBS_Bot

    Website: https://ai-hubs.com/
    Twitter: https://twitter.com/AIHUBS
    Discord: https://discord.io/AIHUBS
    Telegram Group: https://t.me/AIHUBS_Group
    Telegram Channel: https://t.me/AIHUBS_News

 */
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 AIHubs is ERC20, Ownable {
    uint8 private _decimals = 9;
    uint256 private _supply = 1 * 10**9;
    uint256 public taxForLiquidity = 10;
    uint256 public taxForMarketing = 30;

    address public marketingWallet = 0xbd28225a0DD6e8EF92f57AFE86e784629DB7DF42;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _marketingReserves = 0;
    mapping(address => bool) public _isExcludedFromFee;
    uint256 public numTokensSellToAddToLiquidity = 250000 * 10**_decimals;
    uint256 public numTokensSellToAddToETH = 150000 * 10**_decimals;

    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("AI-Hubs", "AIHUBS") {
        _mint(msg.sender, (_supply * 10**_decimals));

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

        uniswapV2Router = _uniswapV2Router;

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


    /**
     * @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;
                }
            }

            uint256 transferAmount;
            if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
                transferAmount = amount;
            } 
            else {
                uint256 marketingShare = ((amount * taxForMarketing) / 1000);
                uint256 liquidityShare = ((amount * taxForLiquidity) / 1000);
                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;
    }

    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,
            marketingWallet,
            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 setMarketingWallet(address newWallet)
        public
        onlyOwner
        returns (bool)
    {
        require(newWallet != DEAD, "AI-Hubs: Cannot be the Dead wallet, or 0!");
        require(newWallet != address(0), "AI-Hubs: Cannot be the Dead wallet, or 0!");
        marketingWallet = newWallet;
        return true;
    }

    function setTaxForLiquidityAndMarketing(uint256 _taxForLiquidity, uint256 _taxForMarketing)
        public
        onlyOwner
        returns (bool)
    {
        require((_taxForLiquidity+_taxForMarketing) <= 100, "AI-Hubs: total tax must not be greater than 10%");
        taxForLiquidity = _taxForLiquidity;
        taxForMarketing = _taxForMarketing;

        return true;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _numTokensSellToAddToLiquidity, uint256 _numTokensSellToAddToETH)
        public
        onlyOwner
        returns (bool)
    {
        require(_numTokensSellToAddToLiquidity < _supply / 98, "AI-Hubs: Cannot liquidate more than 2% of the supply at once!");
        require(_numTokensSellToAddToETH < _supply / 98, "AI-Hubs: Cannot liquidate more than 2% of the supply at once!");
        numTokensSellToAddToLiquidity = _numTokensSellToAddToLiquidity * 10**_decimals;
        numTokensSellToAddToETH = _numTokensSellToAddToETH * 10**_decimals;

        return true;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"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":[],"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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketingWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokensSellToAddToLiquidity","type":"uint256"},{"internalType":"uint256","name":"_numTokensSellToAddToETH","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxForLiquidity","type":"uint256"},{"internalType":"uint256","name":"_taxForMarketing","type":"uint256"}],"name":"setTaxForLiquidityAndMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"},{"stateMutability":"payable","type":"receive"}]

60a06040526009600560146101000a81548160ff021916908360ff160217905550633b9aca00600655600a600755601e60085573bd28225a0dd6e8ef92f57afe86e784629db7df42600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b55600560149054906101000a900460ff16600a620000ed919062000901565b6203d090620000fd919062000952565b600d55600560149054906101000a900460ff16600a6200011e919062000901565b620249f06200012e919062000952565b600e553480156200013e57600080fd5b506040518060400160405280600781526020017f41492d48756273000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f41494855425300000000000000000000000000000000000000000000000000008152508160039081620001bc919062000c23565b508060049081620001ce919062000c23565b505050620001f1620001e56200055460201b60201c565b6200055c60201b60201c565b6200022f33600560149054906101000a900460ff16600a62000214919062000901565b60065462000223919062000952565b6200062260201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000294573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ba919062000d74565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000322573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000348919062000d74565b6040518363ffffffff1660e01b81526004016200036792919062000db7565b6020604051808303816000875af115801562000387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ad919062000d74565b600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506001600c600060805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062000ed0565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000694576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068b9062000e45565b60405180910390fd5b8060026000828254620006a8919062000e67565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200075b919062000eb3565b60405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620007f557808604811115620007cd57620007cc62000767565b5b6001851615620007dd5780820291505b8081029050620007ed8562000796565b9450620007ad565b94509492505050565b600082620008105760019050620008e3565b81620008205760009050620008e3565b816001811462000839576002811462000844576200087a565b6001915050620008e3565b60ff84111562000859576200085862000767565b5b8360020a91508482111562000873576200087262000767565b5b50620008e3565b5060208310610133831016604e8410600b8410161715620008b45782820a905083811115620008ae57620008ad62000767565b5b620008e3565b620008c38484846001620007a3565b92509050818404811115620008dd57620008dc62000767565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b60006200090e82620008ea565b91506200091b83620008f4565b92506200094a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620007fe565b905092915050565b60006200095f82620008ea565b91506200096c83620008ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620009a857620009a762000767565b5b828202905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3557607f821691505b60208210810362000a4b5762000a4a620009ed565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000ab57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a76565b62000ac1868362000a76565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0462000afe62000af884620008ea565b62000ad9565b620008ea565b9050919050565b6000819050919050565b62000b208362000ae3565b62000b3862000b2f8262000b0b565b84845462000a83565b825550505050565b600090565b62000b4f62000b40565b62000b5c81848462000b15565b505050565b5b8181101562000b845762000b7860008262000b45565b60018101905062000b62565b5050565b601f82111562000bd35762000b9d8162000a51565b62000ba88462000a66565b8101602085101562000bb8578190505b62000bd062000bc78562000a66565b83018262000b61565b50505b505050565b600082821c905092915050565b600062000bf86000198460080262000bd8565b1980831691505092915050565b600062000c13838362000be5565b9150826002028217905092915050565b62000c2e82620009b3565b67ffffffffffffffff81111562000c4a5762000c49620009be565b5b62000c56825462000a1c565b62000c6382828562000b88565b600060209050601f83116001811462000c9b576000841562000c86578287015190505b62000c92858262000c05565b86555062000d02565b601f19841662000cab8662000a51565b60005b8281101562000cd55784890151825560018201915060208501945060208101905062000cae565b8683101562000cf5578489015162000cf1601f89168262000be5565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000d3c8262000d0f565b9050919050565b62000d4e8162000d2f565b811462000d5a57600080fd5b50565b60008151905062000d6e8162000d43565b92915050565b60006020828403121562000d8d5762000d8c62000d0a565b5b600062000d9d8482850162000d5d565b91505092915050565b62000db18162000d2f565b82525050565b600060408201905062000dce600083018562000da6565b62000ddd602083018462000da6565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000e2d601f8362000de4565b915062000e3a8262000df5565b602082019050919050565b6000602082019050818103600083015262000e608162000e1e565b9050919050565b600062000e7482620008ea565b915062000e8183620008ea565b925082820190508082111562000e9c5762000e9b62000767565b5b92915050565b62000ead81620008ea565b82525050565b600060208201905062000eca600083018462000ea2565b92915050565b608051612ebe62000f0f600039600081816108060152818161183b0152818161191c0152818161194301528181611c970152611cbe0152612ebe6000f3fe6080604052600436106101bb5760003560e01c806375f0a874116100ec578063ad16a0cf1161008a578063dd62ed3e11610064578063dd62ed3e1461066f578063df8408fe146106ac578063f2fde38b146106d5578063f345bd85146106fe576101c2565b8063ad16a0cf146105ee578063c0fdea5714610619578063d12a768814610644576101c2565b80638fcc250d116100c65780638fcc250d1461050c57806395d89b4114610549578063a457c2d714610574578063a9059cbb146105b1576101c2565b806375f0a87414610479578063768dc710146104a45780638da5cb5b146104e1576101c2565b806339509351116101595780635d098b38116101335780635d098b38146103ab5780635f7ce6a7146103e857806370a0823114610425578063715018a614610462576101c2565b8063395093511461031857806349bd5a5e14610355578063527ffabd14610380576101c2565b80631694505e116101955780631694505e1461025a57806318160ddd1461028557806323b872dd146102b0578063313ce567146102ed576101c2565b806303fd2a45146101c757806306fdde03146101f2578063095ea7b31461021d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101dc610729565b6040516101e99190611de9565b60405180910390f35b3480156101fe57600080fd5b5061020761074f565b6040516102149190611e94565b60405180910390f35b34801561022957600080fd5b50610244600480360381019061023f9190611f1d565b6107e1565b6040516102519190611f78565b60405180910390f35b34801561026657600080fd5b5061026f610804565b60405161027c9190611ff2565b60405180910390f35b34801561029157600080fd5b5061029a610828565b6040516102a7919061201c565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190612037565b610832565b6040516102e49190611f78565b60405180910390f35b3480156102f957600080fd5b50610302610861565b60405161030f91906120a6565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190611f1d565b61086a565b60405161034c9190611f78565b60405180910390f35b34801561036157600080fd5b5061036a6108a1565b6040516103779190611de9565b60405180910390f35b34801561038c57600080fd5b506103956108c7565b6040516103a2919061201c565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd91906120c1565b6108cd565b6040516103df9190611f78565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906120ee565b610a20565b60405161041c9190611f78565b60405180910390f35b34801561043157600080fd5b5061044c600480360381019061044791906120c1565b610a91565b604051610459919061201c565b60405180910390f35b34801561046e57600080fd5b50610477610ad9565b005b34801561048557600080fd5b5061048e610aed565b60405161049b9190611de9565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c691906120c1565b610b13565b6040516104d89190611f78565b60405180910390f35b3480156104ed57600080fd5b506104f6610b33565b6040516105039190611de9565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e91906120ee565b610b5d565b6040516105409190611f78565b60405180910390f35b34801561055557600080fd5b5061055e610c6b565b60405161056b9190611e94565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190611f1d565b610cfd565b6040516105a89190611f78565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190611f1d565b610d74565b6040516105e59190611f78565b60405180910390f35b3480156105fa57600080fd5b50610603610d97565b604051610610919061201c565b60405180910390f35b34801561062557600080fd5b5061062e610d9d565b60405161063b919061201c565b60405180910390f35b34801561065057600080fd5b50610659610da3565b604051610666919061201c565b60405180910390f35b34801561067b57600080fd5b506106966004803603810190610691919061212e565b610da9565b6040516106a3919061201c565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce919061219a565b610e30565b005b3480156106e157600080fd5b506106fc60048036038101906106f791906120c1565b610e93565b005b34801561070a57600080fd5b50610713610f16565b604051610720919061201c565b60405180910390f35b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461075e90612209565b80601f016020809104026020016040519081016040528092919081815260200182805461078a90612209565b80156107d75780601f106107ac576101008083540402835291602001916107d7565b820191906000526020600020905b8154815290600101906020018083116107ba57829003601f168201915b5050505050905090565b6000806107ec610f1c565b90506107f9818585610f24565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b60008061083d610f1c565b905061084a8582856110ed565b610855858585611179565b60019150509392505050565b60006009905090565b600080610875610f1c565b90506108968185856108878589610da9565b6108919190612269565b610f24565b600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60006108d761157c565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e9061230f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd9061230f565b60405180910390fd5b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000610a2a61157c565b60648284610a389190612269565b1115610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906123a1565b60405180910390fd5b82600781905550816008819055506001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ae161157c565b610aeb60006115fa565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610b6761157c565b6062600654610b7691906123f0565b8310610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae90612493565b60405180910390fd5b6062600654610bc691906123f0565b8210610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90612493565b60405180910390fd5b600560149054906101000a900460ff16600a610c2391906125e6565b83610c2e9190612631565b600d81905550600560149054906101000a900460ff16600a610c5091906125e6565b82610c5b9190612631565b600e819055506001905092915050565b606060048054610c7a90612209565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca690612209565b8015610cf35780601f10610cc857610100808354040283529160200191610cf3565b820191906000526020600020905b815481529060010190602001808311610cd657829003601f168201915b5050505050905090565b600080610d08610f1c565b90506000610d168286610da9565b905083811015610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906126fd565b60405180910390fd5b610d688286868403610f24565b60019250505092915050565b600080610d7f610f1c565b9050610d8c818585611179565b600191505092915050565b600e5481565b600b5481565b600d5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e3861157c565b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610e9b61157c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f019061278f565b60405180910390fd5b610f13816115fa565b50565b60075481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90612821565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff9906128b3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110e0919061201c565b60405180910390a3505050565b60006110f98484610da9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111735781811015611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c9061291f565b60405180910390fd5b6111728484848403610f24565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df906129b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90612a43565b60405180910390fd5b8061126184610a91565b10156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990612ad5565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061134b5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80156113645750600f60149054906101000a900460ff16155b1561156b57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611421576000600b546113cc30610a91565b6113d69190612af5565b9050600d5481106113ed576113ec600d546116c0565b5b600e54600b541061141f57611403600e54611781565b600e54600b60008282546114179190612af5565b925050819055505b505b6000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114c45750600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114d15781905061155a565b60006103e8600854846114e49190612631565b6114ee91906123f0565b905060006103e8600754856115039190612631565b61150d91906123f0565b9050808261151b9190612269565b846115269190612af5565b925081600b600082825461153a9190612269565b92505081905550611557863083856115529190612269565b611a16565b50505b611565848483611a16565b50611577565b611576838383611a16565b5b505050565b611584610f1c565b73ffffffffffffffffffffffffffffffffffffffff166115a2610b33565b73ffffffffffffffffffffffffffffffffffffffff16146115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90612b75565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600f60146101000a81548160ff02191690831515021790555060006002826116ea91906123f0565b9050600081836116fa9190612af5565b9050600047905061170a83611781565b600081476117189190612af5565b90506117248382611c76565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161175793929190612b95565b60405180910390a1505050506000600f60146101000a81548160ff02191690831515021790555050565b6001600f60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156117b9576117b8612bcc565b5b6040519080825280602002602001820160405280156117e75781602001602082028036833780820191505090505b50905030816000815181106117ff576117fe612bfb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c89190612c3f565b816001815181106118dc576118db612bfb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611941307f000000000000000000000000000000000000000000000000000000000000000084610f24565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016119c5959493929190612d65565b600060405180830381600087803b1580156119df57600080fd5b505af11580156119f3573d6000803e3d6000fd5b50505050506000600f60146101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c906129b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90612a43565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190612ad5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c68919061201c565b60405180910390a350505050565b6001600f60146101000a81548160ff021916908315150217905550611cbc307f000000000000000000000000000000000000000000000000000000000000000084610f24565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611d4396959493929190612dbf565b60606040518083038185885af1158015611d61573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d869190612e35565b5050506000600f60146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dd382611da8565b9050919050565b611de381611dc8565b82525050565b6000602082019050611dfe6000830184611dda565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e3e578082015181840152602081019050611e23565b60008484015250505050565b6000601f19601f8301169050919050565b6000611e6682611e04565b611e708185611e0f565b9350611e80818560208601611e20565b611e8981611e4a565b840191505092915050565b60006020820190508181036000830152611eae8184611e5b565b905092915050565b600080fd5b611ec481611dc8565b8114611ecf57600080fd5b50565b600081359050611ee181611ebb565b92915050565b6000819050919050565b611efa81611ee7565b8114611f0557600080fd5b50565b600081359050611f1781611ef1565b92915050565b60008060408385031215611f3457611f33611eb6565b5b6000611f4285828601611ed2565b9250506020611f5385828601611f08565b9150509250929050565b60008115159050919050565b611f7281611f5d565b82525050565b6000602082019050611f8d6000830184611f69565b92915050565b6000819050919050565b6000611fb8611fb3611fae84611da8565b611f93565b611da8565b9050919050565b6000611fca82611f9d565b9050919050565b6000611fdc82611fbf565b9050919050565b611fec81611fd1565b82525050565b60006020820190506120076000830184611fe3565b92915050565b61201681611ee7565b82525050565b6000602082019050612031600083018461200d565b92915050565b6000806000606084860312156120505761204f611eb6565b5b600061205e86828701611ed2565b935050602061206f86828701611ed2565b925050604061208086828701611f08565b9150509250925092565b600060ff82169050919050565b6120a08161208a565b82525050565b60006020820190506120bb6000830184612097565b92915050565b6000602082840312156120d7576120d6611eb6565b5b60006120e584828501611ed2565b91505092915050565b6000806040838503121561210557612104611eb6565b5b600061211385828601611f08565b925050602061212485828601611f08565b9150509250929050565b6000806040838503121561214557612144611eb6565b5b600061215385828601611ed2565b925050602061216485828601611ed2565b9150509250929050565b61217781611f5d565b811461218257600080fd5b50565b6000813590506121948161216e565b92915050565b600080604083850312156121b1576121b0611eb6565b5b60006121bf85828601611ed2565b92505060206121d085828601612185565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061222157607f821691505b602082108103612234576122336121da565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061227482611ee7565b915061227f83611ee7565b92508282019050808211156122975761229661223a565b5b92915050565b7f41492d487562733a2043616e6e6f742062652074686520446561642077616c6c60008201527f65742c206f722030210000000000000000000000000000000000000000000000602082015250565b60006122f9602983611e0f565b91506123048261229d565b604082019050919050565b60006020820190508181036000830152612328816122ec565b9050919050565b7f41492d487562733a20746f74616c20746178206d757374206e6f74206265206760008201527f726561746572207468616e203130250000000000000000000000000000000000602082015250565b600061238b602f83611e0f565b91506123968261232f565b604082019050919050565b600060208201905081810360008301526123ba8161237e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006123fb82611ee7565b915061240683611ee7565b925082612416576124156123c1565b5b828204905092915050565b7f41492d487562733a2043616e6e6f74206c6971756964617465206d6f7265207460008201527f68616e203225206f662074686520737570706c79206174206f6e636521000000602082015250565b600061247d603d83611e0f565b915061248882612421565b604082019050919050565b600060208201905081810360008301526124ac81612470565b9050919050565b60008160011c9050919050565b6000808291508390505b600185111561250a578086048111156124e6576124e561223a565b5b60018516156124f55780820291505b8081029050612503856124b3565b94506124ca565b94509492505050565b60008261252357600190506125df565b8161253157600090506125df565b8160018114612547576002811461255157612580565b60019150506125df565b60ff8411156125635761256261223a565b5b8360020a91508482111561257a5761257961223a565b5b506125df565b5060208310610133831016604e8410600b84101617156125b55782820a9050838111156125b0576125af61223a565b5b6125df565b6125c284848460016124c0565b925090508184048111156125d9576125d861223a565b5b81810290505b9392505050565b60006125f182611ee7565b91506125fc8361208a565b92506126297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612513565b905092915050565b600061263c82611ee7565b915061264783611ee7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126805761267f61223a565b5b828202905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006126e7602583611e0f565b91506126f28261268b565b604082019050919050565b60006020820190508181036000830152612716816126da565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612779602683611e0f565b91506127848261271d565b604082019050919050565b600060208201905081810360008301526127a88161276c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061280b602483611e0f565b9150612816826127af565b604082019050919050565b6000602082019050818103600083015261283a816127fe565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061289d602283611e0f565b91506128a882612841565b604082019050919050565b600060208201905081810360008301526128cc81612890565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612909601d83611e0f565b9150612914826128d3565b602082019050919050565b60006020820190508181036000830152612938816128fc565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061299b602583611e0f565b91506129a68261293f565b604082019050919050565b600060208201905081810360008301526129ca8161298e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a2d602383611e0f565b9150612a38826129d1565b604082019050919050565b60006020820190508181036000830152612a5c81612a20565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612abf602683611e0f565b9150612aca82612a63565b604082019050919050565b60006020820190508181036000830152612aee81612ab2565b9050919050565b6000612b0082611ee7565b9150612b0b83611ee7565b9250828203905081811115612b2357612b2261223a565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b5f602083611e0f565b9150612b6a82612b29565b602082019050919050565b60006020820190508181036000830152612b8e81612b52565b9050919050565b6000606082019050612baa600083018661200d565b612bb7602083018561200d565b612bc4604083018461200d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612c3981611ebb565b92915050565b600060208284031215612c5557612c54611eb6565b5b6000612c6384828501612c2a565b91505092915050565b6000819050919050565b6000612c91612c8c612c8784612c6c565b611f93565b611ee7565b9050919050565b612ca181612c76565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612cdc81611dc8565b82525050565b6000612cee8383612cd3565b60208301905092915050565b6000602082019050919050565b6000612d1282612ca7565b612d1c8185612cb2565b9350612d2783612cc3565b8060005b83811015612d58578151612d3f8882612ce2565b9750612d4a83612cfa565b925050600181019050612d2b565b5085935050505092915050565b600060a082019050612d7a600083018861200d565b612d876020830187612c98565b8181036040830152612d998186612d07565b9050612da86060830185611dda565b612db5608083018461200d565b9695505050505050565b600060c082019050612dd46000830189611dda565b612de1602083018861200d565b612dee6040830187612c98565b612dfb6060830186612c98565b612e086080830185611dda565b612e1560a083018461200d565b979650505050505050565b600081519050612e2f81611ef1565b92915050565b600080600060608486031215612e4e57612e4d611eb6565b5b6000612e5c86828701612e20565b9350506020612e6d86828701612e20565b9250506040612e7e86828701612e20565b915050925092509256fea26469706673582212200891fe0814cfd166603c11f28b3a3951770f59c4c34867589898d3441294838764736f6c63430008100033

Deployed Bytecode

0x6080604052600436106101bb5760003560e01c806375f0a874116100ec578063ad16a0cf1161008a578063dd62ed3e11610064578063dd62ed3e1461066f578063df8408fe146106ac578063f2fde38b146106d5578063f345bd85146106fe576101c2565b8063ad16a0cf146105ee578063c0fdea5714610619578063d12a768814610644576101c2565b80638fcc250d116100c65780638fcc250d1461050c57806395d89b4114610549578063a457c2d714610574578063a9059cbb146105b1576101c2565b806375f0a87414610479578063768dc710146104a45780638da5cb5b146104e1576101c2565b806339509351116101595780635d098b38116101335780635d098b38146103ab5780635f7ce6a7146103e857806370a0823114610425578063715018a614610462576101c2565b8063395093511461031857806349bd5a5e14610355578063527ffabd14610380576101c2565b80631694505e116101955780631694505e1461025a57806318160ddd1461028557806323b872dd146102b0578063313ce567146102ed576101c2565b806303fd2a45146101c757806306fdde03146101f2578063095ea7b31461021d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101dc610729565b6040516101e99190611de9565b60405180910390f35b3480156101fe57600080fd5b5061020761074f565b6040516102149190611e94565b60405180910390f35b34801561022957600080fd5b50610244600480360381019061023f9190611f1d565b6107e1565b6040516102519190611f78565b60405180910390f35b34801561026657600080fd5b5061026f610804565b60405161027c9190611ff2565b60405180910390f35b34801561029157600080fd5b5061029a610828565b6040516102a7919061201c565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190612037565b610832565b6040516102e49190611f78565b60405180910390f35b3480156102f957600080fd5b50610302610861565b60405161030f91906120a6565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190611f1d565b61086a565b60405161034c9190611f78565b60405180910390f35b34801561036157600080fd5b5061036a6108a1565b6040516103779190611de9565b60405180910390f35b34801561038c57600080fd5b506103956108c7565b6040516103a2919061201c565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd91906120c1565b6108cd565b6040516103df9190611f78565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a91906120ee565b610a20565b60405161041c9190611f78565b60405180910390f35b34801561043157600080fd5b5061044c600480360381019061044791906120c1565b610a91565b604051610459919061201c565b60405180910390f35b34801561046e57600080fd5b50610477610ad9565b005b34801561048557600080fd5b5061048e610aed565b60405161049b9190611de9565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c691906120c1565b610b13565b6040516104d89190611f78565b60405180910390f35b3480156104ed57600080fd5b506104f6610b33565b6040516105039190611de9565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e91906120ee565b610b5d565b6040516105409190611f78565b60405180910390f35b34801561055557600080fd5b5061055e610c6b565b60405161056b9190611e94565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190611f1d565b610cfd565b6040516105a89190611f78565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190611f1d565b610d74565b6040516105e59190611f78565b60405180910390f35b3480156105fa57600080fd5b50610603610d97565b604051610610919061201c565b60405180910390f35b34801561062557600080fd5b5061062e610d9d565b60405161063b919061201c565b60405180910390f35b34801561065057600080fd5b50610659610da3565b604051610666919061201c565b60405180910390f35b34801561067b57600080fd5b506106966004803603810190610691919061212e565b610da9565b6040516106a3919061201c565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce919061219a565b610e30565b005b3480156106e157600080fd5b506106fc60048036038101906106f791906120c1565b610e93565b005b34801561070a57600080fd5b50610713610f16565b604051610720919061201c565b60405180910390f35b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461075e90612209565b80601f016020809104026020016040519081016040528092919081815260200182805461078a90612209565b80156107d75780601f106107ac576101008083540402835291602001916107d7565b820191906000526020600020905b8154815290600101906020018083116107ba57829003601f168201915b5050505050905090565b6000806107ec610f1c565b90506107f9818585610f24565b600191505092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60008061083d610f1c565b905061084a8582856110ed565b610855858585611179565b60019150509392505050565b60006009905090565b600080610875610f1c565b90506108968185856108878589610da9565b6108919190612269565b610f24565b600191505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60006108d761157c565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e9061230f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd9061230f565b60405180910390fd5b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000610a2a61157c565b60648284610a389190612269565b1115610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a70906123a1565b60405180910390fd5b82600781905550816008819055506001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ae161157c565b610aeb60006115fa565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610b6761157c565b6062600654610b7691906123f0565b8310610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae90612493565b60405180910390fd5b6062600654610bc691906123f0565b8210610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90612493565b60405180910390fd5b600560149054906101000a900460ff16600a610c2391906125e6565b83610c2e9190612631565b600d81905550600560149054906101000a900460ff16600a610c5091906125e6565b82610c5b9190612631565b600e819055506001905092915050565b606060048054610c7a90612209565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca690612209565b8015610cf35780601f10610cc857610100808354040283529160200191610cf3565b820191906000526020600020905b815481529060010190602001808311610cd657829003601f168201915b5050505050905090565b600080610d08610f1c565b90506000610d168286610da9565b905083811015610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906126fd565b60405180910390fd5b610d688286868403610f24565b60019250505092915050565b600080610d7f610f1c565b9050610d8c818585611179565b600191505092915050565b600e5481565b600b5481565b600d5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e3861157c565b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610e9b61157c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f019061278f565b60405180910390fd5b610f13816115fa565b50565b60075481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a90612821565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff9906128b3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110e0919061201c565b60405180910390a3505050565b60006110f98484610da9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146111735781811015611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115c9061291f565b60405180910390fd5b6111728484848403610f24565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df906129b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90612a43565b60405180910390fd5b8061126184610a91565b10156112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990612ad5565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061134b5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80156113645750600f60149054906101000a900460ff16155b1561156b57600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611421576000600b546113cc30610a91565b6113d69190612af5565b9050600d5481106113ed576113ec600d546116c0565b5b600e54600b541061141f57611403600e54611781565b600e54600b60008282546114179190612af5565b925050819055505b505b6000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114c45750600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114d15781905061155a565b60006103e8600854846114e49190612631565b6114ee91906123f0565b905060006103e8600754856115039190612631565b61150d91906123f0565b9050808261151b9190612269565b846115269190612af5565b925081600b600082825461153a9190612269565b92505081905550611557863083856115529190612269565b611a16565b50505b611565848483611a16565b50611577565b611576838383611a16565b5b505050565b611584610f1c565b73ffffffffffffffffffffffffffffffffffffffff166115a2610b33565b73ffffffffffffffffffffffffffffffffffffffff16146115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90612b75565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600f60146101000a81548160ff02191690831515021790555060006002826116ea91906123f0565b9050600081836116fa9190612af5565b9050600047905061170a83611781565b600081476117189190612af5565b90506117248382611c76565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405161175793929190612b95565b60405180910390a1505050506000600f60146101000a81548160ff02191690831515021790555050565b6001600f60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156117b9576117b8612bcc565b5b6040519080825280602002602001820160405280156117e75781602001602082028036833780820191505090505b50905030816000815181106117ff576117fe612bfb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c89190612c3f565b816001815181106118dc576118db612bfb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611941307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610f24565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016119c5959493929190612d65565b600060405180830381600087803b1580156119df57600080fd5b505af11580156119f3573d6000803e3d6000fd5b50505050506000600f60146101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c906129b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90612a43565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190612ad5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611c68919061201c565b60405180910390a350505050565b6001600f60146101000a81548160ff021916908315150217905550611cbc307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610f24565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401611d4396959493929190612dbf565b60606040518083038185885af1158015611d61573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d869190612e35565b5050506000600f60146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611dd382611da8565b9050919050565b611de381611dc8565b82525050565b6000602082019050611dfe6000830184611dda565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e3e578082015181840152602081019050611e23565b60008484015250505050565b6000601f19601f8301169050919050565b6000611e6682611e04565b611e708185611e0f565b9350611e80818560208601611e20565b611e8981611e4a565b840191505092915050565b60006020820190508181036000830152611eae8184611e5b565b905092915050565b600080fd5b611ec481611dc8565b8114611ecf57600080fd5b50565b600081359050611ee181611ebb565b92915050565b6000819050919050565b611efa81611ee7565b8114611f0557600080fd5b50565b600081359050611f1781611ef1565b92915050565b60008060408385031215611f3457611f33611eb6565b5b6000611f4285828601611ed2565b9250506020611f5385828601611f08565b9150509250929050565b60008115159050919050565b611f7281611f5d565b82525050565b6000602082019050611f8d6000830184611f69565b92915050565b6000819050919050565b6000611fb8611fb3611fae84611da8565b611f93565b611da8565b9050919050565b6000611fca82611f9d565b9050919050565b6000611fdc82611fbf565b9050919050565b611fec81611fd1565b82525050565b60006020820190506120076000830184611fe3565b92915050565b61201681611ee7565b82525050565b6000602082019050612031600083018461200d565b92915050565b6000806000606084860312156120505761204f611eb6565b5b600061205e86828701611ed2565b935050602061206f86828701611ed2565b925050604061208086828701611f08565b9150509250925092565b600060ff82169050919050565b6120a08161208a565b82525050565b60006020820190506120bb6000830184612097565b92915050565b6000602082840312156120d7576120d6611eb6565b5b60006120e584828501611ed2565b91505092915050565b6000806040838503121561210557612104611eb6565b5b600061211385828601611f08565b925050602061212485828601611f08565b9150509250929050565b6000806040838503121561214557612144611eb6565b5b600061215385828601611ed2565b925050602061216485828601611ed2565b9150509250929050565b61217781611f5d565b811461218257600080fd5b50565b6000813590506121948161216e565b92915050565b600080604083850312156121b1576121b0611eb6565b5b60006121bf85828601611ed2565b92505060206121d085828601612185565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061222157607f821691505b602082108103612234576122336121da565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061227482611ee7565b915061227f83611ee7565b92508282019050808211156122975761229661223a565b5b92915050565b7f41492d487562733a2043616e6e6f742062652074686520446561642077616c6c60008201527f65742c206f722030210000000000000000000000000000000000000000000000602082015250565b60006122f9602983611e0f565b91506123048261229d565b604082019050919050565b60006020820190508181036000830152612328816122ec565b9050919050565b7f41492d487562733a20746f74616c20746178206d757374206e6f74206265206760008201527f726561746572207468616e203130250000000000000000000000000000000000602082015250565b600061238b602f83611e0f565b91506123968261232f565b604082019050919050565b600060208201905081810360008301526123ba8161237e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006123fb82611ee7565b915061240683611ee7565b925082612416576124156123c1565b5b828204905092915050565b7f41492d487562733a2043616e6e6f74206c6971756964617465206d6f7265207460008201527f68616e203225206f662074686520737570706c79206174206f6e636521000000602082015250565b600061247d603d83611e0f565b915061248882612421565b604082019050919050565b600060208201905081810360008301526124ac81612470565b9050919050565b60008160011c9050919050565b6000808291508390505b600185111561250a578086048111156124e6576124e561223a565b5b60018516156124f55780820291505b8081029050612503856124b3565b94506124ca565b94509492505050565b60008261252357600190506125df565b8161253157600090506125df565b8160018114612547576002811461255157612580565b60019150506125df565b60ff8411156125635761256261223a565b5b8360020a91508482111561257a5761257961223a565b5b506125df565b5060208310610133831016604e8410600b84101617156125b55782820a9050838111156125b0576125af61223a565b5b6125df565b6125c284848460016124c0565b925090508184048111156125d9576125d861223a565b5b81810290505b9392505050565b60006125f182611ee7565b91506125fc8361208a565b92506126297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612513565b905092915050565b600061263c82611ee7565b915061264783611ee7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126805761267f61223a565b5b828202905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006126e7602583611e0f565b91506126f28261268b565b604082019050919050565b60006020820190508181036000830152612716816126da565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612779602683611e0f565b91506127848261271d565b604082019050919050565b600060208201905081810360008301526127a88161276c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061280b602483611e0f565b9150612816826127af565b604082019050919050565b6000602082019050818103600083015261283a816127fe565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061289d602283611e0f565b91506128a882612841565b604082019050919050565b600060208201905081810360008301526128cc81612890565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612909601d83611e0f565b9150612914826128d3565b602082019050919050565b60006020820190508181036000830152612938816128fc565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061299b602583611e0f565b91506129a68261293f565b604082019050919050565b600060208201905081810360008301526129ca8161298e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612a2d602383611e0f565b9150612a38826129d1565b604082019050919050565b60006020820190508181036000830152612a5c81612a20565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612abf602683611e0f565b9150612aca82612a63565b604082019050919050565b60006020820190508181036000830152612aee81612ab2565b9050919050565b6000612b0082611ee7565b9150612b0b83611ee7565b9250828203905081811115612b2357612b2261223a565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b5f602083611e0f565b9150612b6a82612b29565b602082019050919050565b60006020820190508181036000830152612b8e81612b52565b9050919050565b6000606082019050612baa600083018661200d565b612bb7602083018561200d565b612bc4604083018461200d565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050612c3981611ebb565b92915050565b600060208284031215612c5557612c54611eb6565b5b6000612c6384828501612c2a565b91505092915050565b6000819050919050565b6000612c91612c8c612c8784612c6c565b611f93565b611ee7565b9050919050565b612ca181612c76565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612cdc81611dc8565b82525050565b6000612cee8383612cd3565b60208301905092915050565b6000602082019050919050565b6000612d1282612ca7565b612d1c8185612cb2565b9350612d2783612cc3565b8060005b83811015612d58578151612d3f8882612ce2565b9750612d4a83612cfa565b925050600181019050612d2b565b5085935050505092915050565b600060a082019050612d7a600083018861200d565b612d876020830187612c98565b8181036040830152612d998186612d07565b9050612da86060830185611dda565b612db5608083018461200d565b9695505050505050565b600060c082019050612dd46000830189611dda565b612de1602083018861200d565b612dee6040830187612c98565b612dfb6060830186612c98565b612e086080830185611dda565b612e1560a083018461200d565b979650505050505050565b600081519050612e2f81611ef1565b92915050565b600080600060608486031215612e4e57612e4d611eb6565b5b6000612e5c86828701612e20565b9350506020612e6d86828701612e20565b9250506040612e7e86828701612e20565b915050925092509256fea26469706673582212200891fe0814cfd166603c11f28b3a3951770f59c4c34867589898d3441294838764736f6c63430008100033

Deployed Bytecode Sourcemap

28459:6996:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28744:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18177:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20451:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29064:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19315:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21275:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19158:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22991:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29122:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28618:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34027:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34384:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18342:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15436:103;;;;;;;;;;;;;:::i;:::-;;28662:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28859:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14788:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34783:632;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18001:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22075:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19895:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28992:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28815:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28916:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19488:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32493:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15694:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28576:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28744:64;;;;;;;;;;;;;:::o;18177:102::-;18233:13;18266:5;18259:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18177:102;:::o;20451:244::-;20572:4;20594:13;20610:12;:10;:12::i;:::-;20594:28;;20633:32;20642:5;20649:7;20658:6;20633:8;:32::i;:::-;20683:4;20676:11;;;20451:244;;;;:::o;29064:51::-;;;:::o;19315:110::-;19378:7;19405:12;;19398:19;;19315:110;:::o;21275:297::-;21408:4;21425:15;21443:12;:10;:12::i;:::-;21425:30;;21466:38;21482:4;21488:7;21497:6;21466:15;:38::i;:::-;21515:27;21525:4;21531:2;21535:6;21515:9;:27::i;:::-;21560:4;21553:11;;;21275:297;;;;;:::o;19158:92::-;19216:5;19241:1;19234:8;;19158:92;:::o;22991:272::-;23108:4;23130:13;23146:12;:10;:12::i;:::-;23130:28;;23169:64;23178:5;23185:7;23222:10;23194:25;23204:5;23211:7;23194:9;:25::i;:::-;:38;;;;:::i;:::-;23169:8;:64::i;:::-;23251:4;23244:11;;;22991:272;;;;:::o;29122:28::-;;;;;;;;;;;;;:::o;28618:35::-;;;;:::o;34027:349::-;34127:4;14674:13;:11;:13::i;:::-;34170:4:::1;;;;;;;;;;;34157:17;;:9;:17;;::::0;34149:71:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34260:1;34239:23;;:9;:23;;::::0;34231:77:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34337:9;34319:15;;:27;;;;;;;;;;;;;;;;;;34364:4;34357:11;;34027:349:::0;;;:::o;34384:391::-;34529:4;14674:13;:11;:13::i;:::-;34598:3:::1;34577:16;34560;:33;;;;:::i;:::-;34559:42;;34551:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;34682:16;34664:15;:34;;;;34727:16;34709:15;:34;;;;34763:4;34756:11;;34384:391:::0;;;;:::o;18342:177::-;18461:7;18493:9;:18;18503:7;18493:18;;;;;;;;;;;;;;;;18486:25;;18342:177;;;:::o;15436:103::-;14674:13;:11;:13::i;:::-;15501:30:::1;15528:1;15501:18;:30::i;:::-;15436:103::o:0;28662:75::-;;;;;;;;;;;;;:::o;28859:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;14788:87::-;14834:7;14861:6;;;;;;;;;;;14854:13;;14788:87;:::o;34783:632::-;34952:4;14674:13;:11;:13::i;:::-;35025:2:::1;35015:7;;:12;;;;:::i;:::-;34982:30;:45;34974:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;35149:2;35139:7;;:12;;;;:::i;:::-;35112:24;:39;35104:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;35297:9;;;;;;;;;;;35293:2;:13;;;;:::i;:::-;35260:30;:46;;;;:::i;:::-;35228:29;:78;;;;35374:9;;;;;;;;;;;35370:2;:13;;;;:::i;:::-;35343:24;:40;;;;:::i;:::-;35317:23;:66;;;;35403:4;35396:11;;34783:632:::0;;;;:::o;18001:106::-;18059:13;18092:7;18085:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18001:106;:::o;22075:507::-;22197:4;22219:13;22235:12;:10;:12::i;:::-;22219:28;;22258:24;22285:25;22295:5;22302:7;22285:9;:25::i;:::-;22258:52;;22363:15;22343:16;:35;;22321:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;22479:60;22488:5;22495:7;22523:15;22504:16;:34;22479:8;:60::i;:::-;22570:4;22563:11;;;;22075:507;;;;:::o;19895:236::-;20012:4;20034:13;20050:12;:10;:12::i;:::-;20034:28;;20073;20083:5;20090:2;20094:6;20073:9;:28::i;:::-;20119:4;20112:11;;;19895:236;;;;:::o;28992:63::-;;;;:::o;28815:37::-;;;;:::o;28916:69::-;;;;:::o;19488:201::-;19622:7;19654:11;:18;19666:5;19654:18;;;;;;;;;;;;;;;:27;19673:7;19654:27;;;;;;;;;;;;;;;;19647:34;;19488:201;;;;:::o;32493:132::-;14674:13;:11;:13::i;:::-;32610:7:::1;32579:18;:28;32598:8;32579:28;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;32493:132:::0;;:::o;15694:238::-;14674:13;:11;:13::i;:::-;15817:1:::1;15797:22;;:8;:22;;::::0;15775:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15896:28;15915:8;15896:18;:28::i;:::-;15694:238:::0;:::o;28576:35::-;;;;:::o;13581:98::-;13634:7;13661:10;13654:17;;13581:98;:::o;25298:380::-;25451:1;25434:19;;:5;:19;;;25426:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25532:1;25513:21;;:7;:21;;;25505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25616:6;25586:11;:18;25598:5;25586:18;;;;;;;;;;;;;;;:27;25605:7;25586:27;;;;;;;;;;;;;;;:36;;;;25654:7;25638:32;;25647:5;25638:32;;;25663:6;25638:32;;;;;;:::i;:::-;;;;;;;;25298:380;;;:::o;25969:502::-;26104:24;26131:25;26141:5;26148:7;26131:9;:25::i;:::-;26104:52;;26191:17;26171:16;:37;26167:297;;26271:6;26251:16;:26;;26225:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26386:51;26395:5;26402:7;26430:6;26411:16;:25;26386:8;:51::i;:::-;26167:297;26093:378;25969:502;;;:::o;30792:1693::-;30906:1;30890:18;;:4;:18;;;30882:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30983:1;30969:16;;:2;:16;;;30961:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31063:6;31044:15;31054:4;31044:9;:15::i;:::-;:25;;31036:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;31138:13;;;;;;;;;;;31130:21;;:4;:21;;;:44;;;;31161:13;;;;;;;;;;;31155:19;;:2;:19;;;31130:44;31129:67;;;;;31180:16;;;;;;;;;;;31179:17;31129:67;31125:1353;;;31225:13;;;;;;;;;;;31217:21;;:4;:21;;;31213:536;;31259:32;31321:18;;31294:24;31312:4;31294:9;:24::i;:::-;:45;;;;:::i;:::-;31259:80;;31390:29;;31362:24;:57;31358:152;;31444:46;31460:29;;31444:15;:46::i;:::-;31358:152;31556:23;;31533:18;;31532:47;31528:206;;31604:42;31622:23;;31604:17;:42::i;:::-;31691:23;;31669:18;;:45;;;;;;;:::i;:::-;;;;;;;;31528:206;31240:509;31213:536;31765:22;31806:18;:24;31825:4;31806:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;31834:18;:22;31853:2;31834:22;;;;;;;;;;;;;;;;;;;;;;;;;31806:50;31802:533;;;31894:6;31877:23;;31802:533;;;31955:22;32010:4;31991:15;;31982:6;:24;;;;:::i;:::-;31981:33;;;;:::i;:::-;31955:60;;32034:22;32089:4;32070:15;;32061:6;:24;;;;:::i;:::-;32060:33;;;;:::i;:::-;32034:60;;32157:14;32140;:31;;;;:::i;:::-;32130:6;:42;;;;:::i;:::-;32113:59;;32213:14;32191:18;;:36;;;;;;;:::i;:::-;;;;;;;;32248:71;32264:4;32278;32303:14;32286;:31;;;;:::i;:::-;32248:15;:71::i;:::-;31936:399;;31802:533;32349:41;32365:4;32371:2;32375:14;32349:15;:41::i;:::-;31198:1204;31125:1353;;;32433:33;32449:4;32455:2;32459:6;32433:15;:33::i;:::-;31125:1353;30792:1693;;;:::o;14953:132::-;15028:12;:10;:12::i;:::-;15017:23;;:7;:5;:7::i;:::-;:23;;;15009:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14953:132::o;16092:191::-;16166:16;16185:6;;;;;;;;;;;16166:25;;16211:8;16202:6;;:17;;;;;;;;;;;;;;;;;;16266:8;16235:40;;16256:8;16235:40;;;;;;;;;;;;16155:128;16092:191;:::o;32633:474::-;29381:4;29362:16;;:23;;;;;;;;;;;;;;;;;;32719:12:::1;32758:1;32735:20;:24;;;;:::i;:::-;32719:41;;32771:17;32815:4;32792:20;:27;;;;:::i;:::-;32771:49;;32833:22;32858:21;32833:46;;32892:23;32910:4;32892:17;:23::i;:::-;32928:18;32974:14;32950:21;:38;;;;:::i;:::-;32928:61;;33002:36;33016:9;33027:10;33002:13;:36::i;:::-;33056:43;33071:4;33077:10;33089:9;33056:43;;;;;;;;:::i;:::-;;;;;;;;32708:399;;;;29427:5:::0;29408:16;;:24;;;;;;;;;;;;;;;;;;32633:474;:::o;33115:490::-;29381:4;29362:16;;:23;;;;;;;;;;;;;;;;;;33194:21:::1;33232:1;33218:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33194:40;;33263:4;33245;33250:1;33245:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;33289:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33279:4;33284:1;33279:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;33324:62;33341:4;33356:15;33374:11;33324:8;:62::i;:::-;33399:15;:66;;;33480:11;33506:1;33522:4;33541:15;;;;;;;;;;;33571;33399:198;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33183:422;29427:5:::0;29408:16;;:24;;;;;;;;;;;;;;;;;;33115:490;:::o;26479:776::-;26626:1;26610:18;;:4;:18;;;26602:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26703:1;26689:16;;:2;:16;;;26681:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;26758:19;26780:9;:15;26790:4;26780:15;;;;;;;;;;;;;;;;26758:37;;26843:6;26828:11;:21;;26806:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;26983:6;26969:11;:20;26951:9;:15;26961:4;26951:15;;;;;;;;;;;;;;;:38;;;;27186:6;27169:9;:13;27179:2;27169:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;27236:2;27221:26;;27230:4;27221:26;;;27240:6;27221:26;;;;;;:::i;:::-;;;;;;;;26591:664;26479:776;;;:::o;33613:406::-;29381:4;29362:16;;:23;;;;;;;;;;;;;;;;;;33730:62:::1;33747:4;33762:15;33780:11;33730:8;:62::i;:::-;33805:15;:31;;;33844:9;33877:4;33897:11;33923:1;33939::::0;33955:15:::1;;;;;;;;;;;33985;33805:206;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;29427:5:::0;29408:16;;:24;;;;;;;;;;;;;;;;;;33613: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:99::-;645:6;679:5;673:12;663:22;;593:99;;;:::o;698:169::-;782:11;816:6;811:3;804:19;856:4;851:3;847:14;832:29;;698:169;;;;:::o;873:246::-;954:1;964:113;978:6;975:1;972:13;964:113;;;1063:1;1058:3;1054:11;1048:18;1044:1;1039:3;1035:11;1028:39;1000:2;997:1;993:10;988:15;;964:113;;;1111:1;1102:6;1097:3;1093:16;1086:27;935:184;873:246;;;:::o;1125:102::-;1166:6;1217:2;1213:7;1208:2;1201:5;1197:14;1193:28;1183:38;;1125:102;;;:::o;1233:377::-;1321:3;1349:39;1382:5;1349:39;:::i;:::-;1404:71;1468:6;1463:3;1404:71;:::i;:::-;1397:78;;1484:65;1542:6;1537:3;1530:4;1523:5;1519:16;1484:65;:::i;:::-;1574:29;1596:6;1574:29;:::i;:::-;1569:3;1565:39;1558:46;;1325:285;1233:377;;;;:::o;1616:313::-;1729:4;1767:2;1756:9;1752:18;1744:26;;1816:9;1810:4;1806:20;1802:1;1791:9;1787:17;1780:47;1844:78;1917:4;1908:6;1844:78;:::i;:::-;1836:86;;1616:313;;;;:::o;2016:117::-;2125:1;2122;2115:12;2262:122;2335:24;2353:5;2335:24;:::i;:::-;2328:5;2325:35;2315:63;;2374:1;2371;2364:12;2315:63;2262:122;:::o;2390:139::-;2436:5;2474:6;2461:20;2452:29;;2490:33;2517:5;2490:33;:::i;:::-;2390:139;;;;:::o;2535:77::-;2572:7;2601:5;2590:16;;2535:77;;;:::o;2618:122::-;2691:24;2709:5;2691:24;:::i;:::-;2684:5;2681:35;2671:63;;2730:1;2727;2720:12;2671:63;2618:122;:::o;2746:139::-;2792:5;2830:6;2817:20;2808:29;;2846:33;2873:5;2846:33;:::i;:::-;2746:139;;;;:::o;2891:474::-;2959:6;2967;3016:2;3004:9;2995:7;2991:23;2987:32;2984:119;;;3022:79;;:::i;:::-;2984:119;3142:1;3167:53;3212:7;3203:6;3192:9;3188:22;3167:53;:::i;:::-;3157:63;;3113:117;3269:2;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3240:118;2891:474;;;;;:::o;3371:90::-;3405:7;3448:5;3441:13;3434:21;3423:32;;3371:90;;;:::o;3467:109::-;3548:21;3563:5;3548:21;:::i;:::-;3543:3;3536:34;3467:109;;:::o;3582:210::-;3669:4;3707:2;3696:9;3692:18;3684:26;;3720:65;3782:1;3771:9;3767:17;3758:6;3720:65;:::i;:::-;3582:210;;;;:::o;3798:60::-;3826:3;3847:5;3840:12;;3798:60;;;:::o;3864:142::-;3914:9;3947:53;3965:34;3974:24;3992:5;3974:24;:::i;:::-;3965:34;:::i;:::-;3947:53;:::i;:::-;3934:66;;3864:142;;;:::o;4012:126::-;4062:9;4095:37;4126:5;4095:37;:::i;:::-;4082:50;;4012:126;;;:::o;4144:152::-;4220:9;4253:37;4284:5;4253:37;:::i;:::-;4240:50;;4144:152;;;:::o;4302:183::-;4415:63;4472:5;4415:63;:::i;:::-;4410:3;4403:76;4302:183;;:::o;4491:274::-;4610:4;4648:2;4637:9;4633:18;4625:26;;4661:97;4755:1;4744:9;4740:17;4731:6;4661:97;:::i;:::-;4491:274;;;;:::o;4771:118::-;4858:24;4876:5;4858:24;:::i;:::-;4853:3;4846:37;4771:118;;:::o;4895:222::-;4988:4;5026:2;5015:9;5011:18;5003:26;;5039:71;5107:1;5096:9;5092:17;5083:6;5039:71;:::i;:::-;4895:222;;;;:::o;5123:619::-;5200:6;5208;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5646:2;5672:53;5717:7;5708:6;5697:9;5693:22;5672:53;:::i;:::-;5662:63;;5617:118;5123:619;;;;;:::o;5748:86::-;5783:7;5823:4;5816:5;5812:16;5801:27;;5748:86;;;:::o;5840:112::-;5923:22;5939:5;5923:22;:::i;:::-;5918:3;5911:35;5840:112;;:::o;5958:214::-;6047:4;6085:2;6074:9;6070:18;6062:26;;6098:67;6162:1;6151:9;6147:17;6138:6;6098:67;:::i;:::-;5958:214;;;;:::o;6178:329::-;6237:6;6286:2;6274:9;6265:7;6261:23;6257:32;6254:119;;;6292:79;;:::i;:::-;6254:119;6412:1;6437:53;6482:7;6473:6;6462:9;6458:22;6437:53;:::i;:::-;6427:63;;6383:117;6178:329;;;;:::o;6513:474::-;6581:6;6589;6638:2;6626:9;6617:7;6613:23;6609:32;6606:119;;;6644:79;;:::i;:::-;6606:119;6764:1;6789:53;6834:7;6825:6;6814:9;6810:22;6789:53;:::i;:::-;6779:63;;6735:117;6891:2;6917:53;6962:7;6953:6;6942:9;6938:22;6917:53;:::i;:::-;6907:63;;6862:118;6513:474;;;;;:::o;6993:::-;7061:6;7069;7118:2;7106:9;7097:7;7093:23;7089:32;7086:119;;;7124:79;;:::i;:::-;7086:119;7244:1;7269:53;7314:7;7305:6;7294:9;7290:22;7269:53;:::i;:::-;7259:63;;7215:117;7371:2;7397:53;7442:7;7433:6;7422:9;7418:22;7397:53;:::i;:::-;7387:63;;7342:118;6993:474;;;;;:::o;7473:116::-;7543:21;7558:5;7543:21;:::i;:::-;7536:5;7533:32;7523:60;;7579:1;7576;7569:12;7523:60;7473:116;:::o;7595:133::-;7638:5;7676:6;7663:20;7654:29;;7692:30;7716:5;7692:30;:::i;:::-;7595:133;;;;:::o;7734:468::-;7799:6;7807;7856:2;7844:9;7835:7;7831:23;7827:32;7824:119;;;7862:79;;:::i;:::-;7824:119;7982:1;8007:53;8052:7;8043:6;8032:9;8028:22;8007:53;:::i;:::-;7997:63;;7953:117;8109:2;8135:50;8177:7;8168:6;8157:9;8153:22;8135:50;:::i;:::-;8125:60;;8080:115;7734:468;;;;;:::o;8208:180::-;8256:77;8253:1;8246:88;8353:4;8350:1;8343:15;8377:4;8374:1;8367:15;8394:320;8438:6;8475:1;8469:4;8465:12;8455:22;;8522:1;8516:4;8512:12;8543:18;8533:81;;8599:4;8591:6;8587:17;8577:27;;8533:81;8661:2;8653:6;8650:14;8630:18;8627:38;8624:84;;8680:18;;:::i;:::-;8624:84;8445:269;8394:320;;;:::o;8720:180::-;8768:77;8765:1;8758:88;8865:4;8862:1;8855:15;8889:4;8886:1;8879:15;8906:191;8946:3;8965:20;8983:1;8965:20;:::i;:::-;8960:25;;8999:20;9017:1;8999:20;:::i;:::-;8994:25;;9042:1;9039;9035:9;9028:16;;9063:3;9060:1;9057:10;9054:36;;;9070:18;;:::i;:::-;9054:36;8906:191;;;;:::o;9103:228::-;9243:34;9239:1;9231:6;9227:14;9220:58;9312:11;9307:2;9299:6;9295:15;9288:36;9103:228;:::o;9337:366::-;9479:3;9500:67;9564:2;9559:3;9500:67;:::i;:::-;9493:74;;9576:93;9665:3;9576:93;:::i;:::-;9694:2;9689:3;9685:12;9678:19;;9337:366;;;:::o;9709:419::-;9875:4;9913:2;9902:9;9898:18;9890:26;;9962:9;9956:4;9952:20;9948:1;9937:9;9933:17;9926:47;9990:131;10116:4;9990:131;:::i;:::-;9982:139;;9709:419;;;:::o;10134:234::-;10274:34;10270:1;10262:6;10258:14;10251:58;10343:17;10338:2;10330:6;10326:15;10319:42;10134:234;:::o;10374:366::-;10516:3;10537:67;10601:2;10596:3;10537:67;:::i;:::-;10530:74;;10613:93;10702:3;10613:93;:::i;:::-;10731:2;10726:3;10722:12;10715:19;;10374:366;;;:::o;10746:419::-;10912:4;10950:2;10939:9;10935:18;10927:26;;10999:9;10993:4;10989:20;10985:1;10974:9;10970:17;10963:47;11027:131;11153:4;11027:131;:::i;:::-;11019:139;;10746:419;;;:::o;11171:180::-;11219:77;11216:1;11209:88;11316:4;11313:1;11306:15;11340:4;11337:1;11330:15;11357:185;11397:1;11414:20;11432:1;11414:20;:::i;:::-;11409:25;;11448:20;11466:1;11448:20;:::i;:::-;11443:25;;11487:1;11477:35;;11492:18;;:::i;:::-;11477:35;11534:1;11531;11527:9;11522:14;;11357:185;;;;:::o;11548:248::-;11688:34;11684:1;11676:6;11672:14;11665:58;11757:31;11752:2;11744:6;11740:15;11733:56;11548:248;:::o;11802:366::-;11944:3;11965:67;12029:2;12024:3;11965:67;:::i;:::-;11958:74;;12041:93;12130:3;12041:93;:::i;:::-;12159:2;12154:3;12150:12;12143:19;;11802:366;;;:::o;12174:419::-;12340:4;12378:2;12367:9;12363:18;12355:26;;12427:9;12421:4;12417:20;12413:1;12402:9;12398:17;12391:47;12455:131;12581:4;12455:131;:::i;:::-;12447:139;;12174:419;;;:::o;12599:102::-;12641:8;12688:5;12685:1;12681:13;12660:34;;12599:102;;;:::o;12707:848::-;12768:5;12775:4;12799:6;12790:15;;12823:5;12814:14;;12837:712;12858:1;12848:8;12845:15;12837:712;;;12953:4;12948:3;12944:14;12938:4;12935:24;12932:50;;;12962:18;;:::i;:::-;12932:50;13012:1;13002:8;12998:16;12995:451;;;13427:4;13420:5;13416:16;13407:25;;12995:451;13477:4;13471;13467:15;13459:23;;13507:32;13530:8;13507:32;:::i;:::-;13495:44;;12837:712;;;12707:848;;;;;;;:::o;13561:1073::-;13615:5;13806:8;13796:40;;13827:1;13818:10;;13829:5;;13796:40;13855:4;13845:36;;13872:1;13863:10;;13874:5;;13845:36;13941:4;13989:1;13984:27;;;;14025:1;14020:191;;;;13934:277;;13984:27;14002:1;13993:10;;14004:5;;;14020:191;14065:3;14055:8;14052:17;14049:43;;;14072:18;;:::i;:::-;14049:43;14121:8;14118:1;14114:16;14105:25;;14156:3;14149:5;14146:14;14143:40;;;14163:18;;:::i;:::-;14143:40;14196:5;;;13934:277;;14320:2;14310:8;14307:16;14301:3;14295:4;14292:13;14288:36;14270:2;14260:8;14257:16;14252:2;14246:4;14243:12;14239:35;14223:111;14220:246;;;14376:8;14370:4;14366:19;14357:28;;14411:3;14404:5;14401:14;14398:40;;;14418:18;;:::i;:::-;14398:40;14451:5;;14220:246;14491:42;14529:3;14519:8;14513:4;14510:1;14491:42;:::i;:::-;14476:57;;;;14565:4;14560:3;14556:14;14549:5;14546:25;14543:51;;;14574:18;;:::i;:::-;14543:51;14623:4;14616:5;14612:16;14603:25;;13561:1073;;;;;;:::o;14640:281::-;14698:5;14722:23;14740:4;14722:23;:::i;:::-;14714:31;;14766:25;14782:8;14766:25;:::i;:::-;14754:37;;14810:104;14847:66;14837:8;14831:4;14810:104;:::i;:::-;14801:113;;14640:281;;;;:::o;14927:348::-;14967:7;14990:20;15008:1;14990:20;:::i;:::-;14985:25;;15024:20;15042:1;15024:20;:::i;:::-;15019:25;;15212:1;15144:66;15140:74;15137:1;15134:81;15129:1;15122:9;15115:17;15111:105;15108:131;;;15219:18;;:::i;:::-;15108:131;15267:1;15264;15260:9;15249:20;;14927:348;;;;:::o;15281:224::-;15421:34;15417:1;15409:6;15405:14;15398:58;15490:7;15485:2;15477:6;15473:15;15466:32;15281:224;:::o;15511:366::-;15653:3;15674:67;15738:2;15733:3;15674:67;:::i;:::-;15667:74;;15750:93;15839:3;15750:93;:::i;:::-;15868:2;15863:3;15859:12;15852:19;;15511:366;;;:::o;15883:419::-;16049:4;16087:2;16076:9;16072:18;16064:26;;16136:9;16130:4;16126:20;16122:1;16111:9;16107:17;16100:47;16164:131;16290:4;16164:131;:::i;:::-;16156:139;;15883:419;;;:::o;16308:225::-;16448:34;16444:1;16436:6;16432:14;16425:58;16517:8;16512:2;16504:6;16500:15;16493:33;16308:225;:::o;16539:366::-;16681:3;16702:67;16766:2;16761:3;16702:67;:::i;:::-;16695:74;;16778:93;16867:3;16778:93;:::i;:::-;16896:2;16891:3;16887:12;16880:19;;16539:366;;;:::o;16911:419::-;17077:4;17115:2;17104:9;17100:18;17092:26;;17164:9;17158:4;17154:20;17150:1;17139:9;17135:17;17128:47;17192:131;17318:4;17192:131;:::i;:::-;17184:139;;16911:419;;;:::o;17336:223::-;17476:34;17472:1;17464:6;17460:14;17453:58;17545:6;17540:2;17532:6;17528:15;17521:31;17336:223;:::o;17565:366::-;17707:3;17728:67;17792:2;17787:3;17728:67;:::i;:::-;17721:74;;17804:93;17893:3;17804:93;:::i;:::-;17922:2;17917:3;17913:12;17906:19;;17565:366;;;:::o;17937:419::-;18103:4;18141:2;18130:9;18126:18;18118:26;;18190:9;18184:4;18180:20;18176:1;18165:9;18161:17;18154:47;18218:131;18344:4;18218:131;:::i;:::-;18210:139;;17937:419;;;:::o;18362:221::-;18502:34;18498:1;18490:6;18486:14;18479:58;18571:4;18566:2;18558:6;18554:15;18547:29;18362:221;:::o;18589:366::-;18731:3;18752:67;18816:2;18811:3;18752:67;:::i;:::-;18745:74;;18828:93;18917:3;18828:93;:::i;:::-;18946:2;18941:3;18937:12;18930:19;;18589:366;;;:::o;18961:419::-;19127:4;19165:2;19154:9;19150:18;19142:26;;19214:9;19208:4;19204:20;19200:1;19189:9;19185:17;19178:47;19242:131;19368:4;19242:131;:::i;:::-;19234:139;;18961:419;;;:::o;19386:179::-;19526:31;19522:1;19514:6;19510:14;19503:55;19386:179;:::o;19571:366::-;19713:3;19734:67;19798:2;19793:3;19734:67;:::i;:::-;19727:74;;19810:93;19899:3;19810:93;:::i;:::-;19928:2;19923:3;19919:12;19912:19;;19571:366;;;:::o;19943:419::-;20109:4;20147:2;20136:9;20132:18;20124:26;;20196:9;20190:4;20186:20;20182:1;20171:9;20167:17;20160:47;20224:131;20350:4;20224:131;:::i;:::-;20216:139;;19943:419;;;:::o;20368:224::-;20508:34;20504:1;20496:6;20492:14;20485:58;20577:7;20572:2;20564:6;20560:15;20553:32;20368:224;:::o;20598:366::-;20740:3;20761:67;20825:2;20820:3;20761:67;:::i;:::-;20754:74;;20837:93;20926:3;20837:93;:::i;:::-;20955:2;20950:3;20946:12;20939:19;;20598:366;;;:::o;20970:419::-;21136:4;21174:2;21163:9;21159:18;21151:26;;21223:9;21217:4;21213:20;21209:1;21198:9;21194:17;21187:47;21251:131;21377:4;21251:131;:::i;:::-;21243:139;;20970:419;;;:::o;21395:222::-;21535:34;21531:1;21523:6;21519:14;21512:58;21604:5;21599:2;21591:6;21587:15;21580:30;21395:222;:::o;21623:366::-;21765:3;21786:67;21850:2;21845:3;21786:67;:::i;:::-;21779:74;;21862:93;21951:3;21862:93;:::i;:::-;21980:2;21975:3;21971:12;21964:19;;21623:366;;;:::o;21995:419::-;22161:4;22199:2;22188:9;22184:18;22176:26;;22248:9;22242:4;22238:20;22234:1;22223:9;22219:17;22212:47;22276:131;22402:4;22276:131;:::i;:::-;22268:139;;21995:419;;;:::o;22420:225::-;22560:34;22556:1;22548:6;22544:14;22537:58;22629:8;22624:2;22616:6;22612:15;22605:33;22420:225;:::o;22651:366::-;22793:3;22814:67;22878:2;22873:3;22814:67;:::i;:::-;22807:74;;22890:93;22979:3;22890:93;:::i;:::-;23008:2;23003:3;22999:12;22992:19;;22651:366;;;:::o;23023:419::-;23189:4;23227:2;23216:9;23212:18;23204:26;;23276:9;23270:4;23266:20;23262:1;23251:9;23247:17;23240:47;23304:131;23430:4;23304:131;:::i;:::-;23296:139;;23023:419;;;:::o;23448:194::-;23488:4;23508:20;23526:1;23508:20;:::i;:::-;23503:25;;23542:20;23560:1;23542:20;:::i;:::-;23537:25;;23586:1;23583;23579:9;23571:17;;23610:1;23604:4;23601:11;23598:37;;;23615:18;;:::i;:::-;23598:37;23448:194;;;;:::o;23648:182::-;23788:34;23784:1;23776:6;23772:14;23765:58;23648:182;:::o;23836:366::-;23978:3;23999:67;24063:2;24058:3;23999:67;:::i;:::-;23992:74;;24075:93;24164:3;24075:93;:::i;:::-;24193:2;24188:3;24184:12;24177:19;;23836:366;;;:::o;24208:419::-;24374:4;24412:2;24401:9;24397:18;24389:26;;24461:9;24455:4;24451:20;24447:1;24436:9;24432:17;24425:47;24489:131;24615:4;24489:131;:::i;:::-;24481:139;;24208:419;;;:::o;24633:442::-;24782:4;24820:2;24809:9;24805:18;24797:26;;24833:71;24901:1;24890:9;24886:17;24877:6;24833:71;:::i;:::-;24914:72;24982:2;24971:9;24967:18;24958:6;24914:72;:::i;:::-;24996;25064:2;25053:9;25049:18;25040:6;24996:72;:::i;:::-;24633:442;;;;;;:::o;25081:180::-;25129:77;25126:1;25119:88;25226:4;25223:1;25216:15;25250:4;25247:1;25240:15;25267:180;25315:77;25312:1;25305:88;25412:4;25409:1;25402:15;25436:4;25433:1;25426:15;25453:143;25510:5;25541:6;25535:13;25526:22;;25557:33;25584:5;25557:33;:::i;:::-;25453:143;;;;:::o;25602:351::-;25672:6;25721:2;25709:9;25700:7;25696:23;25692:32;25689:119;;;25727:79;;:::i;:::-;25689:119;25847:1;25872:64;25928:7;25919:6;25908:9;25904:22;25872:64;:::i;:::-;25862:74;;25818:128;25602:351;;;;:::o;25959:85::-;26004:7;26033:5;26022:16;;25959:85;;;:::o;26050:158::-;26108:9;26141:61;26159:42;26168:32;26194:5;26168:32;:::i;:::-;26159:42;:::i;:::-;26141:61;:::i;:::-;26128:74;;26050:158;;;:::o;26214:147::-;26309:45;26348:5;26309:45;:::i;:::-;26304:3;26297:58;26214:147;;:::o;26367:114::-;26434:6;26468:5;26462:12;26452:22;;26367:114;;;:::o;26487:184::-;26586:11;26620:6;26615:3;26608:19;26660:4;26655:3;26651:14;26636:29;;26487:184;;;;:::o;26677:132::-;26744:4;26767:3;26759:11;;26797:4;26792:3;26788:14;26780:22;;26677:132;;;:::o;26815:108::-;26892:24;26910:5;26892:24;:::i;:::-;26887:3;26880:37;26815:108;;:::o;26929:179::-;26998:10;27019:46;27061:3;27053:6;27019:46;:::i;:::-;27097:4;27092:3;27088:14;27074:28;;26929:179;;;;:::o;27114:113::-;27184:4;27216;27211:3;27207:14;27199:22;;27114:113;;;:::o;27263:732::-;27382:3;27411:54;27459:5;27411:54;:::i;:::-;27481:86;27560:6;27555:3;27481:86;:::i;:::-;27474:93;;27591:56;27641:5;27591:56;:::i;:::-;27670:7;27701:1;27686:284;27711:6;27708:1;27705:13;27686:284;;;27787:6;27781:13;27814:63;27873:3;27858:13;27814:63;:::i;:::-;27807:70;;27900:60;27953:6;27900:60;:::i;:::-;27890:70;;27746:224;27733:1;27730;27726:9;27721:14;;27686:284;;;27690:14;27986:3;27979:10;;27387:608;;;27263:732;;;;:::o;28001:831::-;28264:4;28302:3;28291:9;28287:19;28279:27;;28316:71;28384:1;28373:9;28369:17;28360:6;28316:71;:::i;:::-;28397:80;28473:2;28462:9;28458:18;28449:6;28397:80;:::i;:::-;28524:9;28518:4;28514:20;28509:2;28498:9;28494:18;28487:48;28552:108;28655:4;28646:6;28552:108;:::i;:::-;28544:116;;28670:72;28738:2;28727:9;28723:18;28714:6;28670:72;:::i;:::-;28752:73;28820:3;28809:9;28805:19;28796:6;28752:73;:::i;:::-;28001:831;;;;;;;;:::o;28838:807::-;29087:4;29125:3;29114:9;29110:19;29102:27;;29139:71;29207:1;29196:9;29192:17;29183:6;29139:71;:::i;:::-;29220:72;29288:2;29277:9;29273:18;29264:6;29220:72;:::i;:::-;29302:80;29378:2;29367:9;29363:18;29354:6;29302:80;:::i;:::-;29392;29468:2;29457:9;29453:18;29444:6;29392:80;:::i;:::-;29482:73;29550:3;29539:9;29535:19;29526:6;29482:73;:::i;:::-;29565;29633:3;29622:9;29618:19;29609:6;29565:73;:::i;:::-;28838:807;;;;;;;;;:::o;29651:143::-;29708:5;29739:6;29733:13;29724:22;;29755:33;29782:5;29755:33;:::i;:::-;29651:143;;;;:::o;29800:663::-;29888:6;29896;29904;29953:2;29941:9;29932:7;29928:23;29924:32;29921:119;;;29959:79;;:::i;:::-;29921:119;30079:1;30104:64;30160:7;30151:6;30140:9;30136:22;30104:64;:::i;:::-;30094:74;;30050:128;30217:2;30243:64;30299:7;30290:6;30279:9;30275:22;30243:64;:::i;:::-;30233:74;;30188:129;30356:2;30382:64;30438:7;30429:6;30418:9;30414:22;30382:64;:::i;:::-;30372:74;;30327:129;29800:663;;;;;:::o

Swarm Source

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