ETH Price: $3,383.57 (-1.85%)
Gas: 4 Gwei

Token

Motion Ai (MotionAi)
 

Overview

Max Total Supply

10,000,000 MotionAi

Holders

80

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
27,640.224393271211865219 MotionAi

Value
$0.00
0x2f3208a7a8cb958f5593312ed32be68534ee5d70
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MotionAi

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-04-05
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
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 Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

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

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

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

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

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

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @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.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

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

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

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

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

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

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


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

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * 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);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


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

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @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}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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 Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), 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);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.20;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys a `value` amount of tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, deducting from
     * the caller's allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `value`.
     */
    function burnFrom(address account, uint256 value) public virtual {
        _spendAllowance(account, _msgSender(), value);
        _burn(account, value);
    }
}

// File: finalmotionai.sol


// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.20;




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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract MotionAi is ERC20, ERC20Burnable, Ownable {

    IUniswapV2Router02 public uniswapV2Router;
    mapping(address => bool) public automatedMarketMakerPairs;

    address public marketingWallet;
    address public liquidityWallet;

    mapping(address => bool) public isExcludeFromTax;

    uint256 public buyTax =25; // 5%
    uint256 public sellTax = 25; // 5%
    uint256 public liquidityTax = 1; // 1%
    uint256 public marketingTax = 24; // 4%
    uint256 public maxBuyCap = 200000 * (10 ** decimals()); // 200000 tokens
    uint256 public maxSellCap = 10000000 * (10 ** decimals()); // totalSupply of tokens

    bool private swapping;
    bool public swapAndLiquifyEnabled = true;
    uint256 public swapTokensAtAmount = 10000 * (10 ** decimals());

    event SwapTokensAtAmountUpdated(uint256 value);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    event SwapAndSendToMarketing(
        uint256 tokensSwapped,
        uint256 ethReceived
    );
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);
    event ExcludeFromTax(address indexed _user, bool _isExcludeFromTax);
    event UpdateMarketingWallet(
        address indexed oldMarketingWallet,
        address indexed newMarketingWallet
    );
    event UpdateLiquidityWallet(
        address indexed oldLiquidityWallet,
        address indexed newLiquidityWallet
    );
    event UpdateBuyTax(
        uint256 oldTax,
        uint256 newTax
    );
    event UpdateSellTax(
        uint256 oldTax,
        uint256 newTax
    );
    event UpdateLiquidityTax(
        uint256 oldTax,
        uint256 newTax
    );
    event UpdateMarketingTax(
        uint256 oldTax,
        uint256 newTax
    );
    event UpdateMaxBuyCap(
        uint256 oldCap,
        uint256 newCap
    );
    event UpdateMaxSellCap(
        uint256 oldCap,
        uint256 newCap
    );

    constructor()
        ERC20("Motion Ai", "MotionAi")
        Ownable(address(0xe0aCDC61b4A33FEFCD604b93CabA23E3f04C755D))
    {
        liquidityWallet = address(0xb769a5c0743f4c9399356E69a233c9651b2083B5);
        marketingWallet = address(0xb769a5c0743f4c9399356E69a233c9651b2083B5);
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)); // routerv2 for mainnet ethereum chain
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        automatedMarketMakerPairs[_uniswapV2Pair] = true;

        isExcludeFromTax[address(0xe0aCDC61b4A33FEFCD604b93CabA23E3f04C755D)] = true; // excluding owner 
        isExcludeFromTax[address(0xb769a5c0743f4c9399356E69a233c9651b2083B5)] = true; // excluding marketing wallet and lp wallet
        isExcludeFromTax[address(this)] = true;

        _mint(0xe0aCDC61b4A33FEFCD604b93CabA23E3f04C755D, 10000000 * (10 ** decimals()));
    }

    /**
     * @dev function for setting UniswapV2Router
     * @param newAddress address for new router.
     */
    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    /**
     * @dev function for setting Automated MarketMaker Pair
     * @param pair address for pair.
     * @param value boolean true or false.
     */
    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) external onlyOwner {
        require(automatedMarketMakerPairs[pair] != value, 'PairIsAlreadyGivenValue');
        automatedMarketMakerPairs[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    /**
     * @dev Function to set marketing address.
     * @param _marketing The address to  marketing wallet.
     */
    function changeMarketingWallet(
        address _marketing
    ) external onlyOwner {
        emit UpdateMarketingWallet(marketingWallet, _marketing);
        marketingWallet = _marketing;
    }

    /**
     * @dev Function to set liquidity address.
     * @param _liquidity The address to  marketing wallet.
     */
    function changeLiquidityWallet(
        address _liquidity
    ) external onlyOwner {
        emit UpdateLiquidityWallet(liquidityWallet, _liquidity);
        liquidityWallet = _liquidity;
    }

    /**
     * @dev Function to update isExcludeFromTax mapping to exclude or include From Tax
     * @param _user The address to be exclude or include From Tax
     * @param _isExcludeFromTax true or false
     */
    function excludeFromTax(
        address _user,
        bool _isExcludeFromTax
    ) external onlyOwner {
        isExcludeFromTax[_user] = _isExcludeFromTax;
        emit ExcludeFromTax(_user, _isExcludeFromTax);
    }

    /**
     * @dev Function to update BuyTaxPercentage
     * @param fee fee in percentage
     */
    function setBuyTaxFeePercent(uint256 fee) external onlyOwner() {
        require(fee <= 30, "Total Fee exceeds 30%");
        emit UpdateBuyTax(buyTax, fee);
        buyTax = fee;
    }

    /**
     * @dev Function to update SellTaxPercentage
     * @param fee fee in percentage
     */
    function setSellTaxFeePercent(uint256 fee) external onlyOwner() {
        require(fee <= 30, "Total Fee exceeds 30%");
        emit UpdateSellTax(sellTax, fee);
        sellTax = fee;
    }

    /**
     * @dev Function to update LiquidityTaxPercentage
     * @param fee fee in percentage
     */
    function setLiquidityTaxFeePercent(uint256 fee) external onlyOwner() {
        emit UpdateLiquidityTax(liquidityTax, fee);
        liquidityTax = fee;
    }

    /**
     * @dev Function to update MarketingTaxPercentage
     * @param fee fee in percentage
     */
    function setMarketingTaxFeePercent(uint256 fee) external onlyOwner() {
        emit UpdateMarketingTax(marketingTax, fee);
        marketingTax = fee;
    }

    /**
     * @dev Function to update MaxBuyCap
     * @param cap cap in amounts of tokens in wei
     */
    function setMaxBuyCap(uint256 cap) external onlyOwner() {
        require(cap >= totalSupply() / 100, "maxBuy Cannot be less than 1% of totalSupply");
        emit UpdateMaxBuyCap(maxBuyCap, cap);
        maxBuyCap = cap;
    }

    /**
     * @dev Function to update MaxSellCap
     * @param cap cap in amounts of tokens in wei
     */
    function setMaxSellCap(uint256 cap) external onlyOwner() {
        require(cap >= totalSupply() / 100, "maxSell Cannot be less than 1% of totalSupply");
        emit UpdateMaxSellCap(maxSellCap, cap);
        maxSellCap = cap;
    }

    /**
     * @dev Function to update Swap tokens at amount value
     * @param value value in amounts of tokens in wei
     */
    function setSwapTokensAtAmount (uint256 value) external onlyOwner() {
        swapTokensAtAmount = value;
        emit SwapTokensAtAmountUpdated(value);
    }
    
    /**
     * @dev Function to toggle swap and liquify feature
     * @param _enabled true or false
     */
    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    // The following function is overriden to support fees on transfers
    function _update(address from, address to, uint256 value)
        internal
        override(ERC20)
    {
        if( 
        	!swapping &&
        	from != address(uniswapV2Router) && //router -> pair is removing liquidity which shouldn't have max
            !isExcludeFromTax[to] //no max for those excluded from fees
        ) {
            _validateTransfer(from, to, value, true);
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(
            swapAndLiquifyEnabled &&
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != liquidityWallet &&
            to != liquidityWallet
        ) {
            swapping = true;

            uint256 swapTokens = (contractTokenBalance * liquidityTax) / (liquidityTax + marketingTax);
            swapAndLiquify(swapTokens);

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendToMarketing(sellTokens);

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to isExcludeFromTax account then remove the fee
        if(isExcludeFromTax[from] || isExcludeFromTax[to]) {
            takeFee = false;
        }

        if(takeFee) {
            uint256 fees;

            if(_isBuy(from)){
                fees = (value * buyTax) / 100;
            }
            else if(_isSell(from, to)){
                fees = (value * sellTax) / 100;
            }

        	value = value - fees;

            super._update(from, address(this), fees);
        }

        super._update(from, to, value);
    }

    // helper functions for buy, sell, lp, swap on uniswap

    function _isSell(address sender, address recipient) internal view returns (bool) {
        // Transfer to pair from non-router address is a sell swap
        return sender != address(uniswapV2Router) && automatedMarketMakerPairs[recipient];
    }

    function _isBuy(address sender) internal view returns (bool) {
        // Transfer from pair is a buy swap
        return automatedMarketMakerPairs[sender];
    }

    function swapAndLiquify(uint256 contractTokenBalance) private {
        // split the contract balance into halves
        uint256 half = contractTokenBalance / 2;
        uint256 otherHalf = contractTokenBalance - half;

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance - initialBalance;

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        try
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        ) {}
        catch{}
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        try
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        ) {} catch {}
    }

    function swapAndSendToMarketing(uint256 tokens) private {
        swapTokensForEth(tokens);
        uint256 ethRecieved = address(this).balance;
        (bool success,) = address(marketingWallet).call{value: ethRecieved}("");

        if(success) {
   	 		emit SwapAndSendToMarketing(tokens, ethRecieved);
        }
    }

    function _validateTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private view {
        // Excluded addresses don't have limits
        if (takeFee) {
            if (_isBuy(sender) && maxBuyCap != 0) {
                require(amount <= maxBuyCap, "Buy amount exceeds limit");
            } else if (_isSell(sender, recipient) && maxSellCap != 0) {
                require(amount <= maxSellCap, "Sell amount exceeds limit");
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExcludeFromTax","type":"bool"}],"name":"ExcludeFromTax","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndSendToMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SwapTokensAtAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTax","type":"uint256"}],"name":"UpdateBuyTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTax","type":"uint256"}],"name":"UpdateLiquidityTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"UpdateLiquidityWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTax","type":"uint256"}],"name":"UpdateMarketingTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCap","type":"uint256"}],"name":"UpdateMaxBuyCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCap","type":"uint256"}],"name":"UpdateMaxSellCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTax","type":"uint256"}],"name":"UpdateSellTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidity","type":"address"}],"name":"changeLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"}],"name":"changeMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_isExcludeFromTax","type":"bool"}],"name":"excludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludeFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellCap","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setBuyTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setLiquidityTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMarketingTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"setMaxBuyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"setMaxSellCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setSellTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526019600b556019600c556001600d556018600e5561002661060660201b60201c565b600a61003291906117b6565b62030d406100409190611800565b600f5561005161060660201b60201c565b600a61005d91906117b6565b6298968061006b9190611800565b6010556001601160016101000a81548160ff02191690831515021790555061009761060660201b60201c565b600a6100a391906117b6565b6127106100b09190611800565b6012553480156100be575f80fd5b5073e0acdc61b4a33fefcd604b93caba23e3f04c755d6040518060400160405280600981526020017f4d6f74696f6e20416900000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f4d6f74696f6e4169000000000000000000000000000000000000000000000000815250816003908161014f9190611a72565b50806004908161015f9190611a72565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101d2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101c99190611b80565b60405180910390fd5b6101e18161060e60201b60201c565b5073b769a5c0743f4c9399356e69a233c9651b2083b560095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b769a5c0743f4c9399356e69a233c9651b2083b560085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103109190611bc7565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610375573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103999190611bc7565b6040518363ffffffff1660e01b81526004016103b6929190611bf2565b6020604051808303815f875af11580156103d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f69190611bc7565b90508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f73e0acdc61b4a33fefcd604b93caba23e3f04c755d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f73b769a5c0743f4c9399356e69a233c9651b2083b573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600a5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506105ff73e0acdc61b4a33fefcd604b93caba23e3f04c755d6105da61060660201b60201c565b600a6105e691906117b6565b629896806105f49190611800565b6106d160201b60201c565b5050612104565b5f6012905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610741575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107389190611b80565b60405180910390fd5b6107525f838361075660201b60201c565b5050565b60115f9054906101000a900460ff161580156107bf575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156108125750600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561082b5761082a8383836001610b7260201b60201c565b5b5f61083b30610c5560201b60201c565b90505f6012548210159050601160019054906101000a900460ff16801561085f5750805b8015610877575060115f9054906101000a900460ff16155b80156108ca575060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610923575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801561097c575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15610a1257600160115f6101000a81548160ff0219169083151502179055505f600e54600d546109ac9190611c19565b600d54846109ba9190611800565b6109c49190611c79565b90506109d581610c9a60201b60201c565b5f6109e530610c5560201b60201c565b90506109f681610d2d60201b60201c565b5f60115f6101000a81548160ff02191690831515021790555050505b5f60115f9054906101000a900460ff16159050600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610ac05750600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15610ac9575f90505b8015610b59575f610adf87610e0e60201b60201c565b15610b05576064600b5486610af49190611800565b610afe9190611c79565b9050610b38565b610b158787610e6060201b60201c565b15610b37576064600c5486610b2a9190611800565b610b349190611c79565b90505b5b8085610b449190611ca9565b9450610b57873083610f0c60201b60201c565b505b610b6a868686610f0c60201b60201c565b505050505050565b8015610c4f57610b8784610e0e60201b60201c565b8015610b9557505f600f5414155b15610be457600f54821115610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd690611d36565b60405180910390fd5b610c4e565b610bf48484610e6060201b60201c565b8015610c0257505f60105414155b15610c4d57601054821115610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390611d9e565b60405180910390fd5b5b5b5b50505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600282610ca89190611c79565b90505f8183610cb79190611ca9565b90505f479050610ccc8361112560201b60201c565b5f8147610cd99190611ca9565b9050610ceb838261135d60201b60201c565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051610d1e93929190611dcb565b60405180910390a15050505050565b610d3c8161112560201b60201c565b5f4790505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610d8690611e2d565b5f6040518083038185875af1925050503d805f8114610dc0576040519150601f19603f3d011682016040523d82523d5f602084013e610dc5565b606091505b505090508015610e09577fe90cef93b59fb17c24184780df92ee75fb5932fe6602fe2c29f92b75945a6ed68383604051610e00929190611e41565b60405180910390a15b505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015610f04575060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5c578060025f828254610f509190611c19565b9250508190555061102a565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610fe5578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610fdc93929190611e68565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611071578060025f82825403925050819055506110bb565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111189190611e9d565b60405180910390a3505050565b5f600267ffffffffffffffff8111156111415761114061184b565b5b60405190808252806020026020018201604052801561116f5781602001602082028036833780820191505090505b50905030815f8151811061118657611185611eb6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124e9190611bc7565b8160018151811061126257611261611eb6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506112ce3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461145e60201b60201c565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611330959493929190611fd3565b5f604051808303815f87803b158015611347575f80fd5b505af1925050508015611358575060015b505050565b61138f3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461145e60201b60201c565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f8060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016114159695949392919061202b565b60606040518083038185885af19350505050801561145157506040513d601f19601f8201168201806040525081019061144e91906120b4565b60015b1561145a575050505b5050565b611471838383600161147660201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036114e6575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016114dd9190611b80565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611556575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161154d9190611b80565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561163f578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516116369190611e9d565b60405180910390a35b50505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156116c7578086048111156116a3576116a2611645565b5b60018516156116b25780820291505b80810290506116c085611672565b9450611687565b94509492505050565b5f826116df576001905061179a565b816116ec575f905061179a565b8160018114611702576002811461170c5761173b565b600191505061179a565b60ff84111561171e5761171d611645565b5b8360020a91508482111561173557611734611645565b5b5061179a565b5060208310610133831016604e8410600b84101617156117705782820a90508381111561176b5761176a611645565b5b61179a565b61177d848484600161167e565b9250905081840481111561179457611793611645565b5b81810290505b9392505050565b5f819050919050565b5f60ff82169050919050565b5f6117c0826117a1565b91506117cb836117aa565b92506117f87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846116d0565b905092915050565b5f61180a826117a1565b9150611815836117a1565b9250828202611823816117a1565b9150828204841483151761183a57611839611645565b5b5092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806118bc57607f821691505b6020821081036118cf576118ce611878565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026119317fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826118f6565b61193b86836118f6565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61197661197161196c846117a1565b611953565b6117a1565b9050919050565b5f819050919050565b61198f8361195c565b6119a361199b8261197d565b848454611902565b825550505050565b5f90565b6119b76119ab565b6119c2818484611986565b505050565b5b818110156119e5576119da5f826119af565b6001810190506119c8565b5050565b601f821115611a2a576119fb816118d5565b611a04846118e7565b81016020851015611a13578190505b611a27611a1f856118e7565b8301826119c7565b50505b505050565b5f82821c905092915050565b5f611a4a5f1984600802611a2f565b1980831691505092915050565b5f611a628383611a3b565b9150826002028217905092915050565b611a7b82611841565b67ffffffffffffffff811115611a9457611a9361184b565b5b611a9e82546118a5565b611aa98282856119e9565b5f60209050601f831160018114611ada575f8415611ac8578287015190505b611ad28582611a57565b865550611b39565b601f198416611ae8866118d5565b5f5b82811015611b0f57848901518255600182019150602085019450602081019050611aea565b86831015611b2c5784890151611b28601f891682611a3b565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b6a82611b41565b9050919050565b611b7a81611b60565b82525050565b5f602082019050611b935f830184611b71565b92915050565b5f80fd5b611ba681611b60565b8114611bb0575f80fd5b50565b5f81519050611bc181611b9d565b92915050565b5f60208284031215611bdc57611bdb611b99565b5b5f611be984828501611bb3565b91505092915050565b5f604082019050611c055f830185611b71565b611c126020830184611b71565b9392505050565b5f611c23826117a1565b9150611c2e836117a1565b9250828201905080821115611c4657611c45611645565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611c83826117a1565b9150611c8e836117a1565b925082611c9e57611c9d611c4c565b5b828204905092915050565b5f611cb3826117a1565b9150611cbe836117a1565b9250828203905081811115611cd657611cd5611645565b5b92915050565b5f82825260208201905092915050565b7f42757920616d6f756e742065786365656473206c696d697400000000000000005f82015250565b5f611d20601883611cdc565b9150611d2b82611cec565b602082019050919050565b5f6020820190508181035f830152611d4d81611d14565b9050919050565b7f53656c6c20616d6f756e742065786365656473206c696d6974000000000000005f82015250565b5f611d88601983611cdc565b9150611d9382611d54565b602082019050919050565b5f6020820190508181035f830152611db581611d7c565b9050919050565b611dc5816117a1565b82525050565b5f606082019050611dde5f830186611dbc565b611deb6020830185611dbc565b611df86040830184611dbc565b949350505050565b5f81905092915050565b50565b5f611e185f83611e00565b9150611e2382611e0a565b5f82019050919050565b5f611e3782611e0d565b9150819050919050565b5f604082019050611e545f830185611dbc565b611e616020830184611dbc565b9392505050565b5f606082019050611e7b5f830186611b71565b611e886020830185611dbc565b611e956040830184611dbc565b949350505050565b5f602082019050611eb05f830184611dbc565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f611f06611f01611efc84611ee3565b611953565b6117a1565b9050919050565b611f1681611eec565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611f4e81611b60565b82525050565b5f611f5f8383611f45565b60208301905092915050565b5f602082019050919050565b5f611f8182611f1c565b611f8b8185611f26565b9350611f9683611f36565b805f5b83811015611fc6578151611fad8882611f54565b9750611fb883611f6b565b925050600181019050611f99565b5085935050505092915050565b5f60a082019050611fe65f830188611dbc565b611ff36020830187611f0d565b81810360408301526120058186611f77565b90506120146060830185611b71565b6120216080830184611dbc565b9695505050505050565b5f60c08201905061203e5f830189611b71565b61204b6020830188611dbc565b6120586040830187611f0d565b6120656060830186611f0d565b6120726080830185611b71565b61207f60a0830184611dbc565b979650505050505050565b612093816117a1565b811461209d575f80fd5b50565b5f815190506120ae8161208a565b92915050565b5f805f606084860312156120cb576120ca611b99565b5b5f6120d8868287016120a0565b93505060206120e9868287016120a0565b92505060406120fa868287016120a0565b9150509250925092565b6133f4806121115f395ff3fe60806040526004361061023e575f3560e01c8063961cc9f81161012d578063cc1776d3116100aa578063e58b719f1161006e578063e58b719f14610859578063e68f643414610881578063e6dd8856146108a9578063f2fde38b146108d3578063fcb75d9d146108fb57610245565b8063cc1776d314610777578063d0e03523146107a1578063d4698016146107c9578063dd62ed3e146107f3578063e2f456051461082f57610245565b8063b62496f5116100f1578063b62496f514610699578063bb85c6d1146106d5578063be617fa0146106fd578063c49b9a8014610727578063c6a306471461074f57610245565b8063961cc9f8146105a75780639708e250146105e35780639a7a23d61461060d578063a9059cbb14610635578063afa4f3b21461067157610245565b80634f7041a5116101bb57806375f0a8741161017f57806375f0a874146104d957806379cc6790146105035780637ba54f1f1461052b5780638da5cb5b1461055357806395d89b411461057d57610245565b80634f7041a51461040d57806365b8dbc014610437578063696b66d51461045f57806370a0823114610487578063715018a6146104c357610245565b80631d2cb02d116102025780631d2cb02d1461032b57806323b872dd14610355578063313ce5671461039157806342966c68146103bb5780634a74bb02146103e357610245565b806306fdde0314610249578063095ea7b31461027357806311889b76146102af5780631694505e146102d757806318160ddd1461030157610245565b3661024557005b5f80fd5b348015610254575f80fd5b5061025d610923565b60405161026a91906127df565b60405180910390f35b34801561027e575f80fd5b5061029960048036038101906102949190612890565b6109b3565b6040516102a691906128e8565b60405180910390f35b3480156102ba575f80fd5b506102d560048036038101906102d09190612901565b6109d5565b005b3480156102e2575f80fd5b506102eb610a66565b6040516102f89190612987565b60405180910390f35b34801561030c575f80fd5b50610315610a8b565b60405161032291906129af565b60405180910390f35b348015610336575f80fd5b5061033f610a94565b60405161034c91906129af565b60405180910390f35b348015610360575f80fd5b5061037b600480360381019061037691906129c8565b610a9a565b60405161038891906128e8565b60405180910390f35b34801561039c575f80fd5b506103a5610ac8565b6040516103b29190612a33565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc9190612901565b610ad0565b005b3480156103ee575f80fd5b506103f7610ae4565b60405161040491906128e8565b60405180910390f35b348015610418575f80fd5b50610421610af7565b60405161042e91906129af565b60405180910390f35b348015610442575f80fd5b5061045d60048036038101906104589190612a4c565b610afd565b005b34801561046a575f80fd5b5061048560048036038101906104809190612901565b610c52565b005b348015610492575f80fd5b506104ad60048036038101906104a89190612a4c565b610c9f565b6040516104ba91906129af565b60405180910390f35b3480156104ce575f80fd5b506104d7610ce4565b005b3480156104e4575f80fd5b506104ed610cf7565b6040516104fa9190612a86565b60405180910390f35b34801561050e575f80fd5b5061052960048036038101906105249190612890565b610d1c565b005b348015610536575f80fd5b50610551600480360381019061054c9190612a4c565b610d3c565b005b34801561055e575f80fd5b50610567610e02565b6040516105749190612a86565b60405180910390f35b348015610588575f80fd5b50610591610e2a565b60405161059e91906127df565b60405180910390f35b3480156105b2575f80fd5b506105cd60048036038101906105c89190612a4c565b610eba565b6040516105da91906128e8565b60405180910390f35b3480156105ee575f80fd5b506105f7610ed7565b60405161060491906129af565b60405180910390f35b348015610618575f80fd5b50610633600480360381019061062e9190612ac9565b610edd565b005b348015610640575f80fd5b5061065b60048036038101906106569190612890565b61101a565b60405161066891906128e8565b60405180910390f35b34801561067c575f80fd5b5061069760048036038101906106929190612901565b61103c565b005b3480156106a4575f80fd5b506106bf60048036038101906106ba9190612a4c565b611085565b6040516106cc91906128e8565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a4c565b6110a2565b005b348015610708575f80fd5b50610711611168565b60405161071e91906129af565b60405180910390f35b348015610732575f80fd5b5061074d60048036038101906107489190612b07565b61116e565b005b34801561075a575f80fd5b5061077560048036038101906107709190612ac9565b6111ca565b005b348015610782575f80fd5b5061078b611278565b60405161079891906129af565b60405180910390f35b3480156107ac575f80fd5b506107c760048036038101906107c29190612901565b61127e565b005b3480156107d4575f80fd5b506107dd61130f565b6040516107ea9190612a86565b60405180910390f35b3480156107fe575f80fd5b5061081960048036038101906108149190612b32565b611334565b60405161082691906129af565b60405180910390f35b34801561083a575f80fd5b506108436113b6565b60405161085091906129af565b60405180910390f35b348015610864575f80fd5b5061087f600480360381019061087a9190612901565b6113bc565b005b34801561088c575f80fd5b506108a760048036038101906108a29190612901565b611409565b005b3480156108b4575f80fd5b506108bd6114ac565b6040516108ca91906129af565b60405180910390f35b3480156108de575f80fd5b506108f960048036038101906108f49190612a4c565b6114b2565b005b348015610906575f80fd5b50610921600480360381019061091c9190612901565b611536565b005b60606003805461093290612b9d565b80601f016020809104026020016040519081016040528092919081815260200182805461095e90612b9d565b80156109a95780601f10610980576101008083540402835291602001916109a9565b820191905f5260205f20905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b5f806109bd6115d9565b90506109ca8185856115e0565b600191505092915050565b6109dd6115f2565b601e811115610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890612c17565b60405180910390fd5b7f4350dcfc5e910c40b6d16fdf94cbbc788c1f4ac51a7dc561b081157d4b8ed4ec600b5482604051610a54929190612c35565b60405180910390a180600b8190555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b600e5481565b5f80610aa46115d9565b9050610ab1858285611679565b610abc85858561170b565b60019150509392505050565b5f6012905090565b610ae1610adb6115d9565b826117fb565b50565b601160019054906101000a900460ff1681565b600b5481565b610b056115f2565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90612ccc565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610c5a6115f2565b7fc3c80caa0620629d6a7bdf83cea6fe7828af3d58f2432815140250a102b1c5c3600d5482604051610c8d929190612c35565b60405180910390a180600d8190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610cec6115f2565b610cf55f61187a565b565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d2e82610d286115d9565b83611679565b610d3882826117fb565b5050565b610d446115f2565b8073ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8282fa3ce5b9842b7a8f3f81030cd5dd3ee5984fc40987a76d83f9d5492fa97760405160405180910390a38060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e3990612b9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6590612b9d565b8015610eb05780601f10610e8757610100808354040283529160200191610eb0565b820191905f5260205f20905b815481529060010190602001808311610e9357829003601f168201915b5050505050905090565b600a602052805f5260405f205f915054906101000a900460ff1681565b60105481565b610ee56115f2565b80151560075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90612d34565b60405180910390fd5b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab8260405161100e91906128e8565b60405180910390a25050565b5f806110246115d9565b905061103181858561170b565b600191505092915050565b6110446115f2565b806012819055507f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b1458160405161107a91906129af565b60405180910390a150565b6007602052805f5260405f205f915054906101000a900460ff1681565b6110aa6115f2565b8073ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167facf03c50dcf01e53e2775267d12acd0158d87c2f20fb84226837142693b36ae760405160405180910390a38060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6111766115f2565b80601160016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516111bf91906128e8565b60405180910390a150565b6111d26115f2565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c8260405161126c91906128e8565b60405180910390a25050565b600c5481565b6112866115f2565b601e8111156112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190612c17565b60405180910390fd5b7fb67587dc52452dfa7b987911428a2b47c610929d62284cda9f4aafb90435ad4e600c54826040516112fd929190612c35565b60405180910390a180600c8190555050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60125481565b6113c46115f2565b7f2c205c3aa957c1a009f7f5d1751f52cb6e2010fd1210c72a7acc8d2c6957239c600e54826040516113f7929190612c35565b60405180910390a180600e8190555050565b6114116115f2565b606461141b610a8b565b6114259190612dac565b811015611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90612e4c565b60405180910390fd5b7f1278e14601f0432b8e14e6e92578d7a3320f5bf2e40493a4619062f3df040b2c6010548260405161149a929190612c35565b60405180910390a18060108190555050565b600f5481565b6114ba6115f2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361152a575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016115219190612a86565b60405180910390fd5b6115338161187a565b50565b61153e6115f2565b6064611548610a8b565b6115529190612dac565b811015611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90612eda565b60405180910390fd5b7fa50ecc3f280b8c78f2a044a3ce89997176ffcddaa2920e0626cc093d31299f67600f54826040516115c7929190612c35565b60405180910390a180600f8190555050565b5f33905090565b6115ed838383600161193d565b505050565b6115fa6115d9565b73ffffffffffffffffffffffffffffffffffffffff16611618610e02565b73ffffffffffffffffffffffffffffffffffffffff16146116775761163b6115d9565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161166e9190612a86565b60405180910390fd5b565b5f6116848484611334565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461170557818110156116f6578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016116ed93929190612ef8565b60405180910390fd5b61170484848484035f61193d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361177b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016117729190612a86565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117eb575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016117e29190612a86565b60405180910390fd5b6117f6838383611b0c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361186b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016118629190612a86565b60405180910390fd5b611876825f83611b0c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036119ad575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016119a49190612a86565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a1d575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611a149190612a86565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611b06578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611afd91906129af565b60405180910390a35b50505050565b60115f9054906101000a900460ff16158015611b75575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611bc85750600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611bdb57611bda8383836001611ef2565b5b5f611be530610c9f565b90505f6012548210159050601160019054906101000a900460ff168015611c095750805b8015611c21575060115f9054906101000a900460ff16155b8015611c74575060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611ccd575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015611d26575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611daa57600160115f6101000a81548160ff0219169083151502179055505f600e54600d54611d569190612f2d565b600d5484611d649190612f60565b611d6e9190612dac565b9050611d7981611fc9565b5f611d8330610c9f565b9050611d8e81612050565b5f60115f6101000a81548160ff02191690831515021790555050505b5f60115f9054906101000a900460ff16159050600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611e585750600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611e61575f90505b8015611edf575f611e718761212b565b15611e97576064600b5486611e869190612f60565b611e909190612dac565b9050611ec4565b611ea1878761217d565b15611ec3576064600c5486611eb69190612f60565b611ec09190612dac565b90505b5b8085611ed09190612fa1565b9450611edd873083612229565b505b611eea868686612229565b505050505050565b8015611fc357611f018461212b565b8015611f0f57505f600f5414155b15611f5e57600f54821115611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f509061301e565b60405180910390fd5b611fc2565b611f68848461217d565b8015611f7657505f60105414155b15611fc157601054821115611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790613086565b60405180910390fd5b5b5b5b50505050565b5f600282611fd79190612dac565b90505f8183611fe69190612fa1565b90505f479050611ff583612442565b5f81476120029190612fa1565b905061200e8382612674565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051612041939291906130a4565b60405180910390a15050505050565b61205981612442565b5f4790505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516120a390613106565b5f6040518083038185875af1925050503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b505090508015612126577fe90cef93b59fb17c24184780df92ee75fb5932fe6602fe2c29f92b75945a6ed6838360405161211d929190612c35565b60405180910390a15b505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612221575060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612279578060025f82825461226d9190612f2d565b92505081905550612347565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612302578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016122f993929190612ef8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361238e578060025f82825403925050819055506123d8565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161243591906129af565b60405180910390a3505050565b5f600267ffffffffffffffff81111561245e5761245d61311a565b5b60405190808252806020026020018201604052801561248c5781602001602082028036833780820191505090505b50905030815f815181106124a3576124a2613147565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612547573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256b9190613188565b8160018151811061257f5761257e613147565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506125e53060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846115e0565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016126479594939291906132a3565b5f604051808303815f87803b15801561265e575f80fd5b505af192505050801561266f575060015b505050565b6126a03060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846115e0565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f8060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612726969594939291906132fb565b60606040518083038185885af19350505050801561276257506040513d601f19601f8201168201806040525081019061275f919061336e565b60015b1561276b575050505b5050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6127b18261276f565b6127bb8185612779565b93506127cb818560208601612789565b6127d481612797565b840191505092915050565b5f6020820190508181035f8301526127f781846127a7565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61282c82612803565b9050919050565b61283c81612822565b8114612846575f80fd5b50565b5f8135905061285781612833565b92915050565b5f819050919050565b61286f8161285d565b8114612879575f80fd5b50565b5f8135905061288a81612866565b92915050565b5f80604083850312156128a6576128a56127ff565b5b5f6128b385828601612849565b92505060206128c48582860161287c565b9150509250929050565b5f8115159050919050565b6128e2816128ce565b82525050565b5f6020820190506128fb5f8301846128d9565b92915050565b5f60208284031215612916576129156127ff565b5b5f6129238482850161287c565b91505092915050565b5f819050919050565b5f61294f61294a61294584612803565b61292c565b612803565b9050919050565b5f61296082612935565b9050919050565b5f61297182612956565b9050919050565b61298181612967565b82525050565b5f60208201905061299a5f830184612978565b92915050565b6129a98161285d565b82525050565b5f6020820190506129c25f8301846129a0565b92915050565b5f805f606084860312156129df576129de6127ff565b5b5f6129ec86828701612849565b93505060206129fd86828701612849565b9250506040612a0e8682870161287c565b9150509250925092565b5f60ff82169050919050565b612a2d81612a18565b82525050565b5f602082019050612a465f830184612a24565b92915050565b5f60208284031215612a6157612a606127ff565b5b5f612a6e84828501612849565b91505092915050565b612a8081612822565b82525050565b5f602082019050612a995f830184612a77565b92915050565b612aa8816128ce565b8114612ab2575f80fd5b50565b5f81359050612ac381612a9f565b92915050565b5f8060408385031215612adf57612ade6127ff565b5b5f612aec85828601612849565b9250506020612afd85828601612ab5565b9150509250929050565b5f60208284031215612b1c57612b1b6127ff565b5b5f612b2984828501612ab5565b91505092915050565b5f8060408385031215612b4857612b476127ff565b5b5f612b5585828601612849565b9250506020612b6685828601612849565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612bb457607f821691505b602082108103612bc757612bc6612b70565b5b50919050565b7f546f74616c2046656520657863656564732033302500000000000000000000005f82015250565b5f612c01601583612779565b9150612c0c82612bcd565b602082019050919050565b5f6020820190508181035f830152612c2e81612bf5565b9050919050565b5f604082019050612c485f8301856129a0565b612c5560208301846129a0565b9392505050565b7f54686520726f7574657220616c726561647920686173207468617420616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612cb6602383612779565b9150612cc182612c5c565b604082019050919050565b5f6020820190508181035f830152612ce381612caa565b9050919050565b7f506169724973416c7265616479476976656e56616c75650000000000000000005f82015250565b5f612d1e601783612779565b9150612d2982612cea565b602082019050919050565b5f6020820190508181035f830152612d4b81612d12565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612db68261285d565b9150612dc18361285d565b925082612dd157612dd0612d52565b5b828204905092915050565b7f6d617853656c6c2043616e6e6f74206265206c657373207468616e203125206f5f8201527f6620746f74616c537570706c7900000000000000000000000000000000000000602082015250565b5f612e36602d83612779565b9150612e4182612ddc565b604082019050919050565b5f6020820190508181035f830152612e6381612e2a565b9050919050565b7f6d61784275792043616e6e6f74206265206c657373207468616e203125206f665f8201527f20746f74616c537570706c790000000000000000000000000000000000000000602082015250565b5f612ec4602c83612779565b9150612ecf82612e6a565b604082019050919050565b5f6020820190508181035f830152612ef181612eb8565b9050919050565b5f606082019050612f0b5f830186612a77565b612f1860208301856129a0565b612f2560408301846129a0565b949350505050565b5f612f378261285d565b9150612f428361285d565b9250828201905080821115612f5a57612f59612d7f565b5b92915050565b5f612f6a8261285d565b9150612f758361285d565b9250828202612f838161285d565b91508282048414831517612f9a57612f99612d7f565b5b5092915050565b5f612fab8261285d565b9150612fb68361285d565b9250828203905081811115612fce57612fcd612d7f565b5b92915050565b7f42757920616d6f756e742065786365656473206c696d697400000000000000005f82015250565b5f613008601883612779565b915061301382612fd4565b602082019050919050565b5f6020820190508181035f83015261303581612ffc565b9050919050565b7f53656c6c20616d6f756e742065786365656473206c696d6974000000000000005f82015250565b5f613070601983612779565b915061307b8261303c565b602082019050919050565b5f6020820190508181035f83015261309d81613064565b9050919050565b5f6060820190506130b75f8301866129a0565b6130c460208301856129a0565b6130d160408301846129a0565b949350505050565b5f81905092915050565b50565b5f6130f15f836130d9565b91506130fc826130e3565b5f82019050919050565b5f613110826130e6565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061318281612833565b92915050565b5f6020828403121561319d5761319c6127ff565b5b5f6131aa84828501613174565b91505092915050565b5f819050919050565b5f6131d66131d16131cc846131b3565b61292c565b61285d565b9050919050565b6131e6816131bc565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61321e81612822565b82525050565b5f61322f8383613215565b60208301905092915050565b5f602082019050919050565b5f613251826131ec565b61325b81856131f6565b935061326683613206565b805f5b8381101561329657815161327d8882613224565b97506132888361323b565b925050600181019050613269565b5085935050505092915050565b5f60a0820190506132b65f8301886129a0565b6132c360208301876131dd565b81810360408301526132d58186613247565b90506132e46060830185612a77565b6132f160808301846129a0565b9695505050505050565b5f60c08201905061330e5f830189612a77565b61331b60208301886129a0565b61332860408301876131dd565b61333560608301866131dd565b6133426080830185612a77565b61334f60a08301846129a0565b979650505050505050565b5f8151905061336881612866565b92915050565b5f805f60608486031215613385576133846127ff565b5b5f6133928682870161335a565b93505060206133a38682870161335a565b92505060406133b48682870161335a565b915050925092509256fea2646970667358221220f7bc428e8a231ef13ffd0310fbed75522f13ab53403ed1be2eb7487bdd345fad64736f6c63430008190033

