ETH Price: $2,305.99 (-4.73%)

Token

Digital Sigil (Digital Sigil)
 

Overview

Max Total Supply

8 Digital Sigil

Holders

7

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
reito.eth
Balance
2 Digital Sigil
0x89f862f870de542c2d91095ccbbce86ca112a72a
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:
DigitalSigil

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 20 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 20: DigitalSigil.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./Math.sol";
import "./SafeMath.sol";
import "./Strings.sol";
import "./IERC1155.sol";

import "./ContentMixin.sol";
import "./NativeMetaTransaction.sol";

contract DigitalSigilOwnableDelegateProxy {}

contract DigitalSigilProxyRegistry {
    mapping(address => DigitalSigilOwnableDelegateProxy) public proxies;
}

contract DigitalSigil is
    ERC721Enumerable,
    Ownable,
    ContextMixin,
    NativeMetaTransaction
{
    using SafeMath for uint256;
    using Strings for uint256;
    
    address proxyRegistryAddress;

    IERC1155 private whitelistContract;
    uint256[] private whitelistedTokensArr = [535178, 532250, 580360, 581049, 582700, 610719];
    uint256[] private whitelistedTokensSupplyArr = [18, 18, 18, 18, 18, 18];
    mapping(uint256 => bool) private whitelistedTokens;
    mapping(uint256 => uint256) private tokensAlreadyUsedToMint;
    mapping(address => uint256) private addAlreadyUsedToMint;

    uint256 public startingIndexBlock;

    uint256 public startingIndex;

    uint256 public mintPrice = 0.0666 ether; 

    uint256 public constant maxPurchase = 6;

    uint256 public maxSupply;

    bool public saleIsActive = true;

    uint256 public saleTimeStamp;
    uint256 public revealTimeStamp;

    string private BASE_URI;

    address private dev = 0xAE77beeda3c1BB43B1cAEaE04815F68e1c07e077;
    address private par = 0x57237e61aBa03690AAcd30CBed852D350F476a60;
    address private art = 0x934d84A98BD08edBF6b2465AD6Cf022eFd81F2Bc;

    constructor(
        string memory name,
        string memory symbol,
        uint256 maxNftSupply,
        uint256 saleStart,
        address _proxyRegistryAddress,
        address _whitelistContract
    ) ERC721(name, symbol) {
        maxSupply = maxNftSupply;
        saleTimeStamp = saleStart;
        revealTimeStamp = saleStart + (86400 * 9);
        proxyRegistryAddress = _proxyRegistryAddress;
        whitelistContract = IERC1155(_whitelistContract);
        whitelistedTokens[535178] = true;
        whitelistedTokens[532250] = true;
        whitelistedTokens[580360] = true;
        whitelistedTokens[581049] = true;
        whitelistedTokens[582700] = true;
        whitelistedTokens[610719] = true;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(dev).transfer(balance.div(4));
        payable(par).transfer(balance.div(4));
        payable(art).transfer(address(this).balance);
    }

    function setWhitelistContract(address _whitelistContract) public onlyOwner {
        whitelistContract = IERC1155(_whitelistContract);
    }

    function whitelistTokens(uint256[] memory tokenIds, uint256[] memory supplies) public onlyOwner {
        require(tokenIds.length == supplies.length, "Invalid inputs");
        for (uint256 i = 0; i < tokenIds.length; i++) {
            whitelistedTokensArr.push(tokenIds[i]);
            whitelistedTokensSupplyArr.push(supplies[i]);
            whitelistedTokens[tokenIds[i]] = true;
        }
    }

    function setSupplyForWhitelistToken(uint256 index, uint256 supply) public onlyOwner {
        whitelistedTokensSupplyArr[index] = supply;
    }

    function isWhitelistedTokenAvailableToMint(uint256 index) public view returns (bool) {
        return tokensAlreadyUsedToMint[whitelistedTokensArr[index]] < whitelistedTokensSupplyArr[index];
    }

    function isWhitelistAvailableToMintForAddress(address _add) public view returns (bool) {
        uint256 maxWhitelist = 0;
        for (uint256 i = 0; i < whitelistedTokensArr.length; i++) {
            if (isWhitelistedTokenAvailableToMint(i)) {
                maxWhitelist += Math.min(whitelistContract.balanceOf(_add, whitelistedTokensArr[i]), whitelistedTokensSupplyArr[i]-tokensAlreadyUsedToMint[whitelistedTokensArr[i]]);
            }
        }
        return maxWhitelist > addAlreadyUsedToMint[_add];
    }

    function numberOfMintsUsingWhitelistedToken(uint256 index) public view returns (uint256) {
        return tokensAlreadyUsedToMint[whitelistedTokensArr[index]];
    }

    function reserve(uint256 num, address _to) public onlyOwner {
        uint256 supply = totalSupply();
        uint256 i;
        for (i = 0; i < num; i++) {
            _safeMint(_to, supply + i);
        }
    }

    function setSaleTimestamp(uint256 timeStamp) public onlyOwner {
        saleTimeStamp = timeStamp;
    }

    function setRevealTimestamp(uint256 timeStamp) public onlyOwner {
        revealTimeStamp = timeStamp;
    }

    function setMintPrice(uint256 price) public onlyOwner {
        mintPrice = price;
    }

    function setMaxSupply(uint256 supply) public onlyOwner {
        maxSupply = supply;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        BASE_URI = baseURI;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function isWhitelisted(address _add) public view returns (bool, uint256) {
        uint256 maxWhitelist = 0;
        for (uint256 i = 0; i < whitelistedTokensArr.length; i++) {
            if (tokensAlreadyUsedToMint[whitelistedTokensArr[i]] < whitelistedTokensSupplyArr[i]) {
                maxWhitelist += Math.min(whitelistContract.balanceOf(_add, whitelistedTokensArr[i]), whitelistedTokensSupplyArr[i]-tokensAlreadyUsedToMint[whitelistedTokensArr[i]]);
            }
            if (maxWhitelist > addAlreadyUsedToMint[_add]) {
                return (true, whitelistedTokensArr[i]);
            }
        }
        return (false, 0);
    }

    function mintWhitelist() public payable {
        (bool checkWhitelist, uint256 tokenId) = isWhitelisted(msg.sender);
        require(checkWhitelist == true, "Not whitelisted");
        tokensAlreadyUsedToMint[tokenId] += 1;
        addAlreadyUsedToMint[msg.sender] += 1;
        mintNoValueCheck(1);
    }

    function mint(uint256 numberOfTokens) public payable {
        require(
            numberOfTokens <= maxPurchase,
            "Can only mint 20 tokens at a time"
        );
        require(
            mintPrice.mul(numberOfTokens) <= msg.value,
            "Ether value sent is not correct"
        );
        mintNoValueCheck(numberOfTokens);
    }

    function mintNoValueCheck(uint256 numberOfTokens) private {
        require(saleIsActive && block.timestamp >= saleTimeStamp, "Sale must be active to mint");
        require(
            numberOfTokens <= maxPurchase,
            "Can only mint 6 tokens at a time"
        );
        require(
            totalSupply().add(numberOfTokens) <= maxSupply,
            "Purchase would exceed max supply"
        );

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 mintIndex = totalSupply();
            if (totalSupply() < maxSupply) {
                _safeMint(msg.sender, mintIndex);
            }
        }

        if (
            startingIndexBlock == 0 &&
            (totalSupply() == maxSupply || block.timestamp >= revealTimeStamp)
        ) {
            startingIndexBlock = block.number;
        }
    }

    function setStartingIndex() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");

        startingIndex = uint256(blockhash(startingIndexBlock)) % maxSupply;
        if (block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint256(blockhash(block.number - 1)) % maxSupply;
        }
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");

        startingIndexBlock = block.number;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return block.timestamp >= revealTimeStamp 
        ? string(abi.encodePacked(BASE_URI, _tokenId.toString(), ".json")) 
        : contractURI();
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        DigitalSigilProxyRegistry proxyRegistry = DigitalSigilProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }

    function contractURI() public pure returns (string memory) {
        return "ipfs://QmZy7tTePn9ugcfWeTpAbT1Mj87wUZdDz1U8xH57Xop2z3";
    }
}

File 1 of 20: Address.sol
// SPDX-License-Identifier: MIT

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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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 20: ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 3 of 20: Context.sol
// SPDX-License-Identifier: MIT

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 5 of 20: EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 6 of 20: ERC165.sol
// SPDX-License-Identifier: MIT

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 7 of 20: ERC721.sol
// SPDX-License-Identifier: MIT

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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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(to).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 8 of 20: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 9 of 20: IERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 10 of 20: IERC165.sol
// SPDX-License-Identifier: MIT

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 11 of 20: IERC721.sol
// SPDX-License-Identifier: MIT

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 12 of 20: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 13 of 20: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 14 of 20: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 15 of 20: Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 16 of 20: Math.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

File 17 of 20: NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

