ETH Price: $1,929.15 (-2.21%)
 

Overview

Max Total Supply

1,000,000,000 ZODIA

Holders

191

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Token

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT

// Enter the realm of Zodia
// https://www.zodia.world/

pragma solidity ^0.8.28;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";

contract Token is ERC20, Ownable {
    uint256 public immutable MAX_SUPPLY;
    address public immutable pair;
    address public treasury;

    IUniswapV2Router02 private constant _router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    address private immutable _weth;
    address private immutable _deployer;

    uint256 public startBlock;
    uint256 public startBlockTime;

    mapping(address account => bool) public isExcludedFromFees;
    mapping(address account => bool) public isExcludedFromMaxWallet;
    mapping(uint256 blockNumber => uint256 txCount) public maxBuyTxsPerBlock;
    mapping(uint256 blockNumber => uint256 supplyPerBlock)
        public supplyPerBlock;

    constructor(
        string memory name,
        string memory symbol,
        uint256 maxSupply,
        address _treasury
    ) ERC20(name, symbol) Ownable(msg.sender) {
        MAX_SUPPLY = maxSupply;
        _weth = _router.WETH();

        pair = IUniswapV2Factory(_router.factory()).createPair(
            address(this),
            _weth
        );

        isExcludedFromFees[msg.sender] = true;
        isExcludedFromFees[address(this)] = true;
        isExcludedFromFees[pair] = true;
        isExcludedFromFees[treasury] = true;
        isExcludedFromMaxWallet[msg.sender] = true;
        isExcludedFromMaxWallet[address(this)] = true;
        isExcludedFromMaxWallet[pair] = true;
        isExcludedFromMaxWallet[treasury] = true;

        _mint(msg.sender, maxSupply);
        _approve(msg.sender, address(_router), type(uint256).max);

        treasury = _treasury;
        _deployer = msg.sender;
        _approve(address(this), address(_router), type(uint256).max);
    }

    function setTreasury(address newTreasury) external {
        require(newTreasury != address(0), "treasury-is-0");
        require(
            msg.sender == _deployer || msg.sender == owner(),
            "only-deployer"
        );
        treasury = newTreasury;
    }

    function enableTrading() external onlyOwner {
        require(startBlock == 0, "trading-already-enabled");
        startBlock = block.number;
        startBlockTime = block.timestamp;
    }

    function setExcludedFromFees(
        address account,
        bool excluded
    ) external onlyOwner {
        isExcludedFromFees[account] = excluded;
    }

    function setExcludedFromMaxWallet(
        address account,
        bool excluded
    ) external onlyOwner {
        isExcludedFromMaxWallet[account] = excluded;
    }

    function feesAndMaxWallet()
        external
        view
        returns (uint256 _feeBps, uint256 _maxWallet)
    {
        return _feesAndMaxWallet();
    }

    function _feesAndMaxWallet()
        internal
        view
        returns (uint256 _feeBps, uint256 _maxWallet)
    {
        if (block.number - startBlock < 1) {
            return (0, MAX_SUPPLY / 200);
        }
        uint256 _diffSeconds = block.timestamp - startBlockTime;

        if (_diffSeconds < 3600) {
            _maxWallet = MAX_SUPPLY / 200; // 0.5%
            // 1 min
            if (_diffSeconds < 60) {
                _feeBps = 4000; // 40%
                return (_feeBps, _maxWallet);
            }
            // 2-5 min
            if (_diffSeconds < 300) {
                _feeBps = 3000; // 30%
                return (_feeBps, _maxWallet);
            }
            // 6-8 min
            if (_diffSeconds < 480) {
                _feeBps = 2000; // 20%
                return (_feeBps, _maxWallet);
            }

            if (_diffSeconds < 900) {
                // 9-15 min
                _feeBps = 1000; // 10%
                return (_feeBps, _maxWallet);
            }

            _feeBps = 500;
        }

        uint256 day = _diffSeconds / 86400;
        _feeBps = (day * 100) > 500 ? 0 : 500 - (day * 100);
        _maxWallet = MAX_SUPPLY;
        return (_feeBps, _maxWallet);
    }

    function _update(
        address from,
        address to,
        uint256 value
    ) internal override {
        (uint256 _feeBps, uint256 _maxWallet) = _feesAndMaxWallet();

        bool isBuy = from == pair;
        if (isBuy || to == pair) {
            require(
                startBlock > 0 || isExcludedFromFees[to],
                "trading-not-enabled"
            );

            if (isBuy && block.number - startBlock < 1) {
                require(
                    maxBuyTxsPerBlock[block.number] <= 50,
                    "max-buy-txs-per-block-exceeded"
                );
                maxBuyTxsPerBlock[block.number]++;
            }

            if (_feeBps != 0) {
                if (isBuy && !isExcludedFromFees[to]) {
                    uint256 fee = (value * _feeBps) / 10000;
                    value -= fee;
                    super._update(from, address(this), fee);
                }

                if (!isBuy && !isExcludedFromFees[from]) {
                    uint256 fee = (value * _feeBps) / 10000;
                    value -= fee;
                    super._update(from, address(this), fee);
                    _swapTokensForEth();
                }
            } else {
                if (!isBuy && !isExcludedFromFees[from]) {
                    _swapTokensForEth();
                }
            }
        }

        require(
            isExcludedFromMaxWallet[to] || value + balanceOf(to) <= _maxWallet,
            "max-wallet-size-exceeded"
        );
        super._update(from, to, value);
    }

    function _swapTokensForEth() internal {
        uint256 startDiff = block.timestamp - startBlockTime;

        if (startDiff < 300) {
            return;
        }
        if (supplyPerBlock[block.number] > MAX_SUPPLY / 200) {
            return;
        }
        uint256 _tokenAmount = balanceOf(address(this));

        if (_tokenAmount == 0) {
            return;
        }

        address[] memory _path = new address[](2);
        _path[0] = _weth;
        _path[1] = address(this);

        // sell max 1 eth worth of tokens
        uint256 _maxTokenAmount = _router.getAmountsOut(1 ether, _path)[1];

        if (_tokenAmount > _maxTokenAmount) {
            _tokenAmount = _maxTokenAmount;
        }

        supplyPerBlock[block.number] += _tokenAmount;

        _path[0] = address(this);
        _path[1] = _weth;

        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            _path,
            treasury,
            block.timestamp
        );
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 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 ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-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 ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @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 ERC-20
 * applications.
 */
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}.
     *
     * Both 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;
    }

    /// @inheritdoc IERC20
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

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

    /// @inheritdoc IERC20
    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}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * 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:
     *
     * ```solidity
     * 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);
            }
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity >=0.6.2;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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);
}

// SPDX-License-Identifier: MIT
// 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;
    }
}

pragma solidity >=0.5.0;

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;
}

pragma solidity >=0.6.2;

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);
}

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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;
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesAndMaxWallet","outputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlock","outputs":[{"internalType":"uint256","name":"txCount","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":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"supplyPerBlock","outputs":[{"internalType":"uint256","name":"supplyPerBlock","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":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

61010060405234801561001157600080fd5b50604051614b2c380380614b2c8339818101604052810190610033919061179d565b33848481600390816100459190611a53565b5080600490816100559190611a53565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100ca5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100c19190611b34565b60405180910390fd5b6100d9816106ed60201b60201c565b508160808181525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610141573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101659190611b4f565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021b9190611b4f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060c0516040518363ffffffff1660e01b8152600401610257929190611b7c565b6020604051808303816000875af1158015610276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029a9190611b4f565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016009600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506105e533836107b360201b60201c565b61062a33737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61083b60201b60201c565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250506106e430737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61083b60201b60201c565b505050506121da565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108255760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161081c9190611b34565b60405180910390fd5b6108376000838361085360201b60201c565b5050565b61084e8383836001610c9b60201b60201c565b505050565b600080610864610e7260201b60201c565b91509150600060a05173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905080806108d6575060a05173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610bd257600060075411806109355750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096b90611c02565b60405180910390fd5b80801561098e575060016007544361098c9190611c51565b105b15610a14576032600b60004381526020019081526020016000205411156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190611cd1565b60405180910390fd5b600b60004381526020019081526020016000206000815480929190610a0e90611cf1565b91905055505b60008314610b6457808015610a735750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610ab65760006127108486610a899190611d39565b610a939190611daa565b90508085610aa19190611c51565b9450610ab4873083610f8360201b60201c565b505b80158015610b0e5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610b5f5760006127108486610b249190611d39565b610b2e9190611daa565b90508085610b3c9190611c51565b9450610b4f873083610f8360201b60201c565b610b5d6111a860201b60201c565b505b610bd1565b80158015610bbc5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610bd057610bcf6111a860201b60201c565b5b5b5b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610c43575081610c358661154c60201b60201c565b85610c409190611ddb565b11155b610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7990611e5b565b60405180910390fd5b610c93868686610f8360201b60201c565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610d0d5760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610d049190611b34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d7f5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d769190611b34565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015610e6c578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610e639190611e8a565b60405180910390a35b50505050565b600080600160075443610e859190611c51565b1015610ea557600060c8608051610e9c9190611daa565b91509150610f7f565b600060085442610eb59190611c51565b9050610e10811015610f2b5760c8608051610ed09190611daa565b9150603c811015610ee657610fa0925050610f7f565b61012c811015610efb57610bb8925050610f7f565b6101e0811015610f10576107d0925050610f7f565b610384811015610f25576103e8925050610f7f565b6101f492505b60006201518082610f3c9190611daa565b90506101f4606482610f4e9190611d39565b11610f7257606481610f609190611d39565b6101f4610f6d9190611c51565b610f75565b60005b9350608051925050505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fd5578060026000828254610fc99190611ddb565b925050819055506110a8565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611061578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161105893929190611ea5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110f1578060026000828254039250508190555061113e565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161119b9190611e8a565b60405180910390a3505050565b6000600854426111b89190611c51565b905061012c8110156111ca575061154a565b60c86080516111d99190611daa565b600c60004381526020019081526020016000205411156111f9575061154a565b600061120a3061154c60201b60201c565b90506000810361121b57505061154a565b6000600267ffffffffffffffff811115611238576112376115c3565b5b6040519080825280602002602001820160405280156112665781602001602082028036833780820191505090505b50905060c051816000815181106112805761127f611edc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106112cf576112ce611edc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611362929190612004565b600060405180830381865afa15801561137f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113a891906120fc565b6001815181106113bb576113ba611edc565b5b60200260200101519050808311156113d1578092505b82600c600043815260200190815260200160002060008282546113f49190611ddb565b9250508190555030826000815181106114105761140f611edc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060c0518260018151811061146157611460611edc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94784600085600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611513959493929190612180565b600060405180830381600087803b15801561152d57600080fd5b505af1158015611541573d6000803e3d6000fd5b50505050505050505b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115fb826115b2565b810181811067ffffffffffffffff8211171561161a576116196115c3565b5b80604052505050565b600061162d611594565b905061163982826115f2565b919050565b600067ffffffffffffffff821115611659576116586115c3565b5b611662826115b2565b9050602081019050919050565b60005b8381101561168d578082015181840152602081019050611672565b60008484015250505050565b60006116ac6116a78461163e565b611623565b9050828152602081018484840111156116c8576116c76115ad565b5b6116d384828561166f565b509392505050565b600082601f8301126116f0576116ef6115a8565b5b8151611700848260208601611699565b91505092915050565b6000819050919050565b61171c81611709565b811461172757600080fd5b50565b60008151905061173981611713565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061176a8261173f565b9050919050565b61177a8161175f565b811461178557600080fd5b50565b60008151905061179781611771565b92915050565b600080600080608085870312156117b7576117b661159e565b5b600085015167ffffffffffffffff8111156117d5576117d46115a3565b5b6117e1878288016116db565b945050602085015167ffffffffffffffff811115611802576118016115a3565b5b61180e878288016116db565b935050604061181f8782880161172a565b925050606061183087828801611788565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061188e57607f821691505b6020821081036118a1576118a0611847565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826118cc565b61191386836118cc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061195061194b61194684611709565b61192b565b611709565b9050919050565b6000819050919050565b61196a83611935565b61197e61197682611957565b8484546118d9565b825550505050565b600090565b611993611986565b61199e818484611961565b505050565b5b818110156119c2576119b760008261198b565b6001810190506119a4565b5050565b601f821115611a07576119d8816118a7565b6119e1846118bc565b810160208510156119f0578190505b611a046119fc856118bc565b8301826119a3565b50505b505050565b600082821c905092915050565b6000611a2a60001984600802611a0c565b1980831691505092915050565b6000611a438383611a19565b9150826002028217905092915050565b611a5c8261183c565b67ffffffffffffffff811115611a7557611a746115c3565b5b611a7f8254611876565b611a8a8282856119c6565b600060209050601f831160018114611abd5760008415611aab578287015190505b611ab58582611a37565b865550611b1d565b601f198416611acb866118a7565b60005b82811015611af357848901518255600182019150602085019450602081019050611ace565b86831015611b105784890151611b0c601f891682611a19565b8355505b6001600288020188555050505b505050505050565b611b2e8161175f565b82525050565b6000602082019050611b496000830184611b25565b92915050565b600060208284031215611b6557611b6461159e565b5b6000611b7384828501611788565b91505092915050565b6000604082019050611b916000830185611b25565b611b9e6020830184611b25565b9392505050565b600082825260208201905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b6000611bec601383611ba5565b9150611bf782611bb6565b602082019050919050565b60006020820190508181036000830152611c1b81611bdf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611c5c82611709565b9150611c6783611709565b9250828203905081811115611c7f57611c7e611c22565b5b92915050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b6000611cbb601e83611ba5565b9150611cc682611c85565b602082019050919050565b60006020820190508181036000830152611cea81611cae565b9050919050565b6000611cfc82611709565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d2e57611d2d611c22565b5b600182019050919050565b6000611d4482611709565b9150611d4f83611709565b9250828202611d5d81611709565b91508282048414831517611d7457611d73611c22565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611db582611709565b9150611dc083611709565b925082611dd057611dcf611d7b565b5b828204905092915050565b6000611de682611709565b9150611df183611709565b9250828201905080821115611e0957611e08611c22565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b6000611e45601883611ba5565b9150611e5082611e0f565b602082019050919050565b60006020820190508181036000830152611e7481611e38565b9050919050565b611e8481611709565b82525050565b6000602082019050611e9f6000830184611e7b565b92915050565b6000606082019050611eba6000830186611b25565b611ec76020830185611e7b565b611ed46040830184611e7b565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000611f30611f2b611f2684611f0b565b61192b565b611709565b9050919050565b611f4081611f15565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611f7b8161175f565b82525050565b6000611f8d8383611f72565b60208301905092915050565b6000602082019050919050565b6000611fb182611f46565b611fbb8185611f51565b9350611fc683611f62565b8060005b83811015611ff7578151611fde8882611f81565b9750611fe983611f99565b925050600181019050611fca565b5085935050505092915050565b60006040820190506120196000830185611f37565b818103602083015261202b8184611fa6565b90509392505050565b600067ffffffffffffffff82111561204f5761204e6115c3565b5b602082029050602081019050919050565b600080fd5b600061207861207384612034565b611623565b9050808382526020820190506020840283018581111561209b5761209a612060565b5b835b818110156120c457806120b0888261172a565b84526020840193505060208101905061209d565b5050509392505050565b600082601f8301126120e3576120e26115a8565b5b81516120f3848260208601612065565b91505092915050565b6000602082840312156121125761211161159e565b5b600082015167ffffffffffffffff8111156121305761212f6115a3565b5b61213c848285016120ce565b91505092915050565b6000819050919050565b600061216a61216561216084612145565b61192b565b611709565b9050919050565b61217a8161214f565b82525050565b600060a0820190506121956000830188611e7b565b6121a26020830187612171565b81810360408301526121b48186611fa6565b90506121c36060830185611b25565b6121d06080830184611e7b565b9695505050505050565b60805160a05160c05160e0516128e86122446000396000610a5c01526000818161197b0152611b7a01526000818161090701528181611234015261128c01526000818161062901528181610efe01528181610f500152818161102201526118c601526128e86000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80636dd3d39f116100de578063a25ba18311610097578063dbb64d4b11610071578063dbb64d4b1461047a578063dd62ed3e146104aa578063f0f44260146104da578063f2fde38b146104f65761018e565b8063a25ba1831461040d578063a8aa1b311461042c578063a9059cbb1461044a5761018e565b80636dd3d39f1461035d57806370a082311461038d578063715018a6146103bd5780638a8c523c146103c75780638da5cb5b146103d157806395d89b41146103ef5761018e565b8063313ce5671161014b57806348cd4cb11161012557806348cd4cb1146102d55780634fbee193146102f3578063590ffdce1461032357806361d027b31461033f5761018e565b8063313ce5671461027d57806332cb6b0c1461029b57806341220104146102b95761018e565b806306fdde0314610193578063095ea7b3146101b15780630c18d4ce146101e157806318160ddd146101ff57806321b024861461021d57806323b872dd1461024d575b600080fd5b61019b610512565b6040516101a89190611d28565b60405180910390f35b6101cb60048036038101906101c69190611df2565b6105a4565b6040516101d89190611e4d565b60405180910390f35b6101e96105c7565b6040516101f69190611e77565b60405180910390f35b6102076105cd565b6040516102149190611e77565b60405180910390f35b61023760048036038101906102329190611e92565b6105d7565b6040516102449190611e77565b60405180910390f35b61026760048036038101906102629190611ebf565b6105ef565b6040516102749190611e4d565b60405180910390f35b61028561061e565b6040516102929190611f2e565b60405180910390f35b6102a3610627565b6040516102b09190611e77565b60405180910390f35b6102d360048036038101906102ce9190611f75565b61064b565b005b6102dd6106ae565b6040516102ea9190611e77565b60405180910390f35b61030d60048036038101906103089190611fb5565b6106b4565b60405161031a9190611e4d565b60405180910390f35b61033d60048036038101906103389190611f75565b6106d4565b005b610347610737565b6040516103549190611ff1565b60405180910390f35b61037760048036038101906103729190611fb5565b61075d565b6040516103849190611e4d565b60405180910390f35b6103a760048036038101906103a29190611fb5565b61077d565b6040516103b49190611e77565b60405180910390f35b6103c56107c5565b005b6103cf6107d9565b005b6103d9610836565b6040516103e69190611ff1565b60405180910390f35b6103f7610860565b6040516104049190611d28565b60405180910390f35b6104156108f2565b60405161042392919061200c565b60405180910390f35b610434610905565b6040516104419190611ff1565b60405180910390f35b610464600480360381019061045f9190611df2565b610929565b6040516104719190611e4d565b60405180910390f35b610494600480360381019061048f9190611e92565b61094c565b6040516104a19190611e77565b60405180910390f35b6104c460048036038101906104bf9190612035565b610964565b6040516104d19190611e77565b60405180910390f35b6104f460048036038101906104ef9190611fb5565b6109eb565b005b610510600480360381019061050b9190611fb5565b610b69565b005b606060038054610521906120a4565b80601f016020809104026020016040519081016040528092919081815260200182805461054d906120a4565b801561059a5780601f1061056f5761010080835404028352916020019161059a565b820191906000526020600020905b81548152906001019060200180831161057d57829003601f168201915b5050505050905090565b6000806105af610bef565b90506105bc818585610bf7565b600191505092915050565b60085481565b6000600254905090565b600b6020528060005260406000206000915090505481565b6000806105fa610bef565b9050610607858285610c09565b610612858585610c9e565b60019150509392505050565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610653610d92565b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60075481565b60096020528060005260406000206000915054906101000a900460ff1681565b6106dc610d92565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107cd610d92565b6107d76000610e19565b565b6107e1610d92565b600060075414610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d90612121565b60405180910390fd5b4360078190555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461086f906120a4565b80601f016020809104026020016040519081016040528092919081815260200182805461089b906120a4565b80156108e85780601f106108bd576101008083540402835291602001916108e8565b820191906000526020600020905b8154815290600101906020018083116108cb57829003601f168201915b5050505050905090565b6000806108fd610edf565b915091509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610934610bef565b9050610941818585610c9e565b600191505092915050565b600c6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a519061218d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ae65750610ab7610836565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906121f9565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b71610d92565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610be35760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610bda9190611ff1565b60405180910390fd5b610bec81610e19565b50565b600033905090565b610c04838383600161104a565b505050565b6000610c158484610964565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610c985781811015610c88578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610c7f93929190612219565b60405180910390fd5b610c978484848403600061104a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d105760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d079190611ff1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d825760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d799190611ff1565b60405180910390fd5b610d8d838383611221565b505050565b610d9a610bef565b73ffffffffffffffffffffffffffffffffffffffff16610db8610836565b73ffffffffffffffffffffffffffffffffffffffff1614610e1757610ddb610bef565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e0e9190611ff1565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600160075443610ef2919061227f565b1015610f3057600060c87f0000000000000000000000000000000000000000000000000000000000000000610f2791906122e2565b91509150611046565b600060085442610f40919061227f565b9050610e10811015610fd45760c87f0000000000000000000000000000000000000000000000000000000000000000610f7991906122e2565b9150603c811015610f8f57610fa0925050611046565b61012c811015610fa457610bb8925050611046565b6101e0811015610fb9576107d0925050611046565b610384811015610fce576103e8925050611046565b6101f492505b60006201518082610fe591906122e2565b90506101f4606482610ff79190612313565b1161101b576064816110099190612313565b6101f4611016919061227f565b61101e565b60005b93507f0000000000000000000000000000000000000000000000000000000000000000925050505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036110bc5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016110b39190611ff1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361112e5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016111259190611ff1565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801561121b578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516112129190611e77565b60405180910390a35b50505050565b60008061122c610edf565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905080806112da57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156115be57600060075411806113395750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f906123a1565b60405180910390fd5b8080156113925750600160075443611390919061227f565b105b15611418576032600b60004381526020019081526020016000205411156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061240d565b60405180910390fd5b600b600043815260200190815260200160002060008154809291906114129061242d565b91905055505b60008314611556578080156114775750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156114b4576000612710848661148d9190612313565b61149791906122e2565b905080856114a5919061227f565b94506114b287308361167b565b505b8015801561150c5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561155157600061271084866115229190612313565b61152c91906122e2565b9050808561153a919061227f565b945061154787308361167b565b61154f6118a0565b505b6115bd565b801580156115ae5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156115bc576115bb6118a0565b5b5b5b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061162957508161161b8661077d565b856116269190612475565b11155b611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f906124f5565b60405180910390fd5b61167386868661167b565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116cd5780600260008282546116c19190612475565b925050819055506117a0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611759578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161175093929190612219565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e95780600260008282540392505081905550611836565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118939190611e77565b60405180910390a3505050565b6000600854426118b0919061227f565b905061012c8110156118c25750611c96565b60c87f00000000000000000000000000000000000000000000000000000000000000006118ef91906122e2565b600c600043815260200190815260200160002054111561190f5750611c96565b600061191a3061077d565b90506000810361192b575050611c96565b6000600267ffffffffffffffff81111561194857611947612515565b5b6040519080825280602002602001820160405280156119765781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106119ae576119ad612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106119fd576119fc612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611a90929190612676565b600060405180830381865afa158015611aad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ad691906127d4565b600181518110611ae957611ae8612544565b5b6020026020010151905080831115611aff578092505b82600c60004381526020019081526020016000206000828254611b229190612475565b925050819055503082600081518110611b3e57611b3d612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000082600181518110611bad57611bac612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94784600085600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611c5f959493929190612858565b600060405180830381600087803b158015611c7957600080fd5b505af1158015611c8d573d6000803e3d6000fd5b50505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cd2578082015181840152602081019050611cb7565b60008484015250505050565b6000601f19601f8301169050919050565b6000611cfa82611c98565b611d048185611ca3565b9350611d14818560208601611cb4565b611d1d81611cde565b840191505092915050565b60006020820190508181036000830152611d428184611cef565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d8982611d5e565b9050919050565b611d9981611d7e565b8114611da457600080fd5b50565b600081359050611db681611d90565b92915050565b6000819050919050565b611dcf81611dbc565b8114611dda57600080fd5b50565b600081359050611dec81611dc6565b92915050565b60008060408385031215611e0957611e08611d54565b5b6000611e1785828601611da7565b9250506020611e2885828601611ddd565b9150509250929050565b60008115159050919050565b611e4781611e32565b82525050565b6000602082019050611e626000830184611e3e565b92915050565b611e7181611dbc565b82525050565b6000602082019050611e8c6000830184611e68565b92915050565b600060208284031215611ea857611ea7611d54565b5b6000611eb684828501611ddd565b91505092915050565b600080600060608486031215611ed857611ed7611d54565b5b6000611ee686828701611da7565b9350506020611ef786828701611da7565b9250506040611f0886828701611ddd565b9150509250925092565b600060ff82169050919050565b611f2881611f12565b82525050565b6000602082019050611f436000830184611f1f565b92915050565b611f5281611e32565b8114611f5d57600080fd5b50565b600081359050611f6f81611f49565b92915050565b60008060408385031215611f8c57611f8b611d54565b5b6000611f9a85828601611da7565b9250506020611fab85828601611f60565b9150509250929050565b600060208284031215611fcb57611fca611d54565b5b6000611fd984828501611da7565b91505092915050565b611feb81611d7e565b82525050565b60006020820190506120066000830184611fe2565b92915050565b60006040820190506120216000830185611e68565b61202e6020830184611e68565b9392505050565b6000806040838503121561204c5761204b611d54565b5b600061205a85828601611da7565b925050602061206b85828601611da7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806120bc57607f821691505b6020821081036120cf576120ce612075565b5b50919050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b600061210b601783611ca3565b9150612116826120d5565b602082019050919050565b6000602082019050818103600083015261213a816120fe565b9050919050565b7f74726561737572792d69732d3000000000000000000000000000000000000000600082015250565b6000612177600d83611ca3565b915061218282612141565b602082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f6f6e6c792d6465706c6f79657200000000000000000000000000000000000000600082015250565b60006121e3600d83611ca3565b91506121ee826121ad565b602082019050919050565b60006020820190508181036000830152612212816121d6565b9050919050565b600060608201905061222e6000830186611fe2565b61223b6020830185611e68565b6122486040830184611e68565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061228a82611dbc565b915061229583611dbc565b92508282039050818111156122ad576122ac612250565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006122ed82611dbc565b91506122f883611dbc565b925082612308576123076122b3565b5b828204905092915050565b600061231e82611dbc565b915061232983611dbc565b925082820261233781611dbc565b9150828204841483151761234e5761234d612250565b5b5092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b600061238b601383611ca3565b915061239682612355565b602082019050919050565b600060208201905081810360008301526123ba8161237e565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b60006123f7601e83611ca3565b9150612402826123c1565b602082019050919050565b60006020820190508181036000830152612426816123ea565b9050919050565b600061243882611dbc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361246a57612469612250565b5b600182019050919050565b600061248082611dbc565b915061248b83611dbc565b92508282019050808211156124a3576124a2612250565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b60006124df601883611ca3565b91506124ea826124a9565b602082019050919050565b6000602082019050818103600083015261250e816124d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006125a261259d61259884612573565b61257d565b611dbc565b9050919050565b6125b281612587565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6125ed81611d7e565b82525050565b60006125ff83836125e4565b60208301905092915050565b6000602082019050919050565b6000612623826125b8565b61262d81856125c3565b9350612638836125d4565b8060005b8381101561266957815161265088826125f3565b975061265b8361260b565b92505060018101905061263c565b5085935050505092915050565b600060408201905061268b60008301856125a9565b818103602083015261269d8184612618565b90509392505050565b600080fd5b6126b482611cde565b810181811067ffffffffffffffff821117156126d3576126d2612515565b5b80604052505050565b60006126e6611d4a565b90506126f282826126ab565b919050565b600067ffffffffffffffff82111561271257612711612515565b5b602082029050602081019050919050565b600080fd5b60008151905061273781611dc6565b92915050565b600061275061274b846126f7565b6126dc565b9050808382526020820190506020840283018581111561277357612772612723565b5b835b8181101561279c57806127888882612728565b845260208401935050602081019050612775565b5050509392505050565b600082601f8301126127bb576127ba6126a6565b5b81516127cb84826020860161273d565b91505092915050565b6000602082840312156127ea576127e9611d54565b5b600082015167ffffffffffffffff81111561280857612807611d59565b5b612814848285016127a6565b91505092915050565b6000819050919050565b600061284261283d6128388461281d565b61257d565b611dbc565b9050919050565b61285281612827565b82525050565b600060a08201905061286d6000830188611e68565b61287a6020830187612849565b818103604083015261288c8186612618565b905061289b6060830185611fe2565b6128a86080830184611e68565b969550505050505056fea264697066735822122015dfe354f80bb0b1f029fcda92e942c42ac7e2fbe469312e724a5bc53a20f79664736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000a7e836475a685a19fe5707afce1a497168bcb19300000000000000000000000000000000000000000000000000000000000000055a6f64696100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055a4f444941000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80636dd3d39f116100de578063a25ba18311610097578063dbb64d4b11610071578063dbb64d4b1461047a578063dd62ed3e146104aa578063f0f44260146104da578063f2fde38b146104f65761018e565b8063a25ba1831461040d578063a8aa1b311461042c578063a9059cbb1461044a5761018e565b80636dd3d39f1461035d57806370a082311461038d578063715018a6146103bd5780638a8c523c146103c75780638da5cb5b146103d157806395d89b41146103ef5761018e565b8063313ce5671161014b57806348cd4cb11161012557806348cd4cb1146102d55780634fbee193146102f3578063590ffdce1461032357806361d027b31461033f5761018e565b8063313ce5671461027d57806332cb6b0c1461029b57806341220104146102b95761018e565b806306fdde0314610193578063095ea7b3146101b15780630c18d4ce146101e157806318160ddd146101ff57806321b024861461021d57806323b872dd1461024d575b600080fd5b61019b610512565b6040516101a89190611d28565b60405180910390f35b6101cb60048036038101906101c69190611df2565b6105a4565b6040516101d89190611e4d565b60405180910390f35b6101e96105c7565b6040516101f69190611e77565b60405180910390f35b6102076105cd565b6040516102149190611e77565b60405180910390f35b61023760048036038101906102329190611e92565b6105d7565b6040516102449190611e77565b60405180910390f35b61026760048036038101906102629190611ebf565b6105ef565b6040516102749190611e4d565b60405180910390f35b61028561061e565b6040516102929190611f2e565b60405180910390f35b6102a3610627565b6040516102b09190611e77565b60405180910390f35b6102d360048036038101906102ce9190611f75565b61064b565b005b6102dd6106ae565b6040516102ea9190611e77565b60405180910390f35b61030d60048036038101906103089190611fb5565b6106b4565b60405161031a9190611e4d565b60405180910390f35b61033d60048036038101906103389190611f75565b6106d4565b005b610347610737565b6040516103549190611ff1565b60405180910390f35b61037760048036038101906103729190611fb5565b61075d565b6040516103849190611e4d565b60405180910390f35b6103a760048036038101906103a29190611fb5565b61077d565b6040516103b49190611e77565b60405180910390f35b6103c56107c5565b005b6103cf6107d9565b005b6103d9610836565b6040516103e69190611ff1565b60405180910390f35b6103f7610860565b6040516104049190611d28565b60405180910390f35b6104156108f2565b60405161042392919061200c565b60405180910390f35b610434610905565b6040516104419190611ff1565b60405180910390f35b610464600480360381019061045f9190611df2565b610929565b6040516104719190611e4d565b60405180910390f35b610494600480360381019061048f9190611e92565b61094c565b6040516104a19190611e77565b60405180910390f35b6104c460048036038101906104bf9190612035565b610964565b6040516104d19190611e77565b60405180910390f35b6104f460048036038101906104ef9190611fb5565b6109eb565b005b610510600480360381019061050b9190611fb5565b610b69565b005b606060038054610521906120a4565b80601f016020809104026020016040519081016040528092919081815260200182805461054d906120a4565b801561059a5780601f1061056f5761010080835404028352916020019161059a565b820191906000526020600020905b81548152906001019060200180831161057d57829003601f168201915b5050505050905090565b6000806105af610bef565b90506105bc818585610bf7565b600191505092915050565b60085481565b6000600254905090565b600b6020528060005260406000206000915090505481565b6000806105fa610bef565b9050610607858285610c09565b610612858585610c9e565b60019150509392505050565b60006012905090565b7f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081565b610653610d92565b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60075481565b60096020528060005260406000206000915054906101000a900460ff1681565b6106dc610d92565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107cd610d92565b6107d76000610e19565b565b6107e1610d92565b600060075414610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d90612121565b60405180910390fd5b4360078190555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461086f906120a4565b80601f016020809104026020016040519081016040528092919081815260200182805461089b906120a4565b80156108e85780601f106108bd576101008083540402835291602001916108e8565b820191906000526020600020905b8154815290600101906020018083116108cb57829003601f168201915b5050505050905090565b6000806108fd610edf565b915091509091565b7f000000000000000000000000885c4407ad2f04c78f9f0fc2cfcc6d79dfa7d28681565b600080610934610bef565b9050610941818585610c9e565b600191505092915050565b600c6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a519061218d565b60405180910390fd5b7f00000000000000000000000011ca8dcfd1c4cd681f55942e271a31955678effb73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ae65750610ab7610836565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1c906121f9565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b71610d92565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610be35760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610bda9190611ff1565b60405180910390fd5b610bec81610e19565b50565b600033905090565b610c04838383600161104a565b505050565b6000610c158484610964565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610c985781811015610c88578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610c7f93929190612219565b60405180910390fd5b610c978484848403600061104a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d105760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d079190611ff1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d825760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d799190611ff1565b60405180910390fd5b610d8d838383611221565b505050565b610d9a610bef565b73ffffffffffffffffffffffffffffffffffffffff16610db8610836565b73ffffffffffffffffffffffffffffffffffffffff1614610e1757610ddb610bef565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e0e9190611ff1565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600160075443610ef2919061227f565b1015610f3057600060c87f0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000610f2791906122e2565b91509150611046565b600060085442610f40919061227f565b9050610e10811015610fd45760c87f0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000610f7991906122e2565b9150603c811015610f8f57610fa0925050611046565b61012c811015610fa457610bb8925050611046565b6101e0811015610fb9576107d0925050611046565b610384811015610fce576103e8925050611046565b6101f492505b60006201518082610fe591906122e2565b90506101f4606482610ff79190612313565b1161101b576064816110099190612313565b6101f4611016919061227f565b61101e565b60005b93507f0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000925050505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036110bc5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016110b39190611ff1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361112e5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016111259190611ff1565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801561121b578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516112129190611e77565b60405180910390a35b50505050565b60008061122c610edf565b9150915060007f000000000000000000000000885c4407ad2f04c78f9f0fc2cfcc6d79dfa7d28673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905080806112da57507f000000000000000000000000885c4407ad2f04c78f9f0fc2cfcc6d79dfa7d28673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156115be57600060075411806113395750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f906123a1565b60405180910390fd5b8080156113925750600160075443611390919061227f565b105b15611418576032600b60004381526020019081526020016000205411156113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061240d565b60405180910390fd5b600b600043815260200190815260200160002060008154809291906114129061242d565b91905055505b60008314611556578080156114775750600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156114b4576000612710848661148d9190612313565b61149791906122e2565b905080856114a5919061227f565b94506114b287308361167b565b505b8015801561150c5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561155157600061271084866115229190612313565b61152c91906122e2565b9050808561153a919061227f565b945061154787308361167b565b61154f6118a0565b505b6115bd565b801580156115ae5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156115bc576115bb6118a0565b5b5b5b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061162957508161161b8661077d565b856116269190612475565b11155b611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f906124f5565b60405180910390fd5b61167386868661167b565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116cd5780600260008282546116c19190612475565b925050819055506117a0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611759578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161175093929190612219565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e95780600260008282540392505081905550611836565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118939190611e77565b60405180910390a3505050565b6000600854426118b0919061227f565b905061012c8110156118c25750611c96565b60c87f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000006118ef91906122e2565b600c600043815260200190815260200160002054111561190f5750611c96565b600061191a3061077d565b90506000810361192b575050611c96565b6000600267ffffffffffffffff81111561194857611947612515565b5b6040519080825280602002602001820160405280156119765781602001602082028036833780820191505090505b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816000815181106119ae576119ad612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106119fd576119fc612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611a90929190612676565b600060405180830381865afa158015611aad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ad691906127d4565b600181518110611ae957611ae8612544565b5b6020026020010151905080831115611aff578092505b82600c60004381526020019081526020016000206000828254611b229190612475565b925050819055503082600081518110611b3e57611b3d612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282600181518110611bad57611bac612544565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94784600085600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611c5f959493929190612858565b600060405180830381600087803b158015611c7957600080fd5b505af1158015611c8d573d6000803e3d6000fd5b50505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cd2578082015181840152602081019050611cb7565b60008484015250505050565b6000601f19601f8301169050919050565b6000611cfa82611c98565b611d048185611ca3565b9350611d14818560208601611cb4565b611d1d81611cde565b840191505092915050565b60006020820190508181036000830152611d428184611cef565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d8982611d5e565b9050919050565b611d9981611d7e565b8114611da457600080fd5b50565b600081359050611db681611d90565b92915050565b6000819050919050565b611dcf81611dbc565b8114611dda57600080fd5b50565b600081359050611dec81611dc6565b92915050565b60008060408385031215611e0957611e08611d54565b5b6000611e1785828601611da7565b9250506020611e2885828601611ddd565b9150509250929050565b60008115159050919050565b611e4781611e32565b82525050565b6000602082019050611e626000830184611e3e565b92915050565b611e7181611dbc565b82525050565b6000602082019050611e8c6000830184611e68565b92915050565b600060208284031215611ea857611ea7611d54565b5b6000611eb684828501611ddd565b91505092915050565b600080600060608486031215611ed857611ed7611d54565b5b6000611ee686828701611da7565b9350506020611ef786828701611da7565b9250506040611f0886828701611ddd565b9150509250925092565b600060ff82169050919050565b611f2881611f12565b82525050565b6000602082019050611f436000830184611f1f565b92915050565b611f5281611e32565b8114611f5d57600080fd5b50565b600081359050611f6f81611f49565b92915050565b60008060408385031215611f8c57611f8b611d54565b5b6000611f9a85828601611da7565b9250506020611fab85828601611f60565b9150509250929050565b600060208284031215611fcb57611fca611d54565b5b6000611fd984828501611da7565b91505092915050565b611feb81611d7e565b82525050565b60006020820190506120066000830184611fe2565b92915050565b60006040820190506120216000830185611e68565b61202e6020830184611e68565b9392505050565b6000806040838503121561204c5761204b611d54565b5b600061205a85828601611da7565b925050602061206b85828601611da7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806120bc57607f821691505b6020821081036120cf576120ce612075565b5b50919050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b600061210b601783611ca3565b9150612116826120d5565b602082019050919050565b6000602082019050818103600083015261213a816120fe565b9050919050565b7f74726561737572792d69732d3000000000000000000000000000000000000000600082015250565b6000612177600d83611ca3565b915061218282612141565b602082019050919050565b600060208201905081810360008301526121a68161216a565b9050919050565b7f6f6e6c792d6465706c6f79657200000000000000000000000000000000000000600082015250565b60006121e3600d83611ca3565b91506121ee826121ad565b602082019050919050565b60006020820190508181036000830152612212816121d6565b9050919050565b600060608201905061222e6000830186611fe2565b61223b6020830185611e68565b6122486040830184611e68565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061228a82611dbc565b915061229583611dbc565b92508282039050818111156122ad576122ac612250565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006122ed82611dbc565b91506122f883611dbc565b925082612308576123076122b3565b5b828204905092915050565b600061231e82611dbc565b915061232983611dbc565b925082820261233781611dbc565b9150828204841483151761234e5761234d612250565b5b5092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b600061238b601383611ca3565b915061239682612355565b602082019050919050565b600060208201905081810360008301526123ba8161237e565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b60006123f7601e83611ca3565b9150612402826123c1565b602082019050919050565b60006020820190508181036000830152612426816123ea565b9050919050565b600061243882611dbc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361246a57612469612250565b5b600182019050919050565b600061248082611dbc565b915061248b83611dbc565b92508282019050808211156124a3576124a2612250565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b60006124df601883611ca3565b91506124ea826124a9565b602082019050919050565b6000602082019050818103600083015261250e816124d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006125a261259d61259884612573565b61257d565b611dbc565b9050919050565b6125b281612587565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6125ed81611d7e565b82525050565b60006125ff83836125e4565b60208301905092915050565b6000602082019050919050565b6000612623826125b8565b61262d81856125c3565b9350612638836125d4565b8060005b8381101561266957815161265088826125f3565b975061265b8361260b565b92505060018101905061263c565b5085935050505092915050565b600060408201905061268b60008301856125a9565b818103602083015261269d8184612618565b90509392505050565b600080fd5b6126b482611cde565b810181811067ffffffffffffffff821117156126d3576126d2612515565b5b80604052505050565b60006126e6611d4a565b90506126f282826126ab565b919050565b600067ffffffffffffffff82111561271257612711612515565b5b602082029050602081019050919050565b600080fd5b60008151905061273781611dc6565b92915050565b600061275061274b846126f7565b6126dc565b9050808382526020820190506020840283018581111561277357612772612723565b5b835b8181101561279c57806127888882612728565b845260208401935050602081019050612775565b5050509392505050565b600082601f8301126127bb576127ba6126a6565b5b81516127cb84826020860161273d565b91505092915050565b6000602082840312156127ea576127e9611d54565b5b600082015167ffffffffffffffff81111561280857612807611d59565b5b612814848285016127a6565b91505092915050565b6000819050919050565b600061284261283d6128388461281d565b61257d565b611dbc565b9050919050565b61285281612827565b82525050565b600060a08201905061286d6000830188611e68565b61287a6020830187612849565b818103604083015261288c8186612618565b905061289b6060830185611fe2565b6128a86080830184611e68565b969550505050505056fea264697066735822122015dfe354f80bb0b1f029fcda92e942c42ac7e2fbe469312e724a5bc53a20f79664736f6c634300081c0033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000a7e836475a685a19fe5707afce1a497168bcb19300000000000000000000000000000000000000000000000000000000000000055a6f64696100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055a4f444941000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Zodia
Arg [1] : symbol (string): ZODIA
Arg [2] : maxSupply (uint256): 1000000000000000000000000000
Arg [3] : _treasury (address): 0xa7E836475a685A19fe5707Afce1a497168bcB193

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [3] : 000000000000000000000000a7e836475a685a19fe5707afce1a497168bcb193
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 5a6f646961000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 5a4f444941000000000000000000000000000000000000000000000000000000


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.