Deployed Bytecode

0x60806040526004361061023e575f3560e01c8063961cc9f81161012d578063cc1776d3116100aa578063e58b719f1161006e578063e58b719f14610859578063e68f643414610881578063e6dd8856146108a9578063f2fde38b146108d3578063fcb75d9d146108fb57610245565b8063cc1776d314610777578063d0e03523146107a1578063d4698016146107c9578063dd62ed3e146107f3578063e2f456051461082f57610245565b8063b62496f5116100f1578063b62496f514610699578063bb85c6d1146106d5578063be617fa0146106fd578063c49b9a8014610727578063c6a306471461074f57610245565b8063961cc9f8146105a75780639708e250146105e35780639a7a23d61461060d578063a9059cbb14610635578063afa4f3b21461067157610245565b80634f7041a5116101bb57806375f0a8741161017f57806375f0a874146104d957806379cc6790146105035780637ba54f1f1461052b5780638da5cb5b1461055357806395d89b411461057d57610245565b80634f7041a51461040d57806365b8dbc014610437578063696b66d51461045f57806370a0823114610487578063715018a6146104c357610245565b80631d2cb02d116102025780631d2cb02d1461032b57806323b872dd14610355578063313ce5671461039157806342966c68146103bb5780634a74bb02146103e357610245565b806306fdde0314610249578063095ea7b31461027357806311889b76146102af5780631694505e146102d757806318160ddd1461030157610245565b3661024557005b5f80fd5b348015610254575f80fd5b5061025d610923565b60405161026a91906127df565b60405180910390f35b34801561027e575f80fd5b5061029960048036038101906102949190612890565b6109b3565b6040516102a691906128e8565b60405180910390f35b3480156102ba575f80fd5b506102d560048036038101906102d09190612901565b6109d5565b005b3480156102e2575f80fd5b506102eb610a66565b6040516102f89190612987565b60405180910390f35b34801561030c575f80fd5b50610315610a8b565b60405161032291906129af565b60405180910390f35b348015610336575f80fd5b5061033f610a94565b60405161034c91906129af565b60405180910390f35b348015610360575f80fd5b5061037b600480360381019061037691906129c8565b610a9a565b60405161038891906128e8565b60405180910390f35b34801561039c575f80fd5b506103a5610ac8565b6040516103b29190612a33565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc9190612901565b610ad0565b005b3480156103ee575f80fd5b506103f7610ae4565b60405161040491906128e8565b60405180910390f35b348015610418575f80fd5b50610421610af7565b60405161042e91906129af565b60405180910390f35b348015610442575f80fd5b5061045d60048036038101906104589190612a4c565b610afd565b005b34801561046a575f80fd5b5061048560048036038101906104809190612901565b610c52565b005b348015610492575f80fd5b506104ad60048036038101906104a89190612a4c565b610c9f565b6040516104ba91906129af565b60405180910390f35b3480156104ce575f80fd5b506104d7610ce4565b005b3480156104e4575f80fd5b506104ed610cf7565b6040516104fa9190612a86565b60405180910390f35b34801561050e575f80fd5b5061052960048036038101906105249190612890565b610d1c565b005b348015610536575f80fd5b50610551600480360381019061054c9190612a4c565b610d3c565b005b34801561055e575f80fd5b50610567610e02565b6040516105749190612a86565b60405180910390f35b348015610588575f80fd5b50610591610e2a565b60405161059e91906127df565b60405180910390f35b3480156105b2575f80fd5b506105cd60048036038101906105c89190612a4c565b610eba565b6040516105da91906128e8565b60405180910390f35b3480156105ee575f80fd5b506105f7610ed7565b60405161060491906129af565b60405180910390f35b348015610618575f80fd5b50610633600480360381019061062e9190612ac9565b610edd565b005b348015610640575f80fd5b5061065b60048036038101906106569190612890565b61101a565b60405161066891906128e8565b60405180910390f35b34801561067c575f80fd5b5061069760048036038101906106929190612901565b61103c565b005b3480156106a4575f80fd5b506106bf60048036038101906106ba9190612a4c565b611085565b6040516106cc91906128e8565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a4c565b6110a2565b005b348015610708575f80fd5b50610711611168565b60405161071e91906129af565b60405180910390f35b348015610732575f80fd5b5061074d60048036038101906107489190612b07565b61116e565b005b34801561075a575f80fd5b5061077560048036038101906107709190612ac9565b6111ca565b005b348015610782575f80fd5b5061078b611278565b60405161079891906129af565b60405180910390f35b3480156107ac575f80fd5b506107c760048036038101906107c29190612901565b61127e565b005b3480156107d4575f80fd5b506107dd61130f565b6040516107ea9190612a86565b60405180910390f35b3480156107fe575f80fd5b5061081960048036038101906108149190612b32565b611334565b60405161082691906129af565b60405180910390f35b34801561083a575f80fd5b506108436113b6565b60405161085091906129af565b60405180910390f35b348015610864575f80fd5b5061087f600480360381019061087a9190612901565b6113bc565b005b34801561088c575f80fd5b506108a760048036038101906108a29190612901565b611409565b005b3480156108b4575f80fd5b506108bd6114ac565b6040516108ca91906129af565b60405180910390f35b3480156108de575f80fd5b506108f960048036038101906108f49190612a4c565b6114b2565b005b348015610906575f80fd5b50610921600480360381019061091c9190612901565b611536565b005b60606003805461093290612b9d565b80601f016020809104026020016040519081016040528092919081815260200182805461095e90612b9d565b80156109a95780601f10610980576101008083540402835291602001916109a9565b820191905f5260205f20905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b5f806109bd6115d9565b90506109ca8185856115e0565b600191505092915050565b6109dd6115f2565b601e811115610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890612c17565b60405180910390fd5b7f4350dcfc5e910c40b6d16fdf94cbbc788c1f4ac51a7dc561b081157d4b8ed4ec600b5482604051610a54929190612c35565b60405180910390a180600b8190555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b600e5481565b5f80610aa46115d9565b9050610ab1858285611679565b610abc85858561170b565b60019150509392505050565b5f6012905090565b610ae1610adb6115d9565b826117fb565b50565b601160019054906101000a900460ff1681565b600b5481565b610b056115f2565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90612ccc565b60405180910390fd5b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610c5a6115f2565b7fc3c80caa0620629d6a7bdf83cea6fe7828af3d58f2432815140250a102b1c5c3600d5482604051610c8d929190612c35565b60405180910390a180600d8190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610cec6115f2565b610cf55f61187a565b565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d2e82610d286115d9565b83611679565b610d3882826117fb565b5050565b610d446115f2565b8073ffffffffffffffffffffffffffffffffffffffff1660095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8282fa3ce5b9842b7a8f3f81030cd5dd3ee5984fc40987a76d83f9d5492fa97760405160405180910390a38060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e3990612b9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6590612b9d565b8015610eb05780601f10610e8757610100808354040283529160200191610eb0565b820191905f5260205f20905b815481529060010190602001808311610e9357829003601f168201915b5050505050905090565b600a602052805f5260405f205f915054906101000a900460ff1681565b60105481565b610ee56115f2565b80151560075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90612d34565b60405180910390fd5b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab8260405161100e91906128e8565b60405180910390a25050565b5f806110246115d9565b905061103181858561170b565b600191505092915050565b6110446115f2565b806012819055507f7c26bfee26f82e8cb57af48f4019cc64582db6fac7bad778433f10572ae8b1458160405161107a91906129af565b60405180910390a150565b6007602052805f5260405f205f915054906101000a900460ff1681565b6110aa6115f2565b8073ffffffffffffffffffffffffffffffffffffffff1660085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167facf03c50dcf01e53e2775267d12acd0158d87c2f20fb84226837142693b36ae760405160405180910390a38060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6111766115f2565b80601160016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516111bf91906128e8565b60405180910390a150565b6111d26115f2565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f7e9c88b87a525bea9b5a9169ddf4660ad19e19b88ea5057a584ee4d31cceec9c8260405161126c91906128e8565b60405180910390a25050565b600c5481565b6112866115f2565b601e8111156112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190612c17565b60405180910390fd5b7fb67587dc52452dfa7b987911428a2b47c610929d62284cda9f4aafb90435ad4e600c54826040516112fd929190612c35565b60405180910390a180600c8190555050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60125481565b6113c46115f2565b7f2c205c3aa957c1a009f7f5d1751f52cb6e2010fd1210c72a7acc8d2c6957239c600e54826040516113f7929190612c35565b60405180910390a180600e8190555050565b6114116115f2565b606461141b610a8b565b6114259190612dac565b811015611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90612e4c565b60405180910390fd5b7f1278e14601f0432b8e14e6e92578d7a3320f5bf2e40493a4619062f3df040b2c6010548260405161149a929190612c35565b60405180910390a18060108190555050565b600f5481565b6114ba6115f2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361152a575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016115219190612a86565b60405180910390fd5b6115338161187a565b50565b61153e6115f2565b6064611548610a8b565b6115529190612dac565b811015611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90612eda565b60405180910390fd5b7fa50ecc3f280b8c78f2a044a3ce89997176ffcddaa2920e0626cc093d31299f67600f54826040516115c7929190612c35565b60405180910390a180600f8190555050565b5f33905090565b6115ed838383600161193d565b505050565b6115fa6115d9565b73ffffffffffffffffffffffffffffffffffffffff16611618610e02565b73ffffffffffffffffffffffffffffffffffffffff16146116775761163b6115d9565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161166e9190612a86565b60405180910390fd5b565b5f6116848484611334565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461170557818110156116f6578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016116ed93929190612ef8565b60405180910390fd5b61170484848484035f61193d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361177b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016117729190612a86565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117eb575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016117e29190612a86565b60405180910390fd5b6117f6838383611b0c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361186b575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016118629190612a86565b60405180910390fd5b611876825f83611b0c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036119ad575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016119a49190612a86565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a1d575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611a149190612a86565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611b06578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611afd91906129af565b60405180910390a35b50505050565b60115f9054906101000a900460ff16158015611b75575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611bc85750600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611bdb57611bda8383836001611ef2565b5b5f611be530610c9f565b90505f6012548210159050601160019054906101000a900460ff168015611c095750805b8015611c21575060115f9054906101000a900460ff16155b8015611c74575060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611ccd575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015611d26575060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611daa57600160115f6101000a81548160ff0219169083151502179055505f600e54600d54611d569190612f2d565b600d5484611d649190612f60565b611d6e9190612dac565b9050611d7981611fc9565b5f611d8330610c9f565b9050611d8e81612050565b5f60115f6101000a81548160ff02191690831515021790555050505b5f60115f9054906101000a900460ff16159050600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611e585750600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611e61575f90505b8015611edf575f611e718761212b565b15611e97576064600b5486611e869190612f60565b611e909190612dac565b9050611ec4565b611ea1878761217d565b15611ec3576064600c5486611eb69190612f60565b611ec09190612dac565b90505b5b8085611ed09190612fa1565b9450611edd873083612229565b505b611eea868686612229565b505050505050565b8015611fc357611f018461212b565b8015611f0f57505f600f5414155b15611f5e57600f54821115611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f509061301e565b60405180910390fd5b611fc2565b611f68848461217d565b8015611f7657505f60105414155b15611fc157601054821115611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790613086565b60405180910390fd5b5b5b5b50505050565b5f600282611fd79190612dac565b90505f8183611fe69190612fa1565b90505f479050611ff583612442565b5f81476120029190612fa1565b905061200e8382612674565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051612041939291906130a4565b60405180910390a15050505050565b61205981612442565b5f4790505f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516120a390613106565b5f6040518083038185875af1925050503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b505090508015612126577fe90cef93b59fb17c24184780df92ee75fb5932fe6602fe2c29f92b75945a6ed6838360405161211d929190612c35565b60405180910390a15b505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612221575060075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612279578060025f82825461226d9190612f2d565b92505081905550612347565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612302578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016122f993929190612ef8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361238e578060025f82825403925050819055506123d8565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161243591906129af565b60405180910390a3505050565b5f600267ffffffffffffffff81111561245e5761245d61311a565b5b60405190808252806020026020018201604052801561248c5781602001602082028036833780820191505090505b50905030815f815181106124a3576124a2613147565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612547573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256b9190613188565b8160018151811061257f5761257e613147565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506125e53060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846115e0565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016126479594939291906132a3565b5f604051808303815f87803b15801561265e575f80fd5b505af192505050801561266f575060015b505050565b6126a03060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846115e0565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f8060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612726969594939291906132fb565b60606040518083038185885af19350505050801561276257506040513d601f19601f8201168201806040525081019061275f919061336e565b60015b1561276b575050505b5050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6127b18261276f565b6127bb8185612779565b93506127cb818560208601612789565b6127d481612797565b840191505092915050565b5f6020820190508181035f8301526127f781846127a7565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61282c82612803565b9050919050565b61283c81612822565b8114612846575f80fd5b50565b5f8135905061285781612833565b92915050565b5f819050919050565b61286f8161285d565b8114612879575f80fd5b50565b5f8135905061288a81612866565b92915050565b5f80604083850312156128a6576128a56127ff565b5b5f6128b385828601612849565b92505060206128c48582860161287c565b9150509250929050565b5f8115159050919050565b6128e2816128ce565b82525050565b5f6020820190506128fb5f8301846128d9565b92915050565b5f60208284031215612916576129156127ff565b5b5f6129238482850161287c565b91505092915050565b5f819050919050565b5f61294f61294a61294584612803565b61292c565b612803565b9050919050565b5f61296082612935565b9050919050565b5f61297182612956565b9050919050565b61298181612967565b82525050565b5f60208201905061299a5f830184612978565b92915050565b6129a98161285d565b82525050565b5f6020820190506129c25f8301846129a0565b92915050565b5f805f606084860312156129df576129de6127ff565b5b5f6129ec86828701612849565b93505060206129fd86828701612849565b9250506040612a0e8682870161287c565b9150509250925092565b5f60ff82169050919050565b612a2d81612a18565b82525050565b5f602082019050612a465f830184612a24565b92915050565b5f60208284031215612a6157612a606127ff565b5b5f612a6e84828501612849565b91505092915050565b612a8081612822565b82525050565b5f602082019050612a995f830184612a77565b92915050565b612aa8816128ce565b8114612ab2575f80fd5b50565b5f81359050612ac381612a9f565b92915050565b5f8060408385031215612adf57612ade6127ff565b5b5f612aec85828601612849565b9250506020612afd85828601612ab5565b9150509250929050565b5f60208284031215612b1c57612b1b6127ff565b5b5f612b2984828501612ab5565b91505092915050565b5f8060408385031215612b4857612b476127ff565b5b5f612b5585828601612849565b9250506020612b6685828601612849565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612bb457607f821691505b602082108103612bc757612bc6612b70565b5b50919050565b7f546f74616c2046656520657863656564732033302500000000000000000000005f82015250565b5f612c01601583612779565b9150612c0c82612bcd565b602082019050919050565b5f6020820190508181035f830152612c2e81612bf5565b9050919050565b5f604082019050612c485f8301856129a0565b612c5560208301846129a0565b9392505050565b7f54686520726f7574657220616c726561647920686173207468617420616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612cb6602383612779565b9150612cc182612c5c565b604082019050919050565b5f6020820190508181035f830152612ce381612caa565b9050919050565b7f506169724973416c7265616479476976656e56616c75650000000000000000005f82015250565b5f612d1e601783612779565b9150612d2982612cea565b602082019050919050565b5f6020820190508181035f830152612d4b81612d12565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612db68261285d565b9150612dc18361285d565b925082612dd157612dd0612d52565b5b828204905092915050565b7f6d617853656c6c2043616e6e6f74206265206c657373207468616e203125206f5f8201527f6620746f74616c537570706c7900000000000000000000000000000000000000602082015250565b5f612e36602d83612779565b9150612e4182612ddc565b604082019050919050565b5f6020820190508181035f830152612e6381612e2a565b9050919050565b7f6d61784275792043616e6e6f74206265206c657373207468616e203125206f665f8201527f20746f74616c537570706c790000000000000000000000000000000000000000602082015250565b5f612ec4602c83612779565b9150612ecf82612e6a565b604082019050919050565b5f6020820190508181035f830152612ef181612eb8565b9050919050565b5f606082019050612f0b5f830186612a77565b612f1860208301856129a0565b612f2560408301846129a0565b949350505050565b5f612f378261285d565b9150612f428361285d565b9250828201905080821115612f5a57612f59612d7f565b5b92915050565b5f612f6a8261285d565b9150612f758361285d565b9250828202612f838161285d565b91508282048414831517612f9a57612f99612d7f565b5b5092915050565b5f612fab8261285d565b9150612fb68361285d565b9250828203905081811115612fce57612fcd612d7f565b5b92915050565b7f42757920616d6f756e742065786365656473206c696d697400000000000000005f82015250565b5f613008601883612779565b915061301382612fd4565b602082019050919050565b5f6020820190508181035f83015261303581612ffc565b9050919050565b7f53656c6c20616d6f756e742065786365656473206c696d6974000000000000005f82015250565b5f613070601983612779565b915061307b8261303c565b602082019050919050565b5f6020820190508181035f83015261309d81613064565b9050919050565b5f6060820190506130b75f8301866129a0565b6130c460208301856129a0565b6130d160408301846129a0565b949350505050565b5f81905092915050565b50565b5f6130f15f836130d9565b91506130fc826130e3565b5f82019050919050565b5f613110826130e6565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061318281612833565b92915050565b5f6020828403121561319d5761319c6127ff565b5b5f6131aa84828501613174565b91505092915050565b5f819050919050565b5f6131d66131d16131cc846131b3565b61292c565b61285d565b9050919050565b6131e6816131bc565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61321e81612822565b82525050565b5f61322f8383613215565b60208301905092915050565b5f602082019050919050565b5f613251826131ec565b61325b81856131f6565b935061326683613206565b805f5b8381101561329657815161327d8882613224565b97506132888361323b565b925050600181019050613269565b5085935050505092915050565b5f60a0820190506132b65f8301886129a0565b6132c360208301876131dd565b81810360408301526132d58186613247565b90506132e46060830185612a77565b6132f160808301846129a0565b9695505050505050565b5f60c08201905061330e5f830189612a77565b61331b60208301886129a0565b61332860408301876131dd565b61333560608301866131dd565b6133426080830185612a77565b61334f60a08301846129a0565b979650505050505050565b5f8151905061336881612866565b92915050565b5f805f60608486031215613385576133846127ff565b5b5f6133928682870161335a565b93505060206133a38682870161335a565b92505060406133b48682870161335a565b915050925092509256fea2646970667358221220f7bc428e8a231ef13ffd0310fbed75522f13ab53403ed1be2eb7487bdd345fad64736f6c63430008190033

