ETH Price: $3,407.87 (-0.24%)
Gas: 8 Gwei

Token

Dingbots Genesis (DINGBOTS)
 

Overview

Max Total Supply

787 DINGBOTS

Holders

277

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DINGBOTS
0x13Ed9590e7b7f29FB65a82057AC77b387F4Ff531
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:
Dingbots

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 12: Dingbots.sol
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%(*,,,*(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/                                 (@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@                                               @@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@%                                                       &@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@                                                               @@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@                                                                     @@@@@@@@@@@@@@@
// @@@@@@@@@@@@@%                                                                         @@@@@@@@@@@@@
// @@@@@@@@@@@,                                                                             #@@@@@@@@@@
// @@@@@@@@@@             &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#             @@@@@@@@@
// @@@@@@@@           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#           @@@@@@@
// @@@@@@@          &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@           @@@@@@
// @@@@@@          /@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@           @@@@@
// @@@@@           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@           @@@@
// @@@@            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@           ,@@@
// @@@@            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@            @@@
// @@@@            @@@@@@@@,                       @@@@@                       #@@@@@@@@            @@@
// @@@@           /@@@@@@@@                        @@@@@                        @@@@@@@@            @@@
// @@@@           @@@@@@@@@@@@@@@            @@@@@@@@@@@@@@@@@           .@@@@@@@@@@@@@@*           @@@
// @@@@           @@@@@@@@@@@@@@@            @@@@@@@@@@@@@@@@@            @@@@@@@@@@@@@@@          (@@@
// @@@@@          %@@@@@@@@@@@@@@@          @@@@@@@@@@@@@@@@@@@         (@@@@@@@@@@@@@@@           @@@@
// @@@@@@            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@            @@@@@
// @@@@@@@                    ./&@@@@@@@@@@@@@@@%         &@@@@@@@@@@@@@@@&/                    #@@@@@@
// @@@@@@@@@                                                                                   @@@@@@@@
// @@@@@@@@@@@                                                                               @@@@@@@@@@
// @@@@@@@@@@@@@@                                                                         @@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@                                                                  /@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@                                                         @@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@(                                          ,@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//
//                       ┌───────────────────────────────────────────────────────┐
//                       │  After order 66 was deemed defective by Hasbruh Toys, │
//                       │ the batch was hard forked and 1555 DingBots were born │
//                       │                                                       │
//                       │  Rebuilt by an ethereum workforce of senior citizens  │
//                       │ and parts sourced by local garage sales… they may not │
//                       │     be the brightest bunch but damn they’re cute!     │
//                       └───────────────────────────────────────────────────────┘
//
//                                     ┌──────────────────────────┐
//                                     │ https://dingbotsnft.com/ │
//                                     └──────────────────────────┘

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "ERC721.sol";
import "Ownable.sol";
import "Strings.sol";
import "ReentrancyGuard.sol";

interface IERC20 {function transfer(address recipient, uint256 amount) external returns (bool);}

contract Dingbots is ERC721, Ownable, ReentrancyGuard {
    using Strings for uint256;

    //---// Constant Variables //---//
    address private immutable T1 = 0x34567d53dd448feA28887fb5F76F80F544570d82;
    address private immutable T2 = 0xf9768dDf67125Cf3EBa2C8C73F59ed8f141F96D0;
    enum SalePhase {INIT, PUBLIC, CLOSED}
    /// @notice Price of one Dingbot in wei
    uint256 public constant PUBLIC_PRICE = 0.055 ether;
    /// @notice Mints allowed per address in the public sale
    uint256 public constant MINTS_PER_PUBLIC = 20;

    //---// State Variables //---//
    /// @notice Current sale phase
    /// `0` Sale has not yet begun
    /// `1` Public sale
    /// `2` Sale closed
    SalePhase public salePhase;
    /// @notice Amount of Dingbots minted in the public sale
    uint256 public publicCounter;
    /// @notice Amount of Dingbots minted from the reserved set
    uint256 public reservedCounter;
    /// @notice Highest Token ID
    uint256 public maxSupply = 1504;
    /// @notice Token URI prefix
    string public prefixURI;
    /// @notice How many tokens an address has minted in the public sale
    mapping (address => uint256) public mintCountPublic;

    constructor() ERC721("Dingbots Genesis", "DINGBOTS") {}

    //---// Override functions //---//
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return bytes(prefixURI).length > 0 ? string(abi.encodePacked(prefixURI, tokenId.toString(), ".json")) : "";
    }

    //---// Owner functions //---//
    /// @notice Set the token URI prefix, available if the URI has not yet been locked
    /// @param _newPrefixURI The new URI prefix
    function setPrefixURI(string memory _newPrefixURI) external onlyOwner {
        require(salePhase != SalePhase.CLOSED);
        prefixURI = _newPrefixURI;
    }

    /// @notice Set maximum mintable
    function setMaximumSupply(uint256 _newMax) external onlyOwner {
        require(salePhase != SalePhase.CLOSED);
        require(_newMax <= 1504);
        maxSupply = _newMax;
    }

    /// @notice Airdrop Dingbots in order to previous holders
    /// @param _tos the addresses to mint to
    function airdropToHolders(address[] calldata _tos) external onlyOwner {
        require(salePhase == SalePhase.INIT);
        for(uint i = 0; i < _tos.length; i++) {
            publicCounter += 1;
            _safeMint(_tos[i], publicCounter);
        }
    }

    /// @notice Increment the phase of the sale forward - check `salePhase` view function for current phase
    /// `0` Sale has not yet begun
    /// `1` Public sale
    /// `2` Closed
    function advanceSalePhase() external onlyOwner {
        salePhase = SalePhase(uint(salePhase) + 1);
    }

    /// @notice Mint a token from the reserved set to a specified address
    /// @param _tos The addresses to mint to
    /// @param _tokenIds The tokenIds to mint to the addresses
    function reservedMint(address[] calldata _tos, uint256[] calldata _tokenIds) external onlyOwner {
        require(_tos.length == _tokenIds.length, "Array sizes mismatched");
        for(uint i = 0; i < _tos.length; i++) {
            require(_tokenIds[i] <= 1555 && _tokenIds[i] >= 1505, "Dingbots: Not in reserved set");
            _safeMint(_tos[i], _tokenIds[i]);
        }
        reservedCounter += _tos.length;
    }

    /// @notice Withdraw sale ETH
    function withdrawETHTeam() external onlyOwner {
        uint256 _balance = address(this).balance;
        uint256 _t1 = _balance * 15 / 100; // 15%
        uint256 _t2 = _balance - _t1; // 85%
        payable(T1).transfer(_t1);
        payable(T2).transfer(_t2);
    }

    /// @notice Recover an ERC20 token mistakenly sent to this contract
    /// @param _t The address of the ERC20 token
    /// @param _r The recipient of the ERC20 token recovery
    /// @param _a The amount of tokens to recover
    function recoverERC20(IERC20 _t, address _r, uint256 _a) external onlyOwner {
        _t.transfer(_r, _a);
    }

    //---// Public functions //---//
    function publicMint(uint256 _amount) external payable nonReentrant {
        require(salePhase == SalePhase.PUBLIC, "Dingbots: Public sale phase not running");
        require(_amount > 0 && mintCountPublic[msg.sender] + _amount <= MINTS_PER_PUBLIC, "Dingbots: Bad amount");
        require(publicCounter + _amount <= maxSupply, "Dingbots: Exceeds max supply");
        require(msg.value >= _amount * PUBLIC_PRICE, "Dingbots: Bad price");
        mintCountPublic[msg.sender] += _amount;
        for(uint i = 0; i < _amount; i++) {
            publicCounter += 1;
            _safeMint(msg.sender, publicCounter);
        }
    }

    //---// View functions //---//
    function contractURI() public view returns (string memory) {
        return bytes(prefixURI).length > 0 ? string(abi.encodePacked(prefixURI, "dingbots.json")) : "";
    }

    function totalSupply() public view returns(uint256) {
        return publicCounter + reservedCounter;
    }
}

File 1 of 12: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 12: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 12: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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;
    }
}

