ETH Price: $3,667.15 (+1.84%)

Token

ERC-20: ELONWIFTRUMP ($EWT)
 

Overview

Max Total Supply

69,472,024 $EWT

Holders

358

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 $EWT

Value
$0.00
0x7bf0380ce60bb933ea12e7e1c1e1e77e0d02f28e
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:
ELONWIFTRUMP

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
  _____  _      _____  _   _  _    _  _____ ______  _____ ______  _   _ ___  _________ 
|  ___|| |    |  _  || \ | || |  | ||_   _||  ___||_   _|| ___ \| | | ||  \/  || ___ \
| |__  | |    | | | ||  \| || |  | |  | |  | |_     | |  | |_/ /| | | || .  . || |_/ /
|  __| | |    | | | || . ` || |/\| |  | |  |  _|    | |  |    / | | | || |\/| ||  __/ 
| |___ | |____\ \_/ /| |\  |\  /\  / _| |_ | |      | |  | |\ \ | |_| || |  | || |    
\____/ \_____/ \___/ \_| \_/ \/  \/  \___/ \_|      \_/  \_| \_| \___/ \_|  |_/\_|    
                                                                                      
Join The Revolution!
Let’s Make America Great Again!                                                                 
                                                                                                                                                                         
Website: https://http://elonwiftrump.us/
Twitter: https://x.com/ElonWifTrump
Telegram: https://t.me/ElonWifTrumpeth
*/

// SPDX-License-Identifier: MIT
// File: contracts/interfaces/IUniswapV2Factory.sol



pragma solidity 0.8.23;

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

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

// File: contracts/interfaces/IUniswapV2Router.sol



pragma solidity 0.8.23;

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

    function WETH() external pure returns (address);

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

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

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

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

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

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.20;

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

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

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

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


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

pragma solidity ^0.8.20;


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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.20;


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

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

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

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


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

pragma solidity ^0.8.20;





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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal virtual {
        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/ELONWIFTRUMP.sol

/*
  _____  _      _____  _   _  _    _  _____ ______  _____ ______  _   _ ___  _________ 
|  ___|| |    |  _  || \ | || |  | ||_   _||  ___||_   _|| ___ \| | | ||  \/  || ___ \
| |__  | |    | | | ||  \| || |  | |  | |  | |_     | |  | |_/ /| | | || .  . || |_/ /
|  __| | |    | | | || . ` || |/\| |  | |  |  _|    | |  |    / | | | || |\/| ||  __/ 
| |___ | |____\ \_/ /| |\  |\  /\  / _| |_ | |      | |  | |\ \ | |_| || |  | || |    
\____/ \_____/ \___/ \_| \_/ \/  \/  \___/ \_|      \_/  \_| \_| \___/ \_|  |_/\_|    
                                                                                      
Join The Revolution!
Let’s Make America Great Again!                                                                 
                                                                                                                                                                         
Website: https://http://elonwiftrump.us/
Twitter: https://x.com/ElonWifTrump
Telegram: https://t.me/ElonWifTrumpeth
*/

pragma solidity 0.8.23;





