ETH Price: $3,130.66 (-0.19%)
Gas: 8.99 Gwei

Token

NFTTool (NFTTOOL)
 

Overview

Max Total Supply

0 NFTTOOL

Holders

845

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 NFTTOOL
0xA9852147ee8Bbd4B5bb4cb0Bc65d6C1E960E606a
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:
NFTTool

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 13 : NFTTool.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";

import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/Context.sol";

import "@openzeppelin/contracts/access/Ownable.sol";

error MintPriceNotPaid();

/*

 ███▄    █   █████▒▄▄▄█████▓   ▄▄▄█████▓ ▒█████   ▒█████   ██▓    
 ██ ▀█   █ ▓██   ▒ ▓  ██▒ ▓▒   ▓  ██▒ ▓▒▒██▒  ██▒▒██▒  ██▒▓██▒    
▓██  ▀█ ██▒▒████ ░ ▒ ▓██░ ▒░   ▒ ▓██░ ▒░▒██░  ██▒▒██░  ██▒▒██░    
▓██▒  ▐▌██▒░▓█▒  ░ ░ ▓██▓ ░    ░ ▓██▓ ░ ▒██   ██░▒██   ██░▒██░    
▒██░   ▓██░░▒█░      ▒██▒ ░      ▒██▒ ░ ░ ████▓▒░░ ████▓▒░░██████▒
░ ▒░   ▒ ▒  ▒ ░      ▒ ░░        ▒ ░░   ░ ▒░▒░▒░ ░ ▒░▒░▒░ ░ ▒░▓  ░
░ ░░   ░ ▒░ ░          ░           ░      ░ ▒ ▒░   ░ ▒ ▒░ ░ ░ ▒  ░
   ░   ░ ░  ░ ░      ░           ░      ░ ░ ░ ▒  ░ ░ ░ ▒    ░ ░   
         ░                                  ░ ░      ░ ░      ░  ░
                                                                                                                                                            
*/ 
/// @title The Best Web3 Automation Tool!
/// @author nfttool_club
/// @notice Welcome and Congrats on joining NFTTool!

contract NFTTool is ERC721, Ownable {

    using Strings for uint;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    string private _tokenURI;
    string private _contractURI;
    
    uint256 public maxSupply = 520;
    uint256 public tokenPrice = 0.1 ether;
    uint256 public renewalPrice = 0.1 ether;

    bool public privateSaleActive = false;
    bool public saleActive = false;
    bool public transfersEnabled = true;
    bool public renewalsEnabled = true;
    bool public assertRenewed = true;

    mapping(address => bool) whitelistedAddresses;
    mapping(uint => uint256) public expiryTime;

    event tokenMinted(uint256 tokenId, uint256 _expiryTime);
    event tokenRenew(uint256 tokenId, uint256 _expiryTime);

    constructor(string memory tokenURI_, string memory contractURI_) ERC721("NFTTool", "NFTTOOL") {
        _tokenURI = tokenURI_;
        _contractURI = contractURI_;
    }

    modifier noHaxxor() {
        require(msg.sender == tx.origin, "Haxxor access blocked");
        _;
    }

    function publicMint() external payable noHaxxor {
        uint256 tokenIndex = _tokenIdCounter.current() + 1;

        require(saleActive, "Sale is not active.");
        if (msg.value < tokenPrice) { revert MintPriceNotPaid(); }
        require(tokenIndex < maxSupply, "Minting this token would exceed total supply.");

        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenIndex);
        expiryTime[tokenIndex] = block.timestamp + 30 days;
        emit tokenMinted(tokenIndex, expiryTime[tokenIndex]);
    }

    function whitelistMint() public payable noHaxxor {
        uint256 tokenIndex = _tokenIdCounter.current() + 1;

        require(privateSaleActive, "Private sale is currently not active.");
        require(whitelistedAddresses[msg.sender], "Wallet is not whitelisted.");
        if (msg.value < tokenPrice) { revert MintPriceNotPaid(); }
        require(tokenIndex < maxSupply, "Minting this token would exceed total supply.");

        whitelistedAddresses[msg.sender] = false;
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenIndex);
        expiryTime[tokenIndex] = block.timestamp + 30 days;
        emit tokenMinted(tokenIndex, expiryTime[tokenIndex]);
    }

    function renewToken(uint _tokenId) public payable noHaxxor {
        require(msg.value == renewalPrice, "Incorrect amount of ether sent.");
        require(_exists(_tokenId), "Token does not exist.");
        require(renewalsEnabled, "Renewals are currently disabled");

        uint256 _currentexpiryTime = expiryTime[_tokenId];

        if (block.timestamp > _currentexpiryTime) {
            expiryTime[_tokenId] = block.timestamp + 30 days;
        } else {
            expiryTime[_tokenId] += 30 days;
        }
        emit tokenRenew(_tokenId, expiryTime[_tokenId]);
    }

    //Admin functions

    function ownerOnlyMint(address _receiver) public onlyOwner {
        uint tokenIndex = _tokenIdCounter.current() + 1;

        require(_receiver != address(0), "Receiver cannot be zero address.");
        require(tokenIndex <= maxSupply, "Minting this token would exceed total supply.");

        if (msg.sender != _receiver) {
            require(balanceOf(_receiver) == 0, "Individual already owns a token.");
        }

        _tokenIdCounter.increment();

        _safeMint(_receiver, tokenIndex);
        expiryTime[tokenIndex] = block.timestamp + 30 days;
        emit tokenMinted(tokenIndex, expiryTime[tokenIndex]);

    }

    function ownerBatchMint(address[] calldata _addresses) public onlyOwner {
        uint256 quantity = _addresses.length;
        for (uint256 i=0; i < quantity;) {
            ownerOnlyMint(_addresses[i]);
            unchecked {++i;}
        }
    }

    function ownerRenewToken(uint _tokenId) external onlyOwner {
        require(_exists(_tokenId), "Token does not exist.");
        
        uint _currentexpiryTime = expiryTime[_tokenId];

        if (block.timestamp > _currentexpiryTime) {
            expiryTime[_tokenId] = block.timestamp + 30 days;
        } else {
            expiryTime[_tokenId] += 30 days;
        }
        emit tokenRenew(_tokenId, expiryTime[_tokenId]);
    }

    function ownerBatchRenewToken(uint[] calldata _tokenIds) external onlyOwner {
        uint256 _tokens_length = _tokenIds.length;
        uint256 i = 0;
        for (i; i < _tokens_length;) {
            this.ownerRenewToken(_tokenIds[i]);
            unchecked {++i;}
        }
    }

    function changeMintPrice(uint256 _changedMintPrice) external onlyOwner {
        require(tokenPrice != _changedMintPrice, "Price did not change.");
        tokenPrice = _changedMintPrice;
    }

    function addWhitelist(address[] calldata _addresses) public onlyOwner {
        uint256 _address_length = _addresses.length;
        uint256 i = 0;
        for (i; i < _address_length;) {
            whitelistedAddresses[_addresses[i]] = true;
            unchecked {++i;}
        }
    }

    function removeWhitelist(address[] calldata _addresses) public onlyOwner {
        uint256 _address_length = _addresses.length;
        uint256 i = 0;
        for (i; i < _address_length;) {
            whitelistedAddresses[_addresses[i]] = false;
            unchecked {++i;}
        }
    }

    function setRenewalsActive(bool _state) external onlyOwner {
        renewalsEnabled = _state;
    }

    function setRenewalsAssert(bool _state) external onlyOwner {
        assertRenewed = _state;
    }

    function changeRenewalPrice(uint256 _changedRenewalPrice) external onlyOwner {
        require(renewalPrice != _changedRenewalPrice, "Price did not change.");
        renewalPrice = _changedRenewalPrice;
    }

    function addTokenSupply(uint256 _newTokens) external onlyOwner {
        maxSupply += _newTokens;
    }

    function removeTokens(uint256 _numTokens) external onlyOwner {
        require(maxSupply - _numTokens >= currentSupply(), "Supply cannot fall below minted tokens.");
        maxSupply -= _numTokens;
    }

    function setTokenURI(string calldata tokenURI_) external onlyOwner {
        _tokenURI = tokenURI_;
    }

    function setContractURI(string calldata contractURI_) external onlyOwner {
        _contractURI = contractURI_;
    }

    function withdrawBalance() public onlyOwner {
		payable(msg.sender).transfer(address(this).balance);
	}

    function startSale() public onlyOwner {
        saleActive = !saleActive;
    }

    function startPrivateSale() public onlyOwner {
        privateSaleActive = !privateSaleActive;
    }

    function activateTransfers() public onlyOwner {
        transfersEnabled = !transfersEnabled;
    }

    //View Functions

    function hasWhitelist(address _address) public view returns (bool) {
        return whitelistedAddresses[_address];
    }

    function authenticateUser(address _user, uint256 _tokenId) public view returns (bool) {
        require(_exists(_tokenId), "Token does not exist.");
        require(expiryTime[_tokenId] > block.timestamp || !renewalsEnabled, "Token has expired. Please renew your token!");

        return _user == ownerOf(_tokenId) ? true : false;
    }

    function authenticateUser(uint256 _tokenId) public view returns (bool) {
        require(_exists(_tokenId), "Token does not exist.");
        require(expiryTime[_tokenId] > block.timestamp  || !renewalsEnabled, "Token has expired. Please renew your token!");

        return msg.sender == ownerOf(_tokenId) ? true : false;
    }

    function currentSupply() public view returns (uint) {
        return _tokenIdCounter.current();
    }

    function tokenURI(uint _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return string(abi.encodePacked(_tokenURI, _tokenId.toString()));
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(transfersEnabled, "Transfers are disabled");
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        require(expiryTime[tokenId] > block.timestamp || !renewalsEnabled || !assertRenewed, "Token is expired.");
        _safeTransfer(from, to, tokenId, _data);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        require(transfersEnabled, "Transfers are disabled");
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        require(expiryTime[tokenId] > block.timestamp || !renewalsEnabled || !assertRenewed, "Token is expired.");
        _transfer(from, to, tokenId);
    }

    receive() external payable {}
}

File 2 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

File 3 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

File 4 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 5 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 6 of 13 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 7 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 8 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

File 9 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 13 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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 virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf(tokenId) != address(0);
    }

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @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,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "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 virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId, 1);

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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 virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

File 11 of 13 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