File 18 of 20: Ownable.sol
// SPDX-License-Identifier: MIT

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 19 of 20: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 20 of 20: Strings.sol
// SPDX-License-Identifier: MIT

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":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxNftSupply","type":"uint256"},{"internalType":"uint256","name":"saleStart","type":"uint256"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"address","name":"_whitelistContract","type":"address"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"pure","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"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":[{"internalType":"address","name":"_add","type":"address"}],"name":"isWhitelistAvailableToMintForAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isWhitelistedTokenAvailableToMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"numberOfMintsUsingWhitelistedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTimeStamp","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":"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":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeStamp","type":"uint256"}],"name":"setSaleTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setSupplyForWhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whitelistContract","type":"address"}],"name":"setWhitelistContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"supplies","type":"uint256[]"}],"name":"whitelistTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600a805460ff60a01b1916905561014060405262082a8a608090815262081f1a60a0526208db0860c0526208ddb960e0526208e42c610100526209519f610120526200005090600f906006620003b9565b506040805160c081018252601280825260208201819052918101829052606081018290526080810182905260a08101919091526200009390601090600662000410565b5066ec9c58de0a80006016556018805460ff19166001179055601c80546001600160a01b031990811673ae77beeda3c1bb43b1caeae04815f68e1c07e07717909155601d805482167357237e61aba03690aacd30cbed852d350f476a60179055601e805490911673934d84a98bd08edbf6b2465ad6cf022efd81f2bc1790553480156200011f57600080fd5b5060405162003c7f38038062003c7f8339810160408190526200014291620005d1565b8551869086906200015b90600090602085019062000453565b5080516200017190600190602084019062000453565b5050506200018e62000188620002ec60201b60201c565b62000308565b60178490556019839055620001a783620bdd8062000672565b601a55600d80546001600160a01b039384166001600160a01b031991821617909155600e80549290931691161790555050601160205250507ffbf3e92202b5681a9e3d68ac21be60aa4e63e91261053c44798e690ebfd08747805460ff1990811660019081179092557f45004c633e680c9932ec89f80239a9c23337c64933275da1e550db12bc60240280548216831790557f980b39c0e64355183a4d9029d5c2fdfe129c2c19af5f07f3078d5824d7cf48a380548216831790557f0730696c3eee679d7d6e4f507e52e778c74a78a54f5c0443147a7693d1e0372f80548216831790557f0e39c061bc8bda295d3da7f8b4951b132072addcde9becf0c3b9e886da79b71680548216831790556209519f6000527f59cdd589d95a7148cfcfd396d18936b3e1fd4780d3700f37f9eda099b4c2205980549091169091179055620006d6565b6000620003036200035a60201b62001dd41760201c565b905090565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600033301415620003b357600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620003b69050565b50335b90565b828054828255906000526020600020908101928215620003fe579160200282015b82811115620003fe578251829062ffffff16905591602001919060010190620003da565b506200040c929150620004d0565b5090565b828054828255906000526020600020908101928215620003fe579160200282015b82811115620003fe578251829060ff1690559160200191906001019062000431565b828054620004619062000699565b90600052602060002090601f016020900481019282620004855760008555620003fe565b82601f10620004a057805160ff1916838001178555620003fe565b82800160010185558215620003fe579182015b82811115620003fe578251825591602001919060010190620004b3565b5b808211156200040c5760008155600101620004d1565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200050f57600080fd5b81516001600160401b03808211156200052c576200052c620004e7565b604051601f8301601f19908116603f01168101908282118183101715620005575762000557620004e7565b816040528381526020925086838588010111156200057457600080fd5b600091505b8382101562000598578582018301518183018401529082019062000579565b83821115620005aa5760008385830101525b9695505050505050565b80516001600160a01b0381168114620005cc57600080fd5b919050565b60008060008060008060c08789031215620005eb57600080fd5b86516001600160401b03808211156200060357600080fd5b620006118a838b01620004fd565b975060208901519150808211156200062857600080fd5b506200063789828a01620004fd565b95505060408701519350606087015192506200065660808801620005b4565b91506200066660a08801620005b4565b90509295509295509295565b600082198211156200069457634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620006ae57607f821691505b60208210811415620006d057634e487b7160e01b600052602260045260246000fd5b50919050565b61359980620006e66000396000f3fe60806040526004361061025f5760003560e01c806370a082311161014057806370a082311461059c578063715018a6146105bc57806371f9c534146105d157806377e92e77146105e75780637a1cbd3f146106075780637d17fcbe146106275780637f4e465f1461063c5780638da5cb5b1461065c57806395d89b4114610671578063977b055b14610686578063a0712d681461069b578063a22cb465146106ae578063b2b42378146106ce578063b88d4fde146106ee578063bcb4b3c81461070e578063c87b56dd1461072e578063cb774d471461074e578063d5abeb0114610764578063d9589fd11461077a578063e36d64981461079a578063e8a3d485146107b0578063e985e9c5146107c5578063e9866550146107e5578063eb8d2444146107fa578063f2fde38b14610814578063f4a0a5281461083457600080fd5b8063018a2c371461026457806301ffc9a71461028657806303339bcb146102bb57806306fdde03146102db578063081812fc146102fd578063095ea7b31461032a5780630c53c51c1461034a5780630f7e59701461035d57806312f261401461038a57806318160ddd146103aa57806320379ee5146103c957806323b872dd146103de5780632d0335ab146103fe5780632d3df31f146104345780632f745c591461043c5780633408e4701461045c57806334918dfd1461046f5780633af32abf146104845780633ccfd60b146104bb57806342842e0e146104d05780634f6ccce7146104f057806355f804b314610510578063626a15bd146105305780636352211e146105465780636817c76c146105665780636f8b44b01461057c575b600080fd5b34801561027057600080fd5b5061028461027f366004612beb565b610854565b005b34801561029257600080fd5b506102a66102a1366004612c1a565b6108a1565b60405190151581526020015b60405180910390f35b3480156102c757600080fd5b506102846102d6366004612c4c565b6108cc565b3480156102e757600080fd5b506102f061094e565b6040516102b29190612cd4565b34801561030957600080fd5b5061031d610318366004612beb565b6109e0565b6040516102b29190612ce7565b34801561033657600080fd5b50610284610345366004612cfb565b610a68565b6102f0610358366004612de4565b610b8b565b34801561036957600080fd5b506102f0604051806040016040528060018152602001603160f81b81525081565b34801561039657600080fd5b506102846103a5366004612e61565b610d74565b3480156103b657600080fd5b506008545b6040519081526020016102b2565b3480156103d557600080fd5b50600b546103bb565b3480156103ea57600080fd5b506102846103f9366004612e7e565b610dd5565b34801561040a57600080fd5b506103bb610419366004612e61565b6001600160a01b03166000908152600c602052604090205490565b610284610e0d565b34801561044857600080fd5b506103bb610457366004612cfb565b610eba565b34801561046857600080fd5b50466103bb565b34801561047b57600080fd5b50610284610f50565b34801561049057600080fd5b506104a461049f366004612e61565b610fa3565b6040805192151583526020830191909152016102b2565b3480156104c757600080fd5b50610284611184565b3480156104dc57600080fd5b506102846104eb366004612e7e565b611284565b3480156104fc57600080fd5b506103bb61050b366004612beb565b61129f565b34801561051c57600080fd5b5061028461052b366004612ebf565b611332565b34801561053c57600080fd5b506103bb60195481565b34801561055257600080fd5b5061031d610561366004612beb565b611384565b34801561057257600080fd5b506103bb60165481565b34801561058857600080fd5b50610284610597366004612beb565b6113fb565b3480156105a857600080fd5b506103bb6105b7366004612e61565b61143f565b3480156105c857600080fd5b506102846114c6565b3480156105dd57600080fd5b506103bb601a5481565b3480156105f357600080fd5b50610284610602366004612f07565b611511565b34801561061357600080fd5b50610284610622366004612beb565b611574565b34801561063357600080fd5b506102846115b8565b34801561064857600080fd5b506102a6610657366004612beb565b61161d565b34801561066857600080fd5b5061031d611676565b34801561067d57600080fd5b506102f0611685565b34801561069257600080fd5b506103bb600681565b6102846106a9366004612beb565b611694565b3480156106ba57600080fd5b506102846106c9366004612f29565b611758565b3480156106da57600080fd5b506102a66106e9366004612e61565b611856565b3480156106fa57600080fd5b50610284610709366004612f5c565b6118e2565b34801561071a57600080fd5b50610284610729366004613046565b61191b565b34801561073a57600080fd5b506102f0610749366004612beb565b611a6a565b34801561075a57600080fd5b506103bb60155481565b34801561077057600080fd5b506103bb60175481565b34801561078657600080fd5b506103bb610795366004612beb565b611ab4565b3480156107a657600080fd5b506103bb60145481565b3480156107bc57600080fd5b506102f0611aee565b3480156107d157600080fd5b506102a66107e03660046130a9565b611b0e565b3480156107f157600080fd5b50610284611bd3565b34801561080657600080fd5b506018546102a69060ff1681565b34801561082057600080fd5b5061028461082f366004612e61565b611ce3565b34801561084057600080fd5b5061028461084f366004612beb565b611d90565b61085c611e31565b6001600160a01b031661086d611676565b6001600160a01b03161461089c5760405162461bcd60e51b8152600401610893906130d7565b60405180910390fd5b601a55565b60006001600160e01b0319821663780e9d6360e01b14806108c657506108c682611e40565b92915050565b6108d4611e31565b6001600160a01b03166108e5611676565b6001600160a01b03161461090b5760405162461bcd60e51b8152600401610893906130d7565b600061091660085490565b905060005b8381101561094857610936836109318385613122565b611e90565b806109408161313a565b91505061091b565b50505050565b60606000805461095d90613155565b80601f016020809104026020016040519081016040528092919081815260200182805461098990613155565b80156109d65780601f106109ab576101008083540402835291602001916109d6565b820191906000526020600020905b8154815290600101906020018083116109b957829003601f168201915b5050505050905090565b60006109eb82611eaa565b610a4c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610893565b506000908152600460205260409020546001600160a01b031690565b6000610a7382611384565b9050806001600160a01b0316836001600160a01b03161415610ae15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610893565b806001600160a01b0316610af3611e31565b6001600160a01b03161480610b0f5750610b0f816107e0611e31565b610b7c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610893565b610b868383611ec7565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610bc98782878787611f35565b610c1f5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610893565b6001600160a01b0387166000908152600c6020526040902054610c43906001612025565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c9390899033908a90613190565b60405180910390a1600080306001600160a01b0316888a604051602001610cbb9291906131e1565b60408051601f1981840301815290829052610cd591613213565b6000604051808303816000865af19150503d8060008114610d12576040519150601f19603f3d011682016040523d82523d6000602084013e610d17565b606091505b509150915081610d685760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b6044820152606401610893565b98975050505050505050565b610d7c611e31565b6001600160a01b0316610d8d611676565b6001600160a01b031614610db35760405162461bcd60e51b8152600401610893906130d7565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b610de6610de0611e31565b82612038565b610e025760405162461bcd60e51b81526004016108939061322f565b610b868383836120fa565b600080610e1933610fa3565b9092509050600182151514610e625760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610893565b6000818152601260205260408120805460019290610e81908490613122565b9091555050336000908152601360205260408120805460019290610ea6908490613122565b90915550610eb6905060016122a5565b5050565b6000610ec58361143f565b8210610f275760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610893565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610f58611e31565b6001600160a01b0316610f69611676565b6001600160a01b031614610f8f5760405162461bcd60e51b8152600401610893906130d7565b6018805460ff19811660ff90911615179055565b6000806000805b600f548110156111775760108181548110610fc757610fc7613280565b906000526020600020015460126000600f8481548110610fe957610fe9613280565b9060005260206000200154815260200190815260200160002054101561111a57600e54600f805461110d926001600160a01b03169162fdd58e918991908690811061103657611036613280565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561108b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110af9190613296565b60126000600f85815481106110c6576110c6613280565b9060005260206000200154815260200190815260200160002054601084815481106110f3576110f3613280565b906000526020600020015461110891906132af565b61242b565b6111179083613122565b91505b6001600160a01b038516600090815260136020526040902054821115611165576001600f828154811061114f5761114f613280565b9060005260206000200154935093505050915091565b8061116f8161313a565b915050610faa565b5060009485945092505050565b61118c611e31565b6001600160a01b031661119d611676565b6001600160a01b0316146111c35760405162461bcd60e51b8152600401610893906130d7565b601c5447906001600160a01b03166108fc6111df836004612441565b6040518115909202916000818181858888f19350505050158015611207573d6000803e3d6000fd5b50601d546001600160a01b03166108fc611222836004612441565b6040518115909202916000818181858888f1935050505015801561124a573d6000803e3d6000fd5b50601e546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610eb6573d6000803e3d6000fd5b610b86838383604051806020016040528060008152506118e2565b60006112aa60085490565b821061130d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610893565b6008828154811061132057611320613280565b90600052602060002001549050919050565b61133a611e31565b6001600160a01b031661134b611676565b6001600160a01b0316146113715760405162461bcd60e51b8152600401610893906130d7565b8051610eb690601b906020840190612b52565b6000818152600260205260408120546001600160a01b0316806108c65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610893565b611403611e31565b6001600160a01b0316611414611676565b6001600160a01b03161461143a5760405162461bcd60e51b8152600401610893906130d7565b601755565b60006001600160a01b0382166114aa5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610893565b506001600160a01b031660009081526003602052604090205490565b6114ce611e31565b6001600160a01b03166114df611676565b6001600160a01b0316146115055760405162461bcd60e51b8152600401610893906130d7565b61150f600061244d565b565b611519611e31565b6001600160a01b031661152a611676565b6001600160a01b0316146115505760405162461bcd60e51b8152600401610893906130d7565b806010838154811061156457611564613280565b6000918252602090912001555050565b61157c611e31565b6001600160a01b031661158d611676565b6001600160a01b0316146115b35760405162461bcd60e51b8152600401610893906130d7565b601955565b6115c0611e31565b6001600160a01b03166115d1611676565b6001600160a01b0316146115f75760405162461bcd60e51b8152600401610893906130d7565b601554156116175760405162461bcd60e51b8152600401610893906132c6565b43601455565b60006010828154811061163257611632613280565b906000526020600020015460126000600f858154811061165457611654613280565b9060005260206000200154815260200190815260200160002054109050919050565b600a546001600160a01b031690565b60606001805461095d90613155565b60068111156116ef5760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6044820152606560f81b6064820152608401610893565b60165434906116fe908361249f565b111561174c5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610893565b611755816122a5565b50565b611760611e31565b6001600160a01b0316826001600160a01b031614156117bd5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610893565b80600560006117ca611e31565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561180e611e31565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184a911515815260200190565b60405180910390a35050565b600080805b600f548110156118bf5761186e8161161d565b156118ad57600e54600f80546118a0926001600160a01b03169162fdd58e918891908690811061103657611036613280565b6118aa9083613122565b91505b806118b78161313a565b91505061185b565b506001600160a01b03909216600090815260136020526040902054909111919050565b6118f36118ed611e31565b83612038565b61190f5760405162461bcd60e51b81526004016108939061322f565b610948848484846124ab565b611923611e31565b6001600160a01b0316611934611676565b6001600160a01b03161461195a5760405162461bcd60e51b8152600401610893906130d7565b805182511461199c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b6044820152606401610893565b60005b8251811015610b8657600f8382815181106119bc576119bc613280565b6020908102919091018101518254600181018455600093845291909220015581516010908390839081106119f2576119f2613280565b6020908102919091018101518254600181810185556000948552928420015584519091601191869085908110611a2a57611a2a613280565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a629061313a565b91505061199f565b6060601a54421015611a8357611a7e611aee565b6108c6565b601b611a8e836124de565b604051602001611a9f9291906132fd565b60405160208183030381529060405292915050565b600060126000600f8481548110611acd57611acd613280565b90600052602060002001548152602001908152602001600020549050919050565b606060405180606001604052806035815260200161352f60359139905090565b600d5460405163c455279160e01b81526000916001600160a01b039081169190841690829063c455279190611b47908890600401612ce7565b602060405180830381865afa158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8891906133af565b6001600160a01b03161415611ba15760019150506108c6565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611bdb611e31565b6001600160a01b0316611bec611676565b6001600160a01b031614611c125760405162461bcd60e51b8152600401610893906130d7565b60155415611c325760405162461bcd60e51b8152600401610893906132c6565b601454611c815760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610893565b601754601454611c929190406133e2565b60155560145460ff90611ca69043906125db565b1115611cc957601754611cba6001436132af565b611cc59190406133e2565b6015555b60155461150f57601554611cde906001612025565b601555565b611ceb611e31565b6001600160a01b0316611cfc611676565b6001600160a01b031614611d225760405162461bcd60e51b8152600401610893906130d7565b6001600160a01b038116611d875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610893565b6117558161244d565b611d98611e31565b6001600160a01b0316611da9611676565b6001600160a01b031614611dcf5760405162461bcd60e51b8152600401610893906130d7565b601655565b600033301415611e2b57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611e2e9050565b50335b90565b6000611e3b611dd4565b905090565b60006001600160e01b031982166380ac58cd60e01b1480611e7157506001600160e01b03198216635b5e139f60e01b145b806108c657506301ffc9a760e01b6001600160e01b03198316146108c6565b610eb68282604051806020016040528060008152506125e7565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611efc82611384565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611f9b5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610893565b6001611fae611fa98761261a565b612697565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611ffc573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006120318284613122565b9392505050565b600061204382611eaa565b6120a45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610893565b60006120af83611384565b9050806001600160a01b0316846001600160a01b031614806120ea5750836001600160a01b03166120df846109e0565b6001600160a01b0316145b80611bcb5750611bcb8185611b0e565b826001600160a01b031661210d82611384565b6001600160a01b0316146121755760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610893565b6001600160a01b0382166121d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610893565b6121e28383836126c7565b6121ed600082611ec7565b6001600160a01b03831660009081526003602052604081208054600192906122169084906132af565b90915550506001600160a01b0382166000908152600360205260408120805460019290612244908490613122565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60185460ff1680156122b957506019544210155b6123035760405162461bcd60e51b815260206004820152601b60248201527a14d85b19481b5d5cdd081899481858dd1a5d99481d1bc81b5a5b9d602a1b6044820152606401610893565b60068111156123545760405162461bcd60e51b815260206004820181905260248201527f43616e206f6e6c79206d696e74203620746f6b656e7320617420612074696d656044820152606401610893565b60175461236a8261236460085490565b90612025565b11156123b85760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610893565b60005b818110156123ff5760006123ce60085490565b90506017546123dc60085490565b10156123ec576123ec3382611e90565b50806123f78161313a565b9150506123bb565b5060145415801561241f5750601754600854148061241f5750601a544210155b15611755574360145550565b600081831061243a5781612031565b5090919050565b600061203182846133f6565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612031828461340a565b6124b68484846120fa565b6124c28484848461277f565b6109485760405162461bcd60e51b815260040161089390613429565b6060816125025750506040805180820190915260018152600360fc1b602082015290565b8160005b811561252c57806125168161313a565b91506125259050600a836133f6565b9150612506565b6000816001600160401b0381111561254657612546612d27565b6040519080825280601f01601f191660200182016040528015612570576020820181803683370190505b5090505b8415611bcb576125856001836132af565b9150612592600a866133e2565b61259d906030613122565b60f81b8183815181106125b2576125b2613280565b60200101906001600160f81b031916908160001a9053506125d4600a866133f6565b9450612574565b600061203182846132af565b6125f18383612884565b6125fe600084848461277f565b610b865760405162461bcd60e51b815260040161089390613429565b60006040518060800160405280604381526020016134ec604391398051602091820120835184830151604080870151805190860120905161267a950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006126a2600b5490565b60405161190160f01b602082015260228101919091526042810183905260620161267a565b6001600160a01b0383166127225761271d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612745565b816001600160a01b0316836001600160a01b0316146127455761274583826129c2565b6001600160a01b03821661275c57610b8681612a5f565b826001600160a01b0316826001600160a01b031614610b8657610b868282612b0e565b60006001600160a01b0384163b1561287957836001600160a01b031663150b7a026127a8611e31565b8786866040518563ffffffff1660e01b81526004016127ca949392919061347b565b6020604051808303816000875af1925050508015612805575060408051601f3d908101601f19168201909252612802918101906134b8565b60015b61285f573d808015612833576040519150601f19603f3d011682016040523d82523d6000602084013e612838565b606091505b5080516128575760405162461bcd60e51b815260040161089390613429565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bcb565b506001949350505050565b6001600160a01b0382166128da5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610893565b6128e381611eaa565b1561292f5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610893565b61293b600083836126c7565b6001600160a01b0382166000908152600360205260408120805460019290612964908490613122565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016129cf8461143f565b6129d991906132af565b600083815260076020526040902054909150808214612a2c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a71906001906132af565b60008381526009602052604081205460088054939450909284908110612a9957612a99613280565b906000526020600020015490508060088381548110612aba57612aba613280565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612af257612af26134d5565b6001900381819060005260206000200160009055905550505050565b6000612b198361143f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612b5e90613155565b90600052602060002090601f016020900481019282612b805760008555612bc6565b82601f10612b9957805160ff1916838001178555612bc6565b82800160010185558215612bc6579182015b82811115612bc6578251825591602001919060010190612bab565b50612bd2929150612bd6565b5090565b5b80821115612bd25760008155600101612bd7565b600060208284031215612bfd57600080fd5b5035919050565b6001600160e01b03198116811461175557600080fd5b600060208284031215612c2c57600080fd5b813561203181612c04565b6001600160a01b038116811461175557600080fd5b60008060408385031215612c5f57600080fd5b823591506020830135612c7181612c37565b809150509250929050565b60005b83811015612c97578181015183820152602001612c7f565b838111156109485750506000910152565b60008151808452612cc0816020860160208601612c7c565b601f01601f19169290920160200192915050565b6020815260006120316020830184612ca8565b6001600160a01b0391909116815260200190565b60008060408385031215612d0e57600080fd5b8235612d1981612c37565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d6557612d65612d27565b604052919050565b60006001600160401b03831115612d8657612d86612d27565b612d99601f8401601f1916602001612d3d565b9050828152838383011115612dad57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612dd557600080fd5b61203183833560208501612d6d565b600080600080600060a08688031215612dfc57600080fd5b8535612e0781612c37565b945060208601356001600160401b03811115612e2257600080fd5b612e2e88828901612dc4565b9450506040860135925060608601359150608086013560ff81168114612e5357600080fd5b809150509295509295909350565b600060208284031215612e7357600080fd5b813561203181612c37565b600080600060608486031215612e9357600080fd5b8335612e9e81612c37565b92506020840135612eae81612c37565b929592945050506040919091013590565b600060208284031215612ed157600080fd5b81356001600160401b03811115612ee757600080fd5b8201601f81018413612ef857600080fd5b611bcb84823560208401612d6d565b60008060408385031215612f1a57600080fd5b50508035926020909101359150565b60008060408385031215612f3c57600080fd5b8235612f4781612c37565b915060208301358015158114612c7157600080fd5b60008060008060808587031215612f7257600080fd5b8435612f7d81612c37565b93506020850135612f8d81612c37565b92506040850135915060608501356001600160401b03811115612faf57600080fd5b612fbb87828801612dc4565b91505092959194509250565b600082601f830112612fd857600080fd5b813560206001600160401b03821115612ff357612ff3612d27565b8160051b613002828201612d3d565b928352848101820192828101908785111561301c57600080fd5b83870192505b8483101561303b57823582529183019190830190613022565b979650505050505050565b6000806040838503121561305957600080fd5b82356001600160401b038082111561307057600080fd5b61307c86838701612fc7565b9350602085013591508082111561309257600080fd5b5061309f85828601612fc7565b9150509250929050565b600080604083850312156130bc57600080fd5b82356130c781612c37565b91506020830135612c7181612c37565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156131355761313561310c565b500190565b600060001982141561314e5761314e61310c565b5060010190565b600181811c9082168061316957607f821691505b6020821081141561318a57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906131bc90830184612ca8565b95945050505050565b600081516131d7818560208601612c7c565b9290920192915050565b600083516131f3818460208801612c7c565b60609390931b6001600160601b0319169190920190815260140192915050565b60008251613225818460208701612c7c565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156132a857600080fd5b5051919050565b6000828210156132c1576132c161310c565b500390565b6020808252601d908201527f5374617274696e6720696e64657820697320616c726561647920736574000000604082015260600190565b600080845481600182811c91508083168061331957607f831692505b602080841082141561333957634e487b7160e01b86526022600452602486fd5b81801561334d576001811461335e5761338b565b60ff1986168952848901965061338b565b60008b81526020902060005b868110156133835781548b82015290850190830161336a565b505084890196505b5050505050506131bc61339e82866131c5565b64173539b7b760d91b815260050190565b6000602082840312156133c157600080fd5b815161203181612c37565b634e487b7160e01b600052601260045260246000fd5b6000826133f1576133f16133cc565b500690565b600082613405576134056133cc565b500490565b60008160001904831182151516156134245761342461310c565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134ae90830184612ca8565b9695505050505050565b6000602082840312156134ca57600080fd5b815161203181612c04565b634e487b7160e01b600052603160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529697066733a2f2f516d5a7937745465506e397567636657655470416254314d6a383777555a64447a31553878483537586f70327a33a2646970667358221220c7f27567d875a108746ea14ecd10cb25bffdae9853eff8607d5e5ef417d3902464736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000061b59df0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000d07dc4262bcdbf85190c01c996b4c06a461d2430000000000000000000000000000000000000000000000000000000000000000d4469676974616c20536967696c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4469676974616c20536967696c00000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025f5760003560e01c806370a082311161014057806370a082311461059c578063715018a6146105bc57806371f9c534146105d157806377e92e77146105e75780637a1cbd3f146106075780637d17fcbe146106275780637f4e465f1461063c5780638da5cb5b1461065c57806395d89b4114610671578063977b055b14610686578063a0712d681461069b578063a22cb465146106ae578063b2b42378146106ce578063b88d4fde146106ee578063bcb4b3c81461070e578063c87b56dd1461072e578063cb774d471461074e578063d5abeb0114610764578063d9589fd11461077a578063e36d64981461079a578063e8a3d485146107b0578063e985e9c5146107c5578063e9866550146107e5578063eb8d2444146107fa578063f2fde38b14610814578063f4a0a5281461083457600080fd5b8063018a2c371461026457806301ffc9a71461028657806303339bcb146102bb57806306fdde03146102db578063081812fc146102fd578063095ea7b31461032a5780630c53c51c1461034a5780630f7e59701461035d57806312f261401461038a57806318160ddd146103aa57806320379ee5146103c957806323b872dd146103de5780632d0335ab146103fe5780632d3df31f146104345780632f745c591461043c5780633408e4701461045c57806334918dfd1461046f5780633af32abf146104845780633ccfd60b146104bb57806342842e0e146104d05780634f6ccce7146104f057806355f804b314610510578063626a15bd146105305780636352211e146105465780636817c76c146105665780636f8b44b01461057c575b600080fd5b34801561027057600080fd5b5061028461027f366004612beb565b610854565b005b34801561029257600080fd5b506102a66102a1366004612c1a565b6108a1565b60405190151581526020015b60405180910390f35b3480156102c757600080fd5b506102846102d6366004612c4c565b6108cc565b3480156102e757600080fd5b506102f061094e565b6040516102b29190612cd4565b34801561030957600080fd5b5061031d610318366004612beb565b6109e0565b6040516102b29190612ce7565b34801561033657600080fd5b50610284610345366004612cfb565b610a68565b6102f0610358366004612de4565b610b8b565b34801561036957600080fd5b506102f0604051806040016040528060018152602001603160f81b81525081565b34801561039657600080fd5b506102846103a5366004612e61565b610d74565b3480156103b657600080fd5b506008545b6040519081526020016102b2565b3480156103d557600080fd5b50600b546103bb565b3480156103ea57600080fd5b506102846103f9366004612e7e565b610dd5565b34801561040a57600080fd5b506103bb610419366004612e61565b6001600160a01b03166000908152600c602052604090205490565b610284610e0d565b34801561044857600080fd5b506103bb610457366004612cfb565b610eba565b34801561046857600080fd5b50466103bb565b34801561047b57600080fd5b50610284610f50565b34801561049057600080fd5b506104a461049f366004612e61565b610fa3565b6040805192151583526020830191909152016102b2565b3480156104c757600080fd5b50610284611184565b3480156104dc57600080fd5b506102846104eb366004612e7e565b611284565b3480156104fc57600080fd5b506103bb61050b366004612beb565b61129f565b34801561051c57600080fd5b5061028461052b366004612ebf565b611332565b34801561053c57600080fd5b506103bb60195481565b34801561055257600080fd5b5061031d610561366004612beb565b611384565b34801561057257600080fd5b506103bb60165481565b34801561058857600080fd5b50610284610597366004612beb565b6113fb565b3480156105a857600080fd5b506103bb6105b7366004612e61565b61143f565b3480156105c857600080fd5b506102846114c6565b3480156105dd57600080fd5b506103bb601a5481565b3480156105f357600080fd5b50610284610602366004612f07565b611511565b34801561061357600080fd5b50610284610622366004612beb565b611574565b34801561063357600080fd5b506102846115b8565b34801561064857600080fd5b506102a6610657366004612beb565b61161d565b34801561066857600080fd5b5061031d611676565b34801561067d57600080fd5b506102f0611685565b34801561069257600080fd5b506103bb600681565b6102846106a9366004612beb565b611694565b3480156106ba57600080fd5b506102846106c9366004612f29565b611758565b3480156106da57600080fd5b506102a66106e9366004612e61565b611856565b3480156106fa57600080fd5b50610284610709366004612f5c565b6118e2565b34801561071a57600080fd5b50610284610729366004613046565b61191b565b34801561073a57600080fd5b506102f0610749366004612beb565b611a6a565b34801561075a57600080fd5b506103bb60155481565b34801561077057600080fd5b506103bb60175481565b34801561078657600080fd5b506103bb610795366004612beb565b611ab4565b3480156107a657600080fd5b506103bb60145481565b3480156107bc57600080fd5b506102f0611aee565b3480156107d157600080fd5b506102a66107e03660046130a9565b611b0e565b3480156107f157600080fd5b50610284611bd3565b34801561080657600080fd5b506018546102a69060ff1681565b34801561082057600080fd5b5061028461082f366004612e61565b611ce3565b34801561084057600080fd5b5061028461084f366004612beb565b611d90565b61085c611e31565b6001600160a01b031661086d611676565b6001600160a01b03161461089c5760405162461bcd60e51b8152600401610893906130d7565b60405180910390fd5b601a55565b60006001600160e01b0319821663780e9d6360e01b14806108c657506108c682611e40565b92915050565b6108d4611e31565b6001600160a01b03166108e5611676565b6001600160a01b03161461090b5760405162461bcd60e51b8152600401610893906130d7565b600061091660085490565b905060005b8381101561094857610936836109318385613122565b611e90565b806109408161313a565b91505061091b565b50505050565b60606000805461095d90613155565b80601f016020809104026020016040519081016040528092919081815260200182805461098990613155565b80156109d65780601f106109ab576101008083540402835291602001916109d6565b820191906000526020600020905b8154815290600101906020018083116109b957829003601f168201915b5050505050905090565b60006109eb82611eaa565b610a4c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610893565b506000908152600460205260409020546001600160a01b031690565b6000610a7382611384565b9050806001600160a01b0316836001600160a01b03161415610ae15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610893565b806001600160a01b0316610af3611e31565b6001600160a01b03161480610b0f5750610b0f816107e0611e31565b610b7c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610893565b610b868383611ec7565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610bc98782878787611f35565b610c1f5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610893565b6001600160a01b0387166000908152600c6020526040902054610c43906001612025565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c9390899033908a90613190565b60405180910390a1600080306001600160a01b0316888a604051602001610cbb9291906131e1565b60408051601f1981840301815290829052610cd591613213565b6000604051808303816000865af19150503d8060008114610d12576040519150601f19603f3d011682016040523d82523d6000602084013e610d17565b606091505b509150915081610d685760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b6044820152606401610893565b98975050505050505050565b610d7c611e31565b6001600160a01b0316610d8d611676565b6001600160a01b031614610db35760405162461bcd60e51b8152600401610893906130d7565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b610de6610de0611e31565b82612038565b610e025760405162461bcd60e51b81526004016108939061322f565b610b868383836120fa565b600080610e1933610fa3565b9092509050600182151514610e625760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610893565b6000818152601260205260408120805460019290610e81908490613122565b9091555050336000908152601360205260408120805460019290610ea6908490613122565b90915550610eb6905060016122a5565b5050565b6000610ec58361143f565b8210610f275760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610893565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610f58611e31565b6001600160a01b0316610f69611676565b6001600160a01b031614610f8f5760405162461bcd60e51b8152600401610893906130d7565b6018805460ff19811660ff90911615179055565b6000806000805b600f548110156111775760108181548110610fc757610fc7613280565b906000526020600020015460126000600f8481548110610fe957610fe9613280565b9060005260206000200154815260200190815260200160002054101561111a57600e54600f805461110d926001600160a01b03169162fdd58e918991908690811061103657611036613280565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561108b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110af9190613296565b60126000600f85815481106110c6576110c6613280565b9060005260206000200154815260200190815260200160002054601084815481106110f3576110f3613280565b906000526020600020015461110891906132af565b61242b565b6111179083613122565b91505b6001600160a01b038516600090815260136020526040902054821115611165576001600f828154811061114f5761114f613280565b9060005260206000200154935093505050915091565b8061116f8161313a565b915050610faa565b5060009485945092505050565b61118c611e31565b6001600160a01b031661119d611676565b6001600160a01b0316146111c35760405162461bcd60e51b8152600401610893906130d7565b601c5447906001600160a01b03166108fc6111df836004612441565b6040518115909202916000818181858888f19350505050158015611207573d6000803e3d6000fd5b50601d546001600160a01b03166108fc611222836004612441565b6040518115909202916000818181858888f1935050505015801561124a573d6000803e3d6000fd5b50601e546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610eb6573d6000803e3d6000fd5b610b86838383604051806020016040528060008152506118e2565b60006112aa60085490565b821061130d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610893565b6008828154811061132057611320613280565b90600052602060002001549050919050565b61133a611e31565b6001600160a01b031661134b611676565b6001600160a01b0316146113715760405162461bcd60e51b8152600401610893906130d7565b8051610eb690601b906020840190612b52565b6000818152600260205260408120546001600160a01b0316806108c65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610893565b611403611e31565b6001600160a01b0316611414611676565b6001600160a01b03161461143a5760405162461bcd60e51b8152600401610893906130d7565b601755565b60006001600160a01b0382166114aa5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610893565b506001600160a01b031660009081526003602052604090205490565b6114ce611e31565b6001600160a01b03166114df611676565b6001600160a01b0316146115055760405162461bcd60e51b8152600401610893906130d7565b61150f600061244d565b565b611519611e31565b6001600160a01b031661152a611676565b6001600160a01b0316146115505760405162461bcd60e51b8152600401610893906130d7565b806010838154811061156457611564613280565b6000918252602090912001555050565b61157c611e31565b6001600160a01b031661158d611676565b6001600160a01b0316146115b35760405162461bcd60e51b8152600401610893906130d7565b601955565b6115c0611e31565b6001600160a01b03166115d1611676565b6001600160a01b0316146115f75760405162461bcd60e51b8152600401610893906130d7565b601554156116175760405162461bcd60e51b8152600401610893906132c6565b43601455565b60006010828154811061163257611632613280565b906000526020600020015460126000600f858154811061165457611654613280565b9060005260206000200154815260200190815260200160002054109050919050565b600a546001600160a01b031690565b60606001805461095d90613155565b60068111156116ef5760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6044820152606560f81b6064820152608401610893565b60165434906116fe908361249f565b111561174c5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610893565b611755816122a5565b50565b611760611e31565b6001600160a01b0316826001600160a01b031614156117bd5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610893565b80600560006117ca611e31565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561180e611e31565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184a911515815260200190565b60405180910390a35050565b600080805b600f548110156118bf5761186e8161161d565b156118ad57600e54600f80546118a0926001600160a01b03169162fdd58e918891908690811061103657611036613280565b6118aa9083613122565b91505b806118b78161313a565b91505061185b565b506001600160a01b03909216600090815260136020526040902054909111919050565b6118f36118ed611e31565b83612038565b61190f5760405162461bcd60e51b81526004016108939061322f565b610948848484846124ab565b611923611e31565b6001600160a01b0316611934611676565b6001600160a01b03161461195a5760405162461bcd60e51b8152600401610893906130d7565b805182511461199c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b6044820152606401610893565b60005b8251811015610b8657600f8382815181106119bc576119bc613280565b6020908102919091018101518254600181018455600093845291909220015581516010908390839081106119f2576119f2613280565b6020908102919091018101518254600181810185556000948552928420015584519091601191869085908110611a2a57611a2a613280565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a629061313a565b91505061199f565b6060601a54421015611a8357611a7e611aee565b6108c6565b601b611a8e836124de565b604051602001611a9f9291906132fd565b60405160208183030381529060405292915050565b600060126000600f8481548110611acd57611acd613280565b90600052602060002001548152602001908152602001600020549050919050565b606060405180606001604052806035815260200161352f60359139905090565b600d5460405163c455279160e01b81526000916001600160a01b039081169190841690829063c455279190611b47908890600401612ce7565b602060405180830381865afa158015611b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8891906133af565b6001600160a01b03161415611ba15760019150506108c6565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611bdb611e31565b6001600160a01b0316611bec611676565b6001600160a01b031614611c125760405162461bcd60e51b8152600401610893906130d7565b60155415611c325760405162461bcd60e51b8152600401610893906132c6565b601454611c815760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610893565b601754601454611c929190406133e2565b60155560145460ff90611ca69043906125db565b1115611cc957601754611cba6001436132af565b611cc59190406133e2565b6015555b60155461150f57601554611cde906001612025565b601555565b611ceb611e31565b6001600160a01b0316611cfc611676565b6001600160a01b031614611d225760405162461bcd60e51b8152600401610893906130d7565b6001600160a01b038116611d875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610893565b6117558161244d565b611d98611e31565b6001600160a01b0316611da9611676565b6001600160a01b031614611dcf5760405162461bcd60e51b8152600401610893906130d7565b601655565b600033301415611e2b57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611e2e9050565b50335b90565b6000611e3b611dd4565b905090565b60006001600160e01b031982166380ac58cd60e01b1480611e7157506001600160e01b03198216635b5e139f60e01b145b806108c657506301ffc9a760e01b6001600160e01b03198316146108c6565b610eb68282604051806020016040528060008152506125e7565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611efc82611384565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611f9b5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610893565b6001611fae611fa98761261a565b612697565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611ffc573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006120318284613122565b9392505050565b600061204382611eaa565b6120a45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610893565b60006120af83611384565b9050806001600160a01b0316846001600160a01b031614806120ea5750836001600160a01b03166120df846109e0565b6001600160a01b0316145b80611bcb5750611bcb8185611b0e565b826001600160a01b031661210d82611384565b6001600160a01b0316146121755760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610893565b6001600160a01b0382166121d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610893565b6121e28383836126c7565b6121ed600082611ec7565b6001600160a01b03831660009081526003602052604081208054600192906122169084906132af565b90915550506001600160a01b0382166000908152600360205260408120805460019290612244908490613122565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60185460ff1680156122b957506019544210155b6123035760405162461bcd60e51b815260206004820152601b60248201527a14d85b19481b5d5cdd081899481858dd1a5d99481d1bc81b5a5b9d602a1b6044820152606401610893565b60068111156123545760405162461bcd60e51b815260206004820181905260248201527f43616e206f6e6c79206d696e74203620746f6b656e7320617420612074696d656044820152606401610893565b60175461236a8261236460085490565b90612025565b11156123b85760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610893565b60005b818110156123ff5760006123ce60085490565b90506017546123dc60085490565b10156123ec576123ec3382611e90565b50806123f78161313a565b9150506123bb565b5060145415801561241f5750601754600854148061241f5750601a544210155b15611755574360145550565b600081831061243a5781612031565b5090919050565b600061203182846133f6565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612031828461340a565b6124b68484846120fa565b6124c28484848461277f565b6109485760405162461bcd60e51b815260040161089390613429565b6060816125025750506040805180820190915260018152600360fc1b602082015290565b8160005b811561252c57806125168161313a565b91506125259050600a836133f6565b9150612506565b6000816001600160401b0381111561254657612546612d27565b6040519080825280601f01601f191660200182016040528015612570576020820181803683370190505b5090505b8415611bcb576125856001836132af565b9150612592600a866133e2565b61259d906030613122565b60f81b8183815181106125b2576125b2613280565b60200101906001600160f81b031916908160001a9053506125d4600a866133f6565b9450612574565b600061203182846132af565b6125f18383612884565b6125fe600084848461277f565b610b865760405162461bcd60e51b815260040161089390613429565b60006040518060800160405280604381526020016134ec604391398051602091820120835184830151604080870151805190860120905161267a950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006126a2600b5490565b60405161190160f01b602082015260228101919091526042810183905260620161267a565b6001600160a01b0383166127225761271d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612745565b816001600160a01b0316836001600160a01b0316146127455761274583826129c2565b6001600160a01b03821661275c57610b8681612a5f565b826001600160a01b0316826001600160a01b031614610b8657610b868282612b0e565b60006001600160a01b0384163b1561287957836001600160a01b031663150b7a026127a8611e31565b8786866040518563ffffffff1660e01b81526004016127ca949392919061347b565b6020604051808303816000875af1925050508015612805575060408051601f3d908101601f19168201909252612802918101906134b8565b60015b61285f573d808015612833576040519150601f19603f3d011682016040523d82523d6000602084013e612838565b606091505b5080516128575760405162461bcd60e51b815260040161089390613429565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bcb565b506001949350505050565b6001600160a01b0382166128da5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610893565b6128e381611eaa565b1561292f5760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610893565b61293b600083836126c7565b6001600160a01b0382166000908152600360205260408120805460019290612964908490613122565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016129cf8461143f565b6129d991906132af565b600083815260076020526040902054909150808214612a2c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612a71906001906132af565b60008381526009602052604081205460088054939450909284908110612a9957612a99613280565b906000526020600020015490508060088381548110612aba57612aba613280565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612af257612af26134d5565b6001900381819060005260206000200160009055905550505050565b6000612b198361143f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612b5e90613155565b90600052602060002090601f016020900481019282612b805760008555612bc6565b82601f10612b9957805160ff1916838001178555612bc6565b82800160010185558215612bc6579182015b82811115612bc6578251825591602001919060010190612bab565b50612bd2929150612bd6565b5090565b5b80821115612bd25760008155600101612bd7565b600060208284031215612bfd57600080fd5b5035919050565b6001600160e01b03198116811461175557600080fd5b600060208284031215612c2c57600080fd5b813561203181612c04565b6001600160a01b038116811461175557600080fd5b60008060408385031215612c5f57600080fd5b823591506020830135612c7181612c37565b809150509250929050565b60005b83811015612c97578181015183820152602001612c7f565b838111156109485750506000910152565b60008151808452612cc0816020860160208601612c7c565b601f01601f19169290920160200192915050565b6020815260006120316020830184612ca8565b6001600160a01b0391909116815260200190565b60008060408385031215612d0e57600080fd5b8235612d1981612c37565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d6557612d65612d27565b604052919050565b60006001600160401b03831115612d8657612d86612d27565b612d99601f8401601f1916602001612d3d565b9050828152838383011115612dad57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612dd557600080fd5b61203183833560208501612d6d565b600080600080600060a08688031215612dfc57600080fd5b8535612e0781612c37565b945060208601356001600160401b03811115612e2257600080fd5b612e2e88828901612dc4565b9450506040860135925060608601359150608086013560ff81168114612e5357600080fd5b809150509295509295909350565b600060208284031215612e7357600080fd5b813561203181612c37565b600080600060608486031215612e9357600080fd5b8335612e9e81612c37565b92506020840135612eae81612c37565b929592945050506040919091013590565b600060208284031215612ed157600080fd5b81356001600160401b03811115612ee757600080fd5b8201601f81018413612ef857600080fd5b611bcb84823560208401612d6d565b60008060408385031215612f1a57600080fd5b50508035926020909101359150565b60008060408385031215612f3c57600080fd5b8235612f4781612c37565b915060208301358015158114612c7157600080fd5b60008060008060808587031215612f7257600080fd5b8435612f7d81612c37565b93506020850135612f8d81612c37565b92506040850135915060608501356001600160401b03811115612faf57600080fd5b612fbb87828801612dc4565b91505092959194509250565b600082601f830112612fd857600080fd5b813560206001600160401b03821115612ff357612ff3612d27565b8160051b613002828201612d3d565b928352848101820192828101908785111561301c57600080fd5b83870192505b8483101561303b57823582529183019190830190613022565b979650505050505050565b6000806040838503121561305957600080fd5b82356001600160401b038082111561307057600080fd5b61307c86838701612fc7565b9350602085013591508082111561309257600080fd5b5061309f85828601612fc7565b9150509250929050565b600080604083850312156130bc57600080fd5b82356130c781612c37565b91506020830135612c7181612c37565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156131355761313561310c565b500190565b600060001982141561314e5761314e61310c565b5060010190565b600181811c9082168061316957607f821691505b6020821081141561318a57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906131bc90830184612ca8565b95945050505050565b600081516131d7818560208601612c7c565b9290920192915050565b600083516131f3818460208801612c7c565b60609390931b6001600160601b0319169190920190815260140192915050565b60008251613225818460208701612c7c565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156132a857600080fd5b5051919050565b6000828210156132c1576132c161310c565b500390565b6020808252601d908201527f5374617274696e6720696e64657820697320616c726561647920736574000000604082015260600190565b600080845481600182811c91508083168061331957607f831692505b602080841082141561333957634e487b7160e01b86526022600452602486fd5b81801561334d576001811461335e5761338b565b60ff1986168952848901965061338b565b60008b81526020902060005b868110156133835781548b82015290850190830161336a565b505084890196505b5050505050506131bc61339e82866131c5565b64173539b7b760d91b815260050190565b6000602082840312156133c157600080fd5b815161203181612c37565b634e487b7160e01b600052601260045260246000fd5b6000826133f1576133f16133cc565b500690565b600082613405576134056133cc565b500490565b60008160001904831182151516156134245761342461310c565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134ae90830184612ca8565b9695505050505050565b6000602082840312156134ca57600080fd5b815161203181612c04565b634e487b7160e01b600052603160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529697066733a2f2f516d5a7937745465506e397567636657655470416254314d6a383777555a64447a31553878483537586f70327a33a2646970667358221220c7f27567d875a108746ea14ecd10cb25bffdae9853eff8607d5e5ef417d3902464736f6c634300080a0033

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000061b59df0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000d07dc4262bcdbf85190c01c996b4c06a461d2430000000000000000000000000000000000000000000000000000000000000000d4469676974616c20536967696c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4469676974616c20536967696c00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Digital Sigil
Arg [1] : symbol (string): Digital Sigil
Arg [2] : maxNftSupply (uint256): 3333
Arg [3] : saleStart (uint256): 1639292400
Arg [4] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [5] : _whitelistContract (address): 0xd07dc4262BCDbf85190C01c996b4C06a461d2430

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000d05
Arg [3] : 0000000000000000000000000000000000000000000000000000000061b59df0
Arg [4] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [5] : 000000000000000000000000d07dc4262bcdbf85190c01c996b4c06a461d2430
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [7] : 4469676974616c20536967696c00000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [9] : 4469676974616c20536967696c00000000000000000000000000000000000000


