ETH Price: $2,885.96 (-2.49%)
 

Overview

Max Total Supply

1,000,000,000 GOOFS

Holders

1,539,728 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1 GOOFS

Value
$0.00
0xe7ce98559f46272b1e42724c26217bd69de66380
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Goof Around & Find Out!

Contract Source Code Verified (Exact Match)

Contract Name:
GOOFS

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2025-01-27
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

/**
* _______  _______  _______  _______  _______ 
* |       ||       ||       ||       ||       |
* |    ___||   _   ||   _   ||    ___||  _____|
* |   | __ |  | |  ||  | |  ||   |___ | |_____ 
* |   ||  ||  |_|  ||  |_|  ||    ___||_____  |
* |   |_| ||       ||       ||   |     _____| |
* |_______||_______||_______||___|    |_______|
*
*/



/**
 * @dev IUniswapV2Factory Interface: Interface for interacting with the Uniswap V2 Factory contract.
 *
 * The Uniswap V2 Factory contract is responsible for creating and managing liquidity pairs.
 * It allows for the creation of new pairs and querying existing pairs for given token addresses.
 */
interface IUniswapV2Factory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

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

/*
 * @dev IUniswapV2Router Interface: This interface defines key functions for interacting with the Uniswap V2 Router contract.
 * The Uniswap V2 Router is a critical component for executing token swaps and liquidity operations in the Uniswap V2 ecosystem.
 *
 * Functions:
 * - `factory()`: Returns the address of the Uniswap V2 Factory contract.
 * - `WETH()`: Returns the address of the Wrapped Ether (WETH) token used in the protocol.
 * - `swapExactTokensForETHSupportingFeeOnTransferTokens`: Executes a token-to-ETH swap, ensuring compatibility with tokens that have transfer fees.
 *
 * Note:
 * - The `swapExactTokensForETHSupportingFeeOnTransferTokens` function is designed to support tokens with fees on transfers,
 *   making it versatile for use cases involving such tokens.
 * - This is an external interface, and these functions must be implemented in a concrete contract that interacts with Uniswap.
 */