contract ELONWIFTRUMP is ERC20, Ownable {
    address public marketingWallet;
    uint16 public buyFee = 0;
    uint16 public sellFee = 0;
    uint256 public swapTokensAtAmount = 34_736 * 1e18; // 0.05% 
    bool private _distributingFees;

    mapping(address => bool) private _excludedFromFees;

    bool public limitsInEffect = true;
    uint256 public maxWalletBalance = 1_389_440 * 1e18; // 2% 
    mapping(address => bool) private _excludedFromMaxWalletBalance;

    address public immutable uniV2Pair;
    IUniswapV2Router public constant uniV2Router = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    bool public tradingEnabled;

    event LimitsRemoved();
    event TradingEnabled();
    event BuyFeeSet(uint16 newBuyFee);
    event SellFeeSet(uint16 newSellFee);
    event MarketingWalletUpdated(address newAddress);
    event SwapTokensAtAmountSet(uint256 newSwapTokensAtAmount);
    event FeesDistributed(uint256 totalTokensDistributed);

    /**
     * @notice Constructor function for the ELONWIFTRUMP contract.
     * It initializes the contract by setting the token name and symbol,
     * creates a Uniswap V2 pair for the token, sets initial values for marketing and operations wallets and
     * mints total token supply.
     * It also approves the Uniswap V2 router to spend an unlimited amount of tokens on behalf of the contract.
     */
    constructor() ERC20("ELONWIFTRUMP", "$EWT") Ownable(msg.sender) {
        uniV2Pair = IUniswapV2Factory(uniV2Router.factory()).createPair(address(this), uniV2Router.WETH());
        _excludedFromMaxWalletBalance[uniV2Pair] = true;

        _excludedFromFees[owner()] = true;
        marketingWallet = owner();

        _mint(owner(), 69_472_024 * 1e18);

        _approve(address(this), address(uniV2Router), type(uint256).max);
    }

    receive() external payable {}

    /**
     * @notice This function is used to transfer tokens internally within the contract.
     * It performs various checks such as trading enablement, maximum transaction and balance limits,
     * fee distribution, and fee deduction.
     * It then calls the _transfer function from the parent contract to perform the actual token transfer.
     * @param from The address to transfer tokens from.
     * @param to The address to transfer tokens to.
     * @param amount The amount of tokens to transfer.
     */
    function _transfer(address from, address to, uint256 amount) internal override {
        require(amount > 0, "ELONWIFTRUMP: transfer amount must be greater than 0");

        // Check if trading has been enabled
        if (!tradingEnabled) {
            require(from == owner() || to == owner(), "ELONWIFTRUMP: trading has not been enabled yet");
        }

        // Max TX and Max Balance Limits
        if (limitsInEffect) {
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_distributingFees) {
                // On Buys
                if (from == uniV2Pair && !_excludedFromMaxWalletBalance[to]) {
                    require(
                        amount + balanceOf(to) <= maxWalletBalance, "ELONWIFTRUMP: balance would NEVER exceed max wallet balance"
                    );
                }
                // On Transfers to non-excluded "to" address
                else if (!_excludedFromMaxWalletBalance[to]) {
                    require(
                        amount + balanceOf(to) <= maxWalletBalance, "ELONWIFTRUMP: balance would NEVER exceed max wallet balance"
                    );
                }
            }
        }

        // Swap any tokens held as fees for ETH and distribute
        bool shouldSwap = balanceOf(address(this)) >= swapTokensAtAmount;
        if (shouldSwap && !_distributingFees && from != uniV2Pair && !_excludedFromFees[from] && !_excludedFromFees[to])
        {
            _distributingFees = true;
            _distributeFees();
            _distributingFees = false;
        }

        // Determine if we should take fees
        bool takeFees = !_distributingFees;
        if (_excludedFromFees[from] || _excludedFromFees[to]) {
            takeFees = false;
        }

        uint256 fees = 0;
        // Take Fees if necessary
        if (takeFees) {
            // Fees on buys
            if (from == uniV2Pair && buyFee > 0) {
                fees = (amount * buyFee) / 1_000;
            }
            // Fees on sells
            else if (to == uniV2Pair && sellFee > 0) {
                fees = (amount * sellFee) / 1_000;
            }

            // If there are fees to be taken, transfer and substract from amount
            if (fees > 0) {
                super._transfer(from, address(this), fees);
                amount -= fees;
            }
        }

        // Make final transfer
        super._transfer(from, to, amount);
    }

    /**
     * @notice Distributes fees collected by the contract.
     * The function calculates the amount of fees to distribute based on the
     * balance of the contract and a max threshold of 20 times the swapTokensAtAmount.
     * @dev Emits a `FeesDistributed` event with the amount distributed.
     */
    function _distributeFees() private {
        // Determine amount of held fees to distribute
        uint256 tokensToDistribute = balanceOf(address(this));
        if (tokensToDistribute > swapTokensAtAmount * 20) {
            tokensToDistribute = swapTokensAtAmount * 20;
        }

        // Swap tokens for ETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniV2Router.WETH();
        try uniV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToDistribute, 0, path, address(this), block.timestamp
        ) {} catch {}

        // Send ETH to Marketing
        uint256 ethBalance = address(this).balance;
        if (ethBalance > 0) {
            (bool success,) = marketingWallet.call{value: ethBalance}("");
            if (success) {
                emit FeesDistributed(tokensToDistribute);
            }
        }
    }

    /**
     * @notice Returns whether the specified account is excluded from fees.
     * @param account The address to check.
     * @return A boolean indicating whether the account is excluded from fees.
     */
    function isExcludedFromFees(address account) public view returns (bool) {
        return _excludedFromFees[account];
    }

    /**
     * @notice Returns whether the specified account is excluded from the maximum wallet balance limit.
     * @param account The address to check.
     * @return A boolean indicating whether the account is excluded from the maximum wallet balance limit.
     */
    function isExcludedFromMaxWalletBalance(address account) public view returns (bool) {
        return _excludedFromMaxWalletBalance[account];
    }

    /**
     * @notice Enables trading of the token.
     * @dev Can only be called by the contract owner.
     * @dev Emits a `TradingEnabled` event.
     */
    function enableTrading() external onlyOwner {
        tradingEnabled = true;
        emit TradingEnabled();
    }

    /**
     * @notice Updates the marketing wallet address.
     * @param newAddress The new address for the marketing wallet.
     * @dev Can only be called by the contract owner.
     * @dev `newAddress` cannot be the zero address.
     * @dev Emits a `MarketingWalletUpdated` event.
     */
    function updateMarketingWallet(address newAddress) external onlyOwner {
        require(newAddress != address(0), "ELONWIFTRUMP: address cannot be 0 address");
        marketingWallet = newAddress;
        emit MarketingWalletUpdated(newAddress);
    }

    /**
     * @notice Removes the max transcation and max wallet balance limits on the token.
     * @dev Can only be called by the contract owner.
     * @dev Once turned off, the limits cannot be turned back on.
     * @dev Emits a `LimitsRemoved` event.
     */
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit LimitsRemoved();
    }

    /**
     * @notice Sets the amount of tokens required for a fee tokens swap.
     * @param newSwapTokensAtAmount The new amount of tokens required for a swap.
     * @dev Can only be called by the contract owner.
     * @dev The newSwapTokensAtAmount must be greater than or equal to 0.001% of the total supply,
     * and less than or equal to 0.5% of the total supply.
     * @dev Emits a `SwapTokensAtAmountSet` event.
     */
    function setSwapTokensAtAmount(uint256 newSwapTokensAtAmount) external onlyOwner {
        require(
            newSwapTokensAtAmount >= totalSupply() / 100_000,
            "ELONWIFTRUMP: swap tokens at amount cannot be lower than 0.001% of total supply"
        );
        require(
            newSwapTokensAtAmount <= (totalSupply() * 5) / 1_000,
            "ELONWIFTRUMP: swap tokens at amount cannot be higher than 0.5% of total supply"
        );
        swapTokensAtAmount = newSwapTokensAtAmount;
        emit SwapTokensAtAmountSet(newSwapTokensAtAmount);
    }

    /**
     * @notice Sets the buy fee for ELONWIFTRUMP.
     * @param newBuyFee The new buy fee to be set.
     * @dev Can only be called by the contract owner.
     * @dev The new buy fee cannot be greater than 400 (40%).
     * @dev Emits a `BuyFeeSet` event.
     */
    function setBuyFee(uint16 newBuyFee) external onlyOwner {
        require(newBuyFee <= 400, "ELONWIFTRUMP: fee cannot be greater than 40%");
        buyFee = newBuyFee;
        emit BuyFeeSet(newBuyFee);
    }

    /**
     * @notice Sets the sell fee for ELONWIFTRUMP.
     * @param newSellFee The new sell fee to be set.
     * @dev Can only be called by the contract owner.
     * @dev The new sell fee cannot be greater than 400 (40%).
     * @dev Emits a `SellFeeSet` event.
     */
    function setSellFee(uint16 newSellFee) external onlyOwner {
        require(newSellFee <= 400, "ELONWIFTRUMP: fee cannot be greater than 40%");
        sellFee = newSellFee;
        emit SellFeeSet(newSellFee);
    }

    /**
     * @notice Sets the excluded status of an account from fees.
     * @param account The address of the account.
     * @param excluded The excluded status to be set.
     * @dev Only the contract owner can call this function.
     */
    function setExcludedFromFees(address account, bool excluded) external onlyOwner {
        _excludedFromFees[account] = excluded;
    }

    /**
     * @notice Sets whether an account is excluded from the maximum wallet balance limit.
     * @param account The address of the account to be excluded or included.
     * @param excluded A boolean indicating whether the account should be excluded or included.
     * @dev Only the contract owner can call this function.
     */
    function setExcludedFromMaxWalletBalance(address account, bool excluded) external onlyOwner {
        _excludedFromMaxWalletBalance[account] = excluded;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newBuyFee","type":"uint16"}],"name":"BuyFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalTokensDistributed","type":"uint256"}],"name":"FeesDistributed","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitsRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"MarketingWalletUpdated","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":"uint16","name":"newSellFee","type":"uint16"}],"name":"SellFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSwapTokensAtAmount","type":"uint256"}],"name":"SwapTokensAtAmountSet","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWalletBalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"newBuyFee","type":"uint16"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromMaxWalletBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newSellFee","type":"uint16"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapTokensAtAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040525f600660146101000a81548161ffff021916908361ffff1602179055505f600660166101000a81548161ffff021916908361ffff16021790555069075b0ad658c8d0c000006007556001600a5f6101000a81548160ff0219169083151502179055506a012639b17ddf609e000000600b5534801562000081575f80fd5b50336040518060400160405280600c81526020017f454c4f4e5749465452554d5000000000000000000000000000000000000000008152506040518060400160405280600481526020017f2445575400000000000000000000000000000000000000000000000000000000815250816003908162000100919062000cc5565b50806004908162000112919062000cc5565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000188575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200017f919062000dec565b60405180910390fd5b6200019981620004d660201b60201c565b50737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200021e919062000e3a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000298573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002be919062000e3a565b6040518363ffffffff1660e01b8152600401620002dd92919062000e6a565b6020604051808303815f875af1158015620002fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000320919062000e3a565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506001600c5f60805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160095f620003bf6200059960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506200041e6200059960201b60201c565b60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000489620004716200059960201b60201c565b6a397745f7a6c1b68d600000620005c160201b60201c565b620004d030737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200064b60201b60201c565b62000f63565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000634575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016200062b919062000dec565b60405180910390fd5b620006475f83836200066560201b60201c565b5050565b6200066083838360016200088960201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620006b9578060025f828254620006ac919062000ec2565b925050819055506200078a565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000745578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200073c9392919062000f0d565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007d3578060025f82825403925050819055506200081d565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200087c919062000f48565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620008fc575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401620008f3919062000dec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200096f575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162000966919062000dec565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801562000a5b578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000a52919062000f48565b60405180910390a35b50505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000add57607f821691505b60208210810362000af35762000af262000a98565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b1a565b62000b63868362000b1a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000bad62000ba762000ba18462000b7b565b62000b84565b62000b7b565b9050919050565b5f819050919050565b62000bc88362000b8d565b62000be062000bd78262000bb4565b84845462000b26565b825550505050565b5f90565b62000bf662000be8565b62000c0381848462000bbd565b505050565b5b8181101562000c2a5762000c1e5f8262000bec565b60018101905062000c09565b5050565b601f82111562000c795762000c438162000af9565b62000c4e8462000b0b565b8101602085101562000c5e578190505b62000c7662000c6d8562000b0b565b83018262000c08565b50505b505050565b5f82821c905092915050565b5f62000c9b5f198460080262000c7e565b1980831691505092915050565b5f62000cb5838362000c8a565b9150826002028217905092915050565b62000cd08262000a61565b67ffffffffffffffff81111562000cec5762000ceb62000a6b565b5b62000cf8825462000ac5565b62000d0582828562000c2e565b5f60209050601f83116001811462000d3b575f841562000d26578287015190505b62000d32858262000ca8565b86555062000da1565b601f19841662000d4b8662000af9565b5f5b8281101562000d745784890151825560018201915060208501945060208101905062000d4d565b8683101562000d94578489015162000d90601f89168262000c8a565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000dd48262000da9565b9050919050565b62000de68162000dc8565b82525050565b5f60208201905062000e015f83018462000ddb565b92915050565b5f80fd5b62000e168162000dc8565b811462000e21575f80fd5b50565b5f8151905062000e348162000e0b565b92915050565b5f6020828403121562000e525762000e5162000e07565b5b5f62000e618482850162000e24565b91505092915050565b5f60408201905062000e7f5f83018562000ddb565b62000e8e602083018462000ddb565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000ece8262000b7b565b915062000edb8362000b7b565b925082820190508082111562000ef65762000ef562000e95565b5b92915050565b62000f078162000b7b565b82525050565b5f60608201905062000f225f83018662000ddb565b62000f31602083018562000efc565b62000f40604083018462000efc565b949350505050565b5f60208201905062000f5d5f83018462000efc565b92915050565b608051612e5662000f985f395f8181610b370152818161132701528181611506015281816116fc01526117a30152612e565ff3fe6080604052600436106101db575f3560e01c8063751039fc11610101578063a9059cbb11610094578063dd62ed3e11610063578063dd62ed3e1461067a578063e064648a146106b6578063e2f45605146106de578063f2fde38b14610708576101e2565b8063a9059cbb146105c4578063aacebbe314610600578063afa4f3b214610628578063bbde77c114610650576101e2565b80638da5cb5b116100d05780638da5cb5b1461051e57806394a9839014610548578063958c2e521461057057806395d89b411461059a576101e2565b8063751039fc1461049e57806375f0a874146104b45780638a8c523c146104de5780638bcea939146104f4576101e2565b80634a62bb6511610179578063686d83c311610148578063686d83c3146103e857806370a082311461042457806370c4767114610460578063715018a614610488576101e2565b80634a62bb65146103305780634ada218b1461035a5780634fbee19314610384578063590ffdce146103c0576101e2565b806323b872dd116101b557806323b872dd146102765780632b14ca56146102b2578063313ce567146102dc5780634706240214610306576101e2565b806306fdde03146101e6578063095ea7b31461021057806318160ddd1461024c576101e2565b366101e257005b5f80fd5b3480156101f1575f80fd5b506101fa610730565b604051610207919061221d565b60405180910390f35b34801561021b575f80fd5b50610236600480360381019061023191906122ce565b6107c0565b6040516102439190612326565b60405180910390f35b348015610257575f80fd5b506102606107e2565b60405161026d919061234e565b60405180910390f35b348015610281575f80fd5b5061029c60048036038101906102979190612367565b6107eb565b6040516102a99190612326565b60405180910390f35b3480156102bd575f80fd5b506102c6610819565b6040516102d391906123d3565b60405180910390f35b3480156102e7575f80fd5b506102f061082d565b6040516102fd9190612407565b60405180910390f35b348015610311575f80fd5b5061031a610835565b60405161032791906123d3565b60405180910390f35b34801561033b575f80fd5b50610344610849565b6040516103519190612326565b60405180910390f35b348015610365575f80fd5b5061036e61085b565b60405161037b9190612326565b60405180910390f35b34801561038f575f80fd5b506103aa60048036038101906103a59190612420565b61086d565b6040516103b79190612326565b60405180910390f35b3480156103cb575f80fd5b506103e660048036038101906103e19190612475565b6108bf565b005b3480156103f3575f80fd5b5061040e60048036038101906104099190612420565b61091f565b60405161041b9190612326565b60405180910390f35b34801561042f575f80fd5b5061044a60048036038101906104459190612420565b610971565b604051610457919061234e565b60405180910390f35b34801561046b575f80fd5b50610486600480360381019061048191906124dd565b6109b6565b005b348015610493575f80fd5b5061049c610a5e565b005b3480156104a9575f80fd5b506104b2610a71565b005b3480156104bf575f80fd5b506104c8610ac0565b6040516104d59190612517565b60405180910390f35b3480156104e9575f80fd5b506104f2610ae5565b005b3480156104ff575f80fd5b50610508610b35565b6040516105159190612517565b60405180910390f35b348015610529575f80fd5b50610532610b59565b60405161053f9190612517565b60405180910390f35b348015610553575f80fd5b5061056e60048036038101906105699190612475565b610b81565b005b34801561057b575f80fd5b50610584610be1565b604051610591919061258b565b60405180910390f35b3480156105a5575f80fd5b506105ae610bf9565b6040516105bb919061221d565b60405180910390f35b3480156105cf575f80fd5b506105ea60048036038101906105e591906122ce565b610c89565b6040516105f79190612326565b60405180910390f35b34801561060b575f80fd5b5061062660048036038101906106219190612420565b610cab565b005b348015610633575f80fd5b5061064e600480360381019061064991906125a4565b610d9b565b005b34801561065b575f80fd5b50610664610e9f565b604051610671919061234e565b60405180910390f35b348015610685575f80fd5b506106a0600480360381019061069b91906125cf565b610ea5565b6040516106ad919061234e565b60405180910390f35b3480156106c1575f80fd5b506106dc60048036038101906106d791906124dd565b610f27565b005b3480156106e9575f80fd5b506106f2610fcf565b6040516106ff919061234e565b60405180910390f35b348015610713575f80fd5b5061072e60048036038101906107299190612420565b610fd5565b005b60606003805461073f9061263a565b80601f016020809104026020016040519081016040528092919081815260200182805461076b9061263a565b80156107b65780601f1061078d576101008083540402835291602001916107b6565b820191905f5260205f20905b81548152906001019060200180831161079957829003601f168201915b5050505050905090565b5f806107ca611059565b90506107d7818585611060565b600191505092915050565b5f600254905090565b5f806107f5611059565b9050610802858285611072565b61080d858585611104565b60019150509392505050565b600660169054906101000a900461ffff1681565b5f6012905090565b600660149054906101000a900461ffff1681565b600a5f9054906101000a900460ff1681565b600d5f9054906101000a900460ff1681565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6108c761187b565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6109be61187b565b6101908161ffff161115610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906126da565b60405180910390fd5b80600660146101000a81548161ffff021916908361ffff1602179055507f36fa651f7bdbb8a6a7289ed4df5a6e3efb1fdcaef87c1f88dfd66b08d2007dc281604051610a5391906123d3565b60405180910390a150565b610a6661187b565b610a6f5f611902565b565b610a7961187b565b5f600a5f6101000a81548160ff0219169083151502179055507f7bfa7bacf025baa75e5308bf15bcf2948f406c7ebe3eb1a8bb611862b9d647ef60405160405180910390a1565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aed61187b565b6001600d5f6101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610b8961187b565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b606060048054610c089061263a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c349061263a565b8015610c7f5780601f10610c5657610100808354040283529160200191610c7f565b820191905f5260205f20905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b5f80610c93611059565b9050610ca0818585611104565b600191505092915050565b610cb361187b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1890612768565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fbf86feedee5b30c30a8243bd21deebb704d141478d39b1be04fe5ee739f214e781604051610d909190612517565b60405180910390a150565b610da361187b565b620186a0610daf6107e2565b610db991906127e0565b811015610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df2906128a6565b60405180910390fd5b6103e86005610e086107e2565b610e1291906128c4565b610e1c91906127e0565b811115610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e559061299b565b60405180910390fd5b806007819055507f9efd5e66ee602c629f311865749d9af922866664ad3ff96bbfaf8035f5d24b2681604051610e94919061234e565b60405180910390a150565b600b5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610f2f61187b565b6101908161ffff161115610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906126da565b60405180910390fd5b80600660166101000a81548161ffff021916908361ffff1602179055507f625428ca3cfddf32cf909a4d7ae5a8b942d838319ae2a8055f271ad78033c2f681604051610fc491906123d3565b60405180910390a150565b60075481565b610fdd61187b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361104d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110449190612517565b60405180910390fd5b61105681611902565b50565b5f33905090565b61106d83838360016119c5565b505050565b5f61107d8484610ea5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110fe57818110156110ef578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016110e6939291906129b9565b60405180910390fd5b6110fd84848484035f6119c5565b5b50505050565b5f8111611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90612a5e565b60405180910390fd5b600d5f9054906101000a900460ff1661120c57611161610b59565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806111cc575061119d610b59565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290612aec565b60405180910390fd5b5b600a5f9054906101000a900460ff16156114d357611228610b59565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156112965750611266610b59565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156112ce57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611308575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611320575060085f9054906101000a900460ff16155b156114d2577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156113c75750600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561142957600b546113d883610971565b826113e39190612b0a565b1115611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90612bad565b60405180910390fd5b6114d1565b600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166114d057600b5461148383610971565b8261148e9190612b0a565b11156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690612bad565b60405180910390fd5b5b5b5b5b5f6007546114e030610971565b101590508080156114fd575060085f9054906101000a900460ff16155b801561155557507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156115a8575060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156115fb575060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561163c57600160085f6101000a81548160ff021916908315150217905550611622611b94565b5f60085f6101000a81548160ff0219169083151502179055505b5f60085f9054906101000a900460ff1615905060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806116ea575060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156116f3575f90505b5f8115611868577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614801561176857505f600660149054906101000a900461ffff1661ffff16115b156117a1576103e8600660149054906101000a900461ffff1661ffff168561179091906128c4565b61179a91906127e0565b9050611845565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614801561180f57505f600660169054906101000a900461ffff1661ffff16115b15611844576103e8600660169054906101000a900461ffff1661ffff168561183791906128c4565b61184191906127e0565b90505b5b5f81111561186757611858863083611e8a565b80846118649190612bcb565b93505b5b611873868686611e8a565b505050505050565b611883611059565b73ffffffffffffffffffffffffffffffffffffffff166118a1610b59565b73ffffffffffffffffffffffffffffffffffffffff1614611900576118c4611059565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118f79190612517565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a35575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611a2c9190612517565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611aa5575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611a9c9190612517565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611b8e578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b85919061234e565b60405180910390a35b50505050565b5f611b9e30610971565b90506014600754611baf91906128c4565b811115611bc8576014600754611bc591906128c4565b90505b5f600267ffffffffffffffff811115611be457611be3612bfe565b5b604051908082528060200260200182016040528015611c125781602001602082028036833780820191505090505b50905030815f81518110611c2957611c28612c2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce49190612c6c565b81600181518110611cf857611cf7612c2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611d87959493929190612d87565b5f604051808303815f87803b158015611d9e575f80fd5b505af1925050508015611daf575060015b505f4790505f811115611e85575f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611e0290612e0c565b5f6040518083038185875af1925050503d805f8114611e3c576040519150601f19603f3d011682016040523d82523d5f602084013e611e41565b606091505b505090508015611e83577f8959421a1320789a49eeec01a4750caf8a30733c3db14f000d84484df89300f984604051611e7a919061234e565b60405180910390a15b505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611efa575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ef19190612517565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f6a575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f619190612517565b60405180910390fd5b611f75838383611f7a565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fca578060025f828254611fbe9190612b0a565b92505081905550612098565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612053578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161204a939291906129b9565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120df578060025f8282540392505081905550612129565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612186919061234e565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156121ca5780820151818401526020810190506121af565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6121ef82612193565b6121f9818561219d565b93506122098185602086016121ad565b612212816121d5565b840191505092915050565b5f6020820190508181035f83015261223581846121e5565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61226a82612241565b9050919050565b61227a81612260565b8114612284575f80fd5b50565b5f8135905061229581612271565b92915050565b5f819050919050565b6122ad8161229b565b81146122b7575f80fd5b50565b5f813590506122c8816122a4565b92915050565b5f80604083850312156122e4576122e361223d565b5b5f6122f185828601612287565b9250506020612302858286016122ba565b9150509250929050565b5f8115159050919050565b6123208161230c565b82525050565b5f6020820190506123395f830184612317565b92915050565b6123488161229b565b82525050565b5f6020820190506123615f83018461233f565b92915050565b5f805f6060848603121561237e5761237d61223d565b5b5f61238b86828701612287565b935050602061239c86828701612287565b92505060406123ad868287016122ba565b9150509250925092565b5f61ffff82169050919050565b6123cd816123b7565b82525050565b5f6020820190506123e65f8301846123c4565b92915050565b5f60ff82169050919050565b612401816123ec565b82525050565b5f60208201905061241a5f8301846123f8565b92915050565b5f602082840312156124355761243461223d565b5b5f61244284828501612287565b91505092915050565b6124548161230c565b811461245e575f80fd5b50565b5f8135905061246f8161244b565b92915050565b5f806040838503121561248b5761248a61223d565b5b5f61249885828601612287565b92505060206124a985828601612461565b9150509250929050565b6124bc816123b7565b81146124c6575f80fd5b50565b5f813590506124d7816124b3565b92915050565b5f602082840312156124f2576124f161223d565b5b5f6124ff848285016124c9565b91505092915050565b61251181612260565b82525050565b5f60208201905061252a5f830184612508565b92915050565b5f819050919050565b5f61255361254e61254984612241565b612530565b612241565b9050919050565b5f61256482612539565b9050919050565b5f6125758261255a565b9050919050565b6125858161256b565b82525050565b5f60208201905061259e5f83018461257c565b92915050565b5f602082840312156125b9576125b861223d565b5b5f6125c6848285016122ba565b91505092915050565b5f80604083850312156125e5576125e461223d565b5b5f6125f285828601612287565b925050602061260385828601612287565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061265157607f821691505b6020821081036126645761266361260d565b5b50919050565b7f454c4f4e5749465452554d503a206665652063616e6e6f7420626520677265615f8201527f746572207468616e203430250000000000000000000000000000000000000000602082015250565b5f6126c4602c8361219d565b91506126cf8261266a565b604082019050919050565b5f6020820190508181035f8301526126f1816126b8565b9050919050565b7f454c4f4e5749465452554d503a20616464726573732063616e6e6f74206265205f8201527f3020616464726573730000000000000000000000000000000000000000000000602082015250565b5f61275260298361219d565b915061275d826126f8565b604082019050919050565b5f6020820190508181035f83015261277f81612746565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6127ea8261229b565b91506127f58361229b565b92508261280557612804612786565b5b828204905092915050565b7f454c4f4e5749465452554d503a207377617020746f6b656e7320617420616d6f5f8201527f756e742063616e6e6f74206265206c6f776572207468616e20302e303031252060208201527f6f6620746f74616c20737570706c790000000000000000000000000000000000604082015250565b5f612890604f8361219d565b915061289b82612810565b606082019050919050565b5f6020820190508181035f8301526128bd81612884565b9050919050565b5f6128ce8261229b565b91506128d98361229b565b92508282026128e78161229b565b915082820484148315176128fe576128fd6127b3565b5b5092915050565b7f454c4f4e5749465452554d503a207377617020746f6b656e7320617420616d6f5f8201527f756e742063616e6e6f7420626520686967686572207468616e20302e3525206f60208201527f6620746f74616c20737570706c79000000000000000000000000000000000000604082015250565b5f612985604e8361219d565b915061299082612905565b606082019050919050565b5f6020820190508181035f8301526129b281612979565b9050919050565b5f6060820190506129cc5f830186612508565b6129d9602083018561233f565b6129e6604083018461233f565b949350505050565b7f454c4f4e5749465452554d503a207472616e7366657220616d6f756e74206d755f8201527f73742062652067726561746572207468616e2030000000000000000000000000602082015250565b5f612a4860348361219d565b9150612a53826129ee565b604082019050919050565b5f6020820190508181035f830152612a7581612a3c565b9050919050565b7f454c4f4e5749465452554d503a2074726164696e6720686173206e6f742062655f8201527f656e20656e61626c656420796574000000000000000000000000000000000000602082015250565b5f612ad6602e8361219d565b9150612ae182612a7c565b604082019050919050565b5f6020820190508181035f830152612b0381612aca565b9050919050565b5f612b148261229b565b9150612b1f8361229b565b9250828201905080821115612b3757612b366127b3565b5b92915050565b7f454c4f4e5749465452554d503a2062616c616e636520776f756c64204e4556455f8201527f5220657863656564206d61782077616c6c65742062616c616e63650000000000602082015250565b5f612b97603b8361219d565b9150612ba282612b3d565b604082019050919050565b5f6020820190508181035f830152612bc481612b8b565b9050919050565b5f612bd58261229b565b9150612be08361229b565b9250828203905081811115612bf857612bf76127b3565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612c6681612271565b92915050565b5f60208284031215612c8157612c8061223d565b5b5f612c8e84828501612c58565b91505092915050565b5f819050919050565b5f612cba612cb5612cb084612c97565b612530565b61229b565b9050919050565b612cca81612ca0565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612d0281612260565b82525050565b5f612d138383612cf9565b60208301905092915050565b5f602082019050919050565b5f612d3582612cd0565b612d3f8185612cda565b9350612d4a83612cea565b805f5b83811015612d7a578151612d618882612d08565b9750612d6c83612d1f565b925050600181019050612d4d565b5085935050505092915050565b5f60a082019050612d9a5f83018861233f565b612da76020830187612cc1565b8181036040830152612db98186612d2b565b9050612dc86060830185612508565b612dd5608083018461233f565b9695505050505050565b5f81905092915050565b50565b5f612df75f83612ddf565b9150612e0282612de9565b5f82019050919050565b5f612e1682612dec565b915081905091905056fea2646970667358221220376de9dde7b9b2a41cf73a8fc24560989582ffb0b6b3ae268eafd77422718fc564736f6c63430008170033

