ETH Price: $3,451.82 (+4.24%)

Token

BAOBAO (BAOBAO)
 

Overview

Max Total Supply

420,690,000,000,000 BAOBAO

Holders

243

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,082,046,573,320.62561502783497912 BAOBAO

Value
$0.00
0x70dd0acecebec3a769b4d186a367fadab8e90638
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:
BAOBAO

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol


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

pragma solidity ^0.8.20;


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

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

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

// File: lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Context.sol


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

pragma solidity ^0.8.20;

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

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

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

// File: lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol


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

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

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

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

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

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

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

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

// File: lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol


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

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

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

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

        emit Transfer(from, to, value);
    }

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

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

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

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

// File: lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/access/Ownable.sol


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

pragma solidity ^0.8.20;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: src/Test.sol





pragma solidity ^0.8.19;

contract BAOBAO is ERC20, Ownable {
    IUniswapV2Router02 immutable uniswapV2Router;
    uint256 public maxTxAmount;
    uint256 public maxWalletAmount;
    uint256 public buyTax = 1;
    uint256 public sellTax = 1;
    uint256 public minAmountToSwapTaxes;
    uint256 public launchedAt;
    uint256 public buys;
    uint256 public buysBeforeSells = 40;

    bool public launchTax;
    bool public taxesEnabled = true;
    bool public limitsEnabled = true;
    bool  inSwapAndLiq;
    bool public tradingAllowed = false;

    address  taxWallet;
    address public uniswapV2Pair;

    mapping(address => bool) public excluded;

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

    constructor() ERC20("BAOBAO", "BAOBAO") Ownable(msg.sender) {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        taxWallet = msg.sender;

        excluded[owner()] = true;
        excluded[msg.sender] = true;
        excluded[taxWallet] = true;
        excluded[address(this)] = true;
        excluded[address(_uniswapV2Pair)] = true;

        _mint(owner(), 420_690_000_000_000 * 10 ** 18);

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        minAmountToSwapTaxes = (totalSupply() * 2) / 1000;
        maxWalletAmount = (totalSupply() * 2) / 100;
        maxTxAmount = (totalSupply() * 2) / 100;
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(amount > 0, "ERC20: transfer must be greater than 0");

        if (!tradingAllowed) {
            require(from == owner() || to == owner(), "Trading not active yet");
        }

        uint256 taxAmount;

        if (launchTax) {
            getTax(block.number);
        }

        if (from == uniswapV2Pair && !excluded[to]) {
            if (limitsEnabled) {
                require(amount <= maxTxAmount, "Max Tx in effect");
                require(
                    balanceOf(to) + amount <= maxWalletAmount,
                    "Max Wallet In Effect"
                );
            }

            if (taxesEnabled) {
                taxAmount = (amount * buyTax) / 100;
            }

            buys++;
        }

        if (to == uniswapV2Pair && !excluded[from]) {
            if (limitsEnabled) {
                require(amount <= maxTxAmount, "Max Tx in effect");
            }

            if (taxesEnabled) {
                taxAmount = (amount * sellTax) / 100;
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >= minAmountToSwapTaxes;

        if (
            overMinTokenBalance &&
            !inSwapAndLiq &&
            from != uniswapV2Pair &&
            !excluded[from] &&
            buys > buysBeforeSells
        ) {
            swapAndSend(minAmountToSwapTaxes);
        }

        if (taxAmount > 0) {
            uint256 userAmount = amount - taxAmount;
            super._update(from, address(this), taxAmount);
            super._update(from, to, userAmount);
        } else {
            super._update(from, to, amount);
        }
    }

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _contractTokenBalance,
            0, // accept any amount of ETH
            path,
            taxWallet,
            block.timestamp
        );
    }

    function getTax(uint256 _block) internal {
        if (launchedAt == _block) {
            buyTax = 30;
            sellTax = 30;
        } else if (launchedAt + 1 >= _block) {
            buyTax = 20;
            sellTax = 20;
        } else if (launchedAt + 2 >= _block) {
            buyTax = 10;
            sellTax = 10;
        } else if (launchedAt + 3 >= _block) {
            buyTax = 5;
            sellTax = 5;
        }
    }

    function changetaxWallet(address _newtaxWallet) external onlyOwner {
        taxWallet = _newtaxWallet;
    }

    function removeLaunchTax(
        uint256 _newBuyTaxPercent,
        uint256 _newSellTaxPercent
    ) external onlyOwner {
        require(
            _newBuyTaxPercent <= 10 && _newSellTaxPercent <= 10,
            "Cannot set taxes above 10"
        );
        buyTax = _newBuyTaxPercent;
        sellTax = _newSellTaxPercent;
        launchTax = false;
    }

    function excludeFromFees(
        address _address,
        bool _isExcluded
    ) external onlyOwner {
        excluded[_address] = _isExcluded;
    }

    function updateMaxWalletAmount(
        uint256 newMaxWalletAmount
    ) external onlyOwner {
        maxWalletAmount = newMaxWalletAmount;
    }

    function updateMaxTxAmount(uint256 _newAmount) external onlyOwner {
        maxTxAmount = _newAmount;
    }

    function changeMinAmountToSwapTaxes(
        uint256 newMinAmount
    ) external onlyOwner {
        require(newMinAmount > 0, "Cannot set to zero");
        minAmountToSwapTaxes = newMinAmount;
    }

    function enableTaxes(bool _enable) external onlyOwner {
        taxesEnabled = _enable;
    }

    function activate() external onlyOwner {
        require(!tradingAllowed, "Trading not paused");
        tradingAllowed = true;
        launchedAt = block.number;
        launchTax = true;
    }

    function toggleLimits(bool _limitsEnabed) external onlyOwner {
        limitsEnabled = _limitsEnabed;
    }

    function manualSwap(uint256 _amount) external onlyOwner {
        swapAndSend(_amount);
    }
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(
        uint256 amountIn,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);

    function getAmountsIn(
        uint256 amountOut,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"activate","outputs":[],"stateMutability":"nonpayable","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":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buys","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buysBeforeSells","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinAmount","type":"uint256"}],"name":"changeMinAmountToSwapTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newtaxWallet","type":"address"}],"name":"changetaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExcluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToSwapTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBuyTaxPercent","type":"uint256"},{"internalType":"uint256","name":"_newSellTaxPercent","type":"uint256"}],"name":"removeLaunchTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_limitsEnabed","type":"bool"}],"name":"toggleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"updateMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletAmount","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600160085560016009556028600d556001600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff0219169083151502179055505f600e60046101000a81548160ff0219169083151502179055503480156200006f575f80fd5b50336040518060400160405280600681526020017f42414f42414f00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f42414f42414f00000000000000000000000000000000000000000000000000008152508160039081620000ee91906200174b565b5080600490816200010091906200174b565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000176575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200016d919062001872565b60405180910390fd5b62000187816200065e60201b60201c565b505f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001eb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002119190620018c0565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000277573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200029d9190620018c0565b6040518363ffffffff1660e01b8152600401620002bc929190620018f0565b6020604051808303815f875af1158015620002d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002ff9190620018c0565b905033600e60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160105f620003576200072160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f600e60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506200054b620005306200072160201b60201c565b6d14bddab3e51a57cff87a500000006200074960201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505080600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e86002620005d4620007d360201b60201c565b620005e0919062001948565b620005ec9190620019bf565b600a819055506064600262000606620007d360201b60201c565b62000612919062001948565b6200061e9190620019bf565b6007819055506064600262000638620007d360201b60201c565b62000644919062001948565b620006509190620019bf565b600681905550505062001ea2565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007bc575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620007b3919062001872565b60405180910390fd5b620007cf5f8383620007dc60201b60201c565b5050565b5f600254905090565b5f811162000821576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008189062001a7a565b60405180910390fd5b600e60049054906101000a900460ff16620008fd57620008466200072160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480620008ba57506200088b6200072160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b620008fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008f39062001ae8565b60405180910390fd5b5b5f600e5f9054906101000a900460ff16156200092557620009244362000d9860201b60201c565b5b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015620009c9575060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1562000ae457600e60029054906101000a900460ff161562000a935760065482111562000a2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a249062001b56565b60405180910390fd5b6007548262000a428562000e4360201b60201c565b62000a4e919062001b76565b111562000a92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a899062001bfe565b60405180910390fd5b5b600e60019054906101000a900460ff161562000aca5760646008548362000abb919062001948565b62000ac79190620019bf565b90505b600c5f81548092919062000ade9062001c1e565b91905055505b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801562000b88575060105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1562000c2557600e60029054906101000a900460ff161562000bed5760065482111562000bec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000be39062001b56565b60405180910390fd5b5b600e60019054906101000a900460ff161562000c245760646009548362000c15919062001948565b62000c219190620019bf565b90505b5b5f62000c373062000e4360201b60201c565b90505f600a54821015905080801562000c5d5750600e60039054906101000a900460ff16155b801562000cb75750600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801562000d0b575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801562000d1b5750600d54600c54115b1562000d355762000d34600a5462000e8860201b60201c565b5b5f83111562000d7c575f838562000d4d919062001c6a565b905062000d62873086620010d160201b60201c565b62000d75878783620010d160201b60201c565b5062000d90565b62000d8f868686620010d160201b60201c565b5b505050505050565b80600b540362000db857601e600881905550601e60098190555062000e40565b806001600b5462000dca919062001b76565b1062000de6576014600881905550601460098190555062000e3f565b806002600b5462000df8919062001b76565b1062000e1457600a600881905550600a60098190555062000e3e565b806003600b5462000e26919062001b76565b1062000e3d57600560088190555060056009819055505b5b5b5b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6001600e60036101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111562000ec25762000ec1620014f1565b5b60405190808252806020026020018201604052801562000ef15781602001602082028036833780820191505090505b50905030815f8151811062000f0b5762000f0a62001ca4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000f91573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000fb79190620018c0565b8160018151811062000fce5762000fcd62001ca4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506200101d3060805184620012f560201b60201c565b60805173ffffffffffffffffffffffffffffffffffffffff1663791ac947835f84600e60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016200108495949392919062001dea565b5f604051808303815f87803b1580156200109c575f80fd5b505af1158015620010af573d5f803e3d5ffd5b50505050505f600e60036101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001125578060025f82825462001118919062001b76565b92505081905550620011f6565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015620011b1578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620011a89392919062001e4c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200123f578060025f828254039250508190555062001289565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620012e8919062001e87565b60405180910390a3505050565b6200130a83838360016200130f60201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362001382575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040162001379919062001872565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620013f5575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401620013ec919062001872565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015620014e1578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051620014d8919062001e87565b60405180910390a35b50505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200156357607f821691505b6020821081036200157957620015786200151e565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620015dd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620015a0565b620015e98683620015a0565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620016336200162d620016278462001601565b6200160a565b62001601565b9050919050565b5f819050919050565b6200164e8362001613565b620016666200165d826200163a565b848454620015ac565b825550505050565b5f90565b6200167c6200166e565b6200168981848462001643565b505050565b5b81811015620016b057620016a45f8262001672565b6001810190506200168f565b5050565b601f821115620016ff57620016c9816200157f565b620016d48462001591565b81016020851015620016e4578190505b620016fc620016f38562001591565b8301826200168e565b50505b505050565b5f82821c905092915050565b5f620017215f198460080262001704565b1980831691505092915050565b5f6200173b838362001710565b9150826002028217905092915050565b6200175682620014e7565b67ffffffffffffffff811115620017725762001771620014f1565b5b6200177e82546200154b565b6200178b828285620016b4565b5f60209050601f831160018114620017c1575f8415620017ac578287015190505b620017b885826200172e565b86555062001827565b601f198416620017d1866200157f565b5f5b82811015620017fa57848901518255600182019150602085019450602081019050620017d3565b868310156200181a578489015162001816601f89168262001710565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200185a826200182f565b9050919050565b6200186c816200184e565b82525050565b5f602082019050620018875f83018462001861565b92915050565b5f80fd5b6200189c816200184e565b8114620018a7575f80fd5b50565b5f81519050620018ba8162001891565b92915050565b5f60208284031215620018d857620018d76200188d565b5b5f620018e784828501620018aa565b91505092915050565b5f604082019050620019055f83018562001861565b62001914602083018462001861565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620019548262001601565b9150620019618362001601565b9250828202620019718162001601565b915082820484148315176200198b576200198a6200191b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620019cb8262001601565b9150620019d88362001601565b925082620019eb57620019ea62001992565b5b828204905092915050565b5f82825260208201905092915050565b7f45524332303a207472616e73666572206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f62001a62602683620019f6565b915062001a6f8262001a06565b604082019050919050565b5f6020820190508181035f83015262001a938162001a54565b9050919050565b7f54726164696e67206e6f742061637469766520796574000000000000000000005f82015250565b5f62001ad0601683620019f6565b915062001add8262001a9a565b602082019050919050565b5f6020820190508181035f83015262001b018162001ac2565b9050919050565b7f4d617820547820696e20656666656374000000000000000000000000000000005f82015250565b5f62001b3e601083620019f6565b915062001b4b8262001b08565b602082019050919050565b5f6020820190508181035f83015262001b6f8162001b30565b9050919050565b5f62001b828262001601565b915062001b8f8362001601565b925082820190508082111562001baa5762001ba96200191b565b5b92915050565b7f4d61782057616c6c657420496e204566666563740000000000000000000000005f82015250565b5f62001be6601483620019f6565b915062001bf38262001bb0565b602082019050919050565b5f6020820190508181035f83015262001c178162001bd8565b9050919050565b5f62001c2a8262001601565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001c5f5762001c5e6200191b565b5b600182019050919050565b5f62001c768262001601565b915062001c838362001601565b925082820390508181111562001c9e5762001c9d6200191b565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b62001cdc8162001601565b82525050565b5f819050919050565b5f62001d0b62001d0562001cff8462001ce2565b6200160a565b62001601565b9050919050565b62001d1d8162001ceb565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b62001d57816200184e565b82525050565b5f62001d6a838362001d4c565b60208301905092915050565b5f602082019050919050565b5f62001d8e8262001d23565b62001d9a818562001d2d565b935062001da78362001d3d565b805f5b8381101562001ddd57815162001dc1888262001d5d565b975062001dce8362001d76565b92505060018101905062001daa565b5085935050505092915050565b5f60a08201905062001dff5f83018862001cd1565b62001e0e602083018762001d12565b818103604083015262001e22818662001d82565b905062001e33606083018562001861565b62001e42608083018462001cd1565b9695505050505050565b5f60608201905062001e615f83018662001861565b62001e70602083018562001cd1565b62001e7f604083018462001cd1565b949350505050565b5f60208201905062001e9c5f83018462001cd1565b92915050565b60805161274f62001ec95f395f81816110a50152818161118401526111ab015261274f5ff3fe608060405234801561000f575f80fd5b506004361061021a575f3560e01c80638c0b5e2211610123578063bf56b371116100ab578063cc1776d31161007a578063cc1776d3146105e2578063dad6b2f014610600578063dd62ed3e1461061e578063df47e3731461064e578063f2fde38b1461066a5761021a565b8063bf56b3711461056e578063bff51ef81461058c578063c0246668146105aa578063c18bc195146105c65761021a565b8063a9059cbb116100f2578063a9059cbb146104ca578063aa4bde28146104fa578063b256f7b714610518578063b70143c914610534578063bccb4687146105505761021a565b80638c0b5e22146104545780638da5cb5b1461047257806395d89b4114610490578063a6fb5dfd146104ae5761021a565b8063429cead1116101a65780636256d181116101755780636256d181146103c257806370a08231146103de578063715018a61461040e57806382f45cff14610418578063830351ff146104365761021a565b8063429cead11461033857806349bd5a5e146103685780634f7041a51461038657806353371be0146103a45761021a565b806323b872dd116101ed57806323b872dd1461029457806330275744146102c4578063313ce567146102e05780633582ad23146102fe5780633d5369f61461031c5761021a565b806306fdde031461021e578063095ea7b31461023c5780630f15f4c01461026c57806318160ddd14610276575b5f80fd5b610226610686565b6040516102339190611ccc565b60405180910390f35b61025660048036038101906102519190611d7d565b610716565b6040516102639190611dd5565b60405180910390f35b610274610738565b005b61027e6107ce565b60405161028b9190611dfd565b60405180910390f35b6102ae60048036038101906102a99190611e16565b6107d7565b6040516102bb9190611dd5565b60405180910390f35b6102de60048036038101906102d99190611e90565b610805565b005b6102e861082a565b6040516102f59190611ed6565b60405180910390f35b610306610832565b6040516103139190611dd5565b60405180910390f35b61033660048036038101906103319190611eef565b610845565b005b610352600480360381019061034d9190611f1a565b610899565b60405161035f9190611dd5565b60405180910390f35b6103706108b6565b60405161037d9190611f54565b60405180910390f35b61038e6108db565b60405161039b9190611dfd565b60405180910390f35b6103ac6108e1565b6040516103b99190611dd5565b60405180910390f35b6103dc60048036038101906103d79190611eef565b6108f4565b005b6103f860048036038101906103f39190611f1a565b610906565b6040516104059190611dfd565b60405180910390f35b61041661094b565b005b61042061095e565b60405161042d9190611dfd565b60405180910390f35b61043e610964565b60405161044b9190611dd5565b60405180910390f35b61045c610976565b6040516104699190611dfd565b60405180910390f35b61047a61097c565b6040516104879190611f54565b60405180910390f35b6104986109a4565b6040516104a59190611ccc565b60405180910390f35b6104c860048036038101906104c39190611f1a565b610a34565b005b6104e460048036038101906104df9190611d7d565b610a80565b6040516104f19190611dd5565b60405180910390f35b610502610aa2565b60405161050f9190611dfd565b60405180910390f35b610532600480360381019061052d9190611e90565b610aa8565b005b61054e60048036038101906105499190611eef565b610acd565b005b610558610ae1565b6040516105659190611dfd565b60405180910390f35b610576610ae7565b6040516105839190611dfd565b60405180910390f35b610594610aed565b6040516105a19190611dd5565b60405180910390f35b6105c460048036038101906105bf9190611f6d565b610b00565b005b6105e060048036038101906105db9190611eef565b610b60565b005b6105ea610b72565b6040516105f79190611dfd565b60405180910390f35b610608610b78565b6040516106159190611dfd565b60405180910390f35b61063860048036038101906106339190611fab565b610b7e565b6040516106459190611dfd565b60405180910390f35b61066860048036038101906106639190611fe9565b610c00565b005b610684600480360381019061067f9190611f1a565b610c84565b005b60606003805461069590612054565b80601f01602080910402602001604051908101604052809291908181526020018280546106c190612054565b801561070c5780601f106106e35761010080835404028352916020019161070c565b820191905f5260205f20905b8154815290600101906020018083116106ef57829003601f168201915b5050505050905090565b5f80610720610d08565b905061072d818585610d0f565b600191505092915050565b610740610d21565b600e60049054906101000a900460ff1615610790576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610787906120ce565b60405180910390fd5b6001600e60046101000a81548160ff02191690831515021790555043600b819055506001600e5f6101000a81548160ff021916908315150217905550565b5f600254905090565b5f806107e1610d08565b90506107ee858285610da8565b6107f9858585610e3a565b60019150509392505050565b61080d610d21565b80600e60016101000a81548160ff02191690831515021790555050565b5f6012905090565b600e60029054906101000a900460ff1681565b61084d610d21565b5f811161088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088690612136565b60405180910390fd5b80600a8190555050565b6010602052805f5260405f205f915054906101000a900460ff1681565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600e60049054906101000a900460ff1681565b6108fc610d21565b8060068190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610953610d21565b61095c5f610f2a565b565b600a5481565b600e5f9054906101000a900460ff1681565b60065481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109b390612054565b80601f01602080910402602001604051908101604052809291908181526020018280546109df90612054565b8015610a2a5780601f10610a0157610100808354040283529160200191610a2a565b820191905f5260205f20905b815481529060010190602001808311610a0d57829003601f168201915b5050505050905090565b610a3c610d21565b80600e60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f80610a8a610d08565b9050610a97818585610e3a565b600191505092915050565b60075481565b610ab0610d21565b80600e60026101000a81548160ff02191690831515021790555050565b610ad5610d21565b610ade81610fed565b50565b600c5481565b600b5481565b600e60019054906101000a900460ff1681565b610b08610d21565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610b68610d21565b8060078190555050565b60095481565b600d5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c08610d21565b600a8211158015610c1a5750600a8111155b610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c509061219e565b60405180910390fd5b81600881905550806009819055505f600e5f6101000a81548160ff0219169083151502179055505050565b610c8c610d21565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cfc575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610cf39190611f54565b60405180910390fd5b610d0581610f2a565b50565b5f33905090565b610d1c8383836001611277565b505050565b610d29610d08565b73ffffffffffffffffffffffffffffffffffffffff16610d4761097c565b73ffffffffffffffffffffffffffffffffffffffff1614610da657610d6a610d08565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610d9d9190611f54565b60405180910390fd5b565b5f610db38484610b7e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e345781811015610e25578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610e1c939291906121bc565b60405180910390fd5b610e3384848484035f611277565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610eaa575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610ea19190611f54565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f1a575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610f119190611f54565b60405180910390fd5b610f25838383611446565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600e60036101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115611024576110236121f1565b5b6040519080825280602002602001820160405280156110525781602001602082028036833780820191505090505b50905030815f815181106110695761106861221e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561110c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611130919061225f565b816001815181106111445761114361221e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506111a9307f000000000000000000000000000000000000000000000000000000000000000084610d0f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f84600e60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b815260040161122c959493929190612383565b5f604051808303815f87803b158015611243575f80fd5b505af1158015611255573d5f803e3d5ffd5b50505050505f600e60036101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036112e7575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016112de9190611f54565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611357575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161134e9190611f54565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611440578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114379190611dfd565b60405180910390a35b50505050565b5f8111611488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147f9061244b565b60405180910390fd5b600e60049054906101000a900460ff1661154f576114a461097c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061150f57506114e061097c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906124b3565b60405180910390fd5b5b5f600e5f9054906101000a900460ff161561156e5761156d4361198b565b5b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611611575060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561171357600e60029054906101000a900460ff16156116c957600654821115611670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116679061251b565b60405180910390fd5b6007548261167d85610906565b6116879190612566565b11156116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf906125e3565b60405180910390fd5b5b600e60019054906101000a900460ff16156116fb576064600854836116ee9190612601565b6116f8919061266f565b90505b600c5f81548092919061170d9061269f565b91905055505b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156117b6575060105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561184957600e60029054906101000a900460ff161561181657600654821115611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c9061251b565b60405180910390fd5b5b600e60019054906101000a900460ff16156118485760646009548361183b9190612601565b611845919061266f565b90505b5b5f61185330610906565b90505f600a5482101590508080156118785750600e60039054906101000a900460ff16155b80156118d15750600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015611924575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156119335750600d54600c54115b1561194457611943600a54610fed565b5b5f831115611977575f838561195991906126e6565b9050611966873086611a29565b611971878783611a29565b50611983565b611982868686611a29565b5b505050505050565b80600b54036119a957601e600881905550601e600981905550611a26565b806001600b546119b99190612566565b106119d35760146008819055506014600981905550611a25565b806002600b546119e39190612566565b106119fd57600a600881905550600a600981905550611a24565b806003600b54611a0d9190612566565b10611a2357600560088190555060056009819055505b5b5b5b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a79578060025f828254611a6d9190612566565b92505081905550611b47565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611b02578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611af9939291906121bc565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b8e578060025f8282540392505081905550611bd8565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c359190611dfd565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611c79578082015181840152602081019050611c5e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611c9e82611c42565b611ca88185611c4c565b9350611cb8818560208601611c5c565b611cc181611c84565b840191505092915050565b5f6020820190508181035f830152611ce48184611c94565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611d1982611cf0565b9050919050565b611d2981611d0f565b8114611d33575f80fd5b50565b5f81359050611d4481611d20565b92915050565b5f819050919050565b611d5c81611d4a565b8114611d66575f80fd5b50565b5f81359050611d7781611d53565b92915050565b5f8060408385031215611d9357611d92611cec565b5b5f611da085828601611d36565b9250506020611db185828601611d69565b9150509250929050565b5f8115159050919050565b611dcf81611dbb565b82525050565b5f602082019050611de85f830184611dc6565b92915050565b611df781611d4a565b82525050565b5f602082019050611e105f830184611dee565b92915050565b5f805f60608486031215611e2d57611e2c611cec565b5b5f611e3a86828701611d36565b9350506020611e4b86828701611d36565b9250506040611e5c86828701611d69565b9150509250925092565b611e6f81611dbb565b8114611e79575f80fd5b50565b5f81359050611e8a81611e66565b92915050565b5f60208284031215611ea557611ea4611cec565b5b5f611eb284828501611e7c565b91505092915050565b5f60ff82169050919050565b611ed081611ebb565b82525050565b5f602082019050611ee95f830184611ec7565b92915050565b5f60208284031215611f0457611f03611cec565b5b5f611f1184828501611d69565b91505092915050565b5f60208284031215611f2f57611f2e611cec565b5b5f611f3c84828501611d36565b91505092915050565b611f4e81611d0f565b82525050565b5f602082019050611f675f830184611f45565b92915050565b5f8060408385031215611f8357611f82611cec565b5b5f611f9085828601611d36565b9250506020611fa185828601611e7c565b9150509250929050565b5f8060408385031215611fc157611fc0611cec565b5b5f611fce85828601611d36565b9250506020611fdf85828601611d36565b9150509250929050565b5f8060408385031215611fff57611ffe611cec565b5b5f61200c85828601611d69565b925050602061201d85828601611d69565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061206b57607f821691505b60208210810361207e5761207d612027565b5b50919050565b7f54726164696e67206e6f742070617573656400000000000000000000000000005f82015250565b5f6120b8601283611c4c565b91506120c382612084565b602082019050919050565b5f6020820190508181035f8301526120e5816120ac565b9050919050565b7f43616e6e6f742073657420746f207a65726f00000000000000000000000000005f82015250565b5f612120601283611c4c565b915061212b826120ec565b602082019050919050565b5f6020820190508181035f83015261214d81612114565b9050919050565b7f43616e6e6f74207365742074617865732061626f7665203130000000000000005f82015250565b5f612188601983611c4c565b915061219382612154565b602082019050919050565b5f6020820190508181035f8301526121b58161217c565b9050919050565b5f6060820190506121cf5f830186611f45565b6121dc6020830185611dee565b6121e96040830184611dee565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061225981611d20565b92915050565b5f6020828403121561227457612273611cec565b5b5f6122818482850161224b565b91505092915050565b5f819050919050565b5f819050919050565b5f6122b66122b16122ac8461228a565b612293565b611d4a565b9050919050565b6122c68161229c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6122fe81611d0f565b82525050565b5f61230f83836122f5565b60208301905092915050565b5f602082019050919050565b5f612331826122cc565b61233b81856122d6565b9350612346836122e6565b805f5b8381101561237657815161235d8882612304565b97506123688361231b565b925050600181019050612349565b5085935050505092915050565b5f60a0820190506123965f830188611dee565b6123a360208301876122bd565b81810360408301526123b58186612327565b90506123c46060830185611f45565b6123d16080830184611dee565b9695505050505050565b7f45524332303a207472616e73666572206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f612435602683611c4c565b9150612440826123db565b604082019050919050565b5f6020820190508181035f83015261246281612429565b9050919050565b7f54726164696e67206e6f742061637469766520796574000000000000000000005f82015250565b5f61249d601683611c4c565b91506124a882612469565b602082019050919050565b5f6020820190508181035f8301526124ca81612491565b9050919050565b7f4d617820547820696e20656666656374000000000000000000000000000000005f82015250565b5f612505601083611c4c565b9150612510826124d1565b602082019050919050565b5f6020820190508181035f830152612532816124f9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61257082611d4a565b915061257b83611d4a565b925082820190508082111561259357612592612539565b5b92915050565b7f4d61782057616c6c657420496e204566666563740000000000000000000000005f82015250565b5f6125cd601483611c4c565b91506125d882612599565b602082019050919050565b5f6020820190508181035f8301526125fa816125c1565b9050919050565b5f61260b82611d4a565b915061261683611d4a565b925082820261262481611d4a565b9150828204841483151761263b5761263a612539565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61267982611d4a565b915061268483611d4a565b92508261269457612693612642565b5b828204905092915050565b5f6126a982611d4a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126db576126da612539565b5b600182019050919050565b5f6126f082611d4a565b91506126fb83611d4a565b925082820390508181111561271357612712612539565b5b9291505056fea264697066735822122096314a35e3bc39a0156b5612f64330528100ac39bb3838c694409c7ab726f1fc64736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061021a575f3560e01c80638c0b5e2211610123578063bf56b371116100ab578063cc1776d31161007a578063cc1776d3146105e2578063dad6b2f014610600578063dd62ed3e1461061e578063df47e3731461064e578063f2fde38b1461066a5761021a565b8063bf56b3711461056e578063bff51ef81461058c578063c0246668146105aa578063c18bc195146105c65761021a565b8063a9059cbb116100f2578063a9059cbb146104ca578063aa4bde28146104fa578063b256f7b714610518578063b70143c914610534578063bccb4687146105505761021a565b80638c0b5e22146104545780638da5cb5b1461047257806395d89b4114610490578063a6fb5dfd146104ae5761021a565b8063429cead1116101a65780636256d181116101755780636256d181146103c257806370a08231146103de578063715018a61461040e57806382f45cff14610418578063830351ff146104365761021a565b8063429cead11461033857806349bd5a5e146103685780634f7041a51461038657806353371be0146103a45761021a565b806323b872dd116101ed57806323b872dd1461029457806330275744146102c4578063313ce567146102e05780633582ad23146102fe5780633d5369f61461031c5761021a565b806306fdde031461021e578063095ea7b31461023c5780630f15f4c01461026c57806318160ddd14610276575b5f80fd5b610226610686565b6040516102339190611ccc565b60405180910390f35b61025660048036038101906102519190611d7d565b610716565b6040516102639190611dd5565b60405180910390f35b610274610738565b005b61027e6107ce565b60405161028b9190611dfd565b60405180910390f35b6102ae60048036038101906102a99190611e16565b6107d7565b6040516102bb9190611dd5565b60405180910390f35b6102de60048036038101906102d99190611e90565b610805565b005b6102e861082a565b6040516102f59190611ed6565b60405180910390f35b610306610832565b6040516103139190611dd5565b60405180910390f35b61033660048036038101906103319190611eef565b610845565b005b610352600480360381019061034d9190611f1a565b610899565b60405161035f9190611dd5565b60405180910390f35b6103706108b6565b60405161037d9190611f54565b60405180910390f35b61038e6108db565b60405161039b9190611dfd565b60405180910390f35b6103ac6108e1565b6040516103b99190611dd5565b60405180910390f35b6103dc60048036038101906103d79190611eef565b6108f4565b005b6103f860048036038101906103f39190611f1a565b610906565b6040516104059190611dfd565b60405180910390f35b61041661094b565b005b61042061095e565b60405161042d9190611dfd565b60405180910390f35b61043e610964565b60405161044b9190611dd5565b60405180910390f35b61045c610976565b6040516104699190611dfd565b60405180910390f35b61047a61097c565b6040516104879190611f54565b60405180910390f35b6104986109a4565b6040516104a59190611ccc565b60405180910390f35b6104c860048036038101906104c39190611f1a565b610a34565b005b6104e460048036038101906104df9190611d7d565b610a80565b6040516104f19190611dd5565b60405180910390f35b610502610aa2565b60405161050f9190611dfd565b60405180910390f35b610532600480360381019061052d9190611e90565b610aa8565b005b61054e60048036038101906105499190611eef565b610acd565b005b610558610ae1565b6040516105659190611dfd565b60405180910390f35b610576610ae7565b6040516105839190611dfd565b60405180910390f35b610594610aed565b6040516105a19190611dd5565b60405180910390f35b6105c460048036038101906105bf9190611f6d565b610b00565b005b6105e060048036038101906105db9190611eef565b610b60565b005b6105ea610b72565b6040516105f79190611dfd565b60405180910390f35b610608610b78565b6040516106159190611dfd565b60405180910390f35b61063860048036038101906106339190611fab565b610b7e565b6040516106459190611dfd565b60405180910390f35b61066860048036038101906106639190611fe9565b610c00565b005b610684600480360381019061067f9190611f1a565b610c84565b005b60606003805461069590612054565b80601f01602080910402602001604051908101604052809291908181526020018280546106c190612054565b801561070c5780601f106106e35761010080835404028352916020019161070c565b820191905f5260205f20905b8154815290600101906020018083116106ef57829003601f168201915b5050505050905090565b5f80610720610d08565b905061072d818585610d0f565b600191505092915050565b610740610d21565b600e60049054906101000a900460ff1615610790576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610787906120ce565b60405180910390fd5b6001600e60046101000a81548160ff02191690831515021790555043600b819055506001600e5f6101000a81548160ff021916908315150217905550565b5f600254905090565b5f806107e1610d08565b90506107ee858285610da8565b6107f9858585610e3a565b60019150509392505050565b61080d610d21565b80600e60016101000a81548160ff02191690831515021790555050565b5f6012905090565b600e60029054906101000a900460ff1681565b61084d610d21565b5f811161088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088690612136565b60405180910390fd5b80600a8190555050565b6010602052805f5260405f205f915054906101000a900460ff1681565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b600e60049054906101000a900460ff1681565b6108fc610d21565b8060068190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610953610d21565b61095c5f610f2a565b565b600a5481565b600e5f9054906101000a900460ff1681565b60065481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546109b390612054565b80601f01602080910402602001604051908101604052809291908181526020018280546109df90612054565b8015610a2a5780601f10610a0157610100808354040283529160200191610a2a565b820191905f5260205f20905b815481529060010190602001808311610a0d57829003601f168201915b5050505050905090565b610a3c610d21565b80600e60056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f80610a8a610d08565b9050610a97818585610e3a565b600191505092915050565b60075481565b610ab0610d21565b80600e60026101000a81548160ff02191690831515021790555050565b610ad5610d21565b610ade81610fed565b50565b600c5481565b600b5481565b600e60019054906101000a900460ff1681565b610b08610d21565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610b68610d21565b8060078190555050565b60095481565b600d5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c08610d21565b600a8211158015610c1a5750600a8111155b610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c509061219e565b60405180910390fd5b81600881905550806009819055505f600e5f6101000a81548160ff0219169083151502179055505050565b610c8c610d21565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cfc575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610cf39190611f54565b60405180910390fd5b610d0581610f2a565b50565b5f33905090565b610d1c8383836001611277565b505050565b610d29610d08565b73ffffffffffffffffffffffffffffffffffffffff16610d4761097c565b73ffffffffffffffffffffffffffffffffffffffff1614610da657610d6a610d08565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610d9d9190611f54565b60405180910390fd5b565b5f610db38484610b7e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e345781811015610e25578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610e1c939291906121bc565b60405180910390fd5b610e3384848484035f611277565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610eaa575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610ea19190611f54565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f1a575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610f119190611f54565b60405180910390fd5b610f25838383611446565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600e60036101000a81548160ff0219169083151502179055505f600267ffffffffffffffff811115611024576110236121f1565b5b6040519080825280602002602001820160405280156110525781602001602082028036833780820191505090505b50905030815f815181106110695761106861221e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561110c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611130919061225f565b816001815181106111445761114361221e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506111a9307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84610d0f565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f84600e60059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b815260040161122c959493929190612383565b5f604051808303815f87803b158015611243575f80fd5b505af1158015611255573d5f803e3d5ffd5b50505050505f600e60036101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036112e7575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016112de9190611f54565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611357575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161134e9190611f54565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611440578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114379190611dfd565b60405180910390a35b50505050565b5f8111611488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147f9061244b565b60405180910390fd5b600e60049054906101000a900460ff1661154f576114a461097c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061150f57506114e061097c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906124b3565b60405180910390fd5b5b5f600e5f9054906101000a900460ff161561156e5761156d4361198b565b5b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611611575060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561171357600e60029054906101000a900460ff16156116c957600654821115611670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116679061251b565b60405180910390fd5b6007548261167d85610906565b6116879190612566565b11156116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf906125e3565b60405180910390fd5b5b600e60019054906101000a900460ff16156116fb576064600854836116ee9190612601565b6116f8919061266f565b90505b600c5f81548092919061170d9061269f565b91905055505b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156117b6575060105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561184957600e60029054906101000a900460ff161561181657600654821115611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c9061251b565b60405180910390fd5b5b600e60019054906101000a900460ff16156118485760646009548361183b9190612601565b611845919061266f565b90505b5b5f61185330610906565b90505f600a5482101590508080156118785750600e60039054906101000a900460ff16155b80156118d15750600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015611924575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156119335750600d54600c54115b1561194457611943600a54610fed565b5b5f831115611977575f838561195991906126e6565b9050611966873086611a29565b611971878783611a29565b50611983565b611982868686611a29565b5b505050505050565b80600b54036119a957601e600881905550601e600981905550611a26565b806001600b546119b99190612566565b106119d35760146008819055506014600981905550611a25565b806002600b546119e39190612566565b106119fd57600a600881905550600a600981905550611a24565b806003600b54611a0d9190612566565b10611a2357600560088190555060056009819055505b5b5b5b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a79578060025f828254611a6d9190612566565b92505081905550611b47565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611b02578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611af9939291906121bc565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b8e578060025f8282540392505081905550611bd8565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611c359190611dfd565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611c79578082015181840152602081019050611c5e565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611c9e82611c42565b611ca88185611c4c565b9350611cb8818560208601611c5c565b611cc181611c84565b840191505092915050565b5f6020820190508181035f830152611ce48184611c94565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611d1982611cf0565b9050919050565b611d2981611d0f565b8114611d33575f80fd5b50565b5f81359050611d4481611d20565b92915050565b5f819050919050565b611d5c81611d4a565b8114611d66575f80fd5b50565b5f81359050611d7781611d53565b92915050565b5f8060408385031215611d9357611d92611cec565b5b5f611da085828601611d36565b9250506020611db185828601611d69565b9150509250929050565b5f8115159050919050565b611dcf81611dbb565b82525050565b5f602082019050611de85f830184611dc6565b92915050565b611df781611d4a565b82525050565b5f602082019050611e105f830184611dee565b92915050565b5f805f60608486031215611e2d57611e2c611cec565b5b5f611e3a86828701611d36565b9350506020611e4b86828701611d36565b9250506040611e5c86828701611d69565b9150509250925092565b611e6f81611dbb565b8114611e79575f80fd5b50565b5f81359050611e8a81611e66565b92915050565b5f60208284031215611ea557611ea4611cec565b5b5f611eb284828501611e7c565b91505092915050565b5f60ff82169050919050565b611ed081611ebb565b82525050565b5f602082019050611ee95f830184611ec7565b92915050565b5f60208284031215611f0457611f03611cec565b5b5f611f1184828501611d69565b91505092915050565b5f60208284031215611f2f57611f2e611cec565b5b5f611f3c84828501611d36565b91505092915050565b611f4e81611d0f565b82525050565b5f602082019050611f675f830184611f45565b92915050565b5f8060408385031215611f8357611f82611cec565b5b5f611f9085828601611d36565b9250506020611fa185828601611e7c565b9150509250929050565b5f8060408385031215611fc157611fc0611cec565b5b5f611fce85828601611d36565b9250506020611fdf85828601611d36565b9150509250929050565b5f8060408385031215611fff57611ffe611cec565b5b5f61200c85828601611d69565b925050602061201d85828601611d69565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061206b57607f821691505b60208210810361207e5761207d612027565b5b50919050565b7f54726164696e67206e6f742070617573656400000000000000000000000000005f82015250565b5f6120b8601283611c4c565b91506120c382612084565b602082019050919050565b5f6020820190508181035f8301526120e5816120ac565b9050919050565b7f43616e6e6f742073657420746f207a65726f00000000000000000000000000005f82015250565b5f612120601283611c4c565b915061212b826120ec565b602082019050919050565b5f6020820190508181035f83015261214d81612114565b9050919050565b7f43616e6e6f74207365742074617865732061626f7665203130000000000000005f82015250565b5f612188601983611c4c565b915061219382612154565b602082019050919050565b5f6020820190508181035f8301526121b58161217c565b9050919050565b5f6060820190506121cf5f830186611f45565b6121dc6020830185611dee565b6121e96040830184611dee565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061225981611d20565b92915050565b5f6020828403121561227457612273611cec565b5b5f6122818482850161224b565b91505092915050565b5f819050919050565b5f819050919050565b5f6122b66122b16122ac8461228a565b612293565b611d4a565b9050919050565b6122c68161229c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6122fe81611d0f565b82525050565b5f61230f83836122f5565b60208301905092915050565b5f602082019050919050565b5f612331826122cc565b61233b81856122d6565b9350612346836122e6565b805f5b8381101561237657815161235d8882612304565b97506123688361231b565b925050600181019050612349565b5085935050505092915050565b5f60a0820190506123965f830188611dee565b6123a360208301876122bd565b81810360408301526123b58186612327565b90506123c46060830185611f45565b6123d16080830184611dee565b9695505050505050565b7f45524332303a207472616e73666572206d7573742062652067726561746572205f8201527f7468616e20300000000000000000000000000000000000000000000000000000602082015250565b5f612435602683611c4c565b9150612440826123db565b604082019050919050565b5f6020820190508181035f83015261246281612429565b9050919050565b7f54726164696e67206e6f742061637469766520796574000000000000000000005f82015250565b5f61249d601683611c4c565b91506124a882612469565b602082019050919050565b5f6020820190508181035f8301526124ca81612491565b9050919050565b7f4d617820547820696e20656666656374000000000000000000000000000000005f82015250565b5f612505601083611c4c565b9150612510826124d1565b602082019050919050565b5f6020820190508181035f830152612532816124f9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61257082611d4a565b915061257b83611d4a565b925082820190508082111561259357612592612539565b5b92915050565b7f4d61782057616c6c657420496e204566666563740000000000000000000000005f82015250565b5f6125cd601483611c4c565b91506125d882612599565b602082019050919050565b5f6020820190508181035f8301526125fa816125c1565b9050919050565b5f61260b82611d4a565b915061261683611d4a565b925082820261262481611d4a565b9150828204841483151761263b5761263a612539565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61267982611d4a565b915061268483611d4a565b92508261269457612693612642565b5b828204905092915050565b5f6126a982611d4a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126db576126da612539565b5b600182019050919050565b5f6126f082611d4a565b91506126fb83611d4a565b925082820390508181111561271357612712612539565b5b9291505056fea264697066735822122096314a35e3bc39a0156b5612f64330528100ac39bb3838c694409c7ab726f1fc64736f6c63430008180033

Deployed Bytecode Sourcemap

26181:6363:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13557:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15850:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32122:199;;;:::i;:::-;;14659:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16618:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32019:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14510:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26618:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31806:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26787:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26750:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26343:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26682:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31689:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14821:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25284:103;;;:::i;:::-;;26408:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26552:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26273:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24609:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13767:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30868:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15144:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26306:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32329:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32446:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26482:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26450:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26580:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31368:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31532:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26375:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26508:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15389:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30987:373;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25542:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13557:91;13602:13;13635:5;13628:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13557:91;:::o;15850:190::-;15923:4;15940:13;15956:12;:10;:12::i;:::-;15940:28;;15979:31;15988:5;15995:7;16004:5;15979:8;:31::i;:::-;16028:4;16021:11;;;15850:190;;;;:::o;32122:199::-;24495:13;:11;:13::i;:::-;32181:14:::1;;;;;;;;;;;32180:15;32172:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;32246:4;32229:14;;:21;;;;;;;;;;;;;;;;;;32274:12;32261:10;:25;;;;32309:4;32297:9;;:16;;;;;;;;;;;;;;;;;;32122:199::o:0;14659:99::-;14711:7;14738:12;;14731:19;;14659:99;:::o;16618:249::-;16705:4;16722:15;16740:12;:10;:12::i;:::-;16722:30;;16763:37;16779:4;16785:7;16794:5;16763:15;:37::i;:::-;16811:26;16821:4;16827:2;16831:5;16811:9;:26::i;:::-;16855:4;16848:11;;;16618:249;;;;;:::o;32019:95::-;24495:13;:11;:13::i;:::-;32099:7:::1;32084:12;;:22;;;;;;;;;;;;;;;;;;32019:95:::0;:::o;14510:84::-;14559:5;14584:2;14577:9;;14510:84;:::o;26618:32::-;;;;;;;;;;;;;:::o;31806:205::-;24495:13;:11;:13::i;:::-;31933:1:::1;31918:12;:16;31910:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;31991:12;31968:20;:35;;;;31806:205:::0;:::o;26787:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;26750:28::-;;;;;;;;;;;;;:::o;26343:25::-;;;;:::o;26682:34::-;;;;;;;;;;;;;:::o;31689:109::-;24495:13;:11;:13::i;:::-;31780:10:::1;31766:11;:24;;;;31689:109:::0;:::o;14821:118::-;14886:7;14913:9;:18;14923:7;14913:18;;;;;;;;;;;;;;;;14906:25;;14821:118;;;:::o;25284:103::-;24495:13;:11;:13::i;:::-;25349:30:::1;25376:1;25349:18;:30::i;:::-;25284:103::o:0;26408:35::-;;;;:::o;26552:21::-;;;;;;;;;;;;;:::o;26273:26::-;;;;:::o;24609:87::-;24655:7;24682:6;;;;;;;;;;;24675:13;;24609:87;:::o;13767:95::-;13814:13;13847:7;13840:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13767:95;:::o;30868:111::-;24495:13;:11;:13::i;:::-;30958::::1;30946:9;;:25;;;;;;;;;;;;;;;;;;30868:111:::0;:::o;15144:182::-;15213:4;15230:13;15246:12;:10;:12::i;:::-;15230:28;;15269:27;15279:5;15286:2;15290:5;15269:9;:27::i;:::-;15314:4;15307:11;;;15144:182;;;;:::o;26306:30::-;;;;:::o;32329:109::-;24495:13;:11;:13::i;:::-;32417::::1;32401;;:29;;;;;;;;;;;;;;;;;;32329:109:::0;:::o;32446:95::-;24495:13;:11;:13::i;:::-;32513:20:::1;32525:7;32513:11;:20::i;:::-;32446:95:::0;:::o;26482:19::-;;;;:::o;26450:25::-;;;;:::o;26580:31::-;;;;;;;;;;;;;:::o;31368:156::-;24495:13;:11;:13::i;:::-;31505:11:::1;31484:8;:18;31493:8;31484:18;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;31368:156:::0;;:::o;31532:149::-;24495:13;:11;:13::i;:::-;31655:18:::1;31637:15;:36;;;;31532:149:::0;:::o;26375:26::-;;;;:::o;26508:35::-;;;;:::o;15389:142::-;15469:7;15496:11;:18;15508:5;15496:18;;;;;;;;;;;;;;;:27;15515:7;15496:27;;;;;;;;;;;;;;;;15489:34;;15389:142;;;;:::o;30987:373::-;24495:13;:11;:13::i;:::-;31165:2:::1;31144:17;:23;;:51;;;;;31193:2;31171:18;:24;;31144:51;31122:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;31268:17;31259:6;:26;;;;31306:18;31296:7;:28;;;;31347:5;31335:9;;:17;;;;;;;;;;;;;;;;;;30987:373:::0;;:::o;25542:220::-;24495:13;:11;:13::i;:::-;25647:1:::1;25627:22;;:8;:22;;::::0;25623:93:::1;;25701:1;25673:31;;;;;;;;;;;:::i;:::-;;;;;;;;25623:93;25726:28;25745:8;25726:18;:28::i;:::-;25542:220:::0;:::o;4458:98::-;4511:7;4538:10;4531:17;;4458:98;:::o;20677:130::-;20762:37;20771:5;20778:7;20787:5;20794:4;20762:8;:37::i;:::-;20677:130;;;:::o;24774:166::-;24845:12;:10;:12::i;:::-;24834:23;;:7;:5;:7::i;:::-;:23;;;24830:103;;24908:12;:10;:12::i;:::-;24881:40;;;;;;;;;;;:::i;:::-;;;;;;;;24830:103;24774:166::o;22393:487::-;22493:24;22520:25;22530:5;22537:7;22520:9;:25::i;:::-;22493:52;;22580:17;22560:16;:37;22556:317;;22637:5;22618:16;:24;22614:132;;;22697:7;22706:16;22724:5;22670:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22614:132;22789:57;22798:5;22805:7;22833:5;22814:16;:24;22840:5;22789:8;:57::i;:::-;22556:317;22482:398;22393:487;;;:::o;17252:308::-;17352:1;17336:18;;:4;:18;;;17332:88;;17405:1;17378:30;;;;;;;;;;;:::i;:::-;;;;;;;;17332:88;17448:1;17434:16;;:2;:16;;;17430:88;;17503:1;17474:32;;;;;;;;;;;:::i;:::-;;;;;;;;17430:88;17528:24;17536:4;17542:2;17546:5;17528:7;:24::i;:::-;17252:308;;;:::o;25922:191::-;25996:16;26015:6;;;;;;;;;;;25996:25;;26041:8;26032:6;;:17;;;;;;;;;;;;;;;;;;26096:8;26065:40;;26086:8;26065:40;;;;;;;;;;;;25985:128;25922:191;:::o;29728:673::-;26885:4;26870:12;;:19;;;;;;;;;;;;;;;;;;29872:21:::1;29910:1;29896:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29872:40;;29941:4;29923;29928:1;29923:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;29967:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29957:4;29962:1;29957:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;30002:122;30033:4;30061:15;30092:21;30002:8;:122::i;:::-;30163:15;:66;;;30244:21;30280:1;30324:4;30343:9;;;;;;;;;;;30367:15;30163:230;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29801:600;26927:5:::0;26912:12;;:20;;;;;;;;;;;;;;;;;;29728:673;:::o;21658:443::-;21788:1;21771:19;;:5;:19;;;21767:91;;21843:1;21814:32;;;;;;;;;;;:::i;:::-;;;;;;;;21767:91;21891:1;21872:21;;:7;:21;;;21868:92;;21945:1;21917:31;;;;;;;;;;;:::i;:::-;;;;;;;;21868:92;22000:5;21970:11;:18;21982:5;21970:18;;;;;;;;;;;;;;;:27;21989:7;21970:27;;;;;;;;;;;;;;;:35;;;;22020:9;22016:78;;;22067:7;22051:31;;22060:5;22051:31;;;22076:5;22051:31;;;;;;:::i;:::-;;;;;;;;22016:78;21658:443;;;;:::o;27857:1863::-;27996:1;27987:6;:10;27979:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28058:14;;;;;;;;;;;28053:115;;28105:7;:5;:7::i;:::-;28097:15;;:4;:15;;;:32;;;;28122:7;:5;:7::i;:::-;28116:13;;:2;:13;;;28097:32;28089:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28053:115;28180:17;28214:9;;;;;;;;;;;28210:62;;;28240:20;28247:12;28240:6;:20::i;:::-;28210:62;28296:13;;;;;;;;;;;28288:21;;:4;:21;;;:38;;;;;28314:8;:12;28323:2;28314:12;;;;;;;;;;;;;;;;;;;;;;;;;28313:13;28288:38;28284:455;;;28347:13;;;;;;;;;;;28343:258;;;28399:11;;28389:6;:21;;28381:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;28506:15;;28496:6;28480:13;28490:2;28480:9;:13::i;:::-;:22;;;;:::i;:::-;:41;;28450:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;28343:258;28621:12;;;;;;;;;;;28617:88;;;28686:3;28676:6;;28667;:15;;;;:::i;:::-;28666:23;;;;:::i;:::-;28654:35;;28617:88;28721:4;;:6;;;;;;;;;:::i;:::-;;;;;;28284:455;28761:13;;;;;;;;;;;28755:19;;:2;:19;;;:38;;;;;28779:8;:14;28788:4;28779:14;;;;;;;;;;;;;;;;;;;;;;;;;28778:15;28755:38;28751:279;;;28814:13;;;;;;;;;;;28810:104;;;28866:11;;28856:6;:21;;28848:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;28810:104;28934:12;;;;;;;;;;;28930:89;;;29000:3;28989:7;;28980:6;:16;;;;:::i;:::-;28979:24;;;;:::i;:::-;28967:36;;28930:89;28751:279;29042:28;29073:24;29091:4;29073:9;:24::i;:::-;29042:55;;29110:24;29161:20;;29137;:44;;29110:71;;29212:19;:49;;;;;29249:12;;;;;;;;;;;29248:13;29212:49;:87;;;;;29286:13;;;;;;;;;;;29278:21;;:4;:21;;;;29212:87;:119;;;;;29317:8;:14;29326:4;29317:14;;;;;;;;;;;;;;;;;;;;;;;;;29316:15;29212:119;:158;;;;;29355:15;;29348:4;;:22;29212:158;29194:248;;;29397:33;29409:20;;29397:11;:33::i;:::-;29194:248;29470:1;29458:9;:13;29454:259;;;29488:18;29518:9;29509:6;:18;;;;:::i;:::-;29488:39;;29542:45;29556:4;29570;29577:9;29542:13;:45::i;:::-;29602:35;29616:4;29622:2;29626:10;29602:13;:35::i;:::-;29473:176;29454:259;;;29670:31;29684:4;29690:2;29694:6;29670:13;:31::i;:::-;29454:259;27968:1752;;;27857:1863;;;:::o;30409:451::-;30479:6;30465:10;;:20;30461:392;;30511:2;30502:6;:11;;;;30538:2;30528:7;:12;;;;30461:392;;;30580:6;30575:1;30562:10;;:14;;;;:::i;:::-;:24;30558:295;;30612:2;30603:6;:11;;;;30639:2;30629:7;:12;;;;30558:295;;;30681:6;30676:1;30663:10;;:14;;;;:::i;:::-;:24;30659:194;;30713:2;30704:6;:11;;;;30740:2;30730:7;:12;;;;30659:194;;;30782:6;30777:1;30764:10;;:14;;;;:::i;:::-;:24;30760:93;;30814:1;30805:6;:10;;;;30840:1;30830:7;:11;;;;30760:93;30659:194;30558:295;30461:392;30409:451;:::o;17884:1135::-;17990:1;17974:18;;:4;:18;;;17970:552;;18128:5;18112:12;;:21;;;;;;;:::i;:::-;;;;;;;;17970:552;;;18166:19;18188:9;:15;18198:4;18188:15;;;;;;;;;;;;;;;;18166:37;;18236:5;18222:11;:19;18218:117;;;18294:4;18300:11;18313:5;18269:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;18218:117;18490:5;18476:11;:19;18458:9;:15;18468:4;18458:15;;;;;;;;;;;;;;;:37;;;;18151:371;17970:552;18552:1;18538:16;;:2;:16;;;18534:435;;18720:5;18704:12;;:21;;;;;;;;;;;18534:435;;;18937:5;18920:9;:13;18930:2;18920:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;18534:435;19001:2;18986:25;;18995:4;18986:25;;;19005:5;18986:25;;;;;;:::i;:::-;;;;;;;;17884:1135;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:116::-;4493:21;4508:5;4493:21;:::i;:::-;4486:5;4483:32;4473:60;;4529:1;4526;4519:12;4473:60;4423:116;:::o;4545:133::-;4588:5;4626:6;4613:20;4604:29;;4642:30;4666:5;4642:30;:::i;:::-;4545:133;;;;:::o;4684:323::-;4740:6;4789:2;4777:9;4768:7;4764:23;4760:32;4757:119;;;4795:79;;:::i;:::-;4757:119;4915:1;4940:50;4982:7;4973:6;4962:9;4958:22;4940:50;:::i;:::-;4930:60;;4886:114;4684:323;;;;:::o;5013:86::-;5048:7;5088:4;5081:5;5077:16;5066:27;;5013:86;;;:::o;5105:112::-;5188:22;5204:5;5188:22;:::i;:::-;5183:3;5176:35;5105:112;;:::o;5223:214::-;5312:4;5350:2;5339:9;5335:18;5327:26;;5363:67;5427:1;5416:9;5412:17;5403:6;5363:67;:::i;:::-;5223:214;;;;:::o;5443:329::-;5502:6;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5443:329;;;;:::o;5778:::-;5837:6;5886:2;5874:9;5865:7;5861:23;5857:32;5854:119;;;5892:79;;:::i;:::-;5854:119;6012:1;6037:53;6082:7;6073:6;6062:9;6058:22;6037:53;:::i;:::-;6027:63;;5983:117;5778:329;;;;:::o;6113:118::-;6200:24;6218:5;6200:24;:::i;:::-;6195:3;6188:37;6113:118;;:::o;6237:222::-;6330:4;6368:2;6357:9;6353:18;6345:26;;6381:71;6449:1;6438:9;6434:17;6425:6;6381:71;:::i;:::-;6237:222;;;;:::o;6465:468::-;6530:6;6538;6587:2;6575:9;6566:7;6562:23;6558:32;6555:119;;;6593:79;;:::i;:::-;6555:119;6713:1;6738:53;6783:7;6774:6;6763:9;6759:22;6738:53;:::i;:::-;6728:63;;6684:117;6840:2;6866:50;6908:7;6899:6;6888:9;6884:22;6866:50;:::i;:::-;6856:60;;6811:115;6465:468;;;;;:::o;6939:474::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:53;7388:7;7379:6;7368:9;7364:22;7343:53;:::i;:::-;7333:63;;7288:118;6939:474;;;;;:::o;7419:::-;7487:6;7495;7544:2;7532:9;7523:7;7519:23;7515:32;7512:119;;;7550:79;;:::i;:::-;7512:119;7670:1;7695:53;7740:7;7731:6;7720:9;7716:22;7695:53;:::i;:::-;7685:63;;7641:117;7797:2;7823:53;7868:7;7859:6;7848:9;7844:22;7823:53;:::i;:::-;7813:63;;7768:118;7419:474;;;;;:::o;7899:180::-;7947:77;7944:1;7937:88;8044:4;8041:1;8034:15;8068:4;8065:1;8058:15;8085:320;8129:6;8166:1;8160:4;8156:12;8146:22;;8213:1;8207:4;8203:12;8234:18;8224:81;;8290:4;8282:6;8278:17;8268:27;;8224:81;8352:2;8344:6;8341:14;8321:18;8318:38;8315:84;;8371:18;;:::i;:::-;8315:84;8136:269;8085:320;;;:::o;8411:168::-;8551:20;8547:1;8539:6;8535:14;8528:44;8411:168;:::o;8585:366::-;8727:3;8748:67;8812:2;8807:3;8748:67;:::i;:::-;8741:74;;8824:93;8913:3;8824:93;:::i;:::-;8942:2;8937:3;8933:12;8926:19;;8585:366;;;:::o;8957:419::-;9123:4;9161:2;9150:9;9146:18;9138:26;;9210:9;9204:4;9200:20;9196:1;9185:9;9181:17;9174:47;9238:131;9364:4;9238:131;:::i;:::-;9230:139;;8957:419;;;:::o;9382:168::-;9522:20;9518:1;9510:6;9506:14;9499:44;9382:168;:::o;9556:366::-;9698:3;9719:67;9783:2;9778:3;9719:67;:::i;:::-;9712:74;;9795:93;9884:3;9795:93;:::i;:::-;9913:2;9908:3;9904:12;9897:19;;9556:366;;;:::o;9928:419::-;10094:4;10132:2;10121:9;10117:18;10109:26;;10181:9;10175:4;10171:20;10167:1;10156:9;10152:17;10145:47;10209:131;10335:4;10209:131;:::i;:::-;10201:139;;9928:419;;;:::o;10353:175::-;10493:27;10489:1;10481:6;10477:14;10470:51;10353:175;:::o;10534:366::-;10676:3;10697:67;10761:2;10756:3;10697:67;:::i;:::-;10690:74;;10773:93;10862:3;10773:93;:::i;:::-;10891:2;10886:3;10882:12;10875:19;;10534:366;;;:::o;10906:419::-;11072:4;11110:2;11099:9;11095:18;11087:26;;11159:9;11153:4;11149:20;11145:1;11134:9;11130:17;11123:47;11187:131;11313:4;11187:131;:::i;:::-;11179:139;;10906:419;;;:::o;11331:442::-;11480:4;11518:2;11507:9;11503:18;11495:26;;11531:71;11599:1;11588:9;11584:17;11575:6;11531:71;:::i;:::-;11612:72;11680:2;11669:9;11665:18;11656:6;11612:72;:::i;:::-;11694;11762:2;11751:9;11747:18;11738:6;11694:72;:::i;:::-;11331:442;;;;;;:::o;11779:180::-;11827:77;11824:1;11817:88;11924:4;11921:1;11914:15;11948:4;11945:1;11938:15;11965:180;12013:77;12010:1;12003:88;12110:4;12107:1;12100:15;12134:4;12131:1;12124:15;12151:143;12208:5;12239:6;12233:13;12224:22;;12255:33;12282:5;12255:33;:::i;:::-;12151:143;;;;:::o;12300:351::-;12370:6;12419:2;12407:9;12398:7;12394:23;12390:32;12387:119;;;12425:79;;:::i;:::-;12387:119;12545:1;12570:64;12626:7;12617:6;12606:9;12602:22;12570:64;:::i;:::-;12560:74;;12516:128;12300:351;;;;:::o;12657:85::-;12702:7;12731:5;12720:16;;12657:85;;;:::o;12748:60::-;12776:3;12797:5;12790:12;;12748:60;;;:::o;12814:158::-;12872:9;12905:61;12923:42;12932:32;12958:5;12932:32;:::i;:::-;12923:42;:::i;:::-;12905:61;:::i;:::-;12892:74;;12814:158;;;:::o;12978:147::-;13073:45;13112:5;13073:45;:::i;:::-;13068:3;13061:58;12978:147;;:::o;13131:114::-;13198:6;13232:5;13226:12;13216:22;;13131:114;;;:::o;13251:184::-;13350:11;13384:6;13379:3;13372:19;13424:4;13419:3;13415:14;13400:29;;13251:184;;;;:::o;13441:132::-;13508:4;13531:3;13523:11;;13561:4;13556:3;13552:14;13544:22;;13441:132;;;:::o;13579:108::-;13656:24;13674:5;13656:24;:::i;:::-;13651:3;13644:37;13579:108;;:::o;13693:179::-;13762:10;13783:46;13825:3;13817:6;13783:46;:::i;:::-;13861:4;13856:3;13852:14;13838:28;;13693:179;;;;:::o;13878:113::-;13948:4;13980;13975:3;13971:14;13963:22;;13878:113;;;:::o;14027:732::-;14146:3;14175:54;14223:5;14175:54;:::i;:::-;14245:86;14324:6;14319:3;14245:86;:::i;:::-;14238:93;;14355:56;14405:5;14355:56;:::i;:::-;14434:7;14465:1;14450:284;14475:6;14472:1;14469:13;14450:284;;;14551:6;14545:13;14578:63;14637:3;14622:13;14578:63;:::i;:::-;14571:70;;14664:60;14717:6;14664:60;:::i;:::-;14654:70;;14510:224;14497:1;14494;14490:9;14485:14;;14450:284;;;14454:14;14750:3;14743:10;;14151:608;;;14027:732;;;;:::o;14765:831::-;15028:4;15066:3;15055:9;15051:19;15043:27;;15080:71;15148:1;15137:9;15133:17;15124:6;15080:71;:::i;:::-;15161:80;15237:2;15226:9;15222:18;15213:6;15161:80;:::i;:::-;15288:9;15282:4;15278:20;15273:2;15262:9;15258:18;15251:48;15316:108;15419:4;15410:6;15316:108;:::i;:::-;15308:116;;15434:72;15502:2;15491:9;15487:18;15478:6;15434:72;:::i;:::-;15516:73;15584:3;15573:9;15569:19;15560:6;15516:73;:::i;:::-;14765:831;;;;;;;;:::o;15602:225::-;15742:34;15738:1;15730:6;15726:14;15719:58;15811:8;15806:2;15798:6;15794:15;15787:33;15602:225;:::o;15833:366::-;15975:3;15996:67;16060:2;16055:3;15996:67;:::i;:::-;15989:74;;16072:93;16161:3;16072:93;:::i;:::-;16190:2;16185:3;16181:12;16174:19;;15833:366;;;:::o;16205:419::-;16371:4;16409:2;16398:9;16394:18;16386:26;;16458:9;16452:4;16448:20;16444:1;16433:9;16429:17;16422:47;16486:131;16612:4;16486:131;:::i;:::-;16478:139;;16205:419;;;:::o;16630:172::-;16770:24;16766:1;16758:6;16754:14;16747:48;16630:172;:::o;16808:366::-;16950:3;16971:67;17035:2;17030:3;16971:67;:::i;:::-;16964:74;;17047:93;17136:3;17047:93;:::i;:::-;17165:2;17160:3;17156:12;17149:19;;16808:366;;;:::o;17180:419::-;17346:4;17384:2;17373:9;17369:18;17361:26;;17433:9;17427:4;17423:20;17419:1;17408:9;17404:17;17397:47;17461:131;17587:4;17461:131;:::i;:::-;17453:139;;17180:419;;;:::o;17605:166::-;17745:18;17741:1;17733:6;17729:14;17722:42;17605:166;:::o;17777:366::-;17919:3;17940:67;18004:2;17999:3;17940:67;:::i;:::-;17933:74;;18016:93;18105:3;18016:93;:::i;:::-;18134:2;18129:3;18125:12;18118:19;;17777:366;;;:::o;18149:419::-;18315:4;18353:2;18342:9;18338:18;18330:26;;18402:9;18396:4;18392:20;18388:1;18377:9;18373:17;18366:47;18430:131;18556:4;18430:131;:::i;:::-;18422:139;;18149:419;;;:::o;18574:180::-;18622:77;18619:1;18612:88;18719:4;18716:1;18709:15;18743:4;18740:1;18733:15;18760:191;18800:3;18819:20;18837:1;18819:20;:::i;:::-;18814:25;;18853:20;18871:1;18853:20;:::i;:::-;18848:25;;18896:1;18893;18889:9;18882:16;;18917:3;18914:1;18911:10;18908:36;;;18924:18;;:::i;:::-;18908:36;18760:191;;;;:::o;18957:170::-;19097:22;19093:1;19085:6;19081:14;19074:46;18957:170;:::o;19133:366::-;19275:3;19296:67;19360:2;19355:3;19296:67;:::i;:::-;19289:74;;19372:93;19461:3;19372:93;:::i;:::-;19490:2;19485:3;19481:12;19474:19;;19133:366;;;:::o;19505:419::-;19671:4;19709:2;19698:9;19694:18;19686:26;;19758:9;19752:4;19748:20;19744:1;19733:9;19729:17;19722:47;19786:131;19912:4;19786:131;:::i;:::-;19778:139;;19505:419;;;:::o;19930:410::-;19970:7;19993:20;20011:1;19993:20;:::i;:::-;19988:25;;20027:20;20045:1;20027:20;:::i;:::-;20022:25;;20082:1;20079;20075:9;20104:30;20122:11;20104:30;:::i;:::-;20093:41;;20283:1;20274:7;20270:15;20267:1;20264:22;20244:1;20237:9;20217:83;20194:139;;20313:18;;:::i;:::-;20194:139;19978:362;19930:410;;;;:::o;20346:180::-;20394:77;20391:1;20384:88;20491:4;20488:1;20481:15;20515:4;20512:1;20505:15;20532:185;20572:1;20589:20;20607:1;20589:20;:::i;:::-;20584:25;;20623:20;20641:1;20623:20;:::i;:::-;20618:25;;20662:1;20652:35;;20667:18;;:::i;:::-;20652:35;20709:1;20706;20702:9;20697:14;;20532:185;;;;:::o;20723:233::-;20762:3;20785:24;20803:5;20785:24;:::i;:::-;20776:33;;20831:66;20824:5;20821:77;20818:103;;20901:18;;:::i;:::-;20818:103;20948:1;20941:5;20937:13;20930:20;;20723:233;;;:::o;20962:194::-;21002:4;21022:20;21040:1;21022:20;:::i;:::-;21017:25;;21056:20;21074:1;21056:20;:::i;:::-;21051:25;;21100:1;21097;21093:9;21085:17;;21124:1;21118:4;21115:11;21112:37;;;21129:18;;:::i;:::-;21112:37;20962:194;;;;:::o

Swarm Source

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