interface IUniswapV2Router {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

/**
 * @dev Context: Abstract contract that provides information about the current execution context.
 * This includes the sender of the transaction and its data.
 * While these are generally available via msg.sender and msg.data,
 * this contract provides an abstraction layer that can be useful, especially
 * when dealing with meta-transactions, where the actual sender (or originator)
 * may differ from the address that directly sends the transaction.
 *
 * The `_msgSender` function is marked as `virtual` to allow for overriding
 * in derived contracts if needed.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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:
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value
    ) external returns (bool);
}

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

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

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

/**
 * @dev Standard ERC20 Errors
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @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}.
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256))
        private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value
    ) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

/*
 * @title GOOFS Token Contract
 * @dev This is a custom ERC20 token contract with additional functionality for marketing tax, wallet limits, and swap functionality.
 *
 * The contract includes the following key features:
 * - Marketing tax: Defines buy and sell marketing taxes for transactions involving Uniswap.
 * - Wallet limits: Implements a maximum wallet limit to prevent a single address from holding too much of the total supply.
 * - Tax exclusions: Allows the exclusion of specific addresses from paying marketing taxes or being subject to the wallet limit.
 * - Uniswap integration: Facilitates token swaps on Uniswap, with a router and pair addresses set up for liquidity management.
 *
 */
contract GOOFS is ERC20, Ownable {
    address public marketingWallet;
    uint8 public buyMarketingTax = 15;
    uint8 public sellMarketingTax = 15;
    uint256 private immutable _totalSupply = 1_000_000_000 * 10 ** decimals();
    uint256 public swapTokensThreshold = (1 * _totalSupply) / 1000;
    uint256 public maxWalletLimit = (5 * _totalSupply) / 100;

    mapping(address => bool) public isExcludedFromTax;
    mapping(address => bool) public isExcludedFromMaxWalletLimit;

    IUniswapV2Router public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    bool private _inSwapAndLiquify;

    event TaxExclusionUpdated(address indexed account, bool indexed status);
    event MaxWalletLimitExclusionUpdated(address indexed account, bool indexed status);
    event MarketingWalletChanged(address indexed oldWallet, address indexed newWallet);
    event MaxWalletLimitChanged(uint256 oldLimit, uint256 newLimit);
    event MarketingTaxChanged(uint8 oldBuyTax, uint8 buyMarketingTax, uint8 oldSellTax, uint8 sellMarketingTax);
    event SwapTokensThresholdChanged(uint256 oldThreshold, uint256 newThreshold);
    event AuditLog(string text, address indexed account);
    event Log(string text, uint256 value);

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

    /**
     * @dev Constructor for the GOOFS contract.
     *      Initializes the contract with the deployer's wallet, marketing wallet, and Uniswap V2 router.
     *      Mints the total supply to the deployer's wallet and sets up exclusions for certain addresses
     *      from tax and max wallet limit checks. It also creates the Uniswap V2 pair for liquidity and
     *      sets the exclusions for the pair.
     *
     * @param _deployerWallet Address of the deployer wallet to receive the total supply of the token.
     * @param _marketingWallet Address for the marketing wallet, which is excluded from tax and max wallet limit.
     * @param _uniswapV2Router Address of the Uniswap V2 router used to create the liquidity pair.
     */
    constructor(address _deployerWallet, address _marketingWallet, address _uniswapV2Router) ERC20("Goofs World", "GOOFS") Ownable(_deployerWallet) {
        isExcludedFromTax[_deployerWallet] = true;
        isExcludedFromMaxWalletLimit[_deployerWallet] = true;

        marketingWallet = _marketingWallet;
        isExcludedFromTax[marketingWallet] = true;
        isExcludedFromMaxWalletLimit[marketingWallet] = true;

        isExcludedFromMaxWalletLimit[address(this)] = true;
        _mint(_deployerWallet, _totalSupply);

        uniswapV2Router = IUniswapV2Router(_uniswapV2Router);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        isExcludedFromMaxWalletLimit[uniswapV2Pair] = true;
    }

    /**
     * @dev Internal function to update token transfers, apply marketing tax, and check wallet limits.
     *      This function is called on every transfer of tokens. If the transfer is to or from the Uniswap
     *      pair, the tax is applied based on whether it's a buy or a sell. It also ensures the transfer
     *      does not exceed the maximum wallet limit unless the recipient is excluded from the limit.
     *
     * @param from Address sending the tokens.
     * @param to Address receiving the tokens.
     * @param value Amount of tokens to be transferred.
     */
    function _update(
        address from,
        address to,
        uint256 value
    ) internal override {
        if ((from == uniswapV2Pair || to == uniswapV2Pair) && !(isExcludedFromTax[from] || isExcludedFromTax[to]) && !_inSwapAndLiquify) {
            uint256 taxValue = (from == uniswapV2Pair) ? ((value * buyMarketingTax) / 100) : ((value * sellMarketingTax) / 100);
            value -= taxValue;

            if (to == uniswapV2Pair) {// sell
                _transferETH();
            }

            super._update(from, address(this), taxValue);
        }
        require((isExcludedFromMaxWalletLimit[to] || (value + balanceOf(to)) <= maxWalletLimit), "ERC20: maxWalletLimit exceeded");
        super._update(from, to, value);
    }

    /**
     * @dev Private function to handle ETH transfer to the marketing wallet.
     */
    function _transferETH() private {
        uint256 contractBalance = balanceOf(address(this));
        if (contractBalance >= swapTokensThreshold) {
            _swapTokensForETH(contractBalance);
            payable(marketingWallet).transfer(address(this).balance);
        }
    }

    /**
     * @dev Private function to handle tax accumulated tokens conversion to ETH.
     */
    function _swapTokensForETH(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

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

    /**
     * @dev Sets the address of the new marketing wallet.
     * @param newWallet The address of the new marketing wallet.
     * Requirements:
     * `newWallet` cannot be the zero address.
     * Emits a {MarketingWalletChanged} event.
     */
    function changeMarketingWallet(address newWallet) external onlyOwner {
        require(newWallet != address(0), "ERC20: new wallet is zero address");
        address oldWallet = marketingWallet;
        marketingWallet = newWallet;

        emit MarketingWalletChanged(oldWallet, newWallet);
    }

    /**
     * @dev Excludes or includes an account from taxation.
     * @param account The address of the account to be excluded or included.
     * @param status The status to set for tax exclusion (true for exclusion, false for inclusion).
     * Requirements:
     * - The caller must be the contract owner.
     */
    function excludeFromTax(address account, bool status) external onlyOwner {
        isExcludedFromTax[account] = status;

        emit TaxExclusionUpdated(account, status);
    }

    /**
     * @dev Excludes or includes an account from the maximum wallet limit.
     * @param account The address of the account to be excluded or included.
     * @param status The status to set for maximum wallet limit exclusion (true for exclusion, false for inclusion).
     * Requirements:
     * - The caller must be the contract owner.
     */
    function excludeFromMaxWalletLimit(
        address account,
        bool status
    ) external onlyOwner {
        isExcludedFromMaxWalletLimit[account] = status;

        emit MaxWalletLimitExclusionUpdated(account, status);
    }

    /**
     * @dev Allows the contract owner to update the buy and sell marketing tax percentages.
     * This function is restricted to the contract owner.
     *
     * Functionality:
     * - Accepts new marketing tax percentages for both buy and sell transactions.
     * - Stores the current tax values in temporary variables before making updates.
     * - Updates the buy and sell marketing tax percentages to the new values provided.
     * - Emits the `MarketingTaxChanged` event to log both the old and new tax values for transparency.
     *
     * Requirements:
     * - The caller must be the contract owner (enforced by the `onlyOwner` modifier).
     * - The new tax values must not exceed 30% (validated within the function).
     *
     * Emits a {MarketingTaxChanged} event.
     * 
     * @param _buyMarketingTax The new buy marketing tax percentage.
     * @param _sellMarketingTax The new sell marketing tax percentage.
     */
    function changeBuySellMarketingTax(
        uint8 _buyMarketingTax,
        uint8 _sellMarketingTax
    ) external onlyOwner {
        require(_buyMarketingTax <= 15 && _sellMarketingTax <= 15 , "ERC20: tax could not be greater than 15%");
        uint8 oldBuyTax = buyMarketingTax;
        uint8 oldSellTax = sellMarketingTax;

        buyMarketingTax = _buyMarketingTax;
        sellMarketingTax = _sellMarketingTax;

        emit MarketingTaxChanged(
            oldBuyTax,
            buyMarketingTax,
            oldSellTax,
            sellMarketingTax
        );
    }

    /**
     * @dev Allows the owner to recover ETH from the contract and send it to the marketing wallet.
     * This function:
     * - Gets the current ETH balance of the contract.
     * - Transfers the entire balance to the marketing wallet.
     * - Ensures that the transfer is successful by checking the result.
     * - Emits an event for auditing the recovery process.
     *
     * Requirements:
     * - Only the contract owner can call this function (enforced by the `onlyOwner` modifier).
     *
     * Emits an `AuditLog` event to notify external listeners about the ETH recovery.
     */
    function recoverETHfromContract() external onlyOwner {
        uint ethBalance = address(this).balance;
        (bool succ, ) = payable(marketingWallet).call{value: ethBalance}("");
        require(succ, "Transfer failed");
        
        emit AuditLog("We have recover the stock eth from contract.", marketingWallet);
    }

    /**
     * @dev Allows the owner to recover ERC-20 tokens from the contract and send them to the marketing wallet.
     * This function:
     * - Ensures the owner cannot claim the contract's balance of its own tokens.
     * - Transfers the specified amount of tokens to the marketing wallet.
     * - Ensures that the transfer is successful by checking the result.
     * - Emits an event for auditing the recovery process.
     *
     * Requirements:
     * - Only the contract owner can call this function (enforced by the `onlyOwner` modifier).
     *
     * Emits a `Log` event to notify external listeners about the token recovery.
     *
     * @param _tokenAddress The address of the token to be recovered.
     * @param _amount The amount of tokens to be transferred to the marketing wallet.
     */
    function recoverTokensFromContract(address _tokenAddress, uint256 _amount) external onlyOwner {
        require(_tokenAddress != address(this), "Owner can't claim contract's balance of its own tokens");
        bool succ = IERC20(_tokenAddress).transfer(marketingWallet, _amount);
        require(succ, "Transfer failed");

        emit Log("We have recovered tokens from contract:", _amount);
    }


    function recoverOwnTokens(uint256 _amount) external onlyOwner {
        // Transfer the contract's own tokens to the marketing wallet
        require(IERC20(address(this)).balanceOf(address(this)) >= _amount, "Insufficient token balance in contract");
        bool succ = IERC20(address(this)).transfer(marketingWallet, _amount);
        require(succ, "Transfer failed");

        emit Log("Recovered contract's own tokens:", _amount);
    }


    /**
     * @dev Changes the maximum wallet holding limit.
     * 
     * This function allows the contract owner to modify the `maxWalletLimit`, which is the maximum 
     * number of tokens a wallet can hold. The new limit must be greater than zero. Upon a successful 
     * change, an event `MaxWalletLimitChanged` is emitted, logging the old and new limits for transparency. 
     * 
     * Requirements:
     * - The caller must be the contract owner.
     * - The new limit must be greater than zero.
     *
     * Emits the `MaxWalletLimitChanged` event with the old and new values.
     *
     * @param newLimit The new maximum wallet holding limit (in tokens).
     */
    function changeMaxWalletLimit(uint256 newLimit) external onlyOwner {
        require(newLimit > 0, "Limit must be greater than 0");
        uint256 oldLimit = maxWalletLimit;
        maxWalletLimit = newLimit;

        emit MaxWalletLimitChanged(oldLimit, newLimit);
    }

    /**
     * @dev Changes the token swap threshold for the contract.
     * 
     * This function allows the contract owner to modify the `swapTokensThreshold`, which represents the 
     * minimum amount of tokens required to trigger the token swap (e.g., for liquidity or other purposes).
     * The new threshold must be greater than zero. Once changed, the contract can perform token swaps 
     * when the threshold is met. The change is logged by emitting the `SwapTokensThresholdChanged` event.
     *  
     * Requirements:
     * - The caller must be the contract owner.
     * - The new threshold must be greater than zero.
     *
     * Emits the `SwapTokensThresholdChanged` event with the old and new threshold values.
     *
     * @param newThreshold The new token swap threshold (in tokens).
     */
    function changeSwapTokensThreshold(uint256 newThreshold) external onlyOwner {
        require(newThreshold > 0, "Threshold must be greater than 0");
        uint256 oldThreshold = swapTokensThreshold;
        swapTokensThreshold = newThreshold;

        emit SwapTokensThresholdChanged(oldThreshold, newThreshold);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_deployerWallet","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_uniswapV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"text","type":"string"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AuditLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"text","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"oldBuyTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyMarketingTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"oldSellTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"sellMarketingTax","type":"uint8"}],"name":"MarketingTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"MarketingWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"MaxWalletLimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"MaxWalletLimitExclusionUpdated","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":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"SwapTokensThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"TaxExclusionUpdated","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":[{"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":"value","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":"buyMarketingTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_buyMarketingTax","type":"uint8"},{"internalType":"uint8","name":"_sellMarketingTax","type":"uint8"}],"name":"changeBuySellMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"changeSwapTokensThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"excludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxWalletLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETHfromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverOwnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverTokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellMarketingTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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 IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600f600660146101000a81548160ff021916908360ff160217905550600f600660156101000a81548160ff021916908360ff16021790555061004a61063e60201b60201c565b600a61005691906112dc565b633b9aca006100659190611326565b6080908152506103e8608051600161007d9190611326565b6100879190611394565b6007556064608051600561009b9190611326565b6100a59190611394565b6008553480156100b3575f5ffd5b50604051614b6d380380614b6d83398181016040528101906100d59190611422565b826040518060400160405280600b81526020017f476f6f667320576f726c640000000000000000000000000000000000000000008152506040518060400160405280600581526020017f474f4f4653000000000000000000000000000000000000000000000000000000815250816003908161015191906116a6565b50806004908161016191906116a6565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101d4575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101cb9190611784565b60405180910390fd5b6101e38161064660201b60201c565b50600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160095f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506104218360805161070960201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104a0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c4919061179d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060a05173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561052b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061054f919061179d565b6040518363ffffffff1660e01b815260040161056c9291906117c8565b6020604051808303815f875af1158015610588573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ac919061179d565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250506001600a5f60c05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550505050611a9f565b5f6012905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610779575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107709190611784565b60405180910390fd5b61078a5f838361078e60201b60201c565b5050565b60c05173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806107f7575060c05173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b801561089b575060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610899575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b80156108b35750600b5f9054906101000a900460ff16155b156109af575f60c05173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461091d576064600660159054906101000a900460ff1660ff168361090e9190611326565b6109189190611394565b610948565b6064600660149054906101000a900460ff1660ff168361093d9190611326565b6109479190611394565b5b9050808261095691906117ef565b915060c05173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361099c5761099b610a7460201b60201c565b5b6109ad843083610b0760201b60201c565b505b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610a1f5750600854610a1183610d2060201b60201c565b82610a1c9190611822565b11155b610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906118af565b60405180910390fd5b610a6f838383610b0760201b60201c565b505050565b5f610a8430610d2060201b60201c565b90506007548110610b0457610a9e81610d6560201b60201c565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610b02573d5f5f3e3d5ffd5b505b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b57578060025f828254610b4b9190611822565b92505081905550610c25565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610be0578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610bd7939291906118dc565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c6c578060025f8282540392505081905550610cb6565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d139190611911565b60405180910390a3505050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6001600b5f6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115610d9b57610d9a61147c565b5b604051908082528060200260200182016040528015610dc95781602001602082028036833780820191505090505b50905030815f81518110610de057610ddf61192a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e89919061179d565b81600181518110610e9d57610e9c61192a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610eea3060a05184610f8460201b60201c565b60a05173ffffffffffffffffffffffffffffffffffffffff1663791ac947835f843061012c42610f1a9190611822565b6040518663ffffffff1660e01b8152600401610f3a959493929190611a47565b5f604051808303815f87803b158015610f51575f5ffd5b505af1158015610f63573d5f5f3e3d5ffd5b50505050505f600b5f6101000a81548160ff02191690831515021790555050565b610f978383836001610f9c60201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361100c575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016110039190611784565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361107c575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016110739190611784565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611165578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161115c9190611911565b60405180910390a35b50505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f5f8291508390505b60018511156111ed578086048111156111c9576111c861116b565b5b60018516156111d85780820291505b80810290506111e685611198565b94506111ad565b94509492505050565b5f8261120557600190506112c0565b81611212575f90506112c0565b8160018114611228576002811461123257611261565b60019150506112c0565b60ff8411156112445761124361116b565b5b8360020a91508482111561125b5761125a61116b565b5b506112c0565b5060208310610133831016604e8410600b84101617156112965782820a9050838111156112915761129061116b565b5b6112c0565b6112a384848460016111a4565b925090508184048111156112ba576112b961116b565b5b81810290505b9392505050565b5f819050919050565b5f60ff82169050919050565b5f6112e6826112c7565b91506112f1836112d0565b925061131e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846111f6565b905092915050565b5f611330826112c7565b915061133b836112c7565b9250828202611349816112c7565b915082820484148315176113605761135f61116b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61139e826112c7565b91506113a9836112c7565b9250826113b9576113b8611367565b5b828204905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113f1826113c8565b9050919050565b611401816113e7565b811461140b575f5ffd5b50565b5f8151905061141c816113f8565b92915050565b5f5f5f60608486031215611439576114386113c4565b5b5f6114468682870161140e565b93505060206114578682870161140e565b92505060406114688682870161140e565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806114ed57607f821691505b602082108103611500576114ff6114a9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026115627fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611527565b61156c8683611527565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6115a76115a261159d846112c7565b611584565b6112c7565b9050919050565b5f819050919050565b6115c08361158d565b6115d46115cc826115ae565b848454611533565b825550505050565b5f5f905090565b6115eb6115dc565b6115f68184846115b7565b505050565b5b818110156116195761160e5f826115e3565b6001810190506115fc565b5050565b601f82111561165e5761162f81611506565b61163884611518565b81016020851015611647578190505b61165b61165385611518565b8301826115fb565b50505b505050565b5f82821c905092915050565b5f61167e5f1984600802611663565b1980831691505092915050565b5f611696838361166f565b9150826002028217905092915050565b6116af82611472565b67ffffffffffffffff8111156116c8576116c761147c565b5b6116d282546114d6565b6116dd82828561161d565b5f60209050601f83116001811461170e575f84156116fc578287015190505b611706858261168b565b86555061176d565b601f19841661171c86611506565b5f5b828110156117435784890151825560018201915060208501945060208101905061171e565b86831015611760578489015161175c601f89168261166f565b8355505b6001600288020188555050505b505050505050565b61177e816113e7565b82525050565b5f6020820190506117975f830184611775565b92915050565b5f602082840312156117b2576117b16113c4565b5b5f6117bf8482850161140e565b91505092915050565b5f6040820190506117db5f830185611775565b6117e86020830184611775565b9392505050565b5f6117f9826112c7565b9150611804836112c7565b925082820390508181111561181c5761181b61116b565b5b92915050565b5f61182c826112c7565b9150611837836112c7565b925082820190508082111561184f5761184e61116b565b5b92915050565b5f82825260208201905092915050565b7f45524332303a206d617857616c6c65744c696d697420657863656564656400005f82015250565b5f611899601e83611855565b91506118a482611865565b602082019050919050565b5f6020820190508181035f8301526118c68161188d565b9050919050565b6118d6816112c7565b82525050565b5f6060820190506118ef5f830186611775565b6118fc60208301856118cd565b61190960408301846118cd565b949350505050565b5f6020820190506119245f8301846118cd565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f61197a61197561197084611957565b611584565b6112c7565b9050919050565b61198a81611960565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6119c2816113e7565b82525050565b5f6119d383836119b9565b60208301905092915050565b5f602082019050919050565b5f6119f582611990565b6119ff818561199a565b9350611a0a836119aa565b805f5b83811015611a3a578151611a2188826119c8565b9750611a2c836119df565b925050600181019050611a0d565b5085935050505092915050565b5f60a082019050611a5a5f8301886118cd565b611a676020830187611981565b8181036040830152611a7981866119eb565b9050611a886060830185611775565b611a9560808301846118cd565b9695505050505050565b60805160a05160c051613076611af75f395f81816108c90152818161193f0152818161199401528181611aa60152611b6301525f81816107bf01528181611fda015281816120b901526120e001525f50506130765ff3fe6080604052600436106101d0575f3560e01c806395d89b41116100f6578063c6a3064711610094578063dd62ed3e11610063578063dd62ed3e14610655578063e6be4a7214610691578063e96db1ef146106b9578063f2fde38b146106e3576101d7565b8063c6a30647146105b1578063cb4ca631146105d9578063ce831ed514610615578063cef851391461062b576101d7565b8063bb85c6d1116100d0578063bb85c6d114610511578063c120186414610539578063c1f404ab14610561578063c30adfd714610589576101d7565b806395d89b411461046f578063a8a69b9d14610499578063a9059cbb146104d5576101d7565b8063330124111161016e578063715018a61161013d578063715018a6146103dd57806375f0a874146103f3578063781edb3c1461041d5780638da5cb5b14610445576101d7565b8063330124111461032357806349bd5a5e1461034d57806366a88d961461037757806370a08231146103a1576101d7565b806318160ddd116101aa57806318160ddd1461026b578063212e3b2b1461029557806323b872dd146102bd578063313ce567146102f9576101d7565b806306fdde03146101db578063095ea7b3146102055780631694505e14610241576101d7565b366101d757005b5f5ffd5b3480156101e6575f5ffd5b506101ef61070b565b6040516101fc9190612206565b60405180910390f35b348015610210575f5ffd5b5061022b600480360381019061022691906122b7565b61079b565b604051610238919061230f565b60405180910390f35b34801561024c575f5ffd5b506102556107bd565b6040516102629190612383565b60405180910390f35b348015610276575f5ffd5b5061027f6107e1565b60405161028c91906123ab565b60405180910390f35b3480156102a0575f5ffd5b506102bb60048036038101906102b691906123c4565b6107ea565b005b3480156102c8575f5ffd5b506102e360048036038101906102de91906123ef565b61087e565b6040516102f0919061230f565b60405180910390f35b348015610304575f5ffd5b5061030d6108ac565b60405161031a919061245a565b60405180910390f35b34801561032e575f5ffd5b506103376108b4565b604051610344919061245a565b60405180910390f35b348015610358575f5ffd5b506103616108c7565b60405161036e9190612482565b60405180910390f35b348015610382575f5ffd5b5061038b6108eb565b60405161039891906123ab565b60405180910390f35b3480156103ac575f5ffd5b506103c760048036038101906103c2919061249b565b6108f1565b6040516103d491906123ab565b60405180910390f35b3480156103e8575f5ffd5b506103f1610936565b005b3480156103fe575f5ffd5b50610407610949565b6040516104149190612482565b60405180910390f35b348015610428575f5ffd5b50610443600480360381019061043e91906124f0565b61096e565b005b348015610450575f5ffd5b50610459610a14565b6040516104669190612482565b60405180910390f35b34801561047a575f5ffd5b50610483610a3c565b6040516104909190612206565b60405180910390f35b3480156104a4575f5ffd5b506104bf60048036038101906104ba919061249b565b610acc565b6040516104cc919061230f565b60405180910390f35b3480156104e0575f5ffd5b506104fb60048036038101906104f691906122b7565b610ae9565b604051610508919061230f565b60405180910390f35b34801561051c575f5ffd5b506105376004803603810190610532919061249b565b610b0b565b005b348015610544575f5ffd5b5061055f600480360381019061055a91906123c4565b610c44565b005b34801561056c575f5ffd5b50610587600480360381019061058291906123c4565b610cd8565b005b348015610594575f5ffd5b506105af60048036038101906105aa9190612558565b610eb4565b005b3480156105bc575f5ffd5b506105d760048036038101906105d291906124f0565b610fd0565b005b3480156105e4575f5ffd5b506105ff60048036038101906105fa919061249b565b611076565b60405161060c919061230f565b60405180910390f35b348015610620575f5ffd5b50610629611093565b005b348015610636575f5ffd5b5061063f6111d9565b60405161064c91906123ab565b60405180910390f35b348015610660575f5ffd5b5061067b60048036038101906106769190612596565b6111df565b60405161068891906123ab565b60405180910390f35b34801561069c575f5ffd5b506106b760048036038101906106b291906122b7565b611261565b005b3480156106c4575f5ffd5b506106cd6113f2565b6040516106da919061245a565b60405180910390f35b3480156106ee575f5ffd5b506107096004803603810190610704919061249b565b611405565b005b60606003805461071a90612601565b80601f016020809104026020016040519081016040528092919081815260200182805461074690612601565b80156107915780601f1061076857610100808354040283529160200191610791565b820191905f5260205f20905b81548152906001019060200180831161077457829003601f168201915b5050505050905090565b5f5f6107a5611489565b90506107b2818585611490565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b6107f26114a2565b5f8111610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b9061267b565b60405180910390fd5b5f6008549050816008819055507ff521ac26681f2082cd832d245ffb0df3132b4f18099e967f203be27e4b746f518183604051610872929190612699565b60405180910390a15050565b5f5f610888611489565b9050610895858285611529565b6108a08585856115bb565b60019150509392505050565b5f6012905090565b600660149054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60085481565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61093e6114a2565b6109475f6116ab565b565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109766114a2565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fb0e21c0d53f57d838a3a08178ccf2c29624b47bd4f5f1080f5b688603c48118860405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a4b90612601565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790612601565b8015610ac25780601f10610a9957610100808354040283529160200191610ac2565b820191905f5260205f20905b815481529060010190602001808311610aa557829003601f168201915b5050505050905090565b600a602052805f5260405f205f915054906101000a900460ff1681565b5f5f610af3611489565b9050610b008185856115bb565b600191505092915050565b610b136114a2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890612730565b60405180910390fd5b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc17db519c06a38e30a448e03e08b3edec28a0a29d239f693ab94a6206a5ca63d60405160405180910390a35050565b610c4c6114a2565b5f8111610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590612798565b60405180910390fd5b5f6007549050816007819055507fa307a9ae7d5512e3add205b7fee6c3f9b8e4bcf8a3de7878041f9364b862bb678183604051610ccc929190612699565b60405180910390a15050565b610ce06114a2565b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d1a9190612482565b602060405180830381865afa158015610d35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5991906127ca565b1015610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190612865565b60405180910390fd5b5f3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401610df7929190612883565b6020604051808303815f875af1158015610e13573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3791906128be565b905080610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090612933565b60405180910390fd5b7fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b582604051610ea8919061299b565b60405180910390a15050565b610ebc6114a2565b600f8260ff1611158015610ed45750600f8160ff1611155b610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90612a37565b60405180910390fd5b5f600660149054906101000a900460ff1690505f600660159054906101000a900460ff16905083600660146101000a81548160ff021916908360ff16021790555082600660156101000a81548160ff021916908360ff1602179055507f0cdae21e5d34c631f2f4cb6e5554d779e5222802fcc0c0080aa458c92c9d0b8082600660149054906101000a900460ff1683600660159054906101000a900460ff16604051610fc29493929190612a55565b60405180910390a150505050565b610fd86114a2565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f057dc60ecf6df48e0f4af40ef0f88074d41e0ce54a1fef20925cd23c6de0386060405160405180910390a35050565b6009602052805f5260405f205f915054906101000a900460ff1681565b61109b6114a2565b5f4790505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516110e590612ac5565b5f6040518083038185875af1925050503d805f811461111f576040519150601f19603f3d011682016040523d82523d5f602084013e611124565b606091505b5050905080611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612933565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a006040516111cd90612b49565b60405180910390a25050565b60075481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6112696114a2565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90612bd7565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611334929190612883565b6020604051808303815f875af1158015611350573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137491906128be565b9050806113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90612933565b60405180910390fd5b7fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5826040516113e59190612c65565b60405180910390a1505050565b600660159054906101000a900460ff1681565b61140d6114a2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361147d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114749190612482565b60405180910390fd5b611486816116ab565b50565b5f33905090565b61149d838383600161176e565b505050565b6114aa611489565b73ffffffffffffffffffffffffffffffffffffffff166114c8610a14565b73ffffffffffffffffffffffffffffffffffffffff1614611527576114eb611489565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161151e9190612482565b60405180910390fd5b565b5f61153484846111df565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115b557818110156115a6578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161159d93929190612c91565b60405180910390fd5b6115b484848484035f61176e565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361162b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016116229190612482565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361169b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016116929190612482565b60405180910390fd5b6116a683838361193d565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117de575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016117d59190612482565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361184e575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118459190612482565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611937578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161192e91906123ab565b60405180910390a35b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806119e257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8015611a86575060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611a84575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b8015611a9e5750600b5f9054906101000a900460ff16155b15611bca575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611b26576064600660159054906101000a900460ff1660ff1683611b179190612cf3565b611b219190612d61565b611b51565b6064600660149054906101000a900460ff1660ff1683611b469190612cf3565b611b509190612d61565b5b90508082611b5f9190612d91565b91507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bbd57611bbc611c83565b5b611bc8843083611d0a565b505b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611c345750600854611c26836108f1565b82611c319190612dc4565b11155b611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90612e41565b60405180910390fd5b611c7e838383611d0a565b505050565b5f611c8d306108f1565b90506007548110611d0757611ca181611f23565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611d05573d5f5f3e3d5ffd5b505b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d5a578060025f828254611d4e9190612dc4565b92505081905550611e28565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611de3578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611dda93929190612c91565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e6f578060025f8282540392505081905550611eb9565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f1691906123ab565b60405180910390a3505050565b6001600b5f6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115611f5957611f58612e5f565b5b604051908082528060200260200182016040528015611f875781602001602082028036833780820191505090505b50905030815f81518110611f9e57611f9d612e8c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612041573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120659190612ecd565b8160018151811061207957612078612e8c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506120de307f000000000000000000000000000000000000000000000000000000000000000084611490565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f843061012c4261212c9190612dc4565b6040518663ffffffff1660e01b815260040161214c959493929190612fe8565b5f604051808303815f87803b158015612163575f5ffd5b505af1158015612175573d5f5f3e3d5ffd5b50505050505f600b5f6101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6121d882612196565b6121e281856121a0565b93506121f28185602086016121b0565b6121fb816121be565b840191505092915050565b5f6020820190508181035f83015261221e81846121ce565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6122538261222a565b9050919050565b61226381612249565b811461226d575f5ffd5b50565b5f8135905061227e8161225a565b92915050565b5f819050919050565b61229681612284565b81146122a0575f5ffd5b50565b5f813590506122b18161228d565b92915050565b5f5f604083850312156122cd576122cc612226565b5b5f6122da85828601612270565b92505060206122eb858286016122a3565b9150509250929050565b5f8115159050919050565b612309816122f5565b82525050565b5f6020820190506123225f830184612300565b92915050565b5f819050919050565b5f61234b6123466123418461222a565b612328565b61222a565b9050919050565b5f61235c82612331565b9050919050565b5f61236d82612352565b9050919050565b61237d81612363565b82525050565b5f6020820190506123965f830184612374565b92915050565b6123a581612284565b82525050565b5f6020820190506123be5f83018461239c565b92915050565b5f602082840312156123d9576123d8612226565b5b5f6123e6848285016122a3565b91505092915050565b5f5f5f6060848603121561240657612405612226565b5b5f61241386828701612270565b935050602061242486828701612270565b9250506040612435868287016122a3565b9150509250925092565b5f60ff82169050919050565b6124548161243f565b82525050565b5f60208201905061246d5f83018461244b565b92915050565b61247c81612249565b82525050565b5f6020820190506124955f830184612473565b92915050565b5f602082840312156124b0576124af612226565b5b5f6124bd84828501612270565b91505092915050565b6124cf816122f5565b81146124d9575f5ffd5b50565b5f813590506124ea816124c6565b92915050565b5f5f6040838503121561250657612505612226565b5b5f61251385828601612270565b9250506020612524858286016124dc565b9150509250929050565b6125378161243f565b8114612541575f5ffd5b50565b5f813590506125528161252e565b92915050565b5f5f6040838503121561256e5761256d612226565b5b5f61257b85828601612544565b925050602061258c85828601612544565b9150509250929050565b5f5f604083850312156125ac576125ab612226565b5b5f6125b985828601612270565b92505060206125ca85828601612270565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061261857607f821691505b60208210810361262b5761262a6125d4565b5b50919050565b7f4c696d6974206d7573742062652067726561746572207468616e2030000000005f82015250565b5f612665601c836121a0565b915061267082612631565b602082019050919050565b5f6020820190508181035f83015261269281612659565b9050919050565b5f6040820190506126ac5f83018561239c565b6126b9602083018461239c565b9392505050565b7f45524332303a206e65772077616c6c6574206973207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f61271a6021836121a0565b9150612725826126c0565b604082019050919050565b5f6020820190508181035f8301526127478161270e565b9050919050565b7f5468726573686f6c64206d7573742062652067726561746572207468616e20305f82015250565b5f6127826020836121a0565b915061278d8261274e565b602082019050919050565b5f6020820190508181035f8301526127af81612776565b9050919050565b5f815190506127c48161228d565b92915050565b5f602082840312156127df576127de612226565b5b5f6127ec848285016127b6565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f61284f6026836121a0565b915061285a826127f5565b604082019050919050565b5f6020820190508181035f83015261287c81612843565b9050919050565b5f6040820190506128965f830185612473565b6128a3602083018461239c565b9392505050565b5f815190506128b8816124c6565b92915050565b5f602082840312156128d3576128d2612226565b5b5f6128e0848285016128aa565b91505092915050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f61291d600f836121a0565b9150612928826128e9565b602082019050919050565b5f6020820190508181035f83015261294a81612911565b9050919050565b7f5265636f766572656420636f6e74726163742773206f776e20746f6b656e733a5f82015250565b5f6129856020836121a0565b915061299082612951565b602082019050919050565b5f6040820190508181035f8301526129b281612979565b90506129c1602083018461239c565b92915050565b7f45524332303a2074617820636f756c64206e6f742062652067726561746572205f8201527f7468616e20313525000000000000000000000000000000000000000000000000602082015250565b5f612a216028836121a0565b9150612a2c826129c7565b604082019050919050565b5f6020820190508181035f830152612a4e81612a15565b9050919050565b5f608082019050612a685f83018761244b565b612a75602083018661244b565b612a82604083018561244b565b612a8f606083018461244b565b95945050505050565b5f81905092915050565b50565b5f612ab05f83612a98565b9150612abb82612aa2565b5f82019050919050565b5f612acf82612aa5565b9150819050919050565b7f57652068617665207265636f766572207468652073746f636b206574682066725f8201527f6f6d20636f6e74726163742e0000000000000000000000000000000000000000602082015250565b5f612b33602c836121a0565b9150612b3e82612ad9565b604082019050919050565b5f6020820190508181035f830152612b6081612b27565b9050919050565b7f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c5f8201527f616e6365206f6620697473206f776e20746f6b656e7300000000000000000000602082015250565b5f612bc16036836121a0565b9150612bcc82612b67565b604082019050919050565b5f6020820190508181035f830152612bee81612bb5565b9050919050565b7f57652068617665207265636f766572656420746f6b656e732066726f6d20636f5f8201527f6e74726163743a00000000000000000000000000000000000000000000000000602082015250565b5f612c4f6027836121a0565b9150612c5a82612bf5565b604082019050919050565b5f6040820190508181035f830152612c7c81612c43565b9050612c8b602083018461239c565b92915050565b5f606082019050612ca45f830186612473565b612cb1602083018561239c565b612cbe604083018461239c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612cfd82612284565b9150612d0883612284565b9250828202612d1681612284565b91508282048414831517612d2d57612d2c612cc6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612d6b82612284565b9150612d7683612284565b925082612d8657612d85612d34565b5b828204905092915050565b5f612d9b82612284565b9150612da683612284565b9250828203905081811115612dbe57612dbd612cc6565b5b92915050565b5f612dce82612284565b9150612dd983612284565b9250828201905080821115612df157612df0612cc6565b5b92915050565b7f45524332303a206d617857616c6c65744c696d697420657863656564656400005f82015250565b5f612e2b601e836121a0565b9150612e3682612df7565b602082019050919050565b5f6020820190508181035f830152612e5881612e1f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612ec78161225a565b92915050565b5f60208284031215612ee257612ee1612226565b5b5f612eef84828501612eb9565b91505092915050565b5f819050919050565b5f612f1b612f16612f1184612ef8565b612328565b612284565b9050919050565b612f2b81612f01565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612f6381612249565b82525050565b5f612f748383612f5a565b60208301905092915050565b5f602082019050919050565b5f612f9682612f31565b612fa08185612f3b565b9350612fab83612f4b565b805f5b83811015612fdb578151612fc28882612f69565b9750612fcd83612f80565b925050600181019050612fae565b5085935050505092915050565b5f60a082019050612ffb5f83018861239c565b6130086020830187612f22565b818103604083015261301a8186612f8c565b90506130296060830185612473565b613036608083018461239c565b969550505050505056fea26469706673582212207b56cbf00c96f17ae80b2f080d205e3a4440daf9bf15d657278000031a7bd59c64736f6c634300081c00330000000000000000000000008dcec2f34c6ab383fb6ef1a9c792839b60fa0d49000000000000000000000000985fcba05f03aaba4153c68e6bbca058715e7ef90000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24

Deployed Bytecode

0x6080604052600436106101d0575f3560e01c806395d89b41116100f6578063c6a3064711610094578063dd62ed3e11610063578063dd62ed3e14610655578063e6be4a7214610691578063e96db1ef146106b9578063f2fde38b146106e3576101d7565b8063c6a30647146105b1578063cb4ca631146105d9578063ce831ed514610615578063cef851391461062b576101d7565b8063bb85c6d1116100d0578063bb85c6d114610511578063c120186414610539578063c1f404ab14610561578063c30adfd714610589576101d7565b806395d89b411461046f578063a8a69b9d14610499578063a9059cbb146104d5576101d7565b8063330124111161016e578063715018a61161013d578063715018a6146103dd57806375f0a874146103f3578063781edb3c1461041d5780638da5cb5b14610445576101d7565b8063330124111461032357806349bd5a5e1461034d57806366a88d961461037757806370a08231146103a1576101d7565b806318160ddd116101aa57806318160ddd1461026b578063212e3b2b1461029557806323b872dd146102bd578063313ce567146102f9576101d7565b806306fdde03146101db578063095ea7b3146102055780631694505e14610241576101d7565b366101d757005b5f5ffd5b3480156101e6575f5ffd5b506101ef61070b565b6040516101fc9190612206565b60405180910390f35b348015610210575f5ffd5b5061022b600480360381019061022691906122b7565b61079b565b604051610238919061230f565b60405180910390f35b34801561024c575f5ffd5b506102556107bd565b6040516102629190612383565b60405180910390f35b348015610276575f5ffd5b5061027f6107e1565b60405161028c91906123ab565b60405180910390f35b3480156102a0575f5ffd5b506102bb60048036038101906102b691906123c4565b6107ea565b005b3480156102c8575f5ffd5b506102e360048036038101906102de91906123ef565b61087e565b6040516102f0919061230f565b60405180910390f35b348015610304575f5ffd5b5061030d6108ac565b60405161031a919061245a565b60405180910390f35b34801561032e575f5ffd5b506103376108b4565b604051610344919061245a565b60405180910390f35b348015610358575f5ffd5b506103616108c7565b60405161036e9190612482565b60405180910390f35b348015610382575f5ffd5b5061038b6108eb565b60405161039891906123ab565b60405180910390f35b3480156103ac575f5ffd5b506103c760048036038101906103c2919061249b565b6108f1565b6040516103d491906123ab565b60405180910390f35b3480156103e8575f5ffd5b506103f1610936565b005b3480156103fe575f5ffd5b50610407610949565b6040516104149190612482565b60405180910390f35b348015610428575f5ffd5b50610443600480360381019061043e91906124f0565b61096e565b005b348015610450575f5ffd5b50610459610a14565b6040516104669190612482565b60405180910390f35b34801561047a575f5ffd5b50610483610a3c565b6040516104909190612206565b60405180910390f35b3480156104a4575f5ffd5b506104bf60048036038101906104ba919061249b565b610acc565b6040516104cc919061230f565b60405180910390f35b3480156104e0575f5ffd5b506104fb60048036038101906104f691906122b7565b610ae9565b604051610508919061230f565b60405180910390f35b34801561051c575f5ffd5b506105376004803603810190610532919061249b565b610b0b565b005b348015610544575f5ffd5b5061055f600480360381019061055a91906123c4565b610c44565b005b34801561056c575f5ffd5b50610587600480360381019061058291906123c4565b610cd8565b005b348015610594575f5ffd5b506105af60048036038101906105aa9190612558565b610eb4565b005b3480156105bc575f5ffd5b506105d760048036038101906105d291906124f0565b610fd0565b005b3480156105e4575f5ffd5b506105ff60048036038101906105fa919061249b565b611076565b60405161060c919061230f565b60405180910390f35b348015610620575f5ffd5b50610629611093565b005b348015610636575f5ffd5b5061063f6111d9565b60405161064c91906123ab565b60405180910390f35b348015610660575f5ffd5b5061067b60048036038101906106769190612596565b6111df565b60405161068891906123ab565b60405180910390f35b34801561069c575f5ffd5b506106b760048036038101906106b291906122b7565b611261565b005b3480156106c4575f5ffd5b506106cd6113f2565b6040516106da919061245a565b60405180910390f35b3480156106ee575f5ffd5b506107096004803603810190610704919061249b565b611405565b005b60606003805461071a90612601565b80601f016020809104026020016040519081016040528092919081815260200182805461074690612601565b80156107915780601f1061076857610100808354040283529160200191610791565b820191905f5260205f20905b81548152906001019060200180831161077457829003601f168201915b5050505050905090565b5f5f6107a5611489565b90506107b2818585611490565b600191505092915050565b7f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b5f600254905090565b6107f26114a2565b5f8111610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b9061267b565b60405180910390fd5b5f6008549050816008819055507ff521ac26681f2082cd832d245ffb0df3132b4f18099e967f203be27e4b746f518183604051610872929190612699565b60405180910390a15050565b5f5f610888611489565b9050610895858285611529565b6108a08585856115bb565b60019150509392505050565b5f6012905090565b600660149054906101000a900460ff1681565b7f000000000000000000000000a938a522fcf098001486366cc9ddfaa78ab3fa6281565b60085481565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61093e6114a2565b6109475f6116ab565b565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109766114a2565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fb0e21c0d53f57d838a3a08178ccf2c29624b47bd4f5f1080f5b688603c48118860405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610a4b90612601565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790612601565b8015610ac25780601f10610a9957610100808354040283529160200191610ac2565b820191905f5260205f20905b815481529060010190602001808311610aa557829003601f168201915b5050505050905090565b600a602052805f5260405f205f915054906101000a900460ff1681565b5f5f610af3611489565b9050610b008185856115bb565b600191505092915050565b610b136114a2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7890612730565b60405180910390fd5b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc17db519c06a38e30a448e03e08b3edec28a0a29d239f693ab94a6206a5ca63d60405160405180910390a35050565b610c4c6114a2565b5f8111610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8590612798565b60405180910390fd5b5f6007549050816007819055507fa307a9ae7d5512e3add205b7fee6c3f9b8e4bcf8a3de7878041f9364b862bb678183604051610ccc929190612699565b60405180910390a15050565b610ce06114a2565b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d1a9190612482565b602060405180830381865afa158015610d35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5991906127ca565b1015610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190612865565b60405180910390fd5b5f3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401610df7929190612883565b6020604051808303815f875af1158015610e13573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3791906128be565b905080610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090612933565b60405180910390fd5b7fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b582604051610ea8919061299b565b60405180910390a15050565b610ebc6114a2565b600f8260ff1611158015610ed45750600f8160ff1611155b610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90612a37565b60405180910390fd5b5f600660149054906101000a900460ff1690505f600660159054906101000a900460ff16905083600660146101000a81548160ff021916908360ff16021790555082600660156101000a81548160ff021916908360ff1602179055507f0cdae21e5d34c631f2f4cb6e5554d779e5222802fcc0c0080aa458c92c9d0b8082600660149054906101000a900460ff1683600660159054906101000a900460ff16604051610fc29493929190612a55565b60405180910390a150505050565b610fd86114a2565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f057dc60ecf6df48e0f4af40ef0f88074d41e0ce54a1fef20925cd23c6de0386060405160405180910390a35050565b6009602052805f5260405f205f915054906101000a900460ff1681565b61109b6114a2565b5f4790505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516110e590612ac5565b5f6040518083038185875af1925050503d805f811461111f576040519150601f19603f3d011682016040523d82523d5f602084013e611124565b606091505b5050905080611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612933565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a006040516111cd90612b49565b60405180910390a25050565b60075481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6112696114a2565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90612bd7565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611334929190612883565b6020604051808303815f875af1158015611350573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137491906128be565b9050806113b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ad90612933565b60405180910390fd5b7fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5826040516113e59190612c65565b60405180910390a1505050565b600660159054906101000a900460ff1681565b61140d6114a2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361147d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114749190612482565b60405180910390fd5b611486816116ab565b50565b5f33905090565b61149d838383600161176e565b505050565b6114aa611489565b73ffffffffffffffffffffffffffffffffffffffff166114c8610a14565b73ffffffffffffffffffffffffffffffffffffffff1614611527576114eb611489565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161151e9190612482565b60405180910390fd5b565b5f61153484846111df565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115b557818110156115a6578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161159d93929190612c91565b60405180910390fd5b6115b484848484035f61176e565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361162b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016116229190612482565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361169b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016116929190612482565b60405180910390fd5b6116a683838361193d565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117de575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016117d59190612482565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361184e575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118459190612482565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611937578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161192e91906123ab565b60405180910390a35b50505050565b7f000000000000000000000000a938a522fcf098001486366cc9ddfaa78ab3fa6273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806119e257507f000000000000000000000000a938a522fcf098001486366cc9ddfaa78ab3fa6273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8015611a86575060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611a84575060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b8015611a9e5750600b5f9054906101000a900460ff16155b15611bca575f7f000000000000000000000000a938a522fcf098001486366cc9ddfaa78ab3fa6273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611b26576064600660159054906101000a900460ff1660ff1683611b179190612cf3565b611b219190612d61565b611b51565b6064600660149054906101000a900460ff1660ff1683611b469190612cf3565b611b509190612d61565b5b90508082611b5f9190612d91565b91507f000000000000000000000000a938a522fcf098001486366cc9ddfaa78ab3fa6273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bbd57611bbc611c83565b5b611bc8843083611d0a565b505b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611c345750600854611c26836108f1565b82611c319190612dc4565b11155b611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90612e41565b60405180910390fd5b611c7e838383611d0a565b505050565b5f611c8d306108f1565b90506007548110611d0757611ca181611f23565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611d05573d5f5f3e3d5ffd5b505b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d5a578060025f828254611d4e9190612dc4565b92505081905550611e28565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611de3578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611dda93929190612c91565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e6f578060025f8282540392505081905550611eb9565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f1691906123ab565b60405180910390a3505050565b6001600b5f6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115611f5957611f58612e5f565b5b604051908082528060200260200182016040528015611f875781602001602082028036833780820191505090505b50905030815f81518110611f9e57611f9d612e8c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612041573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120659190612ecd565b8160018151811061207957612078612e8c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506120de307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2484611490565b7f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2473ffffffffffffffffffffffffffffffffffffffff1663791ac947835f843061012c4261212c9190612dc4565b6040518663ffffffff1660e01b815260040161214c959493929190612fe8565b5f604051808303815f87803b158015612163575f5ffd5b505af1158015612175573d5f5f3e3d5ffd5b50505050505f600b5f6101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6121d882612196565b6121e281856121a0565b93506121f28185602086016121b0565b6121fb816121be565b840191505092915050565b5f6020820190508181035f83015261221e81846121ce565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6122538261222a565b9050919050565b61226381612249565b811461226d575f5ffd5b50565b5f8135905061227e8161225a565b92915050565b5f819050919050565b61229681612284565b81146122a0575f5ffd5b50565b5f813590506122b18161228d565b92915050565b5f5f604083850312156122cd576122cc612226565b5b5f6122da85828601612270565b92505060206122eb858286016122a3565b9150509250929050565b5f8115159050919050565b612309816122f5565b82525050565b5f6020820190506123225f830184612300565b92915050565b5f819050919050565b5f61234b6123466123418461222a565b612328565b61222a565b9050919050565b5f61235c82612331565b9050919050565b5f61236d82612352565b9050919050565b61237d81612363565b82525050565b5f6020820190506123965f830184612374565b92915050565b6123a581612284565b82525050565b5f6020820190506123be5f83018461239c565b92915050565b5f602082840312156123d9576123d8612226565b5b5f6123e6848285016122a3565b91505092915050565b5f5f5f6060848603121561240657612405612226565b5b5f61241386828701612270565b935050602061242486828701612270565b9250506040612435868287016122a3565b9150509250925092565b5f60ff82169050919050565b6124548161243f565b82525050565b5f60208201905061246d5f83018461244b565b92915050565b61247c81612249565b82525050565b5f6020820190506124955f830184612473565b92915050565b5f602082840312156124b0576124af612226565b5b5f6124bd84828501612270565b91505092915050565b6124cf816122f5565b81146124d9575f5ffd5b50565b5f813590506124ea816124c6565b92915050565b5f5f6040838503121561250657612505612226565b5b5f61251385828601612270565b9250506020612524858286016124dc565b9150509250929050565b6125378161243f565b8114612541575f5ffd5b50565b5f813590506125528161252e565b92915050565b5f5f6040838503121561256e5761256d612226565b5b5f61257b85828601612544565b925050602061258c85828601612544565b9150509250929050565b5f5f604083850312156125ac576125ab612226565b5b5f6125b985828601612270565b92505060206125ca85828601612270565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061261857607f821691505b60208210810361262b5761262a6125d4565b5b50919050565b7f4c696d6974206d7573742062652067726561746572207468616e2030000000005f82015250565b5f612665601c836121a0565b915061267082612631565b602082019050919050565b5f6020820190508181035f83015261269281612659565b9050919050565b5f6040820190506126ac5f83018561239c565b6126b9602083018461239c565b9392505050565b7f45524332303a206e65772077616c6c6574206973207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f61271a6021836121a0565b9150612725826126c0565b604082019050919050565b5f6020820190508181035f8301526127478161270e565b9050919050565b7f5468726573686f6c64206d7573742062652067726561746572207468616e20305f82015250565b5f6127826020836121a0565b915061278d8261274e565b602082019050919050565b5f6020820190508181035f8301526127af81612776565b9050919050565b5f815190506127c48161228d565b92915050565b5f602082840312156127df576127de612226565b5b5f6127ec848285016127b6565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f61284f6026836121a0565b915061285a826127f5565b604082019050919050565b5f6020820190508181035f83015261287c81612843565b9050919050565b5f6040820190506128965f830185612473565b6128a3602083018461239c565b9392505050565b5f815190506128b8816124c6565b92915050565b5f602082840312156128d3576128d2612226565b5b5f6128e0848285016128aa565b91505092915050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f61291d600f836121a0565b9150612928826128e9565b602082019050919050565b5f6020820190508181035f83015261294a81612911565b9050919050565b7f5265636f766572656420636f6e74726163742773206f776e20746f6b656e733a5f82015250565b5f6129856020836121a0565b915061299082612951565b602082019050919050565b5f6040820190508181035f8301526129b281612979565b90506129c1602083018461239c565b92915050565b7f45524332303a2074617820636f756c64206e6f742062652067726561746572205f8201527f7468616e20313525000000000000000000000000000000000000000000000000602082015250565b5f612a216028836121a0565b9150612a2c826129c7565b604082019050919050565b5f6020820190508181035f830152612a4e81612a15565b9050919050565b5f608082019050612a685f83018761244b565b612a75602083018661244b565b612a82604083018561244b565b612a8f606083018461244b565b95945050505050565b5f81905092915050565b50565b5f612ab05f83612a98565b9150612abb82612aa2565b5f82019050919050565b5f612acf82612aa5565b9150819050919050565b7f57652068617665207265636f766572207468652073746f636b206574682066725f8201527f6f6d20636f6e74726163742e0000000000000000000000000000000000000000602082015250565b5f612b33602c836121a0565b9150612b3e82612ad9565b604082019050919050565b5f6020820190508181035f830152612b6081612b27565b9050919050565b7f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c5f8201527f616e6365206f6620697473206f776e20746f6b656e7300000000000000000000602082015250565b5f612bc16036836121a0565b9150612bcc82612b67565b604082019050919050565b5f6020820190508181035f830152612bee81612bb5565b9050919050565b7f57652068617665207265636f766572656420746f6b656e732066726f6d20636f5f8201527f6e74726163743a00000000000000000000000000000000000000000000000000602082015250565b5f612c4f6027836121a0565b9150612c5a82612bf5565b604082019050919050565b5f6040820190508181035f830152612c7c81612c43565b9050612c8b602083018461239c565b92915050565b5f606082019050612ca45f830186612473565b612cb1602083018561239c565b612cbe604083018461239c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612cfd82612284565b9150612d0883612284565b9250828202612d1681612284565b91508282048414831517612d2d57612d2c612cc6565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612d6b82612284565b9150612d7683612284565b925082612d8657612d85612d34565b5b828204905092915050565b5f612d9b82612284565b9150612da683612284565b9250828203905081811115612dbe57612dbd612cc6565b5b92915050565b5f612dce82612284565b9150612dd983612284565b9250828201905080821115612df157612df0612cc6565b5b92915050565b7f45524332303a206d617857616c6c65744c696d697420657863656564656400005f82015250565b5f612e2b601e836121a0565b9150612e3682612df7565b602082019050919050565b5f6020820190508181035f830152612e5881612e1f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612ec78161225a565b92915050565b5f60208284031215612ee257612ee1612226565b5b5f612eef84828501612eb9565b91505092915050565b5f819050919050565b5f612f1b612f16612f1184612ef8565b612328565b612284565b9050919050565b612f2b81612f01565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612f6381612249565b82525050565b5f612f748383612f5a565b60208301905092915050565b5f602082019050919050565b5f612f9682612f31565b612fa08185612f3b565b9350612fab83612f4b565b805f5b83811015612fdb578151612fc28882612f69565b9750612fcd83612f80565b925050600181019050612fae565b5085935050505092915050565b5f60a082019050612ffb5f83018861239c565b6130086020830187612f22565b818103604083015261301a8186612f8c565b90506130296060830185612473565b613036608083018461239c565b969550505050505056fea26469706673582212207b56cbf00c96f17ae80b2f080d205e3a4440daf9bf15d657278000031a7bd59c64736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000008dcec2f34c6ab383fb6ef1a9c792839b60fa0d49000000000000000000000000985fcba05f03aaba4153c68e6bbca058715e7ef90000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24

-----Decoded View---------------
Arg [0] : _deployerWallet (address): 0x8dcEc2F34C6ab383FB6EF1a9C792839B60fA0D49
Arg [1] : _marketingWallet (address): 0x985fcBA05F03aaBa4153C68E6BBCa058715E7EF9
Arg [2] : _uniswapV2Router (address): 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008dcec2f34c6ab383fb6ef1a9c792839b60fa0d49
Arg [1] : 000000000000000000000000985fcba05f03aaba4153c68e6bbca058715e7ef9
Arg [2] : 0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24


Deployed Bytecode Sourcemap

22610:13415:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9811:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12129:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23107:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10913:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34539:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12922:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10764:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22687:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23163:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22917:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11075:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21056:103;;;;;;;;;;;;;:::i;:::-;;22650:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29366:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20381:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10021:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23038:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11398:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28177:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35659:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33384:448;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30582:592;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28816:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22982:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31799:332;;;;;;;;;;;;;:::i;:::-;;22848:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11643:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32969:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22727:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21314:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9811:91;9856:13;9889:5;9882:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9811:91;:::o;12129:215::-;12227:4;12244:13;12260:12;:10;:12::i;:::-;12244:28;;12283:31;12292:5;12299:7;12308:5;12283:8;:31::i;:::-;12332:4;12325:11;;;12129:215;;;;:::o;23107:49::-;;;:::o;10913:99::-;10965:7;10992:12;;10985:19;;10913:99;:::o;34539:278::-;20267:13;:11;:13::i;:::-;34636:1:::1;34625:8;:12;34617:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;34681:16;34700:14;;34681:33;;34742:8;34725:14;:25;;;;34768:41;34790:8;34800;34768:41;;;;;;;:::i;:::-;;;;;;;;34606:211;34539:278:::0;:::o;12922:283::-;13043:4;13060:15;13078:12;:10;:12::i;:::-;13060:30;;13101:37;13117:4;13123:7;13132:5;13101:15;:37::i;:::-;13149:26;13159:4;13165:2;13169:5;13149:9;:26::i;:::-;13193:4;13186:11;;;12922:283;;;;;:::o;10764:84::-;10813:5;10838:2;10831:9;;10764:84;:::o;22687:33::-;;;;;;;;;;;;;:::o;23163:38::-;;;:::o;22917:56::-;;;;:::o;11075:118::-;11140:7;11167:9;:18;11177:7;11167:18;;;;;;;;;;;;;;;;11160:25;;11075:118;;;:::o;21056:103::-;20267:13;:11;:13::i;:::-;21121:30:::1;21148:1;21121:18;:30::i;:::-;21056:103::o:0;22650:30::-;;;;;;;;;;;;;:::o;29366:239::-;20267:13;:11;:13::i;:::-;29526:6:::1;29486:28;:37;29515:7;29486:37;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;29590:6;29550:47;;29581:7;29550:47;;;;;;;;;;;;29366:239:::0;;:::o;20381:87::-;20427:7;20454:6;;;;;;;;;;;20447:13;;20381:87;:::o;10021:95::-;10068:13;10101:7;10094:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10021:95;:::o;23038:60::-;;;;;;;;;;;;;;;;;;;;;;:::o;11398:182::-;11467:4;11484:13;11500:12;:10;:12::i;:::-;11484:28;;11523:27;11533:5;11540:2;11544:5;11523:9;:27::i;:::-;11568:4;11561:11;;;11398:182;;;;:::o;28177:303::-;20267:13;:11;:13::i;:::-;28286:1:::1;28265:23;;:9;:23;;::::0;28257:69:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28337:17;28357:15;;;;;;;;;;;28337:35;;28401:9;28383:15;;:27;;;;;;;;;;;;;;;;;;28462:9;28428:44;;28451:9;28428:44;;;;;;;;;;;;28246:234;28177:303:::0;:::o;35659:326::-;20267:13;:11;:13::i;:::-;35769:1:::1;35754:12;:16;35746:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35818:20;35841:19;;35818:42;;35893:12;35871:19;:34;;;;35923:54;35950:12;35964;35923:54;;;;;;;:::i;:::-;;;;;;;;35735:250;35659:326:::0;:::o;33384:448::-;20267:13;:11;:13::i;:::-;33586:7:::1;33551:4;33536:31;;;33576:4;33536:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;33528:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;33647:9;33674:4;33659:30;;;33690:15;;;;;;;;;;;33707:7;33659:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33647:68;;33734:4;33726:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;33776:48;33816:7;33776:48;;;;;;:::i;:::-;;;;;;;;33446:386;33384:448:::0;:::o;30582:592::-;20267:13;:11;:13::i;:::-;30749:2:::1;30729:16;:22;;;;:49;;;;;30776:2;30755:17;:23;;;;30729:49;30721:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30835:15;30853;;;;;;;;;;;30835:33;;30879:16;30898;;;;;;;;;;;30879:35;;30945:16;30927:15;;:34;;;;;;;;;;;;;;;;;;30991:17;30972:16;;:36;;;;;;;;;;;;;;;;;;31026:140;31060:9;31084:15;;;;;;;;;;;31114:10;31139:16;;;;;;;;;;;31026:140;;;;;;;;;:::i;:::-;;;;;;;;30710:464;;30582:592:::0;;:::o;28816:181::-;20267:13;:11;:13::i;:::-;28929:6:::1;28900:17;:26;28918:7;28900:26;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;28982:6;28953:36;;28973:7;28953:36;;;;;;;;;;;;28816:181:::0;;:::o;22982:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;31799:332::-;20267:13;:11;:13::i;:::-;31863:15:::1;31881:21;31863:39;;31914:9;31937:15;;;;;;;;;;;31929:29;;31966:10;31929:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31913:68;;;32000:4;31992:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;32107:15;;;;;;;;;;;32050:73;;;;;;;;:::i;:::-;;;;;;;;31852:279;;31799:332::o:0;22848:62::-;;;;:::o;11643:167::-;11748:7;11775:11;:18;11787:5;11775:18;;;;;;;;;;;;;;;:27;11794:7;11775:27;;;;;;;;;;;;;;;;11768:34;;11643:167;;;;:::o;32969:405::-;20267:13;:11;:13::i;:::-;33107:4:::1;33082:30;;:13;:30;;::::0;33074:97:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;33182:9;33201:13;33194:30;;;33225:15;;;;;;;;;;;33242:7;33194:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33182:68;;33269:4;33261:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;33311:55;33358:7;33311:55;;;;;;:::i;:::-;;;;;;;;33063:311;32969:405:::0;;:::o;22727:34::-;;;;;;;;;;;;;:::o;21314:220::-;20267:13;:11;:13::i;:::-;21419:1:::1;21399:22;;:8;:22;;::::0;21395:93:::1;;21473:1;21445:31;;;;;;;;;;;:::i;:::-;;;;;;;;21395:93;21498:28;21517:8;21498:18;:28::i;:::-;21314:220:::0;:::o;2924:98::-;2977:7;3004:10;2997:17;;2924:98;:::o;16476:130::-;16561:37;16570:5;16577:7;16586:5;16593:4;16561:8;:37::i;:::-;16476:130;;;:::o;20546:166::-;20617:12;:10;:12::i;:::-;20606:23;;:7;:5;:7::i;:::-;:23;;;20602:103;;20680:12;:10;:12::i;:::-;20653:40;;;;;;;;;;;:::i;:::-;;;;;;;;20602:103;20546:166::o;18235:603::-;18369:24;18396:25;18406:5;18413:7;18396:9;:25::i;:::-;18369:52;;18456:17;18436:16;:37;18432:399;;18513:5;18494:16;:24;18490:214;;;18595:7;18625:16;18664:5;18546:142;;;;;;;;;;;;;:::i;:::-;;;;;;;;18490:214;18747:57;18756:5;18763:7;18791:5;18772:16;:24;18798:5;18747:8;:57::i;:::-;18432:399;18358:480;18235:603;;;:::o;13590:308::-;13690:1;13674:18;;:4;:18;;;13670:88;;13743:1;13716:30;;;;;;;;;;;:::i;:::-;;;;;;;;13670:88;13786:1;13772:16;;:2;:16;;;13768:88;;13841:1;13812:32;;;;;;;;;;;:::i;:::-;;;;;;;;13768:88;13866:24;13874:4;13880:2;13884:5;13866:7;:24::i;:::-;13590:308;;;:::o;21694:191::-;21768:16;21787:6;;;;;;;;;;;21768:25;;21813:8;21804:6;;:17;;;;;;;;;;;;;;;;;;21868:8;21837:40;;21858:8;21837:40;;;;;;;;;;;;21757:128;21694:191;:::o;17457:486::-;17630:1;17613:19;;:5;:19;;;17609:91;;17685:1;17656:32;;;;;;;;;;;:::i;:::-;;;;;;;;17609:91;17733:1;17714:21;;:7;:21;;;17710:92;;17787:1;17759:31;;;;;;;;;;;:::i;:::-;;;;;;;;17710:92;17842:5;17812:11;:18;17824:5;17812:18;;;;;;;;;;;;;;;:27;17831:7;17812:27;;;;;;;;;;;;;;;:35;;;;17862:9;17858:78;;;17909:7;17893:31;;17902:5;17893:31;;;17918:5;17893:31;;;;;;:::i;:::-;;;;;;;;17858:78;17457:486;;;;:::o;26150:763::-;26284:13;26276:21;;:4;:21;;;:44;;;;26307:13;26301:19;;:2;:19;;;26276:44;26275:101;;;;;26327:17;:23;26345:4;26327:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;26354:17;:21;26372:2;26354:21;;;;;;;;;;;;;;;;;;;;;;;;;26327:48;26325:51;26275:101;:123;;;;;26381:17;;;;;;;;;;;26380:18;26275:123;26271:461;;;26415:16;26443:13;26435:21;;:4;:21;;;26434:96;;26526:3;26506:16;;;;;;;;;;;26498:24;;:5;:24;;;;:::i;:::-;26497:32;;;;:::i;:::-;26434:96;;;26489:3;26470:15;;;;;;;;;;;26462:23;;:5;:23;;;;:::i;:::-;26461:31;;;;:::i;:::-;26434:96;26415:115;;26554:8;26545:17;;;;;:::i;:::-;;;26589:13;26583:19;;:2;:19;;;26579:81;;26630:14;:12;:14::i;:::-;26579:81;26676:44;26690:4;26704;26711:8;26676:13;:44::i;:::-;26400:332;26271:461;26751:28;:32;26780:2;26751:32;;;;;;;;;;;;;;;;;;;;;;;;;:77;;;;26814:14;;26796:13;26806:2;26796:9;:13::i;:::-;26788:5;:21;;;;:::i;:::-;26787:41;;26751:77;26742:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;26875:30;26889:4;26895:2;26899:5;26875:13;:30::i;:::-;26150:763;;;:::o;27017:287::-;27060:23;27086:24;27104:4;27086:9;:24::i;:::-;27060:50;;27144:19;;27125:15;:38;27121:176;;27180:34;27198:15;27180:17;:34::i;:::-;27237:15;;;;;;;;;;;27229:33;;:56;27263:21;27229:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27121:176;27049:255;27017:287::o;14222:1135::-;14328:1;14312:18;;:4;:18;;;14308:552;;14466:5;14450:12;;:21;;;;;;;:::i;:::-;;;;;;;;14308:552;;;14504:19;14526:9;:15;14536:4;14526:15;;;;;;;;;;;;;;;;14504:37;;14574:5;14560:11;:19;14556:117;;;14632:4;14638:11;14651:5;14607:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;14556:117;14828:5;14814:11;:19;14796:9;:15;14806:4;14796:15;;;;;;;;;;;;;;;:37;;;;14489:371;14308:552;14890:1;14876:16;;:2;:16;;;14872:435;;15058:5;15042:12;;:21;;;;;;;;;;;14872:435;;;15275:5;15258:9;:13;15268:2;15258:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;14872:435;15339:2;15324:25;;15333:4;15324:25;;;15343:5;15324:25;;;;;;:::i;:::-;;;;;;;;14222:1135;;;:::o;27412:496::-;23929:4;23909:17;;:24;;;;;;;;;;;;;;;;;;27491:21:::1;27529:1;27515:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27491:40;;27560:4;27542;27547:1;27542:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;27586:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27576:4;27581:1;27576:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;27621:62;27638:4;27653:15;27671:11;27621:8;:62::i;:::-;27696:15;:66;;;27777:11;27803:1;27819:4;27846;27885:3;27867:15;:21;;;;:::i;:::-;27696:204;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27480:428;23976:5:::0;23956:17;;:25;;;;;;;;;;;;;;;;;;27412:496;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:60::-;3367:3;3388:5;3381:12;;3339:60;;;:::o;3405:142::-;3455:9;3488:53;3506:34;3515:24;3533:5;3515:24;:::i;:::-;3506:34;:::i;:::-;3488:53;:::i;:::-;3475:66;;3405:142;;;:::o;3553:126::-;3603:9;3636:37;3667:5;3636:37;:::i;:::-;3623:50;;3553:126;;;:::o;3685:149::-;3758:9;3791:37;3822:5;3791:37;:::i;:::-;3778:50;;3685:149;;;:::o;3840:177::-;3950:60;4004:5;3950:60;:::i;:::-;3945:3;3938:73;3840:177;;:::o;4023:268::-;4139:4;4177:2;4166:9;4162:18;4154:26;;4190:94;4281:1;4270:9;4266:17;4257:6;4190:94;:::i;:::-;4023:268;;;;:::o;4297:118::-;4384:24;4402:5;4384:24;:::i;:::-;4379:3;4372:37;4297:118;;:::o;4421:222::-;4514:4;4552:2;4541:9;4537:18;4529:26;;4565:71;4633:1;4622:9;4618:17;4609:6;4565:71;:::i;:::-;4421:222;;;;:::o;4649:329::-;4708:6;4757:2;4745:9;4736:7;4732:23;4728:32;4725:119;;;4763:79;;:::i;:::-;4725:119;4883:1;4908:53;4953:7;4944:6;4933:9;4929:22;4908:53;:::i;:::-;4898:63;;4854:117;4649:329;;;;:::o;4984:619::-;5061:6;5069;5077;5126:2;5114:9;5105:7;5101:23;5097:32;5094:119;;;5132:79;;:::i;:::-;5094:119;5252:1;5277:53;5322:7;5313:6;5302:9;5298:22;5277:53;:::i;:::-;5267:63;;5223:117;5379:2;5405:53;5450:7;5441:6;5430:9;5426:22;5405:53;:::i;:::-;5395:63;;5350:118;5507:2;5533:53;5578:7;5569:6;5558:9;5554:22;5533:53;:::i;:::-;5523:63;;5478:118;4984:619;;;;;:::o;5609:86::-;5644:7;5684:4;5677:5;5673:16;5662:27;;5609:86;;;:::o;5701:112::-;5784:22;5800:5;5784:22;:::i;:::-;5779:3;5772:35;5701:112;;:::o;5819:214::-;5908:4;5946:2;5935:9;5931:18;5923:26;;5959:67;6023:1;6012:9;6008:17;5999:6;5959:67;:::i;:::-;5819:214;;;;:::o;6039:118::-;6126:24;6144:5;6126:24;:::i;:::-;6121:3;6114:37;6039:118;;:::o;6163:222::-;6256:4;6294:2;6283:9;6279:18;6271:26;;6307:71;6375:1;6364:9;6360:17;6351:6;6307:71;:::i;:::-;6163:222;;;;:::o;6391:329::-;6450:6;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6625:1;6650:53;6695:7;6686:6;6675:9;6671:22;6650:53;:::i;:::-;6640:63;;6596:117;6391:329;;;;:::o;6726:116::-;6796:21;6811:5;6796:21;:::i;:::-;6789:5;6786:32;6776:60;;6832:1;6829;6822:12;6776:60;6726:116;:::o;6848:133::-;6891:5;6929:6;6916:20;6907:29;;6945:30;6969:5;6945:30;:::i;:::-;6848:133;;;;:::o;6987:468::-;7052:6;7060;7109:2;7097:9;7088:7;7084:23;7080:32;7077:119;;;7115:79;;:::i;:::-;7077:119;7235:1;7260:53;7305:7;7296:6;7285:9;7281:22;7260:53;:::i;:::-;7250:63;;7206:117;7362:2;7388:50;7430:7;7421:6;7410:9;7406:22;7388:50;:::i;:::-;7378:60;;7333:115;6987:468;;;;;:::o;7461:118::-;7532:22;7548:5;7532:22;:::i;:::-;7525:5;7522:33;7512:61;;7569:1;7566;7559:12;7512:61;7461:118;:::o;7585:135::-;7629:5;7667:6;7654:20;7645:29;;7683:31;7708:5;7683:31;:::i;:::-;7585:135;;;;:::o;7726:466::-;7790:6;7798;7847:2;7835:9;7826:7;7822:23;7818:32;7815:119;;;7853:79;;:::i;:::-;7815:119;7973:1;7998:51;8041:7;8032:6;8021:9;8017:22;7998:51;:::i;:::-;7988:61;;7944:115;8098:2;8124:51;8167:7;8158:6;8147:9;8143:22;8124:51;:::i;:::-;8114:61;;8069:116;7726:466;;;;;:::o;8198:474::-;8266:6;8274;8323:2;8311:9;8302:7;8298:23;8294:32;8291:119;;;8329:79;;:::i;:::-;8291:119;8449:1;8474:53;8519:7;8510:6;8499:9;8495:22;8474:53;:::i;:::-;8464:63;;8420:117;8576:2;8602:53;8647:7;8638:6;8627:9;8623:22;8602:53;:::i;:::-;8592:63;;8547:118;8198:474;;;;;:::o;8678:180::-;8726:77;8723:1;8716:88;8823:4;8820:1;8813:15;8847:4;8844:1;8837:15;8864:320;8908:6;8945:1;8939:4;8935:12;8925:22;;8992:1;8986:4;8982:12;9013:18;9003:81;;9069:4;9061:6;9057:17;9047:27;;9003:81;9131:2;9123:6;9120:14;9100:18;9097:38;9094:84;;9150:18;;:::i;:::-;9094:84;8915:269;8864:320;;;:::o;9190:178::-;9330:30;9326:1;9318:6;9314:14;9307:54;9190:178;:::o;9374:366::-;9516:3;9537:67;9601:2;9596:3;9537:67;:::i;:::-;9530:74;;9613:93;9702:3;9613:93;:::i;:::-;9731:2;9726:3;9722:12;9715:19;;9374:366;;;:::o;9746:419::-;9912:4;9950:2;9939:9;9935:18;9927:26;;9999:9;9993:4;9989:20;9985:1;9974:9;9970:17;9963:47;10027:131;10153:4;10027:131;:::i;:::-;10019:139;;9746:419;;;:::o;10171:332::-;10292:4;10330:2;10319:9;10315:18;10307:26;;10343:71;10411:1;10400:9;10396:17;10387:6;10343:71;:::i;:::-;10424:72;10492:2;10481:9;10477:18;10468:6;10424:72;:::i;:::-;10171:332;;;;;:::o;10509:220::-;10649:34;10645:1;10637:6;10633:14;10626:58;10718:3;10713:2;10705:6;10701:15;10694:28;10509:220;:::o;10735:366::-;10877:3;10898:67;10962:2;10957:3;10898:67;:::i;:::-;10891:74;;10974:93;11063:3;10974:93;:::i;:::-;11092:2;11087:3;11083:12;11076:19;;10735:366;;;:::o;11107:419::-;11273:4;11311:2;11300:9;11296:18;11288:26;;11360:9;11354:4;11350:20;11346:1;11335:9;11331:17;11324:47;11388:131;11514:4;11388:131;:::i;:::-;11380:139;;11107:419;;;:::o;11532:182::-;11672:34;11668:1;11660:6;11656:14;11649:58;11532:182;:::o;11720:366::-;11862:3;11883:67;11947:2;11942:3;11883:67;:::i;:::-;11876:74;;11959:93;12048:3;11959:93;:::i;:::-;12077:2;12072:3;12068:12;12061:19;;11720:366;;;:::o;12092:419::-;12258:4;12296:2;12285:9;12281:18;12273:26;;12345:9;12339:4;12335:20;12331:1;12320:9;12316:17;12309:47;12373:131;12499:4;12373:131;:::i;:::-;12365:139;;12092:419;;;:::o;12517:143::-;12574:5;12605:6;12599:13;12590:22;;12621:33;12648:5;12621:33;:::i;:::-;12517:143;;;;:::o;12666:351::-;12736:6;12785:2;12773:9;12764:7;12760:23;12756:32;12753:119;;;12791:79;;:::i;:::-;12753:119;12911:1;12936:64;12992:7;12983:6;12972:9;12968:22;12936:64;:::i;:::-;12926:74;;12882:128;12666:351;;;;:::o;13023:225::-;13163:34;13159:1;13151:6;13147:14;13140:58;13232:8;13227:2;13219:6;13215:15;13208:33;13023:225;:::o;13254:366::-;13396:3;13417:67;13481:2;13476:3;13417:67;:::i;:::-;13410:74;;13493:93;13582:3;13493:93;:::i;:::-;13611:2;13606:3;13602:12;13595:19;;13254:366;;;:::o;13626:419::-;13792:4;13830:2;13819:9;13815:18;13807:26;;13879:9;13873:4;13869:20;13865:1;13854:9;13850:17;13843:47;13907:131;14033:4;13907:131;:::i;:::-;13899:139;;13626:419;;;:::o;14051:332::-;14172:4;14210:2;14199:9;14195:18;14187:26;;14223:71;14291:1;14280:9;14276:17;14267:6;14223:71;:::i;:::-;14304:72;14372:2;14361:9;14357:18;14348:6;14304:72;:::i;:::-;14051:332;;;;;:::o;14389:137::-;14443:5;14474:6;14468:13;14459:22;;14490:30;14514:5;14490:30;:::i;:::-;14389:137;;;;:::o;14532:345::-;14599:6;14648:2;14636:9;14627:7;14623:23;14619:32;14616:119;;;14654:79;;:::i;:::-;14616:119;14774:1;14799:61;14852:7;14843:6;14832:9;14828:22;14799:61;:::i;:::-;14789:71;;14745:125;14532:345;;;;:::o;14883:165::-;15023:17;15019:1;15011:6;15007:14;15000:41;14883:165;:::o;15054:366::-;15196:3;15217:67;15281:2;15276:3;15217:67;:::i;:::-;15210:74;;15293:93;15382:3;15293:93;:::i;:::-;15411:2;15406:3;15402:12;15395:19;;15054:366;;;:::o;15426:419::-;15592:4;15630:2;15619:9;15615:18;15607:26;;15679:9;15673:4;15669:20;15665:1;15654:9;15650:17;15643:47;15707:131;15833:4;15707:131;:::i;:::-;15699:139;;15426:419;;;:::o;15851:182::-;15991:34;15987:1;15979:6;15975:14;15968:58;15851:182;:::o;16039:366::-;16181:3;16202:67;16266:2;16261:3;16202:67;:::i;:::-;16195:74;;16278:93;16367:3;16278:93;:::i;:::-;16396:2;16391:3;16387:12;16380:19;;16039:366;;;:::o;16411:529::-;16605:4;16643:2;16632:9;16628:18;16620:26;;16692:9;16686:4;16682:20;16678:1;16667:9;16663:17;16656:47;16720:131;16846:4;16720:131;:::i;:::-;16712:139;;16861:72;16929:2;16918:9;16914:18;16905:6;16861:72;:::i;:::-;16411:529;;;;:::o;16946:227::-;17086:34;17082:1;17074:6;17070:14;17063:58;17155:10;17150:2;17142:6;17138:15;17131:35;16946:227;:::o;17179:366::-;17321:3;17342:67;17406:2;17401:3;17342:67;:::i;:::-;17335:74;;17418:93;17507:3;17418:93;:::i;:::-;17536:2;17531:3;17527:12;17520:19;;17179:366;;;:::o;17551:419::-;17717:4;17755:2;17744:9;17740:18;17732:26;;17804:9;17798:4;17794:20;17790:1;17779:9;17775:17;17768:47;17832:131;17958:4;17832:131;:::i;:::-;17824:139;;17551:419;;;:::o;17976:521::-;18137:4;18175:3;18164:9;18160:19;18152:27;;18189:67;18253:1;18242:9;18238:17;18229:6;18189:67;:::i;:::-;18266:68;18330:2;18319:9;18315:18;18306:6;18266:68;:::i;:::-;18344;18408:2;18397:9;18393:18;18384:6;18344:68;:::i;:::-;18422;18486:2;18475:9;18471:18;18462:6;18422:68;:::i;:::-;17976:521;;;;;;;:::o;18503:147::-;18604:11;18641:3;18626:18;;18503:147;;;;:::o;18656:114::-;;:::o;18776:398::-;18935:3;18956:83;19037:1;19032:3;18956:83;:::i;:::-;18949:90;;19048:93;19137:3;19048:93;:::i;:::-;19166:1;19161:3;19157:11;19150:18;;18776:398;;;:::o;19180:379::-;19364:3;19386:147;19529:3;19386:147;:::i;:::-;19379:154;;19550:3;19543:10;;19180:379;;;:::o;19565:231::-;19705:34;19701:1;19693:6;19689:14;19682:58;19774:14;19769:2;19761:6;19757:15;19750:39;19565:231;:::o;19802:366::-;19944:3;19965:67;20029:2;20024:3;19965:67;:::i;:::-;19958:74;;20041:93;20130:3;20041:93;:::i;:::-;20159:2;20154:3;20150:12;20143:19;;19802:366;;;:::o;20174:419::-;20340:4;20378:2;20367:9;20363:18;20355:26;;20427:9;20421:4;20417:20;20413:1;20402:9;20398:17;20391:47;20455:131;20581:4;20455:131;:::i;:::-;20447:139;;20174:419;;;:::o;20599:241::-;20739:34;20735:1;20727:6;20723:14;20716:58;20808:24;20803:2;20795:6;20791:15;20784:49;20599:241;:::o;20846:366::-;20988:3;21009:67;21073:2;21068:3;21009:67;:::i;:::-;21002:74;;21085:93;21174:3;21085:93;:::i;:::-;21203:2;21198:3;21194:12;21187:19;;20846:366;;;:::o;21218:419::-;21384:4;21422:2;21411:9;21407:18;21399:26;;21471:9;21465:4;21461:20;21457:1;21446:9;21442:17;21435:47;21499:131;21625:4;21499:131;:::i;:::-;21491:139;;21218:419;;;:::o;21643:226::-;21783:34;21779:1;21771:6;21767:14;21760:58;21852:9;21847:2;21839:6;21835:15;21828:34;21643:226;:::o;21875:366::-;22017:3;22038:67;22102:2;22097:3;22038:67;:::i;:::-;22031:74;;22114:93;22203:3;22114:93;:::i;:::-;22232:2;22227:3;22223:12;22216:19;;21875:366;;;:::o;22247:529::-;22441:4;22479:2;22468:9;22464:18;22456:26;;22528:9;22522:4;22518:20;22514:1;22503:9;22499:17;22492:47;22556:131;22682:4;22556:131;:::i;:::-;22548:139;;22697:72;22765:2;22754:9;22750:18;22741:6;22697:72;:::i;:::-;22247:529;;;;:::o;22782:442::-;22931:4;22969:2;22958:9;22954:18;22946:26;;22982:71;23050:1;23039:9;23035:17;23026:6;22982:71;:::i;:::-;23063:72;23131:2;23120:9;23116:18;23107:6;23063:72;:::i;:::-;23145;23213:2;23202:9;23198:18;23189:6;23145:72;:::i;:::-;22782:442;;;;;;:::o;23230:180::-;23278:77;23275:1;23268:88;23375:4;23372:1;23365:15;23399:4;23396:1;23389:15;23416:410;23456:7;23479:20;23497:1;23479:20;:::i;:::-;23474:25;;23513:20;23531:1;23513:20;:::i;:::-;23508:25;;23568:1;23565;23561:9;23590:30;23608:11;23590:30;:::i;:::-;23579:41;;23769:1;23760:7;23756:15;23753:1;23750:22;23730:1;23723:9;23703:83;23680:139;;23799:18;;:::i;:::-;23680:139;23464:362;23416:410;;;;:::o;23832:180::-;23880:77;23877:1;23870:88;23977:4;23974:1;23967:15;24001:4;23998:1;23991:15;24018:185;24058:1;24075:20;24093:1;24075:20;:::i;:::-;24070:25;;24109:20;24127:1;24109:20;:::i;:::-;24104:25;;24148:1;24138:35;;24153:18;;:::i;:::-;24138:35;24195:1;24192;24188:9;24183:14;;24018:185;;;;:::o;24209:194::-;24249:4;24269:20;24287:1;24269:20;:::i;:::-;24264:25;;24303:20;24321:1;24303:20;:::i;:::-;24298:25;;24347:1;24344;24340:9;24332:17;;24371:1;24365:4;24362:11;24359:37;;;24376:18;;:::i;:::-;24359:37;24209:194;;;;:::o;24409:191::-;24449:3;24468:20;24486:1;24468:20;:::i;:::-;24463:25;;24502:20;24520:1;24502:20;:::i;:::-;24497:25;;24545:1;24542;24538:9;24531:16;;24566:3;24563:1;24560:10;24557:36;;;24573:18;;:::i;:::-;24557:36;24409:191;;;;:::o;24606:180::-;24746:32;24742:1;24734:6;24730:14;24723:56;24606:180;:::o;24792:366::-;24934:3;24955:67;25019:2;25014:3;24955:67;:::i;:::-;24948:74;;25031:93;25120:3;25031:93;:::i;:::-;25149:2;25144:3;25140:12;25133:19;;24792:366;;;:::o;25164:419::-;25330:4;25368:2;25357:9;25353:18;25345:26;;25417:9;25411:4;25407:20;25403:1;25392:9;25388:17;25381:47;25445:131;25571:4;25445:131;:::i;:::-;25437:139;;25164:419;;;:::o;25589:180::-;25637:77;25634:1;25627:88;25734:4;25731:1;25724:15;25758:4;25755:1;25748:15;25775:180;25823:77;25820:1;25813:88;25920:4;25917:1;25910:15;25944:4;25941:1;25934:15;25961:143;26018:5;26049:6;26043:13;26034:22;;26065:33;26092:5;26065:33;:::i;:::-;25961:143;;;;:::o;26110:351::-;26180:6;26229:2;26217:9;26208:7;26204:23;26200:32;26197:119;;;26235:79;;:::i;:::-;26197:119;26355:1;26380:64;26436:7;26427:6;26416:9;26412:22;26380:64;:::i;:::-;26370:74;;26326:128;26110:351;;;;:::o;26467:85::-;26512:7;26541:5;26530:16;;26467:85;;;:::o;26558:158::-;26616:9;26649:61;26667:42;26676:32;26702:5;26676:32;:::i;:::-;26667:42;:::i;:::-;26649:61;:::i;:::-;26636:74;;26558:158;;;:::o;26722:147::-;26817:45;26856:5;26817:45;:::i;:::-;26812:3;26805:58;26722:147;;:::o;26875:114::-;26942:6;26976:5;26970:12;26960:22;;26875:114;;;:::o;26995:184::-;27094:11;27128:6;27123:3;27116:19;27168:4;27163:3;27159:14;27144:29;;26995:184;;;;:::o;27185:132::-;27252:4;27275:3;27267:11;;27305:4;27300:3;27296:14;27288:22;;27185:132;;;:::o;27323:108::-;27400:24;27418:5;27400:24;:::i;:::-;27395:3;27388:37;27323:108;;:::o;27437:179::-;27506:10;27527:46;27569:3;27561:6;27527:46;:::i;:::-;27605:4;27600:3;27596:14;27582:28;;27437:179;;;;:::o;27622:113::-;27692:4;27724;27719:3;27715:14;27707:22;;27622:113;;;:::o;27771:732::-;27890:3;27919:54;27967:5;27919:54;:::i;:::-;27989:86;28068:6;28063:3;27989:86;:::i;:::-;27982:93;;28099:56;28149:5;28099:56;:::i;:::-;28178:7;28209:1;28194:284;28219:6;28216:1;28213:13;28194:284;;;28295:6;28289:13;28322:63;28381:3;28366:13;28322:63;:::i;:::-;28315:70;;28408:60;28461:6;28408:60;:::i;:::-;28398:70;;28254:224;28241:1;28238;28234:9;28229:14;;28194:284;;;28198:14;28494:3;28487:10;;27895:608;;;27771:732;;;;:::o;28509:831::-;28772:4;28810:3;28799:9;28795:19;28787:27;;28824:71;28892:1;28881:9;28877:17;28868:6;28824:71;:::i;:::-;28905:80;28981:2;28970:9;28966:18;28957:6;28905:80;:::i;:::-;29032:9;29026:4;29022:20;29017:2;29006:9;29002:18;28995:48;29060:108;29163:4;29154:6;29060:108;:::i;:::-;29052:116;;29178:72;29246:2;29235:9;29231:18;29222:6;29178:72;:::i;:::-;29260:73;29328:3;29317:9;29313:19;29304:6;29260:73;:::i;:::-;28509:831;;;;;;;;:::o

Swarm Source

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