Deployed Bytecode

0x6080604052600436106101db575f3560e01c8063751039fc11610101578063a9059cbb11610094578063dd62ed3e11610063578063dd62ed3e1461067a578063e064648a146106b6578063e2f45605146106de578063f2fde38b14610708576101e2565b8063a9059cbb146105c4578063aacebbe314610600578063afa4f3b214610628578063bbde77c114610650576101e2565b80638da5cb5b116100d05780638da5cb5b1461051e57806394a9839014610548578063958c2e521461057057806395d89b411461059a576101e2565b8063751039fc1461049e57806375f0a874146104b45780638a8c523c146104de5780638bcea939146104f4576101e2565b80634a62bb6511610179578063686d83c311610148578063686d83c3146103e857806370a082311461042457806370c4767114610460578063715018a614610488576101e2565b80634a62bb65146103305780634ada218b1461035a5780634fbee19314610384578063590ffdce146103c0576101e2565b806323b872dd116101b557806323b872dd146102765780632b14ca56146102b2578063313ce567146102dc5780634706240214610306576101e2565b806306fdde03146101e6578063095ea7b31461021057806318160ddd1461024c576101e2565b366101e257005b5f80fd5b3480156101f1575f80fd5b506101fa610730565b604051610207919061221d565b60405180910390f35b34801561021b575f80fd5b50610236600480360381019061023191906122ce565b6107c0565b6040516102439190612326565b60405180910390f35b348015610257575f80fd5b506102606107e2565b60405161026d919061234e565b60405180910390f35b348015610281575f80fd5b5061029c60048036038101906102979190612367565b6107eb565b6040516102a99190612326565b60405180910390f35b3480156102bd575f80fd5b506102c6610819565b6040516102d391906123d3565b60405180910390f35b3480156102e7575f80fd5b506102f061082d565b6040516102fd9190612407565b60405180910390f35b348015610311575f80fd5b5061031a610835565b60405161032791906123d3565b60405180910390f35b34801561033b575f80fd5b50610344610849565b6040516103519190612326565b60405180910390f35b348015610365575f80fd5b5061036e61085b565b60405161037b9190612326565b60405180910390f35b34801561038f575f80fd5b506103aa60048036038101906103a59190612420565b61086d565b6040516103b79190612326565b60405180910390f35b3480156103cb575f80fd5b506103e660048036038101906103e19190612475565b6108bf565b005b3480156103f3575f80fd5b5061040e60048036038101906104099190612420565b61091f565b60405161041b9190612326565b60405180910390f35b34801561042f575f80fd5b5061044a60048036038101906104459190612420565b610971565b604051610457919061234e565b60405180910390f35b34801561046b575f80fd5b50610486600480360381019061048191906124dd565b6109b6565b005b348015610493575f80fd5b5061049c610a5e565b005b3480156104a9575f80fd5b506104b2610a71565b005b3480156104bf575f80fd5b506104c8610ac0565b6040516104d59190612517565b60405180910390f35b3480156104e9575f80fd5b506104f2610ae5565b005b3480156104ff575f80fd5b50610508610b35565b6040516105159190612517565b60405180910390f35b348015610529575f80fd5b50610532610b59565b60405161053f9190612517565b60405180910390f35b348015610553575f80fd5b5061056e60048036038101906105699190612475565b610b81565b005b34801561057b575f80fd5b50610584610be1565b604051610591919061258b565b60405180910390f35b3480156105a5575f80fd5b506105ae610bf9565b6040516105bb919061221d565b60405180910390f35b3480156105cf575f80fd5b506105ea60048036038101906105e591906122ce565b610c89565b6040516105f79190612326565b60405180910390f35b34801561060b575f80fd5b5061062660048036038101906106219190612420565b610cab565b005b348015610633575f80fd5b5061064e600480360381019061064991906125a4565b610d9b565b005b34801561065b575f80fd5b50610664610e9f565b604051610671919061234e565b60405180910390f35b348015610685575f80fd5b506106a0600480360381019061069b91906125cf565b610ea5565b6040516106ad919061234e565b60405180910390f35b3480156106c1575f80fd5b506106dc60048036038101906106d791906124dd565b610f27565b005b3480156106e9575f80fd5b506106f2610fcf565b6040516106ff919061234e565b60405180910390f35b348015610713575f80fd5b5061072e60048036038101906107299190612420565b610fd5565b005b60606003805461073f9061263a565b80601f016020809104026020016040519081016040528092919081815260200182805461076b9061263a565b80156107b65780601f1061078d576101008083540402835291602001916107b6565b820191905f5260205f20905b81548152906001019060200180831161079957829003601f168201915b5050505050905090565b5f806107ca611059565b90506107d7818585611060565b600191505092915050565b5f600254905090565b5f806107f5611059565b9050610802858285611072565b61080d858585611104565b60019150509392505050565b600660169054906101000a900461ffff1681565b5f6012905090565b600660149054906101000a900461ffff1681565b600a5f9054906101000a900460ff1681565b600d5f9054906101000a900460ff1681565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6108c761187b565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6109be61187b565b6101908161ffff161115610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906126da565b60405180910390fd5b80600660146101000a81548161ffff021916908361ffff1602179055507f36fa651f7bdbb8a6a7289ed4df5a6e3efb1fdcaef87c1f88dfd66b08d2007dc281604051610a5391906123d3565b60405180910390a150565b610a6661187b565b610a6f5f611902565b565b610a7961187b565b5f600a5f6101000a81548160ff0219169083151502179055507f7bfa7bacf025baa75e5308bf15bcf2948f406c7ebe3eb1a8bb611862b9d647ef60405160405180910390a1565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aed61187b565b6001600d5f6101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b7f000000000000000000000000ad7f7c34895c74d80917443ecf0139e6f2de44ff81565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610b8961187b565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b606060048054610c089061263a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c349061263a565b8015610c7f5780601f10610c5657610100808354040283529160200191610c7f565b820191905f5260205f20905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b5f80610c93611059565b9050610ca0818585611104565b600191505092915050565b610cb361187b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1890612768565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fbf86feedee5b30c30a8243bd21deebb704d141478d39b1be04fe5ee739f214e781604051610d909190612517565b60405180910390a150565b610da361187b565b620186a0610daf6107e2565b610db991906127e0565b811015610dfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df2906128a6565b60405180910390fd5b6103e86005610e086107e2565b610e1291906128c4565b610e1c91906127e0565b811115610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e559061299b565b60405180910390fd5b806007819055507f9efd5e66ee602c629f311865749d9af922866664ad3ff96bbfaf8035f5d24b2681604051610e94919061234e565b60405180910390a150565b600b5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610f2f61187b565b6101908161ffff161115610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906126da565b60405180910390fd5b80600660166101000a81548161ffff021916908361ffff1602179055507f625428ca3cfddf32cf909a4d7ae5a8b942d838319ae2a8055f271ad78033c2f681604051610fc491906123d3565b60405180910390a150565b60075481565b610fdd61187b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361104d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110449190612517565b60405180910390fd5b61105681611902565b50565b5f33905090565b61106d83838360016119c5565b505050565b5f61107d8484610ea5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110fe57818110156110ef578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016110e6939291906129b9565b60405180910390fd5b6110fd84848484035f6119c5565b5b50505050565b5f8111611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90612a5e565b60405180910390fd5b600d5f9054906101000a900460ff1661120c57611161610b59565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806111cc575061119d610b59565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290612aec565b60405180910390fd5b5b600a5f9054906101000a900460ff16156114d357611228610b59565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156112965750611266610b59565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156112ce57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611308575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611320575060085f9054906101000a900460ff16155b156114d2577f000000000000000000000000ad7f7c34895c74d80917443ecf0139e6f2de44ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156113c75750600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561142957600b546113d883610971565b826113e39190612b0a565b1115611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90612bad565b60405180910390fd5b6114d1565b600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166114d057600b5461148383610971565b8261148e9190612b0a565b11156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690612bad565b60405180910390fd5b5b5b5b5b5f6007546114e030610971565b101590508080156114fd575060085f9054906101000a900460ff16155b801561155557507f000000000000000000000000ad7f7c34895c74d80917443ecf0139e6f2de44ff73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156115a8575060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156115fb575060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561163c57600160085f6101000a81548160ff021916908315150217905550611622611b94565b5f60085f6101000a81548160ff0219169083151502179055505b5f60085f9054906101000a900460ff1615905060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806116ea575060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156116f3575f90505b5f8115611868577f000000000000000000000000ad7f7c34895c74d80917443ecf0139e6f2de44ff73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614801561176857505f600660149054906101000a900461ffff1661ffff16115b156117a1576103e8600660149054906101000a900461ffff1661ffff168561179091906128c4565b61179a91906127e0565b9050611845565b7f000000000000000000000000ad7f7c34895c74d80917443ecf0139e6f2de44ff73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614801561180f57505f600660169054906101000a900461ffff1661ffff16115b15611844576103e8600660169054906101000a900461ffff1661ffff168561183791906128c4565b61184191906127e0565b90505b5b5f81111561186757611858863083611e8a565b80846118649190612bcb565b93505b5b611873868686611e8a565b505050505050565b611883611059565b73ffffffffffffffffffffffffffffffffffffffff166118a1610b59565b73ffffffffffffffffffffffffffffffffffffffff1614611900576118c4611059565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016118f79190612517565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a35575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611a2c9190612517565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611aa5575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611a9c9190612517565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611b8e578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b85919061234e565b60405180910390a35b50505050565b5f611b9e30610971565b90506014600754611baf91906128c4565b811115611bc8576014600754611bc591906128c4565b90505b5f600267ffffffffffffffff811115611be457611be3612bfe565b5b604051908082528060200260200182016040528015611c125781602001602082028036833780820191505090505b50905030815f81518110611c2957611c28612c2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce49190612c6c565b81600181518110611cf857611cf7612c2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401611d87959493929190612d87565b5f604051808303815f87803b158015611d9e575f80fd5b505af1925050508015611daf575060015b505f4790505f811115611e85575f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611e0290612e0c565b5f6040518083038185875af1925050503d805f8114611e3c576040519150601f19603f3d011682016040523d82523d5f602084013e611e41565b606091505b505090508015611e83577f8959421a1320789a49eeec01a4750caf8a30733c3db14f000d84484df89300f984604051611e7a919061234e565b60405180910390a15b505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611efa575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ef19190612517565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f6a575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f619190612517565b60405180910390fd5b611f75838383611f7a565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fca578060025f828254611fbe9190612b0a565b92505081905550612098565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612053578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161204a939291906129b9565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120df578060025f8282540392505081905550612129565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612186919061234e565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156121ca5780820151818401526020810190506121af565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6121ef82612193565b6121f9818561219d565b93506122098185602086016121ad565b612212816121d5565b840191505092915050565b5f6020820190508181035f83015261223581846121e5565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61226a82612241565b9050919050565b61227a81612260565b8114612284575f80fd5b50565b5f8135905061229581612271565b92915050565b5f819050919050565b6122ad8161229b565b81146122b7575f80fd5b50565b5f813590506122c8816122a4565b92915050565b5f80604083850312156122e4576122e361223d565b5b5f6122f185828601612287565b9250506020612302858286016122ba565b9150509250929050565b5f8115159050919050565b6123208161230c565b82525050565b5f6020820190506123395f830184612317565b92915050565b6123488161229b565b82525050565b5f6020820190506123615f83018461233f565b92915050565b5f805f6060848603121561237e5761237d61223d565b5b5f61238b86828701612287565b935050602061239c86828701612287565b92505060406123ad868287016122ba565b9150509250925092565b5f61ffff82169050919050565b6123cd816123b7565b82525050565b5f6020820190506123e65f8301846123c4565b92915050565b5f60ff82169050919050565b612401816123ec565b82525050565b5f60208201905061241a5f8301846123f8565b92915050565b5f602082840312156124355761243461223d565b5b5f61244284828501612287565b91505092915050565b6124548161230c565b811461245e575f80fd5b50565b5f8135905061246f8161244b565b92915050565b5f806040838503121561248b5761248a61223d565b5b5f61249885828601612287565b92505060206124a985828601612461565b9150509250929050565b6124bc816123b7565b81146124c6575f80fd5b50565b5f813590506124d7816124b3565b92915050565b5f602082840312156124f2576124f161223d565b5b5f6124ff848285016124c9565b91505092915050565b61251181612260565b82525050565b5f60208201905061252a5f830184612508565b92915050565b5f819050919050565b5f61255361254e61254984612241565b612530565b612241565b9050919050565b5f61256482612539565b9050919050565b5f6125758261255a565b9050919050565b6125858161256b565b82525050565b5f60208201905061259e5f83018461257c565b92915050565b5f602082840312156125b9576125b861223d565b5b5f6125c6848285016122ba565b91505092915050565b5f80604083850312156125e5576125e461223d565b5b5f6125f285828601612287565b925050602061260385828601612287565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061265157607f821691505b6020821081036126645761266361260d565b5b50919050565b7f454c4f4e5749465452554d503a206665652063616e6e6f7420626520677265615f8201527f746572207468616e203430250000000000000000000000000000000000000000602082015250565b5f6126c4602c8361219d565b91506126cf8261266a565b604082019050919050565b5f6020820190508181035f8301526126f1816126b8565b9050919050565b7f454c4f4e5749465452554d503a20616464726573732063616e6e6f74206265205f8201527f3020616464726573730000000000000000000000000000000000000000000000602082015250565b5f61275260298361219d565b915061275d826126f8565b604082019050919050565b5f6020820190508181035f83015261277f81612746565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6127ea8261229b565b91506127f58361229b565b92508261280557612804612786565b5b828204905092915050565b7f454c4f4e5749465452554d503a207377617020746f6b656e7320617420616d6f5f8201527f756e742063616e6e6f74206265206c6f776572207468616e20302e303031252060208201527f6f6620746f74616c20737570706c790000000000000000000000000000000000604082015250565b5f612890604f8361219d565b915061289b82612810565b606082019050919050565b5f6020820190508181035f8301526128bd81612884565b9050919050565b5f6128ce8261229b565b91506128d98361229b565b92508282026128e78161229b565b915082820484148315176128fe576128fd6127b3565b5b5092915050565b7f454c4f4e5749465452554d503a207377617020746f6b656e7320617420616d6f5f8201527f756e742063616e6e6f7420626520686967686572207468616e20302e3525206f60208201527f6620746f74616c20737570706c79000000000000000000000000000000000000604082015250565b5f612985604e8361219d565b915061299082612905565b606082019050919050565b5f6020820190508181035f8301526129b281612979565b9050919050565b5f6060820190506129cc5f830186612508565b6129d9602083018561233f565b6129e6604083018461233f565b949350505050565b7f454c4f4e5749465452554d503a207472616e7366657220616d6f756e74206d755f8201527f73742062652067726561746572207468616e2030000000000000000000000000602082015250565b5f612a4860348361219d565b9150612a53826129ee565b604082019050919050565b5f6020820190508181035f830152612a7581612a3c565b9050919050565b7f454c4f4e5749465452554d503a2074726164696e6720686173206e6f742062655f8201527f656e20656e61626c656420796574000000000000000000000000000000000000602082015250565b5f612ad6602e8361219d565b9150612ae182612a7c565b604082019050919050565b5f6020820190508181035f830152612b0381612aca565b9050919050565b5f612b148261229b565b9150612b1f8361229b565b9250828201905080821115612b3757612b366127b3565b5b92915050565b7f454c4f4e5749465452554d503a2062616c616e636520776f756c64204e4556455f8201527f5220657863656564206d61782077616c6c65742062616c616e63650000000000602082015250565b5f612b97603b8361219d565b9150612ba282612b3d565b604082019050919050565b5f6020820190508181035f830152612bc481612b8b565b9050919050565b5f612bd58261229b565b9150612be08361229b565b9250828203905081811115612bf857612bf76127b3565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050612c6681612271565b92915050565b5f60208284031215612c8157612c8061223d565b5b5f612c8e84828501612c58565b91505092915050565b5f819050919050565b5f612cba612cb5612cb084612c97565b612530565b61229b565b9050919050565b612cca81612ca0565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612d0281612260565b82525050565b5f612d138383612cf9565b60208301905092915050565b5f602082019050919050565b5f612d3582612cd0565b612d3f8185612cda565b9350612d4a83612cea565b805f5b83811015612d7a578151612d618882612d08565b9750612d6c83612d1f565b925050600181019050612d4d565b5085935050505092915050565b5f60a082019050612d9a5f83018861233f565b612da76020830187612cc1565b8181036040830152612db98186612d2b565b9050612dc86060830185612508565b612dd5608083018461233f565b9695505050505050565b5f81905092915050565b50565b5f612df75f83612ddf565b9150612e0282612de9565b5f82019050919050565b5f612e1682612dec565b915081905091905056fea2646970667358221220376de9dde7b9b2a41cf73a8fc24560989582ffb0b6b3ae268eafd77422718fc564736f6c63430008170033

