ETH Price: $2,488.65 (+3.53%)
 

Overview

Max Total Supply

1,000,000,000 STPR

Holders

383

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 STPR

Value
$0.00
0xcc10e90f0ac85149e4e76ffe3bbe65f3a1a912e3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-17
*/

// Sources flattened with hardhat v2.19.5 https://hardhat.org

// SPDX-License-Identifier: MIT

// File contracts/interfaces/IERC20.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity 0.8.24;

/**
 * @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 contracts/interfaces/IERC20Metadata.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity 0.8.24;
/**
 * @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 contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

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

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


// File contracts/interfaces/IUniswapV2Router02.sol

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

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


// File contracts/interfaces/draft-IERC6093.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity 0.8.24;

/**
 * @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 contracts/libraries/Context.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity 0.8.24;

/**
 * @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 contracts/libraries/ERC20.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity 0.8.24;
/**
 * @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 contracts/libraries/Ownable.sol

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity 0.8.24;
/**
 * @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 contracts/TaxHelper.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.24;
/// @title TaxHelperUniswapV2
/// @author Boka
/// @notice Contract to convert tokens to ETH and divide among tax wallets using UniswapV2
/// @dev Can be used with multiple tokens
contract TaxHelperUniswapV2 is Ownable {
    address public routerAddress;
    mapping (address => bool) public approvedTokens;

    event ApproveToken(address token, bool value);
    event RouterAddressSet(address routerAddress);
    event ConvertedToEth(address token, uint256 amount, address[] walletsWithTax, uint256[] percentages, uint256 DENOMINATOR, uint256 ethBalance);
    event SentEth(address wallet, uint256 amount);

    error TokenNotApproved(address sender);
    error ZeroAddress();

    constructor(address initialOwner, address _routerAddress)
        Ownable(initialOwner)
    {
        setRouterAddress(_routerAddress);
    }

    /// @notice Approve a token to use this contract
    /// @param token the token to approve
    /// @param value true or false
    function approveToken(address token, bool value) public onlyOwner {
        approvedTokens[token] = value;
        emit ApproveToken(token, value);
    }

    /// @notice Convert a token to ETH and divide among tax wallets
    /// @dev only approve tokens or the owner may call this function
    /// @param token the token to convert
    /// @param walletsWithTax the wallets to divide the ETH among
    /// @param percentages the percentages to divide the ETH among
    /// @param DENOMINATOR the denominator to divide the percentages by
    function convertToEthAndSend(address token, address[] memory walletsWithTax, uint256[] memory percentages, uint256 DENOMINATOR, uint256 maxThresholdSell) external {   
        if(!approvedTokens[msg.sender] && msg.sender != owner()) revert TokenNotApproved(msg.sender);
        
        IERC20 tokenContract = IERC20(token);
        uint256 balance = tokenContract.balanceOf(address(this));
        if(balance > maxThresholdSell) {
            balance = maxThresholdSell;
        }
        IUniswapV2Router02 uniswapRouter = IUniswapV2Router02(routerAddress);
        tokenContract.approve(address(uniswapRouter), balance);
        address[] memory path = new address[](2);
        path[0] = token;
        path[1] = uniswapRouter.WETH();
        if(balance > 0) {
            uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                balance,
                0, // accept any amount of ETH
                path,
                address(this),
                block.timestamp
            ); 

            uint256 ethBalance = address(this).balance;
            emit ConvertedToEth(token, balance, walletsWithTax, percentages, DENOMINATOR, ethBalance);
            for(uint256 i = 0; i < walletsWithTax.length; ++i) {
                uint256 amountToSend = ethBalance * percentages[i] / DENOMINATOR;
                payable(walletsWithTax[i]).transfer(amountToSend);
                emit SentEth(walletsWithTax[i], amountToSend);
            }
        }
        
    } 

    /// @notice Set the router address
    /// @param _routerAddress the address of the UniswapV2Router02
    function setRouterAddress(address _routerAddress) public onlyOwner {
        if(_routerAddress == address(0)) revert ZeroAddress();
        routerAddress = _routerAddress;
        emit RouterAddressSet(_routerAddress);
    }

    /// @notice Withdraw the ETH from the contract
    function withdraw() public onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /// @notice Receive ETH
    receive() payable external {
    }
}


// File contracts/interfaces/ITaxHelper.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.24;

interface ITaxHelper {
    function convertToEthAndSend(address token, address[] memory walletsWithTax, uint256[] memory percentages, uint256 DENOMINATOR, uint256 maxThresholdSell) external;
}


// File contracts/Token.sol

// Original license: SPDX_License_Identifier: MIT

// Website: https://strike-protocol.com/
// Twitter: https://twitter.com/StrikeProtocol1
// TG: https://t.me/StrikeProtocol

pragma solidity 0.8.24;



/// @title Token
/// @author Boka
/// @notice ERC20 token with tax functionality
contract Token is ERC20, Ownable {

    Tax[] public taxes;
    uint256 public taxLength;
    Settings public settings;

    struct Settings {
        uint256 threshold;
        uint256 maxThresholdSell;
        uint256 maxTax;
        uint256 maxTxAmount;
        uint256 minMaxTxAmount;
        uint256 maxWalletAmount;
        uint256 minMaxWalletAmount;
        bool taxEnabled;
        bool maxTxAmountEnabled;
        bool maxWalletAmountEnabled;
    }
 
    struct Fee {
        uint256 buy;
        uint256 sell;
        uint256 transfer;
    }

    struct Tax {
        string name;
        Fee fee;
        address wallet;
        bool withdrawAsGas;
    }

    uint256 public DENOMINATOR = 10000;

    uint8 internal taxReentrancy = 1;

    mapping (address => bool) public taxWhitelist;
    mapping (address => bool) public maxWalletWhitelist;
    mapping (address => bool) public maxTxWhitelist;
    mapping (address => bool) public lpTokens;
    mapping (address => bool) public taxesWithBalance;
    mapping (address => uint256) public taxBalances;
    address[] public walletsWithTax;

    address public taxHelper;

    event UpdatedTaxes(Tax[] _taxes, bool cleanWallets);
    event TaxTransferred(address indexed sender, uint256 fee, address indexed wallet, bool isBuy, bool isSell, bool isTransfer, bool withdrawAsGas);
    event TaxWithdrawn(uint256 amount, address[] walletsWithTax, uint256[] percentages);
    event SetTaxHelper(address _taxHelper);
    event SetDenominator(uint256 _denominator);
    event SetTaxWhitelist(address _address, bool _value);
    event SetLPToken(address _address, bool _value);
    event SetTaxEnabled(bool _value);
    event SetThreshold(uint256 _threshold);
    event SetMaxTxAmount(uint256 _maxTxAmount);
    event SetMaxWalletAmount(uint256 _maxWalletAmount);
    event SetMaxWalletWhitelist(address _address, bool _value);
    event SetMaxTxWhitelist(address _address, bool _value);
    event SetMaxTxEnabled(bool _value);
    event SetMaxWalletEnabled(bool _value);
    event SetMaxThresholdSell(uint256 _maxThresholdSell);

    error ExceedsMaxTax();
    error ZeroAddressWallet();
    error ZeroAddress();
    error ExceedsMaxTxAmount();
    error ExceedsMaxWalletAmount();
    error UnderMinMaxTxAmount();
    error UnderMinMaxWalletAmount();


    constructor(
        string memory name_, 
        string memory symbol_, 
        uint256 totalSupply_, 
        address initialOwner,
        uint256 _maxTax,
        uint256 _minMaxTxAmount,
        uint256 _minMaxWalletAmount
        ) payable
        ERC20(name_, symbol_)
        Ownable(initialOwner)
    {
        _mint(initialOwner, totalSupply_);
        settings.taxEnabled = false;
        settings.maxTxAmountEnabled = false;
        settings.maxWalletAmountEnabled = false;
        settings.maxTax = _maxTax;
        settings.minMaxTxAmount = _minMaxTxAmount;
        settings.minMaxWalletAmount = _minMaxWalletAmount;
    }

    /// @notice enable the maximum transaction amount
    /// @param _value true or false
    function setMaxTxEnabled(bool _value) payable public onlyOwner {
        settings.maxTxAmountEnabled = _value;
        emit SetMaxTxEnabled(_value);
    }

    /// @notice enable the maximum wallet amount
    /// @param _value true or false
    function setMaxWalletEnabled(bool _value) payable public onlyOwner {
        settings.maxWalletAmountEnabled = _value;
        emit SetMaxWalletEnabled(_value);
    }

    /// @notice set the maximum transaction amount
    /// @param _maxTxAmount the maximum transaction amount
    function setMaxTxAmount(uint256 _maxTxAmount) payable public onlyOwner {
        if(_maxTxAmount < settings.minMaxTxAmount) revert UnderMinMaxTxAmount();
        settings.maxTxAmount = _maxTxAmount;
        emit SetMaxTxAmount(_maxTxAmount);
    }

    /// @notice set the maximum wallet amount
    /// @param _maxWalletAmount the maximum wallet amount
    function setMaxWalletAmount(uint256 _maxWalletAmount) payable public onlyOwner {
        if(_maxWalletAmount < settings.minMaxWalletAmount) revert UnderMinMaxWalletAmount();
        settings.maxWalletAmount = _maxWalletAmount;
        emit SetMaxWalletAmount(_maxWalletAmount);
    }

    /// @notice set the minimum balance to trigger the tax conversion
    /// @param _threshold the minimum balance to trigger the tax conversion
    function setThreshold(uint256 _threshold) payable public onlyOwner {
        settings.threshold = _threshold;
        emit SetThreshold(_threshold);
    }

    /// @notice set the maximum sell amount when the threshold is triggered to convert the tax
    /// @param _maxThresholdSell the maximum sell amount
    function setMaxThresholdSell(uint256 _maxThresholdSell) payable public onlyOwner {
        settings.maxThresholdSell = _maxThresholdSell;
        emit SetMaxThresholdSell(_maxThresholdSell);
    }

    /// @notice set the taxEnabled flag
    /// @param _value sets the taxEnabled flag to true or false
    function setTaxEnabled(bool _value) payable public onlyOwner {
        settings.taxEnabled = _value;
        emit SetTaxEnabled(_value);
    }

    /// @notice set the maxWalletWhitelist flag
    /// @param _address the address to adjust the maxWalletWhitelist
    /// @param _value true or false
    function setMaxWalletWhitelist(address _address, bool _value) payable public onlyOwner {
        maxWalletWhitelist[_address] = _value;
        emit SetMaxWalletWhitelist(_address, _value);
    }

    /// @notice set the maxTxWhitelist flag
    /// @param _address the address to adjust the maxTxWhitelist
    /// @param _value true or false
    function setMaxTxWhitelist(address _address, bool _value) payable public onlyOwner {
        maxTxWhitelist[_address] = _value;
        emit SetMaxTxWhitelist(_address, _value);
    }

    /// @notice set the taxWhitelist flag
    /// @param _address the address to adjust the taxWhitelist
    /// @param _value true or false 
    function setTaxWhitelist(address _address, bool _value) payable public onlyOwner {
        taxWhitelist[_address] = _value;
        emit SetTaxWhitelist(_address, _value);
    }

    /// @notice set whether an LP token is used to trigger the tax
    /// @param _address the address of the LP token
    /// @param _value true or false
    function setLPToken(address _address, bool _value) payable public onlyOwner {
        if(_address == address(0)) revert ZeroAddress();
        lpTokens[_address] = _value;
        emit SetLPToken(_address, _value);
    }

    /// @notice set the taxHelper address
    /// @param _taxHelper the address of the taxHelper contract
    function setTaxHelper(address _taxHelper) payable public onlyOwner {
        if(_taxHelper == address(0)) revert ZeroAddress();
        taxHelper = _taxHelper;
        emit SetTaxHelper(_taxHelper);
    }

    /// @notice set the denominator to use for the tax calculation
    /// @param _denominator the denominator to use for the tax calculation
    function setDenominator(uint256 _denominator) payable public onlyOwner {
        DENOMINATOR = _denominator;
        emit SetDenominator(_denominator);
    }

    /// @notice update the taxes for the token
    /// @dev if cleanWallets is true, the tax balances will be converted to ETH. This is useful if the taxes are updated and have different wallet addresses
    /// @param _taxes the new taxes to apply
    /// @param cleanWallets if true, the tax balances will be converted to ETH
    function updateTaxes(Tax[] calldata _taxes, bool cleanWallets) payable public onlyOwner {
        if(cleanWallets) {
            _convertTaxToEth();
        }
        delete taxes;

        uint256 totalTaxBuy;
        uint256 totalTaxSell;
        uint256 totalTaxTransfer;
        for(uint i = 0; i < _taxes.length; ++i) {
            if(_taxes[i].wallet == address(0)) revert ZeroAddressWallet();
            taxes.push(_taxes[i]);
            totalTaxBuy += _taxes[i].fee.buy;
            totalTaxSell += _taxes[i].fee.sell;
            totalTaxTransfer += _taxes[i].fee.transfer;
        }
        taxLength = _taxes.length;
        if(totalTaxBuy > settings.maxTax || totalTaxSell > settings.maxTax || totalTaxTransfer > settings.maxTax) {
            revert ExceedsMaxTax();
        }

        emit UpdatedTaxes(_taxes, cleanWallets);
    }

    /// @notice check the maximum transaction amount
    /// @param from the address the tokens are being transferred from
    /// @param to the address the tokens are being transferred to
    /// @param value the amount of tokens being transferred
    /// @param isBuy true if the transaction is a buy
    /// @param isSell true if the transaction is a sell
    function checkMaxTxAmount(address from, address to, uint256 value, bool isBuy, bool isSell) internal view {
        if(settings.maxTxAmountEnabled == false) {
            return;
        }
        if(isBuy) {
            if(maxTxWhitelist[to]) {
                return;
            }
        }
        if(isSell) {
            if(maxTxWhitelist[from]) {
                return;
            }
        }
        if(!isSell && !isBuy) {
            return;
        }
        if(value > settings.maxTxAmount) {
            revert ExceedsMaxTxAmount();
        }
    }

    /// @notice check the maximum wallet amount
    /// @param to the address the tokens are being transferred to
    /// @param value the amount of tokens being transferred
    function checkMaxWalletAmount(address to, uint256 value) internal view {
        if(settings.maxWalletAmountEnabled == false) {
            return;
        }
        if(maxWalletWhitelist[to]) {
            return;
        }
        if(balanceOf(to) + value > settings.maxWalletAmount) {
            revert ExceedsMaxWalletAmount();
        }
    }

    /// @notice handle the tax for a transfer
    /// @dev if the transaction is a sell, the tax will be converted to ETH if the taxHelper balance is above the threshold
    /// @param from the address the tokens are being transferred from
    /// @param to the address the tokens are being transferred to
    /// @param value the amount of tokens being transferred
    /// @return totalFeeAmount the total fee amount
    function handleTax(address from, address to, uint256 value) internal returns (uint256) {

        bool isBuy = false;
        bool isSell = false;
        bool isTransfer = false;

        if(lpTokens[from]) {
            isBuy = true;
        }
        if(lpTokens[to]) {
            isSell = true;
        }
        if(!isBuy && !isSell) {
            isTransfer = true;
        }

        checkMaxTxAmount(from, to, value, isBuy, isSell);
        checkMaxWalletAmount(to, value);

        if(isBuy && taxWhitelist[to]) {
            return 0;
        }

        if(isSell && taxWhitelist[from]) {
            return 0;
        }

        if(isTransfer) {
            if(taxWhitelist[from] || taxWhitelist[to]) {
                return 0;
            }
        }

        if(!settings.taxEnabled) {
            return 0;
        }

        ITaxHelper TaxHelper = ITaxHelper(taxHelper);
        if(from == address(TaxHelper) || to == address(TaxHelper)) {
            return 0;
        }

        uint256 totalFeeAmount;

        if(taxes.length > 0) {
            for(uint8 i = 0; i < taxes.length; ++i) {
                uint256 fee;
                if(isBuy) {
                    if(taxes[i].fee.buy > 0) {
                        fee = value * taxes[i].fee.buy / DENOMINATOR;
                    }
                } else if(isSell) {
                    if(taxes[i].fee.sell > 0) {
                        fee = value * taxes[i].fee.sell / DENOMINATOR;
                    }
                } else if(isTransfer) {
                    if(taxes[i].fee.transfer > 0) {
                        fee = value * taxes[i].fee.transfer / DENOMINATOR;
                    }
                } 
                totalFeeAmount += fee;
                if(fee != 0) {
                    if(!taxes[i].withdrawAsGas) {
                        _update(from, taxes[i].wallet, fee);
                        emit TaxTransferred(from, fee, taxes[i].wallet, isBuy, isSell, isTransfer, taxes[i].withdrawAsGas);
                    } else { 
                        taxBalances[taxes[i].wallet] += fee;
                        if(!taxesWithBalance[taxes[i].wallet]) {
                            walletsWithTax.push(taxes[i].wallet);
                            taxesWithBalance[taxes[i].wallet] = true;
                        }
                        _update(from, address(TaxHelper), fee);
                        emit TaxTransferred(from, fee, address(TaxHelper), isBuy, isSell, isTransfer, taxes[i].withdrawAsGas);
                    }
                } 
            }
            if(isSell && balanceOf(address(TaxHelper)) > settings.threshold ){
                _convertTaxToEth();
            }
            return totalFeeAmount;
        }    
    }

    /// @notice convert the tax balances to ETH
    /// @dev this is a manual function call to be used to convert the tax balances to ETH if necessary
    function convertTaxToEth() payable public onlyOwner {
        _convertTaxToEth();
    }

    /// @notice convert the tax balances to ETH
    function _convertTaxToEth() internal {
        ITaxHelper TaxHelper = ITaxHelper(taxHelper);
        // calculate percentages from taxHelper balance for each tax wallet
        uint256 totalBalance = balanceOf(address(TaxHelper));
        if(totalBalance > 0) {
            uint256[] memory percentages = new uint256[](walletsWithTax.length);
            for(uint i = 0; i < walletsWithTax.length; ++i) {
                // calculate percentage of totalBalance for each wallet
                uint256 balance = taxBalances[walletsWithTax[i]];
                if(balance > 0) {
                    percentages[i] = balance * DENOMINATOR / totalBalance;
                    if(totalBalance <= settings.maxThresholdSell) {
                        taxBalances[walletsWithTax[i]] = 0;
                        taxesWithBalance[walletsWithTax[i]] = false;
                    } else {
                        taxBalances[walletsWithTax[i]] = balance - (settings.maxThresholdSell * percentages[i] / DENOMINATOR);
                    }
                }
            }
            TaxHelper.convertToEthAndSend(address(this), walletsWithTax, percentages, DENOMINATOR, settings.maxThresholdSell);
            emit TaxWithdrawn(totalBalance, walletsWithTax, percentages);
            if(totalBalance <= settings.maxThresholdSell) {
                delete walletsWithTax;
            }
                
        }
    }

    /// @notice ERC20 transfer function
    /// @dev overriden to handle the tax
    /// @param to the address to transfer to
    /// @param value the amount to transfer
    /// @return true if the transfer is successful
    function transfer(address to, uint256 value) override public virtual returns (bool) {
        address owner = _msgSender();
        uint256 fee = 0;
        if(taxReentrancy == 1) {
            taxReentrancy = 2;
            fee = handleTax(owner, to, value);
            taxReentrancy = 1;
        }
        _transfer(owner, to, value - fee);
        return true;
    }

    /// @notice ERC20 transferFrom function
    /// @dev overriden to handle the tax
    /// @param from the address to transfer from
    /// @param to the address to transfer to
    /// @param value the amount to transfer
    /// @return true if the transfer is successful
    function transferFrom(address from, address to, uint256 value) override public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        uint256 fee = 0;
        if(taxReentrancy == 1) {
            taxReentrancy = 2;
            fee = handleTax(from, to, value);
            taxReentrancy = 1;
        }
        _transfer(from, to, value - fee);
        return true;
    }
}


// File contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"uint256","name":"_maxTax","type":"uint256"},{"internalType":"uint256","name":"_minMaxTxAmount","type":"uint256"},{"internalType":"uint256","name":"_minMaxWalletAmount","type":"uint256"}],"stateMutability":"payable","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":[],"name":"ExceedsMaxTax","type":"error"},{"inputs":[],"name":"ExceedsMaxTxAmount","type":"error"},{"inputs":[],"name":"ExceedsMaxWalletAmount","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UnderMinMaxTxAmount","type":"error"},{"inputs":[],"name":"UnderMinMaxWalletAmount","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAddressWallet","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":false,"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"SetDenominator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetLPToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxThresholdSell","type":"uint256"}],"name":"SetMaxThresholdSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"SetMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetMaxTxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetMaxTxWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"SetMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetMaxWalletEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetMaxWalletWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetTaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_taxHelper","type":"address"}],"name":"SetTaxHelper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetTaxWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"SetThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"isBuy","type":"bool"},{"indexed":false,"internalType":"bool","name":"isSell","type":"bool"},{"indexed":false,"internalType":"bool","name":"isTransfer","type":"bool"},{"indexed":false,"internalType":"bool","name":"withdrawAsGas","type":"bool"}],"name":"TaxTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"walletsWithTax","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"percentages","type":"uint256[]"}],"name":"TaxWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"transfer","type":"uint256"}],"internalType":"struct Token.Fee","name":"fee","type":"tuple"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"withdrawAsGas","type":"bool"}],"indexed":false,"internalType":"struct Token.Tax[]","name":"_taxes","type":"tuple[]"},{"indexed":false,"internalType":"bool","name":"cleanWallets","type":"bool"}],"name":"UpdatedTaxes","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convertTaxToEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxTxWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxWalletWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setDenominator","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setLPToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxThresholdSell","type":"uint256"}],"name":"setMaxThresholdSell","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setMaxTxEnabled","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setMaxTxWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setMaxWalletEnabled","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setMaxWalletWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxHelper","type":"address"}],"name":"setTaxHelper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setTaxWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setThreshold","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"maxThresholdSell","type":"uint256"},{"internalType":"uint256","name":"maxTax","type":"uint256"},{"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"internalType":"uint256","name":"minMaxTxAmount","type":"uint256"},{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"},{"internalType":"uint256","name":"minMaxWalletAmount","type":"uint256"},{"internalType":"bool","name":"taxEnabled","type":"bool"},{"internalType":"bool","name":"maxTxAmountEnabled","type":"bool"},{"internalType":"bool","name":"maxWalletAmountEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxes","outputs":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"transfer","type":"uint256"}],"internalType":"struct Token.Fee","name":"fee","type":"tuple"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"withdrawAsGas","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxesWithBalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"transfer","type":"uint256"}],"internalType":"struct Token.Fee","name":"fee","type":"tuple"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"withdrawAsGas","type":"bool"}],"internalType":"struct Token.Tax[]","name":"_taxes","type":"tuple[]"},{"internalType":"bool","name":"cleanWallets","type":"bool"}],"name":"updateTaxes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"walletsWithTax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060408190526127106010556011805460ff1916600117905562002dd938819003908190833981016040819052620000389162000351565b838787600362000049838262000496565b50600462000058828262000496565b5050506001600160a01b0381166200008b57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200009681620000c6565b50620000a3848662000118565b600f805462ffffff19169055600a92909255600c55600e55506200058a92505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620001445760405163ec442f0560e01b81526000600482015260240162000082565b620001526000838362000156565b5050565b6001600160a01b0383166200018557806002600082825462000179919062000562565b90915550620001f99050565b6001600160a01b03831660009081526020819052604090205481811015620001da5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000082565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620002175760028054829003905562000236565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200027c91815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002b157600080fd5b81516001600160401b0380821115620002ce57620002ce62000289565b604051601f8301601f19908116603f01168101908282118183101715620002f957620002f962000289565b81604052838152602092508660208588010111156200031757600080fd5b600091505b838210156200033b57858201830151818301840152908201906200031c565b6000602085830101528094505050505092915050565b600080600080600080600060e0888a0312156200036d57600080fd5b87516001600160401b03808211156200038557600080fd5b620003938b838c016200029f565b985060208a0151915080821115620003aa57600080fd5b50620003b98a828b016200029f565b60408a015160608b0151919850965090506001600160a01b0381168114620003e057600080fd5b809450506080880151925060a0880151915060c0880151905092959891949750929550565b600181811c908216806200041a57607f821691505b6020821081036200043b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000491576000816000526020600020601f850160051c810160208610156200046c5750805b601f850160051c820191505b818110156200048d5782815560010162000478565b5050505b505050565b81516001600160401b03811115620004b257620004b262000289565b620004ca81620004c3845462000405565b8462000441565b602080601f831160018114620005025760008415620004e95750858301515b600019600386901b1c1916600185901b1785556200048d565b600085815260208120601f198616915b82811015620005335788860151825594840194600190910190840162000512565b5085821015620005525787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200058457634e487b7160e01b600052601160045260246000fd5b92915050565b61283f806200059a6000396000f3fe6080604052600436106102305760003560e01c8063871c42b71161012e578063c5be2bc7116100ab578063e2ce1ac71161006f578063e2ce1ac7146106e1578063ec28438a146106f7578063f2fde38b1461070a578063f36aa6071461072a578063ff0087761461073d57600080fd5b8063c5be2bc71461058f578063c6af580b146105bf578063dd62ed3e146105d2578063dfa8bbeb14610618578063e06174e41461064857600080fd5b8063960bfe04116100f2578063960bfe0414610506578063a614ff7514610519578063a9059cbb1461052c578063b17b658d1461054c578063b9a6672c1461057c57600080fd5b8063871c42b71461047a5780638da5cb5b146104aa5780638fbf1e93146104c8578063918f8674146104db57806395d89b41146104f157600080fd5b80632febd2ae116101bc578063541958ff11610180578063541958ff146103f65780635afde063146104095780636cec0ceb1461041c57806370a082311461042f578063715018a61461046557600080fd5b80632febd2ae1461037f578063313ce5671461039257806339a91a15146103ae5780633d3d1141146103b65780634ff0b1d2146103c957600080fd5b80631f6976a6116102035780631f6976a6146102df57806323b872dd1461031757806327a14fc21461033757806327bf24e21461034c5780632b06dbbb1461035f57600080fd5b806306fdde0314610235578063095ea7b31461026057806318160ddd14610290578063181b72aa146102af575b600080fd5b34801561024157600080fd5b5061024a61076d565b60405161025791906120aa565b60405180910390f35b34801561026c57600080fd5b5061028061027b3660046120e2565b6107ff565b6040519015158152602001610257565b34801561029c57600080fd5b506002545b604051908152602001610257565b3480156102bb57600080fd5b506102806102ca36600461210e565b60126020526000908152604090205460ff1681565b3480156102eb57600080fd5b506019546102ff906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b34801561032357600080fd5b5061028061033236600461212b565b610819565b61034a61034536600461216c565b610881565b005b61034a61035a36600461216c565b6108e8565b34801561036b57600080fd5b506102ff61037a36600461216c565b610925565b61034a61038d36600461219e565b61094f565b34801561039e57600080fd5b5060405160128152602001610257565b61034a6109e2565b61034a6103c436600461219e565b6109f4565b3480156103d557600080fd5b506102a16103e436600461210e565b60176020526000908152604090205481565b61034a6104043660046121d7565b610a58565b61034a61041736600461219e565b610aa9565b61034a61042a36600461216c565b610b0d565b34801561043b57600080fd5b506102a161044a36600461210e565b6001600160a01b031660009081526020819052604090205490565b34801561047157600080fd5b5061034a610b4a565b34801561048657600080fd5b5061028061049536600461210e565b60136020526000908152604090205460ff1681565b3480156104b657600080fd5b506005546001600160a01b03166102ff565b61034a6104d636600461210e565b610b5c565b3480156104e757600080fd5b506102a160105481565b3480156104fd57600080fd5b5061024a610bd9565b61034a61051436600461216c565b610be8565b61034a6105273660046121d7565b610c25565b34801561053857600080fd5b506102806105473660046120e2565b610c78565b34801561055857600080fd5b5061028061056736600461210e565b60156020526000908152604090205460ff1681565b61034a61058a36600461219e565b610cce565b34801561059b57600080fd5b506105af6105aa36600461216c565b610d32565b60405161025794939291906121f4565b61034a6105cd3660046121d7565b610e2d565b3480156105de57600080fd5b506102a16105ed366004612243565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561062457600080fd5b5061028061063336600461210e565b60146020526000908152604090205460ff1681565b34801561065457600080fd5b50600854600954600a54600b54600c54600d54600e54600f54610691979695949392919060ff80821691610100810482169162010000909104168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c0850152151560e08401521515610100830152151561012082015261014001610257565b3480156106ed57600080fd5b506102a160075481565b61034a61070536600461216c565b610e76565b34801561071657600080fd5b5061034a61072536600461210e565b610ed6565b61034a610738366004612271565b610f19565b34801561074957600080fd5b5061028061075836600461210e565b60166020526000908152604090205460ff1681565b60606003805461077c906122f7565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906122f7565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b60003361080d818585611119565b60019150505b92915050565b60003361082785828561112b565b60115460009060ff1660010361085f576011805460ff1916600217905561084f8686866111a9565b6011805460ff1916600117905590505b610873868661086e8488612347565b6118b9565b6001925050505b9392505050565b610889611918565b600e548110156108ac576040516307f02b7960e51b815260040160405180910390fd5b600d8190556040518181527f0176e9211818debdc4483c2bb0972798b7eb106239c8e465d4f1cee4ce5ae6e7906020015b60405180910390a150565b6108f0611918565b60098190556040518181527f933cdf8eb45e2bf17bff01bdf25b6516f3e3eda7bb81120c41bff9285008dac0906020016108dd565b6018818154811061093557600080fd5b6000918252602090912001546001600160a01b0316905081565b610957611918565b6001600160a01b03821661097e5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038216600081815260156020908152604091829020805460ff19168515159081179091558251938452908301527f8b4bb68e253154bb2e75802b8914dddd9ecfaa965eca8e5a323553017b6bcc0d91015b60405180910390a15050565b6109ea611918565b6109f2611945565b565b6109fc611918565b6001600160a01b038216600081815260136020908152604091829020805460ff19168515159081179091558251938452908301527ff06306d03b4f240d8198e91f68418777423bb61df08b8d71032a9cfa211b4ae191016109d6565b610a60611918565b600f80548215156101000261ff00199091161790556040517ff65dac9e0e14b7aec57d4f1fea4ffce1fa2e22a81d90693329df834fbabbb789906108dd90831515815260200190565b610ab1611918565b6001600160a01b038216600081815260126020908152604091829020805460ff19168515159081179091558251938452908301527f8f3675e5a31b083483e5a782db4130316da1e3c5fca72fc2398f59692286d8a591016109d6565b610b15611918565b60108190556040518181527f4082bc252f347d223f4e804c3c4e90818ad544b959ffa807149351ad158bf016906020016108dd565b610b52611918565b6109f26000611c1b565b610b64611918565b6001600160a01b038116610b8b5760405163d92e233d60e01b815260040160405180910390fd5b601980546001600160a01b0319166001600160a01b0383169081179091556040519081527ff02c250c2f604285964f748fa097cd5c7fbf0bbd759efc47e3cc8851c4bfd89b906020016108dd565b60606004805461077c906122f7565b610bf0611918565b60088190556040518181527f46e8115bf463f9c29a9424fe152addef1bfaf2b43180d19bb7c2c78cc0ff1ebf906020016108dd565b610c2d611918565b600f8054821515620100000262ff0000199091161790556040517fa90851d18400a589974d1c5356d645068ab372fc9d53ed5f382f9209e8a504a7906108dd90831515815260200190565b6011546000903390829060ff16600103610cb4576011805460ff19166002179055610ca48286866111a9565b6011805460ff1916600117905590505b610cc3828661086e8488612347565b506001949350505050565b610cd6611918565b6001600160a01b038216600081815260146020908152604091829020805460ff19168515159081179091558251938452908301527f2a57b1eacb5962c472bd7a96baec43231b4ecc3ba3cffd4abf8186734102312d91016109d6565b60068181548110610d4257600080fd5b9060005260206000209060050201600091509050806000018054610d65906122f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d91906122f7565b8015610dde5780601f10610db357610100808354040283529160200191610dde565b820191906000526020600020905b815481529060010190602001808311610dc157829003601f168201915b50506040805160608101825260018701548152600287015460208201526003870154918101919091526004909501549394936001600160a01b0381169350600160a01b900460ff169150859050565b610e35611918565b600f805460ff19168215159081179091556040519081527fa3da88a45043f093f32d7cb1b95474f4f2ff653758ad43d6e512872081307fc0906020016108dd565b610e7e611918565b600c54811015610ea157604051635672035f60e11b815260040160405180910390fd5b600b8190556040518181527f4a02caf9e7317d663463d3d976767ba90289279dd55c0a46f962536efc87a9a6906020016108dd565b610ede611918565b6001600160a01b038116610f0d57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610f1681611c1b565b50565b610f21611918565b8015610f2f57610f2f611945565b610f3b60066000611f8e565b60008080805b85811015611095576000878783818110610f5d57610f5d61235a565b9050602002810190610f6f9190612370565b610f809060a081019060800161210e565b6001600160a01b031603610fa75760405163a79afef960e01b815260040160405180910390fd5b6006878783818110610fbb57610fbb61235a565b9050602002810190610fcd9190612370565b815460018101835560009283526020909220909160050201610fef8282612410565b50508686828181106110035761100361235a565b90506020028101906110159190612370565b611023906020013585612574565b93508686828181106110375761103761235a565b90506020028101906110499190612370565b611057906040013584612574565b925086868281811061106b5761106b61235a565b905060200281019061107d9190612370565b61108b906060013583612574565b9150600101610f41565b506007859055600a548311806110ac5750600a5482115b806110b85750600a5481115b156110d657604051630b323bcb60e11b815260040160405180910390fd5b7fe8831bf32b04c19859d9916dbd57a89d041caf02ab126d86dc4edbbdb8fff57086868660405161110993929190612587565b60405180910390a1505050505050565b6111268383836001611c6d565b505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146111a3578181101561119457604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610f04565b6111a384848484036000611c6d565b50505050565b6001600160a01b03831660009081526015602052604081205481908190819060ff16156111d557600192505b6001600160a01b03861660009081526015602052604090205460ff16156111fb57600191505b82158015611207575081155b15611210575060015b61121d8787878686611d42565b6112278686611dda565b82801561124c57506001600160a01b03861660009081526012602052604090205460ff165b1561125d576000935050505061087a565b81801561128257506001600160a01b03871660009081526012602052604090205460ff165b15611293576000935050505061087a565b80156112e9576001600160a01b03871660009081526012602052604090205460ff16806112d857506001600160a01b03861660009081526012602052604090205460ff165b156112e9576000935050505061087a565b600f5460ff166112ff576000935050505061087a565b6019546001600160a01b0390811690881681148061132e5750806001600160a01b0316876001600160a01b0316145b1561134057600094505050505061087a565b600654600090156118ad5760005b60065460ff8216101561186d57600086156113e157600060068360ff168154811061137b5761137b61235a565b90600052602060002090600502016001016000015411156113dc5760105460068360ff16815481106113af576113af61235a565b9060005260206000209060050201600101600001548a6113cf91906126b6565b6113d991906126cd565b90505b6114d2565b851561145357600060068360ff16815481106113ff576113ff61235a565b90600052602060002090600502016001016001015411156113dc5760105460068360ff16815481106114335761143361235a565b9060005260206000209060050201600101600101548a6113cf91906126b6565b84156114d257600060068360ff16815481106114715761147161235a565b90600052602060002090600502016001016002015411156114d25760105460068360ff16815481106114a5576114a561235a565b9060005260206000209060050201600101600201548a6114c591906126b6565b6114cf91906126cd565b90505b6114dc8184612574565b9250801561185c5760068260ff16815481106114fa576114fa61235a565b906000526020600020906005020160040160149054906101000a900460ff166116425761155a8b60068460ff16815481106115375761153761235a565b60009182526020909120600460059092020101546001600160a01b031683611e64565b60068260ff16815481106115705761157061235a565b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03168b6001600160a01b03167f897726b6cfaff25a3bddca812f59ae0ed3a3d07ef84476ccd17cdefbffe10e11838a8a8a60068960ff16815481106115e3576115e361235a565b906000526020600020906005020160040160149054906101000a900460ff1660405161163595949392919094855292151560208501529015156040840152151560608301521515608082015260a00190565b60405180910390a361185c565b806017600060068560ff168154811061165d5761165d61235a565b60009182526020808320600460059093020191909101546001600160a01b031683528201929092526040018120805490919061169a908490612574565b925050819055506016600060068460ff16815481106116bb576116bb61235a565b60009182526020808320600460059093020191909101546001600160a01b0316835282019290925260400190205460ff166117a757601860068360ff16815481106117085761170861235a565b600091825260208083206004600590930201919091015483546001818101865594845291832090910180546001600160a01b0319166001600160a01b0390921691909117905560068054601692919060ff871690811061176a5761176a61235a565b60009182526020808320600592909202909101600401546001600160a01b031683528201929092526040019020805460ff19169115159190911790555b6117b28b8583611e64565b836001600160a01b03168b6001600160a01b03167f897726b6cfaff25a3bddca812f59ae0ed3a3d07ef84476ccd17cdefbffe10e11838a8a8a60068960ff16815481106118015761180161235a565b906000526020600020906005020160040160149054906101000a900460ff1660405161185395949392919094855292151560208501529015156040840152151560608301521515608082015260a00190565b60405180910390a35b50611866816126ef565b905061134e565b5083801561189457506008546001600160a01b038316600090815260208190526040902054115b156118a1576118a1611945565b945061087a9350505050565b50505050509392505050565b6001600160a01b0383166118e357604051634b637e8f60e11b815260006004820152602401610f04565b6001600160a01b03821661190d5760405163ec442f0560e01b815260006004820152602401610f04565b611126838383611e64565b6005546001600160a01b031633146109f25760405163118cdaa760e01b8152336004820152602401610f04565b6019546001600160a01b03166000818152602081905260409020548015611c175760185460009067ffffffffffffffff81111561198457611984612390565b6040519080825280602002602001820160405280156119ad578160200160208202803683370190505b50905060005b601854811015611b5c57600060176000601884815481106119d6576119d661235a565b60009182526020808320909101546001600160a01b0316835282019290925260400190205490508015611b53578360105482611a1291906126b6565b611a1c91906126cd565b838381518110611a2e57611a2e61235a565b60209081029190910101526009548411611ad55760006017600060188581548110611a5b57611a5b61235a565b60009182526020808320909101546001600160a01b0316835282019290925260400181209190915560188054601691839186908110611a9c57611a9c61235a565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055611b53565b601054838381518110611aea57611aea61235a565b6020026020010151600860010154611b0291906126b6565b611b0c91906126cd565b611b169082612347565b6017600060188581548110611b2d57611b2d61235a565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b506001016119b3565b506010546009546040516337a3292160e01b81526001600160a01b038616926337a3292192611b949230926018928892600401612789565b600060405180830381600087803b158015611bae57600080fd5b505af1158015611bc2573d6000803e3d6000fd5b505050507f70abc2c671179db962e066fe2d431f30e93e030d932704e9acd8fd566486103782601883604051611bfa939291906127d4565b60405180910390a160095482116111265761112660186000611faf565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611c975760405163e602df0560e01b815260006004820152602401610f04565b6001600160a01b038316611cc157604051634a1406b160e11b815260006004820152602401610f04565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156111a357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d3491815260200190565b60405180910390a350505050565b600f54610100900460ff1615611dd3578115611d79576001600160a01b03841660009081526014602052604090205460ff16611dd3575b8015611da0576001600160a01b03851660009081526014602052604090205460ff16611dd3575b80158015611dac575081155b611dd357600b54831115611dd3576040516329412db560e21b815260040160405180910390fd5b5050505050565b600f5462010000900460ff161515600003611df3575050565b6001600160a01b03821660009081526013602052604090205460ff1615611e18575050565b600d5481611e3b846001600160a01b031660009081526020819052604090205490565b611e459190612574565b1115611c175760405163fd42866160e01b815260040160405180910390fd5b6001600160a01b038316611e8f578060026000828254611e849190612574565b90915550611f019050565b6001600160a01b03831660009081526020819052604090205481811015611ee25760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610f04565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611f1d57600280548290039055611f3c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f8191815260200190565b60405180910390a3505050565b5080546000825560050290600052602060002090810190610f169190611fcd565b5080546000825590600052602060002090810190610f169190612015565b80821115612011576000611fe1828261202a565b506000600182018190556002820181905560038201556004810180546001600160a81b0319169055600501611fcd565b5090565b5b808211156120115760008155600101612016565b508054612036906122f7565b6000825580601f10612046575050565b601f016020900490600052602060002090810190610f169190612015565b6000815180845260005b8181101561208a5760208185018101518683018201520161206e565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061087a6020830184612064565b6001600160a01b0381168114610f1657600080fd5b80356120dd816120bd565b919050565b600080604083850312156120f557600080fd5b8235612100816120bd565b946020939093013593505050565b60006020828403121561212057600080fd5b813561087a816120bd565b60008060006060848603121561214057600080fd5b833561214b816120bd565b9250602084013561215b816120bd565b929592945050506040919091013590565b60006020828403121561217e57600080fd5b5035919050565b8015158114610f1657600080fd5b80356120dd81612185565b600080604083850312156121b157600080fd5b82356121bc816120bd565b915060208301356121cc81612185565b809150509250929050565b6000602082840312156121e957600080fd5b813561087a81612185565b60c08152600061220760c0830187612064565b905084516020830152602085015160408301526040850151606083015260018060a01b038416608083015282151560a083015295945050505050565b6000806040838503121561225657600080fd5b8235612261816120bd565b915060208301356121cc816120bd565b60008060006040848603121561228657600080fd5b833567ffffffffffffffff8082111561229e57600080fd5b818601915086601f8301126122b257600080fd5b8135818111156122c157600080fd5b8760208260051b85010111156122d657600080fd5b602092830195509350508401356122ec81612185565b809150509250925092565b600181811c9082168061230b57607f821691505b60208210810361232b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081357610813612331565b634e487b7160e01b600052603260045260246000fd5b6000823560be1983360301811261238657600080fd5b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b601f821115611126576000816000526020600020601f850160051c810160208610156123cf5750805b601f850160051c820191505b818110156123ee578281556001016123db565b505050505050565b60008135610813816120bd565b6000813561081381612185565b8135601e1983360301811261242457600080fd5b8201803567ffffffffffffffff81111561243d57600080fd5b6020813603818401131561245057600080fd5b6124648261245e86546122f7565b866123a6565b6000601f83116001811461249a576000841561248257508482018301355b600019600386901b1c1916600185901b1786556124f7565b600086815260209020601f19851690835b828110156124cc5787850186013582559385019360019091019085016124ab565b50858210156124eb5760001960f88760031b161c198585890101351681555b505060018460011b0186555b50508401803560018501556020810135600285015560400135600384015550506004810161254761252a608085016123f6565b82546001600160a01b0319166001600160a01b0391909116178255565b61112661255660a08501612403565b82805460ff60a01b191691151560a01b60ff60a01b16919091179055565b8082018082111561081357610813612331565b6040808252810183905260006060600585901b8301810190830186835b878110156126a157858403605f190183528135368a900360be190181126125ca57600080fd5b890160c0813536839003601e190181126125e357600080fd5b8201602081810191359067ffffffffffffffff82111561260257600080fd5b81360383131561261157600080fd5b83895281848a015260e093508183858b0137600084838b01015261264d818a018287018035825260208082013590830152604090810135910152565b6080925061265c8386016120d2565b6001600160a01b0381168a8501525060a0925061267a838601612193565b151592890192909252601f01601f19169096010194938401939290920191506001016125a4565b50505083151560208401529050949350505050565b808202811582820484141761081357610813612331565b6000826126ea57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff810361270557612705612331565b60010192915050565b600081548084526020808501945083600052602060002060005b8381101561274d5781546001600160a01b031687529582019560019182019101612728565b509495945050505050565b60008151808452602080850194506020840160005b8381101561274d5781518752958201959082019060010161276d565b6001600160a01b038616815260a0602082018190526000906127ad9083018761270e565b82810360408401526127bf8187612758565b60608401959095525050608001529392505050565b8381526060602082015260006127ed606083018561270e565b82810360408401526127ff8185612758565b969550505050505056fea264697066735822122006bb97caa25271bd7b117332b16972e977b4647acac4e8f9f2000011e12897ab64736f6c6343000818003300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000afb5adb1dd4a34c576fd2c6e055bf3bfd697c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000422ca8b0a00a425000000000000000000000000000000000000000000000000000000000000000000000e537472696b6550726f746f636f6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045354505200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063871c42b71161012e578063c5be2bc7116100ab578063e2ce1ac71161006f578063e2ce1ac7146106e1578063ec28438a146106f7578063f2fde38b1461070a578063f36aa6071461072a578063ff0087761461073d57600080fd5b8063c5be2bc71461058f578063c6af580b146105bf578063dd62ed3e146105d2578063dfa8bbeb14610618578063e06174e41461064857600080fd5b8063960bfe04116100f2578063960bfe0414610506578063a614ff7514610519578063a9059cbb1461052c578063b17b658d1461054c578063b9a6672c1461057c57600080fd5b8063871c42b71461047a5780638da5cb5b146104aa5780638fbf1e93146104c8578063918f8674146104db57806395d89b41146104f157600080fd5b80632febd2ae116101bc578063541958ff11610180578063541958ff146103f65780635afde063146104095780636cec0ceb1461041c57806370a082311461042f578063715018a61461046557600080fd5b80632febd2ae1461037f578063313ce5671461039257806339a91a15146103ae5780633d3d1141146103b65780634ff0b1d2146103c957600080fd5b80631f6976a6116102035780631f6976a6146102df57806323b872dd1461031757806327a14fc21461033757806327bf24e21461034c5780632b06dbbb1461035f57600080fd5b806306fdde0314610235578063095ea7b31461026057806318160ddd14610290578063181b72aa146102af575b600080fd5b34801561024157600080fd5b5061024a61076d565b60405161025791906120aa565b60405180910390f35b34801561026c57600080fd5b5061028061027b3660046120e2565b6107ff565b6040519015158152602001610257565b34801561029c57600080fd5b506002545b604051908152602001610257565b3480156102bb57600080fd5b506102806102ca36600461210e565b60126020526000908152604090205460ff1681565b3480156102eb57600080fd5b506019546102ff906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b34801561032357600080fd5b5061028061033236600461212b565b610819565b61034a61034536600461216c565b610881565b005b61034a61035a36600461216c565b6108e8565b34801561036b57600080fd5b506102ff61037a36600461216c565b610925565b61034a61038d36600461219e565b61094f565b34801561039e57600080fd5b5060405160128152602001610257565b61034a6109e2565b61034a6103c436600461219e565b6109f4565b3480156103d557600080fd5b506102a16103e436600461210e565b60176020526000908152604090205481565b61034a6104043660046121d7565b610a58565b61034a61041736600461219e565b610aa9565b61034a61042a36600461216c565b610b0d565b34801561043b57600080fd5b506102a161044a36600461210e565b6001600160a01b031660009081526020819052604090205490565b34801561047157600080fd5b5061034a610b4a565b34801561048657600080fd5b5061028061049536600461210e565b60136020526000908152604090205460ff1681565b3480156104b657600080fd5b506005546001600160a01b03166102ff565b61034a6104d636600461210e565b610b5c565b3480156104e757600080fd5b506102a160105481565b3480156104fd57600080fd5b5061024a610bd9565b61034a61051436600461216c565b610be8565b61034a6105273660046121d7565b610c25565b34801561053857600080fd5b506102806105473660046120e2565b610c78565b34801561055857600080fd5b5061028061056736600461210e565b60156020526000908152604090205460ff1681565b61034a61058a36600461219e565b610cce565b34801561059b57600080fd5b506105af6105aa36600461216c565b610d32565b60405161025794939291906121f4565b61034a6105cd3660046121d7565b610e2d565b3480156105de57600080fd5b506102a16105ed366004612243565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561062457600080fd5b5061028061063336600461210e565b60146020526000908152604090205460ff1681565b34801561065457600080fd5b50600854600954600a54600b54600c54600d54600e54600f54610691979695949392919060ff80821691610100810482169162010000909104168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c0850152151560e08401521515610100830152151561012082015261014001610257565b3480156106ed57600080fd5b506102a160075481565b61034a61070536600461216c565b610e76565b34801561071657600080fd5b5061034a61072536600461210e565b610ed6565b61034a610738366004612271565b610f19565b34801561074957600080fd5b5061028061075836600461210e565b60166020526000908152604090205460ff1681565b60606003805461077c906122f7565b80601f01602080910402602001604051908101604052809291908181526020018280546107a8906122f7565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b60003361080d818585611119565b60019150505b92915050565b60003361082785828561112b565b60115460009060ff1660010361085f576011805460ff1916600217905561084f8686866111a9565b6011805460ff1916600117905590505b610873868661086e8488612347565b6118b9565b6001925050505b9392505050565b610889611918565b600e548110156108ac576040516307f02b7960e51b815260040160405180910390fd5b600d8190556040518181527f0176e9211818debdc4483c2bb0972798b7eb106239c8e465d4f1cee4ce5ae6e7906020015b60405180910390a150565b6108f0611918565b60098190556040518181527f933cdf8eb45e2bf17bff01bdf25b6516f3e3eda7bb81120c41bff9285008dac0906020016108dd565b6018818154811061093557600080fd5b6000918252602090912001546001600160a01b0316905081565b610957611918565b6001600160a01b03821661097e5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038216600081815260156020908152604091829020805460ff19168515159081179091558251938452908301527f8b4bb68e253154bb2e75802b8914dddd9ecfaa965eca8e5a323553017b6bcc0d91015b60405180910390a15050565b6109ea611918565b6109f2611945565b565b6109fc611918565b6001600160a01b038216600081815260136020908152604091829020805460ff19168515159081179091558251938452908301527ff06306d03b4f240d8198e91f68418777423bb61df08b8d71032a9cfa211b4ae191016109d6565b610a60611918565b600f80548215156101000261ff00199091161790556040517ff65dac9e0e14b7aec57d4f1fea4ffce1fa2e22a81d90693329df834fbabbb789906108dd90831515815260200190565b610ab1611918565b6001600160a01b038216600081815260126020908152604091829020805460ff19168515159081179091558251938452908301527f8f3675e5a31b083483e5a782db4130316da1e3c5fca72fc2398f59692286d8a591016109d6565b610b15611918565b60108190556040518181527f4082bc252f347d223f4e804c3c4e90818ad544b959ffa807149351ad158bf016906020016108dd565b610b52611918565b6109f26000611c1b565b610b64611918565b6001600160a01b038116610b8b5760405163d92e233d60e01b815260040160405180910390fd5b601980546001600160a01b0319166001600160a01b0383169081179091556040519081527ff02c250c2f604285964f748fa097cd5c7fbf0bbd759efc47e3cc8851c4bfd89b906020016108dd565b60606004805461077c906122f7565b610bf0611918565b60088190556040518181527f46e8115bf463f9c29a9424fe152addef1bfaf2b43180d19bb7c2c78cc0ff1ebf906020016108dd565b610c2d611918565b600f8054821515620100000262ff0000199091161790556040517fa90851d18400a589974d1c5356d645068ab372fc9d53ed5f382f9209e8a504a7906108dd90831515815260200190565b6011546000903390829060ff16600103610cb4576011805460ff19166002179055610ca48286866111a9565b6011805460ff1916600117905590505b610cc3828661086e8488612347565b506001949350505050565b610cd6611918565b6001600160a01b038216600081815260146020908152604091829020805460ff19168515159081179091558251938452908301527f2a57b1eacb5962c472bd7a96baec43231b4ecc3ba3cffd4abf8186734102312d91016109d6565b60068181548110610d4257600080fd5b9060005260206000209060050201600091509050806000018054610d65906122f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d91906122f7565b8015610dde5780601f10610db357610100808354040283529160200191610dde565b820191906000526020600020905b815481529060010190602001808311610dc157829003601f168201915b50506040805160608101825260018701548152600287015460208201526003870154918101919091526004909501549394936001600160a01b0381169350600160a01b900460ff169150859050565b610e35611918565b600f805460ff19168215159081179091556040519081527fa3da88a45043f093f32d7cb1b95474f4f2ff653758ad43d6e512872081307fc0906020016108dd565b610e7e611918565b600c54811015610ea157604051635672035f60e11b815260040160405180910390fd5b600b8190556040518181527f4a02caf9e7317d663463d3d976767ba90289279dd55c0a46f962536efc87a9a6906020016108dd565b610ede611918565b6001600160a01b038116610f0d57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610f1681611c1b565b50565b610f21611918565b8015610f2f57610f2f611945565b610f3b60066000611f8e565b60008080805b85811015611095576000878783818110610f5d57610f5d61235a565b9050602002810190610f6f9190612370565b610f809060a081019060800161210e565b6001600160a01b031603610fa75760405163a79afef960e01b815260040160405180910390fd5b6006878783818110610fbb57610fbb61235a565b9050602002810190610fcd9190612370565b815460018101835560009283526020909220909160050201610fef8282612410565b50508686828181106110035761100361235a565b90506020028101906110159190612370565b611023906020013585612574565b93508686828181106110375761103761235a565b90506020028101906110499190612370565b611057906040013584612574565b925086868281811061106b5761106b61235a565b905060200281019061107d9190612370565b61108b906060013583612574565b9150600101610f41565b506007859055600a548311806110ac5750600a5482115b806110b85750600a5481115b156110d657604051630b323bcb60e11b815260040160405180910390fd5b7fe8831bf32b04c19859d9916dbd57a89d041caf02ab126d86dc4edbbdb8fff57086868660405161110993929190612587565b60405180910390a1505050505050565b6111268383836001611c6d565b505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146111a3578181101561119457604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610f04565b6111a384848484036000611c6d565b50505050565b6001600160a01b03831660009081526015602052604081205481908190819060ff16156111d557600192505b6001600160a01b03861660009081526015602052604090205460ff16156111fb57600191505b82158015611207575081155b15611210575060015b61121d8787878686611d42565b6112278686611dda565b82801561124c57506001600160a01b03861660009081526012602052604090205460ff165b1561125d576000935050505061087a565b81801561128257506001600160a01b03871660009081526012602052604090205460ff165b15611293576000935050505061087a565b80156112e9576001600160a01b03871660009081526012602052604090205460ff16806112d857506001600160a01b03861660009081526012602052604090205460ff165b156112e9576000935050505061087a565b600f5460ff166112ff576000935050505061087a565b6019546001600160a01b0390811690881681148061132e5750806001600160a01b0316876001600160a01b0316145b1561134057600094505050505061087a565b600654600090156118ad5760005b60065460ff8216101561186d57600086156113e157600060068360ff168154811061137b5761137b61235a565b90600052602060002090600502016001016000015411156113dc5760105460068360ff16815481106113af576113af61235a565b9060005260206000209060050201600101600001548a6113cf91906126b6565b6113d991906126cd565b90505b6114d2565b851561145357600060068360ff16815481106113ff576113ff61235a565b90600052602060002090600502016001016001015411156113dc5760105460068360ff16815481106114335761143361235a565b9060005260206000209060050201600101600101548a6113cf91906126b6565b84156114d257600060068360ff16815481106114715761147161235a565b90600052602060002090600502016001016002015411156114d25760105460068360ff16815481106114a5576114a561235a565b9060005260206000209060050201600101600201548a6114c591906126b6565b6114cf91906126cd565b90505b6114dc8184612574565b9250801561185c5760068260ff16815481106114fa576114fa61235a565b906000526020600020906005020160040160149054906101000a900460ff166116425761155a8b60068460ff16815481106115375761153761235a565b60009182526020909120600460059092020101546001600160a01b031683611e64565b60068260ff16815481106115705761157061235a565b906000526020600020906005020160040160009054906101000a90046001600160a01b03166001600160a01b03168b6001600160a01b03167f897726b6cfaff25a3bddca812f59ae0ed3a3d07ef84476ccd17cdefbffe10e11838a8a8a60068960ff16815481106115e3576115e361235a565b906000526020600020906005020160040160149054906101000a900460ff1660405161163595949392919094855292151560208501529015156040840152151560608301521515608082015260a00190565b60405180910390a361185c565b806017600060068560ff168154811061165d5761165d61235a565b60009182526020808320600460059093020191909101546001600160a01b031683528201929092526040018120805490919061169a908490612574565b925050819055506016600060068460ff16815481106116bb576116bb61235a565b60009182526020808320600460059093020191909101546001600160a01b0316835282019290925260400190205460ff166117a757601860068360ff16815481106117085761170861235a565b600091825260208083206004600590930201919091015483546001818101865594845291832090910180546001600160a01b0319166001600160a01b0390921691909117905560068054601692919060ff871690811061176a5761176a61235a565b60009182526020808320600592909202909101600401546001600160a01b031683528201929092526040019020805460ff19169115159190911790555b6117b28b8583611e64565b836001600160a01b03168b6001600160a01b03167f897726b6cfaff25a3bddca812f59ae0ed3a3d07ef84476ccd17cdefbffe10e11838a8a8a60068960ff16815481106118015761180161235a565b906000526020600020906005020160040160149054906101000a900460ff1660405161185395949392919094855292151560208501529015156040840152151560608301521515608082015260a00190565b60405180910390a35b50611866816126ef565b905061134e565b5083801561189457506008546001600160a01b038316600090815260208190526040902054115b156118a1576118a1611945565b945061087a9350505050565b50505050509392505050565b6001600160a01b0383166118e357604051634b637e8f60e11b815260006004820152602401610f04565b6001600160a01b03821661190d5760405163ec442f0560e01b815260006004820152602401610f04565b611126838383611e64565b6005546001600160a01b031633146109f25760405163118cdaa760e01b8152336004820152602401610f04565b6019546001600160a01b03166000818152602081905260409020548015611c175760185460009067ffffffffffffffff81111561198457611984612390565b6040519080825280602002602001820160405280156119ad578160200160208202803683370190505b50905060005b601854811015611b5c57600060176000601884815481106119d6576119d661235a565b60009182526020808320909101546001600160a01b0316835282019290925260400190205490508015611b53578360105482611a1291906126b6565b611a1c91906126cd565b838381518110611a2e57611a2e61235a565b60209081029190910101526009548411611ad55760006017600060188581548110611a5b57611a5b61235a565b60009182526020808320909101546001600160a01b0316835282019290925260400181209190915560188054601691839186908110611a9c57611a9c61235a565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055611b53565b601054838381518110611aea57611aea61235a565b6020026020010151600860010154611b0291906126b6565b611b0c91906126cd565b611b169082612347565b6017600060188581548110611b2d57611b2d61235a565b60009182526020808320909101546001600160a01b031683528201929092526040019020555b506001016119b3565b506010546009546040516337a3292160e01b81526001600160a01b038616926337a3292192611b949230926018928892600401612789565b600060405180830381600087803b158015611bae57600080fd5b505af1158015611bc2573d6000803e3d6000fd5b505050507f70abc2c671179db962e066fe2d431f30e93e030d932704e9acd8fd566486103782601883604051611bfa939291906127d4565b60405180910390a160095482116111265761112660186000611faf565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611c975760405163e602df0560e01b815260006004820152602401610f04565b6001600160a01b038316611cc157604051634a1406b160e11b815260006004820152602401610f04565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156111a357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d3491815260200190565b60405180910390a350505050565b600f54610100900460ff1615611dd3578115611d79576001600160a01b03841660009081526014602052604090205460ff16611dd3575b8015611da0576001600160a01b03851660009081526014602052604090205460ff16611dd3575b80158015611dac575081155b611dd357600b54831115611dd3576040516329412db560e21b815260040160405180910390fd5b5050505050565b600f5462010000900460ff161515600003611df3575050565b6001600160a01b03821660009081526013602052604090205460ff1615611e18575050565b600d5481611e3b846001600160a01b031660009081526020819052604090205490565b611e459190612574565b1115611c175760405163fd42866160e01b815260040160405180910390fd5b6001600160a01b038316611e8f578060026000828254611e849190612574565b90915550611f019050565b6001600160a01b03831660009081526020819052604090205481811015611ee25760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610f04565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611f1d57600280548290039055611f3c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f8191815260200190565b60405180910390a3505050565b5080546000825560050290600052602060002090810190610f169190611fcd565b5080546000825590600052602060002090810190610f169190612015565b80821115612011576000611fe1828261202a565b506000600182018190556002820181905560038201556004810180546001600160a81b0319169055600501611fcd565b5090565b5b808211156120115760008155600101612016565b508054612036906122f7565b6000825580601f10612046575050565b601f016020900490600052602060002090810190610f169190612015565b6000815180845260005b8181101561208a5760208185018101518683018201520161206e565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061087a6020830184612064565b6001600160a01b0381168114610f1657600080fd5b80356120dd816120bd565b919050565b600080604083850312156120f557600080fd5b8235612100816120bd565b946020939093013593505050565b60006020828403121561212057600080fd5b813561087a816120bd565b60008060006060848603121561214057600080fd5b833561214b816120bd565b9250602084013561215b816120bd565b929592945050506040919091013590565b60006020828403121561217e57600080fd5b5035919050565b8015158114610f1657600080fd5b80356120dd81612185565b600080604083850312156121b157600080fd5b82356121bc816120bd565b915060208301356121cc81612185565b809150509250929050565b6000602082840312156121e957600080fd5b813561087a81612185565b60c08152600061220760c0830187612064565b905084516020830152602085015160408301526040850151606083015260018060a01b038416608083015282151560a083015295945050505050565b6000806040838503121561225657600080fd5b8235612261816120bd565b915060208301356121cc816120bd565b60008060006040848603121561228657600080fd5b833567ffffffffffffffff8082111561229e57600080fd5b818601915086601f8301126122b257600080fd5b8135818111156122c157600080fd5b8760208260051b85010111156122d657600080fd5b602092830195509350508401356122ec81612185565b809150509250925092565b600181811c9082168061230b57607f821691505b60208210810361232b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081357610813612331565b634e487b7160e01b600052603260045260246000fd5b6000823560be1983360301811261238657600080fd5b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b601f821115611126576000816000526020600020601f850160051c810160208610156123cf5750805b601f850160051c820191505b818110156123ee578281556001016123db565b505050505050565b60008135610813816120bd565b6000813561081381612185565b8135601e1983360301811261242457600080fd5b8201803567ffffffffffffffff81111561243d57600080fd5b6020813603818401131561245057600080fd5b6124648261245e86546122f7565b866123a6565b6000601f83116001811461249a576000841561248257508482018301355b600019600386901b1c1916600185901b1786556124f7565b600086815260209020601f19851690835b828110156124cc5787850186013582559385019360019091019085016124ab565b50858210156124eb5760001960f88760031b161c198585890101351681555b505060018460011b0186555b50508401803560018501556020810135600285015560400135600384015550506004810161254761252a608085016123f6565b82546001600160a01b0319166001600160a01b0391909116178255565b61112661255660a08501612403565b82805460ff60a01b191691151560a01b60ff60a01b16919091179055565b8082018082111561081357610813612331565b6040808252810183905260006060600585901b8301810190830186835b878110156126a157858403605f190183528135368a900360be190181126125ca57600080fd5b890160c0813536839003601e190181126125e357600080fd5b8201602081810191359067ffffffffffffffff82111561260257600080fd5b81360383131561261157600080fd5b83895281848a015260e093508183858b0137600084838b01015261264d818a018287018035825260208082013590830152604090810135910152565b6080925061265c8386016120d2565b6001600160a01b0381168a8501525060a0925061267a838601612193565b151592890192909252601f01601f19169096010194938401939290920191506001016125a4565b50505083151560208401529050949350505050565b808202811582820484141761081357610813612331565b6000826126ea57634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff810361270557612705612331565b60010192915050565b600081548084526020808501945083600052602060002060005b8381101561274d5781546001600160a01b031687529582019560019182019101612728565b509495945050505050565b60008151808452602080850194506020840160005b8381101561274d5781518752958201959082019060010161276d565b6001600160a01b038616815260a0602082018190526000906127ad9083018761270e565b82810360408401526127bf8187612758565b60608401959095525050608001529392505050565b8381526060602082015260006127ed606083018561270e565b82810360408401526127ff8185612758565b969550505050505056fea264697066735822122006bb97caa25271bd7b117332b16972e977b4647acac4e8f9f2000011e12897ab64736f6c63430008180033

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

00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000afb5adb1dd4a34c576fd2c6e055bf3bfd697c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000d3c21bcecceda10000000000000000000000000000000000000000000000000422ca8b0a00a425000000000000000000000000000000000000000000000000000000000000000000000e537472696b6550726f746f636f6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045354505200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): StrikeProtocol
Arg [1] : symbol_ (string): STPR
Arg [2] : totalSupply_ (uint256): 1000000000000000000000000000
Arg [3] : initialOwner (address): 0x00AFB5Adb1DD4A34c576fD2c6E055BF3bfD697C4
Arg [4] : _maxTax (uint256): 2500
Arg [5] : _minMaxTxAmount (uint256): 1000000000000000000000000
Arg [6] : _minMaxWalletAmount (uint256): 5000000000000000000000000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [3] : 00000000000000000000000000afb5adb1dd4a34c576fd2c6e055bf3bfd697c4
Arg [4] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [5] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [6] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [8] : 537472696b6550726f746f636f6c000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 5354505200000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

35546:16380:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18583:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20876:190;;;;;;;;;;-1:-1:-1;20876:190:0;;;;;:::i;:::-;;:::i;:::-;;;1523:14:1;;1516:22;1498:41;;1486:2;1471:18;20876:190:0;1358:187:1;19685:99:0;;;;;;;;;;-1:-1:-1;19764:12:0;;19685:99;;;1696:25:1;;;1684:2;1669:18;19685:99:0;1550:177:1;36334:45:0;;;;;;;;;;-1:-1:-1;36334:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36696:24;;;;;;;;;;-1:-1:-1;36696:24:0;;;;-1:-1:-1;;;;;36696:24:0;;;;;;-1:-1:-1;;;;;2257:32:1;;;2239:51;;2227:2;2212:18;36696:24:0;2093:203:1;51477:446:0;;;;;;;;;;-1:-1:-1;51477:446:0;;;;;:::i;:::-;;:::i;39592:287::-;;;;;;:::i;:::-;;:::i;:::-;;40354:199;;;;;;:::i;:::-;;:::i;36656:31::-;;;;;;;;;;-1:-1:-1;36656:31:0;;;;;:::i;:::-;;:::i;42015:224::-;;;;;;:::i;:::-;;:::i;19536:84::-;;;;;;;;;;-1:-1:-1;19536:84:0;;19610:2;3732:36:1;;3720:2;3705:18;19536:84:0;3590:184:1;48998:89:0;;;:::i;40976:198::-;;;;;;:::i;:::-;;:::i;36602:47::-;;;;;;;;;;-1:-1:-1;36602:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;38686:157;;;;;;:::i;:::-;;:::i;41669:180::-;;;;;;:::i;:::-;;:::i;42715:160::-;;;;;;:::i;:::-;;:::i;19847:118::-;;;;;;;;;;-1:-1:-1;19847:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;19939:18:0;19912:7;19939:18;;;;;;;;;;;;19847:118;30292:103;;;;;;;;;;;;;:::i;36386:51::-;;;;;;;;;;-1:-1:-1;36386:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29617:87;;;;;;;;;;-1:-1:-1;29690:6:0;;-1:-1:-1;;;;;29690:6:0;29617:87;;42355:208;;;;;;:::i;:::-;;:::i;36250:34::-;;;;;;;;;;;;;;;;18793:95;;;;;;;;;;;;;:::i;40035:157::-;;;;;;:::i;:::-;;:::i;38938:169::-;;;;;;:::i;:::-;;:::i;50809:380::-;;;;;;;;;;-1:-1:-1;50809:380:0;;;;;:::i;:::-;;:::i;36498:41::-;;;;;;;;;;-1:-1:-1;36498:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41330:186;;;;;;:::i;:::-;;:::i;35588:18::-;;;;;;;;;;-1:-1:-1;35588:18:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;40667:145::-;;;;;;:::i;:::-;;:::i;20415:142::-;;;;;;;;;;-1:-1:-1;20415:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;20522:18:0;;;20495:7;20522:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20415:142;36444:47;;;;;;;;;;-1:-1:-1;36444:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35644:24;;;;;;;;;;-1:-1:-1;35644:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5444:25:1;;;5500:2;5485:18;;5478:34;;;;5528:18;;;5521:34;;;;5586:2;5571:18;;5564:34;;;;5629:3;5614:19;;5607:35;;;;5673:3;5658:19;;5651:35;5717:3;5702:19;;5695:35;5774:14;5767:22;5761:3;5746:19;;5739:51;5834:14;5827:22;5821:3;5806:19;;5799:51;5894:14;5887:22;5881:3;5866:19;;5859:51;5431:3;5416:19;35644:24:0;5063:853:1;35613:24:0;;;;;;;;;;;;;;;;39227:251;;;;;;:::i;:::-;;:::i;30550:220::-;;;;;;;;;;-1:-1:-1;30550:220:0;;;;;:::i;:::-;;:::i;43215:869::-;;;;;;:::i;:::-;;:::i;36546:49::-;;;;;;;;;;-1:-1:-1;36546:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18583:91;18628:13;18661:5;18654:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18583:91;:::o;20876:190::-;20949:4;16375:10;21005:31;16375:10;21021:7;21030:5;21005:8;:31::i;:::-;21054:4;21047:11;;;20876:190;;;;;:::o;51477:446::-;51573:4;16375:10;51631:37;51647:4;16375:10;51662:5;51631:15;:37::i;:::-;51708:13;;51679:11;;51708:13;;;:18;51705:146;;51743:13;:17;;-1:-1:-1;;51743:17:0;51759:1;51743:17;;;51781:26;51791:4;51797:2;51801:5;51781:9;:26::i;:::-;51822:13;:17;;-1:-1:-1;;51822:17:0;51838:1;51822:17;;;51775:32;-1:-1:-1;51705:146:0;51861:32;51871:4;51877:2;51881:11;51889:3;51881:5;:11;:::i;:::-;51861:9;:32::i;:::-;51911:4;51904:11;;;;51477:446;;;;;;:::o;39592:287::-;29503:13;:11;:13::i;:::-;39704:27;;39685:46;::::1;39682:83;;;39740:25;;-1:-1:-1::0;;;39740:25:0::1;;;;;;;;;;;39682:83;39776:24:::0;:43;;;39835:36:::1;::::0;1696:25:1;;;39835:36:0::1;::::0;1684:2:1;1669:18;39835:36:0::1;;;;;;;;39592:287:::0;:::o;40354:199::-;29503:13;:11;:13::i;:::-;40446:25;:45;;;40507:38:::1;::::0;1696:25:1;;;40507:38:0::1;::::0;1684:2:1;1669:18;40507:38:0::1;1550:177:1::0;36656:31:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36656:31:0;;-1:-1:-1;36656:31:0;:::o;42015:224::-;29503:13;:11;:13::i;:::-;-1:-1:-1;;;;;42105:22:0;::::1;42102:47;;42136:13;;-1:-1:-1::0;;;42136:13:0::1;;;;;;;;;;;42102:47;-1:-1:-1::0;;;;;42160:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;:27;;-1:-1:-1;;42160:27:0::1;::::0;::::1;;::::0;;::::1;::::0;;;42203:28;;7517:51:1;;;7584:18;;;7577:50;42203:28:0::1;::::0;7490:18:1;42203:28:0::1;;;;;;;;42015:224:::0;;:::o;48998:89::-;29503:13;:11;:13::i;:::-;49061:18:::1;:16;:18::i;:::-;48998:89::o:0;40976:198::-;29503:13;:11;:13::i;:::-;-1:-1:-1;;;;;41074:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;;:37;;-1:-1:-1;;41074:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41127:39;;7517:51:1;;;7584:18;;;7577:50;41127:39:0::1;::::0;7490:18:1;41127:39:0::1;7349:284:1::0;38686:157:0;29503:13;:11;:13::i;:::-;38760:27;:36;;;::::1;;;;-1:-1:-1::0;;38760:36:0;;::::1;;::::0;;38812:23:::1;::::0;::::1;::::0;::::1;::::0;38790:6;1523:14:1;1516:22;1498:41;;1486:2;1471:18;;1358:187;41669:180:0;29503:13;:11;:13::i;:::-;-1:-1:-1;;;;;41761:22:0;::::1;;::::0;;;:12:::1;:22;::::0;;;;;;;;:31;;-1:-1:-1;;41761:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41808:33;;7517:51:1;;;7584:18;;;7577:50;41808:33:0::1;::::0;7490:18:1;41808:33:0::1;7349:284:1::0;42715:160:0;29503:13;:11;:13::i;:::-;42797:11:::1;:26:::0;;;42839:28:::1;::::0;1696:25:1;;;42839:28:0::1;::::0;1684:2:1;1669:18;42839:28:0::1;1550:177:1::0;30292:103:0;29503:13;:11;:13::i;:::-;30357:30:::1;30384:1;30357:18;:30::i;42355:208::-:0;29503:13;:11;:13::i;:::-;-1:-1:-1;;;;;42436:24:0;::::1;42433:49;;42469:13;;-1:-1:-1::0;;;42469:13:0::1;;;;;;;;;;;42433:49;42493:9;:22:::0;;-1:-1:-1;;;;;;42493:22:0::1;-1:-1:-1::0;;;;;42493:22:0;::::1;::::0;;::::1;::::0;;;42531:24:::1;::::0;2239:51:1;;;42531:24:0::1;::::0;2227:2:1;2212:18;42531:24:0::1;2093:203:1::0;18793:95:0;18840:13;18873:7;18866:14;;;;;:::i;40035:157::-;29503:13;:11;:13::i;:::-;40113:8:::1;:31:::0;;;40160:24:::1;::::0;1696:25:1;;;40160:24:0::1;::::0;1684:2:1;1669:18;40160:24:0::1;1550:177:1::0;38938:169:0;29503:13;:11;:13::i;:::-;39016:31;:40;;;::::1;;::::0;::::1;-1:-1:-1::0;;39016:40:0;;::::1;;::::0;;39072:27:::1;::::0;::::1;::::0;::::1;::::0;39050:6;1523:14:1;1516:22;1498:41;;1486:2;1471:18;;1358:187;50809:380:0;50972:13;;50887:4;;16375:10;;50887:4;;50972:13;;;:18;50969:147;;51007:13;:17;;-1:-1:-1;;51007:17:0;51023:1;51007:17;;;51045:27;51055:5;51062:2;51066:5;51045:9;:27::i;:::-;51087:13;:17;;-1:-1:-1;;51087:17:0;51103:1;51087:17;;;51039:33;-1:-1:-1;50969:147:0;51126:33;51136:5;51143:2;51147:11;51155:3;51147:5;:11;:::i;51126:33::-;-1:-1:-1;51177:4:0;;50809:380;-1:-1:-1;;;;50809:380:0:o;41330:186::-;29503:13;:11;:13::i;:::-;-1:-1:-1;;;;;41424:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;;:33;;-1:-1:-1;;41424:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;41473:35;;7517:51:1;;;7584:18;;;7577:50;41473:35:0::1;::::0;7490:18:1;41473:35:0::1;7349:284:1::0;35588:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35588:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35588:18:0;;;-1:-1:-1;;;;35588:18:0;;;;;-1:-1:-1;35588:18:0;;-1:-1:-1;35588:18:0:o;40667:145::-;29503:13;:11;:13::i;:::-;40739:19;:28;;-1:-1:-1;;40739:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;40783:21:::1;::::0;1498:41:1;;;40783:21:0::1;::::0;1486:2:1;1471:18;40783:21:0::1;1358:187:1::0;39227:251:0;29503:13;:11;:13::i;:::-;39327:23;;39312:38;::::1;39309:71;;;39359:21;;-1:-1:-1::0;;;39359:21:0::1;;;;;;;;;;;39309:71;39391:20:::0;:35;;;39442:28:::1;::::0;1696:25:1;;;39442:28:0::1;::::0;1684:2:1;1669:18;39442:28:0::1;1550:177:1::0;30550:220:0;29503:13;:11;:13::i;:::-;-1:-1:-1;;;;;30635:22:0;::::1;30631:93;;30681:31;::::0;-1:-1:-1;;;30681:31:0;;30709:1:::1;30681:31;::::0;::::1;2239:51:1::0;2212:18;;30681:31:0::1;;;;;;;;30631:93;30734:28;30753:8;30734:18;:28::i;:::-;30550:220:::0;:::o;43215:869::-;29503:13;:11;:13::i;:::-;43317:12:::1;43314:62;;;43346:18;:16;:18::i;:::-;43386:12;43393:5;;43386:12;:::i;:::-;43411:19;::::0;;;43507:317:::1;43523:17:::0;;::::1;43507:317;;;43593:1;43565:6:::0;;43572:1;43565:9;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;;;;;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;43565:30:0::1;::::0;43562:61:::1;;43604:19;;-1:-1:-1::0;;;43604:19:0::1;;;;;;;;;;;43562:61;43638:5;43649:6;;43656:1;43649:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43638:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;43638:21:0;;;::::1;::::0;;;;;::::1;;;;::::0;;::::1;:::i;:::-;;;43689:6;;43696:1;43689:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43674:32;::::0;43689:13:::1;;:17;43674:32:::0;::::1;:::i;:::-;;;43737:6;;43744:1;43737:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43721:34;::::0;43737:18;;::::1;43721:34:::0;::::1;:::i;:::-;;;43790:6;;43797:1;43790:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43770:42;::::0;43790:22;;::::1;43770:42:::0;::::1;:::i;:::-;::::0;-1:-1:-1;43542:3:0::1;;43507:317;;;-1:-1:-1::0;43834:9:0::1;:25:::0;;;43887:15;;43873:29;::::1;::::0;:63:::1;;-1:-1:-1::0;43921:15:0;;43906:30;::::1;43873:63;:101;;;-1:-1:-1::0;43959:15:0;;43940:34;::::1;43873:101;43870:155;;;43998:15;;-1:-1:-1::0;;;43998:15:0::1;;;;;;;;;;;43870:155;44042:34;44055:6;;44063:12;44042:34;;;;;;;;:::i;:::-;;;;;;;;43303:781;;;43215:869:::0;;;:::o;25703:130::-;25788:37;25797:5;25804:7;25813:5;25820:4;25788:8;:37::i;:::-;25703:130;;;:::o;27419:487::-;-1:-1:-1;;;;;20522:18:0;;;27519:24;20522:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;27586:37:0;;27582:317;;27663:5;27644:16;:24;27640:132;;;27696:60;;-1:-1:-1;;;27696:60:0;;-1:-1:-1;;;;;14872:32:1;;27696:60:0;;;14854:51:1;14921:18;;;14914:34;;;14964:18;;;14957:34;;;14827:18;;27696:60:0;14652:345:1;27640:132:0;27815:57;27824:5;27831:7;27859:5;27840:16;:24;27866:5;27815:8;:57::i;:::-;27508:398;27419:487;;;:::o;46015:2822::-;-1:-1:-1;;;;;46213:14:0;;46093:7;46213:14;;;:8;:14;;;;;;46093:7;;;;;;46213:14;;46210:58;;;46252:4;46244:12;;46210:58;-1:-1:-1;;;;;46281:12:0;;;;;;:8;:12;;;;;;;;46278:57;;;46319:4;46310:13;;46278:57;46349:5;46348:6;:17;;;;;46359:6;46358:7;46348:17;46345:66;;;-1:-1:-1;46395:4:0;46345:66;46423:48;46440:4;46446:2;46450:5;46457;46464:6;46423:16;:48::i;:::-;46482:31;46503:2;46507:5;46482:20;:31::i;:::-;46529:5;:25;;;;-1:-1:-1;;;;;;46538:16:0;;;;;;:12;:16;;;;;;;;46529:25;46526:65;;;46578:1;46571:8;;;;;;;46526:65;46606:6;:28;;;;-1:-1:-1;;;;;;46616:18:0;;;;;;:12;:18;;;;;;;;46606:28;46603:68;;;46658:1;46651:8;;;;;;;46603:68;46686:10;46683:127;;;-1:-1:-1;;;;;46716:18:0;;;;;;:12;:18;;;;;;;;;:38;;-1:-1:-1;;;;;;46738:16:0;;;;;;:12;:16;;;;;;;;46716:38;46713:86;;;46782:1;46775:8;;;;;;;46713:86;46826:19;;;;46822:60;;46869:1;46862:8;;;;;;;46822:60;46928:9;;-1:-1:-1;;;;;46928:9:0;;;;46952:26;;;;;:54;;;46996:9;-1:-1:-1;;;;;46982:24:0;:2;-1:-1:-1;;;;;46982:24:0;;46952:54;46949:94;;;47030:1;47023:8;;;;;;;;46949:94;47093:5;:12;47055:22;;47093:16;47090:1736;;47130:7;47126:1521;47147:5;:12;47143:16;;;;47126:1521;;;47185:11;47218:5;47215:546;;;47270:1;47251:5;47257:1;47251:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:12;;:16;;;:20;47248:120;;;47333:11;;47314:5;47320:1;47314:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:12;;:16;;;47306:5;:24;;;;:::i;:::-;:38;;;;:::i;:::-;47300:44;;47248:120;47215:546;;;47396:6;47393:368;;;47450:1;47430:5;47436:1;47430:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:12;;:17;;;:21;47427:122;;;47514:11;;47494:5;47500:1;47494:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:12;;:17;;;47486:5;:25;;;;:::i;47393:368::-;47577:10;47574:187;;;47639:1;47615:5;47621:1;47615:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:12;;:21;;;:25;47612:130;;;47707:11;;47683:5;47689:1;47683:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:12;;:21;;;47675:5;:29;;;;:::i;:::-;:43;;;;:::i;:::-;47669:49;;47612:130;47780:21;47798:3;47780:21;;:::i;:::-;;-1:-1:-1;47823:8:0;;47820:811;;47860:5;47866:1;47860:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;;;;;;;;;;47856:756;;47911:35;47919:4;47925:5;47931:1;47925:8;;;;;;;;;;:::i;:::-;;;;;;;;;:15;:8;;;;;:15;;-1:-1:-1;;;;;47925:15:0;47942:3;47911:7;:35::i;:::-;48004:5;48010:1;48004:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;;;;;;;-1:-1:-1;;;;;48004:15:0;-1:-1:-1;;;;;47978:93:0;47993:4;-1:-1:-1;;;;;47978:93:0;;47999:3;48021:5;48028:6;48036:10;48048:5;48054:1;48048:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;;;;;;;;;;47978:93;;;;;;;;;15632:25:1;;;15700:14;;15693:22;15688:2;15673:18;;15666:50;15759:14;;15752:22;15747:2;15732:18;;15725:50;15818:14;15811:22;15806:2;15791:18;;15784:50;15878:14;15871:22;15865:3;15850:19;;15843:51;15619:3;15604:19;;15397:503;47978:93:0;;;;;;;;47856:756;;;48161:3;48129:11;:28;48141:5;48147:1;48141:8;;;;;;;;;;:::i;:::-;;;;;;;;;:15;:8;;;;;:15;;;;;-1:-1:-1;;;;;48141:15:0;48129:28;;;;;;;;;;;;:35;;:28;;48141:8;48129:35;;;;;:::i;:::-;;;;;;;;48195:16;:33;48212:5;48218:1;48212:8;;;;;;;;;;:::i;:::-;;;;;;;;;:15;:8;;;;;:15;;;;;-1:-1:-1;;;;;48212:15:0;48195:33;;;;;;;;;;;;;;;48191:205;;48261:14;48281:5;48287:1;48281:8;;;;;;;;;;:::i;:::-;;;;;;;;;:15;:8;;;;;:15;;;;;48261:36;;48281:15;48261:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48261:36:0;-1:-1:-1;;;;;48281:15:0;;;48261:36;;;;;;48345:5;:8;;48328:16;;48281:8;48345:5;:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:15;;;-1:-1:-1;;;;;48345:15:0;48328:33;;;;;;;;;;;;:40;;-1:-1:-1;;48328:40:0;;;;;;;;;;48191:205;48422:38;48430:4;48444:9;48456:3;48422:7;:38::i;:::-;48526:9;-1:-1:-1;;;;;48492:96:0;48507:4;-1:-1:-1;;;;;48492:96:0;;48513:3;48538:5;48545:6;48553:10;48565:5;48571:1;48565:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;;;;;;;;;;48492:96;;;;;;;;;15632:25:1;;;15700:14;;15693:22;15688:2;15673:18;;15666:50;15759:14;;15752:22;15747:2;15732:18;;15725:50;15818:14;15811:22;15806:2;15791:18;;15784:50;15878:14;15871:22;15865:3;15850:19;;15843:51;15619:3;15604:19;;15397:503;48492:96:0;;;;;;;;47856:756;-1:-1:-1;47161:3:0;;;:::i;:::-;;;47126:1521;;;;48664:6;:60;;;;-1:-1:-1;48706:8:0;:18;-1:-1:-1;;;;;19939:18:0;;19912:7;19939:18;;;;;;;;;;;48674:50;48664:60;48661:118;;;48745:18;:16;:18::i;:::-;48800:14;-1:-1:-1;48793:21:0;;-1:-1:-1;;;;48793:21:0;47090:1736;46102:2735;;;;;46015:2822;;;;;:::o;22278:308::-;-1:-1:-1;;;;;22362:18:0;;22358:88;;22404:30;;-1:-1:-1;;;22404:30:0;;22431:1;22404:30;;;2239:51:1;2212:18;;22404:30:0;2093:203:1;22358:88:0;-1:-1:-1;;;;;22460:16:0;;22456:88;;22500:32;;-1:-1:-1;;;22500:32:0;;22529:1;22500:32;;;2239:51:1;2212:18;;22500:32:0;2093:203:1;22456:88:0;22554:24;22562:4;22568:2;22572:5;22554:7;:24::i;29782:166::-;29690:6;;-1:-1:-1;;;;;29690:6:0;16375:10;29842:23;29838:103;;29889:40;;-1:-1:-1;;;29889:40:0;;16375:10;29889:40;;;2239:51:1;2212:18;;29889:40:0;2093:203:1;49144:1431:0;49226:9;;-1:-1:-1;;;;;49226:9:0;49192:20;19939:18;;;;;;;;;;;49390:16;;49387:1181;;49468:14;:21;49423:28;;49454:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49454:36:0;;49423:67;;49509:6;49505:715;49525:14;:21;49521:25;;49505:715;;;49645:15;49663:11;:30;49675:14;49690:1;49675:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49675:17:0;49663:30;;;;;;;;;;;;;;-1:-1:-1;49715:11:0;;49712:493;;49792:12;49778:11;;49768:7;:21;;;;:::i;:::-;:36;;;;:::i;:::-;49751:11;49763:1;49751:14;;;;;;;;:::i;:::-;;;;;;;;;;:53;49846:25;;49830:41;;49827:359;;49933:1;49900:11;:30;49912:14;49927:1;49912:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;49912:17:0;49900:30;;;;;;;;;;;;:34;;;;49978:14;:17;;49961:16;;49912:17;;49993:1;;49978:17;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;49978:17:0;49961:35;;;;;;;;;;;;:43;;-1:-1:-1;;49961:43:0;;;;;;;;;;49827:359;;;50150:11;;50133;50145:1;50133:14;;;;;;;;:::i;:::-;;;;;;;50105:8;:25;;;:42;;;;:::i;:::-;:56;;;;:::i;:::-;50094:68;;:7;:68;:::i;:::-;50061:11;:30;50073:14;50088:1;50073:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;50073:17:0;50061:30;;;;;;;;;;;;:101;49827:359;-1:-1:-1;49548:3:0;;49505:715;;;-1:-1:-1;50308:11:0;;50321:25;;50234:113;;-1:-1:-1;;;50234:113:0;;-1:-1:-1;;;;;50234:29:0;;;;;:113;;50272:4;;50279:14;;50295:11;;50234:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50367:55;50380:12;50394:14;50410:11;50367:55;;;;;;;;:::i;:::-;;;;;;;;50456:25;;50440:41;;50437:102;;50502:21;50509:14;;50502:21;:::i;49387:1181::-;49181:1394;;49144:1431::o;30930:191::-;31023:6;;;-1:-1:-1;;;;;31040:17:0;;;-1:-1:-1;;;;;;31040:17:0;;;;;;;31073:40;;31023:6;;;31040:17;31023:6;;31073:40;;31004:16;;31073:40;30993:128;30930:191;:::o;26684:443::-;-1:-1:-1;;;;;26797:19:0;;26793:91;;26840:32;;-1:-1:-1;;;26840:32:0;;26869:1;26840:32;;;2239:51:1;2212:18;;26840:32:0;2093:203:1;26793:91:0;-1:-1:-1;;;;;26898:21:0;;26894:92;;26943:31;;-1:-1:-1;;;26943:31:0;;26971:1;26943:31;;;2239:51:1;2212:18;;26943:31:0;2093:203:1;26894:92:0;-1:-1:-1;;;;;26996:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;27042:78;;;;27093:7;-1:-1:-1;;;;;27077:31:0;27086:5;-1:-1:-1;;;;;27077:31:0;;27102:5;27077:31;;;;1696:25:1;;1684:2;1669:18;;1550:177;27077:31:0;;;;;;;;26684:443;;;;:::o;44457:583::-;44577:27;;;;;;;:36;44630:7;44574:74;44661:5;44658:100;;;-1:-1:-1;;;;;44686:18:0;;;;;;:14;:18;;;;;;;;44725:7;44683:64;;44771:6;44768:103;;;-1:-1:-1;;;;;44797:20:0;;;;;;:14;:20;;;;;;;;44838:7;44794:66;;44885:6;44884:7;:17;;;;;44896:5;44895:6;44884:17;44918:7;44881:55;44957:20;;44949:28;;44946:87;;;45001:20;;-1:-1:-1;;;45001:20:0;;;;;;;;;;;44946:87;44457:583;;;;;:::o;45225:358::-;45310:31;;;;;;;:40;;45345:5;45310:40;45307:78;;45225:358;;:::o;45307:78::-;-1:-1:-1;;;;;45398:22:0;;;;;;:18;:22;;;;;;;;45395:60;;;45225:358;;:::o;45395:60::-;45492:24;;45484:5;45468:13;45478:2;-1:-1:-1;;;;;19939:18:0;19912:7;19939:18;;;;;;;;;;;;19847:118;45468:13;:21;;;;:::i;:::-;:48;45465:111;;;45540:24;;-1:-1:-1;;;45540:24:0;;;;;;;;;;;22910:1135;-1:-1:-1;;;;;23000:18:0;;22996:552;;23154:5;23138:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;22996:552:0;;-1:-1:-1;22996:552:0;;-1:-1:-1;;;;;23214:15:0;;23192:19;23214:15;;;;;;;;;;;23248:19;;;23244:117;;;23295:50;;-1:-1:-1;;;23295:50:0;;-1:-1:-1;;;;;14872:32:1;;23295:50:0;;;14854:51:1;14921:18;;;14914:34;;;14964:18;;;14957:34;;;14827:18;;23295:50:0;14652:345:1;23244:117:0;-1:-1:-1;;;;;23484:15:0;;:9;:15;;;;;;;;;;23502:19;;;;23484:37;;22996:552;-1:-1:-1;;;;;23564:16:0;;23560:435;;23730:12;:21;;;;;;;23560:435;;;-1:-1:-1;;;;;23946:13:0;;:9;:13;;;;;;;;;;:22;;;;;;23560:435;24027:2;-1:-1:-1;;;;;24012:25:0;24021:4;-1:-1:-1;;;;;24012:25:0;;24031:5;24012:25;;;;1696::1;;1684:2;1669:18;;1550:177;24012:25:0;;;;;;;;22910:1135;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:423:1:-;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;160:3;363:1;356:4;347:6;342:3;338:16;334:27;327:38;426:4;419:2;415:7;410:2;402:6;398:15;394:29;389:3;385:39;381:50;374:57;;;14:423;;;;:::o;442:220::-;591:2;580:9;573:21;554:4;611:45;652:2;641:9;637:18;629:6;611:45;:::i;667:131::-;-1:-1:-1;;;;;742:31:1;;732:42;;722:70;;788:1;785;778:12;803:134;871:20;;900:31;871:20;900:31;:::i;:::-;803:134;;;:::o;942:315::-;1010:6;1018;1071:2;1059:9;1050:7;1046:23;1042:32;1039:52;;;1087:1;1084;1077:12;1039:52;1126:9;1113:23;1145:31;1170:5;1145:31;:::i;:::-;1195:5;1247:2;1232:18;;;;1219:32;;-1:-1:-1;;;942:315:1:o;1732:247::-;1791:6;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;1899:9;1886:23;1918:31;1943:5;1918:31;:::i;2301:456::-;2378:6;2386;2394;2447:2;2435:9;2426:7;2422:23;2418:32;2415:52;;;2463:1;2460;2453:12;2415:52;2502:9;2489:23;2521:31;2546:5;2521:31;:::i;:::-;2571:5;-1:-1:-1;2628:2:1;2613:18;;2600:32;2641:33;2600:32;2641:33;:::i;:::-;2301:456;;2693:7;;-1:-1:-1;;;2747:2:1;2732:18;;;;2719:32;;2301:456::o;2762:180::-;2821:6;2874:2;2862:9;2853:7;2849:23;2845:32;2842:52;;;2890:1;2887;2880:12;2842:52;-1:-1:-1;2913:23:1;;2762:180;-1:-1:-1;2762:180:1:o;2947:118::-;3033:5;3026:13;3019:21;3012:5;3009:32;2999:60;;3055:1;3052;3045:12;3070:128;3135:20;;3164:28;3135:20;3164:28;:::i;3203:382::-;3268:6;3276;3329:2;3317:9;3308:7;3304:23;3300:32;3297:52;;;3345:1;3342;3335:12;3297:52;3384:9;3371:23;3403:31;3428:5;3403:31;:::i;:::-;3453:5;-1:-1:-1;3510:2:1;3495:18;;3482:32;3523:30;3482:32;3523:30;:::i;:::-;3572:7;3562:17;;;3203:382;;;;;:::o;3779:241::-;3835:6;3888:2;3876:9;3867:7;3863:23;3859:32;3856:52;;;3904:1;3901;3894:12;3856:52;3943:9;3930:23;3962:28;3984:5;3962:28;:::i;4025:640::-;4294:3;4283:9;4276:22;4257:4;4315:46;4356:3;4345:9;4341:19;4333:6;4315:46;:::i;:::-;4307:54;;4403:6;4397:13;4392:2;4381:9;4377:18;4370:41;4465:2;4457:6;4453:15;4447:22;4442:2;4431:9;4427:18;4420:50;4524:2;4516:6;4512:15;4506:22;4501:2;4490:9;4486:18;4479:50;4595:1;4591;4586:3;4582:11;4578:19;4570:6;4566:32;4560:3;4549:9;4545:19;4538:61;4650:6;4643:14;4636:22;4630:3;4619:9;4615:19;4608:51;4025:640;;;;;;;:::o;4670:388::-;4738:6;4746;4799:2;4787:9;4778:7;4774:23;4770:32;4767:52;;;4815:1;4812;4805:12;4767:52;4854:9;4841:23;4873:31;4898:5;4873:31;:::i;:::-;4923:5;-1:-1:-1;4980:2:1;4965:18;;4952:32;4993:33;4952:32;4993:33;:::i;5921:773::-;6036:6;6044;6052;6105:2;6093:9;6084:7;6080:23;6076:32;6073:52;;;6121:1;6118;6111:12;6073:52;6161:9;6148:23;6190:18;6231:2;6223:6;6220:14;6217:34;;;6247:1;6244;6237:12;6217:34;6285:6;6274:9;6270:22;6260:32;;6330:7;6323:4;6319:2;6315:13;6311:27;6301:55;;6352:1;6349;6342:12;6301:55;6392:2;6379:16;6418:2;6410:6;6407:14;6404:34;;;6434:1;6431;6424:12;6404:34;6489:7;6482:4;6472:6;6469:1;6465:14;6461:2;6457:23;6453:34;6450:47;6447:67;;;6510:1;6507;6500:12;6447:67;6541:4;6533:13;;;;-1:-1:-1;6565:6:1;-1:-1:-1;;6606:20:1;;6593:34;6636:28;6593:34;6636:28;:::i;:::-;6683:5;6673:15;;;5921:773;;;;;:::o;6699:380::-;6778:1;6774:12;;;;6821;;;6842:61;;6896:4;6888:6;6884:17;6874:27;;6842:61;6949:2;6941:6;6938:14;6918:18;6915:38;6912:161;;6995:10;6990:3;6986:20;6983:1;6976:31;7030:4;7027:1;7020:15;7058:4;7055:1;7048:15;6912:161;;6699:380;;;:::o;7084:127::-;7145:10;7140:3;7136:20;7133:1;7126:31;7176:4;7173:1;7166:15;7200:4;7197:1;7190:15;7216:128;7283:9;;;7304:11;;;7301:37;;;7318:18;;:::i;7638:127::-;7699:10;7694:3;7690:20;7687:1;7680:31;7730:4;7727:1;7720:15;7754:4;7751:1;7744:15;7770:321;7859:4;7917:11;7904:25;8011:3;8007:8;7996;7980:14;7976:29;7972:44;7952:18;7948:69;7938:97;;8031:1;8028;8021:12;7938:97;8052:33;;;;;7770:321;-1:-1:-1;;7770:321:1:o;8096:127::-;8157:10;8152:3;8148:20;8145:1;8138:31;8188:4;8185:1;8178:15;8212:4;8209:1;8202:15;8354:543;8456:2;8451:3;8448:11;8445:446;;;8492:1;8516:5;8513:1;8506:16;8560:4;8557:1;8547:18;8630:2;8618:10;8614:19;8611:1;8607:27;8601:4;8597:38;8666:4;8654:10;8651:20;8648:47;;;-1:-1:-1;8689:4:1;8648:47;8744:2;8739:3;8735:12;8732:1;8728:20;8722:4;8718:31;8708:41;;8799:82;8817:2;8810:5;8807:13;8799:82;;;8862:17;;;8843:1;8832:13;8799:82;;;8803:3;;;8354:543;;;:::o;9333:176::-;9378:11;9430:3;9417:17;9443:31;9468:5;9443:31;:::i;9714:170::-;9756:11;9808:3;9795:17;9821:28;9843:5;9821:28;:::i;10106:1980::-;10274:5;10261:19;10359:2;10355:7;10347:5;10331:14;10327:26;10323:40;10303:18;10299:65;10289:93;;10378:1;10375;10368:12;10289:93;10403:30;;10456:18;;10497;10486:30;;10483:50;;;10529:1;10526;10519:12;10483:50;10552:4;10607:6;10591:14;10587:27;10582:2;10576:4;10572:13;10568:47;10565:67;;;10628:1;10625;10618:12;10565:67;10641:97;10731:6;10691:38;10723:4;10717:11;10691:38;:::i;:::-;10685:4;10641:97;:::i;:::-;10764:1;10792:2;10784:6;10781:14;10809:1;10804:644;;;;11494:1;11511:6;11508:108;;;-1:-1:-1;11576:20:1;;;11572:29;;11559:43;11508:108;-1:-1:-1;;9030:1:1;9026:11;;;9022:24;9018:29;9008:40;9054:1;9050:11;;;9005:57;11629:83;;10774:948;;10804:644;8301:1;8294:14;;;8338:4;8325:18;;-1:-1:-1;;10840:20:1;;;10944:9;10966:235;10980:7;10977:1;10974:14;10966:235;;;11071:20;;;11067:29;;11054:43;11039:59;;11169:18;;;;11137:1;11125:14;;;;10996:10;;10966:235;;;10970:3;11229:6;11220:7;11217:19;11214:175;;;11369:1;11365:6;11359:3;11350:6;11347:1;11343:14;11339:24;11335:37;11331:42;11325:2;11313:9;11307:4;11303:20;11299:29;11286:43;11282:92;11274:6;11267:108;11214:175;;;11435:1;11426:6;11423:1;11419:14;11415:22;11409:4;11402:36;10774:948;-1:-1:-1;;11807:14:1;;9184:19;;11803:1;11793:12;;9171:33;9258:2;9247:14;;9234:28;9220:12;;;9213:50;9317:2;9306:14;9293:28;9279:12;;;9272:50;-1:-1:-1;;11859:1:1;11849:12;;11870:105;11930:44;11969:3;11958:15;;11930:44;:::i;:::-;9618:11;;-1:-1:-1;;;;;;9614:54:1;-1:-1:-1;;;;;9670:31:1;;;;9611:91;9598:105;;9514:195;11870:105;11984:96;12038:41;12074:3;12067:5;12063:15;12038:41;:::i;:::-;12026:10;9977:11;;-1:-1:-1;;;;10013:27:1;10062:13;;10055:21;10083:3;10046:31;-1:-1:-1;;;10042:51:1;10010:84;;;;9997:98;;9889:212;12091:125;12156:9;;;12177:10;;;12174:36;;;12190:18;;:::i;12456:2191::-;12722:2;12734:21;;;12707:18;;12790:22;;;-1:-1:-1;12843:2:1;12892:1;12888:14;;;12873:30;;12869:39;;;12828:18;;12931:6;-1:-1:-1;12965:1599:1;12979:6;12976:1;12973:13;12965:1599;;;13044:22;;;-1:-1:-1;;13040:36:1;13028:49;;13116:20;;13191:14;13187:27;;;-1:-1:-1;;13183:42:1;13159:67;;13149:95;;13240:1;13237;13230:12;13149:95;13270:31;;13324:4;13369:19;;13445:14;13441:26;;;-1:-1:-1;;13437:40:1;13411:67;;13401:95;;13492:1;13489;13482:12;13401:95;13524:32;;13627:4;13659:16;;;;13583:21;;13702:18;13691:30;;13688:50;;;13734:1;13731;13724:12;13688:50;13787:6;13771:14;13767:27;13758:7;13754:41;13751:61;;;13808:1;13805;13798:12;13751:61;13840:2;13832:6;13825:18;13880:6;13875:2;13867:6;13863:15;13856:31;13910:3;13900:13;;13965:6;13956:7;13951:2;13943:6;13939:15;13926:46;14022:1;14017:2;14008:6;14000;13996:19;13992:28;13985:39;14037:63;14096:2;14088:6;14084:15;14079:2;14072:5;14068:14;12299:19;;12287:32;;12375:4;12364:16;;;12351:30;12335:14;;;12328:54;12438:4;12427:16;;;12414:30;12398:14;;12391:54;12221:230;14037:63;14123:4;14113:14;;14160:34;14190:2;14183:5;14179:14;14160:34;:::i;:::-;-1:-1:-1;;;;;2050:31:1;;14240:15;;;2038:44;14207:49;14279:4;14269:14;;14318:31;14345:2;14338:5;14334:14;14318:31;:::i;:::-;1332:13;1325:21;14394:15;;;1313:34;;;;14474:2;14453:15;-1:-1:-1;;14449:29:1;14437:42;;;14433:51;;14542:12;;;;14507:15;;;;;-1:-1:-1;13001:1:1;12994:9;12965:1599;;;-1:-1:-1;;;1332:13:1;;1325:21;14635:4;14620:20;;1313:34;14581:6;-1:-1:-1;12456:2191:1;;;;;;:::o;15002:168::-;15075:9;;;15106;;15123:15;;;15117:22;;15103:37;15093:71;;15144:18;;:::i;15175:217::-;15215:1;15241;15231:132;;15285:10;15280:3;15276:20;15273:1;15266:31;15320:4;15317:1;15310:15;15348:4;15345:1;15338:15;15231:132;-1:-1:-1;15377:9:1;;15175:217::o;15905:175::-;15942:3;15986:4;15979:5;15975:16;16015:4;16006:7;16003:17;16000:43;;16023:18;;:::i;:::-;16072:1;16059:15;;15905:175;-1:-1:-1;;15905:175:1:o;16085:499::-;16146:3;16184:5;16178:12;16211:6;16206:3;16199:19;16237:4;16266;16261:3;16257:14;16250:21;;16290:5;16287:1;16280:16;16332:4;16329:1;16319:18;16355:1;16365:194;16379:6;16376:1;16373:13;16365:194;;;16444:13;;-1:-1:-1;;;;;16440:39:1;16428:52;;16500:12;;;;16476:1;16535:14;;;;16394:9;16365:194;;;-1:-1:-1;16575:3:1;;16085:499;-1:-1:-1;;;;;16085:499:1:o;16589:439::-;16642:3;16680:5;16674:12;16707:6;16702:3;16695:19;16733:4;16762;16757:3;16753:14;16746:21;;16801:4;16794:5;16790:16;16824:1;16834:169;16848:6;16845:1;16842:13;16834:169;;;16909:13;;16897:26;;16943:12;;;;16978:15;;;;16870:1;16863:9;16834:169;;17033:712;-1:-1:-1;;;;;17371:32:1;;17353:51;;17391:3;17435:2;17420:18;;17413:31;;;-1:-1:-1;;17467:65:1;;17512:19;;17504:6;17467:65;:::i;:::-;17580:9;17572:6;17568:22;17563:2;17552:9;17548:18;17541:50;17608:44;17645:6;17637;17608:44;:::i;:::-;17683:2;17668:18;;17661:34;;;;-1:-1:-1;;17726:3:1;17711:19;17704:35;17600:52;17033:712;-1:-1:-1;;;17033:712:1:o;17750:541::-;18032:6;18021:9;18014:25;18075:2;18070;18059:9;18055:18;18048:30;17995:4;18101:64;18161:2;18150:9;18146:18;18138:6;18101:64;:::i;:::-;18213:9;18205:6;18201:22;18196:2;18185:9;18181:18;18174:50;18241:44;18278:6;18270;18241:44;:::i;:::-;18233:52;17750:541;-1:-1:-1;;;;;;17750:541:1:o

Swarm Source

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