File 5 of 12: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "IERC721.sol";
import "IERC721Receiver.sol";
import "IERC721Metadata.sol";
import "Address.sol";
import "Context.sol";
import "Strings.sol";
import "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: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 overriden 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        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: transfer caller is not owner nor 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: transfer caller is not owner nor 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 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 _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

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

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {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 a {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 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 {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

File 6 of 12: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 7 of 12: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

File 8 of 12: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 12: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 12: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 11 of 12: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 12 of 12: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"inputs":[],"name":"MINTS_PER_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"advanceSalePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tos","type":"address[]"}],"name":"airdropToHolders","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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":[{"internalType":"address","name":"","type":"address"}],"name":"mintCountPublic","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_t","type":"address"},{"internalType":"address","name":"_r","type":"address"},{"internalType":"uint256","name":"_a","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"reservedMint","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":"salePhase","outputs":[{"internalType":"enum Dingbots.SalePhase","name":"","type":"uint8"}],"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":"uint256","name":"_newMax","type":"uint256"}],"name":"setMaximumSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newPrefixURI","type":"string"}],"name":"setPrefixURI","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETHTeam","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040527f34567d53dd448fea28887fb5f76f80f544570d820000000000000000000000006080527ff9768ddf67125cf3eba2c8c73f59ed8f141f96d000000000000000000000000060a0526105e0600b553480156200005f57600080fd5b50604080518082018252601081526f44696e67626f74732047656e6573697360801b60208083019182528351808501909452600884526744494e47424f545360c01b908401528151919291620000b8916000916200014c565b508051620000ce9060019060208401906200014c565b505050620000eb620000e5620000f660201b60201c565b620000fa565b60016007556200022f565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015a90620001f2565b90600052602060002090601f0160209004810192826200017e5760008555620001c9565b82601f106200019957805160ff1916838001178555620001c9565b82800160010185558215620001c9579182015b82811115620001c9578251825591602001919060010190620001ac565b50620001d7929150620001db565b5090565b5b80821115620001d75760008155600101620001dc565b600181811c908216806200020757607f821691505b602082108114156200022957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160601c61250d6200025b60003960006111da01526000611183015261250d6000f3fe6080604052600436106101f95760003560e01c80638da5cb5b1161010d578063bb62baec116100a0578063e4f2487a1161006f578063e4f2487a1461056b578063e8a3d48514610592578063e985e9c5146105a7578063f2fde38b146105f0578063fbc328321461061057600080fd5b8063bb62baec14610500578063c87b56dd14610520578063d5abeb0114610540578063e34427721461055657600080fd5b8063a22cb465116100dc578063a22cb4651461048a578063a8fa270d146104aa578063b2c94ee6146104c0578063b88d4fde146104e057600080fd5b80638da5cb5b1461042d5780638dae12471461044b57806395d89b4114610460578063a0c540781461047557600080fd5b80632db115441161019057806370a082311161015f57806370a0823114610396578063715018a6146103b657806376ebb694146103cb578063780ed45a146103f85780638cb2c5d11461040d57600080fd5b80632db115441461032857806342842e0e1461033b578063611f3f101461035b5780636352211e1461037657600080fd5b8063095ea7b3116101cc578063095ea7b3146102b15780631171bda9146102d357806318160ddd146102f357806323b872dd1461030857600080fd5b806301ffc9a7146101fe57806304285a0c1461023357806306fdde0314610257578063081812fc14610279575b600080fd5b34801561020a57600080fd5b5061021e610219366004612028565b610630565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610249600a5481565b60405190815260200161022a565b34801561026357600080fd5b5061026c610682565b60405161022a919061224d565b34801561028557600080fd5b506102996102943660046120ab565b610714565b6040516001600160a01b03909116815260200161022a565b3480156102bd57600080fd5b506102d16102cc366004611f31565b6107ae565b005b3480156102df57600080fd5b506102d16102ee366004611e42565b6108c4565b3480156102ff57600080fd5b50610249610976565b34801561031457600080fd5b506102d1610323366004611e42565b61098d565b6102d16103363660046120ab565b6109be565b34801561034757600080fd5b506102d1610356366004611e42565b610c21565b34801561036757600080fd5b5061024966c3663566a5800081565b34801561038257600080fd5b506102996103913660046120ab565b610c3c565b3480156103a257600080fd5b506102496103b1366004611de5565b610cb3565b3480156103c257600080fd5b506102d1610d3a565b3480156103d757600080fd5b506102496103e6366004611de5565b600d6020526000908152604090205481565b34801561040457600080fd5b50610249601481565b34801561041957600080fd5b506102d16104283660046120ab565b610d70565b34801561043957600080fd5b506006546001600160a01b0316610299565b34801561045757600080fd5b506102d1610dd2565b34801561046c57600080fd5b5061026c610e52565b34801561048157600080fd5b5061026c610e61565b34801561049657600080fd5b506102d16104a5366004611f03565b610eef565b3480156104b657600080fd5b5061024960095481565b3480156104cc57600080fd5b506102d16104db366004612062565b610efe565b3480156104ec57600080fd5b506102d16104fb366004611e83565b610f5f565b34801561050c57600080fd5b506102d161051b366004611f5d565b610f91565b34801561052c57600080fd5b5061026c61053b3660046120ab565b611046565b34801561054c57600080fd5b50610249600b5481565b34801561056257600080fd5b506102d1611121565b34801561057757600080fd5b506008546105859060ff1681565b60405161022a9190612225565b34801561059e57600080fd5b5061026c611223565b3480156105b357600080fd5b5061021e6105c2366004611e09565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105fc57600080fd5b506102d161060b366004611de5565b611274565b34801561061c57600080fd5b506102d161062b366004611f9f565b61130f565b60006001600160e01b031982166380ac58cd60e01b148061066157506001600160e01b03198216635b5e139f60e01b145b8061067c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610691906123c6565b80601f01602080910402602001604051908101604052809291908181526020018280546106bd906123c6565b801561070a5780601f106106df5761010080835404028352916020019161070a565b820191906000526020600020905b8154815290600101906020018083116106ed57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107925760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107b982610c3c565b9050806001600160a01b0316836001600160a01b031614156108275760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610789565b336001600160a01b0382161480610843575061084381336105c2565b6108b55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610789565b6108bf8383611497565b505050565b6006546001600160a01b031633146108ee5760405162461bcd60e51b8152600401610789906122b2565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561093857600080fd5b505af115801561094c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610970919061200b565b50505050565b6000600a546009546109889190612338565b905090565b6109973382611505565b6109b35760405162461bcd60e51b8152600401610789906122e7565b6108bf8383836115fc565b60026007541415610a115760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610789565b6002600755600160085460ff166002811115610a2f57610a2f61245c565b14610a8c5760405162461bcd60e51b815260206004820152602760248201527f44696e67626f74733a205075626c69632073616c65207068617365206e6f742060448201526672756e6e696e6760c81b6064820152608401610789565b600081118015610ab85750336000908152600d6020526040902054601490610ab5908390612338565b11155b610afb5760405162461bcd60e51b8152602060048201526014602482015273111a5b99d89bdd1cce8810985908185b5bdd5b9d60621b6044820152606401610789565b600b5481600954610b0c9190612338565b1115610b5a5760405162461bcd60e51b815260206004820152601c60248201527f44696e67626f74733a2045786365656473206d617820737570706c79000000006044820152606401610789565b610b6b66c3663566a5800082612364565b341015610bb05760405162461bcd60e51b815260206004820152601360248201527244696e67626f74733a2042616420707269636560681b6044820152606401610789565b336000908152600d602052604081208054839290610bcf908490612338565b90915550600090505b81811015610c1857600160096000828254610bf39190612338565b92505081905550610c063360095461179c565b80610c1081612401565b915050610bd8565b50506001600755565b6108bf83838360405180602001604052806000815250610f5f565b6000818152600260205260408120546001600160a01b03168061067c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610789565b60006001600160a01b038216610d1e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610789565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610d645760405162461bcd60e51b8152600401610789906122b2565b610d6e60006117b6565b565b6006546001600160a01b03163314610d9a5760405162461bcd60e51b8152600401610789906122b2565b600260085460ff166002811115610db357610db361245c565b1415610dbe57600080fd5b6105e0811115610dcd57600080fd5b600b55565b6006546001600160a01b03163314610dfc5760405162461bcd60e51b8152600401610789906122b2565b60085460ff166002811115610e1357610e1361245c565b610e1e906001612338565b6002811115610e2f57610e2f61245c565b6008805460ff19166001836002811115610e4b57610e4b61245c565b0217905550565b606060018054610691906123c6565b600c8054610e6e906123c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a906123c6565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505081565b610efa338383611808565b5050565b6006546001600160a01b03163314610f285760405162461bcd60e51b8152600401610789906122b2565b600260085460ff166002811115610f4157610f4161245c565b1415610f4c57600080fd5b8051610efa90600c906020840190611c8a565b610f693383611505565b610f855760405162461bcd60e51b8152600401610789906122e7565b610970848484846118d7565b6006546001600160a01b03163314610fbb5760405162461bcd60e51b8152600401610789906122b2565b600060085460ff166002811115610fd457610fd461245c565b14610fde57600080fd5b60005b818110156108bf57600160096000828254610ffc9190612338565b90915550611034905083838381811061101757611017612472565b905060200201602081019061102c9190611de5565b60095461179c565b8061103e81612401565b915050610fe1565b6000818152600260205260409020546060906001600160a01b03166110c55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610789565b6000600c80546110d4906123c6565b9050116110f0576040518060200160405280600081525061067c565b600c6110fb8361190a565b60405160200161110c92919061218a565b60405160208183030381529060405292915050565b6006546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610789906122b2565b476000606461115b83600f612364565b6111659190612350565b905060006111738284612383565b6040519091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083156108fc029084906000818181858888f193505050501580156111cc573d6000803e3d6000fd5b506040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169082156108fc029083906000818181858888f19350505050158015610970573d6000803e3d6000fd5b60606000600c8054611234906123c6565b90501161124e575060408051602081019091526000815290565b600c60405160200161126091906121bf565b604051602081830303815290604052905090565b6006546001600160a01b0316331461129e5760405162461bcd60e51b8152600401610789906122b2565b6001600160a01b0381166113035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610789565b61130c816117b6565b50565b6006546001600160a01b031633146113395760405162461bcd60e51b8152600401610789906122b2565b8281146113815760405162461bcd60e51b8152602060048201526016602482015275105c9c985e481cda5e995cc81b5a5cdb585d18da195960521b6044820152606401610789565b60005b83811015611476576106138383838181106113a1576113a1612472565b90506020020135111580156113d057506105e18383838181106113c6576113c6612472565b9050602002013510155b61141c5760405162461bcd60e51b815260206004820152601d60248201527f44696e67626f74733a204e6f7420696e207265736572766564207365740000006044820152606401610789565b61146485858381811061143157611431612472565b90506020020160208101906114469190611de5565b84848481811061145857611458612472565b9050602002013561179c565b8061146e81612401565b915050611384565b5083839050600a600082825461148c9190612338565b909155505050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114cc82610c3c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661157e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610789565b600061158983610c3c565b9050806001600160a01b0316846001600160a01b031614806115c45750836001600160a01b03166115b984610714565b6001600160a01b0316145b806115f457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661160f82610c3c565b6001600160a01b0316146116775760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610789565b6001600160a01b0382166116d95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610789565b6116e4600082611497565b6001600160a01b038316600090815260036020526040812080546001929061170d908490612383565b90915550506001600160a01b038216600090815260036020526040812080546001929061173b908490612338565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610efa828260405180602001604052806000815250611a08565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561186a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610789565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118e28484846115fc565b6118ee84848484611a3b565b6109705760405162461bcd60e51b815260040161078990612260565b60608161192e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611958578061194281612401565b91506119519050600a83612350565b9150611932565b60008167ffffffffffffffff81111561197357611973612488565b6040519080825280601f01601f19166020018201604052801561199d576020820181803683370190505b5090505b84156115f4576119b2600183612383565b91506119bf600a8661241c565b6119ca906030612338565b60f81b8183815181106119df576119df612472565b60200101906001600160f81b031916908160001a905350611a01600a86612350565b94506119a1565b611a128383611b48565b611a1f6000848484611a3b565b6108bf5760405162461bcd60e51b815260040161078990612260565b60006001600160a01b0384163b15611b3d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a7f9033908990889088906004016121e8565b602060405180830381600087803b158015611a9957600080fd5b505af1925050508015611ac9575060408051601f3d908101601f19168201909252611ac691810190612045565b60015b611b23573d808015611af7576040519150601f19603f3d011682016040523d82523d6000602084013e611afc565b606091505b508051611b1b5760405162461bcd60e51b815260040161078990612260565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115f4565b506001949350505050565b6001600160a01b038216611b9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610789565b6000818152600260205260409020546001600160a01b031615611c035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610789565b6001600160a01b0382166000908152600360205260408120805460019290611c2c908490612338565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611c96906123c6565b90600052602060002090601f016020900481019282611cb85760008555611cfe565b82601f10611cd157805160ff1916838001178555611cfe565b82800160010185558215611cfe579182015b82811115611cfe578251825591602001919060010190611ce3565b50611d0a929150611d0e565b5090565b5b80821115611d0a5760008155600101611d0f565b600067ffffffffffffffff80841115611d3e57611d3e612488565b604051601f8501601f19908116603f01168101908282118183101715611d6657611d66612488565b81604052809350858152868686011115611d7f57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112611dab57600080fd5b50813567ffffffffffffffff811115611dc357600080fd5b6020830191508360208260051b8501011115611dde57600080fd5b9250929050565b600060208284031215611df757600080fd5b8135611e028161249e565b9392505050565b60008060408385031215611e1c57600080fd5b8235611e278161249e565b91506020830135611e378161249e565b809150509250929050565b600080600060608486031215611e5757600080fd5b8335611e628161249e565b92506020840135611e728161249e565b929592945050506040919091013590565b60008060008060808587031215611e9957600080fd5b8435611ea48161249e565b93506020850135611eb48161249e565b925060408501359150606085013567ffffffffffffffff811115611ed757600080fd5b8501601f81018713611ee857600080fd5b611ef787823560208401611d23565b91505092959194509250565b60008060408385031215611f1657600080fd5b8235611f218161249e565b91506020830135611e37816124b3565b60008060408385031215611f4457600080fd5b8235611f4f8161249e565b946020939093013593505050565b60008060208385031215611f7057600080fd5b823567ffffffffffffffff811115611f8757600080fd5b611f9385828601611d99565b90969095509350505050565b60008060008060408587031215611fb557600080fd5b843567ffffffffffffffff80821115611fcd57600080fd5b611fd988838901611d99565b90965094506020870135915080821115611ff257600080fd5b50611fff87828801611d99565b95989497509550505050565b60006020828403121561201d57600080fd5b8151611e02816124b3565b60006020828403121561203a57600080fd5b8135611e02816124c1565b60006020828403121561205757600080fd5b8151611e02816124c1565b60006020828403121561207457600080fd5b813567ffffffffffffffff81111561208b57600080fd5b8201601f8101841361209c57600080fd5b6115f484823560208401611d23565b6000602082840312156120bd57600080fd5b5035919050565b600081518084526120dc81602086016020860161239a565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061210a57607f831692505b602080841082141561212c57634e487b7160e01b600052602260045260246000fd5b81801561214057600181146121515761217e565b60ff1986168952848901965061217e565b60008881526020902060005b868110156121765781548b82015290850190830161215d565b505084890196505b50505050505092915050565b600061219682856120f0565b83516121a681836020880161239a565b64173539b7b760d91b9101908152600501949350505050565b60006121cb82846120f0565b6c3234b733b137ba39973539b7b760991b8152600d019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221b908301846120c4565b9695505050505050565b602081016003831061224757634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611e0260208301846120c4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561234b5761234b612430565b500190565b60008261235f5761235f612446565b500490565b600081600019048311821515161561237e5761237e612430565b500290565b60008282101561239557612395612430565b500390565b60005b838110156123b557818101518382015260200161239d565b838111156109705750506000910152565b600181811c908216806123da57607f821691505b602082108114156123fb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561241557612415612430565b5060010190565b60008261242b5761242b612446565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461130c57600080fd5b801515811461130c57600080fd5b6001600160e01b03198116811461130c57600080fdfea2646970667358221220c1c5259e23327b80bf6d58804432d0102d1e3db5e80159a36ea3a028fadf10ef64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80638da5cb5b1161010d578063bb62baec116100a0578063e4f2487a1161006f578063e4f2487a1461056b578063e8a3d48514610592578063e985e9c5146105a7578063f2fde38b146105f0578063fbc328321461061057600080fd5b8063bb62baec14610500578063c87b56dd14610520578063d5abeb0114610540578063e34427721461055657600080fd5b8063a22cb465116100dc578063a22cb4651461048a578063a8fa270d146104aa578063b2c94ee6146104c0578063b88d4fde146104e057600080fd5b80638da5cb5b1461042d5780638dae12471461044b57806395d89b4114610460578063a0c540781461047557600080fd5b80632db115441161019057806370a082311161015f57806370a0823114610396578063715018a6146103b657806376ebb694146103cb578063780ed45a146103f85780638cb2c5d11461040d57600080fd5b80632db115441461032857806342842e0e1461033b578063611f3f101461035b5780636352211e1461037657600080fd5b8063095ea7b3116101cc578063095ea7b3146102b15780631171bda9146102d357806318160ddd146102f357806323b872dd1461030857600080fd5b806301ffc9a7146101fe57806304285a0c1461023357806306fdde0314610257578063081812fc14610279575b600080fd5b34801561020a57600080fd5b5061021e610219366004612028565b610630565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610249600a5481565b60405190815260200161022a565b34801561026357600080fd5b5061026c610682565b60405161022a919061224d565b34801561028557600080fd5b506102996102943660046120ab565b610714565b6040516001600160a01b03909116815260200161022a565b3480156102bd57600080fd5b506102d16102cc366004611f31565b6107ae565b005b3480156102df57600080fd5b506102d16102ee366004611e42565b6108c4565b3480156102ff57600080fd5b50610249610976565b34801561031457600080fd5b506102d1610323366004611e42565b61098d565b6102d16103363660046120ab565b6109be565b34801561034757600080fd5b506102d1610356366004611e42565b610c21565b34801561036757600080fd5b5061024966c3663566a5800081565b34801561038257600080fd5b506102996103913660046120ab565b610c3c565b3480156103a257600080fd5b506102496103b1366004611de5565b610cb3565b3480156103c257600080fd5b506102d1610d3a565b3480156103d757600080fd5b506102496103e6366004611de5565b600d6020526000908152604090205481565b34801561040457600080fd5b50610249601481565b34801561041957600080fd5b506102d16104283660046120ab565b610d70565b34801561043957600080fd5b506006546001600160a01b0316610299565b34801561045757600080fd5b506102d1610dd2565b34801561046c57600080fd5b5061026c610e52565b34801561048157600080fd5b5061026c610e61565b34801561049657600080fd5b506102d16104a5366004611f03565b610eef565b3480156104b657600080fd5b5061024960095481565b3480156104cc57600080fd5b506102d16104db366004612062565b610efe565b3480156104ec57600080fd5b506102d16104fb366004611e83565b610f5f565b34801561050c57600080fd5b506102d161051b366004611f5d565b610f91565b34801561052c57600080fd5b5061026c61053b3660046120ab565b611046565b34801561054c57600080fd5b50610249600b5481565b34801561056257600080fd5b506102d1611121565b34801561057757600080fd5b506008546105859060ff1681565b60405161022a9190612225565b34801561059e57600080fd5b5061026c611223565b3480156105b357600080fd5b5061021e6105c2366004611e09565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105fc57600080fd5b506102d161060b366004611de5565b611274565b34801561061c57600080fd5b506102d161062b366004611f9f565b61130f565b60006001600160e01b031982166380ac58cd60e01b148061066157506001600160e01b03198216635b5e139f60e01b145b8061067c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610691906123c6565b80601f01602080910402602001604051908101604052809291908181526020018280546106bd906123c6565b801561070a5780601f106106df5761010080835404028352916020019161070a565b820191906000526020600020905b8154815290600101906020018083116106ed57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107925760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107b982610c3c565b9050806001600160a01b0316836001600160a01b031614156108275760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610789565b336001600160a01b0382161480610843575061084381336105c2565b6108b55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610789565b6108bf8383611497565b505050565b6006546001600160a01b031633146108ee5760405162461bcd60e51b8152600401610789906122b2565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561093857600080fd5b505af115801561094c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610970919061200b565b50505050565b6000600a546009546109889190612338565b905090565b6109973382611505565b6109b35760405162461bcd60e51b8152600401610789906122e7565b6108bf8383836115fc565b60026007541415610a115760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610789565b6002600755600160085460ff166002811115610a2f57610a2f61245c565b14610a8c5760405162461bcd60e51b815260206004820152602760248201527f44696e67626f74733a205075626c69632073616c65207068617365206e6f742060448201526672756e6e696e6760c81b6064820152608401610789565b600081118015610ab85750336000908152600d6020526040902054601490610ab5908390612338565b11155b610afb5760405162461bcd60e51b8152602060048201526014602482015273111a5b99d89bdd1cce8810985908185b5bdd5b9d60621b6044820152606401610789565b600b5481600954610b0c9190612338565b1115610b5a5760405162461bcd60e51b815260206004820152601c60248201527f44696e67626f74733a2045786365656473206d617820737570706c79000000006044820152606401610789565b610b6b66c3663566a5800082612364565b341015610bb05760405162461bcd60e51b815260206004820152601360248201527244696e67626f74733a2042616420707269636560681b6044820152606401610789565b336000908152600d602052604081208054839290610bcf908490612338565b90915550600090505b81811015610c1857600160096000828254610bf39190612338565b92505081905550610c063360095461179c565b80610c1081612401565b915050610bd8565b50506001600755565b6108bf83838360405180602001604052806000815250610f5f565b6000818152600260205260408120546001600160a01b03168061067c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610789565b60006001600160a01b038216610d1e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610789565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610d645760405162461bcd60e51b8152600401610789906122b2565b610d6e60006117b6565b565b6006546001600160a01b03163314610d9a5760405162461bcd60e51b8152600401610789906122b2565b600260085460ff166002811115610db357610db361245c565b1415610dbe57600080fd5b6105e0811115610dcd57600080fd5b600b55565b6006546001600160a01b03163314610dfc5760405162461bcd60e51b8152600401610789906122b2565b60085460ff166002811115610e1357610e1361245c565b610e1e906001612338565b6002811115610e2f57610e2f61245c565b6008805460ff19166001836002811115610e4b57610e4b61245c565b0217905550565b606060018054610691906123c6565b600c8054610e6e906123c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a906123c6565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505081565b610efa338383611808565b5050565b6006546001600160a01b03163314610f285760405162461bcd60e51b8152600401610789906122b2565b600260085460ff166002811115610f4157610f4161245c565b1415610f4c57600080fd5b8051610efa90600c906020840190611c8a565b610f693383611505565b610f855760405162461bcd60e51b8152600401610789906122e7565b610970848484846118d7565b6006546001600160a01b03163314610fbb5760405162461bcd60e51b8152600401610789906122b2565b600060085460ff166002811115610fd457610fd461245c565b14610fde57600080fd5b60005b818110156108bf57600160096000828254610ffc9190612338565b90915550611034905083838381811061101757611017612472565b905060200201602081019061102c9190611de5565b60095461179c565b8061103e81612401565b915050610fe1565b6000818152600260205260409020546060906001600160a01b03166110c55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610789565b6000600c80546110d4906123c6565b9050116110f0576040518060200160405280600081525061067c565b600c6110fb8361190a565b60405160200161110c92919061218a565b60405160208183030381529060405292915050565b6006546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610789906122b2565b476000606461115b83600f612364565b6111659190612350565b905060006111738284612383565b6040519091506001600160a01b037f00000000000000000000000034567d53dd448fea28887fb5f76f80f544570d82169083156108fc029084906000818181858888f193505050501580156111cc573d6000803e3d6000fd5b506040516001600160a01b037f000000000000000000000000f9768ddf67125cf3eba2c8c73f59ed8f141f96d0169082156108fc029083906000818181858888f19350505050158015610970573d6000803e3d6000fd5b60606000600c8054611234906123c6565b90501161124e575060408051602081019091526000815290565b600c60405160200161126091906121bf565b604051602081830303815290604052905090565b6006546001600160a01b0316331461129e5760405162461bcd60e51b8152600401610789906122b2565b6001600160a01b0381166113035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610789565b61130c816117b6565b50565b6006546001600160a01b031633146113395760405162461bcd60e51b8152600401610789906122b2565b8281146113815760405162461bcd60e51b8152602060048201526016602482015275105c9c985e481cda5e995cc81b5a5cdb585d18da195960521b6044820152606401610789565b60005b83811015611476576106138383838181106113a1576113a1612472565b90506020020135111580156113d057506105e18383838181106113c6576113c6612472565b9050602002013510155b61141c5760405162461bcd60e51b815260206004820152601d60248201527f44696e67626f74733a204e6f7420696e207265736572766564207365740000006044820152606401610789565b61146485858381811061143157611431612472565b90506020020160208101906114469190611de5565b84848481811061145857611458612472565b9050602002013561179c565b8061146e81612401565b915050611384565b5083839050600a600082825461148c9190612338565b909155505050505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114cc82610c3c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661157e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610789565b600061158983610c3c565b9050806001600160a01b0316846001600160a01b031614806115c45750836001600160a01b03166115b984610714565b6001600160a01b0316145b806115f457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661160f82610c3c565b6001600160a01b0316146116775760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610789565b6001600160a01b0382166116d95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610789565b6116e4600082611497565b6001600160a01b038316600090815260036020526040812080546001929061170d908490612383565b90915550506001600160a01b038216600090815260036020526040812080546001929061173b908490612338565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610efa828260405180602001604052806000815250611a08565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561186a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610789565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6118e28484846115fc565b6118ee84848484611a3b565b6109705760405162461bcd60e51b815260040161078990612260565b60608161192e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611958578061194281612401565b91506119519050600a83612350565b9150611932565b60008167ffffffffffffffff81111561197357611973612488565b6040519080825280601f01601f19166020018201604052801561199d576020820181803683370190505b5090505b84156115f4576119b2600183612383565b91506119bf600a8661241c565b6119ca906030612338565b60f81b8183815181106119df576119df612472565b60200101906001600160f81b031916908160001a905350611a01600a86612350565b94506119a1565b611a128383611b48565b611a1f6000848484611a3b565b6108bf5760405162461bcd60e51b815260040161078990612260565b60006001600160a01b0384163b15611b3d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a7f9033908990889088906004016121e8565b602060405180830381600087803b158015611a9957600080fd5b505af1925050508015611ac9575060408051601f3d908101601f19168201909252611ac691810190612045565b60015b611b23573d808015611af7576040519150601f19603f3d011682016040523d82523d6000602084013e611afc565b606091505b508051611b1b5760405162461bcd60e51b815260040161078990612260565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115f4565b506001949350505050565b6001600160a01b038216611b9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610789565b6000818152600260205260409020546001600160a01b031615611c035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610789565b6001600160a01b0382166000908152600360205260408120805460019290611c2c908490612338565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611c96906123c6565b90600052602060002090601f016020900481019282611cb85760008555611cfe565b82601f10611cd157805160ff1916838001178555611cfe565b82800160010185558215611cfe579182015b82811115611cfe578251825591602001919060010190611ce3565b50611d0a929150611d0e565b5090565b5b80821115611d0a5760008155600101611d0f565b600067ffffffffffffffff80841115611d3e57611d3e612488565b604051601f8501601f19908116603f01168101908282118183101715611d6657611d66612488565b81604052809350858152868686011115611d7f57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112611dab57600080fd5b50813567ffffffffffffffff811115611dc357600080fd5b6020830191508360208260051b8501011115611dde57600080fd5b9250929050565b600060208284031215611df757600080fd5b8135611e028161249e565b9392505050565b60008060408385031215611e1c57600080fd5b8235611e278161249e565b91506020830135611e378161249e565b809150509250929050565b600080600060608486031215611e5757600080fd5b8335611e628161249e565b92506020840135611e728161249e565b929592945050506040919091013590565b60008060008060808587031215611e9957600080fd5b8435611ea48161249e565b93506020850135611eb48161249e565b925060408501359150606085013567ffffffffffffffff811115611ed757600080fd5b8501601f81018713611ee857600080fd5b611ef787823560208401611d23565b91505092959194509250565b60008060408385031215611f1657600080fd5b8235611f218161249e565b91506020830135611e37816124b3565b60008060408385031215611f4457600080fd5b8235611f4f8161249e565b946020939093013593505050565b60008060208385031215611f7057600080fd5b823567ffffffffffffffff811115611f8757600080fd5b611f9385828601611d99565b90969095509350505050565b60008060008060408587031215611fb557600080fd5b843567ffffffffffffffff80821115611fcd57600080fd5b611fd988838901611d99565b90965094506020870135915080821115611ff257600080fd5b50611fff87828801611d99565b95989497509550505050565b60006020828403121561201d57600080fd5b8151611e02816124b3565b60006020828403121561203a57600080fd5b8135611e02816124c1565b60006020828403121561205757600080fd5b8151611e02816124c1565b60006020828403121561207457600080fd5b813567ffffffffffffffff81111561208b57600080fd5b8201601f8101841361209c57600080fd5b6115f484823560208401611d23565b6000602082840312156120bd57600080fd5b5035919050565b600081518084526120dc81602086016020860161239a565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061210a57607f831692505b602080841082141561212c57634e487b7160e01b600052602260045260246000fd5b81801561214057600181146121515761217e565b60ff1986168952848901965061217e565b60008881526020902060005b868110156121765781548b82015290850190830161215d565b505084890196505b50505050505092915050565b600061219682856120f0565b83516121a681836020880161239a565b64173539b7b760d91b9101908152600501949350505050565b60006121cb82846120f0565b6c3234b733b137ba39973539b7b760991b8152600d019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221b908301846120c4565b9695505050505050565b602081016003831061224757634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611e0260208301846120c4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561234b5761234b612430565b500190565b60008261235f5761235f612446565b500490565b600081600019048311821515161561237e5761237e612430565b500290565b60008282101561239557612395612430565b500390565b60005b838110156123b557818101518382015260200161239d565b838111156109705750506000910152565b600181811c908216806123da57607f821691505b602082108114156123fb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561241557612415612430565b5060010190565b60008261242b5761242b612446565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461130c57600080fd5b801515811461130c57600080fd5b6001600160e01b03198116811461130c57600080fdfea2646970667358221220c1c5259e23327b80bf6d58804432d0102d1e3db5e80159a36ea3a028fadf10ef64736f6c63430008070033