Deployed Bytecode Sourcemap

29647:11209:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19196:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21489:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20298:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22257:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29762:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20149:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29731:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29958:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30290:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36097:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40204:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36505:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20460:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39220:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12809:103;;;;;;;;;;;;;:::i;:::-;;37787:115;;;;;;;;;;;;;:::i;:::-;;29694:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36825:116;;;;;;;;;;;;;:::i;:::-;;30133:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12134:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40693:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30174:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19406:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20783:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37251:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38352:581;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29998:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21028:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39725:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29794:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13067:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19196:91;19241:13;19274:5;19267:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19196:91;:::o;21489:190::-;21562:4;21579:13;21595:12;:10;:12::i;:::-;21579:28;;21618:31;21627:5;21634:7;21643:5;21618:8;:31::i;:::-;21667:4;21660:11;;;21489:190;;;;:::o;20298:99::-;20350:7;20377:12;;20370:19;;20298:99;:::o;22257:249::-;22344:4;22361:15;22379:12;:10;:12::i;:::-;22361:30;;22402:37;22418:4;22424:7;22433:5;22402:15;:37::i;:::-;22450:26;22460:4;22466:2;22470:5;22450:9;:26::i;:::-;22494:4;22487:11;;;22257:249;;;;;:::o;29762:25::-;;;;;;;;;;;;;:::o;20149:84::-;20198:5;20223:2;20216:9;;20149:84;:::o;29731:24::-;;;;;;;;;;;;;:::o;29958:33::-;;;;;;;;;;;;;:::o;30290:26::-;;;;;;;;;;;;;:::o;36097:124::-;36163:4;36187:17;:26;36205:7;36187:26;;;;;;;;;;;;;;;;;;;;;;;;;36180:33;;36097:124;;;:::o;40204:136::-;12020:13;:11;:13::i;:::-;40324:8:::1;40295:17;:26;40313:7;40295:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;40204:136:::0;;:::o;36505:148::-;36583:4;36607:29;:38;36637:7;36607:38;;;;;;;;;;;;;;;;;;;;;;;;;36600:45;;36505:148;;;:::o;20460:118::-;20525:7;20552:9;:18;20562:7;20552:18;;;;;;;;;;;;;;;;20545:25;;20460:118;;;:::o;39220:213::-;12020:13;:11;:13::i;:::-;39308:3:::1;39295:9;:16;;;;39287:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39380:9;39371:6;;:18;;;;;;;;;;;;;;;;;;39405:20;39415:9;39405:20;;;;;;:::i;:::-;;;;;;;;39220:213:::0;:::o;12809:103::-;12020:13;:11;:13::i;:::-;12874:30:::1;12901:1;12874:18;:30::i;:::-;12809:103::o:0;37787:115::-;12020:13;:11;:13::i;:::-;37858:5:::1;37841:14;;:22;;;;;;;;;;;;;;;;;;37879:15;;;;;;;;;;37787:115::o:0;29694:30::-;;;;;;;;;;;;;:::o;36825:116::-;12020:13;:11;:13::i;:::-;36897:4:::1;36880:14;;:21;;;;;;;;;;;;;;;;;;36917:16;;;;;;;;;;36825:116::o:0;30133:34::-;;;:::o;12134:87::-;12180:7;12207:6;;;;;;;;;;;12200:13;;12134:87;:::o;40693:160::-;12020:13;:11;:13::i;:::-;40837:8:::1;40796:29;:38;40826:7;40796:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;40693:160:::0;;:::o;30174:107::-;30238:42;30174:107;:::o;19406:95::-;19453:13;19486:7;19479:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19406:95;:::o;20783:182::-;20852:4;20869:13;20885:12;:10;:12::i;:::-;20869:28;;20908:27;20918:5;20925:2;20929:5;20908:9;:27::i;:::-;20953:4;20946:11;;;20783:182;;;;:::o;37251:256::-;12020:13;:11;:13::i;:::-;37362:1:::1;37340:24;;:10;:24;;::::0;37332:78:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37439:10;37421:15;;:28;;;;;;;;;;;;;;;;;;37465:34;37488:10;37465:34;;;;;;:::i;:::-;;;;;;;;37251:256:::0;:::o;38352:581::-;12020:13;:11;:13::i;:::-;38507:7:::1;38491:13;:11;:13::i;:::-;:23;;;;:::i;:::-;38466:21;:48;;38444:177;;;;;;;;;;;;:::i;:::-;;;;;;;;;38701:5;38696:1;38680:13;:11;:13::i;:::-;:17;;;;:::i;:::-;38679:27;;;;:::i;:::-;38654:21;:52;;38632:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;38844:21;38823:18;:42;;;;38881:44;38903:21;38881:44;;;;;;:::i;:::-;;;;;;;;38352:581:::0;:::o;29998:50::-;;;;:::o;21028:142::-;21108:7;21135:11;:18;21147:5;21135:18;;;;;;;;;;;;;;;:27;21154:7;21135:27;;;;;;;;;;;;;;;;21128:34;;21028:142;;;;:::o;39725:220::-;12020:13;:11;:13::i;:::-;39816:3:::1;39802:10;:17;;;;39794:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39889:10;39879:7;;:20;;;;;;;;;;;;;;;;;;39915:22;39926:10;39915:22;;;;;;:::i;:::-;;;;;;;;39725:220:::0;:::o;29794:49::-;;;;:::o;13067:220::-;12020:13;:11;:13::i;:::-;13172:1:::1;13152:22;;:8;:22;;::::0;13148:93:::1;;13226:1;13198:31;;;;;;;;;;;:::i;:::-;;;;;;;;13148:93;13251:28;13270:8;13251:18;:28::i;:::-;13067:220:::0;:::o;10143:98::-;10196:7;10223:10;10216:17;;10143:98;:::o;26324:130::-;26409:37;26418:5;26425:7;26434:5;26441:4;26409:8;:37::i;:::-;26324:130;;;:::o;28040:487::-;28140:24;28167:25;28177:5;28184:7;28167:9;:25::i;:::-;28140:52;;28227:17;28207:16;:37;28203:317;;28284:5;28265:16;:24;28261:132;;;28344:7;28353:16;28371:5;28317:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;28261:132;28436:57;28445:5;28452:7;28480:5;28461:16;:24;28487:5;28436:8;:57::i;:::-;28203:317;28129:398;28040:487;;;:::o;32081:2528::-;32188:1;32179:6;:10;32171:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;32310:14;;;;;;;;;;;32305:139;;32357:7;:5;:7::i;:::-;32349:15;;:4;:15;;;:32;;;;32374:7;:5;:7::i;:::-;32368:13;;:2;:13;;;32349:32;32341:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;32305:139;32502:14;;;;;;;;;;;32498:809;;;32545:7;:5;:7::i;:::-;32537:15;;:4;:15;;;;:32;;;;;32562:7;:5;:7::i;:::-;32556:13;;:2;:13;;;;32537:32;:52;;;;;32587:1;32573:16;;:2;:16;;;;32537:52;:77;;;;;32607:6;32593:21;;:2;:21;;;;32537:77;:99;;;;;32619:17;;;;;;;;;;;32618:18;32537:99;32533:763;;;32697:9;32689:17;;:4;:17;;;:55;;;;;32711:29;:33;32741:2;32711:33;;;;;;;;;;;;;;;;;;;;;;;;;32710:34;32689:55;32685:596;;;32829:16;;32812:13;32822:2;32812:9;:13::i;:::-;32803:6;:22;;;;:::i;:::-;:42;;32769:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;32685:596;;;33041:29;:33;33071:2;33041:33;;;;;;;;;;;;;;;;;;;;;;;;;33036:245;;33159:16;;33142:13;33152:2;33142:9;:13::i;:::-;33133:6;:22;;;;:::i;:::-;:42;;33099:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;33036:245;32685:596;32533:763;32498:809;33383:15;33429:18;;33401:24;33419:4;33401:9;:24::i;:::-;:46;;33383:64;;33462:10;:32;;;;;33477:17;;;;;;;;;;;33476:18;33462:32;:53;;;;;33506:9;33498:17;;:4;:17;;;;33462:53;:81;;;;;33520:17;:23;33538:4;33520:23;;;;;;;;;;;;;;;;;;;;;;;;;33519:24;33462:81;:107;;;;;33548:17;:21;33566:2;33548:21;;;;;;;;;;;;;;;;;;;;;;;;;33547:22;33462:107;33458:245;;;33615:4;33595:17;;:24;;;;;;;;;;;;;;;;;;33634:17;:15;:17::i;:::-;33686:5;33666:17;;:25;;;;;;;;;;;;;;;;;;33458:245;33760:13;33777:17;;;;;;;;;;;33776:18;33760:34;;33809:17;:23;33827:4;33809:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;33836:17;:21;33854:2;33836:21;;;;;;;;;;;;;;;;;;;;;;;;;33809:48;33805:97;;;33885:5;33874:16;;33805:97;33914:12;33980:8;33976:548;;;34046:9;34038:17;;:4;:17;;;:31;;;;;34068:1;34059:6;;;;;;;;;;;:10;;;34038:31;34034:257;;;34117:5;34107:6;;;;;;;;;;;34098:15;;:6;:15;;;;:::i;:::-;34097:25;;;;:::i;:::-;34090:32;;34034:257;;;34197:9;34191:15;;:2;:15;;;:30;;;;;34220:1;34210:7;;;;;;;;;;;:11;;;34191:30;34187:104;;;34270:5;34259:7;;;;;;;;;;;34250:16;;:6;:16;;;;:::i;:::-;34249:26;;;;:::i;:::-;34242:33;;34187:104;34034:257;34400:1;34393:4;:8;34389:124;;;34422:42;34438:4;34452;34459;34422:15;:42::i;:::-;34493:4;34483:14;;;;;:::i;:::-;;;34389:124;33976:548;34568:33;34584:4;34590:2;34594:6;34568:15;:33::i;:::-;32160:2449;;;32081:2528;;;:::o;12299:166::-;12370:12;:10;:12::i;:::-;12359:23;;:7;:5;:7::i;:::-;:23;;;12355:103;;12433:12;:10;:12::i;:::-;12406:40;;;;;;;;;;;:::i;:::-;;;;;;;;12355:103;12299:166::o;13447:191::-;13521:16;13540:6;;;;;;;;;;;13521:25;;13566:8;13557:6;;:17;;;;;;;;;;;;;;;;;;13621:8;13590:40;;13611:8;13590:40;;;;;;;;;;;;13510:128;13447:191;:::o;27305:443::-;27435:1;27418:19;;:5;:19;;;27414:91;;27490:1;27461:32;;;;;;;;;;;:::i;:::-;;;;;;;;27414:91;27538:1;27519:21;;:7;:21;;;27515:92;;27592:1;27564:31;;;;;;;;;;;:::i;:::-;;;;;;;;27515:92;27647:5;27617:11;:18;27629:5;27617:18;;;;;;;;;;;;;;;:27;27636:7;27617:27;;;;;;;;;;;;;;;:35;;;;27667:9;27663:78;;;27714:7;27698:31;;27707:5;27698:31;;;27723:5;27698:31;;;;;;:::i;:::-;;;;;;;;27663:78;27305:443;;;;:::o;34935:934::-;35037:26;35066:24;35084:4;35066:9;:24::i;:::-;35037:53;;35147:2;35126:18;;:23;;;;:::i;:::-;35105:18;:44;35101:121;;;35208:2;35187:18;;:23;;;;:::i;:::-;35166:44;;35101:121;35266:21;35304:1;35290:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35266:40;;35335:4;35317;35322:1;35317:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;30238:42;35361:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35351:4;35356:1;35351:7;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;;;30238:42;35394:62;;;35471:18;35491:1;35494:4;35508;35515:15;35394:147;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35390:163;35599:18;35620:21;35599:42;;35669:1;35656:10;:14;35652:210;;;35688:12;35705:15;;;;;;;;;;;:20;;35733:10;35705:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35687:61;;;35767:7;35763:88;;;35800:35;35816:18;35800:35;;;;;;:::i;:::-;;;;;;;;35763:88;35672:190;35652:210;34970:899;;;34935:934::o;22891:316::-;22999:1;22983:18;;:4;:18;;;22979:88;;23052:1;23025:30;;;;;;;;;;;:::i;:::-;;;;;;;;22979:88;23095:1;23081:16;;:2;:16;;;23077:88;;23150:1;23121:32;;;;;;;;;;;:::i;:::-;;;;;;;;23077:88;23175:24;23183:4;23189:2;23193:5;23175:7;:24::i;:::-;22891:316;;;:::o;23531:1135::-;23637:1;23621:18;;:4;:18;;;23617:552;;23775:5;23759:12;;:21;;;;;;;:::i;:::-;;;;;;;;23617:552;;;23813:19;23835:9;:15;23845:4;23835:15;;;;;;;;;;;;;;;;23813:37;;23883:5;23869:11;:19;23865:117;;;23941:4;23947:11;23960:5;23916:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;23865:117;24137:5;24123:11;:19;24105:9;:15;24115:4;24105:15;;;;;;;;;;;;;;;:37;;;;23798:371;23617:552;24199:1;24185:16;;:2;:16;;;24181:435;;24367:5;24351:12;;:21;;;;;;;;;;;24181:435;;;24584:5;24567:9;:13;24577:2;24567:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;24181:435;24648:2;24633:25;;24642:4;24633:25;;;24652:5;24633:25;;;;;;:::i;:::-;;;;;;;;23531:1135;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:89::-;4459:7;4499:6;4492:5;4488:18;4477:29;;4423:89;;;:::o;4518:115::-;4603:23;4620:5;4603:23;:::i;:::-;4598:3;4591:36;4518:115;;:::o;4639:218::-;4730:4;4768:2;4757:9;4753:18;4745:26;;4781:69;4847:1;4836:9;4832:17;4823:6;4781:69;:::i;:::-;4639:218;;;;:::o;4863:86::-;4898:7;4938:4;4931:5;4927:16;4916:27;;4863:86;;;:::o;4955:112::-;5038:22;5054:5;5038:22;:::i;:::-;5033:3;5026:35;4955:112;;:::o;5073:214::-;5162:4;5200:2;5189:9;5185:18;5177:26;;5213:67;5277:1;5266:9;5262:17;5253:6;5213:67;:::i;:::-;5073:214;;;;:::o;5293:329::-;5352:6;5401:2;5389:9;5380:7;5376:23;5372:32;5369:119;;;5407:79;;:::i;:::-;5369:119;5527:1;5552:53;5597:7;5588:6;5577:9;5573:22;5552:53;:::i;:::-;5542:63;;5498:117;5293:329;;;;:::o;5628:116::-;5698:21;5713:5;5698:21;:::i;:::-;5691:5;5688:32;5678:60;;5734:1;5731;5724:12;5678:60;5628:116;:::o;5750:133::-;5793:5;5831:6;5818:20;5809:29;;5847:30;5871:5;5847:30;:::i;:::-;5750:133;;;;:::o;5889:468::-;5954:6;5962;6011:2;5999:9;5990:7;5986:23;5982:32;5979:119;;;6017:79;;:::i;:::-;5979:119;6137:1;6162:53;6207:7;6198:6;6187:9;6183:22;6162:53;:::i;:::-;6152:63;;6108:117;6264:2;6290:50;6332:7;6323:6;6312:9;6308:22;6290:50;:::i;:::-;6280:60;;6235:115;5889:468;;;;;:::o;6363:120::-;6435:23;6452:5;6435:23;:::i;:::-;6428:5;6425:34;6415:62;;6473:1;6470;6463:12;6415:62;6363:120;:::o;6489:137::-;6534:5;6572:6;6559:20;6550:29;;6588:32;6614:5;6588:32;:::i;:::-;6489:137;;;;:::o;6632:327::-;6690:6;6739:2;6727:9;6718:7;6714:23;6710:32;6707:119;;;6745:79;;:::i;:::-;6707:119;6865:1;6890:52;6934:7;6925:6;6914:9;6910:22;6890:52;:::i;:::-;6880:62;;6836:116;6632:327;;;;:::o;6965:118::-;7052:24;7070:5;7052:24;:::i;:::-;7047:3;7040:37;6965:118;;:::o;7089:222::-;7182:4;7220:2;7209:9;7205:18;7197:26;;7233:71;7301:1;7290:9;7286:17;7277:6;7233:71;:::i;:::-;7089:222;;;;:::o;7317:60::-;7345:3;7366:5;7359:12;;7317:60;;;:::o;7383:142::-;7433:9;7466:53;7484:34;7493:24;7511:5;7493:24;:::i;:::-;7484:34;:::i;:::-;7466:53;:::i;:::-;7453:66;;7383:142;;;:::o;7531:126::-;7581:9;7614:37;7645:5;7614:37;:::i;:::-;7601:50;;7531:126;;;:::o;7663:150::-;7737:9;7770:37;7801:5;7770:37;:::i;:::-;7757:50;;7663:150;;;:::o;7819:179::-;7930:61;7985:5;7930:61;:::i;:::-;7925:3;7918:74;7819:179;;:::o;8004:270::-;8121:4;8159:2;8148:9;8144:18;8136:26;;8172:95;8264:1;8253:9;8249:17;8240:6;8172:95;:::i;:::-;8004:270;;;;:::o;8280:329::-;8339:6;8388:2;8376:9;8367:7;8363:23;8359:32;8356:119;;;8394:79;;:::i;:::-;8356:119;8514:1;8539:53;8584:7;8575:6;8564:9;8560:22;8539:53;:::i;:::-;8529:63;;8485:117;8280:329;;;;:::o;8615:474::-;8683:6;8691;8740:2;8728:9;8719:7;8715:23;8711:32;8708:119;;;8746:79;;:::i;:::-;8708:119;8866:1;8891:53;8936:7;8927:6;8916:9;8912:22;8891:53;:::i;:::-;8881:63;;8837:117;8993:2;9019:53;9064:7;9055:6;9044:9;9040:22;9019:53;:::i;:::-;9009:63;;8964:118;8615:474;;;;;:::o;9095:180::-;9143:77;9140:1;9133:88;9240:4;9237:1;9230:15;9264:4;9261:1;9254:15;9281:320;9325:6;9362:1;9356:4;9352:12;9342:22;;9409:1;9403:4;9399:12;9430:18;9420:81;;9486:4;9478:6;9474:17;9464:27;;9420:81;9548:2;9540:6;9537:14;9517:18;9514:38;9511:84;;9567:18;;:::i;:::-;9511:84;9332:269;9281:320;;;:::o;9607:231::-;9747:34;9743:1;9735:6;9731:14;9724:58;9816:14;9811:2;9803:6;9799:15;9792:39;9607:231;:::o;9844:366::-;9986:3;10007:67;10071:2;10066:3;10007:67;:::i;:::-;10000:74;;10083:93;10172:3;10083:93;:::i;:::-;10201:2;10196:3;10192:12;10185:19;;9844:366;;;:::o;10216:419::-;10382:4;10420:2;10409:9;10405:18;10397:26;;10469:9;10463:4;10459:20;10455:1;10444:9;10440:17;10433:47;10497:131;10623:4;10497:131;:::i;:::-;10489:139;;10216:419;;;:::o;10641:228::-;10781:34;10777:1;10769:6;10765:14;10758:58;10850:11;10845:2;10837:6;10833:15;10826:36;10641:228;:::o;10875:366::-;11017:3;11038:67;11102:2;11097:3;11038:67;:::i;:::-;11031:74;;11114:93;11203:3;11114:93;:::i;:::-;11232:2;11227:3;11223:12;11216:19;;10875:366;;;:::o;11247:419::-;11413:4;11451:2;11440:9;11436:18;11428:26;;11500:9;11494:4;11490:20;11486:1;11475:9;11471:17;11464:47;11528:131;11654:4;11528:131;:::i;:::-;11520:139;;11247:419;;;:::o;11672:180::-;11720:77;11717:1;11710:88;11817:4;11814:1;11807:15;11841:4;11838:1;11831:15;11858:180;11906:77;11903:1;11896:88;12003:4;12000:1;11993:15;12027:4;12024:1;12017:15;12044:185;12084:1;12101:20;12119:1;12101:20;:::i;:::-;12096:25;;12135:20;12153:1;12135:20;:::i;:::-;12130:25;;12174:1;12164:35;;12179:18;;:::i;:::-;12164:35;12221:1;12218;12214:9;12209:14;;12044:185;;;;:::o;12235:303::-;12375:34;12371:1;12363:6;12359:14;12352:58;12444:34;12439:2;12431:6;12427:15;12420:59;12513:17;12508:2;12500:6;12496:15;12489:42;12235:303;:::o;12544:366::-;12686:3;12707:67;12771:2;12766:3;12707:67;:::i;:::-;12700:74;;12783:93;12872:3;12783:93;:::i;:::-;12901:2;12896:3;12892:12;12885:19;;12544:366;;;:::o;12916:419::-;13082:4;13120:2;13109:9;13105:18;13097:26;;13169:9;13163:4;13159:20;13155:1;13144:9;13140:17;13133:47;13197:131;13323:4;13197:131;:::i;:::-;13189:139;;12916:419;;;:::o;13341:410::-;13381:7;13404:20;13422:1;13404:20;:::i;:::-;13399:25;;13438:20;13456:1;13438:20;:::i;:::-;13433:25;;13493:1;13490;13486:9;13515:30;13533:11;13515:30;:::i;:::-;13504:41;;13694:1;13685:7;13681:15;13678:1;13675:22;13655:1;13648:9;13628:83;13605:139;;13724:18;;:::i;:::-;13605:139;13389:362;13341:410;;;;:::o;13757:302::-;13897:34;13893:1;13885:6;13881:14;13874:58;13966:34;13961:2;13953:6;13949:15;13942:59;14035:16;14030:2;14022:6;14018:15;14011:41;13757:302;:::o;14065:366::-;14207:3;14228:67;14292:2;14287:3;14228:67;:::i;:::-;14221:74;;14304:93;14393:3;14304:93;:::i;:::-;14422:2;14417:3;14413:12;14406:19;;14065:366;;;:::o;14437:419::-;14603:4;14641:2;14630:9;14626:18;14618:26;;14690:9;14684:4;14680:20;14676:1;14665:9;14661:17;14654:47;14718:131;14844:4;14718:131;:::i;:::-;14710:139;;14437:419;;;:::o;14862:442::-;15011:4;15049:2;15038:9;15034:18;15026:26;;15062:71;15130:1;15119:9;15115:17;15106:6;15062:71;:::i;:::-;15143:72;15211:2;15200:9;15196:18;15187:6;15143:72;:::i;:::-;15225;15293:2;15282:9;15278:18;15269:6;15225:72;:::i;:::-;14862:442;;;;;;:::o;15310:239::-;15450:34;15446:1;15438:6;15434:14;15427:58;15519:22;15514:2;15506:6;15502:15;15495:47;15310:239;:::o;15555:366::-;15697:3;15718:67;15782:2;15777:3;15718:67;:::i;:::-;15711:74;;15794:93;15883:3;15794:93;:::i;:::-;15912:2;15907:3;15903:12;15896:19;;15555:366;;;:::o;15927:419::-;16093:4;16131:2;16120:9;16116:18;16108:26;;16180:9;16174:4;16170:20;16166:1;16155:9;16151:17;16144:47;16208:131;16334:4;16208:131;:::i;:::-;16200:139;;15927:419;;;:::o;16352:233::-;16492:34;16488:1;16480:6;16476:14;16469:58;16561:16;16556:2;16548:6;16544:15;16537:41;16352:233;:::o;16591:366::-;16733:3;16754:67;16818:2;16813:3;16754:67;:::i;:::-;16747:74;;16830:93;16919:3;16830:93;:::i;:::-;16948:2;16943:3;16939:12;16932:19;;16591:366;;;:::o;16963:419::-;17129:4;17167:2;17156:9;17152:18;17144:26;;17216:9;17210:4;17206:20;17202:1;17191:9;17187:17;17180:47;17244:131;17370:4;17244:131;:::i;:::-;17236:139;;16963:419;;;:::o;17388:191::-;17428:3;17447:20;17465:1;17447:20;:::i;:::-;17442:25;;17481:20;17499:1;17481:20;:::i;:::-;17476:25;;17524:1;17521;17517:9;17510:16;;17545:3;17542:1;17539:10;17536:36;;;17552:18;;:::i;:::-;17536:36;17388:191;;;;:::o;17585:246::-;17725:34;17721:1;17713:6;17709:14;17702:58;17794:29;17789:2;17781:6;17777:15;17770:54;17585:246;:::o;17837:366::-;17979:3;18000:67;18064:2;18059:3;18000:67;:::i;:::-;17993:74;;18076:93;18165:3;18076:93;:::i;:::-;18194:2;18189:3;18185:12;18178:19;;17837:366;;;:::o;18209:419::-;18375:4;18413:2;18402:9;18398:18;18390:26;;18462:9;18456:4;18452:20;18448:1;18437:9;18433:17;18426:47;18490:131;18616:4;18490:131;:::i;:::-;18482:139;;18209:419;;;:::o;18634:194::-;18674:4;18694:20;18712:1;18694:20;:::i;:::-;18689:25;;18728:20;18746:1;18728:20;:::i;:::-;18723:25;;18772:1;18769;18765:9;18757:17;;18796:1;18790:4;18787:11;18784:37;;;18801:18;;:::i;:::-;18784:37;18634:194;;;;:::o;18834:180::-;18882:77;18879:1;18872:88;18979:4;18976:1;18969:15;19003:4;19000:1;18993:15;19020:180;19068:77;19065:1;19058:88;19165:4;19162:1;19155:15;19189:4;19186:1;19179:15;19206:143;19263:5;19294:6;19288:13;19279:22;;19310:33;19337:5;19310:33;:::i;:::-;19206:143;;;;:::o;19355:351::-;19425:6;19474:2;19462:9;19453:7;19449:23;19445:32;19442:119;;;19480:79;;:::i;:::-;19442:119;19600:1;19625:64;19681:7;19672:6;19661:9;19657:22;19625:64;:::i;:::-;19615:74;;19571:128;19355:351;;;;:::o;19712:85::-;19757:7;19786:5;19775:16;;19712:85;;;:::o;19803:158::-;19861:9;19894:61;19912:42;19921:32;19947:5;19921:32;:::i;:::-;19912:42;:::i;:::-;19894:61;:::i;:::-;19881:74;;19803:158;;;:::o;19967:147::-;20062:45;20101:5;20062:45;:::i;:::-;20057:3;20050:58;19967:147;;:::o;20120:114::-;20187:6;20221:5;20215:12;20205:22;;20120:114;;;:::o;20240:184::-;20339:11;20373:6;20368:3;20361:19;20413:4;20408:3;20404:14;20389:29;;20240:184;;;;:::o;20430:132::-;20497:4;20520:3;20512:11;;20550:4;20545:3;20541:14;20533:22;;20430:132;;;:::o;20568:108::-;20645:24;20663:5;20645:24;:::i;:::-;20640:3;20633:37;20568:108;;:::o;20682:179::-;20751:10;20772:46;20814:3;20806:6;20772:46;:::i;:::-;20850:4;20845:3;20841:14;20827:28;;20682:179;;;;:::o;20867:113::-;20937:4;20969;20964:3;20960:14;20952:22;;20867:113;;;:::o;21016:732::-;21135:3;21164:54;21212:5;21164:54;:::i;:::-;21234:86;21313:6;21308:3;21234:86;:::i;:::-;21227:93;;21344:56;21394:5;21344:56;:::i;:::-;21423:7;21454:1;21439:284;21464:6;21461:1;21458:13;21439:284;;;21540:6;21534:13;21567:63;21626:3;21611:13;21567:63;:::i;:::-;21560:70;;21653:60;21706:6;21653:60;:::i;:::-;21643:70;;21499:224;21486:1;21483;21479:9;21474:14;;21439:284;;;21443:14;21739:3;21732:10;;21140:608;;;21016:732;;;;:::o;21754:831::-;22017:4;22055:3;22044:9;22040:19;22032:27;;22069:71;22137:1;22126:9;22122:17;22113:6;22069:71;:::i;:::-;22150:80;22226:2;22215:9;22211:18;22202:6;22150:80;:::i;:::-;22277:9;22271:4;22267:20;22262:2;22251:9;22247:18;22240:48;22305:108;22408:4;22399:6;22305:108;:::i;:::-;22297:116;;22423:72;22491:2;22480:9;22476:18;22467:6;22423:72;:::i;:::-;22505:73;22573:3;22562:9;22558:19;22549:6;22505:73;:::i;:::-;21754:831;;;;;;;;:::o;22591:147::-;22692:11;22729:3;22714:18;;22591:147;;;;:::o;22744:114::-;;:::o;22864:398::-;23023:3;23044:83;23125:1;23120:3;23044:83;:::i;:::-;23037:90;;23136:93;23225:3;23136:93;:::i;:::-;23254:1;23249:3;23245:11;23238:18;;22864:398;;;:::o;23268:379::-;23452:3;23474:147;23617:3;23474:147;:::i;:::-;23467:154;;23638:3;23631:10;;23268:379;;;:::o

Swarm Source

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