ETH Price: $3,384.01 (+3.45%)
Gas: 2 Gwei

Token

POW'r UP Ethereum Virtual Miner (POWR)
 

Overview

Max Total Supply

571 POWR

Holders

162

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 POWR
0xc9bdd29cad35130de64b48c6da772834f20b0a3c
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:
PowrUP

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-02
*/

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

// File @openzeppelin/contracts/security/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/PowrUp.sol

pragma solidity 0.8.14;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``"s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

library Address {

    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256("")`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
}

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

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

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

    /**
     * @dev Moves `amount` tokens from the caller"s account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

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

contract Ownable {

    address public owner;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier onlyOwner() {
        // If the first argument of "require" evaluates to "false", execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use "require" to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }
    
    /**
     * @dev Set contract deployer as owner
     */
    constructor() {
        owner = msg.sender; // "msg.sender" is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
    }

    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function changeOwner(address newOwner) public onlyOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Return owner address 
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
}

interface IAggregator {
  function latestAnswer() external view returns (int256);
  function latestTimestamp() external view returns (uint256);
  function latestRound() external view returns (uint256);
  function getAnswer(uint256 roundId) external view returns (int256);
  function getTimestamp(uint256 roundId) external view returns (uint256);
  function decimals() external view returns (uint8);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}

contract PowrUP is Context, ERC165, IERC721, IERC721Metadata, ReentrancyGuard, Ownable {

    using Address for address;

    // Token name
    string private constant _name = "POW'r UP Ethereum Virtual Miner";

    // Token symbol
    string private constant _symbol = "POWR";

    // total number of NFTs Minted
    uint256 private _totalSupply;
    uint256 public currentSupplyIndex;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // cost for minting NFT
    uint256 public costUSD = 1000;

    // Mint Fee Recipient
    address public mintRecipient;

    // base URI
    string private baseURI = "url";
    string private ending = ".json";

    // Contracts
    IAggregator public aggregatorContract;

    // Enable Trading
    bool public mintingEnabled = false;

    constructor() {
        aggregatorContract = IAggregator(address(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419));
    }

    ////////////////////////////////////////////////
    ///////////   RESTRICTED FUNCTIONS   ///////////
    ////////////////////////////////////////////////

    function enableMinting() external onlyOwner {
        mintingEnabled = true;
    }

    function disableMinting() external onlyOwner {
        mintingEnabled = false;
    }

    function setMintRecipient(address newRecipient) external onlyOwner {
        mintRecipient = newRecipient;
    }

    function withdraw() external onlyOwner {
        (bool s,) = payable(msg.sender).call{value: address(this).balance}("");
        require(s);
    }

    function withdrawToken(address token_) external onlyOwner {
        require(token_ != address(0), "Zero Address");
        IERC20(token_).transfer(msg.sender, IERC20(token_).balanceOf(address(this)));
    }

    function setCostUSD(uint256 newCost) external onlyOwner {
        costUSD = newCost;
    }

    function setBaseURI(string calldata newURI) external onlyOwner {
        baseURI = newURI;
    }

    function setURIExtention(string calldata newExtention) external onlyOwner {
        ending = newExtention;
    }

    function ownerMint(address to, uint256 qty) external onlyOwner {
        // mint NFTs
        for (uint i = 0; i < qty; i++) {
            _safeMint(to, currentSupplyIndex);
        }
    }


    ////////////////////////////////////////////////
    ///////////     PUBLIC FUNCTIONS     ///////////
    ////////////////////////////////////////////////

    /** 
     * Mints `numberOfMints` NFTs To Caller
     */
    function mint(uint256 numberOfMints) payable external nonReentrant {
        require(
            mintingEnabled,
            "Minting Not Enabled"
        );
        require(
            numberOfMints > 0, 
            "Invalid Input"
        );

        // determine cost
        int256 currentPrice = aggregatorContract.latestAnswer();
        uint256 convertedPrice = uint(currentPrice) / 1 * (10 ** aggregatorContract.decimals());
        uint cost = ((costUSD * numberOfMints) * 1e18) / convertedPrice;

        require(
            msg.value >= cost * 99 / 100,
            "Invalid Ethereum Amount"
        );

        // mint tokens
        for (uint i = 0; i < numberOfMints;) {
            _safeMint(msg.sender, currentSupplyIndex);
            unchecked { ++i; }
        }
    }

    function burn(uint256 tokenID) external {
        require(_isApprovedOrOwner(_msgSender(), tokenID), "caller not owner nor approved");
        _burn(tokenID);
    }

    receive() external payable {}

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address wpowner = ownerOf(tokenId);
        require(to != wpowner, "ERC721: approval to current owner");

        require(
            _msgSender() == wpowner || isApprovedForAll(wpowner, _msgSender()),
            "ERC721: not approved or owner"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address _operator, bool approved) public override {
        _setApprovalForAll(_msgSender(), _operator, approved);
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "caller not owner nor approved");
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "caller not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }


    ////////////////////////////////////////////////
    ///////////     READ FUNCTIONS       ///////////
    ////////////////////////////////////////////////

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function getCurrentCost() external view returns (uint256) {
        int256 currentPrice = aggregatorContract.latestAnswer();
        uint256 convertedPrice = uint(currentPrice) / 1e8;
        return (costUSD * 1e18) / convertedPrice;
    }

    function getIDsByOwner(address owner, uint startIndex) external view returns (uint256[] memory) {
        uint256[] memory ids = new uint256[](balanceOf(owner));
        if (balanceOf(owner) == 0) return ids;
        uint256 count = 0;
        for (uint i = startIndex; i < _totalSupply; i++) {
            if (_owners[i] == owner) {
                ids[count] = i;
                count++;
            }
        }
        return ids;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address wpowner) public view override returns (uint256) {
        require(wpowner != address(0), "query for the zero address");
        return _balances[wpowner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        address wpowner = _owners[tokenId];
        require(wpowner != address(0), "query for nonexistent token");
        return wpowner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public pure override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public pure override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "nonexistent token");

        string memory fHalf = string.concat(baseURI, uint2str(tokenId));
        return string.concat(fHalf, ending);
    }

    /**
        Converts A Uint Into a String
    */
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721: query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address wpowner, address _operator) public view override returns (bool) {
        return _operatorApprovals[wpowner][_operator];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: nonexistent token");
        address wpowner = ownerOf(tokenId);
        return (spender == wpowner || getApproved(tokenId) == spender || isApprovedForAll(wpowner, spender));
    }

    ////////////////////////////////////////////////
    ///////////    INTERNAL FUNCTIONS    ///////////
    ////////////////////////////////////////////////


    function _transferIn(address token, uint256 amount) internal {
        require(
            IERC20(token).allowance(msg.sender, address(this)) >= amount,
            "Insufficient Allowance"
        );
        uint bal = IERC20(token).balanceOf(mintRecipient);
        require(
            IERC20(token).transferFrom(msg.sender, mintRecipient, amount),
            "Transfer From Fail"
        );
        uint After = IERC20(token).balanceOf(mintRecipient);
        require(
            After > bal,
            "Zero Received"
        );
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId
    ) internal {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal {
        require(!_exists(tokenId), "ERC721: token already minted");

        _owners[tokenId] = to;
        unchecked {
            _balances[to] += 1;
            _totalSupply++;
            currentSupplyIndex++;
        }

        emit Transfer(address(0), to, tokenId);
    }


    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: non ERC721Receiver implementer");
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal {
        require(_exists(tokenId), "Token Does Not Exist");

        // owner of token
        address owner = ownerOf(tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        // decrement balance
        _balances[owner] -= 1;
        delete _owners[tokenId];

        // decrement total supply
        _totalSupply -= 1;

        // emit transfer
        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        require(ownerOf(tokenId) == from, "Incorrect owner");
        require(to != address(0), "zero address");
        require(balanceOf(from) > 0, "Zero Balance");

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        // Allocate balances
        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        // emit transfer
        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address wpowner,
        address _operator,
        bool approved
    ) internal {
        require(wpowner != _operator, "ERC721: approve to caller");
        _operatorApprovals[wpowner][_operator] = approved;
        emit ApprovalForAll(wpowner, _operator, approved);
    }

    function onReceivedRetval() public pure returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"aggregatorContract","outputs":[{"internalType":"contract IAggregator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"costUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"startIndex","type":"uint256"}],"name":"getIDsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"onReceivedRetval","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setCostUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setMintRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtention","type":"string"}],"name":"setURIExtention","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6103e860085560c060405260036080819052621d5c9b60ea1b60a09081526200002c91600a9190620000e5565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005b91600b91620000e5565b50600c805460ff60a01b191690553480156200007657600080fd5b506001600081815581546001600160a01b031916339081179092556040517f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a3600c80546001600160a01b031916735f4ec3df9cbd43714fe2740f5e3616155c5b8419179055620001c7565b828054620000f3906200018b565b90600052602060002090601f01602090048101928262000117576000855562000162565b82601f106200013257805160ff191683800117855562000162565b8280016001018555821562000162579182015b828111156200016257825182559160200191906001019062000145565b506200017092915062000174565b5090565b5b8082111562000170576000815560010162000175565b600181811c90821680620001a057607f821691505b602082108103620001c157634e487b7160e01b600052602260045260246000fd5b50919050565b6124e780620001d76000396000f3fe6080604052600436106102135760003560e01c8063893d20e811610118578063b4b7eee0116100a0578063e797ec1b1161006f578063e797ec1b14610639578063e8a7bc571461064e578063e946b7ed1461066e578063e985e9c51461068e578063ff43221c146106d757600080fd5b8063b4b7eee0146105ac578063b88d4fde146105d9578063c87b56dd146105f9578063ce9174211461061957600080fd5b80639fd6db12116100e75780639fd6db1214610516578063a0712d6814610537578063a22cb4651461054a578063a6f9dae11461056a578063ae9843d61461058a57600080fd5b8063893d20e81461048b57806389476069146104a95780638da5cb5b146104c957806395d89b41146104e957600080fd5b806342842e0e1161019b57806355f804b31161016a57806355f804b3146104015780636352211e1461042157806370a08231146104415780637e5cd5c114610461578063831e60de1461047657600080fd5b806342842e0e1461038157806342966c68146103a15780634408a046146103c1578063484b973c146103e157600080fd5b806315b287fa116101e257806315b287fa146102fd57806318160ddd146103215780631e2639901461033657806323b872dd1461034c5780633ccfd60b1461036c57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc146102a3578063095ea7b3146102db57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a366004611d03565b6106f7565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5060408051808201909152601f81527f504f57277220555020457468657265756d205669727475616c204d696e65720060208201525b60405161024b9190611d7f565b3480156102af57600080fd5b506102c36102be366004611d92565b610749565b6040516001600160a01b03909116815260200161024b565b3480156102e757600080fd5b506102fb6102f6366004611dc7565b6107da565b005b34801561030957600080fd5b5061031360085481565b60405190815260200161024b565b34801561032d57600080fd5b50600254610313565b34801561034257600080fd5b5061031360035481565b34801561035857600080fd5b506102fb610367366004611df1565b6108c9565b34801561037857600080fd5b506102fb6108fb565b34801561038d57600080fd5b506102fb61039c366004611df1565b61097d565b3480156103ad57600080fd5b506102fb6103bc366004611d92565b610998565b3480156103cd57600080fd5b506102fb6103dc366004611e2d565b6109c6565b3480156103ed57600080fd5b506102fb6103fc366004611dc7565b6109fc565b34801561040d57600080fd5b506102fb61041c366004611e2d565b610a4f565b34801561042d57600080fd5b506102c361043c366004611d92565b610a85565b34801561044d57600080fd5b5061031361045c366004611e9f565b610aea565b34801561046d57600080fd5b506102fb610b5e565b34801561048257600080fd5b50610313610b97565b34801561049757600080fd5b506001546001600160a01b03166102c3565b3480156104b557600080fd5b506102fb6104c4366004611e9f565b610c4d565b3480156104d557600080fd5b506001546102c3906001600160a01b031681565b3480156104f557600080fd5b506040805180820190915260048152632827aba960e11b6020820152610296565b34801561052257600080fd5b50600c5461023f90600160a01b900460ff1681565b6102fb610545366004611d92565b610da1565b34801561055657600080fd5b506102fb610565366004611ec8565b611052565b34801561057657600080fd5b506102fb610585366004611e9f565b61105d565b34801561059657600080fd5b50604051630a85bd0160e11b815260200161024b565b3480156105b857600080fd5b506105cc6105c7366004611dc7565b6110e3565b60405161024b9190611eff565b3480156105e557600080fd5b506102fb6105f4366004611f59565b6111c2565b34801561060557600080fd5b50610296610614366004611d92565b6111fa565b34801561062557600080fd5b506102fb610634366004611d92565b6112af565b34801561064557600080fd5b506102fb6112de565b34801561065a57600080fd5b506009546102c3906001600160a01b031681565b34801561067a57600080fd5b506102fb610689366004611e9f565b61131d565b34801561069a57600080fd5b5061023f6106a9366004612035565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106e357600080fd5b50600c546102c3906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061072857506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b03166107be5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107e582610a85565b9050806001600160a01b0316836001600160a01b0316036108525760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b5565b336001600160a01b038216148061086e575061086e81336106a9565b6108ba5760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e657200000060448201526064016107b5565b6108c48383611369565b505050565b6108d4335b826113d7565b6108f05760405162461bcd60e51b81526004016107b590612068565b6108c48383836114b9565b6001546001600160a01b031633146109255760405162461bcd60e51b81526004016107b59061209f565b604051600090339047908381818185875af1925050503d8060008114610967576040519150601f19603f3d011682016040523d82523d6000602084013e61096c565b606091505b505090508061097a57600080fd5b50565b6108c4838383604051806020016040528060008152506111c2565b6109a1336108ce565b6109bd5760405162461bcd60e51b81526004016107b590612068565b61097a81611663565b6001546001600160a01b031633146109f05760405162461bcd60e51b81526004016107b59061209f565b6108c4600b8383611c54565b6001546001600160a01b03163314610a265760405162461bcd60e51b81526004016107b59061209f565b60005b818110156108c457610a3d83600354611774565b80610a47816120e2565b915050610a29565b6001546001600160a01b03163314610a795760405162461bcd60e51b81526004016107b59061209f565b6108c4600a8383611c54565b6000818152600460205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e000000000060448201526064016107b5565b60006001600160a01b038216610b425760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f206164647265737300000000000060448201526064016107b5565b506001600160a01b031660009081526005602052604090205490565b6001546001600160a01b03163314610b885760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b19169055565b600080600c60009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1191906120fb565b90506000610c236305f5e10083612114565b905080600854670de0b6b3a7640000610c3c9190612136565b610c469190612114565b9250505090565b6001546001600160a01b03163314610c775760405162461bcd60e51b81526004016107b59061209f565b6001600160a01b038116610cbc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107b5565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e91906120fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9d9190612155565b5050565b600260005403610df35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b5565b6002600055600c54600160a01b900460ff16610e475760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c8139bdd08115b98589b1959606a1b60448201526064016107b5565b60008111610e875760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b60448201526064016107b5565b600c54604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd9160048083019260209291908290030181865afa158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef591906120fb565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190612172565b610f7b90600a612279565b610f86600184612114565b610f909190612136565b905060008184600854610fa39190612136565b610fb590670de0b6b3a7640000612136565b610fbf9190612114565b90506064610fce826063612136565b610fd89190612114565b3410156110275760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420457468657265756d20416d6f756e7400000000000000000060448201526064016107b5565b60005b848110156110465761103e33600354611774565b60010161102a565b50506001600055505050565b610d9d338383611801565b6001546001600160a01b031633146110875760405162461bcd60e51b81526004016107b59061209f565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b606060006110f084610aea565b67ffffffffffffffff81111561110857611108611f43565b604051908082528060200260200182016040528015611131578160200160208202803683370190505b50905061113d84610aea565b60000361114b579050610743565b6000835b6002548110156111b8576000818152600460205260409020546001600160a01b038088169116036111a6578083838151811061118d5761118d612288565b6020908102919091010152816111a2816120e2565b9250505b806111b0816120e2565b91505061114f565b5090949350505050565b6111cc33836113d7565b6111e85760405162461bcd60e51b81526004016107b590612068565b6111f4848484846118cf565b50505050565b6000818152600460205260409020546060906001600160a01b03166112555760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016107b5565b6000600a61126284611902565b604051602001611273929190612371565b604051602081830303815290604052905080600b604051602001611298929190612396565b604051602081830303815290604052915050919050565b6001546001600160a01b031633146112d95760405162461bcd60e51b81526004016107b59061209f565b600855565b6001546001600160a01b031633146113085760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b1916600160a01b179055565b6001546001600160a01b031633146113475760405162461bcd60e51b81526004016107b59061209f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061139e82610a85565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b031661143b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064016107b5565b600061144683610a85565b9050806001600160a01b0316846001600160a01b031614806114815750836001600160a01b031661147684610749565b6001600160a01b0316145b806114b157506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114cc82610a85565b6001600160a01b0316146115145760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b60448201526064016107b5565b6001600160a01b0382166115595760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016107b5565b600061156484610aea565b116115a05760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016107b5565b6115ab600082611369565b6001600160a01b03831660009081526005602052604081208054600192906115d49084906123bd565b90915550506001600160a01b03821660009081526005602052604081208054600192906116029084906123d4565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600460205260409020546001600160a01b03166116be5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b60448201526064016107b5565b60006116c982610a85565b90506116d6600083611369565b6001600160a01b03811660009081526005602052604081208054600192906116ff9084906123bd565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906117339084906123bd565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61177e8282611a2e565b61179a6000838360405180602001604052806000815250611b13565b610d9d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107b5565b816001600160a01b0316836001600160a01b0316036118625760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b5565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118da8484846114b9565b6118e684848484611b13565b6111f45760405162461bcd60e51b81526004016107b5906123ec565b6060816000036119295750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611953578061193d816120e2565b915061194c9050600a83612114565b915061192d565b60008167ffffffffffffffff81111561196e5761196e611f43565b6040519080825280601f01601f191660200182016040528015611998576020820181803683370190505b509050815b8515611a25576119ae6001826123bd565b905060006119bd600a88612114565b6119c890600a612136565b6119d290886123bd565b6119dd906030612432565b905060008160f81b9050808484815181106119fa576119fa612288565b60200101906001600160f81b031916908160001a905350611a1c600a89612114565b9750505061199d565b50949350505050565b6000818152600460205260409020546001600160a01b031615611a935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b5565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526005909252808320805460019081019091556002805482019055600380549091019055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611b27846001600160a01b0316611c1b565b15611c1057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b5e903390899088908890600401612457565b6020604051808303816000875af1925050508015611b99575060408051601f3d908101601f19168201909252611b9691810190612494565b60015b611bf6573d808015611bc7576040519150601f19603f3d011682016040523d82523d6000602084013e611bcc565b606091505b508051600003611bee5760405162461bcd60e51b81526004016107b5906123ec565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114b1565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906114b1575050151592915050565b828054611c609061229e565b90600052602060002090601f016020900481019282611c825760008555611cc8565b82601f10611c9b5782800160ff19823516178555611cc8565b82800160010185558215611cc8579182015b82811115611cc8578235825591602001919060010190611cad565b50611cd4929150611cd8565b5090565b5b80821115611cd45760008155600101611cd9565b6001600160e01b03198116811461097a57600080fd5b600060208284031215611d1557600080fd5b8135611d2081611ced565b9392505050565b60005b83811015611d42578181015183820152602001611d2a565b838111156111f45750506000910152565b60008151808452611d6b816020860160208601611d27565b601f01601f19169290920160200192915050565b602081526000611d206020830184611d53565b600060208284031215611da457600080fd5b5035919050565b80356001600160a01b0381168114611dc257600080fd5b919050565b60008060408385031215611dda57600080fd5b611de383611dab565b946020939093013593505050565b600080600060608486031215611e0657600080fd5b611e0f84611dab565b9250611e1d60208501611dab565b9150604084013590509250925092565b60008060208385031215611e4057600080fd5b823567ffffffffffffffff80821115611e5857600080fd5b818501915085601f830112611e6c57600080fd5b813581811115611e7b57600080fd5b866020828501011115611e8d57600080fd5b60209290920196919550909350505050565b600060208284031215611eb157600080fd5b611d2082611dab565b801515811461097a57600080fd5b60008060408385031215611edb57600080fd5b611ee483611dab565b91506020830135611ef481611eba565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611f3757835183529284019291840191600101611f1b565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611f6f57600080fd5b611f7885611dab565b9350611f8660208601611dab565b925060408501359150606085013567ffffffffffffffff80821115611faa57600080fd5b818701915087601f830112611fbe57600080fd5b813581811115611fd057611fd0611f43565b604051601f8201601f19908116603f01168101908382118183101715611ff857611ff8611f43565b816040528281528a602084870101111561201157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561204857600080fd5b61205183611dab565b915061205f60208401611dab565b90509250929050565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016120f4576120f46120cc565b5060010190565b60006020828403121561210d57600080fd5b5051919050565b60008261213157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612150576121506120cc565b500290565b60006020828403121561216757600080fd5b8151611d2081611eba565b60006020828403121561218457600080fd5b815160ff81168114611d2057600080fd5b600181815b808511156121d05781600019048211156121b6576121b66120cc565b808516156121c357918102915b93841c939080029061219a565b509250929050565b6000826121e757506001610743565b816121f457506000610743565b816001811461220a576002811461221457612230565b6001915050610743565b60ff841115612225576122256120cc565b50506001821b610743565b5060208310610133831016604e8410600b8410161715612253575081810a610743565b61225d8383612195565b8060001904821115612271576122716120cc565b029392505050565b6000611d2060ff8416836121d8565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806122b257607f821691505b6020821081036122d257634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c90808316806122f257607f831692505b6020808410820361231357634e487b7160e01b600052602260045260246000fd5b818015612327576001811461233857612365565b60ff19861689528489019650612365565b60008881526020902060005b8681101561235d5781548b820152908501908301612344565b505084890196505b50505050505092915050565b600061237d82856122d8565b835161238d818360208801611d27565b01949350505050565b600083516123a8818460208801611d27565b6123b4818401856122d8565b95945050505050565b6000828210156123cf576123cf6120cc565b500390565b600082198211156123e7576123e76120cc565b500190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600060ff821660ff84168060ff0382111561244f5761244f6120cc565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061248a90830184611d53565b9695505050505050565b6000602082840312156124a657600080fd5b8151611d2081611ced56fea26469706673582212206577c032bb10d0952c63796fad8b88e142ef0367dc89e346be9cb70d9954dc5864736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106102135760003560e01c8063893d20e811610118578063b4b7eee0116100a0578063e797ec1b1161006f578063e797ec1b14610639578063e8a7bc571461064e578063e946b7ed1461066e578063e985e9c51461068e578063ff43221c146106d757600080fd5b8063b4b7eee0146105ac578063b88d4fde146105d9578063c87b56dd146105f9578063ce9174211461061957600080fd5b80639fd6db12116100e75780639fd6db1214610516578063a0712d6814610537578063a22cb4651461054a578063a6f9dae11461056a578063ae9843d61461058a57600080fd5b8063893d20e81461048b57806389476069146104a95780638da5cb5b146104c957806395d89b41146104e957600080fd5b806342842e0e1161019b57806355f804b31161016a57806355f804b3146104015780636352211e1461042157806370a08231146104415780637e5cd5c114610461578063831e60de1461047657600080fd5b806342842e0e1461038157806342966c68146103a15780634408a046146103c1578063484b973c146103e157600080fd5b806315b287fa116101e257806315b287fa146102fd57806318160ddd146103215780631e2639901461033657806323b872dd1461034c5780633ccfd60b1461036c57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc146102a3578063095ea7b3146102db57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a366004611d03565b6106f7565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5060408051808201909152601f81527f504f57277220555020457468657265756d205669727475616c204d696e65720060208201525b60405161024b9190611d7f565b3480156102af57600080fd5b506102c36102be366004611d92565b610749565b6040516001600160a01b03909116815260200161024b565b3480156102e757600080fd5b506102fb6102f6366004611dc7565b6107da565b005b34801561030957600080fd5b5061031360085481565b60405190815260200161024b565b34801561032d57600080fd5b50600254610313565b34801561034257600080fd5b5061031360035481565b34801561035857600080fd5b506102fb610367366004611df1565b6108c9565b34801561037857600080fd5b506102fb6108fb565b34801561038d57600080fd5b506102fb61039c366004611df1565b61097d565b3480156103ad57600080fd5b506102fb6103bc366004611d92565b610998565b3480156103cd57600080fd5b506102fb6103dc366004611e2d565b6109c6565b3480156103ed57600080fd5b506102fb6103fc366004611dc7565b6109fc565b34801561040d57600080fd5b506102fb61041c366004611e2d565b610a4f565b34801561042d57600080fd5b506102c361043c366004611d92565b610a85565b34801561044d57600080fd5b5061031361045c366004611e9f565b610aea565b34801561046d57600080fd5b506102fb610b5e565b34801561048257600080fd5b50610313610b97565b34801561049757600080fd5b506001546001600160a01b03166102c3565b3480156104b557600080fd5b506102fb6104c4366004611e9f565b610c4d565b3480156104d557600080fd5b506001546102c3906001600160a01b031681565b3480156104f557600080fd5b506040805180820190915260048152632827aba960e11b6020820152610296565b34801561052257600080fd5b50600c5461023f90600160a01b900460ff1681565b6102fb610545366004611d92565b610da1565b34801561055657600080fd5b506102fb610565366004611ec8565b611052565b34801561057657600080fd5b506102fb610585366004611e9f565b61105d565b34801561059657600080fd5b50604051630a85bd0160e11b815260200161024b565b3480156105b857600080fd5b506105cc6105c7366004611dc7565b6110e3565b60405161024b9190611eff565b3480156105e557600080fd5b506102fb6105f4366004611f59565b6111c2565b34801561060557600080fd5b50610296610614366004611d92565b6111fa565b34801561062557600080fd5b506102fb610634366004611d92565b6112af565b34801561064557600080fd5b506102fb6112de565b34801561065a57600080fd5b506009546102c3906001600160a01b031681565b34801561067a57600080fd5b506102fb610689366004611e9f565b61131d565b34801561069a57600080fd5b5061023f6106a9366004612035565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106e357600080fd5b50600c546102c3906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061072857506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b03166107be5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006107e582610a85565b9050806001600160a01b0316836001600160a01b0316036108525760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b5565b336001600160a01b038216148061086e575061086e81336106a9565b6108ba5760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e657200000060448201526064016107b5565b6108c48383611369565b505050565b6108d4335b826113d7565b6108f05760405162461bcd60e51b81526004016107b590612068565b6108c48383836114b9565b6001546001600160a01b031633146109255760405162461bcd60e51b81526004016107b59061209f565b604051600090339047908381818185875af1925050503d8060008114610967576040519150601f19603f3d011682016040523d82523d6000602084013e61096c565b606091505b505090508061097a57600080fd5b50565b6108c4838383604051806020016040528060008152506111c2565b6109a1336108ce565b6109bd5760405162461bcd60e51b81526004016107b590612068565b61097a81611663565b6001546001600160a01b031633146109f05760405162461bcd60e51b81526004016107b59061209f565b6108c4600b8383611c54565b6001546001600160a01b03163314610a265760405162461bcd60e51b81526004016107b59061209f565b60005b818110156108c457610a3d83600354611774565b80610a47816120e2565b915050610a29565b6001546001600160a01b03163314610a795760405162461bcd60e51b81526004016107b59061209f565b6108c4600a8383611c54565b6000818152600460205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e000000000060448201526064016107b5565b60006001600160a01b038216610b425760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f206164647265737300000000000060448201526064016107b5565b506001600160a01b031660009081526005602052604090205490565b6001546001600160a01b03163314610b885760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b19169055565b600080600c60009054906101000a90046001600160a01b03166001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1191906120fb565b90506000610c236305f5e10083612114565b905080600854670de0b6b3a7640000610c3c9190612136565b610c469190612114565b9250505090565b6001546001600160a01b03163314610c775760405162461bcd60e51b81526004016107b59061209f565b6001600160a01b038116610cbc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107b5565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e91906120fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9d9190612155565b5050565b600260005403610df35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b5565b6002600055600c54600160a01b900460ff16610e475760405162461bcd60e51b8152602060048201526013602482015272135a5b9d1a5b99c8139bdd08115b98589b1959606a1b60448201526064016107b5565b60008111610e875760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b60448201526064016107b5565b600c54604080516350d25bcd60e01b815290516000926001600160a01b0316916350d25bcd9160048083019260209291908290030181865afa158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef591906120fb565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190612172565b610f7b90600a612279565b610f86600184612114565b610f909190612136565b905060008184600854610fa39190612136565b610fb590670de0b6b3a7640000612136565b610fbf9190612114565b90506064610fce826063612136565b610fd89190612114565b3410156110275760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420457468657265756d20416d6f756e7400000000000000000060448201526064016107b5565b60005b848110156110465761103e33600354611774565b60010161102a565b50506001600055505050565b610d9d338383611801565b6001546001600160a01b031633146110875760405162461bcd60e51b81526004016107b59061209f565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b606060006110f084610aea565b67ffffffffffffffff81111561110857611108611f43565b604051908082528060200260200182016040528015611131578160200160208202803683370190505b50905061113d84610aea565b60000361114b579050610743565b6000835b6002548110156111b8576000818152600460205260409020546001600160a01b038088169116036111a6578083838151811061118d5761118d612288565b6020908102919091010152816111a2816120e2565b9250505b806111b0816120e2565b91505061114f565b5090949350505050565b6111cc33836113d7565b6111e85760405162461bcd60e51b81526004016107b590612068565b6111f4848484846118cf565b50505050565b6000818152600460205260409020546060906001600160a01b03166112555760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016107b5565b6000600a61126284611902565b604051602001611273929190612371565b604051602081830303815290604052905080600b604051602001611298929190612396565b604051602081830303815290604052915050919050565b6001546001600160a01b031633146112d95760405162461bcd60e51b81526004016107b59061209f565b600855565b6001546001600160a01b031633146113085760405162461bcd60e51b81526004016107b59061209f565b600c805460ff60a01b1916600160a01b179055565b6001546001600160a01b031633146113475760405162461bcd60e51b81526004016107b59061209f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061139e82610a85565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b031661143b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064016107b5565b600061144683610a85565b9050806001600160a01b0316846001600160a01b031614806114815750836001600160a01b031661147684610749565b6001600160a01b0316145b806114b157506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114cc82610a85565b6001600160a01b0316146115145760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b60448201526064016107b5565b6001600160a01b0382166115595760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016107b5565b600061156484610aea565b116115a05760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016107b5565b6115ab600082611369565b6001600160a01b03831660009081526005602052604081208054600192906115d49084906123bd565b90915550506001600160a01b03821660009081526005602052604081208054600192906116029084906123d4565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600460205260409020546001600160a01b03166116be5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b60448201526064016107b5565b60006116c982610a85565b90506116d6600083611369565b6001600160a01b03811660009081526005602052604081208054600192906116ff9084906123bd565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906117339084906123bd565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b61177e8282611a2e565b61179a6000838360405180602001604052806000815250611b13565b610d9d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107b5565b816001600160a01b0316836001600160a01b0316036118625760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b5565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118da8484846114b9565b6118e684848484611b13565b6111f45760405162461bcd60e51b81526004016107b5906123ec565b6060816000036119295750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611953578061193d816120e2565b915061194c9050600a83612114565b915061192d565b60008167ffffffffffffffff81111561196e5761196e611f43565b6040519080825280601f01601f191660200182016040528015611998576020820181803683370190505b509050815b8515611a25576119ae6001826123bd565b905060006119bd600a88612114565b6119c890600a612136565b6119d290886123bd565b6119dd906030612432565b905060008160f81b9050808484815181106119fa576119fa612288565b60200101906001600160f81b031916908160001a905350611a1c600a89612114565b9750505061199d565b50949350505050565b6000818152600460205260409020546001600160a01b031615611a935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b5565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526005909252808320805460019081019091556002805482019055600380549091019055518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611b27846001600160a01b0316611c1b565b15611c1057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b5e903390899088908890600401612457565b6020604051808303816000875af1925050508015611b99575060408051601f3d908101601f19168201909252611b9691810190612494565b60015b611bf6573d808015611bc7576040519150601f19603f3d011682016040523d82523d6000602084013e611bcc565b606091505b508051600003611bee5760405162461bcd60e51b81526004016107b5906123ec565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506114b1565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906114b1575050151592915050565b828054611c609061229e565b90600052602060002090601f016020900481019282611c825760008555611cc8565b82601f10611c9b5782800160ff19823516178555611cc8565b82800160010185558215611cc8579182015b82811115611cc8578235825591602001919060010190611cad565b50611cd4929150611cd8565b5090565b5b80821115611cd45760008155600101611cd9565b6001600160e01b03198116811461097a57600080fd5b600060208284031215611d1557600080fd5b8135611d2081611ced565b9392505050565b60005b83811015611d42578181015183820152602001611d2a565b838111156111f45750506000910152565b60008151808452611d6b816020860160208601611d27565b601f01601f19169290920160200192915050565b602081526000611d206020830184611d53565b600060208284031215611da457600080fd5b5035919050565b80356001600160a01b0381168114611dc257600080fd5b919050565b60008060408385031215611dda57600080fd5b611de383611dab565b946020939093013593505050565b600080600060608486031215611e0657600080fd5b611e0f84611dab565b9250611e1d60208501611dab565b9150604084013590509250925092565b60008060208385031215611e4057600080fd5b823567ffffffffffffffff80821115611e5857600080fd5b818501915085601f830112611e6c57600080fd5b813581811115611e7b57600080fd5b866020828501011115611e8d57600080fd5b60209290920196919550909350505050565b600060208284031215611eb157600080fd5b611d2082611dab565b801515811461097a57600080fd5b60008060408385031215611edb57600080fd5b611ee483611dab565b91506020830135611ef481611eba565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611f3757835183529284019291840191600101611f1b565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611f6f57600080fd5b611f7885611dab565b9350611f8660208601611dab565b925060408501359150606085013567ffffffffffffffff80821115611faa57600080fd5b818701915087601f830112611fbe57600080fd5b813581811115611fd057611fd0611f43565b604051601f8201601f19908116603f01168101908382118183101715611ff857611ff8611f43565b816040528281528a602084870101111561201157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561204857600080fd5b61205183611dab565b915061205f60208401611dab565b90509250929050565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016120f4576120f46120cc565b5060010190565b60006020828403121561210d57600080fd5b5051919050565b60008261213157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612150576121506120cc565b500290565b60006020828403121561216757600080fd5b8151611d2081611eba565b60006020828403121561218457600080fd5b815160ff81168114611d2057600080fd5b600181815b808511156121d05781600019048211156121b6576121b66120cc565b808516156121c357918102915b93841c939080029061219a565b509250929050565b6000826121e757506001610743565b816121f457506000610743565b816001811461220a576002811461221457612230565b6001915050610743565b60ff841115612225576122256120cc565b50506001821b610743565b5060208310610133831016604e8410600b8410161715612253575081810a610743565b61225d8383612195565b8060001904821115612271576122716120cc565b029392505050565b6000611d2060ff8416836121d8565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806122b257607f821691505b6020821081036122d257634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c90808316806122f257607f831692505b6020808410820361231357634e487b7160e01b600052602260045260246000fd5b818015612327576001811461233857612365565b60ff19861689528489019650612365565b60008881526020902060005b8681101561235d5781548b820152908501908301612344565b505084890196505b50505050505092915050565b600061237d82856122d8565b835161238d818360208801611d27565b01949350505050565b600083516123a8818460208801611d27565b6123b4818401856122d8565b95945050505050565b6000828210156123cf576123cf6120cc565b500390565b600082198211156123e7576123e76120cc565b500190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600060ff821660ff84168060ff0382111561244f5761244f6120cc565b019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061248a90830184611d53565b9695505050505050565b6000602082840312156124a657600080fd5b8151611d2081611ced56fea26469706673582212206577c032bb10d0952c63796fad8b88e142ef0367dc89e346be9cb70d9954dc5864736f6c634300080e0033

Deployed Bytecode Sourcemap

17552:17053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24160:297;;;;;;;;;;-1:-1:-1;24160:297:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24160:297:0;;;;;;;;25063:92;;;;;;;;;;-1:-1:-1;25142:5:0;;;;;;;;;;;;;;;;;25063:92;;;;;;;:::i;26361:204::-;;;;;;;;;;-1:-1:-1;26361:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;26361:204:0;1528:203:1;21571:377:0;;;;;;;;;;-1:-1:-1;21571:377:0;;;;;:::i;:::-;;:::i;:::-;;18424:29;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;18424:29:0;2173:177:1;23285:93:0;;;;;;;;;;-1:-1:-1;23358:12:0;;23285:93;;17916:33;;;;;;;;;;;;;;;;22236:256;;;;;;;;;;-1:-1:-1;22236:256:0;;;;;:::i;:::-;;:::i;19348:149::-;;;;;;;;;;;;;:::i;22563:177::-;;;;;;;;;;-1:-1:-1;22563:177:0;;;;;:::i;:::-;;:::i;21305:167::-;;;;;;;;;;-1:-1:-1;21305:167:0;;;;;:::i;:::-;;:::i;19928:114::-;;;;;;;;;;-1:-1:-1;19928:114:0;;;;;:::i;:::-;;:::i;20050:194::-;;;;;;;;;;-1:-1:-1;20050:194:0;;;;;:::i;:::-;;:::i;19822:98::-;;;;;;;;;;-1:-1:-1;19822:98:0;;;;;:::i;:::-;;:::i;24773:223::-;;;;;;;;;;-1:-1:-1;24773:223:0;;;;;:::i;:::-;;:::i;24521:190::-;;;;;;;;;;-1:-1:-1;24521:190:0;;;;;:::i;:::-;;:::i;19132:86::-;;;;;;;;;;;;;:::i;23386:243::-;;;;;;;;;;;;;:::i;16867:83::-;;;;;;;;;;-1:-1:-1;16937:5:0;;-1:-1:-1;;;;;16937:5:0;16867:83;;19505:209;;;;;;;;;;-1:-1:-1;19505:209:0;;;;;:::i;:::-;;:::i;15571:20::-;;;;;;;;;;-1:-1:-1;15571:20:0;;;;-1:-1:-1;;;;;15571:20:0;;;25224:96;;;;;;;;;;-1:-1:-1;25305:7:0;;;;;;;;;;;;-1:-1:-1;;;25305:7:0;;;;25224:96;;18707:34;;;;;;;;;;-1:-1:-1;18707:34:0;;;;-1:-1:-1;;;18707:34:0;;;;;;20482:815;;;;;;:::i;:::-;;:::i;22020:149::-;;;;;;;;;;-1:-1:-1;22020:149:0;;;;;:::i;:::-;;:::i;16641:132::-;;;;;;;;;;-1:-1:-1;16641:132:0;;;;;:::i;:::-;;:::i;33126:124::-;;;;;;;;;;-1:-1:-1;33126:124:0;;-1:-1:-1;;;4063:52:1;;4051:2;4036:18;33126:124:0;3919:202:1;23637:451:0;;;;;;;;;;-1:-1:-1;23637:451:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22811:300::-;;;;;;;;;;-1:-1:-1;22811:300:0;;;;;:::i;:::-;;:::i;25391:267::-;;;;;;;;;;-1:-1:-1;25391:267:0;;;;;:::i;:::-;;:::i;19722:92::-;;;;;;;;;;-1:-1:-1;19722:92:0;;;;;:::i;:::-;;:::i;19040:84::-;;;;;;;;;;;;;:::i;18489:28::-;;;;;;;;;;-1:-1:-1;18489:28:0;;;;-1:-1:-1;;;;;18489:28:0;;;19226:114;;;;;;;;;;-1:-1:-1;19226:114:0;;;;;:::i;:::-;;:::i;26636:162::-;;;;;;;;;;-1:-1:-1;26636:162:0;;;;;:::i;:::-;-1:-1:-1;;;;;26752:27:0;;;26728:4;26752:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;;;26636:162;18638:37;;;;;;;;;;-1:-1:-1;18638:37:0;;;;-1:-1:-1;;;;;18638:37:0;;;24160:297;24254:4;-1:-1:-1;;;;;;24291:40:0;;-1:-1:-1;;;24291:40:0;;:105;;-1:-1:-1;;;;;;;24348:48:0;;-1:-1:-1;;;24348:48:0;24291:105;:158;;;-1:-1:-1;;;;;;;;;;4478:40:0;;;24413:36;24271:178;24160:297;-1:-1:-1;;24160:297:0:o;26361:204::-;26429:7;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;26449:64;;;;-1:-1:-1;;;26449:64:0;;6732:2:1;26449:64:0;;;6714:21:1;6771:2;6751:18;;;6744:30;6810:34;6790:18;;;6783:62;-1:-1:-1;;;6861:18:1;;;6854:33;6904:19;;26449:64:0;;;;;;;;;-1:-1:-1;26533:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26533:24:0;;26361:204::o;21571:377::-;21644:15;21662:16;21670:7;21662;:16::i;:::-;21644:34;;21703:7;-1:-1:-1;;;;;21697:13:0;:2;-1:-1:-1;;;;;21697:13:0;;21689:59;;;;-1:-1:-1;;;21689:59:0;;7136:2:1;21689:59:0;;;7118:21:1;7175:2;7155:18;;;7148:30;7214:34;7194:18;;;7187:62;-1:-1:-1;;;7265:18:1;;;7258:31;7306:19;;21689:59:0;6934:397:1;21689:59:0;12582:10;-1:-1:-1;;;;;21783:23:0;;;;:66;;-1:-1:-1;21810:39:0;21827:7;12582:10;26636:162;:::i;21810:39::-;21761:145;;;;-1:-1:-1;;;21761:145:0;;7538:2:1;21761:145:0;;;7520:21:1;7577:2;7557:18;;;7550:30;7616:31;7596:18;;;7589:59;7665:18;;21761:145:0;7336:353:1;21761:145:0;21919:21;21928:2;21932:7;21919:8;:21::i;:::-;21633:315;21571:377;;:::o;22236:256::-;22370:41;12582:10;22389:12;22403:7;22370:18;:41::i;:::-;22362:83;;;;-1:-1:-1;;;22362:83:0;;;;;;;:::i;:::-;22456:28;22466:4;22472:2;22476:7;22456:9;:28::i;19348:149::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19410:58:::1;::::0;19399:6:::1;::::0;19418:10:::1;::::0;19442:21:::1;::::0;19399:6;19410:58;19399:6;19410:58;19442:21;19418:10;19410:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19398:70;;;19487:1;19479:10;;;::::0;::::1;;19387:110;19348:149::o:0;22563:177::-;22693:39;22710:4;22716:2;22720:7;22693:39;;;;;;;;;;;;:16;:39::i;21305:167::-;21364:41;12582:10;21383:12;12502:98;21364:41;21356:83;;;;-1:-1:-1;;;21356:83:0;;;;;;;:::i;:::-;21450:14;21456:7;21450:5;:14::i;19928:114::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;20013:21:::1;:6;20022:12:::0;;20013:21:::1;:::i;20050:194::-:0;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;20151:6:::1;20146:91;20167:3;20163:1;:7;20146:91;;;20192:33;20202:2;20206:18;;20192:9;:33::i;:::-;20172:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20146:91;;19822:98:::0;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19896:16:::1;:7;19906:6:::0;;19896:16:::1;:::i;24773:223::-:0;24837:7;24875:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24875:16:0;;24902:61;;;;-1:-1:-1;;;24902:61:0;;9084:2:1;24902:61:0;;;9066:21:1;9123:2;9103:18;;;9096:30;9162:29;9142:18;;;9135:57;9209:18;;24902:61:0;8882:351:1;24521:190:0;24587:7;-1:-1:-1;;;;;24615:21:0;;24607:60;;;;-1:-1:-1;;;24607:60:0;;9440:2:1;24607:60:0;;;9422:21:1;9479:2;9459:18;;;9452:30;9518:28;9498:18;;;9491:56;9564:18;;24607:60:0;9238:350:1;24607:60:0;-1:-1:-1;;;;;;24685:18:0;;;;;:9;:18;;;;;;;24521:190::o;19132:86::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19188:14:::1;:22:::0;;-1:-1:-1;;;;19188:22:0::1;::::0;;19132:86::o;23386:243::-;23435:7;23455:19;23477:18;;;;;;;;;-1:-1:-1;;;;;23477:18:0;-1:-1:-1;;;;;23477:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23455:55;-1:-1:-1;23521:22:0;23546:24;23567:3;23455:55;23546:24;:::i;:::-;23521:49;;23607:14;23589:7;;23599:4;23589:14;;;;:::i;:::-;23588:33;;;;:::i;:::-;23581:40;;;;23386:243;:::o;19505:209::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19582:20:0;::::1;19574:45;;;::::0;-1:-1:-1;;;19574:45:0;;10378:2:1;19574:45:0::1;::::0;::::1;10360:21:1::0;10417:2;10397:18;;;10390:30;-1:-1:-1;;;10436:18:1;;;10429:42;10488:18;;19574:45:0::1;10176:336:1::0;19574:45:0::1;19666:39;::::0;-1:-1:-1;;;19666:39:0;;19699:4:::1;19666:39;::::0;::::1;1674:51:1::0;-1:-1:-1;;;;;19630:23:0;::::1;::::0;::::1;::::0;19654:10:::1;::::0;19630:23;;19666:24:::1;::::0;1647:18:1;;19666:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19630:76;::::0;-1:-1:-1;;;;;;19630:76:0::1;::::0;;;;;;-1:-1:-1;;;;;10898:32:1;;;19630:76:0::1;::::0;::::1;10880:51:1::0;10947:18;;;10940:34;10853:18;;19630:76:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19505:209:::0;:::o;20482:815::-;1913:1;2511:7;;:19;2503:63;;;;-1:-1:-1;;;2503:63:0;;11437:2:1;2503:63:0;;;11419:21:1;11476:2;11456:18;;;11449:30;11515:33;11495:18;;;11488:61;11566:18;;2503:63:0;11235:355:1;2503:63:0;1913:1;2644:7;:18;20582:14:::1;::::0;-1:-1:-1;;;20582:14:0;::::1;;;20560:83;;;::::0;-1:-1:-1;;;20560:83:0;;11797:2:1;20560:83:0::1;::::0;::::1;11779:21:1::0;11836:2;11816:18;;;11809:30;-1:-1:-1;;;11855:18:1;;;11848:49;11914:18;;20560:83:0::1;11595:343:1::0;20560:83:0::1;20692:1;20676:13;:17;20654:81;;;::::0;-1:-1:-1;;;20654:81:0;;12145:2:1;20654:81:0::1;::::0;::::1;12127:21:1::0;12184:2;12164:18;;;12157:30;-1:-1:-1;;;12203:18:1;;;12196:43;12256:18;;20654:81:0::1;11943:337:1::0;20654:81:0::1;20797:18;::::0;:33:::1;::::0;;-1:-1:-1;;;20797:33:0;;;;20775:19:::1;::::0;-1:-1:-1;;;;;20797:18:0::1;::::0;:31:::1;::::0;:33:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:18;:33:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20775:55;;20841:22;20898:18;;;;;;;;;-1:-1:-1::0;;;;;20898:18:0::1;-1:-1:-1::0;;;;;20898:27:0::1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20892:35;::::0;:2:::1;:35;:::i;:::-;20866:22;20887:1;20871:12:::0;20866:22:::1;:::i;:::-;:62;;;;:::i;:::-;20841:87;;20939:9;20988:14;20963:13;20953:7;;:23;;;;:::i;:::-;20952:32;::::0;20980:4:::1;20952:32;:::i;:::-;20951:51;;;;:::i;:::-;20939:63:::0;-1:-1:-1;21062:3:0::1;21050:9;20939:63:::0;21057:2:::1;21050:9;:::i;:::-;:15;;;;:::i;:::-;21037:9;:28;;21015:101;;;::::0;-1:-1:-1;;;21015:101:0;;14148:2:1;21015:101:0::1;::::0;::::1;14130:21:1::0;14187:2;14167:18;;;14160:30;14226:25;14206:18;;;14199:53;14269:18;;21015:101:0::1;13946:347:1::0;21015:101:0::1;21158:6;21153:137;21174:13;21170:1;:17;21153:137;;;21205:41;21215:10;21227:18;;21205:9;:41::i;:::-;21273:3;;21153:137;;;-1:-1:-1::0;;1869:1:0;2823:7;:22;-1:-1:-1;;;20482:815:0:o;22020:149::-;22108:53;12582:10;22141:9;22152:8;22108:18;:53::i;16641:132::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;16722:5:::1;::::0;16713:25:::1;::::0;-1:-1:-1;;;;;16713:25:0;;::::1;::::0;16722:5:::1;::::0;16713:25:::1;::::0;16722:5:::1;::::0;16713:25:::1;16749:5;:16:::0;;-1:-1:-1;;;;;;16749:16:0::1;-1:-1:-1::0;;;;;16749:16:0;;;::::1;::::0;;;::::1;::::0;;16641:132::o;23637:451::-;23715:16;23744:20;23781:16;23791:5;23781:9;:16::i;:::-;23767:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23767:31:0;;23744:54;;23813:16;23823:5;23813:9;:16::i;:::-;23833:1;23813:21;23809:37;;23843:3;-1:-1:-1;23836:10:0;;23809:37;23857:13;23899:10;23885:175;23915:12;;23911:1;:16;23885:175;;;23953:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;23953:19:0;;;:10;;:19;23949:100;;24006:1;23993:3;23997:5;23993:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;24026:7;;;;:::i;:::-;;;;23949:100;23929:3;;;;:::i;:::-;;;;23885:175;;;-1:-1:-1;24077:3:0;;23637:451;-1:-1:-1;;;;23637:451:0:o;22811:300::-;22978:41;12582:10;23011:7;22978:18;:41::i;:::-;22970:83;;;;-1:-1:-1;;;22970:83:0;;;;;;;:::i;:::-;23064:39;23078:4;23084:2;23088:7;23097:5;23064:13;:39::i;:::-;22811:300;;;;:::o;25391:267::-;27099:4;27123:16;;;:7;:16;;;;;;25456:13;;-1:-1:-1;;;;;27123:16:0;25482:46;;;;-1:-1:-1;;;25482:46:0;;14632:2:1;25482:46:0;;;14614:21:1;14671:2;14651:18;;;14644:30;-1:-1:-1;;;14690:18:1;;;14683:47;14747:18;;25482:46:0;14430:341:1;25482:46:0;25541:19;25577:7;25586:17;25595:7;25586:8;:17::i;:::-;25563:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25541:63;;25636:5;25643:6;25622:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25615:35;;;25391:267;;;:::o;19722:92::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19789:7:::1;:17:::0;19722:92::o;19040:84::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19095:14:::1;:21:::0;;-1:-1:-1;;;;19095:21:0::1;-1:-1:-1::0;;;19095:21:0::1;::::0;;19040:84::o;19226:114::-;16248:5;;-1:-1:-1;;;;;16248:5:0;16234:10;:19;16226:51;;;;-1:-1:-1;;;16226:51:0;;;;;;;:::i;:::-;19304:13:::1;:28:::0;;-1:-1:-1;;;;;;19304:28:0::1;-1:-1:-1::0;;;;;19304:28:0;;;::::1;::::0;;;::::1;::::0;;19226:114::o;32498:159::-;32565:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32565:29:0;-1:-1:-1;;;;;32565:29:0;;;;;;;;:24;;32619:16;32565:24;32619:7;:16::i;:::-;-1:-1:-1;;;;;32610:39:0;;;;;;;;;;;32498:159;;:::o;27328:320::-;27413:4;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;27430:54;;;;-1:-1:-1;;;27430:54:0;;17209:2:1;27430:54:0;;;17191:21:1;17248:2;17228:18;;;17221:30;17287:27;17267:18;;;17260:55;17332:18;;27430:54:0;17007:349:1;27430:54:0;27495:15;27513:16;27521:7;27513;:16::i;:::-;27495:34;;27559:7;-1:-1:-1;;;;;27548:18:0;:7;-1:-1:-1;;;;;27548:18:0;;:53;;;;27594:7;-1:-1:-1;;;;;27570:31:0;:20;27582:7;27570:11;:20::i;:::-;-1:-1:-1;;;;;27570:31:0;;27548:53;:91;;;-1:-1:-1;;;;;;26752:27:0;;;26728:4;26752:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;27605:34;27540:100;27328:320;-1:-1:-1;;;;27328:320:0:o;31808:572::-;31952:4;-1:-1:-1;;;;;31932:24:0;:16;31940:7;31932;:16::i;:::-;-1:-1:-1;;;;;31932:24:0;;31924:52;;;;-1:-1:-1;;;31924:52:0;;17563:2:1;31924:52:0;;;17545:21:1;17602:2;17582:18;;;17575:30;-1:-1:-1;;;17621:18:1;;;17614:45;17676:18;;31924:52:0;17361:339:1;31924:52:0;-1:-1:-1;;;;;31995:16:0;;31987:41;;;;-1:-1:-1;;;31987:41:0;;17907:2:1;31987:41:0;;;17889:21:1;17946:2;17926:18;;;17919:30;-1:-1:-1;;;17965:18:1;;;17958:42;18017:18;;31987:41:0;17705:336:1;31987:41:0;32065:1;32047:15;32057:4;32047:9;:15::i;:::-;:19;32039:44;;;;-1:-1:-1;;;32039:44:0;;18248:2:1;32039:44:0;;;18230:21:1;18287:2;18267:18;;;18260:30;-1:-1:-1;;;18306:18:1;;;18299:42;18358:18;;32039:44:0;18046:336:1;32039:44:0;32148:29;32165:1;32169:7;32148:8;:29::i;:::-;-1:-1:-1;;;;;32220:15:0;;;;;;:9;:15;;;;;:20;;32239:1;;32220:15;:20;;32239:1;;32220:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32251:13:0;;;;;;:9;:13;;;;;:18;;32268:1;;32251:13;:18;;32268:1;;32251:18;:::i;:::-;;;;-1:-1:-1;;32280:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32280:21:0;-1:-1:-1;;;;;32280:21:0;;;;;;;;;32345:27;;32280:16;;32345:27;;;;;;;31808:572;;;:::o;30977:494::-;27099:4;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;31029:49;;;;-1:-1:-1;;;31029:49:0;;18852:2:1;31029:49:0;;;18834:21:1;18891:2;18871:18;;;18864:30;-1:-1:-1;;;18910:18:1;;;18903:50;18970:18;;31029:49:0;18650:344:1;31029:49:0;31118:13;31134:16;31142:7;31134;:16::i;:::-;31118:32;;31191:29;31208:1;31212:7;31191:8;:29::i;:::-;-1:-1:-1;;;;;31263:16:0;;;;;;:9;:16;;;;;:21;;31283:1;;31263:16;:21;;31283:1;;31263:21;:::i;:::-;;;;-1:-1:-1;;31302:16:0;;;;:7;:16;;;;;31295:23;;-1:-1:-1;;;;;;31295:23:0;;;31366:12;:17;;31295:23;;31302:16;31366:17;;31295:23;;31366:17;:::i;:::-;;;;-1:-1:-1;;31427:36:0;;31455:7;;31451:1;;-1:-1:-1;;;;;31427:36:0;;;;;31451:1;;31427:36;31018:453;30977:494;:::o;28608:281::-;28701:18;28707:2;28711:7;28701:5;:18::i;:::-;28752:51;28783:1;28787:2;28791:7;28752:51;;;;;;;;;;;;:22;:51::i;:::-;28730:151;;;;-1:-1:-1;;;28730:151:0;;19201:2:1;28730:151:0;;;19183:21:1;19240:2;19220:18;;;19213:30;19279:34;19259:18;;;19252:62;-1:-1:-1;;;19330:18:1;;;19323:48;19388:19;;28730:151:0;18999:414:1;32799:319:0;32951:9;-1:-1:-1;;;;;32940:20:0;:7;-1:-1:-1;;;;;32940:20:0;;32932:58;;;;-1:-1:-1;;;32932:58:0;;19620:2:1;32932:58:0;;;19602:21:1;19659:2;19639:18;;;19632:30;19698:27;19678:18;;;19671:55;19743:18;;32932:58:0;19418:349:1;32932:58:0;-1:-1:-1;;;;;33001:27:0;;;;;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;:49;;-1:-1:-1;;33001:49:0;;;;;;;;;;33066:44;;540:41:1;;;33066:44:0;;513:18:1;33066:44:0;;;;;;;32799:319;;;:::o;30453:295::-;30602:28;30612:4;30618:2;30622:7;30602:9;:28::i;:::-;30649:48;30672:4;30678:2;30682:7;30691:5;30649:22;:48::i;:::-;30641:99;;;;-1:-1:-1;;;30641:99:0;;;;;;;:::i;25722:573::-;25772:27;25816:2;25822:1;25816:7;25812:50;;-1:-1:-1;;25840:10:0;;;;;;;;;;;;-1:-1:-1;;;25840:10:0;;;;;25722:573::o;25812:50::-;25881:2;25872:6;25913:69;25920:6;;25913:69;;25943:5;;;;:::i;:::-;;-1:-1:-1;25963:7:0;;-1:-1:-1;25968:2:0;25963:7;;:::i;:::-;;;25913:69;;;25992:17;26022:3;26012:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26012:14:0;-1:-1:-1;25992:34:0;-1:-1:-1;26046:3:0;26060:198;26067:7;;26060:198;;26095:3;26097:1;26095;:3;:::i;:::-;26091:7;-1:-1:-1;26113:10:0;26143:7;26148:2;26143;:7;:::i;:::-;:12;;26153:2;26143:12;:::i;:::-;26138:17;;:2;:17;:::i;:::-;26127:29;;:2;:29;:::i;:::-;26113:44;;26172:9;26191:4;26184:12;;26172:24;;26221:2;26211:4;26216:1;26211:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;26211:12:0;;;;;;;;-1:-1:-1;26238:8:0;26244:2;26238:8;;:::i;:::-;;;26076:182;;26060:198;;;-1:-1:-1;26282:4:0;25722:573;-1:-1:-1;;;;25722:573:0:o;29225:344::-;27099:4;27123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27123:16:0;:30;29289:58;;;;-1:-1:-1;;;29289:58:0;;20590:2:1;29289:58:0;;;20572:21:1;20629:2;20609:18;;;20602:30;20668;20648:18;;;20641:58;20716:18;;29289:58:0;20388:352:1;29289:58:0;29360:16;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;29360:21:0;-1:-1:-1;;;;;29360:21:0;;;;;;;;29417:13;;;:9;:13;;;;;;:18;;-1:-1:-1;29417:18:0;;;;;;29450:12;:14;;;;;;29479:18;:20;;;;;;;29528:33;29360:16;;;29528:33;;29360:16;;29528:33;29225:344;;:::o;33815:787::-;33970:4;33991:15;:2;-1:-1:-1;;;;;33991:13:0;;:15::i;:::-;33987:608;;;34027:72;;-1:-1:-1;;;34027:72:0;;-1:-1:-1;;;;;34027:36:0;;;;;:72;;12582:10;;34078:4;;34084:7;;34093:5;;34027:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34027:72:0;;;;;;;;-1:-1:-1;;34027:72:0;;;;;;;;;;;;:::i;:::-;;;34023:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34269:6;:13;34286:1;34269:18;34265:260;;34312:48;;-1:-1:-1;;;34312:48:0;;;;;;;:::i;34265:260::-;34475:6;34469:13;34460:6;34456:2;34452:15;34445:38;34023:517;-1:-1:-1;;;;;;34150:51:0;-1:-1:-1;;;34150:51:0;;-1:-1:-1;34143:58:0;;33987:608;-1:-1:-1;34579:4:0;33815:787;;;;;;:::o;11336:619::-;11396:4;11864:20;;11707:66;11904:23;;;;;;:42;;-1:-1:-1;;11931:15:0;;;11896:51;-1:-1:-1;;11336:619:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:592::-;2759:6;2767;2820:2;2808:9;2799:7;2795:23;2791:32;2788:52;;;2836:1;2833;2826:12;2788:52;2876:9;2863:23;2905:18;2946:2;2938:6;2935:14;2932:34;;;2962:1;2959;2952:12;2932:34;3000:6;2989:9;2985:22;2975:32;;3045:7;3038:4;3034:2;3030:13;3026:27;3016:55;;3067:1;3064;3057:12;3016:55;3107:2;3094:16;3133:2;3125:6;3122:14;3119:34;;;3149:1;3146;3139:12;3119:34;3194:7;3189:2;3180:6;3176:2;3172:15;3168:24;3165:37;3162:57;;;3215:1;3212;3205:12;3162:57;3246:2;3238:11;;;;;3268:6;;-1:-1:-1;2688:592:1;;-1:-1:-1;;;;2688:592:1:o;3285:186::-;3344:6;3397:2;3385:9;3376:7;3372:23;3368:32;3365:52;;;3413:1;3410;3403:12;3365:52;3436:29;3455:9;3436:29;:::i;3476:118::-;3562:5;3555:13;3548:21;3541:5;3538:32;3528:60;;3584:1;3581;3574:12;3599:315;3664:6;3672;3725:2;3713:9;3704:7;3700:23;3696:32;3693:52;;;3741:1;3738;3731:12;3693:52;3764:29;3783:9;3764:29;:::i;:::-;3754:39;;3843:2;3832:9;3828:18;3815:32;3856:28;3878:5;3856:28;:::i;:::-;3903:5;3893:15;;;3599:315;;;;;:::o;4126:632::-;4297:2;4349:21;;;4419:13;;4322:18;;;4441:22;;;4268:4;;4297:2;4520:15;;;;4494:2;4479:18;;;4268:4;4563:169;4577:6;4574:1;4571:13;4563:169;;;4638:13;;4626:26;;4707:15;;;;4672:12;;;;4599:1;4592:9;4563:169;;;-1:-1:-1;4749:3:1;;4126:632;-1:-1:-1;;;;;;4126:632:1:o;4763:127::-;4824:10;4819:3;4815:20;4812:1;4805:31;4855:4;4852:1;4845:15;4879:4;4876:1;4869:15;4895:1138;4990:6;4998;5006;5014;5067:3;5055:9;5046:7;5042:23;5038:33;5035:53;;;5084:1;5081;5074:12;5035:53;5107:29;5126:9;5107:29;:::i;:::-;5097:39;;5155:38;5189:2;5178:9;5174:18;5155:38;:::i;:::-;5145:48;;5240:2;5229:9;5225:18;5212:32;5202:42;;5295:2;5284:9;5280:18;5267:32;5318:18;5359:2;5351:6;5348:14;5345:34;;;5375:1;5372;5365:12;5345:34;5413:6;5402:9;5398:22;5388:32;;5458:7;5451:4;5447:2;5443:13;5439:27;5429:55;;5480:1;5477;5470:12;5429:55;5516:2;5503:16;5538:2;5534;5531:10;5528:36;;;5544:18;;:::i;:::-;5619:2;5613:9;5587:2;5673:13;;-1:-1:-1;;5669:22:1;;;5693:2;5665:31;5661:40;5649:53;;;5717:18;;;5737:22;;;5714:46;5711:72;;;5763:18;;:::i;:::-;5803:10;5799:2;5792:22;5838:2;5830:6;5823:18;5878:7;5873:2;5868;5864;5860:11;5856:20;5853:33;5850:53;;;5899:1;5896;5889:12;5850:53;5955:2;5950;5946;5942:11;5937:2;5929:6;5925:15;5912:46;6000:1;5995:2;5990;5982:6;5978:15;5974:24;5967:35;6021:6;6011:16;;;;;;;4895:1138;;;;;;;:::o;6038:260::-;6106:6;6114;6167:2;6155:9;6146:7;6142:23;6138:32;6135:52;;;6183:1;6180;6173:12;6135:52;6206:29;6225:9;6206:29;:::i;:::-;6196:39;;6254:38;6288:2;6277:9;6273:18;6254:38;:::i;:::-;6244:48;;6038:260;;;;;:::o;7694:353::-;7896:2;7878:21;;;7935:2;7915:18;;;7908:30;7974:31;7969:2;7954:18;;7947:59;8038:2;8023:18;;7694:353::o;8052:343::-;8254:2;8236:21;;;8293:2;8273:18;;;8266:30;-1:-1:-1;;;8327:2:1;8312:18;;8305:49;8386:2;8371:18;;8052:343::o;8610:127::-;8671:10;8666:3;8662:20;8659:1;8652:31;8702:4;8699:1;8692:15;8726:4;8723:1;8716:15;8742:135;8781:3;8802:17;;;8799:43;;8822:18;;:::i;:::-;-1:-1:-1;8869:1:1;8858:13;;8742:135::o;9593:183::-;9662:6;9715:2;9703:9;9694:7;9690:23;9686:32;9683:52;;;9731:1;9728;9721:12;9683:52;-1:-1:-1;9754:16:1;;9593:183;-1:-1:-1;9593:183:1:o;9781:217::-;9821:1;9847;9837:132;;9891:10;9886:3;9882:20;9879:1;9872:31;9926:4;9923:1;9916:15;9954:4;9951:1;9944:15;9837:132;-1:-1:-1;9983:9:1;;9781:217::o;10003:168::-;10043:7;10109:1;10105;10101:6;10097:14;10094:1;10091:21;10086:1;10079:9;10072:17;10068:45;10065:71;;;10116:18;;:::i;:::-;-1:-1:-1;10156:9:1;;10003:168::o;10985:245::-;11052:6;11105:2;11093:9;11084:7;11080:23;11076:32;11073:52;;;11121:1;11118;11111:12;11073:52;11153:9;11147:16;11172:28;11194:5;11172:28;:::i;12285:273::-;12353:6;12406:2;12394:9;12385:7;12381:23;12377:32;12374:52;;;12422:1;12419;12412:12;12374:52;12454:9;12448:16;12504:4;12497:5;12493:16;12486:5;12483:27;12473:55;;12524:1;12521;12514:12;12563:422;12652:1;12695:5;12652:1;12709:270;12730:7;12720:8;12717:21;12709:270;;;12789:4;12785:1;12781:6;12777:17;12771:4;12768:27;12765:53;;;12798:18;;:::i;:::-;12848:7;12838:8;12834:22;12831:55;;;12868:16;;;;12831:55;12947:22;;;;12907:15;;;;12709:270;;;12713:3;12563:422;;;;;:::o;12990:806::-;13039:5;13069:8;13059:80;;-1:-1:-1;13110:1:1;13124:5;;13059:80;13158:4;13148:76;;-1:-1:-1;13195:1:1;13209:5;;13148:76;13240:4;13258:1;13253:59;;;;13326:1;13321:130;;;;13233:218;;13253:59;13283:1;13274:10;;13297:5;;;13321:130;13358:3;13348:8;13345:17;13342:43;;;13365:18;;:::i;:::-;-1:-1:-1;;13421:1:1;13407:16;;13436:5;;13233:218;;13535:2;13525:8;13522:16;13516:3;13510:4;13507:13;13503:36;13497:2;13487:8;13484:16;13479:2;13473:4;13470:12;13466:35;13463:77;13460:159;;;-1:-1:-1;13572:19:1;;;13604:5;;13460:159;13651:34;13676:8;13670:4;13651:34;:::i;:::-;13721:6;13717:1;13713:6;13709:19;13700:7;13697:32;13694:58;;;13732:18;;:::i;:::-;13770:20;;12990:806;-1:-1:-1;;;12990:806:1:o;13801:140::-;13859:5;13888:47;13929:4;13919:8;13915:19;13909:4;13888:47;:::i;14298:127::-;14359:10;14354:3;14350:20;14347:1;14340:31;14390:4;14387:1;14380:15;14414:4;14411:1;14404:15;14776:380;14855:1;14851:12;;;;14898;;;14919:61;;14973:4;14965:6;14961:17;14951:27;;14919:61;15026:2;15018:6;15015:14;14995:18;14992:38;14989:161;;15072:10;15067:3;15063:20;15060:1;15053:31;15107:4;15104:1;15097:15;15135:4;15132:1;15125:15;14989:161;;14776:380;;;:::o;15287:973::-;15372:12;;15337:3;;15427:1;15447:18;;;;15500;;;;15527:61;;15581:4;15573:6;15569:17;15559:27;;15527:61;15607:2;15655;15647:6;15644:14;15624:18;15621:38;15618:161;;15701:10;15696:3;15692:20;15689:1;15682:31;15736:4;15733:1;15726:15;15764:4;15761:1;15754:15;15618:161;15795:18;15822:104;;;;15940:1;15935:319;;;;15788:466;;15822:104;-1:-1:-1;;15855:24:1;;15843:37;;15900:16;;;;-1:-1:-1;15822:104:1;;15935:319;15234:1;15227:14;;;15271:4;15258:18;;16029:1;16043:165;16057:6;16054:1;16051:13;16043:165;;;16135:14;;16122:11;;;16115:35;16178:16;;;;16072:10;;16043:165;;;16047:3;;16237:6;16232:3;16228:16;16221:23;;15788:466;;;;;;;15287:973;;;;:::o;16265:376::-;16441:3;16469:38;16503:3;16495:6;16469:38;:::i;:::-;16536:6;16530:13;16552:52;16597:6;16593:2;16586:4;16578:6;16574:17;16552:52;:::i;:::-;16620:15;;16265:376;-1:-1:-1;;;;16265:376:1:o;16646:356::-;16822:3;16860:6;16854:13;16876:53;16922:6;16917:3;16910:4;16902:6;16898:17;16876:53;:::i;:::-;16945:51;16988:6;16983:3;16979:16;16971:6;16945:51;:::i;:::-;16938:58;16646:356;-1:-1:-1;;;;;16646:356:1:o;18387:125::-;18427:4;18455:1;18452;18449:8;18446:34;;;18460:18;;:::i;:::-;-1:-1:-1;18497:9:1;;18387:125::o;18517:128::-;18557:3;18588:1;18584:6;18581:1;18578:13;18575:39;;;18594:18;;:::i;:::-;-1:-1:-1;18630:9:1;;18517:128::o;19772:402::-;19974:2;19956:21;;;20013:2;19993:18;;;19986:30;20052:34;20047:2;20032:18;;20025:62;-1:-1:-1;;;20118:2:1;20103:18;;20096:36;20164:3;20149:19;;19772:402::o;20179:204::-;20217:3;20253:4;20250:1;20246:12;20285:4;20282:1;20278:12;20320:3;20314:4;20310:14;20305:3;20302:23;20299:49;;;20328:18;;:::i;:::-;20364:13;;20179:204;-1:-1:-1;;;20179:204:1:o;20745:489::-;-1:-1:-1;;;;;21014:15:1;;;20996:34;;21066:15;;21061:2;21046:18;;21039:43;21113:2;21098:18;;21091:34;;;21161:3;21156:2;21141:18;;21134:31;;;20939:4;;21182:46;;21208:19;;21200:6;21182:46;:::i;:::-;21174:54;20745:489;-1:-1:-1;;;;;;20745:489:1:o;21239:249::-;21308:6;21361:2;21349:9;21340:7;21336:23;21332:32;21329:52;;;21377:1;21374;21367:12;21329:52;21409:9;21403:16;21428:30;21452:5;21428:30;:::i

Swarm Source

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