Deployed Bytecode Sourcemap

35101:13243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16511:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18804:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40545:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35161:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17613:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35530:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19572:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17464:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26436:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35772:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35408:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38530:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41158:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17775:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10124:103;;;;;;;;;;;;;:::i;:::-;;35275:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26854:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39781:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9449:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16721:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35351:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35653:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39006:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18098:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42441:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35209:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39448:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35486:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42727:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40208:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35446:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40847:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35312:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18343:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35819:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41435:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42064:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35575:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10382:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41713:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16511:91;16556:13;16589:5;16582:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16511:91;:::o;18804:190::-;18877:4;18894:13;18910:12;:10;:12::i;:::-;18894:28;;18933:31;18942:5;18949:7;18958:5;18933:8;:31::i;:::-;18982:4;18975:11;;;18804:190;;;;:::o;40545:189::-;9335:13;:11;:13::i;:::-;40634:2:::1;40627:3;:9;;40619:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;40678:25;40691:6;;40699:3;40678:25;;;;;;;:::i;:::-;;;;;;;;40723:3;40714:6;:12;;;;40545:189:::0;:::o;35161:41::-;;;;;;;;;;;;;:::o;17613:99::-;17665:7;17692:12;;17685:19;;17613:99;:::o;35530:32::-;;;;:::o;19572:249::-;19659:4;19676:15;19694:12;:10;:12::i;:::-;19676:30;;19717:37;19733:4;19739:7;19748:5;19717:15;:37::i;:::-;19765:26;19775:4;19781:2;19785:5;19765:9;:26::i;:::-;19809:4;19802:11;;;19572:249;;;;;:::o;17464:84::-;17513:5;17538:2;17531:9;;17464:84;:::o;26436:89::-;26491:26;26497:12;:10;:12::i;:::-;26511:5;26491;:26::i;:::-;26436:89;:::o;35772:40::-;;;;;;;;;;;;;:::o;35408:25::-;;;;:::o;38530:307::-;9335:13;:11;:13::i;:::-;38639:15:::1;;;;;;;;;;;38617:38;;:10;:38;;::::0;38609:86:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38753:15;;;;;;;;;;;38711:59;;38733:10;38711:59;;;;;;;;;;;;38818:10;38781:15;;:48;;;;;;;;;;;;;;;;;;38530:307:::0;:::o;41158:159::-;9335:13;:11;:13::i;:::-;41243:37:::1;41262:12;;41276:3;41243:37;;;;;;;:::i;:::-;;;;;;;;41306:3;41291:12;:18;;;;41158:159:::0;:::o;17775:118::-;17840:7;17867:9;:18;17877:7;17867:18;;;;;;;;;;;;;;;;17860:25;;17775:118;;;:::o;10124:103::-;9335:13;:11;:13::i;:::-;10189:30:::1;10216:1;10189:18;:30::i;:::-;10124:103::o:0;35275:30::-;;;;;;;;;;;;;:::o;26854:161::-;26930:45;26946:7;26955:12;:10;:12::i;:::-;26969:5;26930:15;:45::i;:::-;26986:21;26992:7;27001:5;26986;:21::i;:::-;26854:161;;:::o;39781:199::-;9335:13;:11;:13::i;:::-;39922:10:::1;39883:50;;39905:15;;;;;;;;;;;39883:50;;;;;;;;;;;;39962:10;39944:15;;:28;;;;;;;;;;;;;;;;;;39781:199:::0;:::o;9449:87::-;9495:7;9522:6;;;;;;;;;;;9515:13;;9449:87;:::o;16721:95::-;16768:13;16801:7;16794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16721:95;:::o;35351:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;35653:57::-;;;;:::o;39006:308::-;9335:13;:11;:13::i;:::-;39167:5:::1;39132:40;;:25;:31;39158:4;39132:31;;;;;;;;;;;;;;;;;;;;;;;;;:40;;::::0;39124:76:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39245:5;39211:25;:31;39237:4;39211:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;39294:4;39266:40;;;39300:5;39266:40;;;;;;:::i;:::-;;;;;;;;39006:308:::0;;:::o;18098:182::-;18167:4;18184:13;18200:12;:10;:12::i;:::-;18184:28;;18223:27;18233:5;18240:2;18244:5;18223:9;:27::i;:::-;18268:4;18261:11;;;18098:182;;;;:::o;42441:161::-;9335:13;:11;:13::i;:::-;42541:5:::1;42520:18;:26;;;;42562:32;42588:5;42562:32;;;;;;:::i;:::-;;;;;;;;42441:161:::0;:::o;35209:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;39448:199::-;9335:13;:11;:13::i;:::-;39589:10:::1;39550:50;;39572:15;;;;;;;;;;;39550:50;;;;;;;;;;;;39629:10;39611:15;;:28;;;;;;;;;;;;;;;;;;39448:199:::0;:::o;35486:31::-;;;;:::o;42727:171::-;9335:13;:11;:13::i;:::-;42828:8:::1;42804:21;;:32;;;;;;;;;;;;;;;;;;42852:38;42881:8;42852:38;;;;;;:::i;:::-;;;;;;;;42727:171:::0;:::o;40208:225::-;9335:13;:11;:13::i;:::-;40352:17:::1;40326:16;:23;40343:5;40326:23;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;40400:5;40385:40;;;40407:17;40385:40;;;;;;:::i;:::-;;;;;;;;40208:225:::0;;:::o;35446:27::-;;;;:::o;40847:193::-;9335:13;:11;:13::i;:::-;40937:2:::1;40930:3;:9;;40922:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;40981:27;40995:7;;41004:3;40981:27;;;;;;;:::i;:::-;;;;;;;;41029:3;41019:7;:13;;;;40847:193:::0;:::o;35312:30::-;;;;;;;;;;;;;:::o;18343:142::-;18423:7;18450:11;:18;18462:5;18450:18;;;;;;;;;;;;;;;:27;18469:7;18450:27;;;;;;;;;;;;;;;;18443:34;;18343:142;;;;:::o;35819:62::-;;;;:::o;41435:159::-;9335:13;:11;:13::i;:::-;41520:37:::1;41539:12;;41553:3;41520:37;;;;;;;:::i;:::-;;;;;;;;41583:3;41568:12;:18;;;;41435:159:::0;:::o;42064:236::-;9335:13;:11;:13::i;:::-;42163:3:::1;42147:13;:11;:13::i;:::-;:19;;;;:::i;:::-;42140:3;:26;;42132:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;42232:33;42249:10;;42261:3;42232:33;;;;;;;:::i;:::-;;;;;;;;42289:3;42276:10;:16;;;;42064:236:::0;:::o;35575:54::-;;;;:::o;10382:220::-;9335:13;:11;:13::i;:::-;10487:1:::1;10467:22;;:8;:22;;::::0;10463:93:::1;;10541:1;10513:31;;;;;;;;;;;:::i;:::-;;;;;;;;10463:93;10566:28;10585:8;10566:18;:28::i;:::-;10382:220:::0;:::o;41713:231::-;9335:13;:11;:13::i;:::-;41811:3:::1;41795:13;:11;:13::i;:::-;:19;;;;:::i;:::-;41788:3;:26;;41780:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41879:31;41895:9;;41906:3;41879:31;;;;;;;:::i;:::-;;;;;;;;41933:3;41921:9;:15;;;;41713:231:::0;:::o;7458:98::-;7511:7;7538:10;7531:17;;7458:98;:::o;23631:130::-;23716:37;23725:5;23732:7;23741:5;23748:4;23716:8;:37::i;:::-;23631:130;;;:::o;9614:166::-;9685:12;:10;:12::i;:::-;9674:23;;:7;:5;:7::i;:::-;:23;;;9670:103;;9748:12;:10;:12::i;:::-;9721:40;;;;;;;;;;;:::i;:::-;;;;;;;;9670:103;9614:166::o;25347:487::-;25447:24;25474:25;25484:5;25491:7;25474:9;:25::i;:::-;25447:52;;25534:17;25514:16;:37;25510:317;;25591:5;25572:16;:24;25568:132;;;25651:7;25660:16;25678:5;25624:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;25568:132;25743:57;25752:5;25759:7;25787:5;25768:16;:24;25794:5;25743:8;:57::i;:::-;25510:317;25436:398;25347:487;;;:::o;20206:308::-;20306:1;20290:18;;:4;:18;;;20286:88;;20359:1;20332:30;;;;;;;;;;;:::i;:::-;;;;;;;;20286:88;20402:1;20388:16;;:2;:16;;;20384:88;;20457:1;20428:32;;;;;;;;;;;:::i;:::-;;;;;;;;20384:88;20482:24;20490:4;20496:2;20500:5;20482:7;:24::i;:::-;20206:308;;;:::o;22867:211::-;22957:1;22938:21;;:7;:21;;;22934:91;;23010:1;22983:30;;;;;;;;;;;:::i;:::-;;;;;;;;22934:91;23035:35;23043:7;23060:1;23064:5;23035:7;:35::i;:::-;22867:211;;:::o;10762:191::-;10836:16;10855:6;;;;;;;;;;;10836:25;;10881:8;10872:6;;:17;;;;;;;;;;;;;;;;;;10936:8;10905:40;;10926:8;10905:40;;;;;;;;;;;;10825:128;10762:191;:::o;24612:443::-;24742:1;24725:19;;:5;:19;;;24721:91;;24797:1;24768:32;;;;;;;;;;;:::i;:::-;;;;;;;;24721:91;24845:1;24826:21;;:7;:21;;;24822:92;;24899:1;24871:31;;;;;;;;;;;:::i;:::-;;;;;;;;24822:92;24954:5;24924:11;:18;24936:5;24924:18;;;;;;;;;;;;;;;:27;24943:7;24924:27;;;;;;;;;;;;;;;:35;;;;24974:9;24970:78;;;25021:7;25005:31;;25014:5;25005:31;;;25030:5;25005:31;;;;;;:::i;:::-;;;;;;;;24970:78;24612:443;;;;:::o;43072:1745::-;43205:8;;;;;;;;;;;43204:9;:55;;;;;43243:15;;;;;;;;;;;43227:32;;:4;:32;;;;43204:55;:157;;;;;43341:16;:20;43358:2;43341:20;;;;;;;;;;;;;;;;;;;;;;;;;43340:21;43204:157;43189:289;;;43426:40;43444:4;43450:2;43454:5;43461:4;43426:17;:40::i;:::-;43189:289;43490:28;43521:24;43539:4;43521:9;:24::i;:::-;43490:55;;43556:12;43595:18;;43571:20;:42;;43556:57;;43643:21;;;;;;;;;;;:45;;;;;43681:7;43643:45;:71;;;;;43706:8;;;;;;;;;;;43705:9;43643:71;:120;;;;;43732:25;:31;43758:4;43732:31;;;;;;;;;;;;;;;;;;;;;;;;;43731:32;43643:120;:160;;;;;43788:15;;;;;;;;;;;43780:23;;:4;:23;;;;43643:160;:198;;;;;43826:15;;;;;;;;;;;43820:21;;:2;:21;;;;43643:198;43626:561;;;43879:4;43868:8;;:15;;;;;;;;;;;;;;;;;;43900:18;43977:12;;43962;;:27;;;;:::i;:::-;43945:12;;43922:20;:35;;;;:::i;:::-;43921:69;;;;:::i;:::-;43900:90;;44005:26;44020:10;44005:14;:26::i;:::-;44048:18;44069:24;44087:4;44069:9;:24::i;:::-;44048:45;;44108:34;44131:10;44108:22;:34::i;:::-;44170:5;44159:8;;:16;;;;;;;;;;;;;;;;;;43853:334;;43626:561;44199:12;44215:8;;;;;;;;;;;44214:9;44199:24;;44322:16;:22;44339:4;44322:22;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;44348:16;:20;44365:2;44348:20;;;;;;;;;;;;;;;;;;;;;;;;;44322:46;44319:93;;;44395:5;44385:15;;44319:93;44427:7;44424:343;;;44451:12;44483;44490:4;44483:6;:12::i;:::-;44480:185;;;44541:3;44531:6;;44523:5;:14;;;;:::i;:::-;44522:22;;;;:::i;:::-;44515:29;;44480:185;;;44582:17;44590:4;44596:2;44582:7;:17::i;:::-;44579:86;;;44646:3;44635:7;;44627:5;:15;;;;:::i;:::-;44626:23;;;;:::i;:::-;44619:30;;44579:86;44480:185;44694:4;44686:5;:12;;;;:::i;:::-;44678:20;;44715:40;44729:4;44743;44750;44715:13;:40::i;:::-;44436:331;44424:343;44779:30;44793:4;44799:2;44803:5;44779:13;:30::i;:::-;43178:1639;;;43072:1745;;;:::o;47808:533::-;48020:7;48016:318;;;48048:14;48055:6;48048;:14::i;:::-;:32;;;;;48079:1;48066:9;;:14;;48048:32;48044:279;;;48119:9;;48109:6;:19;;48101:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48044:279;;;48183:26;48191:6;48199:9;48183:7;:26::i;:::-;:45;;;;;48227:1;48213:10;;:15;;48183:45;48179:144;;;48267:10;;48257:6;:20;;48249:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48179:144;48044:279;48016:318;47808:533;;;;:::o;45317:964::-;45441:12;45479:1;45456:20;:24;;;;:::i;:::-;45441:39;;45491:17;45534:4;45511:20;:27;;;;:::i;:::-;45491:47;;45816:22;45841:21;45816:46;;45907:22;45924:4;45907:16;:22::i;:::-;46060:18;46105:14;46081:21;:38;;;;:::i;:::-;46060:59;;46169:35;46182:9;46193:10;46169:12;:35::i;:::-;46230:43;46245:4;46251:10;46263:9;46230:43;;;;;;;;:::i;:::-;;;;;;;;45379:902;;;;45317:964;:::o;47471:329::-;47538:24;47555:6;47538:16;:24::i;:::-;47573:19;47595:21;47573:43;;47628:12;47653:15;;;;;;;;;;;47645:29;;47682:11;47645:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47627:71;;;47714:7;47711:82;;;47738:43;47761:6;47769:11;47738:43;;;;;;;:::i;:::-;;;;;;;;47711:82;47527:273;;47471:329;:::o;45144:165::-;45199:4;45268:25;:33;45294:6;45268:33;;;;;;;;;;;;;;;;;;;;;;;;;45261:40;;45144:165;;;:::o;44887:249::-;44962:4;45072:15;;;;;;;;;;;45054:34;;:6;:34;;;;:74;;;;;45092:25;:36;45118:9;45092:36;;;;;;;;;;;;;;;;;;;;;;;;;45054:74;45047:81;;44887:249;;;;:::o;20838:1135::-;20944:1;20928:18;;:4;:18;;;20924:552;;21082:5;21066:12;;:21;;;;;;;:::i;:::-;;;;;;;;20924:552;;;21120:19;21142:9;:15;21152:4;21142:15;;;;;;;;;;;;;;;;21120:37;;21190:5;21176:11;:19;21172:117;;;21248:4;21254:11;21267:5;21223:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;21172:117;21444:5;21430:11;:19;21412:9;:15;21422:4;21412:15;;;;;;;;;;;;;;;:37;;;;21105:371;20924:552;21506:1;21492:16;;:2;:16;;;21488:435;;21674:5;21658:12;;:21;;;;;;;;;;;21488:435;;;21891:5;21874:9;:13;21884:2;21874:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;21488:435;21955:2;21940:25;;21949:4;21940:25;;;21959:5;21940:25;;;;;;:::i;:::-;;;;;;;;20838:1135;;;:::o;46289:621::-;46415:21;46453:1;46439:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46415:40;;46484:4;46466;46471:1;46466:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;46510:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46500:4;46505:1;46500:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;46545:62;46562:4;46577:15;;;;;;;;;;;46595:11;46545:8;:62::i;:::-;46659:15;;;;;;;;;;;:66;;;46740:11;46766:1;46810:4;46837;46857:15;46659:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46646:257;46344:566;46289:621;:::o;46918:545::-;47066:62;47083:4;47098:15;;;;;;;;;;;47116:11;47066:8;:62::i;:::-;47184:15;;;;;;;;;;;:31;;;47223:9;47256:4;47276:11;47302:1;47345;47388:15;;;;;;;;;;;47418;47184:260;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47171:285;;;;;;;46918:545;;:::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:329::-;3398:6;3447:2;3435:9;3426:7;3422:23;3418:32;3415:119;;;3453:79;;:::i;:::-;3415:119;3573:1;3598:53;3643:7;3634:6;3623:9;3619:22;3598:53;:::i;:::-;3588:63;;3544:117;3339:329;;;;:::o;3674:60::-;3702:3;3723:5;3716:12;;3674:60;;;:::o;3740:142::-;3790:9;3823:53;3841:34;3850:24;3868:5;3850:24;:::i;:::-;3841:34;:::i;:::-;3823:53;:::i;:::-;3810:66;;3740:142;;;:::o;3888:126::-;3938:9;3971:37;4002:5;3971:37;:::i;:::-;3958:50;;3888:126;;;:::o;4020:153::-;4097:9;4130:37;4161:5;4130:37;:::i;:::-;4117:50;;4020:153;;;:::o;4179:185::-;4293:64;4351:5;4293:64;:::i;:::-;4288:3;4281:77;4179:185;;:::o;4370:276::-;4490:4;4528:2;4517:9;4513:18;4505:26;;4541:98;4636:1;4625:9;4621:17;4612:6;4541:98;:::i;:::-;4370:276;;;;:::o;4652:118::-;4739:24;4757:5;4739:24;:::i;:::-;4734:3;4727:37;4652:118;;:::o;4776:222::-;4869:4;4907:2;4896:9;4892:18;4884:26;;4920:71;4988:1;4977:9;4973:17;4964:6;4920:71;:::i;:::-;4776:222;;;;:::o;5004:619::-;5081:6;5089;5097;5146:2;5134:9;5125:7;5121:23;5117:32;5114:119;;;5152:79;;:::i;:::-;5114:119;5272:1;5297:53;5342:7;5333:6;5322:9;5318:22;5297:53;:::i;:::-;5287:63;;5243:117;5399:2;5425:53;5470:7;5461:6;5450:9;5446:22;5425:53;:::i;:::-;5415:63;;5370:118;5527:2;5553:53;5598:7;5589:6;5578:9;5574:22;5553:53;:::i;:::-;5543:63;;5498:118;5004:619;;;;;:::o;5629:86::-;5664:7;5704:4;5697:5;5693:16;5682:27;;5629:86;;;:::o;5721:112::-;5804:22;5820:5;5804:22;:::i;:::-;5799:3;5792:35;5721:112;;:::o;5839:214::-;5928:4;5966:2;5955:9;5951:18;5943:26;;5979:67;6043:1;6032:9;6028:17;6019:6;5979:67;:::i;:::-;5839:214;;;;:::o;6059:329::-;6118:6;6167:2;6155:9;6146:7;6142:23;6138:32;6135:119;;;6173:79;;:::i;:::-;6135:119;6293:1;6318:53;6363:7;6354:6;6343:9;6339:22;6318:53;:::i;:::-;6308:63;;6264:117;6059:329;;;;:::o;6394:118::-;6481:24;6499:5;6481:24;:::i;:::-;6476:3;6469:37;6394:118;;:::o;6518:222::-;6611:4;6649:2;6638:9;6634:18;6626:26;;6662:71;6730:1;6719:9;6715:17;6706:6;6662:71;:::i;:::-;6518:222;;;;:::o;6746:116::-;6816:21;6831:5;6816:21;:::i;:::-;6809:5;6806:32;6796:60;;6852:1;6849;6842:12;6796:60;6746:116;:::o;6868:133::-;6911:5;6949:6;6936:20;6927:29;;6965:30;6989:5;6965:30;:::i;:::-;6868:133;;;;:::o;7007:468::-;7072:6;7080;7129:2;7117:9;7108:7;7104:23;7100:32;7097:119;;;7135:79;;:::i;:::-;7097:119;7255:1;7280:53;7325:7;7316:6;7305:9;7301:22;7280:53;:::i;:::-;7270:63;;7226:117;7382:2;7408:50;7450:7;7441:6;7430:9;7426:22;7408:50;:::i;:::-;7398:60;;7353:115;7007:468;;;;;:::o;7481:323::-;7537:6;7586:2;7574:9;7565:7;7561:23;7557:32;7554:119;;;7592:79;;:::i;:::-;7554:119;7712:1;7737:50;7779:7;7770:6;7759:9;7755:22;7737:50;:::i;:::-;7727:60;;7683:114;7481:323;;;;:::o;7810:474::-;7878:6;7886;7935:2;7923:9;7914:7;7910:23;7906:32;7903:119;;;7941:79;;:::i;:::-;7903:119;8061:1;8086:53;8131:7;8122:6;8111:9;8107:22;8086:53;:::i;:::-;8076:63;;8032:117;8188:2;8214:53;8259:7;8250:6;8239:9;8235:22;8214:53;:::i;:::-;8204:63;;8159:118;7810:474;;;;;:::o;8290:180::-;8338:77;8335:1;8328:88;8435:4;8432:1;8425:15;8459:4;8456:1;8449:15;8476:320;8520:6;8557:1;8551:4;8547:12;8537:22;;8604:1;8598:4;8594:12;8625:18;8615:81;;8681:4;8673:6;8669:17;8659:27;;8615:81;8743:2;8735:6;8732:14;8712:18;8709:38;8706:84;;8762:18;;:::i;:::-;8706:84;8527:269;8476:320;;;:::o;8802:171::-;8942:23;8938:1;8930:6;8926:14;8919:47;8802:171;:::o;8979:366::-;9121:3;9142:67;9206:2;9201:3;9142:67;:::i;:::-;9135:74;;9218:93;9307:3;9218:93;:::i;:::-;9336:2;9331:3;9327:12;9320:19;;8979:366;;;:::o;9351:419::-;9517:4;9555:2;9544:9;9540:18;9532:26;;9604:9;9598:4;9594:20;9590:1;9579:9;9575:17;9568:47;9632:131;9758:4;9632:131;:::i;:::-;9624:139;;9351:419;;;:::o;9776:332::-;9897:4;9935:2;9924:9;9920:18;9912:26;;9948:71;10016:1;10005:9;10001:17;9992:6;9948:71;:::i;:::-;10029:72;10097:2;10086:9;10082:18;10073:6;10029:72;:::i;:::-;9776:332;;;;;:::o;10114:222::-;10254:34;10250:1;10242:6;10238:14;10231:58;10323:5;10318:2;10310:6;10306:15;10299:30;10114:222;:::o;10342:366::-;10484:3;10505:67;10569:2;10564:3;10505:67;:::i;:::-;10498:74;;10581:93;10670:3;10581:93;:::i;:::-;10699:2;10694:3;10690:12;10683:19;;10342:366;;;:::o;10714:419::-;10880:4;10918:2;10907:9;10903:18;10895:26;;10967:9;10961:4;10957:20;10953:1;10942:9;10938:17;10931:47;10995:131;11121:4;10995:131;:::i;:::-;10987:139;;10714:419;;;:::o;11139:173::-;11279:25;11275:1;11267:6;11263:14;11256:49;11139:173;:::o;11318:366::-;11460:3;11481:67;11545:2;11540:3;11481:67;:::i;:::-;11474:74;;11557:93;11646:3;11557:93;:::i;:::-;11675:2;11670:3;11666:12;11659:19;;11318:366;;;:::o;11690:419::-;11856:4;11894:2;11883:9;11879:18;11871:26;;11943:9;11937:4;11933:20;11929:1;11918:9;11914:17;11907:47;11971:131;12097:4;11971:131;:::i;:::-;11963:139;;11690:419;;;:::o;12115:180::-;12163:77;12160:1;12153:88;12260:4;12257:1;12250:15;12284:4;12281:1;12274:15;12301:180;12349:77;12346:1;12339:88;12446:4;12443:1;12436:15;12470:4;12467:1;12460:15;12487:185;12527:1;12544:20;12562:1;12544:20;:::i;:::-;12539:25;;12578:20;12596:1;12578:20;:::i;:::-;12573:25;;12617:1;12607:35;;12622:18;;:::i;:::-;12607:35;12664:1;12661;12657:9;12652:14;;12487:185;;;;:::o;12678:232::-;12818:34;12814:1;12806:6;12802:14;12795:58;12887:15;12882:2;12874:6;12870:15;12863:40;12678:232;:::o;12916:366::-;13058:3;13079:67;13143:2;13138:3;13079:67;:::i;:::-;13072:74;;13155:93;13244:3;13155:93;:::i;:::-;13273:2;13268:3;13264:12;13257:19;;12916:366;;;:::o;13288:419::-;13454:4;13492:2;13481:9;13477:18;13469:26;;13541:9;13535:4;13531:20;13527:1;13516:9;13512:17;13505:47;13569:131;13695:4;13569:131;:::i;:::-;13561:139;;13288:419;;;:::o;13713:231::-;13853:34;13849:1;13841:6;13837:14;13830:58;13922:14;13917:2;13909:6;13905:15;13898:39;13713:231;:::o;13950:366::-;14092:3;14113:67;14177:2;14172:3;14113:67;:::i;:::-;14106:74;;14189:93;14278:3;14189:93;:::i;:::-;14307:2;14302:3;14298:12;14291:19;;13950:366;;;:::o;14322:419::-;14488:4;14526:2;14515:9;14511:18;14503:26;;14575:9;14569:4;14565:20;14561:1;14550:9;14546:17;14539:47;14603:131;14729:4;14603:131;:::i;:::-;14595:139;;14322:419;;;:::o;14747:442::-;14896:4;14934:2;14923:9;14919:18;14911:26;;14947:71;15015:1;15004:9;15000:17;14991:6;14947:71;:::i;:::-;15028:72;15096:2;15085:9;15081:18;15072:6;15028:72;:::i;:::-;15110;15178:2;15167:9;15163:18;15154:6;15110:72;:::i;:::-;14747:442;;;;;;:::o;15195:191::-;15235:3;15254:20;15272:1;15254:20;:::i;:::-;15249:25;;15288:20;15306:1;15288:20;:::i;:::-;15283:25;;15331:1;15328;15324:9;15317:16;;15352:3;15349:1;15346:10;15343:36;;;15359:18;;:::i;:::-;15343:36;15195:191;;;;:::o;15392:410::-;15432:7;15455:20;15473:1;15455:20;:::i;:::-;15450:25;;15489:20;15507:1;15489:20;:::i;:::-;15484:25;;15544:1;15541;15537:9;15566:30;15584:11;15566:30;:::i;:::-;15555:41;;15745:1;15736:7;15732:15;15729:1;15726:22;15706:1;15699:9;15679:83;15656:139;;15775:18;;:::i;:::-;15656:139;15440:362;15392:410;;;;:::o;15808:194::-;15848:4;15868:20;15886:1;15868:20;:::i;:::-;15863:25;;15902:20;15920:1;15902:20;:::i;:::-;15897:25;;15946:1;15943;15939:9;15931:17;;15970:1;15964:4;15961:11;15958:37;;;15975:18;;:::i;:::-;15958:37;15808:194;;;;:::o;16008:174::-;16148:26;16144:1;16136:6;16132:14;16125:50;16008:174;:::o;16188:366::-;16330:3;16351:67;16415:2;16410:3;16351:67;:::i;:::-;16344:74;;16427:93;16516:3;16427:93;:::i;:::-;16545:2;16540:3;16536:12;16529:19;;16188:366;;;:::o;16560:419::-;16726:4;16764:2;16753:9;16749:18;16741:26;;16813:9;16807:4;16803:20;16799:1;16788:9;16784:17;16777:47;16841:131;16967:4;16841:131;:::i;:::-;16833:139;;16560:419;;;:::o;16985:175::-;17125:27;17121:1;17113:6;17109:14;17102:51;16985:175;:::o;17166:366::-;17308:3;17329:67;17393:2;17388:3;17329:67;:::i;:::-;17322:74;;17405:93;17494:3;17405:93;:::i;:::-;17523:2;17518:3;17514:12;17507:19;;17166:366;;;:::o;17538:419::-;17704:4;17742:2;17731:9;17727:18;17719:26;;17791:9;17785:4;17781:20;17777:1;17766:9;17762:17;17755:47;17819:131;17945:4;17819:131;:::i;:::-;17811:139;;17538:419;;;:::o;17963:442::-;18112:4;18150:2;18139:9;18135:18;18127:26;;18163:71;18231:1;18220:9;18216:17;18207:6;18163:71;:::i;:::-;18244:72;18312:2;18301:9;18297:18;18288:6;18244:72;:::i;:::-;18326;18394:2;18383:9;18379:18;18370:6;18326:72;:::i;:::-;17963:442;;;;;;:::o;18411:147::-;18512:11;18549:3;18534:18;;18411:147;;;;:::o;18564:114::-;;:::o;18684:398::-;18843:3;18864:83;18945:1;18940:3;18864:83;:::i;:::-;18857:90;;18956:93;19045:3;18956:93;:::i;:::-;19074:1;19069:3;19065:11;19058:18;;18684:398;;;:::o;19088:379::-;19272:3;19294:147;19437:3;19294:147;:::i;:::-;19287:154;;19458:3;19451:10;;19088:379;;;:::o;19473:180::-;19521:77;19518:1;19511:88;19618:4;19615:1;19608:15;19642:4;19639:1;19632:15;19659:180;19707:77;19704:1;19697:88;19804:4;19801:1;19794:15;19828:4;19825:1;19818:15;19845:143;19902:5;19933:6;19927:13;19918:22;;19949:33;19976:5;19949:33;:::i;:::-;19845:143;;;;:::o;19994:351::-;20064:6;20113:2;20101:9;20092:7;20088:23;20084:32;20081:119;;;20119:79;;:::i;:::-;20081:119;20239:1;20264:64;20320:7;20311:6;20300:9;20296:22;20264:64;:::i;:::-;20254:74;;20210:128;19994:351;;;;:::o;20351:85::-;20396:7;20425:5;20414:16;;20351:85;;;:::o;20442:158::-;20500:9;20533:61;20551:42;20560:32;20586:5;20560:32;:::i;:::-;20551:42;:::i;:::-;20533:61;:::i;:::-;20520:74;;20442:158;;;:::o;20606:147::-;20701:45;20740:5;20701:45;:::i;:::-;20696:3;20689:58;20606:147;;:::o;20759:114::-;20826:6;20860:5;20854:12;20844:22;;20759:114;;;:::o;20879:184::-;20978:11;21012:6;21007:3;21000:19;21052:4;21047:3;21043:14;21028:29;;20879:184;;;;:::o;21069:132::-;21136:4;21159:3;21151:11;;21189:4;21184:3;21180:14;21172:22;;21069:132;;;:::o;21207:108::-;21284:24;21302:5;21284:24;:::i;:::-;21279:3;21272:37;21207:108;;:::o;21321:179::-;21390:10;21411:46;21453:3;21445:6;21411:46;:::i;:::-;21489:4;21484:3;21480:14;21466:28;;21321:179;;;;:::o;21506:113::-;21576:4;21608;21603:3;21599:14;21591:22;;21506:113;;;:::o;21655:732::-;21774:3;21803:54;21851:5;21803:54;:::i;:::-;21873:86;21952:6;21947:3;21873:86;:::i;:::-;21866:93;;21983:56;22033:5;21983:56;:::i;:::-;22062:7;22093:1;22078:284;22103:6;22100:1;22097:13;22078:284;;;22179:6;22173:13;22206:63;22265:3;22250:13;22206:63;:::i;:::-;22199:70;;22292:60;22345:6;22292:60;:::i;:::-;22282:70;;22138:224;22125:1;22122;22118:9;22113:14;;22078:284;;;22082:14;22378:3;22371:10;;21779:608;;;21655:732;;;;:::o;22393:831::-;22656:4;22694:3;22683:9;22679:19;22671:27;;22708:71;22776:1;22765:9;22761:17;22752:6;22708:71;:::i;:::-;22789:80;22865:2;22854:9;22850:18;22841:6;22789:80;:::i;:::-;22916:9;22910:4;22906:20;22901:2;22890:9;22886:18;22879:48;22944:108;23047:4;23038:6;22944:108;:::i;:::-;22936:116;;23062:72;23130:2;23119:9;23115:18;23106:6;23062:72;:::i;:::-;23144:73;23212:3;23201:9;23197:19;23188:6;23144:73;:::i;:::-;22393:831;;;;;;;;:::o;23230:807::-;23479:4;23517:3;23506:9;23502:19;23494:27;;23531:71;23599:1;23588:9;23584:17;23575:6;23531:71;:::i;:::-;23612:72;23680:2;23669:9;23665:18;23656:6;23612:72;:::i;:::-;23694:80;23770:2;23759:9;23755:18;23746:6;23694:80;:::i;:::-;23784;23860:2;23849:9;23845:18;23836:6;23784:80;:::i;:::-;23874:73;23942:3;23931:9;23927:19;23918:6;23874:73;:::i;:::-;23957;24025:3;24014:9;24010:19;24001:6;23957:73;:::i;:::-;23230:807;;;;;;;;;:::o;24043:143::-;24100:5;24131:6;24125:13;24116:22;;24147:33;24174:5;24147:33;:::i;:::-;24043:143;;;;:::o;24192:663::-;24280:6;24288;24296;24345:2;24333:9;24324:7;24320:23;24316:32;24313:119;;;24351:79;;:::i;:::-;24313:119;24471:1;24496:64;24552:7;24543:6;24532:9;24528:22;24496:64;:::i;:::-;24486:74;;24442:128;24609:2;24635:64;24691:7;24682:6;24671:9;24667:22;24635:64;:::i;:::-;24625:74;;24580:129;24748:2;24774:64;24830:7;24821:6;24810:9;24806:22;24774:64;:::i;:::-;24764:74;;24719:129;24192:663;;;;;:::o

Swarm Source

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