Deployed Bytecode Sourcemap

438:8376:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4495:108;;;;;;;;;;-1:-1:-1;4495:108:3;;;;;:::i;:::-;;:::i;:::-;;909:222:7;;;;;;;;;;-1:-1:-1;909:222:7;;;;;:::i;:::-;;:::i;:::-;;;750:14:20;;743:22;725:41;;713:2;698:18;909:222:7;;;;;;;;4167:212:3;;;;;;;;;;-1:-1:-1;4167:212:3;;;;;:::i;:::-;;:::i;2349:98:6:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3860:217::-;;;;;;;;;;-1:-1:-1;3860:217:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3398:401::-;;;;;;;;;;-1:-1:-1;3398:401:6;;;;;:::i;:::-;;:::i;950:1117:16:-;;;;;;:::i;:::-;;:::i;288:43:4:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;288:43:4;;;;;2569:140:3;;;;;;;;;;-1:-1:-1;2569:140:3;;;;;:::i;:::-;;:::i;1534:111:7:-;;;;;;;;;;-1:-1:-1;1621:10:7;:17;1534:111;;;4944:25:20;;;4932:2;4917:18;1534:111:7;4798:177:20;1264:99:4;;;;;;;;;;-1:-1:-1;1341:15:4;;1264:99;;4724:330:6;;;;;;;;;;-1:-1:-1;4724:330:6;;;;;:::i;:::-;;:::i;2475:105:16:-;;;;;;;;;;-1:-1:-1;2475:105:16;;;;;:::i;:::-;-1:-1:-1;;;;;2561:12:16;2528:13;2561:12;;;:6;:12;;;;;;;2475:105;5645:306:3;;;:::i;1210:253:7:-;;;;;;;;;;-1:-1:-1;1210:253:7;;;;;:::i;:::-;;:::i;1369:155:4:-;;;;;;;;;;-1:-1:-1;1480:9:4;1369:155;;4900:87:3;;;;;;;;;;;;;:::i;4993:646::-;;;;;;;;;;-1:-1:-1;4993:646:3;;;;;:::i;:::-;;:::i;:::-;;;;5816:14:20;;5809:22;5791:41;;5863:2;5848:18;;5841:34;;;;5764:18;4993:646:3;5623:258:20;2322:241:3;;;;;;;;;;;;;:::i;5120:179:6:-;;;;;;;;;;-1:-1:-1;5120:179:6;;;;;:::i;:::-;;:::i;1717:230:7:-;;;;;;;;;;-1:-1:-1;1717:230:7;;;;;:::i;:::-;;:::i;4799:95:3:-;;;;;;;;;;-1:-1:-1;4799:95:3;;;;;:::i;:::-;;:::i;1284:28::-;;;;;;;;;;;;;;;;2052:235:6;;;;;;;;;;-1:-1:-1;2052:235:6;;;;;:::i;:::-;;:::i;1122:39:3:-;;;;;;;;;;;;;;;;4703:90;;;;;;;;;;-1:-1:-1;4703:90:3;;;;;:::i;:::-;;:::i;1790:205:6:-;;;;;;;;;;-1:-1:-1;1790:205:6;;;;;:::i;:::-;;:::i;1598:92:17:-;;;;;;;;;;;;;:::i;1318:30:3:-;;;;;;;;;;;;;;;;3122:143;;;;;;;;;;-1:-1:-1;3122:143:3;;;;;:::i;:::-;;:::i;4385:104::-;;;;;;;;;;-1:-1:-1;4385:104:3;;;;;:::i;:::-;;:::i;7682:180::-;;;;;;;;;;;;;:::i;3271:197::-;;;;;;;;;;-1:-1:-1;3271:197:3;;;;;:::i;:::-;;:::i;966:85:17:-;;;;;;;;;;;;;:::i;2511:102:6:-;;;;;;;;;;;;;:::i;1169:39:3:-;;;;;;;;;;;;1207:1;1169:39;;5957:351;;;;;;:::i;:::-;;:::i;4144:290:6:-;;;;;;;;;;-1:-1:-1;4144:290:6;;;;;:::i;:::-;;:::i;3474:516:3:-;;;;;;;;;;-1:-1:-1;3474:516:3;;;;;:::i;:::-;;:::i;5365:320:6:-;;;;;;;;;;-1:-1:-1;5365:320:6;;;;;:::i;:::-;;:::i;2715:401:3:-;;;;;;;;;;-1:-1:-1;2715:401:3;;;;;:::i;:::-;;:::i;7868:276::-;;;;;;;;;;-1:-1:-1;7868:276:3;;;;;:::i;:::-;;:::i;1087:28::-;;;;;;;;;;;;;;;;1215:24;;;;;;;;;;;;;;;;3996:165;;;;;;;;;;-1:-1:-1;3996:165:3;;;;;:::i;:::-;;:::i;1047:33::-;;;;;;;;;;;;;;;;8674:138;;;;;;;;;;;;;:::i;8150:394::-;;;;;;;;;;-1:-1:-1;8150:394:3;;;;;:::i;:::-;;:::i;7159:517::-;;;;;;;;;;;;;:::i;1246:31::-;;;;;;;;;;-1:-1:-1;1246:31:3;;;;;;;;1839:189:17;;;;;;;;;;-1:-1:-1;1839:189:17;;;;;:::i;:::-;;:::i;4609:88:3:-;;;;;;;;;;-1:-1:-1;4609:88:3;;;;;:::i;:::-;;:::i;4495:108::-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;;;;;;;;;4569:15:3::1;:27:::0;4495:108::o;909:222:7:-;1011:4;-1:-1:-1;;;;;;1034:50:7;;-1:-1:-1;;;1034:50:7;;:90;;;1088:36;1112:11;1088:23;:36::i;:::-;1027:97;909:222;-1:-1:-1;;909:222:7:o;4167:212:3:-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;4237:14:3::1;4254:13;1621:10:7::0;:17;;1534:111;4254:13:3::1;4237:30;;4277:9;4296:77;4312:3;4308:1;:7;4296:77;;;4336:26;4346:3:::0;4351:10:::1;4360:1:::0;4351:6;:10:::1;:::i;:::-;4336:9;:26::i;:::-;4317:3:::0;::::1;::::0;::::1;:::i;:::-;;;;4296:77;;;4227:152;;4167:212:::0;;:::o;2349:98:6:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;-1:-1:-1;;;3955:73:6;;10748:2:20;3955:73:6;;;10730:21:20;10787:2;10767:18;;;10760:30;10826:34;10806:18;;;10799:62;-1:-1:-1;;;10877:18:20;;;10870:42;10929:19;;3955:73:6;10546:408:20;3955:73:6;-1:-1:-1;4046:24:6;;;;:15;:24;;;;;;-1:-1:-1;;;;;4046:24:6;;3860:217::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;-1:-1:-1;;;;;3535:11:6;:2;-1:-1:-1;;;;;3535:11:6;;;3527:57;;;;-1:-1:-1;;;3527:57:6;;11161:2:20;3527:57:6;;;11143:21:20;11200:2;11180:18;;;11173:30;11239:34;11219:18;;;11212:62;-1:-1:-1;;;11290:18:20;;;11283:31;11331:19;;3527:57:6;10959:397:20;3527:57:6;3632:5;-1:-1:-1;;;;;3616:21:6;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3616:21:6;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;3641:37::-;3595:165;;;;-1:-1:-1;;;3595:165:6;;11563:2:20;3595:165:6;;;11545:21:20;11602:2;11582:18;;;11575:30;11641:34;11621:18;;;11614:62;-1:-1:-1;;;11692:18:20;;;11685:54;11756:19;;3595:165:6;11361:420:20;3595:165:6;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3468:331;3398:401;;:::o;950:1117:16:-;1201:148;;;1145:12;1201:148;;;;;-1:-1:-1;;;;;1238:19:16;;1169:29;1238:19;;;:6;:19;;;;;;;;;1201:148;;;;;;;;;;;1381:45;1245:11;1201:148;1409:4;1415;1421;1381:6;:45::i;:::-;1360:125;;;;-1:-1:-1;;;1360:125:16;;11988:2:20;1360:125:16;;;11970:21:20;12027:2;12007:18;;;12000:30;12066:34;12046:18;;;12039:62;-1:-1:-1;;;12117:18:20;;;12110:31;12158:19;;1360:125:16;11786:397:20;1360:125:16;-1:-1:-1;;;;;1571:19:16;;;;;;:6;:19;;;;;;:26;;1595:1;1571:23;:26::i;:::-;-1:-1:-1;;;;;1549:19:16;;;;;;:6;:19;;;;;;;:48;;;;1613:122;;;;;1556:11;;1683:10;;1708:17;;1613:122;:::i;:::-;;;;;;;;1843:12;1857:23;1892:4;-1:-1:-1;;;;;1884:18:16;1933:17;1952:11;1916:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1916:48:16;;;;;;;;;;1884:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1842:132;;;;1992:7;1984:48;;;;-1:-1:-1;;;1984:48:16;;13707:2:20;1984:48:16;;;13689:21:20;13746:2;13726:18;;;13719:30;-1:-1:-1;;;13765:18:20;;;13758:58;13833:18;;1984:48:16;13505:352:20;1984:48:16;2050:10;950:1117;-1:-1:-1;;;;;;;;950:1117:16:o;2569:140:3:-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;2654:17:3::1;:48:::0;;-1:-1:-1;;;;;;2654:48:3::1;-1:-1:-1::0;;;;;2654:48:3;;;::::1;::::0;;;::::1;::::0;;2569:140::o;4724:330:6:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;-1:-1:-1;;;4905:103:6;;;;;;;:::i;:::-;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;5645:306:3:-;5696:19;5717:15;5736:25;5750:10;5736:13;:25::i;:::-;5695:66;;-1:-1:-1;5695:66:3;-1:-1:-1;5797:4:3;5779:22;;;;5771:50;;;;-1:-1:-1;;;5771:50:3;;14482:2:20;5771:50:3;;;14464:21:20;14521:2;14501:18;;;14494:30;-1:-1:-1;;;14540:18:20;;;14533:45;14595:18;;5771:50:3;14280:339:20;5771:50:3;5831:32;;;;:23;:32;;;;;:37;;5867:1;;5831:32;:37;;5867:1;;5831:37;:::i;:::-;;;;-1:-1:-1;;5899:10:3;5878:32;;;;:20;:32;;;;;:37;;5914:1;;5878:32;:37;;5914:1;;5878:37;:::i;:::-;;;;-1:-1:-1;5925:19:3;;-1:-1:-1;5942:1:3;5925:16;:19::i;:::-;5685:266;;5645:306::o;1210:253:7:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;-1:-1:-1;;;1326:87:7;;14826:2:20;1326:87:7;;;14808:21:20;14865:2;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;-1:-1:-1;;;14955:18:20;;;14948:41;15006:19;;1326:87:7;14624:407:20;1326:87:7;-1:-1:-1;;;;;;1430:19:7;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1210:253::o;4900:87:3:-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;4968:12:3::1;::::0;;-1:-1:-1;;4952:28:3;::::1;4968:12;::::0;;::::1;4967:13;4952:28;::::0;;4900:87::o;4993:646::-;5051:4;5057:7;5076:20;5115:9;5110:496;5134:20;:27;5130:31;;5110:496;;;5237:26;5264:1;5237:29;;;;;;;;:::i;:::-;;;;;;;;;5186:23;:48;5210:20;5231:1;5210:23;;;;;;;;:::i;:::-;;;;;;;;;5186:48;;;;;;;;;;;;:80;5182:283;;;5311:17;;5345:20;:23;;5302:148;;-1:-1:-1;;;;;5311:17:3;;:27;;5339:4;;5345:20;5366:1;;5345:23;;;;;;:::i;:::-;;;;;;;;;;;5311:58;;-1:-1:-1;;;;;;5311:58:3;;;;;;;-1:-1:-1;;;;;15360:32:20;;;5311:58:3;;;15342:51:20;15409:18;;;15402:34;15315:18;;5311:58:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5401:23;:48;5425:20;5446:1;5425:23;;;;;;;;:::i;:::-;;;;;;;;;5401:48;;;;;;;;;;;;5371:26;5398:1;5371:29;;;;;;;;:::i;:::-;;;;;;;;;:78;;;;:::i;:::-;5302:8;:148::i;:::-;5286:164;;;;:::i;:::-;;;5182:283;-1:-1:-1;;;;;5497:26:3;;;;;;:20;:26;;;;;;5482:41;;5478:118;;;5551:4;5557:20;5578:1;5557:23;;;;;;;;:::i;:::-;;;;;;;;;5543:38;;;;;;4993:646;;;:::o;5478:118::-;5163:3;;;;:::i;:::-;;;;5110:496;;;-1:-1:-1;5623:5:3;;;;-1:-1:-1;4993:646:3;-1:-1:-1;;;4993:646:3:o;2322:241::-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;2426:3:3::1;::::0;2387:21:::1;::::0;-1:-1:-1;;;;;2426:3:3::1;2418:37;2440:14;2387:21:::0;2452:1:::1;2440:11;:14::i;:::-;2418:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;2473:3:3::1;::::0;-1:-1:-1;;;;;2473:3:3::1;2465:37;2487:14;:7:::0;2499:1:::1;2487:11;:14::i;:::-;2465:37;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;2520:3:3::1;::::0;2512:44:::1;::::0;-1:-1:-1;;;;;2520:3:3;;::::1;::::0;2534:21:::1;2512:44:::0;::::1;;;::::0;2520:3:::1;2512:44:::0;2520:3;2512:44;2534:21;2520:3;2512:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;5120:179:6::0;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;1717:230:7:-;1792:7;1827:30;1621:10;:17;;1534:111;1827:30;1819:5;:38;1811:95;;;;-1:-1:-1;;;1811:95:7;;15968:2:20;1811:95:7;;;15950:21:20;16007:2;15987:18;;;15980:30;16046:34;16026:18;;;16019:62;-1:-1:-1;;;16097:18:20;;;16090:42;16149:19;;1811:95:7;15766:408:20;1811:95:7;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;1916:24;;1717:230;;;:::o;4799:95:3:-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;4869:18:3;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;2052:235:6:-:0;2124:7;2159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2159:16:6;2193:19;2185:73;;;;-1:-1:-1;;;2185:73:6;;16381:2:20;2185:73:6;;;16363:21:20;16420:2;16400:18;;;16393:30;16459:34;16439:18;;;16432:62;-1:-1:-1;;;16510:18:20;;;16503:39;16559:19;;2185:73:6;16179:405:20;4703:90:3;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;4768:9:3::1;:18:::0;4703:90::o;1790:205:6:-;1862:7;-1:-1:-1;;;;;1889:19:6;;1881:74;;;;-1:-1:-1;;;1881:74:6;;16791:2:20;1881:74:6;;;16773:21:20;16830:2;16810:18;;;16803:30;16869:34;16849:18;;;16842:62;-1:-1:-1;;;16920:18:20;;;16913:40;16970:19;;1881:74:6;16589:406:20;1881:74:6;-1:-1:-1;;;;;;1972:16:6;;;;;:9;:16;;;;;;;1790:205::o;1598:92:17:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;3122:143:3:-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;3252:6:3::1;3216:26;3243:5;3216:33;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:42:::0;-1:-1:-1;;3122:143:3:o;4385:104::-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;4457:13:3::1;:25:::0;4385:104::o;7682:180::-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;7759:13:3::1;::::0;:18;7751:60:::1;;;;-1:-1:-1::0;;;7751:60:3::1;;;;;;;:::i;:::-;7843:12;7822:18;:33:::0;7682:180::o;3271:197::-;3350:4;3428:26;3455:5;3428:33;;;;;;;;:::i;:::-;;;;;;;;;3373:23;:52;3397:20;3418:5;3397:27;;;;;;;;:::i;:::-;;;;;;;;;3373:52;;;;;;;;;;;;:88;3366:95;;3271:197;;;:::o;966:85:17:-;1038:6;;-1:-1:-1;;;;;1038:6:17;;966:85::o;2511:102:6:-;2567:13;2599:7;2592:14;;;;;:::i;5957:351:3:-;1207:1;6041:14;:29;;6020:109;;;;-1:-1:-1;;;6020:109:3;;17560:2:20;6020:109:3;;;17542:21:20;17599:2;17579:18;;;17572:30;17638:34;17618:18;;;17611:62;-1:-1:-1;;;17689:18:20;;;17682:31;17730:19;;6020:109:3;17358:397:20;6020:109:3;6160:9;;6193;;6160:29;;6174:14;6160:13;:29::i;:::-;:42;;6139:120;;;;-1:-1:-1;;;6139:120:3;;17962:2:20;6139:120:3;;;17944:21:20;18001:2;17981:18;;;17974:30;18040:33;18020:18;;;18013:61;18091:18;;6139:120:3;17760:355:20;6139:120:3;6269:32;6286:14;6269:16;:32::i;:::-;5957:351;:::o;4144:290:6:-;4258:12;:10;:12::i;:::-;-1:-1:-1;;;;;4246:24:6;:8;-1:-1:-1;;;;;4246:24:6;;;4238:62;;;;-1:-1:-1;;;4238:62:6;;18322:2:20;4238:62:6;;;18304:21:20;18361:2;18341:18;;;18334:30;-1:-1:-1;;;18380:18:20;;;18373:55;18445:18;;4238:62:6;18120:349:20;4238:62:6;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;-1:-1:-1;;;;;4311:32:6;;;;;;;;;;;;;;;;;-1:-1:-1;4311:32:6;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4311:53:6;;;;;;;;;;;4394:12;:10;:12::i;:::-;-1:-1:-1;;;;;4379:48:6;;4418:8;4379:48;;;;750:14:20;743:22;725:41;;713:2;698:18;;585:187;4379:48:6;;;;;;;;4144:290;;:::o;3474:516:3:-;3555:4;;;3605:321;3629:20;:27;3625:31;;3605:321;;;3681:36;3715:1;3681:33;:36::i;:::-;3677:239;;;3762:17;;3796:20;:23;;3753:148;;-1:-1:-1;;;;;3762:17:3;;:27;;3790:4;;3796:20;3817:1;;3796:23;;;;;;:::i;3753:148::-;3737:164;;;;:::i;:::-;;;3677:239;3658:3;;;;:::i;:::-;;;;3605:321;;;-1:-1:-1;;;;;;3957:26:3;;;;;;;:20;:26;;;;;;3942:41;;;;3474:516;-1:-1:-1;3474:516:3:o;5365:320:6:-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;-1:-1:-1;;;5526:103:6;;;;;;;:::i;:::-;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;2715:401:3:-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;2848:8:3::1;:15;2829:8;:15;:34;2821:61;;;::::0;-1:-1:-1;;;2821:61:3;;18676:2:20;2821:61:3::1;::::0;::::1;18658:21:20::0;18715:2;18695:18;;;18688:30;-1:-1:-1;;;18734:18:20;;;18727:44;18788:18;;2821:61:3::1;18474:338:20::0;2821:61:3::1;2897:9;2892:218;2916:8;:15;2912:1;:19;2892:218;;;2952:20;2978:8;2987:1;2978:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;2952:38;;::::1;::::0;::::1;::::0;;-1:-1:-1;2952:38:3;;;;;;;::::1;::::0;3036:11;;3004:26:::1;::::0;3036:8;;3045:1;;3036:11;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;3004:44;;::::1;::::0;;::::1;::::0;;-1:-1:-1;3004:44:3;;;;;;::::1;::::0;3080:11;;3004:44;;3062:17:::1;::::0;3080:8;;3089:1;;3080:11;::::1;;;;;:::i;:::-;;;;;;;3062:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;2933:3;;;;;:::i;:::-;;;;2892:218;;7868:276:::0;7966:13;8021:15;;8002;:34;;:135;;8124:13;:11;:13::i;:::-;8002:135;;;8072:8;8082:19;:8;:17;:19::i;:::-;8055:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7995:142;7868:276;-1:-1:-1;;7868:276:3:o;3996:165::-;4076:7;4102:23;:52;4126:20;4147:5;4126:27;;;;;;;;:::i;:::-;;;;;;;;;4102:52;;;;;;;;;;;;4095:59;;3996:165;;;:::o;8674:138::-;8718:13;8743:62;;;;;;;;;;;;;;;;;;;8674:138;:::o;8150:394::-;8359:20;;8402:28;;-1:-1:-1;;;8402:28:3;;8271:4;;-1:-1:-1;;;;;8359:20:3;;;;8394:49;;;;8359:20;;8402:21;;:28;;8424:5;;8402:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8394:49:3;;8390:91;;;8466:4;8459:11;;;;;8390:91;-1:-1:-1;;;;;4620:25:6;;;4597:4;4620:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8498:39:3;8491:46;8150:394;-1:-1:-1;;;;8150:394:3:o;7159:517::-;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;7222:13:3::1;::::0;:18;7214:60:::1;;;;-1:-1:-1::0;;;7214:60:3::1;;;;;;;:::i;:::-;7292:18;::::0;7284:68:::1;;;::::0;-1:-1:-1;;;7284:68:3;;20864:2:20;7284:68:3::1;::::0;::::1;20846:21:20::0;;;20883:18;;;20876:30;20942:34;20922:18;;;20915:62;20994:18;;7284:68:3::1;20662:356:20::0;7284:68:3::1;7420:9;::::0;7397:18:::1;::::0;7379:50:::1;::::0;7420:9;7387:29:::1;7379:50;:::i;:::-;7363:13;:66:::0;7460:18:::1;::::0;7482:3:::1;::::0;7443:36:::1;::::0;:12:::1;::::0;:16:::1;:36::i;:::-;:42;7439:137;;;7556:9;::::0;7535:16:::1;7550:1;7535:12;:16;:::i;:::-;7517:48;::::0;;7525:27:::1;7517:48;:::i;:::-;7501:13;:64:::0;7439:137:::1;7589:13;::::0;7585:85:::1;;7639:13;::::0;:20:::1;::::0;7657:1:::1;7639:17;:20::i;:::-;7623:13;:36:::0;7159:517::o;1839:189:17:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:17;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:17;;21474:2:20;1919:73:17::1;::::0;::::1;21456:21:20::0;21513:2;21493:18;;;21486:30;21552:34;21532:18;;;21525:62;-1:-1:-1;;;21603:18:20;;;21596:36;21649:19;;1919:73:17::1;21272:402:20::0;1919:73:17::1;2002:19;2012:8;2002:9;:19::i;4609:88:3:-:0;1189:12:17;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:17;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:17;;1170:68;;;;-1:-1:-1;;;1170:68:17;;;;;;;:::i;:::-;4673:9:3::1;:17:::0;4609:88::o;95:631:1:-;163:22;205:10;227:4;205:27;201:496;;;248:18;269:8;;248:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;307:8:1;514:17;508:24;-1:-1:-1;;;;;483:131:1;;-1:-1:-1;201:496:1;;-1:-1:-1;201:496:1;;-1:-1:-1;675:10:1;201:496;95:631;:::o;8550:118:3:-;8604:14;8637:24;:22;:24::i;:::-;8630:31;;8550:118;:::o;1431:300:6:-;1533:4;-1:-1:-1;;;;;;1568:40:6;;-1:-1:-1;;;1568:40:6;;:104;;-1:-1:-1;;;;;;;1624:48:6;;-1:-1:-1;;;1624:48:6;1568:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:5;;;1688:36:6;763:155:5;8114:108:6;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;7157:125::-;7222:4;7245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7245:16:6;:30;;;7157:125::o;11008:171::-;11082:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11082:29:6;-1:-1:-1;;;;;11082:29:6;;;;;;;;:24;;11135:23;11082:24;11135:14;:23::i;:::-;-1:-1:-1;;;;;11126:46:6;;;;;;;;;;;11008:171;;:::o;2586:470:16:-;2758:4;-1:-1:-1;;;;;2782:20:16;;2774:70;;;;-1:-1:-1;;;2774:70:16;;21881:2:20;2774:70:16;;;21863:21:20;21920:2;21900:18;;;21893:30;21959:34;21939:18;;;21932:62;-1:-1:-1;;;22010:18:20;;;22003:35;22055:19;;2774:70:16;21679:401:20;2774:70:16;2895:154;2922:47;2941:27;2961:6;2941:19;:27::i;:::-;2922:18;:47::i;:::-;2895:154;;;;;;;;;;;;22312:25:20;;;;22385:4;22373:17;;22353:18;;;22346:45;22407:18;;;22400:34;;;22450:18;;;22443:34;;;22284:19;;2895:154:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2873:176:16;:6;-1:-1:-1;;;;;2873:176:16;;2854:195;;2586:470;;;;;;;:::o;2672:96:18:-;2730:7;2756:5;2760:1;2756;:5;:::i;:::-;2749:12;2672:96;-1:-1:-1;;;2672:96:18:o;7440:344:6:-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;-1:-1:-1;;;7549:73:6;;22690:2:20;7549:73:6;;;22672:21:20;22729:2;22709:18;;;22702:30;22768:34;22748:18;;;22741:62;-1:-1:-1;;;22819:18:20;;;22812:42;22871:19;;7549:73:6;22488:408:20;7549:73:6;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;-1:-1:-1;;;;;7689:16:6;:7;-1:-1:-1;;;;;7689:16:6;;:51;;;;7733:7;-1:-1:-1;;;;;7709:31:6;:20;7721:7;7709:11;:20::i;:::-;-1:-1:-1;;;;;7709:31:6;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;10337:560::-;10491:4;-1:-1:-1;;;;;10464:31:6;:23;10479:7;10464:14;:23::i;:::-;-1:-1:-1;;;;;10464:31:6;;10456:85;;;;-1:-1:-1;;;10456:85:6;;23103:2:20;10456:85:6;;;23085:21:20;23142:2;23122:18;;;23115:30;23181:34;23161:18;;;23154:62;-1:-1:-1;;;23232:18:20;;;23225:39;23281:19;;10456:85:6;22901:405:20;10456:85:6;-1:-1:-1;;;;;10559:16:6;;10551:65;;;;-1:-1:-1;;;10551:65:6;;23513:2:20;10551:65:6;;;23495:21:20;23552:2;23532:18;;;23525:30;23591:34;23571:18;;;23564:62;-1:-1:-1;;;23642:18:20;;;23635:34;23686:19;;10551:65:6;23311:400:20;10551:65:6;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;-1:-1:-1;;;;;10768:15:6;;;;;;:9;:15;;;;;:20;;10787:1;;10768:15;:20;;10787:1;;10768:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10798:13:6;;;;;;:9;:13;;;;;:18;;10815:1;;10798:13;:18;;10815:1;;10798:18;:::i;:::-;;;;-1:-1:-1;;10826:16:6;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10826:21:6;-1:-1:-1;;;;;10826:21:6;;;;;;;;;10863:27;;10826:16;;10863:27;;;;;;;10337:560;;;:::o;6314:839:3:-;6390:12;;;;:48;;;;;6425:13;;6406:15;:32;;6390:48;6382:88;;;;-1:-1:-1;;;6382:88:3;;23918:2:20;6382:88:3;;;23900:21:20;23957:2;23937:18;;;23930:30;-1:-1:-1;;;23976:18:20;;;23969:57;24043:18;;6382:88:3;23716:351:20;6382:88:3;1207:1;6501:14;:29;;6480:108;;;;-1:-1:-1;;;6480:108:3;;24274:2:20;6480:108:3;;;24256:21:20;;;24293:18;;;24286:30;24352:34;24332:18;;;24325:62;24404:18;;6480:108:3;24072:356:20;6480:108:3;6656:9;;6619:33;6637:14;6619:13;1621:10:7;:17;;1534:111;6619:13:3;:17;;:33::i;:::-;:46;;6598:125;;;;-1:-1:-1;;;6598:125:3;;24635:2:20;6598:125:3;;;24617:21:20;;;24654:18;;;24647:30;24713:34;24693:18;;;24686:62;24765:18;;6598:125:3;24433:356:20;6598:125:3;6739:9;6734:212;6758:14;6754:1;:18;6734:212;;;6793:17;6813:13;1621:10:7;:17;;1534:111;6813:13:3;6793:33;;6860:9;;6844:13;1621:10:7;:17;;1534:111;6844:13:3;:25;6840:96;;;6889:32;6899:10;6911:9;6889;:32::i;:::-;-1:-1:-1;6774:3:3;;;;:::i;:::-;;;;6734:212;;;-1:-1:-1;6973:18:3;;:23;:105;;;;-1:-1:-1;7030:9:3;;1621:10:7;:17;7013:26:3;:64;;;;7062:15;;7043;:34;;7013:64;6956:191;;;7124:12;7103:18;:33;6314:839;:::o;391:104:15:-;449:7;479:1;475;:5;:13;;487:1;475:13;;;-1:-1:-1;483:1:15;;391:104;-1:-1:-1;391:104:15:o;3767:96:18:-;3825:7;3851:5;3855:1;3851;:5;:::i;2034:169:17:-;2108:6;;;-1:-1:-1;;;;;2124:17:17;;;-1:-1:-1;;;;;;2124:17:17;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2079:124;2034:169;:::o;3382:96:18:-;3440:7;3466:5;3470:1;3466;:5;:::i;6547:307:6:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;-1:-1:-1;;;6736:111:6;;;;;;;:::i;275:703:19:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:19;;;;;;;;;;;;-1:-1:-1;;;574:10:19;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:19;;-1:-1:-1;720:2:19;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;-1:-1:-1;;;;;764:17:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:19;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:19;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;849:56:19;;;;;;;;-1:-1:-1;919:11:19;928:2;919:11;;:::i;:::-;;;791:150;;3039:96:18;3097:7;3123:5;3127:1;3123;:5;:::i;8443:311:6:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;-1:-1:-1;;;8596:151:6;;;;;;;:::i;2073:396:16:-;2180:7;296:106;;;;;;;;;;;;;;;;;273:139;;;;;;;2328:12;;2362:11;;;;2405:24;;;;;2395:35;;;;;;2249:199;;;;;25742:25:20;;;25798:2;25783:18;;25776:34;;;;-1:-1:-1;;;;;25846:32:20;25841:2;25826:18;;25819:60;25910:2;25895:18;;25888:34;25729:3;25714:19;;25511:417;2249:199:16;;;;;;;;;;;;;2222:240;;;;;;2203:259;;2073:396;;;:::o;1884:249:4:-;1980:7;2078:20;1341:15;;;1264:99;2078:20;2049:63;;-1:-1:-1;;;2049:63:4;;;26191:27:20;26234:11;;;26227:27;;;;26270:12;;;26263:28;;;26307:12;;2049:63:4;25933:392:20;2543:572:7;-1:-1:-1;;;;;2742:18:7;;2738:183;;2776:40;2808:7;3924:10;:17;;3897:24;;;;:15;:24;;;;;:44;;;3951:24;;;;;;;;;;;;3821:161;2776:40;2738:183;;;2845:2;-1:-1:-1;;;;;2837:10:7;:4;-1:-1:-1;;;;;2837:10:7;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;-1:-1:-1;;;;;2934:16:7;;2930:179;;2966:45;3003:7;2966:36;:45::i;2930:179::-;3038:4;-1:-1:-1;;;;;3032:10:7;:2;-1:-1:-1;;;;;3032:10:7;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;11732:782:6:-;11882:4;-1:-1:-1;;;;;11902:13:6;;1034:20:0;1080:8;11898:610:6;;11953:2;-1:-1:-1;;;;;11937:36:6;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11937:72:6;;;;;;;;-1:-1:-1;;11937:72:6;;;;;;;;;;;;:::i;:::-;;;11933:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12180:13:6;;12176:266;;12222:60;;-1:-1:-1;;;12222:60:6;;;;;;;:::i;12176:266::-;12394:6;12388:13;12379:6;12375:2;12371:15;12364:38;11933:523;-1:-1:-1;;;;;;12059:55:6;-1:-1:-1;;;12059:55:6;;-1:-1:-1;12052:62:6;;11898:610;-1:-1:-1;12493:4:6;11732:782;;;;;;:::o;9076:372::-;-1:-1:-1;;;;;9155:16:6;;9147:61;;;;-1:-1:-1;;;9147:61:6;;27280:2:20;9147:61:6;;;27262:21:20;;;27299:18;;;27292:30;27358:34;27338:18;;;27331:62;27410:18;;9147:61:6;27078:356:20;9147:61:6;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;-1:-1:-1;;;9218:58:6;;27641:2:20;9218:58:6;;;27623:21:20;27680:2;27660:18;;;27653:30;-1:-1:-1;;;27699:18:20;;;27692:58;27767:18;;9218:58:6;27439:352:20;9218:58:6;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;-1:-1:-1;;;;;9343:13:6;;;;;;:9;:13;;;;;:18;;9360:1;;9343:13;:18;;9360:1;;9343:18;:::i;:::-;;;;-1:-1:-1;;9371:16:6;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9371:21:6;-1:-1:-1;;;;;9371:21:6;;;;;;;;9408:33;;9371:16;;;9408:33;;9371:16;;9408:33;9076:372;;:::o;4599:970:7:-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4922:18;4943:26;;;:17;:26;;;;;;4861:51;;-1:-1:-1;5073:28:7;;;5069:323;;-1:-1:-1;;;;;5139:18:7;;5117:19;5139:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5188:30;;;;;;:44;;;5304:30;;:17;:30;;;;;:43;;;5069:323;-1:-1:-1;5485:26:7;;;;:17;:26;;;;;;;;5478:33;;;-1:-1:-1;;;;;5528:18:7;;;;;:12;:18;;;;;:34;;;;;;;5521:41;4599:970::o;5857:1061::-;6131:10;:17;6106:22;;6131:21;;6151:1;;6131:21;:::i;:::-;6162:18;6183:24;;;:15;:24;;;;;;6551:10;:26;;6106:46;;-1:-1:-1;6183:24:7;;6106:46;;6551:26;;;;;;:::i;:::-;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6692:28;;;:15;:28;;;;;;;:41;;;6861:24;;;;;6854:31;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;-1:-1:-1;;;;;3540:16:7;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3584:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3409:217:7:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:20;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:20;;14:180;-1:-1:-1;14:180:20:o;199:131::-;-1:-1:-1;;;;;;273:32:20;;263:43;;253:71;;320:1;317;310:12;335:245;393:6;446:2;434:9;425:7;421:23;417:32;414:52;;;462:1;459;452:12;414:52;501:9;488:23;520:30;544:5;520:30;:::i;777:131::-;-1:-1:-1;;;;;852:31:20;;842:42;;832:70;;898:1;895;888:12;913:315;981:6;989;1042:2;1030:9;1021:7;1017:23;1013:32;1010:52;;;1058:1;1055;1048:12;1010:52;1094:9;1081:23;1071:33;;1154:2;1143:9;1139:18;1126:32;1167:31;1192:5;1167:31;:::i;:::-;1217:5;1207:15;;;913:315;;;;;:::o;1233:258::-;1305:1;1315:113;1329:6;1326:1;1323:13;1315:113;;;1405:11;;;1399:18;1386:11;;;1379:39;1351:2;1344:10;1315:113;;;1446:6;1443:1;1440:13;1437:48;;;-1:-1:-1;;1481:1:20;1463:16;;1456:27;1233:258::o;1496:::-;1538:3;1576:5;1570:12;1603:6;1598:3;1591:19;1619:63;1675:6;1668:4;1663:3;1659:14;1652:4;1645:5;1641:16;1619:63;:::i;:::-;1736:2;1715:15;-1:-1:-1;;1711:29:20;1702:39;;;;1743:4;1698:50;;1496:258;-1:-1:-1;;1496:258:20:o;1759:220::-;1908:2;1897:9;1890:21;1871:4;1928:45;1969:2;1958:9;1954:18;1946:6;1928:45;:::i;1984:203::-;-1:-1:-1;;;;;2148:32:20;;;;2130:51;;2118:2;2103:18;;1984:203::o;2192:315::-;2260:6;2268;2321:2;2309:9;2300:7;2296:23;2292:32;2289:52;;;2337:1;2334;2327:12;2289:52;2376:9;2363:23;2395:31;2420:5;2395:31;:::i;:::-;2445:5;2497:2;2482:18;;;;2469:32;;-1:-1:-1;;;2192:315:20:o;2512:127::-;2573:10;2568:3;2564:20;2561:1;2554:31;2604:4;2601:1;2594:15;2628:4;2625:1;2618:15;2644:275;2715:2;2709:9;2780:2;2761:13;;-1:-1:-1;;2757:27:20;2745:40;;-1:-1:-1;;;;;2800:34:20;;2836:22;;;2797:62;2794:88;;;2862:18;;:::i;:::-;2898:2;2891:22;2644:275;;-1:-1:-1;2644:275:20:o;2924:406::-;2988:5;-1:-1:-1;;;;;3014:6:20;3011:30;3008:56;;;3044:18;;:::i;:::-;3082:57;3127:2;3106:15;;-1:-1:-1;;3102:29:20;3133:4;3098:40;3082:57;:::i;:::-;3073:66;;3162:6;3155:5;3148:21;3202:3;3193:6;3188:3;3184:16;3181:25;3178:45;;;3219:1;3216;3209:12;3178:45;3268:6;3263:3;3256:4;3249:5;3245:16;3232:43;3322:1;3315:4;3306:6;3299:5;3295:18;3291:29;3284:40;2924:406;;;;;:::o;3335:220::-;3377:5;3430:3;3423:4;3415:6;3411:17;3407:27;3397:55;;3448:1;3445;3438:12;3397:55;3470:79;3545:3;3536:6;3523:20;3516:4;3508:6;3504:17;3470:79;:::i;3560:758::-;3662:6;3670;3678;3686;3694;3747:3;3735:9;3726:7;3722:23;3718:33;3715:53;;;3764:1;3761;3754:12;3715:53;3803:9;3790:23;3822:31;3847:5;3822:31;:::i;:::-;3872:5;-1:-1:-1;3928:2:20;3913:18;;3900:32;-1:-1:-1;;;;;3944:30:20;;3941:50;;;3987:1;3984;3977:12;3941:50;4010:49;4051:7;4042:6;4031:9;4027:22;4010:49;:::i;:::-;4000:59;;;4106:2;4095:9;4091:18;4078:32;4068:42;;4157:2;4146:9;4142:18;4129:32;4119:42;;4213:3;4202:9;4198:19;4185:33;4262:4;4253:7;4249:18;4240:7;4237:31;4227:59;;4282:1;4279;4272:12;4227:59;4305:7;4295:17;;;3560:758;;;;;;;;:::o;4546:247::-;4605:6;4658:2;4646:9;4637:7;4633:23;4629:32;4626:52;;;4674:1;4671;4664:12;4626:52;4713:9;4700:23;4732:31;4757:5;4732:31;:::i;5162:456::-;5239:6;5247;5255;5308:2;5296:9;5287:7;5283:23;5279:32;5276:52;;;5324:1;5321;5314:12;5276:52;5363:9;5350:23;5382:31;5407:5;5382:31;:::i;:::-;5432:5;-1:-1:-1;5489:2:20;5474:18;;5461:32;5502:33;5461:32;5502:33;:::i;:::-;5162:456;;5554:7;;-1:-1:-1;;;5608:2:20;5593:18;;;;5580:32;;5162:456::o;5886:450::-;5955:6;6008:2;5996:9;5987:7;5983:23;5979:32;5976:52;;;6024:1;6021;6014:12;5976:52;6064:9;6051:23;-1:-1:-1;;;;;6089:6:20;6086:30;6083:50;;;6129:1;6126;6119:12;6083:50;6152:22;;6205:4;6197:13;;6193:27;-1:-1:-1;6183:55:20;;6234:1;6231;6224:12;6183:55;6257:73;6322:7;6317:2;6304:16;6299:2;6295;6291:11;6257:73;:::i;6341:248::-;6409:6;6417;6470:2;6458:9;6449:7;6445:23;6441:32;6438:52;;;6486:1;6483;6476:12;6438:52;-1:-1:-1;;6509:23:20;;;6579:2;6564:18;;;6551:32;;-1:-1:-1;6341:248:20:o;6594:416::-;6659:6;6667;6720:2;6708:9;6699:7;6695:23;6691:32;6688:52;;;6736:1;6733;6726:12;6688:52;6775:9;6762:23;6794:31;6819:5;6794:31;:::i;:::-;6844:5;-1:-1:-1;6901:2:20;6886:18;;6873:32;6943:15;;6936:23;6924:36;;6914:64;;6974:1;6971;6964:12;7015:665;7110:6;7118;7126;7134;7187:3;7175:9;7166:7;7162:23;7158:33;7155:53;;;7204:1;7201;7194:12;7155:53;7243:9;7230:23;7262:31;7287:5;7262:31;:::i;:::-;7312:5;-1:-1:-1;7369:2:20;7354:18;;7341:32;7382:33;7341:32;7382:33;:::i;:::-;7434:7;-1:-1:-1;7488:2:20;7473:18;;7460:32;;-1:-1:-1;7543:2:20;7528:18;;7515:32;-1:-1:-1;;;;;7559:30:20;;7556:50;;;7602:1;7599;7592:12;7556:50;7625:49;7666:7;7657:6;7646:9;7642:22;7625:49;:::i;:::-;7615:59;;;7015:665;;;;;;;:::o;7685:712::-;7739:5;7792:3;7785:4;7777:6;7773:17;7769:27;7759:55;;7810:1;7807;7800:12;7759:55;7846:6;7833:20;7872:4;-1:-1:-1;;;;;7891:2:20;7888:26;7885:52;;;7917:18;;:::i;:::-;7963:2;7960:1;7956:10;7986:28;8010:2;8006;8002:11;7986:28;:::i;:::-;8048:15;;;8118;;;8114:24;;;8079:12;;;;8150:15;;;8147:35;;;8178:1;8175;8168:12;8147:35;8214:2;8206:6;8202:15;8191:26;;8226:142;8242:6;8237:3;8234:15;8226:142;;;8308:17;;8296:30;;8259:12;;;;8346;;;;8226:142;;;8386:5;7685:712;-1:-1:-1;;;;;;;7685:712:20:o;8402:595::-;8520:6;8528;8581:2;8569:9;8560:7;8556:23;8552:32;8549:52;;;8597:1;8594;8587:12;8549:52;8637:9;8624:23;-1:-1:-1;;;;;8707:2:20;8699:6;8696:14;8693:34;;;8723:1;8720;8713:12;8693:34;8746:61;8799:7;8790:6;8779:9;8775:22;8746:61;:::i;:::-;8736:71;;8860:2;8849:9;8845:18;8832:32;8816:48;;8889:2;8879:8;8876:16;8873:36;;;8905:1;8902;8895:12;8873:36;;8928:63;8983:7;8972:8;8961:9;8957:24;8928:63;:::i;:::-;8918:73;;;8402:595;;;;;:::o;9002:388::-;9070:6;9078;9131:2;9119:9;9110:7;9106:23;9102:32;9099:52;;;9147:1;9144;9137:12;9099:52;9186:9;9173:23;9205:31;9230:5;9205:31;:::i;:::-;9255:5;-1:-1:-1;9312:2:20;9297:18;;9284:32;9325:33;9284:32;9325:33;:::i;9395:356::-;9597:2;9579:21;;;9616:18;;;9609:30;9675:34;9670:2;9655:18;;9648:62;9742:2;9727:18;;9395:356::o;9756:127::-;9817:10;9812:3;9808:20;9805:1;9798:31;9848:4;9845:1;9838:15;9872:4;9869:1;9862:15;9888:128;9928:3;9959:1;9955:6;9952:1;9949:13;9946:39;;;9965:18;;:::i;:::-;-1:-1:-1;10001:9:20;;9888:128::o;10021:135::-;10060:3;-1:-1:-1;;10081:17:20;;10078:43;;;10101:18;;:::i;:::-;-1:-1:-1;10148:1:20;10137:13;;10021:135::o;10161:380::-;10240:1;10236:12;;;;10283;;;10304:61;;10358:4;10350:6;10346:17;10336:27;;10304:61;10411:2;10403:6;10400:14;10380:18;10377:38;10374:161;;;10457:10;10452:3;10448:20;10445:1;10438:31;10492:4;10489:1;10482:15;10520:4;10517:1;10510:15;10374:161;;10161:380;;;:::o;12188:432::-;-1:-1:-1;;;;;12445:15:20;;;12427:34;;12497:15;;12492:2;12477:18;;12470:43;12549:2;12544;12529:18;;12522:30;;;12370:4;;12569:45;;12595:18;;12587:6;12569:45;:::i;:::-;12561:53;12188:432;-1:-1:-1;;;;;12188:432:20:o;12625:184::-;12666:3;12704:5;12698:12;12719:52;12764:6;12759:3;12752:4;12745:5;12741:16;12719:52;:::i;:::-;12787:16;;;;;12625:184;-1:-1:-1;;12625:184:20:o;12814:407::-;12971:3;13009:6;13003:13;13025:53;13071:6;13066:3;13059:4;13051:6;13047:17;13025:53;:::i;:::-;13172:2;13143:15;;;;-1:-1:-1;;;;;;13139:45:20;13100:16;;;;13125:60;;;13212:2;13201:14;;12814:407;-1:-1:-1;;12814:407:20:o;13226:274::-;13355:3;13393:6;13387:13;13409:53;13455:6;13450:3;13443:4;13435:6;13431:17;13409:53;:::i;:::-;13478:16;;;;;13226:274;-1:-1:-1;;13226:274:20:o;13862:413::-;14064:2;14046:21;;;14103:2;14083:18;;;14076:30;14142:34;14137:2;14122:18;;14115:62;-1:-1:-1;;;14208:2:20;14193:18;;14186:47;14265:3;14250:19;;13862:413::o;15036:127::-;15097:10;15092:3;15088:20;15085:1;15078:31;15128:4;15125:1;15118:15;15152:4;15149:1;15142:15;15447:184;15517:6;15570:2;15558:9;15549:7;15545:23;15541:32;15538:52;;;15586:1;15583;15576:12;15538:52;-1:-1:-1;15609:16:20;;15447:184;-1:-1:-1;15447:184:20:o;15636:125::-;15676:4;15704:1;15701;15698:8;15695:34;;;15709:18;;:::i;:::-;-1:-1:-1;15746:9:20;;15636:125::o;17000:353::-;17202:2;17184:21;;;17241:2;17221:18;;;17214:30;17280:31;17275:2;17260:18;;17253:59;17344:2;17329:18;;17000:353::o;19061:1300::-;19338:3;19367:1;19400:6;19394:13;19430:3;19452:1;19480:9;19476:2;19472:18;19462:28;;19540:2;19529:9;19525:18;19562;19552:61;;19606:4;19598:6;19594:17;19584:27;;19552:61;19632:2;19680;19672:6;19669:14;19649:18;19646:38;19643:165;;;-1:-1:-1;;;19707:33:20;;19763:4;19760:1;19753:15;19793:4;19714:3;19781:17;19643:165;19824:18;19851:104;;;;19969:1;19964:320;;;;19817:467;;19851:104;-1:-1:-1;;19884:24:20;;19872:37;;19929:16;;;;-1:-1:-1;19851:104:20;;19964:320;18890:1;18883:14;;;18927:4;18914:18;;20059:1;20073:165;20087:6;20084:1;20081:13;20073:165;;;20165:14;;20152:11;;;20145:35;20208:16;;;;20102:10;;20073:165;;;20077:3;;20267:6;20262:3;20258:16;20251:23;;19817:467;;;;;;;20300:55;20325:29;20350:3;20342:6;20325:29;:::i;:::-;-1:-1:-1;;;19003:20:20;;19048:1;19039:11;;18943:113;20366:291;20476:6;20529:2;20517:9;20508:7;20504:23;20500:32;20497:52;;;20545:1;20542;20535:12;20497:52;20577:9;20571:16;20596:31;20621:5;20596:31;:::i;21023:127::-;21084:10;21079:3;21075:20;21072:1;21065:31;21115:4;21112:1;21105:15;21139:4;21136:1;21129:15;21155:112;21187:1;21213;21203:35;;21218:18;;:::i;:::-;-1:-1:-1;21252:9:20;;21155:112::o;24794:120::-;24834:1;24860;24850:35;;24865:18;;:::i;:::-;-1:-1:-1;24899:9:20;;24794:120::o;24919:168::-;24959:7;25025:1;25021;25017:6;25013:14;25010:1;25007:21;25002:1;24995:9;24988:17;24984:45;24981:71;;;25032:18;;:::i;:::-;-1:-1:-1;25072:9:20;;24919:168::o;25092:414::-;25294:2;25276:21;;;25333:2;25313:18;;;25306:30;25372:34;25367:2;25352:18;;25345:62;-1:-1:-1;;;25438:2:20;25423:18;;25416:48;25496:3;25481:19;;25092:414::o;26330:489::-;-1:-1:-1;;;;;26599:15:20;;;26581:34;;26651:15;;26646:2;26631:18;;26624:43;26698:2;26683:18;;26676:34;;;26746:3;26741:2;26726:18;;26719:31;;;26524:4;;26767:46;;26793:19;;26785:6;26767:46;:::i;:::-;26759:54;26330:489;-1:-1:-1;;;;;;26330:489:20:o;26824:249::-;26893:6;26946:2;26934:9;26925:7;26921:23;26917:32;26914:52;;;26962:1;26959;26952:12;26914:52;26994:9;26988:16;27013:30;27037:5;27013:30;:::i;27796:127::-;27857:10;27852:3;27848:20;27845:1;27838:31;27888:4;27885:1;27878:15;27912:4;27909:1;27902:15

Swarm Source

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