Deployed Bytecode Sourcemap

5724:5201:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1527:305:4;;;;;;;;;;-1:-1:-1;1527:305:4;;;;;:::i;:::-;;:::i;:::-;;;10025:14:12;;10018:22;10000:41;;9988:2;9973:18;1527:305:4;;;;;;;;6634:30:2;;;;;;;;;;;;;;;;;;;19681:25:12;;;19669:2;19654:18;6634:30:2;19535:177:12;2472:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4031:221::-;;;;;;;;;;-1:-1:-1;4031:221:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9044:32:12;;;9026:51;;9014:2;8999:18;4031:221:4;8880:203:12;3554:411:4;;;;;;;;;;-1:-1:-1;3554:411:4;;;;;:::i;:::-;;:::i;:::-;;9791:114:2;;;;;;;;;;-1:-1:-1;9791:114:2;;;;;:::i;:::-;;:::i;10813:109::-;;;;;;;;;;;;;:::i;4781:339:4:-;;;;;;;;;;-1:-1:-1;4781:339:4;;;;;:::i;:::-;;:::i;9951:638:2:-;;;;;;:::i;:::-;;:::i;5191:185:4:-;;;;;;;;;;-1:-1:-1;5191:185:4;;;;;:::i;:::-;;:::i;6107:50:2:-;;;;;;;;;;;;6146:11;6107:50;;2166:239:4;;;;;;;;;;-1:-1:-1;2166:239:4;;;;;:::i;:::-;;:::i;1896:208::-;;;;;;;;;;-1:-1:-1;1896:208:4;;;;;:::i;:::-;;:::i;1712:103:9:-;;;;;;;;;;;;;:::i;6881:51:2:-;;;;;;;;;;-1:-1:-1;6881:51:2;;;;;:::i;:::-;;;;;;;;;;;;;;6226:45;;;;;;;;;;;;6269:2;6226:45;;7735:184;;;;;;;;;;-1:-1:-1;7735:184:2;;;;;:::i;:::-;;:::i;1061:87:9:-;;;;;;;;;;-1:-1:-1;1134:6:9;;-1:-1:-1;;;;;1134:6:9;1061:87;;8500:108:2;;;;;;;;;;;;;:::i;2641:104:4:-;;;;;;;;;;;;;:::i;6777:23:2:-;;;;;;;;;;;;;:::i;4324:155:4:-;;;;;;;;;;-1:-1:-1;4324:155:4;;;;;:::i;:::-;;:::i;6534:28:2:-;;;;;;;;;;;;;;;;7526:163;;;;;;;;;;-1:-1:-1;7526:163:2;;;;;:::i;:::-;;:::i;5447:328:4:-;;;;;;;;;;-1:-1:-1;5447:328:4;;;;;:::i;:::-;;:::i;8036:266:2:-;;;;;;;;;;-1:-1:-1;8036:266:2;;;;;:::i;:::-;;:::i;7044:300::-;;;;;;;;;;-1:-1:-1;7044:300:2;;;;;:::i;:::-;;:::i;6705:31::-;;;;;;;;;;;;;;;;9274:274;;;;;;;;;;;;;:::i;6439:26::-;;;;;;;;;;-1:-1:-1;6439:26:2;;;;;;;;;;;;;;;:::i;10633:172::-;;;;;;;;;;;;;:::i;4550:164:4:-;;;;;;;;;;-1:-1:-1;4550:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;4671:25:4;;;4647:4;4671:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4550:164;1970:201:9;;;;;;;;;;-1:-1:-1;1970:201:9;;;;;:::i;:::-;;:::i;8801:430:2:-;;;;;;;;;;-1:-1:-1;8801:430:2;;;;;:::i;:::-;;:::i;1527:305:4:-;1629:4;-1:-1:-1;;;;;;1666:40:4;;-1:-1:-1;;;1666:40:4;;:105;;-1:-1:-1;;;;;;;1723:48:4;;-1:-1:-1;;;1723:48:4;1666:105;:158;;;-1:-1:-1;;;;;;;;;;961:40:3;;;1788:36:4;1646:178;1527:305;-1:-1:-1;;1527:305:4:o;2472:100::-;2526:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2472:100;:::o;4031:221::-;4107:7;7374:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7374:16:4;4127:73;;;;-1:-1:-1;;;4127:73:4;;15834:2:12;4127:73:4;;;15816:21:12;15873:2;15853:18;;;15846:30;15912:34;15892:18;;;15885:62;-1:-1:-1;;;15963:18:12;;;15956:42;16015:19;;4127:73:4;;;;;;;;;-1:-1:-1;4220:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4220:24:4;;4031:221::o;3554:411::-;3635:13;3651:23;3666:7;3651:14;:23::i;:::-;3635:39;;3699:5;-1:-1:-1;;;;;3693:11:4;:2;-1:-1:-1;;;;;3693:11:4;;;3685:57;;;;-1:-1:-1;;;3685:57:4;;17791:2:12;3685:57:4;;;17773:21:12;17830:2;17810:18;;;17803:30;17869:34;17849:18;;;17842:62;-1:-1:-1;;;17920:18:12;;;17913:31;17961:19;;3685:57:4;17589:397:12;3685:57:4;736:10:1;-1:-1:-1;;;;;3777:21:4;;;;:62;;-1:-1:-1;3802:37:4;3819:5;736:10:1;4550:164:4;:::i;3802:37::-;3755:168;;;;-1:-1:-1;;;3755:168:4;;14227:2:12;3755:168:4;;;14209:21:12;14266:2;14246:18;;;14239:30;14305:34;14285:18;;;14278:62;14376:26;14356:18;;;14349:54;14420:19;;3755:168:4;14025:420:12;3755:168:4;3936:21;3945:2;3949:7;3936:8;:21::i;:::-;3624:341;3554:411;;:::o;9791:114:2:-;1134:6:9;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;9878:19:2::1;::::0;-1:-1:-1;;;9878:19:2;;-1:-1:-1;;;;;9773:32:12;;;9878:19:2::1;::::0;::::1;9755:51:12::0;9822:18;;;9815:34;;;9878:11:2;::::1;::::0;::::1;::::0;9728:18:12;;9878:19:2::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9791:114:::0;;;:::o;10813:109::-;10856:7;10899:15;;10883:13;;:31;;;;:::i;:::-;10876:38;;10813:109;:::o;4781:339:4:-;4976:41;736:10:1;5009:7:4;4976:18;:41::i;:::-;4968:103;;;;-1:-1:-1;;;4968:103:4;;;;;;;:::i;:::-;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;9951:638:2:-;1778:1:10;2376:7;;:19;;2368:63;;;;-1:-1:-1;;;2368:63:10;;19377:2:12;2368:63:10;;;19359:21:12;19416:2;19396:18;;;19389:30;19455:33;19435:18;;;19428:61;19506:18;;2368:63:10;19175:355:12;2368:63:10;1778:1;2509:7;:18;10050:16:2::1;10037:9;::::0;::::1;;:29;::::0;::::1;;;;;;:::i;:::-;;10029:81;;;::::0;-1:-1:-1;;;10029:81:2;;18969:2:12;10029:81:2::1;::::0;::::1;18951:21:12::0;19008:2;18988:18;;;18981:30;19047:34;19027:18;;;19020:62;-1:-1:-1;;;19098:18:12;;;19091:37;19145:19;;10029:81:2::1;18767:403:12::0;10029:81:2::1;10139:1;10129:7;:11;:72;;;;-1:-1:-1::0;10160:10:2::1;10144:27;::::0;;;:15:::1;:27;::::0;;;;;6269:2:::1;::::0;10144:37:::1;::::0;10174:7;;10144:37:::1;:::i;:::-;:57;;10129:72;10121:105;;;::::0;-1:-1:-1;;;10121:105:2;;13878:2:12;10121:105:2::1;::::0;::::1;13860:21:12::0;13917:2;13897:18;;;13890:30;-1:-1:-1;;;13936:18:12;;;13929:50;13996:18;;10121:105:2::1;13676:344:12::0;10121:105:2::1;10272:9;;10261:7;10245:13;;:23;;;;:::i;:::-;:36;;10237:77;;;::::0;-1:-1:-1;;;10237:77:2;;17434:2:12;10237:77:2::1;::::0;::::1;17416:21:12::0;17473:2;17453:18;;;17446:30;17512;17492:18;;;17485:58;17560:18;;10237:77:2::1;17232:352:12::0;10237:77:2::1;10346:22;6146:11;10346:7:::0;:22:::1;:::i;:::-;10333:9;:35;;10325:67;;;::::0;-1:-1:-1;;;10325:67:2;;13117:2:12;10325:67:2::1;::::0;::::1;13099:21:12::0;13156:2;13136:18;;;13129:30;-1:-1:-1;;;13175:18:12;;;13168:49;13234:18;;10325:67:2::1;12915:343:12::0;10325:67:2::1;10419:10;10403:27;::::0;;;:15:::1;:27;::::0;;;;:38;;10434:7;;10403:27;:38:::1;::::0;10434:7;;10403:38:::1;:::i;:::-;::::0;;;-1:-1:-1;10456:6:2::1;::::0;-1:-1:-1;10452:130:2::1;10472:7;10468:1;:11;10452:130;;;10518:1;10501:13;;:18;;;;;;;:::i;:::-;;;;;;;;10534:36;10544:10;10556:13;;10534:9;:36::i;:::-;10481:3:::0;::::1;::::0;::::1;:::i;:::-;;;;10452:130;;;-1:-1:-1::0;;1734:1:10;2688:7;:22;9951:638:2:o;5191:185:4:-;5329:39;5346:4;5352:2;5356:7;5329:39;;;;;;;;;;;;:16;:39::i;2166:239::-;2238:7;2274:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2274:16:4;2309:19;2301:73;;;;-1:-1:-1;;;2301:73:4;;15063:2:12;2301:73:4;;;15045:21:12;15102:2;15082:18;;;15075:30;15141:34;15121:18;;;15114:62;-1:-1:-1;;;15192:18:12;;;15185:39;15241:19;;2301:73:4;14861:405:12;1896:208:4;1968:7;-1:-1:-1;;;;;1996:19:4;;1988:74;;;;-1:-1:-1;;;1988:74:4;;14652:2:12;1988:74:4;;;14634:21:12;14691:2;14671:18;;;14664:30;14730:34;14710:18;;;14703:62;-1:-1:-1;;;14781:18:12;;;14774:40;14831:19;;1988:74:4;14450:406:12;1988:74:4;-1:-1:-1;;;;;;2080:16:4;;;;;:9;:16;;;;;;;1896:208::o;1712:103:9:-;1134:6;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;1777:30:::1;1804:1;1777:18;:30::i;:::-;1712:103::o:0;7735:184:2:-;1134:6:9;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;7829:16:2::1;7816:9;::::0;::::1;;:29;::::0;::::1;;;;;;:::i;:::-;;;7808:38;;;::::0;::::1;;7876:4;7865:7;:15;;7857:24;;;::::0;::::1;;7892:9;:19:::0;7735:184::o;8500:108::-;1134:6:9;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;8585:9:2::1;::::0;::::1;;8580:15;::::0;::::1;;;;;;:::i;:::-;:19;::::0;8598:1:::1;8580:19;:::i;:::-;8570:30;;;;;;;;:::i;:::-;8558:9;:42:::0;;-1:-1:-1;;8558:42:2::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;8500:108::o:0;2641:104:4:-;2697:13;2730:7;2723:14;;;;;:::i;6777:23:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4324:155:4:-;4419:52;736:10:1;4452:8:4;4462;4419:18;:52::i;:::-;4324:155;;:::o;7526:163:2:-;1134:6:9;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;7628:16:2::1;7615:9;::::0;::::1;;:29;::::0;::::1;;;;;;:::i;:::-;;;7607:38;;;::::0;::::1;;7656:25:::0;;::::1;::::0;:9:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;5447:328:4:-:0;5622:41;736:10:1;5655:7:4;5622:18;:41::i;:::-;5614:103;;;;-1:-1:-1;;;5614:103:4;;;;;;;:::i;:::-;5728:39;5742:4;5748:2;5752:7;5761:5;5728:13;:39::i;8036:266:2:-;1134:6:9;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;8138:14:2::1;8125:9;::::0;::::1;;:27;::::0;::::1;;;;;;:::i;:::-;;8117:36;;;::::0;::::1;;8168:6;8164:131;8180:15:::0;;::::1;8164:131;;;8234:1;8217:13;;:18;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;8250:33:2::1;::::0;-1:-1:-1;8260:4:2;;8265:1;8260:7;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8269:13;;8250:9;:33::i;:::-;8197:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8164:131;;7044:300:::0;7350:4:4;7374:16;;;:7;:16;;;;;;7117:13:2;;-1:-1:-1;;;;;7374:16:4;7143:76:2;;;;-1:-1:-1;;;7143:76:2;;17018:2:12;7143:76:2;;;17000:21:12;17057:2;17037:18;;;17030:30;17096:34;17076:18;;;17069:62;-1:-1:-1;;;17147:18:12;;;17140:45;17202:19;;7143:76:2;16816:411:12;7143:76:2;7263:1;7243:9;7237:23;;;;;:::i;:::-;;;:27;:99;;;;;;;;;;;;;;;;;7291:9;7302:18;:7;:16;:18::i;:::-;7274:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7230:106;7044:300;-1:-1:-1;;7044:300:2:o;9274:274::-;1134:6:9;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;9350:21:2::1;9331:16;9412:3;9396:13;9350:21:::0;9407:2:::1;9396:13;:::i;:::-;:19;;;;:::i;:::-;9382:33:::0;-1:-1:-1;9433:11:2::1;9447:14;9382:33:::0;9447:8;:14:::1;:::i;:::-;9479:25;::::0;9433:28;;-1:-1:-1;;;;;;9487:2:2::1;9479:20;::::0;:25;::::1;;;::::0;9500:3;;9479:25:::1;::::0;;;9500:3;9479:20;:25;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;9515:25:2::1;::::0;-1:-1:-1;;;;;9523:2:2::1;9515:20;::::0;:25;::::1;;;::::0;9536:3;;9515:25:::1;::::0;;;9536:3;9515:20;:25;::::1;;;;;;;;;;;;;::::0;::::1;;;;10633:172:::0;10677:13;10736:1;10716:9;10710:23;;;;;:::i;:::-;;;:27;:87;;-1:-1:-1;10710:87:2;;;;;;;;;-1:-1:-1;10710:87:2;;;10813:109::o;10710:87::-;10764:9;10747:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;10703:94;;10633:172;:::o;1970:201:9:-;1134:6;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;2059:22:9;::::1;2051:73;;;::::0;-1:-1:-1;;;2051:73:9;;11243:2:12;2051:73:9::1;::::0;::::1;11225:21:12::0;11282:2;11262:18;;;11255:30;11321:34;11301:18;;;11294:62;-1:-1:-1;;;11372:18:12;;;11365:36;11418:19;;2051:73:9::1;11041:402:12::0;2051:73:9::1;2135:28;2154:8;2135:18;:28::i;:::-;1970:201:::0;:::o;8801:430:2:-;1134:6:9;;-1:-1:-1;;;;;1134:6:9;736:10:1;1281:23:9;1273:68;;;;-1:-1:-1;;;1273:68:9;;;;;;;:::i;:::-;8916:31:2;;::::1;8908:66;;;::::0;-1:-1:-1;;;8908:66:2;;12766:2:12;8908:66:2::1;::::0;::::1;12748:21:12::0;12805:2;12785:18;;;12778:30;-1:-1:-1;;;12824:18:12;;;12817:52;12886:18;;8908:66:2::1;12564:346:12::0;8908:66:2::1;8989:6;8985:198;9001:15:::0;;::::1;8985:198;;;9062:4;9046:9;;9056:1;9046:12;;;;;;;:::i;:::-;;;;;;;:20;;:44;;;;;9086:4;9070:9;;9080:1;9070:12;;;;;;;:::i;:::-;;;;;;;:20;;9046:44;9038:86;;;::::0;-1:-1:-1;;;9038:86:2;;18193:2:12;9038:86:2::1;::::0;::::1;18175:21:12::0;18232:2;18212:18;;;18205:30;18271:31;18251:18;;;18244:59;18320:18;;9038:86:2::1;17991:353:12::0;9038:86:2::1;9139:32;9149:4;;9154:1;9149:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9158:9;;9168:1;9158:12;;;;;;;:::i;:::-;;;;;;;9139:9;:32::i;:::-;9018:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8985:198;;;;9212:4;;:11;;9193:15;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;8801:430:2:o;11267:174:4:-;11342:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11342:29:4;-1:-1:-1;;;;;11342:29:4;;;;;;;;:24;;11396:23;11342:24;11396:14;:23::i;:::-;-1:-1:-1;;;;;11387:46:4;;;;;;;;;;;11267:174;;:::o;7579:348::-;7672:4;7374:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7374:16:4;7689:73;;;;-1:-1:-1;;;7689:73:4;;13465:2:12;7689:73:4;;;13447:21:12;13504:2;13484:18;;;13477:30;13543:34;13523:18;;;13516:62;-1:-1:-1;;;13594:18:12;;;13587:42;13646:19;;7689:73:4;13263:408:12;7689:73:4;7773:13;7789:23;7804:7;7789:14;:23::i;:::-;7773:39;;7842:5;-1:-1:-1;;;;;7831:16:4;:7;-1:-1:-1;;;;;7831:16:4;;:51;;;;7875:7;-1:-1:-1;;;;;7851:31:4;:20;7863:7;7851:11;:20::i;:::-;-1:-1:-1;;;;;7851:31:4;;7831:51;:87;;;-1:-1:-1;;;;;;4671:25:4;;;4647:4;4671:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7886:32;7823:96;7579:348;-1:-1:-1;;;;7579:348:4:o;10571:578::-;10730:4;-1:-1:-1;;;;;10703:31:4;:23;10718:7;10703:14;:23::i;:::-;-1:-1:-1;;;;;10703:31:4;;10695:85;;;;-1:-1:-1;;;10695:85:4;;16608:2:12;10695:85:4;;;16590:21:12;16647:2;16627:18;;;16620:30;16686:34;16666:18;;;16659:62;-1:-1:-1;;;16737:18:12;;;16730:39;16786:19;;10695:85:4;16406:405:12;10695:85:4;-1:-1:-1;;;;;10799:16:4;;10791:65;;;;-1:-1:-1;;;10791:65:4;;12007:2:12;10791:65:4;;;11989:21:12;12046:2;12026:18;;;12019:30;12085:34;12065:18;;;12058:62;-1:-1:-1;;;12136:18:12;;;12129:34;12180:19;;10791:65:4;11805:400:12;10791:65:4;10973:29;10990:1;10994:7;10973:8;:29::i;:::-;-1:-1:-1;;;;;11015:15:4;;;;;;:9;:15;;;;;:20;;11034:1;;11015:15;:20;;11034:1;;11015:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11046:13:4;;;;;;:9;:13;;;;;:18;;11063:1;;11046:13;:18;;11063:1;;11046:18;:::i;:::-;;;;-1:-1:-1;;11075:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11075:21:4;-1:-1:-1;;;;;11075:21:4;;;;;;;;;11114:27;;11075:16;;11114:27;;;;;;;10571:578;;;:::o;8269:110::-;8345:26;8355:2;8359:7;8345:26;;;;;;;;;;;;:9;:26::i;2331:191:9:-;2424:6;;;-1:-1:-1;;;;;2441:17:9;;;-1:-1:-1;;;;;;2441:17:9;;;;;;;2474:40;;2424:6;;;2441:17;2424:6;;2474:40;;2405:16;;2474:40;2394:128;2331:191;:::o;11583:315:4:-;11738:8;-1:-1:-1;;;;;11729:17:4;:5;-1:-1:-1;;;;;11729:17:4;;;11721:55;;;;-1:-1:-1;;;11721:55:4;;12412:2:12;11721:55:4;;;12394:21:12;12451:2;12431:18;;;12424:30;12490:27;12470:18;;;12463:55;12535:18;;11721:55:4;12210:349:12;11721:55:4;-1:-1:-1;;;;;11787:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11787:46:4;;;;;;;;;;11849:41;;10000::12;;;11849::4;;9973:18:12;11849:41:4;;;;;;;11583:315;;;:::o;6657:::-;6814:28;6824:4;6830:2;6834:7;6814:9;:28::i;:::-;6861:48;6884:4;6890:2;6894:7;6903:5;6861:22;:48::i;:::-;6853:111;;;;-1:-1:-1;;;6853:111:4;;;;;;;:::i;342:723:11:-;398:13;619:10;615:53;;-1:-1:-1;;646:10:11;;;;;;;;;;;;-1:-1:-1;;;646:10:11;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:11;;-1:-1:-1;798:2:11;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:11;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:11;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:11;;;;;;;;-1:-1:-1;1003:11:11;1012:2;1003:11;;:::i;:::-;;;872:154;;8606:321:4;8736:18;8742:2;8746:7;8736:5;:18::i;:::-;8787:54;8818:1;8822:2;8826:7;8835:5;8787:22;:54::i;:::-;8765:154;;;;-1:-1:-1;;;8765:154:4;;;;;;;:::i;12463:799::-;12618:4;-1:-1:-1;;;;;12639:13:4;;1120:20:0;1168:8;12635:620:4;;12675:72;;-1:-1:-1;;;12675:72:4;;-1:-1:-1;;;;;12675:36:4;;;;;:72;;736:10:1;;12726:4:4;;12732:7;;12741:5;;12675:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12675:72:4;;;;;;;;-1:-1:-1;;12675:72:4;;;;;;;;;;;;:::i;:::-;;;12671:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12917:13:4;;12913:272;;12960:60;;-1:-1:-1;;;12960:60:4;;;;;;;:::i;12913:272::-;13135:6;13129:13;13120:6;13116:2;13112:15;13105:38;12671:529;-1:-1:-1;;;;;;12798:51:4;-1:-1:-1;;;12798:51:4;;-1:-1:-1;12791:58:4;;12635:620;-1:-1:-1;13239:4:4;12463:799;;;;;;:::o;9263:382::-;-1:-1:-1;;;;;9343:16:4;;9335:61;;;;-1:-1:-1;;;9335:61:4;;15473:2:12;9335:61:4;;;15455:21:12;;;15492:18;;;15485:30;15551:34;15531:18;;;15524:62;15603:18;;9335:61:4;15271:356:12;9335:61:4;7350:4;7374:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7374:16:4;:30;9407:58;;;;-1:-1:-1;;;9407:58:4;;11650:2:12;9407:58:4;;;11632:21:12;11689:2;11669:18;;;11662:30;11728;11708:18;;;11701:58;11776:18;;9407:58:4;11448:352:12;9407:58:4;-1:-1:-1;;;;;9536:13:4;;;;;;:9;:13;;;;;:18;;9553:1;;9536:13;:18;;9553:1;;9536:18;:::i;:::-;;;;-1:-1:-1;;9565:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9565:21:4;-1:-1:-1;;;;;9565:21:4;;;;;;;;9604:33;;9565:16;;;9604:33;;9565:16;;9604:33;9263:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:12;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:12;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:367::-;713:8;723:6;777:3;770:4;762:6;758:17;754:27;744:55;;795:1;792;785:12;744:55;-1:-1:-1;818:20:12;;861:18;850:30;;847:50;;;893:1;890;883:12;847:50;930:4;922:6;918:17;906:29;;990:3;983:4;973:6;970:1;966:14;958:6;954:27;950:38;947:47;944:67;;;1007:1;1004;997:12;944:67;650:367;;;;;:::o;1022:247::-;1081:6;1134:2;1122:9;1113:7;1109:23;1105:32;1102:52;;;1150:1;1147;1140:12;1102:52;1189:9;1176:23;1208:31;1233:5;1208:31;:::i;:::-;1258:5;1022:247;-1:-1:-1;;;1022:247:12:o;1274:388::-;1342:6;1350;1403:2;1391:9;1382:7;1378:23;1374:32;1371:52;;;1419:1;1416;1409:12;1371:52;1458:9;1445:23;1477:31;1502:5;1477:31;:::i;:::-;1527:5;-1:-1:-1;1584:2:12;1569:18;;1556:32;1597:33;1556:32;1597:33;:::i;:::-;1649:7;1639:17;;;1274:388;;;;;:::o;1667:456::-;1744:6;1752;1760;1813:2;1801:9;1792:7;1788:23;1784:32;1781:52;;;1829:1;1826;1819:12;1781:52;1868:9;1855:23;1887:31;1912:5;1887:31;:::i;:::-;1937:5;-1:-1:-1;1994:2:12;1979:18;;1966:32;2007:33;1966:32;2007:33;:::i;:::-;1667:456;;2059:7;;-1:-1:-1;;;2113:2:12;2098:18;;;;2085:32;;1667:456::o;2128:794::-;2223:6;2231;2239;2247;2300:3;2288:9;2279:7;2275:23;2271:33;2268:53;;;2317:1;2314;2307:12;2268:53;2356:9;2343:23;2375:31;2400:5;2375:31;:::i;:::-;2425:5;-1:-1:-1;2482:2:12;2467:18;;2454:32;2495:33;2454:32;2495:33;:::i;:::-;2547:7;-1:-1:-1;2601:2:12;2586:18;;2573:32;;-1:-1:-1;2656:2:12;2641:18;;2628:32;2683:18;2672:30;;2669:50;;;2715:1;2712;2705:12;2669:50;2738:22;;2791:4;2783:13;;2779:27;-1:-1:-1;2769:55:12;;2820:1;2817;2810:12;2769:55;2843:73;2908:7;2903:2;2890:16;2885:2;2881;2877:11;2843:73;:::i;:::-;2833:83;;;2128:794;;;;;;;:::o;2927:382::-;2992:6;3000;3053:2;3041:9;3032:7;3028:23;3024:32;3021:52;;;3069:1;3066;3059:12;3021:52;3108:9;3095:23;3127:31;3152:5;3127:31;:::i;:::-;3177:5;-1:-1:-1;3234:2:12;3219:18;;3206:32;3247:30;3206:32;3247:30;:::i;3314:315::-;3382:6;3390;3443:2;3431:9;3422:7;3418:23;3414:32;3411:52;;;3459:1;3456;3449:12;3411:52;3498:9;3485:23;3517:31;3542:5;3517:31;:::i;:::-;3567:5;3619:2;3604:18;;;;3591:32;;-1:-1:-1;;;3314:315:12:o;3634:437::-;3720:6;3728;3781:2;3769:9;3760:7;3756:23;3752:32;3749:52;;;3797:1;3794;3787:12;3749:52;3837:9;3824:23;3870:18;3862:6;3859:30;3856:50;;;3902:1;3899;3892:12;3856:50;3941:70;4003:7;3994:6;3983:9;3979:22;3941:70;:::i;:::-;4030:8;;3915:96;;-1:-1:-1;3634:437:12;-1:-1:-1;;;;3634:437:12:o;4076:773::-;4198:6;4206;4214;4222;4275:2;4263:9;4254:7;4250:23;4246:32;4243:52;;;4291:1;4288;4281:12;4243:52;4331:9;4318:23;4360:18;4401:2;4393:6;4390:14;4387:34;;;4417:1;4414;4407:12;4387:34;4456:70;4518:7;4509:6;4498:9;4494:22;4456:70;:::i;:::-;4545:8;;-1:-1:-1;4430:96:12;-1:-1:-1;4633:2:12;4618:18;;4605:32;;-1:-1:-1;4649:16:12;;;4646:36;;;4678:1;4675;4668:12;4646:36;;4717:72;4781:7;4770:8;4759:9;4755:24;4717:72;:::i;:::-;4076:773;;;;-1:-1:-1;4808:8:12;-1:-1:-1;;;;4076:773:12:o;4854:245::-;4921:6;4974:2;4962:9;4953:7;4949:23;4945:32;4942:52;;;4990:1;4987;4980:12;4942:52;5022:9;5016:16;5041:28;5063:5;5041:28;:::i;5104:245::-;5162:6;5215:2;5203:9;5194:7;5190:23;5186:32;5183:52;;;5231:1;5228;5221:12;5183:52;5270:9;5257:23;5289:30;5313:5;5289:30;:::i;5354:249::-;5423:6;5476:2;5464:9;5455:7;5451:23;5447:32;5444:52;;;5492:1;5489;5482:12;5444:52;5524:9;5518:16;5543:30;5567:5;5543:30;:::i;6083:450::-;6152:6;6205:2;6193:9;6184:7;6180:23;6176:32;6173:52;;;6221:1;6218;6211:12;6173:52;6261:9;6248:23;6294:18;6286:6;6283:30;6280:50;;;6326:1;6323;6316:12;6280:50;6349:22;;6402:4;6394:13;;6390:27;-1:-1:-1;6380:55:12;;6431:1;6428;6421:12;6380:55;6454:73;6519:7;6514:2;6501:16;6496:2;6492;6488:11;6454:73;:::i;6538:180::-;6597:6;6650:2;6638:9;6629:7;6625:23;6621:32;6618:52;;;6666:1;6663;6656:12;6618:52;-1:-1:-1;6689:23:12;;6538:180;-1:-1:-1;6538:180:12:o;6723:257::-;6764:3;6802:5;6796:12;6829:6;6824:3;6817:19;6845:63;6901:6;6894:4;6889:3;6885:14;6878:4;6871:5;6867:16;6845:63;:::i;:::-;6962:2;6941:15;-1:-1:-1;;6937:29:12;6928:39;;;;6969:4;6924:50;;6723:257;-1:-1:-1;;6723:257:12:o;6985:973::-;7070:12;;7035:3;;7125:1;7145:18;;;;7198;;;;7225:61;;7279:4;7271:6;7267:17;7257:27;;7225:61;7305:2;7353;7345:6;7342:14;7322:18;7319:38;7316:161;;;7399:10;7394:3;7390:20;7387:1;7380:31;7434:4;7431:1;7424:15;7462:4;7459:1;7452:15;7316:161;7493:18;7520:104;;;;7638:1;7633:319;;;;7486:466;;7520:104;-1:-1:-1;;7553:24:12;;7541:37;;7598:16;;;;-1:-1:-1;7520:104:12;;7633:319;19790:1;19783:14;;;19827:4;19814:18;;7727:1;7741:165;7755:6;7752:1;7749:13;7741:165;;;7833:14;;7820:11;;;7813:35;7876:16;;;;7770:10;;7741:165;;;7745:3;;7935:6;7930:3;7926:16;7919:23;;7486:466;;;;;;;6985:973;;;;:::o;7963:543::-;8240:3;8268:38;8302:3;8294:6;8268:38;:::i;:::-;8335:6;8329:13;8351:52;8396:6;8392:2;8385:4;8377:6;8373:17;8351:52;:::i;:::-;-1:-1:-1;;;8425:15:12;;8449:22;;;8498:1;8487:13;;7963:543;-1:-1:-1;;;;7963:543:12:o;8511:364::-;8740:3;8768:38;8802:3;8794:6;8768:38;:::i;:::-;-1:-1:-1;;;8815:27:12;;8866:2;8858:11;;8511:364;-1:-1:-1;;;8511:364:12:o;9088:488::-;-1:-1:-1;;;;;9357:15:12;;;9339:34;;9409:15;;9404:2;9389:18;;9382:43;9456:2;9441:18;;9434:34;;;9504:3;9499:2;9484:18;;9477:31;;;9282:4;;9525:45;;9550:19;;9542:6;9525:45;:::i;:::-;9517:53;9088:488;-1:-1:-1;;;;;;9088:488:12:o;10052:341::-;10197:2;10182:18;;10230:1;10219:13;;10209:144;;10275:10;10270:3;10266:20;10263:1;10256:31;10310:4;10307:1;10300:15;10338:4;10335:1;10328:15;10209:144;10362:25;;;10052:341;:::o;10398:219::-;10547:2;10536:9;10529:21;10510:4;10567:44;10607:2;10596:9;10592:18;10584:6;10567:44;:::i;10622:414::-;10824:2;10806:21;;;10863:2;10843:18;;;10836:30;10902:34;10897:2;10882:18;;10875:62;-1:-1:-1;;;10968:2:12;10953:18;;10946:48;11026:3;11011:19;;10622:414::o;16045:356::-;16247:2;16229:21;;;16266:18;;;16259:30;16325:34;16320:2;16305:18;;16298:62;16392:2;16377:18;;16045:356::o;18349:413::-;18551:2;18533:21;;;18590:2;18570:18;;;18563:30;18629:34;18624:2;18609:18;;18602:62;-1:-1:-1;;;18695:2:12;18680:18;;18673:47;18752:3;18737:19;;18349:413::o;19843:128::-;19883:3;19914:1;19910:6;19907:1;19904:13;19901:39;;;19920:18;;:::i;:::-;-1:-1:-1;19956:9:12;;19843:128::o;19976:120::-;20016:1;20042;20032:35;;20047:18;;:::i;:::-;-1:-1:-1;20081:9:12;;19976:120::o;20101:168::-;20141:7;20207:1;20203;20199:6;20195:14;20192:1;20189:21;20184:1;20177:9;20170:17;20166:45;20163:71;;;20214:18;;:::i;:::-;-1:-1:-1;20254:9:12;;20101:168::o;20274:125::-;20314:4;20342:1;20339;20336:8;20333:34;;;20347:18;;:::i;:::-;-1:-1:-1;20384:9:12;;20274:125::o;20404:258::-;20476:1;20486:113;20500:6;20497:1;20494:13;20486:113;;;20576:11;;;20570:18;20557:11;;;20550:39;20522:2;20515:10;20486:113;;;20617:6;20614:1;20611:13;20608:48;;;-1:-1:-1;;20652:1:12;20634:16;;20627:27;20404:258::o;20667:380::-;20746:1;20742:12;;;;20789;;;20810:61;;20864:4;20856:6;20852:17;20842:27;;20810:61;20917:2;20909:6;20906:14;20886:18;20883:38;20880:161;;;20963:10;20958:3;20954:20;20951:1;20944:31;20998:4;20995:1;20988:15;21026:4;21023:1;21016:15;20880:161;;20667:380;;;:::o;21052:135::-;21091:3;-1:-1:-1;;21112:17:12;;21109:43;;;21132:18;;:::i;:::-;-1:-1:-1;21179:1:12;21168:13;;21052:135::o;21192:112::-;21224:1;21250;21240:35;;21255:18;;:::i;:::-;-1:-1:-1;21289:9:12;;21192:112::o;21309:127::-;21370:10;21365:3;21361:20;21358:1;21351:31;21401:4;21398:1;21391:15;21425:4;21422:1;21415:15;21441:127;21502:10;21497:3;21493:20;21490:1;21483:31;21533:4;21530:1;21523:15;21557:4;21554:1;21547:15;21573:127;21634:10;21629:3;21625:20;21622:1;21615:31;21665:4;21662:1;21655:15;21689:4;21686:1;21679:15;21705:127;21766:10;21761:3;21757:20;21754:1;21747:31;21797:4;21794:1;21787:15;21821:4;21818:1;21811:15;21837:127;21898:10;21893:3;21889:20;21886:1;21879:31;21929:4;21926:1;21919:15;21953:4;21950:1;21943:15;21969:131;-1:-1:-1;;;;;22044:31:12;;22034:42;;22024:70;;22090:1;22087;22080:12;22105:118;22191:5;22184:13;22177:21;22170:5;22167:32;22157:60;;22213:1;22210;22203:12;22228:131;-1:-1:-1;;;;;;22302:32:12;;22292:43;;22282:71;;22349:1;22346;22339:12

Swarm Source

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