File 13 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"contractURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MintPriceNotPaid","type":"error"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expiryTime","type":"uint256"}],"name":"tokenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expiryTime","type":"uint256"}],"name":"tokenRenew","type":"event"},{"inputs":[],"name":"activateTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTokens","type":"uint256"}],"name":"addTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assertRenewed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"authenticateUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"authenticateUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_changedMintPrice","type":"uint256"}],"name":"changeMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_changedRenewalPrice","type":"uint256"}],"name":"changeRenewalPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"expiryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"ownerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"ownerBatchRenewToken","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":"_receiver","type":"address"}],"name":"ownerOnlyMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerRenewToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"privateSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"removeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"renewToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renewalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renewalsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRenewalsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRenewalsAssert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPrivateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","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":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052610208600a5567016345785d8a0000600b819055600c55600d805464ffffffffff19166401010100001790553480156200003d57600080fd5b5060405162002fa738038062002fa78339810160408190526200006091620002e8565b60405180604001604052806007815260200166139195151bdbdb60ca1b815250604051806040016040528060078152602001661391951513d3d360ca1b8152508160009080519060200190620000b892919062000175565b508051620000ce90600190602084019062000175565b505050620000eb620000e56200011f60201b60201c565b62000123565b81516200010090600890602085019062000175565b5080516200011690600990602084019062000175565b5050506200038e565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001839062000352565b90600052602060002090601f016020900481019282620001a75760008555620001f2565b82601f10620001c257805160ff1916838001178555620001f2565b82800160010185558215620001f2579182015b82811115620001f2578251825591602001919060010190620001d5565b506200020092915062000204565b5090565b5b8082111562000200576000815560010162000205565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024357600080fd5b81516001600160401b03808211156200026057620002606200021b565b604051601f8301601f19908116603f011681019082821181831017156200028b576200028b6200021b565b81604052838152602092508683858801011115620002a857600080fd5b600091505b83821015620002cc5785820183015181830184015290820190620002ad565b83821115620002de5760008385830101525b9695505050505050565b60008060408385031215620002fc57600080fd5b82516001600160401b03808211156200031457600080fd5b620003228683870162000231565b935060208501519150808211156200033957600080fd5b50620003488582860162000231565b9150509250929050565b600181811c908216806200036757607f821691505b6020821081036200038857634e487b7160e01b600052602260045260246000fd5b50919050565b612c09806200039e6000396000f3fe6080604052600436106102e85760003560e01c80637ff9b59611610190578063c0c207c0116100dc578063e2b6304a11610095578063edac985b1161006f578063edac985b146108a9578063f18d4dbb146108c9578063f2fde38b146108e9578063faab3def1461090957600080fd5b8063e2b6304a1461082b578063e8a3d4851461084b578063e985e9c51461086057600080fd5b8063c0c207c014610773578063c87b56dd14610795578063cdffd6ed146107b5578063d5abeb01146107d5578063d854b991146107eb578063e0df5b6f1461080b57600080fd5b8063a22cb46511610149578063b8cb65ee11610123578063b8cb65ee146106e6578063bb026e3214610706578063be010c4014610726578063bef97c871461075357600080fd5b8063a22cb46514610691578063b66a0e5d146106b1578063b88d4fde146106c657600080fd5b80637ff9b596146105e7578063804f43cd146105fd5780638cdb7e8b146106055780638da5cb5b1461063e578063938e3d7b1461065c57806395d89b411461067c57600080fd5b80633fd173661161024f57806368428a1b1161020857806371e23947116101e257806371e2394714610588578063771282f61461059b57806379b345d2146105b05780637b55297a146105d157600080fd5b806368428a1b1461052657806370a0823114610545578063715018a61461057357600080fd5b80633fd173661461047157806342842e0e146104915780634e5db165146104b15780635fd8c710146104d15780636352211e146104e657806367805d711461050657600080fd5b806326092b83116102a157806326092b83146103e55780632a237bb6146103ed5780632fb9329814610407578063338dbf59146104275780633a62244f1461043c5780633e262e5a1461045157600080fd5b806301ffc9a7146102f457806306fdde0314610329578063081812fc1461034b578063095ea7b31461038357806323245216146103a557806323b872dd146103c557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f36600461248c565b610929565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061033e61097b565b6040516103209190612501565b34801561035757600080fd5b5061036b610366366004612514565b610a0d565b6040516001600160a01b039091168152602001610320565b34801561038f57600080fd5b506103a361039e366004612549565b610a34565b005b3480156103b157600080fd5b506103a36103c03660046125bf565b610b4e565b3480156103d157600080fd5b506103a36103e0366004612601565b610bc5565b6103a3610cc3565b3480156103f957600080fd5b50600d546103149060ff1681565b34801561041357600080fd5b506103a361042236600461264d565b610e07565b34801561043357600080fd5b506103a3610e2d565b34801561044857600080fd5b506103a3610e49565b34801561045d57600080fd5b506103a361046c3660046125bf565b610e70565b34801561047d57600080fd5b506103a361048c366004612514565b610eb6565b34801561049d57600080fd5b506103a36104ac366004612601565b610f0c565b3480156104bd57600080fd5b506103146104cc366004612549565b610f27565b3480156104dd57600080fd5b506103a3610fc2565b3480156104f257600080fd5b5061036b610501366004612514565b610ff9565b34801561051257600080fd5b506103a3610521366004612668565b611059565b34801561053257600080fd5b50600d5461031490610100900460ff1681565b34801561055157600080fd5b50610565610560366004612668565b6111d3565b604051908152602001610320565b34801561057f57600080fd5b506103a3611259565b6103a3610596366004612514565b61126d565b3480156105a757600080fd5b506105656113fe565b3480156105bc57600080fd5b50600d54610314906301000000900460ff1681565b3480156105dd57600080fd5b50610565600c5481565b3480156105f357600080fd5b50610565600b5481565b6103a361140e565b34801561061157600080fd5b50610314610620366004612668565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561064a57600080fd5b506006546001600160a01b031661036b565b34801561066857600080fd5b506103a3610677366004612683565b61156e565b34801561068857600080fd5b5061033e611582565b34801561069d57600080fd5b506103a36106ac3660046126f5565b611591565b3480156106bd57600080fd5b506103a36115a0565b3480156106d257600080fd5b506103a36106e136600461273e565b6115c5565b3480156106f257600080fd5b506103a3610701366004612514565b6116c4565b34801561071257600080fd5b506103a3610721366004612514565b61175a565b34801561073257600080fd5b50610565610741366004612514565b600f6020526000908152604090205481565b34801561075f57600080fd5b50600d546103149062010000900460ff1681565b34801561077f57600080fd5b50600d5461031490640100000000900460ff1681565b3480156107a157600080fd5b5061033e6107b0366004612514565b6117b0565b3480156107c157600080fd5b506103146107d0366004612514565b611809565b3480156107e157600080fd5b50610565600a5481565b3480156107f757600080fd5b506103a36108063660046125bf565b6118a2565b34801561081757600080fd5b506103a3610826366004612683565b611930565b34801561083757600080fd5b506103a361084636600461264d565b611944565b34801561085757600080fd5b5061033e61196c565b34801561086c57600080fd5b5061031461087b36600461281a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108b557600080fd5b506103a36108c43660046125bf565b61197b565b3480156108d557600080fd5b506103a36108e4366004612514565b6119ec565b3480156108f557600080fd5b506103a3610904366004612668565b611a06565b34801561091557600080fd5b506103a3610924366004612514565b611a7c565b60006001600160e01b031982166380ac58cd60e01b148061095a57506001600160e01b03198216635b5e139f60e01b145b8061097557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461098a90612844565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690612844565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000610a1882611aa9565b506000908152600460205260409020546001600160a01b031690565b6000610a3f82610ff9565b9050806001600160a01b0316836001600160a01b031603610ab15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610acd5750610acd813361087b565b610b3f5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610aa8565b610b498383611af9565b505050565b610b56611b67565b8060005b81811015610bbf576000600e6000868685818110610b7a57610b7a61287e565b9050602002016020810190610b8f9190612668565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610b5a565b50505050565b600d5462010000900460ff16610c165760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b6044820152606401610aa8565b610c203382611bc1565b610c3c5760405162461bcd60e51b8152600401610aa890612894565b6000818152600f6020526040902054421080610c625750600d546301000000900460ff16155b80610c785750600d54640100000000900460ff16155b610cb85760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71034b99032bc3834b932b21760791b6044820152606401610aa8565b610b49838383611c40565b333214610ce25760405162461bcd60e51b8152600401610aa8906128e5565b6000610ced60075490565b610cf890600161292a565b600d54909150610100900460ff16610d485760405162461bcd60e51b815260206004820152601360248201527229b0b6329034b9903737ba1030b1ba34bb329760691b6044820152606401610aa8565b600b54341015610d6b576040516310f0c8f160e11b815260040160405180910390fd5b600a548110610d8c5760405162461bcd60e51b8152600401610aa890612942565b610d9a600780546001019055565b610da43382611db1565b610db14262278d0061292a565b6000828152600f602052604090819020829055517f0930d5cc1d8162f59cde20a12fdc913d0072915ecfbdf4b1ed9e4f10f0fb479291610dfc91849190918252602082015260400190565b60405180910390a150565b610e0f611b67565b600d805491151563010000000263ff00000019909216919091179055565b610e35611b67565b600d805460ff19811660ff90911615179055565b610e51611b67565b600d805462ff0000198116620100009182900460ff1615909102179055565b610e78611b67565b8060005b81811015610bbf57610eae848483818110610e9957610e9961287e565b90506020020160208101906105219190612668565b600101610e7c565b610ebe611b67565b80600b5403610f075760405162461bcd60e51b8152602060048201526015602482015274283934b1b2903234b2103737ba1031b430b733b29760591b6044820152606401610aa8565b600b55565b610b49838383604051806020016040528060008152506115c5565b6000610f3282611dcb565b610f4e5760405162461bcd60e51b8152600401610aa89061298f565b6000828152600f6020526040902054421080610f745750600d546301000000900460ff16155b610f905760405162461bcd60e51b8152600401610aa8906129be565b610f9982610ff9565b6001600160a01b0316836001600160a01b031614610fb8576000610fbb565b60015b9392505050565b610fca611b67565b60405133904780156108fc02916000818181858888f19350505050158015610ff6573d6000803e3d6000fd5b50565b6000818152600260205260408120546001600160a01b0316806109755760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610aa8565b611061611b67565b600061106c60075490565b61107790600161292a565b90506001600160a01b0382166110cf5760405162461bcd60e51b815260206004820181905260248201527f52656365697665722063616e6e6f74206265207a65726f20616464726573732e6044820152606401610aa8565b600a548111156110f15760405162461bcd60e51b8152600401610aa890612942565b336001600160a01b038316146111575761110a826111d3565b156111575760405162461bcd60e51b815260206004820181905260248201527f496e646976696475616c20616c7265616479206f776e73206120746f6b656e2e6044820152606401610aa8565b611165600780546001019055565b61116f8282611db1565b61117c4262278d0061292a565b6000828152600f602052604090819020829055517f0930d5cc1d8162f59cde20a12fdc913d0072915ecfbdf4b1ed9e4f10f0fb4792916111c791849190918252602082015260400190565b60405180910390a15050565b60006001600160a01b03821661123d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610aa8565b506001600160a01b031660009081526003602052604090205490565b611261611b67565b61126b6000611de8565b565b33321461128c5760405162461bcd60e51b8152600401610aa8906128e5565b600c5434146112dd5760405162461bcd60e51b815260206004820152601f60248201527f496e636f727265637420616d6f756e74206f662065746865722073656e742e006044820152606401610aa8565b6112e681611dcb565b6113025760405162461bcd60e51b8152600401610aa89061298f565b600d546301000000900460ff1661135b5760405162461bcd60e51b815260206004820152601f60248201527f52656e6577616c73206172652063757272656e746c792064697361626c6564006044820152606401610aa8565b6000818152600f6020526040902054428110156113935761137f4262278d0061292a565b6000838152600f60205260409020556113ba565b6000828152600f60205260408120805462278d0092906113b490849061292a565b90915550505b6000828152600f6020908152604091829020548251858152918201527fc5b22e9a67a130743449e00b09e4a00a944ca980e143df60ab742426c534c4f991016111c7565b600061140960075490565b905090565b33321461142d5760405162461bcd60e51b8152600401610aa8906128e5565b600061143860075490565b61144390600161292a565b600d5490915060ff166114a65760405162461bcd60e51b815260206004820152602560248201527f507269766174652073616c652069732063757272656e746c79206e6f742061636044820152643a34bb329760d91b6064820152608401610aa8565b336000908152600e602052604090205460ff166115055760405162461bcd60e51b815260206004820152601a60248201527f57616c6c6574206973206e6f742077686974656c69737465642e0000000000006044820152606401610aa8565b600b54341015611528576040516310f0c8f160e11b815260040160405180910390fd5b600a5481106115495760405162461bcd60e51b8152600401610aa890612942565b336000908152600e60205260409020805460ff19169055610d9a600780546001019055565b611576611b67565b610b49600983836123dd565b60606001805461098a90612844565b61159c338383611e3a565b5050565b6115a8611b67565b600d805461ff001981166101009182900460ff1615909102179055565b600d5462010000900460ff166116165760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b6044820152606401610aa8565b6116203383611bc1565b61163c5760405162461bcd60e51b8152600401610aa890612894565b6000828152600f60205260409020544210806116625750600d546301000000900460ff16155b806116785750600d54640100000000900460ff16155b6116b85760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71034b99032bc3834b932b21760791b6044820152606401610aa8565b610bbf84848484611f08565b6116cc611b67565b6116d46113fe565b81600a546116e29190612a09565b10156117405760405162461bcd60e51b815260206004820152602760248201527f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e746564206044820152663a37b5b2b7399760c91b6064820152608401610aa8565b80600a60008282546117529190612a09565b909155505050565b611762611b67565b80600c54036117ab5760405162461bcd60e51b8152602060048201526015602482015274283934b1b2903234b2103737ba1031b430b733b29760591b6044820152606401610aa8565b600c55565b60606117bb82611dcb565b6117d75760405162461bcd60e51b8152600401610aa89061298f565b60086117e283611f3b565b6040516020016117f3929190612a3c565b6040516020818303038152906040529050919050565b600061181482611dcb565b6118305760405162461bcd60e51b8152600401610aa89061298f565b6000828152600f60205260409020544210806118565750600d546301000000900460ff16155b6118725760405162461bcd60e51b8152600401610aa8906129be565b61187b82610ff9565b6001600160a01b0316336001600160a01b03161461189a576000610975565b600192915050565b6118aa611b67565b8060005b81811015610bbf573063faab3def8585848181106118ce576118ce61287e565b905060200201356040518263ffffffff1660e01b81526004016118f391815260200190565b600060405180830381600087803b15801561190d57600080fd5b505af1158015611921573d6000803e3d6000fd5b505050508060010190506118ae565b611938611b67565b610b49600883836123dd565b61194c611b67565b600d80549115156401000000000264ff0000000019909216919091179055565b60606009805461098a90612844565b611983611b67565b8060005b81811015610bbf576001600e60008686858181106119a7576119a761287e565b90506020020160208101906119bc9190612668565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611987565b6119f4611b67565b80600a6000828254611752919061292a565b611a0e611b67565b6001600160a01b038116611a735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aa8565b610ff681611de8565b611a84611b67565b611a8d81611dcb565b61135b5760405162461bcd60e51b8152600401610aa89061298f565b611ab281611dcb565b610ff65760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610aa8565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b2e82610ff9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6006546001600160a01b0316331461126b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aa8565b600080611bcd83610ff9565b9050806001600160a01b0316846001600160a01b03161480611c1457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611c385750836001600160a01b0316611c2d84610a0d565b6001600160a01b0316145b949350505050565b826001600160a01b0316611c5382610ff9565b6001600160a01b031614611c795760405162461bcd60e51b8152600401610aa890612ae2565b6001600160a01b038216611cdb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aa8565b611ce88383836001611fce565b826001600160a01b0316611cfb82610ff9565b6001600160a01b031614611d215760405162461bcd60e51b8152600401610aa890612ae2565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61159c828260405180602001604052806000815250612056565b6000908152600260205260409020546001600160a01b0316151590565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611e9b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610aa8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f13848484611c40565b611f1f84848484612089565b610bbf5760405162461bcd60e51b8152600401610aa890612b27565b60606000611f488361218a565b600101905060008167ffffffffffffffff811115611f6857611f68612728565b6040519080825280601f01601f191660200182016040528015611f92576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611f9c57509392505050565b6001811115610bbf576001600160a01b03841615612014576001600160a01b0384166000908152600360205260408120805483929061200e908490612a09565b90915550505b6001600160a01b03831615610bbf576001600160a01b0383166000908152600360205260408120805483929061204b90849061292a565b909155505050505050565b6120608383612262565b61206d6000848484612089565b610b495760405162461bcd60e51b8152600401610aa890612b27565b60006001600160a01b0384163b1561217f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120cd903390899088908890600401612b79565b6020604051808303816000875af1925050508015612108575060408051601f3d908101601f1916820190925261210591810190612bb6565b60015b612165573d808015612136576040519150601f19603f3d011682016040523d82523d6000602084013e61213b565b606091505b50805160000361215d5760405162461bcd60e51b8152600401610aa890612b27565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c38565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106121c95772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106121f5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061221357662386f26fc10000830492506010015b6305f5e100831061222b576305f5e100830492506008015b612710831061223f57612710830492506004015b60648310612251576064830492506002015b600a83106109755760010192915050565b6001600160a01b0382166122b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610aa8565b6122c181611dcb565b1561230e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610aa8565b61231c600083836001611fce565b61232581611dcb565b156123725760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610aa8565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123e990612844565b90600052602060002090601f01602090048101928261240b5760008555612451565b82601f106124245782800160ff19823516178555612451565b82800160010185558215612451579182015b82811115612451578235825591602001919060010190612436565b5061245d929150612461565b5090565b5b8082111561245d5760008155600101612462565b6001600160e01b031981168114610ff657600080fd5b60006020828403121561249e57600080fd5b8135610fbb81612476565b60005b838110156124c45781810151838201526020016124ac565b83811115610bbf5750506000910152565b600081518084526124ed8160208601602086016124a9565b601f01601f19169290920160200192915050565b602081526000610fbb60208301846124d5565b60006020828403121561252657600080fd5b5035919050565b80356001600160a01b038116811461254457600080fd5b919050565b6000806040838503121561255c57600080fd5b6125658361252d565b946020939093013593505050565b60008083601f84011261258557600080fd5b50813567ffffffffffffffff81111561259d57600080fd5b6020830191508360208260051b85010111156125b857600080fd5b9250929050565b600080602083850312156125d257600080fd5b823567ffffffffffffffff8111156125e957600080fd5b6125f585828601612573565b90969095509350505050565b60008060006060848603121561261657600080fd5b61261f8461252d565b925061262d6020850161252d565b9150604084013590509250925092565b8035801515811461254457600080fd5b60006020828403121561265f57600080fd5b610fbb8261263d565b60006020828403121561267a57600080fd5b610fbb8261252d565b6000806020838503121561269657600080fd5b823567ffffffffffffffff808211156126ae57600080fd5b818501915085601f8301126126c257600080fd5b8135818111156126d157600080fd5b8660208285010111156126e357600080fd5b60209290920196919550909350505050565b6000806040838503121561270857600080fd5b6127118361252d565b915061271f6020840161263d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561275457600080fd5b61275d8561252d565b935061276b6020860161252d565b925060408501359150606085013567ffffffffffffffff8082111561278f57600080fd5b818701915087601f8301126127a357600080fd5b8135818111156127b5576127b5612728565b604051601f8201601f19908116603f011681019083821181831017156127dd576127dd612728565b816040528281528a60208487010111156127f657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561282d57600080fd5b6128368361252d565b915061271f6020840161252d565b600181811c9082168061285857607f821691505b60208210810361287857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526015908201527412185e1e1bdc881858d8d95cdcc8189b1bd8dad959605a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561293d5761293d612914565b500190565b6020808252602d908201527f4d696e74696e67207468697320746f6b656e20776f756c64206578636565642060408201526c3a37ba30b61039bab838363c9760991b606082015260800190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b6020808252602b908201527f546f6b656e2068617320657870697265642e20506c656173652072656e65772060408201526a796f757220746f6b656e2160a81b606082015260800190565b600082821015612a1b57612a1b612914565b500390565b60008151612a328185602086016124a9565b9290920192915050565b600080845481600182811c915080831680612a5857607f831692505b60208084108203612a7757634e487b7160e01b86526022600452602486fd5b818015612a8b5760018114612a9c57612ac9565b60ff19861689528489019650612ac9565b60008b81526020902060005b86811015612ac15781548b820152908501908301612aa8565b505084890196505b505050505050612ad98185612a20565b95945050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bac908301846124d5565b9695505050505050565b600060208284031215612bc857600080fd5b8151610fbb8161247656fea264697066735822122074027ee6e4334c1c9b9f4690203d8c65827605afbad26a4c4cd014033425027e64736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102e85760003560e01c80637ff9b59611610190578063c0c207c0116100dc578063e2b6304a11610095578063edac985b1161006f578063edac985b146108a9578063f18d4dbb146108c9578063f2fde38b146108e9578063faab3def1461090957600080fd5b8063e2b6304a1461082b578063e8a3d4851461084b578063e985e9c51461086057600080fd5b8063c0c207c014610773578063c87b56dd14610795578063cdffd6ed146107b5578063d5abeb01146107d5578063d854b991146107eb578063e0df5b6f1461080b57600080fd5b8063a22cb46511610149578063b8cb65ee11610123578063b8cb65ee146106e6578063bb026e3214610706578063be010c4014610726578063bef97c871461075357600080fd5b8063a22cb46514610691578063b66a0e5d146106b1578063b88d4fde146106c657600080fd5b80637ff9b596146105e7578063804f43cd146105fd5780638cdb7e8b146106055780638da5cb5b1461063e578063938e3d7b1461065c57806395d89b411461067c57600080fd5b80633fd173661161024f57806368428a1b1161020857806371e23947116101e257806371e2394714610588578063771282f61461059b57806379b345d2146105b05780637b55297a146105d157600080fd5b806368428a1b1461052657806370a0823114610545578063715018a61461057357600080fd5b80633fd173661461047157806342842e0e146104915780634e5db165146104b15780635fd8c710146104d15780636352211e146104e657806367805d711461050657600080fd5b806326092b83116102a157806326092b83146103e55780632a237bb6146103ed5780632fb9329814610407578063338dbf59146104275780633a62244f1461043c5780633e262e5a1461045157600080fd5b806301ffc9a7146102f457806306fdde0314610329578063081812fc1461034b578063095ea7b31461038357806323245216146103a557806323b872dd146103c557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f36600461248c565b610929565b60405190151581526020015b60405180910390f35b34801561033557600080fd5b5061033e61097b565b6040516103209190612501565b34801561035757600080fd5b5061036b610366366004612514565b610a0d565b6040516001600160a01b039091168152602001610320565b34801561038f57600080fd5b506103a361039e366004612549565b610a34565b005b3480156103b157600080fd5b506103a36103c03660046125bf565b610b4e565b3480156103d157600080fd5b506103a36103e0366004612601565b610bc5565b6103a3610cc3565b3480156103f957600080fd5b50600d546103149060ff1681565b34801561041357600080fd5b506103a361042236600461264d565b610e07565b34801561043357600080fd5b506103a3610e2d565b34801561044857600080fd5b506103a3610e49565b34801561045d57600080fd5b506103a361046c3660046125bf565b610e70565b34801561047d57600080fd5b506103a361048c366004612514565b610eb6565b34801561049d57600080fd5b506103a36104ac366004612601565b610f0c565b3480156104bd57600080fd5b506103146104cc366004612549565b610f27565b3480156104dd57600080fd5b506103a3610fc2565b3480156104f257600080fd5b5061036b610501366004612514565b610ff9565b34801561051257600080fd5b506103a3610521366004612668565b611059565b34801561053257600080fd5b50600d5461031490610100900460ff1681565b34801561055157600080fd5b50610565610560366004612668565b6111d3565b604051908152602001610320565b34801561057f57600080fd5b506103a3611259565b6103a3610596366004612514565b61126d565b3480156105a757600080fd5b506105656113fe565b3480156105bc57600080fd5b50600d54610314906301000000900460ff1681565b3480156105dd57600080fd5b50610565600c5481565b3480156105f357600080fd5b50610565600b5481565b6103a361140e565b34801561061157600080fd5b50610314610620366004612668565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561064a57600080fd5b506006546001600160a01b031661036b565b34801561066857600080fd5b506103a3610677366004612683565b61156e565b34801561068857600080fd5b5061033e611582565b34801561069d57600080fd5b506103a36106ac3660046126f5565b611591565b3480156106bd57600080fd5b506103a36115a0565b3480156106d257600080fd5b506103a36106e136600461273e565b6115c5565b3480156106f257600080fd5b506103a3610701366004612514565b6116c4565b34801561071257600080fd5b506103a3610721366004612514565b61175a565b34801561073257600080fd5b50610565610741366004612514565b600f6020526000908152604090205481565b34801561075f57600080fd5b50600d546103149062010000900460ff1681565b34801561077f57600080fd5b50600d5461031490640100000000900460ff1681565b3480156107a157600080fd5b5061033e6107b0366004612514565b6117b0565b3480156107c157600080fd5b506103146107d0366004612514565b611809565b3480156107e157600080fd5b50610565600a5481565b3480156107f757600080fd5b506103a36108063660046125bf565b6118a2565b34801561081757600080fd5b506103a3610826366004612683565b611930565b34801561083757600080fd5b506103a361084636600461264d565b611944565b34801561085757600080fd5b5061033e61196c565b34801561086c57600080fd5b5061031461087b36600461281a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108b557600080fd5b506103a36108c43660046125bf565b61197b565b3480156108d557600080fd5b506103a36108e4366004612514565b6119ec565b3480156108f557600080fd5b506103a3610904366004612668565b611a06565b34801561091557600080fd5b506103a3610924366004612514565b611a7c565b60006001600160e01b031982166380ac58cd60e01b148061095a57506001600160e01b03198216635b5e139f60e01b145b8061097557506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461098a90612844565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690612844565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000610a1882611aa9565b506000908152600460205260409020546001600160a01b031690565b6000610a3f82610ff9565b9050806001600160a01b0316836001600160a01b031603610ab15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610acd5750610acd813361087b565b610b3f5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610aa8565b610b498383611af9565b505050565b610b56611b67565b8060005b81811015610bbf576000600e6000868685818110610b7a57610b7a61287e565b9050602002016020810190610b8f9190612668565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610b5a565b50505050565b600d5462010000900460ff16610c165760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b6044820152606401610aa8565b610c203382611bc1565b610c3c5760405162461bcd60e51b8152600401610aa890612894565b6000818152600f6020526040902054421080610c625750600d546301000000900460ff16155b80610c785750600d54640100000000900460ff16155b610cb85760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71034b99032bc3834b932b21760791b6044820152606401610aa8565b610b49838383611c40565b333214610ce25760405162461bcd60e51b8152600401610aa8906128e5565b6000610ced60075490565b610cf890600161292a565b600d54909150610100900460ff16610d485760405162461bcd60e51b815260206004820152601360248201527229b0b6329034b9903737ba1030b1ba34bb329760691b6044820152606401610aa8565b600b54341015610d6b576040516310f0c8f160e11b815260040160405180910390fd5b600a548110610d8c5760405162461bcd60e51b8152600401610aa890612942565b610d9a600780546001019055565b610da43382611db1565b610db14262278d0061292a565b6000828152600f602052604090819020829055517f0930d5cc1d8162f59cde20a12fdc913d0072915ecfbdf4b1ed9e4f10f0fb479291610dfc91849190918252602082015260400190565b60405180910390a150565b610e0f611b67565b600d805491151563010000000263ff00000019909216919091179055565b610e35611b67565b600d805460ff19811660ff90911615179055565b610e51611b67565b600d805462ff0000198116620100009182900460ff1615909102179055565b610e78611b67565b8060005b81811015610bbf57610eae848483818110610e9957610e9961287e565b90506020020160208101906105219190612668565b600101610e7c565b610ebe611b67565b80600b5403610f075760405162461bcd60e51b8152602060048201526015602482015274283934b1b2903234b2103737ba1031b430b733b29760591b6044820152606401610aa8565b600b55565b610b49838383604051806020016040528060008152506115c5565b6000610f3282611dcb565b610f4e5760405162461bcd60e51b8152600401610aa89061298f565b6000828152600f6020526040902054421080610f745750600d546301000000900460ff16155b610f905760405162461bcd60e51b8152600401610aa8906129be565b610f9982610ff9565b6001600160a01b0316836001600160a01b031614610fb8576000610fbb565b60015b9392505050565b610fca611b67565b60405133904780156108fc02916000818181858888f19350505050158015610ff6573d6000803e3d6000fd5b50565b6000818152600260205260408120546001600160a01b0316806109755760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610aa8565b611061611b67565b600061106c60075490565b61107790600161292a565b90506001600160a01b0382166110cf5760405162461bcd60e51b815260206004820181905260248201527f52656365697665722063616e6e6f74206265207a65726f20616464726573732e6044820152606401610aa8565b600a548111156110f15760405162461bcd60e51b8152600401610aa890612942565b336001600160a01b038316146111575761110a826111d3565b156111575760405162461bcd60e51b815260206004820181905260248201527f496e646976696475616c20616c7265616479206f776e73206120746f6b656e2e6044820152606401610aa8565b611165600780546001019055565b61116f8282611db1565b61117c4262278d0061292a565b6000828152600f602052604090819020829055517f0930d5cc1d8162f59cde20a12fdc913d0072915ecfbdf4b1ed9e4f10f0fb4792916111c791849190918252602082015260400190565b60405180910390a15050565b60006001600160a01b03821661123d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610aa8565b506001600160a01b031660009081526003602052604090205490565b611261611b67565b61126b6000611de8565b565b33321461128c5760405162461bcd60e51b8152600401610aa8906128e5565b600c5434146112dd5760405162461bcd60e51b815260206004820152601f60248201527f496e636f727265637420616d6f756e74206f662065746865722073656e742e006044820152606401610aa8565b6112e681611dcb565b6113025760405162461bcd60e51b8152600401610aa89061298f565b600d546301000000900460ff1661135b5760405162461bcd60e51b815260206004820152601f60248201527f52656e6577616c73206172652063757272656e746c792064697361626c6564006044820152606401610aa8565b6000818152600f6020526040902054428110156113935761137f4262278d0061292a565b6000838152600f60205260409020556113ba565b6000828152600f60205260408120805462278d0092906113b490849061292a565b90915550505b6000828152600f6020908152604091829020548251858152918201527fc5b22e9a67a130743449e00b09e4a00a944ca980e143df60ab742426c534c4f991016111c7565b600061140960075490565b905090565b33321461142d5760405162461bcd60e51b8152600401610aa8906128e5565b600061143860075490565b61144390600161292a565b600d5490915060ff166114a65760405162461bcd60e51b815260206004820152602560248201527f507269766174652073616c652069732063757272656e746c79206e6f742061636044820152643a34bb329760d91b6064820152608401610aa8565b336000908152600e602052604090205460ff166115055760405162461bcd60e51b815260206004820152601a60248201527f57616c6c6574206973206e6f742077686974656c69737465642e0000000000006044820152606401610aa8565b600b54341015611528576040516310f0c8f160e11b815260040160405180910390fd5b600a5481106115495760405162461bcd60e51b8152600401610aa890612942565b336000908152600e60205260409020805460ff19169055610d9a600780546001019055565b611576611b67565b610b49600983836123dd565b60606001805461098a90612844565b61159c338383611e3a565b5050565b6115a8611b67565b600d805461ff001981166101009182900460ff1615909102179055565b600d5462010000900460ff166116165760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b6044820152606401610aa8565b6116203383611bc1565b61163c5760405162461bcd60e51b8152600401610aa890612894565b6000828152600f60205260409020544210806116625750600d546301000000900460ff16155b806116785750600d54640100000000900460ff16155b6116b85760405162461bcd60e51b81526020600482015260116024820152702a37b5b2b71034b99032bc3834b932b21760791b6044820152606401610aa8565b610bbf84848484611f08565b6116cc611b67565b6116d46113fe565b81600a546116e29190612a09565b10156117405760405162461bcd60e51b815260206004820152602760248201527f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e746564206044820152663a37b5b2b7399760c91b6064820152608401610aa8565b80600a60008282546117529190612a09565b909155505050565b611762611b67565b80600c54036117ab5760405162461bcd60e51b8152602060048201526015602482015274283934b1b2903234b2103737ba1031b430b733b29760591b6044820152606401610aa8565b600c55565b60606117bb82611dcb565b6117d75760405162461bcd60e51b8152600401610aa89061298f565b60086117e283611f3b565b6040516020016117f3929190612a3c565b6040516020818303038152906040529050919050565b600061181482611dcb565b6118305760405162461bcd60e51b8152600401610aa89061298f565b6000828152600f60205260409020544210806118565750600d546301000000900460ff16155b6118725760405162461bcd60e51b8152600401610aa8906129be565b61187b82610ff9565b6001600160a01b0316336001600160a01b03161461189a576000610975565b600192915050565b6118aa611b67565b8060005b81811015610bbf573063faab3def8585848181106118ce576118ce61287e565b905060200201356040518263ffffffff1660e01b81526004016118f391815260200190565b600060405180830381600087803b15801561190d57600080fd5b505af1158015611921573d6000803e3d6000fd5b505050508060010190506118ae565b611938611b67565b610b49600883836123dd565b61194c611b67565b600d80549115156401000000000264ff0000000019909216919091179055565b60606009805461098a90612844565b611983611b67565b8060005b81811015610bbf576001600e60008686858181106119a7576119a761287e565b90506020020160208101906119bc9190612668565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611987565b6119f4611b67565b80600a6000828254611752919061292a565b611a0e611b67565b6001600160a01b038116611a735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aa8565b610ff681611de8565b611a84611b67565b611a8d81611dcb565b61135b5760405162461bcd60e51b8152600401610aa89061298f565b611ab281611dcb565b610ff65760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610aa8565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b2e82610ff9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6006546001600160a01b0316331461126b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aa8565b600080611bcd83610ff9565b9050806001600160a01b0316846001600160a01b03161480611c1457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611c385750836001600160a01b0316611c2d84610a0d565b6001600160a01b0316145b949350505050565b826001600160a01b0316611c5382610ff9565b6001600160a01b031614611c795760405162461bcd60e51b8152600401610aa890612ae2565b6001600160a01b038216611cdb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aa8565b611ce88383836001611fce565b826001600160a01b0316611cfb82610ff9565b6001600160a01b031614611d215760405162461bcd60e51b8152600401610aa890612ae2565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61159c828260405180602001604052806000815250612056565b6000908152600260205260409020546001600160a01b0316151590565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611e9b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610aa8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f13848484611c40565b611f1f84848484612089565b610bbf5760405162461bcd60e51b8152600401610aa890612b27565b60606000611f488361218a565b600101905060008167ffffffffffffffff811115611f6857611f68612728565b6040519080825280601f01601f191660200182016040528015611f92576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611f9c57509392505050565b6001811115610bbf576001600160a01b03841615612014576001600160a01b0384166000908152600360205260408120805483929061200e908490612a09565b90915550505b6001600160a01b03831615610bbf576001600160a01b0383166000908152600360205260408120805483929061204b90849061292a565b909155505050505050565b6120608383612262565b61206d6000848484612089565b610b495760405162461bcd60e51b8152600401610aa890612b27565b60006001600160a01b0384163b1561217f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120cd903390899088908890600401612b79565b6020604051808303816000875af1925050508015612108575060408051601f3d908101601f1916820190925261210591810190612bb6565b60015b612165573d808015612136576040519150601f19603f3d011682016040523d82523d6000602084013e61213b565b606091505b50805160000361215d5760405162461bcd60e51b8152600401610aa890612b27565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c38565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106121c95772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106121f5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061221357662386f26fc10000830492506010015b6305f5e100831061222b576305f5e100830492506008015b612710831061223f57612710830492506004015b60648310612251576064830492506002015b600a83106109755760010192915050565b6001600160a01b0382166122b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610aa8565b6122c181611dcb565b1561230e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610aa8565b61231c600083836001611fce565b61232581611dcb565b156123725760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610aa8565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123e990612844565b90600052602060002090601f01602090048101928261240b5760008555612451565b82601f106124245782800160ff19823516178555612451565b82800160010185558215612451579182015b82811115612451578235825591602001919060010190612436565b5061245d929150612461565b5090565b5b8082111561245d5760008155600101612462565b6001600160e01b031981168114610ff657600080fd5b60006020828403121561249e57600080fd5b8135610fbb81612476565b60005b838110156124c45781810151838201526020016124ac565b83811115610bbf5750506000910152565b600081518084526124ed8160208601602086016124a9565b601f01601f19169290920160200192915050565b602081526000610fbb60208301846124d5565b60006020828403121561252657600080fd5b5035919050565b80356001600160a01b038116811461254457600080fd5b919050565b6000806040838503121561255c57600080fd5b6125658361252d565b946020939093013593505050565b60008083601f84011261258557600080fd5b50813567ffffffffffffffff81111561259d57600080fd5b6020830191508360208260051b85010111156125b857600080fd5b9250929050565b600080602083850312156125d257600080fd5b823567ffffffffffffffff8111156125e957600080fd5b6125f585828601612573565b90969095509350505050565b60008060006060848603121561261657600080fd5b61261f8461252d565b925061262d6020850161252d565b9150604084013590509250925092565b8035801515811461254457600080fd5b60006020828403121561265f57600080fd5b610fbb8261263d565b60006020828403121561267a57600080fd5b610fbb8261252d565b6000806020838503121561269657600080fd5b823567ffffffffffffffff808211156126ae57600080fd5b818501915085601f8301126126c257600080fd5b8135818111156126d157600080fd5b8660208285010111156126e357600080fd5b60209290920196919550909350505050565b6000806040838503121561270857600080fd5b6127118361252d565b915061271f6020840161263d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561275457600080fd5b61275d8561252d565b935061276b6020860161252d565b925060408501359150606085013567ffffffffffffffff8082111561278f57600080fd5b818701915087601f8301126127a357600080fd5b8135818111156127b5576127b5612728565b604051601f8201601f19908116603f011681019083821181831017156127dd576127dd612728565b816040528281528a60208487010111156127f657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561282d57600080fd5b6128368361252d565b915061271f6020840161252d565b600181811c9082168061285857607f821691505b60208210810361287857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526015908201527412185e1e1bdc881858d8d95cdcc8189b1bd8dad959605a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561293d5761293d612914565b500190565b6020808252602d908201527f4d696e74696e67207468697320746f6b656e20776f756c64206578636565642060408201526c3a37ba30b61039bab838363c9760991b606082015260800190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b6020808252602b908201527f546f6b656e2068617320657870697265642e20506c656173652072656e65772060408201526a796f757220746f6b656e2160a81b606082015260800190565b600082821015612a1b57612a1b612914565b500390565b60008151612a328185602086016124a9565b9290920192915050565b600080845481600182811c915080831680612a5857607f831692505b60208084108203612a7757634e487b7160e01b86526022600452602486fd5b818015612a8b5760018114612a9c57612ac9565b60ff19861689528489019650612ac9565b60008b81526020902060005b86811015612ac15781548b820152908501908301612aa8565b505084890196505b505050505050612ad98185612a20565b95945050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bac908301846124d5565b9695505050505050565b600060208284031215612bc857600080fd5b8151610fbb8161247656fea264697066735822122074027ee6e4334c1c9b9f4690203d8c65827605afbad26a4c4cd014033425027e64736f6c634300080d0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : tokenURI_ (string):
Arg [1] : contractURI_ (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

2097:8941:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1570:300:1;;;;;;;;;;-1:-1:-1;1570:300:1;;;;;:::i;:::-;;:::i;:::-;;;565:14:13;;558:22;540:41;;528:2;513:18;1570:300:1;;;;;;;;2471:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3935:167::-;;;;;;;;;;-1:-1:-1;3935:167:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:13;;;1696:51;;1684:2;1669:18;3935:167:1;1550:203:13;3468:406:1;;;;;;;;;;-1:-1:-1;3468:406:1;;;;;:::i;:::-;;:::i;:::-;;7106:292:12;;;;;;;;;;-1:-1:-1;7106:292:12;;;;;:::i;:::-;;:::i;10548:453::-;;;;;;;;;;-1:-1:-1;10548:453:12;;;;;:::i;:::-;;:::i;3157:528::-;;;:::i;2450:37::-;;;;;;;;;;-1:-1:-1;2450:37:12;;;;;;;;7404:100;;;;;;;;;;-1:-1:-1;7404:100:12;;;;;:::i;:::-;;:::i;8576:::-;;;;;;;;;;;;;:::i;8682:99::-;;;;;;;;;;;;;:::i;5627:249::-;;;;;;;;;;-1:-1:-1;5627:249:12;;;;;:::i;:::-;;:::i;6613:193::-;;;;;;;;;;-1:-1:-1;6613:193:12;;;;;:::i;:::-;;:::i;5004:179:1:-;;;;;;;;;;-1:-1:-1;5004:179:1;;;;;:::i;:::-;;:::i;8936:337:12:-;;;;;;;;;;-1:-1:-1;8936:337:12;;;;;:::i;:::-;;:::i;8382:103::-;;;;;;;;;;;;;:::i;2190:219:1:-;;;;;;;;;;-1:-1:-1;2190:219:1;;;;;:::i;:::-;;:::i;4990:631:12:-;;;;;;;;;;-1:-1:-1;4990:631:12;;;;;:::i;:::-;;:::i;2493:30::-;;;;;;;;;;-1:-1:-1;2493:30:12;;;;;;;;;;;1929:204:1;;;;;;;;;;-1:-1:-1;1929:204:1;;;;;:::i;:::-;;:::i;:::-;;;4029:25:13;;;4017:2;4002:18;1929:204:1;3883:177:13;1831:101:0;;;;;;;;;;;;;:::i;4382:579:12:-;;;;;;:::i;:::-;;:::i;9613:101::-;;;;;;;;;;;;;:::i;2570:34::-;;;;;;;;;;-1:-1:-1;2570:34:12;;;;;;;;;;;2404:39;;;;;;;;;;;;;;;;2361:37;;;;;;;;;;;;;;;;3691:685;;;:::i;8809:121::-;;;;;;;;;;-1:-1:-1;8809:121:12;;;;;:::i;:::-;-1:-1:-1;;;;;8893:30:12;8870:4;8893:30;;;:20;:30;;;;;;;;;8809:121;1201:85:0;;;;;;;;;;-1:-1:-1;1273:6:0;;-1:-1:-1;;;;;1273:6:0;1201:85;;8259:117:12;;;;;;;;;;-1:-1:-1;8259:117:12;;;;;:::i;:::-;;:::i;2633:102:1:-;;;;;;;;;;;;;:::i;4169:153::-;;;;;;;;;;-1:-1:-1;4169:153:1;;;;;:::i;:::-;;:::i;8491:79:12:-;;;;;;;;;;;;;:::i;10046:496::-;;;;;;;;;;-1:-1:-1;10046:496:12;;;;;:::i;:::-;;:::i;7938:204::-;;;;;;;;;;-1:-1:-1;7938:204:12;;;;;:::i;:::-;;:::i;7614:209::-;;;;;;;;;;-1:-1:-1;7614:209:12;;;;;:::i;:::-;;:::i;2700:42::-;;;;;;;;;;-1:-1:-1;2700:42:12;;;;;:::i;:::-;;;;;;;;;;;;;;2529:35;;;;;;;;;;-1:-1:-1;2529:35:12;;;;;;;;;;;2610:32;;;;;;;;;;-1:-1:-1;2610:32:12;;;;;;;;;;;9720:219;;;;;;;;;;-1:-1:-1;9720:219:12;;;;;:::i;:::-;;:::i;9279:328::-;;;;;;;;;;-1:-1:-1;9279:328:12;;;;;:::i;:::-;;:::i;2325:30::-;;;;;;;;;;;;;;;;6324:283;;;;;;;;;;-1:-1:-1;6324:283:12;;;;;:::i;:::-;;:::i;8148:105::-;;;;;;;;;;-1:-1:-1;8148:105:12;;;;;:::i;:::-;;:::i;7510:98::-;;;;;;;;;;-1:-1:-1;7510:98:12;;;;;:::i;:::-;;:::i;9945:95::-;;;;;;;;;;;;;:::i;4388:162:1:-;;;;;;;;;;-1:-1:-1;4388:162:1;;;;;:::i;:::-;-1:-1:-1;;;;;4508:25:1;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4388:162;6812:288:12;;;;;;;;;;-1:-1:-1;6812:288:12;;;;;:::i;:::-;;:::i;7829:103::-;;;;;;;;;;-1:-1:-1;7829:103:12;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;5882:436:12:-;;;;;;;;;;-1:-1:-1;5882:436:12;;;;;:::i;:::-;;:::i;1570:300:1:-;1672:4;-1:-1:-1;;;;;;1707:40:1;;-1:-1:-1;;;1707:40:1;;:104;;-1:-1:-1;;;;;;;1763:48:1;;-1:-1:-1;;;1763:48:1;1707:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:9;;;1827:36:1;1688:175;1570:300;-1:-1:-1;;1570:300:1:o;2471:98::-;2525:13;2557:5;2550:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2471:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;-1:-1:-1;4071:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;4071:24:1;;3935:167::o;3468:406::-;3548:13;3564:23;3579:7;3564:14;:23::i;:::-;3548:39;;3611:5;-1:-1:-1;;;;;3605:11:1;:2;-1:-1:-1;;;;;3605:11:1;;3597:57;;;;-1:-1:-1;;;3597:57:1;;7490:2:13;3597:57:1;;;7472:21:13;7529:2;7509:18;;;7502:30;7568:34;7548:18;;;7541:62;-1:-1:-1;;;7619:18:13;;;7612:31;7660:19;;3597:57:1;;;;;;;;;719:10:6;-1:-1:-1;;;;;3686:21:1;;;;:62;;-1:-1:-1;3711:37:1;3728:5;719:10:6;4388:162:1;:::i;3711:37::-;3665:170;;;;-1:-1:-1;;;3665:170:1;;7892:2:13;3665:170:1;;;7874:21:13;7931:2;7911:18;;;7904:30;7970:34;7950:18;;;7943:62;8041:31;8021:18;;;8014:59;8090:19;;3665:170:1;7690:425:13;3665:170:1;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3538:336;3468:406;;:::o;7106:292:12:-;1094:13:0;:11;:13::i;:::-;7215:10:12;7189:23:::1;7265:127;7277:15;7273:1;:19;7265:127;;;7347:5;7309:20;:35;7330:10;;7341:1;7330:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7309:35:12::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7309:35:12;:43;;-1:-1:-1;;7309:43:12::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;7377:3:12::1;7265:127;;;7179:219;;7106:292:::0;;:::o;10548:453::-;10685:16;;;;;;;10677:51;;;;-1:-1:-1;;;10677:51:12;;8454:2:13;10677:51:12;;;8436:21:13;8493:2;8473:18;;;8466:30;-1:-1:-1;;;8512:18:13;;;8505:52;8574:18;;10677:51:12;8252:346:13;10677:51:12;10746:41;719:10:6;10779:7:12;10746:18;:41::i;:::-;10738:103;;;;-1:-1:-1;;;10738:103:12;;;;;;;:::i;:::-;10859:19;;;;:10;:19;;;;;;10881:15;-1:-1:-1;10859:37:12;:57;;-1:-1:-1;10901:15:12;;;;;;;10900:16;10859:57;:75;;;-1:-1:-1;10921:13:12;;;;;;;10920:14;10859:75;10851:105;;;;-1:-1:-1;;;10851:105:12;;9223:2:13;10851:105:12;;;9205:21:13;9262:2;9242:18;;;9235:30;-1:-1:-1;;;9281:18:13;;;9274:47;9338:18;;10851:105:12;9021:341:13;10851:105:12;10966:28;10976:4;10982:2;10986:7;10966:9;:28::i;3157:528::-;3084:10;3098:9;3084:23;3076:57;;;;-1:-1:-1;;;3076:57:12;;;;;;;:::i;:::-;3215:18:::1;3236:25;:15;918:14:7::0;;827:112;3236:25:12::1;:29;::::0;3264:1:::1;3236:29;:::i;:::-;3284:10;::::0;3215:50;;-1:-1:-1;3284:10:12::1;::::0;::::1;;;3276:42;;;::::0;-1:-1:-1;;;3276:42:12;;10184:2:13;3276:42:12::1;::::0;::::1;10166:21:13::0;10223:2;10203:18;;;10196:30;-1:-1:-1;;;10242:18:13;;;10235:49;10301:18;;3276:42:12::1;9982:343:13::0;3276:42:12::1;3344:10;;3332:9;:22;3328:58;;;3365:18;;-1:-1:-1::0;;;3365:18:12::1;;;;;;;;;;;3328:58;3416:9;;3403:10;:22;3395:80;;;;-1:-1:-1::0;;;3395:80:12::1;;;;;;;:::i;:::-;3486:27;:15;1032:19:7::0;;1050:1;1032:19;;;945:123;3486:27:12::1;3523:33;3533:10;3545;3523:9;:33::i;:::-;3591:25;:15;3609:7;3591:25;:::i;:::-;3566:22;::::0;;;:10:::1;:22;::::0;;;;;;:50;;;3631:47;::::1;::::0;::::1;::::0;3577:10;;3566:50;10918:25:13;;;10974:2;10959:18;;10952:34;10906:2;10891:18;;10744:248;3631:47:12::1;;;;;;;;3205:480;3157:528::o:0;7404:100::-;1094:13:0;:11;:13::i;:::-;7473:15:12::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;7473:24:12;;::::1;::::0;;;::::1;::::0;;7404:100::o;8576:::-;1094:13:0;:11;:13::i;:::-;8652:17:12::1;::::0;;-1:-1:-1;;8631:38:12;::::1;8652:17;::::0;;::::1;8651:18;8631:38;::::0;;8576:100::o;8682:99::-;1094:13:0;:11;:13::i;:::-;8758:16:12::1;::::0;;-1:-1:-1;;8738:36:12;::::1;8758:16:::0;;;;::::1;;;8757:17;8738:36:::0;;::::1;;::::0;;8682:99::o;5627:249::-;1094:13:0;:11;:13::i;:::-;5728:10:12;5709:16:::1;5755:115;5777:8;5773:1;:12;5755:115;;;5802:28;5816:10;;5827:1;5816:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;5802:28::-;5855:3;;5755:115;;6613:193:::0;1094:13:0;:11;:13::i;:::-;6716:17:12::1;6702:10;;:31:::0;6694:65:::1;;;::::0;-1:-1:-1;;;6694:65:12;;11199:2:13;6694:65:12::1;::::0;::::1;11181:21:13::0;11238:2;11218:18;;;11211:30;-1:-1:-1;;;11257:18:13;;;11250:51;11318:18;;6694:65:12::1;10997:345:13::0;6694:65:12::1;6769:10;:30:::0;6613:193::o;5004:179:1:-;5137:39;5154:4;5160:2;5164:7;5137:39;;;;;;;;;;;;:16;:39::i;8936:337:12:-;9016:4;9040:17;9048:8;9040:7;:17::i;:::-;9032:51;;;;-1:-1:-1;;;9032:51:12;;;;;;;:::i;:::-;9101:20;;;;:10;:20;;;;;;9124:15;-1:-1:-1;9101:38:12;:58;;-1:-1:-1;9144:15:12;;;;;;;9143:16;9101:58;9093:114;;;;-1:-1:-1;;;9093:114:12;;;;;;;:::i;:::-;9234:17;9242:8;9234:7;:17::i;:::-;-1:-1:-1;;;;;9225:26:12;:5;-1:-1:-1;;;;;9225:26:12;;:41;;9261:5;9225:41;;;9254:4;9225:41;9218:48;8936:337;-1:-1:-1;;;8936:337:12:o;8382:103::-;1094:13:0;:11;:13::i;:::-;8430:51:12::1;::::0;8438:10:::1;::::0;8459:21:::1;8430:51:::0;::::1;;;::::0;::::1;::::0;;;8459:21;8438:10;8430:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8382:103::o:0;2190:219:1:-;2262:7;6930:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6930:16:1;;2324:56;;;;-1:-1:-1;;;2324:56:1;;12311:2:13;2324:56:1;;;12293:21:13;12350:2;12330:18;;;12323:30;-1:-1:-1;;;12369:18:13;;;12362:54;12433:18;;2324:56:1;12109:348:13;4990:631:12;1094:13:0;:11;:13::i;:::-;5059:15:12::1;5077:25;:15;918:14:7::0;;827:112;5077:25:12::1;:29;::::0;5105:1:::1;5077:29;:::i;:::-;5059:47:::0;-1:-1:-1;;;;;;5125:23:12;::::1;5117:68;;;::::0;-1:-1:-1;;;5117:68:12;;12664:2:13;5117:68:12::1;::::0;::::1;12646:21:13::0;;;12683:18;;;12676:30;12742:34;12722:18;;;12715:62;12794:18;;5117:68:12::1;12462:356:13::0;5117:68:12::1;5217:9;;5203:10;:23;;5195:81;;;;-1:-1:-1::0;;;5195:81:12::1;;;;;;;:::i;:::-;5291:10;-1:-1:-1::0;;;;;5291:23:12;::::1;;5287:124;;5338:20;5348:9;5338;:20::i;:::-;:25:::0;5330:70:::1;;;::::0;-1:-1:-1;;;5330:70:12;;13025:2:13;5330:70:12::1;::::0;::::1;13007:21:13::0;;;13044:18;;;13037:30;13103:34;13083:18;;;13076:62;13155:18;;5330:70:12::1;12823:356:13::0;5330:70:12::1;5421:27;:15;1032:19:7::0;;1050:1;1032:19;;;945:123;5421:27:12::1;5459:32;5469:9;5480:10;5459:9;:32::i;:::-;5526:25;:15;5544:7;5526:25;:::i;:::-;5501:22;::::0;;;:10:::1;:22;::::0;;;;;;:50;;;5566:47;::::1;::::0;::::1;::::0;5512:10;;5501:50;10918:25:13;;;10974:2;10959:18;;10952:34;10906:2;10891:18;;10744:248;5566:47:12::1;;;;;;;;5049:572;4990:631:::0;:::o;1929:204:1:-;2001:7;-1:-1:-1;;;;;2028:19:1;;2020:73;;;;-1:-1:-1;;;2020:73:1;;13386:2:13;2020:73:1;;;13368:21:13;13425:2;13405:18;;;13398:30;13464:34;13444:18;;;13437:62;-1:-1:-1;;;13515:18:13;;;13508:39;13564:19;;2020:73:1;13184:405:13;2020:73:1;-1:-1:-1;;;;;;2110:16:1;;;;;:9;:16;;;;;;;1929:204::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;4382:579:12:-;3084:10;3098:9;3084:23;3076:57;;;;-1:-1:-1;;;3076:57:12;;;;;;;:::i;:::-;4472:12:::1;;4459:9;:25;4451:69;;;::::0;-1:-1:-1;;;4451:69:12;;13796:2:13;4451:69:12::1;::::0;::::1;13778:21:13::0;13835:2;13815:18;;;13808:30;13874:33;13854:18;;;13847:61;13925:18;;4451:69:12::1;13594:355:13::0;4451:69:12::1;4538:17;4546:8;4538:7;:17::i;:::-;4530:51;;;;-1:-1:-1::0;;;4530:51:12::1;;;;;;;:::i;:::-;4599:15;::::0;;;::::1;;;4591:59;;;::::0;-1:-1:-1;;;4591:59:12;;14156:2:13;4591:59:12::1;::::0;::::1;14138:21:13::0;14195:2;14175:18;;;14168:30;14234:33;14214:18;;;14207:61;14285:18;;4591:59:12::1;13954:355:13::0;4591:59:12::1;4661:26;4690:20:::0;;;:10:::1;:20;::::0;;;;;4725:15:::1;:36:::0;-1:-1:-1;4721:177:12::1;;;4800:25;:15;4818:7;4800:25;:::i;:::-;4777:20;::::0;;;:10:::1;:20;::::0;;;;:48;4721:177:::1;;;4856:20;::::0;;;:10:::1;:20;::::0;;;;:31;;4880:7:::1;::::0;4856:20;:31:::1;::::0;4880:7;;4856:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;4721:177:12::1;4933:20;::::0;;;:10:::1;:20;::::0;;;;;;;;;4912:42;;10918:25:13;;;10959:18;;;10952:34;4912:42:12::1;::::0;10891:18:13;4912:42:12::1;10744:248:13::0;9613:101:12;9659:4;9682:25;:15;918:14:7;;827:112;9682:25:12;9675:32;;9613:101;:::o;3691:685::-;3084:10;3098:9;3084:23;3076:57;;;;-1:-1:-1;;;3076:57:12;;;;;;;:::i;:::-;3750:18:::1;3771:25;:15;918:14:7::0;;827:112;3771:25:12::1;:29;::::0;3799:1:::1;3771:29;:::i;:::-;3819:17;::::0;3750:50;;-1:-1:-1;3819:17:12::1;;3811:67;;;::::0;-1:-1:-1;;;3811:67:12;;14516:2:13;3811:67:12::1;::::0;::::1;14498:21:13::0;14555:2;14535:18;;;14528:30;14594:34;14574:18;;;14567:62;-1:-1:-1;;;14645:18:13;;;14638:35;14690:19;;3811:67:12::1;14314:401:13::0;3811:67:12::1;3917:10;3896:32;::::0;;;:20:::1;:32;::::0;;;;;::::1;;3888:71;;;::::0;-1:-1:-1;;;3888:71:12;;14922:2:13;3888:71:12::1;::::0;::::1;14904:21:13::0;14961:2;14941:18;;;14934:30;15000:28;14980:18;;;14973:56;15046:18;;3888:71:12::1;14720:350:13::0;3888:71:12::1;3985:10;;3973:9;:22;3969:58;;;4006:18;;-1:-1:-1::0;;;4006:18:12::1;;;;;;;;;;;3969:58;4057:9;;4044:10;:22;4036:80;;;;-1:-1:-1::0;;;4036:80:12::1;;;;;;;:::i;:::-;4148:10;4162:5;4127:32:::0;;;:20:::1;:32;::::0;;;;:40;;-1:-1:-1;;4127:40:12::1;::::0;;4177:27:::1;:15;1032:19:7::0;;1050:1;1032:19;;;945:123;8259:117:12;1094:13:0;:11;:13::i;:::-;8342:27:12::1;:12;8357::::0;;8342:27:::1;:::i;2633:102:1:-:0;2689:13;2721:7;2714:14;;;;;:::i;4169:153::-;4263:52;719:10:6;4296:8:1;4306;4263:18;:52::i;:::-;4169:153;;:::o;8491:79:12:-;1094:13:0;:11;:13::i;:::-;8553:10:12::1;::::0;;-1:-1:-1;;8539:24:12;::::1;8553:10;::::0;;;::::1;;;8552:11;8539:24:::0;;::::1;;::::0;;8491:79::o;10046:496::-;10215:16;;;;;;;10207:51;;;;-1:-1:-1;;;10207:51:12;;8454:2:13;10207:51:12;;;8436:21:13;8493:2;8473:18;;;8466:30;-1:-1:-1;;;8512:18:13;;;8505:52;8574:18;;10207:51:12;8252:346:13;10207:51:12;10276:41;719:10:6;10309:7:12;10276:18;:41::i;:::-;10268:103;;;;-1:-1:-1;;;10268:103:12;;;;;;;:::i;:::-;10389:19;;;;:10;:19;;;;;;10411:15;-1:-1:-1;10389:37:12;:57;;-1:-1:-1;10431:15:12;;;;;;;10430:16;10389:57;:75;;;-1:-1:-1;10451:13:12;;;;;;;10450:14;10389:75;10381:105;;;;-1:-1:-1;;;10381:105:12;;9223:2:13;10381:105:12;;;9205:21:13;9262:2;9242:18;;;9235:30;-1:-1:-1;;;9281:18:13;;;9274:47;9338:18;;10381:105:12;9021:341:13;10381:105:12;10496:39;10510:4;10516:2;10520:7;10529:5;10496:13;:39::i;7938:204::-;1094:13:0;:11;:13::i;:::-;8043:15:12::1;:13;:15::i;:::-;8029:10;8017:9;;:22;;;;:::i;:::-;:41;;8009:93;;;::::0;-1:-1:-1;;;8009:93:12;;15407:2:13;8009:93:12::1;::::0;::::1;15389:21:13::0;15446:2;15426:18;;;15419:30;15485:34;15465:18;;;15458:62;-1:-1:-1;;;15536:18:13;;;15529:37;15583:19;;8009:93:12::1;15205:403:13::0;8009:93:12::1;8125:10;8112:9;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;7938:204:12:o;7614:209::-;1094:13:0;:11;:13::i;:::-;7725:20:12::1;7709:12;;:36:::0;7701:70:::1;;;::::0;-1:-1:-1;;;7701:70:12;;11199:2:13;7701:70:12::1;::::0;::::1;11181:21:13::0;11238:2;11218:18;;;11211:30;-1:-1:-1;;;11257:18:13;;;11250:51;11318:18;;7701:70:12::1;10997:345:13::0;7701:70:12::1;7781:12;:35:::0;7614:209::o;9720:219::-;9783:13;9816:17;9824:8;9816:7;:17::i;:::-;9808:51;;;;-1:-1:-1;;;9808:51:12;;;;;;;:::i;:::-;9900:9;9911:19;:8;:17;:19::i;:::-;9883:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9869:63;;9720:219;;;:::o;9279:328::-;9344:4;9368:17;9376:8;9368:7;:17::i;:::-;9360:51;;;;-1:-1:-1;;;9360:51:12;;;;;;;:::i;:::-;9429:20;;;;:10;:20;;;;;;9452:15;-1:-1:-1;9429:38:12;:59;;-1:-1:-1;9473:15:12;;;;;;;9472:16;9429:59;9421:115;;;;-1:-1:-1;;;9421:115:12;;;;;;;:::i;:::-;9568:17;9576:8;9568:7;:17::i;:::-;-1:-1:-1;;;;;9554:31:12;:10;-1:-1:-1;;;;;9554:31:12;;:46;;9595:5;9554:46;;;9588:4;9547:53;9279:328;-1:-1:-1;;9279:328:12:o;6324:283::-;1094:13:0;:11;:13::i;:::-;6435:9:12;6410:22:::1;6484:117;6496:14;6492:1;:18;6484:117;;;6527:4;:20;6548:9:::0;;6558:1;6548:12;;::::1;;;;;:::i;:::-;;;;;;;6527:34;;;;;;;;;;;;;4029:25:13::0;;4017:2;4002:18;;3883:177;6527:34:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6586:3;;;;;6484:117;;8148:105:::0;1094:13:0;:11;:13::i;:::-;8225:21:12::1;:9;8237::::0;;8225:21:::1;:::i;7510:98::-:0;1094:13:0;:11;:13::i;:::-;7579::12::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;7579:22:12;;::::1;::::0;;;::::1;::::0;;7510:98::o;9945:95::-;9989:13;10021:12;10014:19;;;;;:::i;6812:288::-;1094:13:0;:11;:13::i;:::-;6918:10:12;6892:23:::1;6968:126;6980:15;6976:1;:19;6968:126;;;7050:4;7012:20;:35;7033:10;;7044:1;7033:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7012:35:12::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7012:35:12;:42;;-1:-1:-1;;7012:42:12::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;7079:3:12::1;6968:126;;7829:103:::0;1094:13:0;:11;:13::i;:::-;7915:10:12::1;7902:9;;:23;;;;;;;:::i;2081:198:0:-:0;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;17310:2:13;2161:73:0::1;::::0;::::1;17292:21:13::0;17349:2;17329:18;;;17322:30;17388:34;17368:18;;;17361:62;-1:-1:-1;;;17439:18:13;;;17432:36;17485:19;;2161:73:0::1;17108:402:13::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;5882:436:12:-:0;1094:13:0;:11;:13::i;:::-;5959:17:12::1;5967:8;5959:7;:17::i;:::-;5951:51;;;;-1:-1:-1::0;;;5951:51:12::1;;;;;;;:::i;13466:133:1:-:0;13547:16;13555:7;13547;:16::i;:::-;13539:53;;;;-1:-1:-1;;;13539:53:1;;12311:2:13;13539:53:1;;;12293:21:13;12350:2;12330:18;;;12323:30;-1:-1:-1;;;12369:18:13;;;12362:54;12433:18;;13539:53:1;12109:348:13;12768:171:1;12842:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12842:29:1;-1:-1:-1;;;;;12842:29:1;;;;;;;;:24;;12895:23;12842:24;12895:14;:23::i;:::-;-1:-1:-1;;;;;12886:46:1;;;;;;;;;;;12768:171;;:::o;1359:130:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:6;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;17717:2:13;1414:68:0;;;17699:21:13;;;17736:18;;;17729:30;17795:34;17775:18;;;17768:62;17847:18;;1414:68:0;17515:356:13;7540:261:1;7633:4;7649:13;7665:23;7680:7;7665:14;:23::i;:::-;7649:39;;7717:5;-1:-1:-1;;;;;7706:16:1;:7;-1:-1:-1;;;;;7706:16:1;;:52;;;-1:-1:-1;;;;;;4508:25:1;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7726:32;7706:87;;;;7786:7;-1:-1:-1;;;;;7762:31:1;:20;7774:7;7762:11;:20::i;:::-;-1:-1:-1;;;;;7762:31:1;;7706:87;7698:96;7540:261;-1:-1:-1;;;;7540:261:1:o;11423:1233::-;11577:4;-1:-1:-1;;;;;11550:31:1;:23;11565:7;11550:14;:23::i;:::-;-1:-1:-1;;;;;11550:31:1;;11542:81;;;;-1:-1:-1;;;11542:81:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;11641:16:1;;11633:65;;;;-1:-1:-1;;;11633:65:1;;18484:2:13;11633:65:1;;;18466:21:13;18523:2;18503:18;;;18496:30;18562:34;18542:18;;;18535:62;-1:-1:-1;;;18613:18:13;;;18606:34;18657:19;;11633:65:1;18282:400:13;11633:65:1;11709:42;11730:4;11736:2;11740:7;11749:1;11709:20;:42::i;:::-;11878:4;-1:-1:-1;;;;;11851:31:1;:23;11866:7;11851:14;:23::i;:::-;-1:-1:-1;;;;;11851:31:1;;11843:81;;;;-1:-1:-1;;;11843:81:1;;;;;;;:::i;:::-;11993:24;;;;:15;:24;;;;;;;;11986:31;;-1:-1:-1;;;;;;11986:31:1;;;;;;-1:-1:-1;;;;;12461:15:1;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;12461:20:1;;;12495:13;;;;;;;;;:18;;11986:31;12495:18;;;12533:16;;;:7;:16;;;;;;:21;;;;;;;;;;12570:27;;12009:7;;12570:27;;;3538:336;3468:406;;:::o;8131:108::-;8206:26;8216:2;8220:7;8206:26;;;;;;;;;;;;:9;:26::i;7256:126::-;7321:4;6930:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6930:16:1;7344:31;;;7256:126::o;2433:187:0:-;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;13075:307:1:-;13225:8;-1:-1:-1;;;;;13216:17:1;:5;-1:-1:-1;;;;;13216:17:1;;13208:55;;;;-1:-1:-1;;;13208:55:1;;18889:2:13;13208:55:1;;;18871:21:13;18928:2;18908:18;;;18901:30;18967:27;18947:18;;;18940:55;19012:18;;13208:55:1;18687:349:13;13208:55:1;-1:-1:-1;;;;;13273:25:1;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13273:46:1;;;;;;;;;;13334:41;;540::13;;;13334::1;;513:18:13;13334:41:1;;;;;;;13075:307;;;:::o;6424:305::-;6574:28;6584:4;6590:2;6594:7;6574:9;:28::i;:::-;6620:47;6643:4;6649:2;6653:7;6662:4;6620:22;:47::i;:::-;6612:110;;;;-1:-1:-1;;;6612:110:1;;;;;;;:::i;415:696:8:-;471:13;520:14;537:17;548:5;537:10;:17::i;:::-;557:1;537:21;520:38;;572:20;606:6;595:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;595:18:8;-1:-1:-1;572:41:8;-1:-1:-1;733:28:8;;;749:2;733:28;788:280;-1:-1:-1;;819:5:8;-1:-1:-1;;;953:2:8;942:14;;937:30;819:5;924:44;1012:2;1003:11;;;-1:-1:-1;1032:21:8;788:280;1032:21;-1:-1:-1;1088:6:8;415:696;-1:-1:-1;;;415:696:8:o;15698:396:1:-;15882:1;15870:9;:13;15866:222;;;-1:-1:-1;;;;;15903:18:1;;;15899:85;;-1:-1:-1;;;;;15941:15:1;;;;;;:9;:15;;;;;:28;;15960:9;;15941:15;:28;;15960:9;;15941:28;:::i;:::-;;;;-1:-1:-1;;15899:85:1;-1:-1:-1;;;;;16001:16:1;;;15997:81;;-1:-1:-1;;;;;16037:13:1;;;;;;:9;:13;;;;;:26;;16054:9;;16037:13;:26;;16054:9;;16037:26;:::i;:::-;;;;-1:-1:-1;;15698:396:1;;;;:::o;8460:309::-;8584:18;8590:2;8594:7;8584:5;:18::i;:::-;8633:53;8664:1;8668:2;8672:7;8681:4;8633:22;:53::i;:::-;8612:150;;;;-1:-1:-1;;;8612:150:1;;;;;;;:::i;14151:831::-;14300:4;-1:-1:-1;;;;;14320:13:1;;1465:19:5;:23;14316:660:1;;14355:71;;-1:-1:-1;;;14355:71:1;;-1:-1:-1;;;;;14355:36:1;;;;;:71;;719:10:6;;14406:4:1;;14412:7;;14421:4;;14355:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14355:71:1;;;;;;;;-1:-1:-1;;14355:71:1;;;;;;;;;;;;:::i;:::-;;;14351:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14593:6;:13;14610:1;14593:18;14589:321;;14635:60;;-1:-1:-1;;;14635:60:1;;;;;;;:::i;14589:321::-;14862:6;14856:13;14847:6;14843:2;14839:15;14832:38;14351:573;-1:-1:-1;;;;;;14476:51:1;-1:-1:-1;;;14476:51:1;;-1:-1:-1;14469:58:1;;14316:660;-1:-1:-1;14961:4:1;14151:831;;;;;;:::o;9889:890:11:-;9942:7;;-1:-1:-1;;;10017:15:11;;10013:99;;-1:-1:-1;;;10052:15:11;;;-1:-1:-1;10095:2:11;10085:12;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;-1:-1:-1;10207:2:11;10197:12;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;-1:-1:-1;10319:2:11;10309:12;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;-1:-1:-1;10429:1:11;10419:11;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;-1:-1:-1;10538:1:11;10528:11;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;-1:-1:-1;10647:1:11;10637:11;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;10766:6;9889:890;-1:-1:-1;;9889:890:11:o;9091:920:1:-;-1:-1:-1;;;;;9170:16:1;;9162:61;;;;-1:-1:-1;;;9162:61:1;;20553:2:13;9162:61:1;;;20535:21:13;;;20572:18;;;20565:30;20631:34;20611:18;;;20604:62;20683:18;;9162:61:1;20351:356:13;9162:61:1;9242:16;9250:7;9242;:16::i;:::-;9241:17;9233:58;;;;-1:-1:-1;;;9233:58:1;;20914:2:13;9233:58:1;;;20896:21:13;20953:2;20933:18;;;20926:30;20992;20972:18;;;20965:58;21040:18;;9233:58:1;20712:352:13;9233:58:1;9302:48;9331:1;9335:2;9339:7;9348:1;9302:20;:48::i;:::-;9446:16;9454:7;9446;:16::i;:::-;9445:17;9437:58;;;;-1:-1:-1;;;9437:58:1;;20914:2:13;9437:58:1;;;20896:21:13;20953:2;20933:18;;;20926:30;20992;20972:18;;;20965:58;21040:18;;9437:58:1;20712:352:13;9437:58:1;-1:-1:-1;;;;;9837:13:1;;;;;;:9;:13;;;;;;;;:18;;9854:1;9837:18;;;9876:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9876:21:1;;;;;9913:33;9884:7;;9837:13;;9913:33;;9837:13;;9913:33;4169:153;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:13;-1:-1:-1;;;;;;88:32:13;;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;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:13;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:13;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:13:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:13;;1365:180;-1:-1:-1;1365:180:13:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:13;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:13:o;2195:367::-;2258:8;2268:6;2322:3;2315:4;2307:6;2303:17;2299:27;2289:55;;2340:1;2337;2330:12;2289:55;-1:-1:-1;2363:20:13;;2406:18;2395:30;;2392:50;;;2438:1;2435;2428:12;2392:50;2475:4;2467:6;2463:17;2451:29;;2535:3;2528:4;2518:6;2515:1;2511:14;2503:6;2499:27;2495:38;2492:47;2489:67;;;2552:1;2549;2542:12;2489:67;2195:367;;;;;:::o;2567:437::-;2653:6;2661;2714:2;2702:9;2693:7;2689:23;2685:32;2682:52;;;2730:1;2727;2720:12;2682:52;2770:9;2757:23;2803:18;2795:6;2792:30;2789:50;;;2835:1;2832;2825:12;2789:50;2874:70;2936:7;2927:6;2916:9;2912:22;2874:70;:::i;:::-;2963:8;;2848:96;;-1:-1:-1;2567:437:13;-1:-1:-1;;;;2567:437:13:o;3009:328::-;3086:6;3094;3102;3155:2;3143:9;3134:7;3130:23;3126:32;3123:52;;;3171:1;3168;3161:12;3123:52;3194:29;3213:9;3194:29;:::i;:::-;3184:39;;3242:38;3276:2;3265:9;3261:18;3242:38;:::i;:::-;3232:48;;3327:2;3316:9;3312:18;3299:32;3289:42;;3009:328;;;;;:::o;3342:160::-;3407:20;;3463:13;;3456:21;3446:32;;3436:60;;3492:1;3489;3482:12;3507:180;3563:6;3616:2;3604:9;3595:7;3591:23;3587:32;3584:52;;;3632:1;3629;3622:12;3584:52;3655:26;3671:9;3655:26;:::i;3692:186::-;3751:6;3804:2;3792:9;3783:7;3779:23;3775:32;3772:52;;;3820:1;3817;3810:12;3772:52;3843:29;3862:9;3843:29;:::i;4065:592::-;4136:6;4144;4197:2;4185:9;4176:7;4172:23;4168:32;4165:52;;;4213:1;4210;4203:12;4165:52;4253:9;4240:23;4282:18;4323:2;4315:6;4312:14;4309:34;;;4339:1;4336;4329:12;4309:34;4377:6;4366:9;4362:22;4352:32;;4422:7;4415:4;4411:2;4407:13;4403:27;4393:55;;4444:1;4441;4434:12;4393:55;4484:2;4471:16;4510:2;4502:6;4499:14;4496:34;;;4526:1;4523;4516:12;4496:34;4571:7;4566:2;4557:6;4553:2;4549:15;4545:24;4542:37;4539:57;;;4592:1;4589;4582:12;4539:57;4623:2;4615:11;;;;;4645:6;;-1:-1:-1;4065:592:13;;-1:-1:-1;;;;4065:592:13:o;4662:254::-;4727:6;4735;4788:2;4776:9;4767:7;4763:23;4759:32;4756:52;;;4804:1;4801;4794:12;4756:52;4827:29;4846:9;4827:29;:::i;:::-;4817:39;;4875:35;4906:2;4895:9;4891:18;4875:35;:::i;:::-;4865:45;;4662:254;;;;;:::o;4921:127::-;4982:10;4977:3;4973:20;4970:1;4963:31;5013:4;5010:1;5003:15;5037:4;5034:1;5027:15;5053:1138;5148:6;5156;5164;5172;5225:3;5213:9;5204:7;5200:23;5196:33;5193:53;;;5242:1;5239;5232:12;5193:53;5265:29;5284:9;5265:29;:::i;:::-;5255:39;;5313:38;5347:2;5336:9;5332:18;5313:38;:::i;:::-;5303:48;;5398:2;5387:9;5383:18;5370:32;5360:42;;5453:2;5442:9;5438:18;5425:32;5476:18;5517:2;5509:6;5506:14;5503:34;;;5533:1;5530;5523:12;5503:34;5571:6;5560:9;5556:22;5546:32;;5616:7;5609:4;5605:2;5601:13;5597:27;5587:55;;5638:1;5635;5628:12;5587:55;5674:2;5661:16;5696:2;5692;5689:10;5686:36;;;5702:18;;:::i;:::-;5777:2;5771:9;5745:2;5831:13;;-1:-1:-1;;5827:22:13;;;5851:2;5823:31;5819:40;5807:53;;;5875:18;;;5895:22;;;5872:46;5869:72;;;5921:18;;:::i;:::-;5961:10;5957:2;5950:22;5996:2;5988:6;5981:18;6036:7;6031:2;6026;6022;6018:11;6014:20;6011:33;6008:53;;;6057:1;6054;6047:12;6008:53;6113:2;6108;6104;6100:11;6095:2;6087:6;6083:15;6070:46;6158:1;6153:2;6148;6140:6;6136:15;6132:24;6125:35;6179:6;6169:16;;;;;;;5053:1138;;;;;;;:::o;6638:260::-;6706:6;6714;6767:2;6755:9;6746:7;6742:23;6738:32;6735:52;;;6783:1;6780;6773:12;6735:52;6806:29;6825:9;6806:29;:::i;:::-;6796:39;;6854:38;6888:2;6877:9;6873:18;6854:38;:::i;6903:380::-;6982:1;6978:12;;;;7025;;;7046:61;;7100:4;7092:6;7088:17;7078:27;;7046:61;7153:2;7145:6;7142:14;7122:18;7119:38;7116:161;;7199:10;7194:3;7190:20;7187:1;7180:31;7234:4;7231:1;7224:15;7262:4;7259:1;7252:15;7116:161;;6903:380;;;:::o;8120:127::-;8181:10;8176:3;8172:20;8169:1;8162:31;8212:4;8209:1;8202:15;8236:4;8233:1;8226:15;8603:413;8805:2;8787:21;;;8844:2;8824:18;;;8817:30;8883:34;8878:2;8863:18;;8856:62;-1:-1:-1;;;8949:2:13;8934:18;;8927:47;9006:3;8991:19;;8603:413::o;9367:345::-;9569:2;9551:21;;;9608:2;9588:18;;;9581:30;-1:-1:-1;;;9642:2:13;9627:18;;9620:51;9703:2;9688:18;;9367:345::o;9717:127::-;9778:10;9773:3;9769:20;9766:1;9759:31;9809:4;9806:1;9799:15;9833:4;9830:1;9823:15;9849:128;9889:3;9920:1;9916:6;9913:1;9910:13;9907:39;;;9926:18;;:::i;:::-;-1:-1:-1;9962:9:13;;9849:128::o;10330:409::-;10532:2;10514:21;;;10571:2;10551:18;;;10544:30;10610:34;10605:2;10590:18;;10583:62;-1:-1:-1;;;10676:2:13;10661:18;;10654:43;10729:3;10714:19;;10330:409::o;11347:345::-;11549:2;11531:21;;;11588:2;11568:18;;;11561:30;-1:-1:-1;;;11622:2:13;11607:18;;11600:51;11683:2;11668:18;;11347:345::o;11697:407::-;11899:2;11881:21;;;11938:2;11918:18;;;11911:30;11977:34;11972:2;11957:18;;11950:62;-1:-1:-1;;;12043:2:13;12028:18;;12021:41;12094:3;12079:19;;11697:407::o;15075:125::-;15115:4;15143:1;15140;15137:8;15134:34;;;15148:18;;:::i;:::-;-1:-1:-1;15185:9:13;;15075:125::o;15739:185::-;15781:3;15819:5;15813:12;15834:52;15879:6;15874:3;15867:4;15860:5;15856:16;15834:52;:::i;:::-;15902:16;;;;;15739:185;-1:-1:-1;;15739:185:13:o;15929:1174::-;16105:3;16134:1;16167:6;16161:13;16197:3;16219:1;16247:9;16243:2;16239:18;16229:28;;16307:2;16296:9;16292:18;16329;16319:61;;16373:4;16365:6;16361:17;16351:27;;16319:61;16399:2;16447;16439:6;16436:14;16416:18;16413:38;16410:165;;-1:-1:-1;;;16474:33:13;;16530:4;16527:1;16520:15;16560:4;16481:3;16548:17;16410:165;16591:18;16618:104;;;;16736:1;16731:320;;;;16584:467;;16618:104;-1:-1:-1;;16651:24:13;;16639:37;;16696:16;;;;-1:-1:-1;16618:104:13;;16731:320;15686:1;15679:14;;;15723:4;15710:18;;16826:1;16840:165;16854:6;16851:1;16848:13;16840:165;;;16932:14;;16919:11;;;16912:35;16975:16;;;;16869:10;;16840:165;;;16844:3;;17034:6;17029:3;17025:16;17018:23;;16584:467;;;;;;;17067:30;17093:3;17085:6;17067:30;:::i;:::-;17060:37;15929:1174;-1:-1:-1;;;;;15929:1174:13:o;17876:401::-;18078:2;18060:21;;;18117:2;18097:18;;;18090:30;18156:34;18151:2;18136:18;;18129:62;-1:-1:-1;;;18222:2:13;18207:18;;18200:35;18267:3;18252:19;;17876:401::o;19041:414::-;19243:2;19225:21;;;19282:2;19262:18;;;19255:30;19321:34;19316:2;19301:18;;19294:62;-1:-1:-1;;;19387:2:13;19372:18;;19365:48;19445:3;19430:19;;19041:414::o;19592:500::-;-1:-1:-1;;;;;19861:15:13;;;19843:34;;19913:15;;19908:2;19893:18;;19886:43;19960:2;19945:18;;19938:34;;;20008:3;20003:2;19988:18;;19981:31;;;19786:4;;20029:57;;20066:19;;20058:6;20029:57;:::i;:::-;20021:65;19592:500;-1:-1:-1;;;;;;19592:500:13:o;20097:249::-;20166:6;20219:2;20207:9;20198:7;20194:23;20190:32;20187:52;;;20235:1;20232;20225:12;20187:52;20267:9;20261:16;20286:30;20310:5;20286:30;:::i

Swarm Source

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