ETH Price: $3,326.69 (-4.79%)

Token

OSYC KEY (OSYCKEY)
 

Overview

Max Total Supply

2,243 OSYCKEY

Holders

1,780

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0xb48d2d9f0c5a6a877889009c4dd7a24b74a427df
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:
OSYCKEY

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 9 of 11: OSYCKEY.sol
// SPDX-License-Identifier: MIT

/***************************************************************************
          ___        __         _     __           __   __ ___
        / __ \      / /_  _____(_)___/ /____       \ \ / /  _ \
       / / / /_  __/ __/ / ___/ / __  / __  )       \ / /| |
      / /_/ / /_/ / /_  (__  ) / /_/ / ____/         | | | |_
      \____/\____/\__/ /____/_/\__,_/\____/          |_|  \___/
                                       
****************************************************************************/

pragma solidity ^0.8.0;

import "./ERC1155.sol";
import "./Ownable.sol";

contract OSYCKEY is Ownable, ERC1155 {
    string private name_;
    string private symbol_;

    mapping(uint8 => uint16) public MAX_SUPPLY;
    mapping(uint8 => uint16) public mintedCount;

    bool public publicSale;
    bool public isAllowToTransfer;
    address private admin;

    string private constant CONTRACT_NAME = "OSYC Key Contract";
    bytes32 private constant DOMAIN_TYPEHASH =
        keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );
    bytes32 private constant MINT_TYPEHASH =
        keccak256("Mint(address user,uint8 key,uint8 count)");

    constructor(
        string memory _name,
        string memory _symbol,
        address _admin
    ) {
        name_ = _name;
        symbol_ = _symbol;
        admin = _admin;
    }

    function name() public view virtual returns (string memory) {
        return name_;
    }

    function symbol() public view virtual returns (string memory) {
        return symbol_;
    }

    function setBaseURI(string memory _baseURI) external onlyOwner {
        _setURI(_baseURI);
    }

    function setPublicSale(bool _publicSale) external onlyOwner {
        publicSale = _publicSale;
    }

    function setConfig(uint8 keyId, uint16 _max_supply) external onlyOwner {
        MAX_SUPPLY[keyId] = _max_supply;
    }

    function allowToTransfer(bool _isAllowToTransfer) external onlyOwner {
        isAllowToTransfer = _isAllowToTransfer;
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(isAllowToTransfer, "Not allow to trasfer");
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(isAllowToTransfer, "Not allow to trasfer");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(isAllowToTransfer, "Not allow to trasfer");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    function mintKey(
        uint8 keyId,
        uint8 amount,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        require(tx.origin == msg.sender, "Only EOA");
        require(balanceOf(msg.sender, keyId) == 0, "Aleady Minted");
        require(
            mintedCount[keyId] + amount < MAX_SUPPLY[keyId],
            "Max Limit To Presale"
        );

        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(CONTRACT_NAME)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(MINT_TYPEHASH, msg.sender, keyId, amount)
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(signatory == admin, "Invalid signatory");

        _mint(msg.sender, keyId, amount, "");
        mintedCount[keyId] = mintedCount[keyId] + amount;
    }

    function mintKeyPublic(uint8 keyId) external payable {
        require(tx.origin == msg.sender, "Only EOA");
        require(publicSale, "Not allowed for public sale");
        require(
            mintedCount[keyId] + 1 < MAX_SUPPLY[keyId],
            "Max Limit To Presale"
        );

        _mint(msg.sender, keyId, 1, "");
        mintedCount[keyId] = mintedCount[keyId] + 1;
    }

    function reserveKey(
        address account,
        uint8 keyId,
        uint8 amount
    ) external onlyOwner {
        require(
            mintedCount[keyId] + amount < MAX_SUPPLY[keyId],
            "Max Limit To Presale"
        );

        _mint(account, keyId, amount, "");
        mintedCount[keyId] = mintedCount[keyId] + amount;
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

File 1 of 11: 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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 2 of 11: 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 3 of 11: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";
import "./Strings.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Strings for uint256;
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor() {
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        return string(abi.encodePacked(_uri, tokenId.toString()));
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: balance query for the zero address"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `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 memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            from,
            to,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        uint256 fromBalance = _balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - 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[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            address(0),
            to,
            _asSingletonArray(id),
            _asSingletonArray(amount),
            data
        );

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(
            operator,
            from,
            address(0),
            _asSingletonArray(id),
            _asSingletonArray(amount),
            ""
        );

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 4 of 11: 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 5 of 11: IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

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 6 of 11: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 7 of 11: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 8 of 11: 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 10 of 11: 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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 11 of 11: 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":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowToTransfer","type":"bool"}],"name":"allowToTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowToTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"keyId","type":"uint8"},{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintKey","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"keyId","type":"uint8"}],"name":"mintKeyPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"mintedCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"keyId","type":"uint8"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"reserveKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"keyId","type":"uint8"},{"internalType":"uint16","name":"_max_supply","type":"uint16"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620028e0380380620028e083398101604081905262000034916200022f565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35082516200008a906004906020860190620000d2565b508151620000a0906005906020850190620000d2565b50600880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055506200030f9050565b828054620000e090620002bc565b90600052602060002090601f0160209004810192826200010457600085556200014f565b82601f106200011f57805160ff19168380011785556200014f565b828001600101855582156200014f579182015b828111156200014f57825182559160200191906001019062000132565b506200015d92915062000161565b5090565b5b808211156200015d576000815560010162000162565b600082601f8301126200018a57600080fd5b81516001600160401b0380821115620001a757620001a7620002f9565b604051601f8301601f19908116603f01168101908282118183101715620001d257620001d2620002f9565b81604052838152602092508683858801011115620001ef57600080fd5b600091505b83821015620002135785820183015181830184015290820190620001f4565b83821115620002255760008385830101525b9695505050505050565b6000806000606084860312156200024557600080fd5b83516001600160401b03808211156200025d57600080fd5b6200026b8783880162000178565b945060208601519150808211156200028257600080fd5b50620002918682870162000178565b604086015190935090506001600160a01b0381168114620002b157600080fd5b809150509250925092565b600181811c90821680620002d157607f821691505b60208210811415620002f357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6125c1806200031f6000396000f3fe60806040526004361061014a5760003560e01c80636bcb6744116100b6578063a22cb4651161006f578063a22cb465146103b8578063d406d453146103d8578063e985e9c514610409578063f242432a14610452578063f2fde38b14610472578063fe015f0b1461049257600080fd5b80636bcb674414610321578063715018a61461033457806373cca556146103495780638da5cb5b1461035c57806392c967ef1461038457806395d89b41146103a357600080fd5b80632eb2c2d6116101085780632eb2c2d61461025a57806333bc1c5c1461027a57806349a46562146102945780634e1273f4146102b457806355f804b3146102e15780635aca1bb61461030157600080fd5b8062fdd58e1461014f57806301ffc9a71461018257806306fdde03146101b25780630e89341c146101d457806313414b39146101f457806319dd167a14610216575b600080fd5b34801561015b57600080fd5b5061016f61016a366004611d00565b6104b2565b6040519081526020015b60405180910390f35b34801561018e57600080fd5b506101a261019d366004611e59565b61054b565b6040519015158152602001610179565b3480156101be57600080fd5b506101c761059d565b60405161017991906121a8565b3480156101e057600080fd5b506101c76101ef366004611edc565b61062f565b34801561020057600080fd5b5061021461020f366004611d2a565b610663565b005b34801561022257600080fd5b50610247610231366004611ef5565b60066020526000908152604090205461ffff1681565b60405161ffff9091168152602001610179565b34801561026657600080fd5b50610214610275366004611bc7565b610754565b34801561028657600080fd5b506008546101a29060ff1681565b3480156102a057600080fd5b506102146102af366004611f10565b610812565b3480156102c057600080fd5b506102d46102cf366004611d6d565b610865565b6040516101799190612170565b3480156102ed57600080fd5b506102146102fc366004611e93565b61098f565b34801561030d57600080fd5b5061021461031c366004611e3e565b6109c5565b61021461032f366004611ef5565b610a02565b34801561034057600080fd5b50610214610b4b565b610214610357366004611f4e565b610bbf565b34801561036857600080fd5b506000546040516001600160a01b039091168152602001610179565b34801561039057600080fd5b506008546101a290610100900460ff1681565b3480156103af57600080fd5b506101c7610eff565b3480156103c457600080fd5b506102146103d3366004611cd6565b610f0e565b3480156103e457600080fd5b506102476103f3366004611ef5565b60076020526000908152604090205461ffff1681565b34801561041557600080fd5b506101a2610424366004611b94565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561045e57600080fd5b5061021461046d366004611c71565b610f44565b34801561047e57600080fd5b5061021461048d366004611b79565b610ff2565b34801561049e57600080fd5b506102146104ad366004611e3e565b6110dc565b60006001600160a01b0383166105235760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061057c57506001600160e01b031982166303a24d0760e21b145b8061059757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600480546105ac906123e0565b80601f01602080910402602001604051908101604052809291908181526020018280546105d8906123e0565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b6060600361063c83611120565b60405160200161064d929190612026565b6040516020818303038152906040529050919050565b6000546001600160a01b0316331461068d5760405162461bcd60e51b815260040161051a906122c0565b60ff80831660009081526006602090815260408083205460079092529091205461ffff918216926106c2929085169116612347565b61ffff16106106e35760405162461bcd60e51b815260040161051a906122f5565b610704838360ff168360ff1660405180602001604052806000815250611226565b60ff8281166000908152600760205260409020546107289183169061ffff16612347565b60ff929092166000908152600760205260409020805461ffff191661ffff909316929092179091555050565b600854610100900460ff1661077b5760405162461bcd60e51b815260040161051a90612203565b6001600160a01b03851633148061079757506107978533610424565b6107fe5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161051a565b61080b8585858585611332565b5050505050565b6000546001600160a01b0316331461083c5760405162461bcd60e51b815260040161051a906122c0565b60ff919091166000908152600660205260409020805461ffff191661ffff909216919091179055565b606081518351146108ca5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161051a565b6000835167ffffffffffffffff8111156108e6576108e66124b9565b60405190808252806020026020018201604052801561090f578160200160208202803683370190505b50905060005b84518110156109875761095a858281518110610933576109336124a3565b602002602001015185838151811061094d5761094d6124a3565b60200260200101516104b2565b82828151811061096c5761096c6124a3565b602090810291909101015261098081612448565b9050610915565b509392505050565b6000546001600160a01b031633146109b95760405162461bcd60e51b815260040161051a906122c0565b6109c281611512565b50565b6000546001600160a01b031633146109ef5760405162461bcd60e51b815260040161051a906122c0565b6008805460ff1916911515919091179055565b323314610a3c5760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b604482015260640161051a565b60085460ff16610a8e5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420616c6c6f77656420666f72207075626c69632073616c650000000000604482015260640161051a565b60ff811660009081526006602090815260408083205460079092529091205461ffff91821691610ac091166001612347565b61ffff1610610ae15760405162461bcd60e51b815260040161051a906122f5565b610b00338260ff16600160405180602001604052806000815250611226565b60ff8116600090815260076020526040902054610b229061ffff166001612347565b60ff919091166000908152600760205260409020805461ffff191661ffff909216919091179055565b6000546001600160a01b03163314610b755760405162461bcd60e51b815260040161051a906122c0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b323314610bf95760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b604482015260640161051a565b610c06338660ff166104b2565b15610c435760405162461bcd60e51b815260206004820152600d60248201526c105b1958591e48135a5b9d1959609a1b604482015260640161051a565b60ff80861660009081526006602090815260408083205460079092529091205461ffff91821692610c78929088169116612347565b61ffff1610610c995760405162461bcd60e51b815260040161051a906122f5565b604080518082018252601181527013d4d650c812d95e4810dbdb9d1c9858dd607a1b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f1e79d9e89fc6d5bed5ff5a02b40e1de15e96f346bf4570e66c0e7b40422e41bb81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207fef44113fa1796ee65f1c6a703b7669870cd1c61a53a90a4ca8386ec92d9cb09360c08301523360e083015260ff8981166101008401528816610120808401919091528451808403909101815261014083019094528351939092019290922061190160f01b6101608401526101628301829052610182830181905290916000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015610e22573d6000803e3d6000fd5b5050604051601f1901516008549092506001600160a01b038084166201000090920416149050610e885760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e61746f727960781b604482015260640161051a565b610ea9338a60ff168a60ff1660405180602001604052806000815250611226565b60ff898116600090815260076020526040902054610ecd918a169061ffff16612347565b60ff999099166000908152600760205260409020805461ffff191661ffff909a16999099179098555050505050505050565b6060600580546105ac906123e0565b600854610100900460ff16610f355760405162461bcd60e51b815260040161051a90612203565b610f40338383611525565b5050565b600854610100900460ff16610f6b5760405162461bcd60e51b815260040161051a90612203565b6001600160a01b038516331480610f875750610f878533610424565b610fe55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161051a565b61080b8585858585611606565b6000546001600160a01b0316331461101c5760405162461bcd60e51b815260040161051a906122c0565b6001600160a01b0381166110815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161051a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111065760405162461bcd60e51b815260040161051a906122c0565b600880549115156101000261ff0019909216919091179055565b6060816111445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561116e578061115881612448565b91506111679050600a83612385565b9150611148565b60008167ffffffffffffffff811115611189576111896124b9565b6040519080825280601f01601f1916602001820160405280156111b3576020820181803683370190505b5090505b841561121e576111c8600183612399565b91506111d5600a86612463565b6111e090603061236d565b60f81b8183815181106111f5576111f56124a3565b60200101906001600160f81b031916908160001a905350611217600a86612385565b94506111b7565b949350505050565b6001600160a01b0384166112865760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161051a565b336112a08160008761129788611727565b61080b88611727565b60008481526001602090815260408083206001600160a01b0389168452909152812080548592906112d290849061236d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461080b81600087878787611772565b81518351146113945760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161051a565b6001600160a01b0384166113ba5760405162461bcd60e51b815260040161051a90612231565b3360005b84518110156114a45760008582815181106113db576113db6124a3565b6020026020010151905060008583815181106113f9576113f96124a3565b60209081029190910181015160008481526001835260408082206001600160a01b038e16835290935291909120549091508181101561144a5760405162461bcd60e51b815260040161051a90612276565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061148990849061236d565b925050819055505050508061149d90612448565b90506113be565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114f4929190612183565b60405180910390a461150a8187878787876118dd565b505050505050565b8051610f409060039060208401906119a7565b816001600160a01b0316836001600160a01b031614156115995760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161051a565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661162c5760405162461bcd60e51b815260040161051a90612231565b3361163c81878761129788611727565b60008481526001602090815260408083206001600160a01b038a1684529091529020548381101561167f5760405162461bcd60e51b815260040161051a90612276565b60008581526001602090815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906116be90849061236d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461171e828888888888611772565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611761576117616124a3565b602090810291909101015292915050565b6001600160a01b0384163b1561150a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906117b6908990899088908890889060040161212b565b602060405180830381600087803b1580156117d057600080fd5b505af1925050508015611800575060408051601f3d908101601f191682019092526117fd91810190611e76565b60015b6118ad5761180c6124cf565b806308c379a0141561184657506118216124eb565b8061182c5750611848565b8060405162461bcd60e51b815260040161051a91906121a8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161051a565b6001600160e01b0319811663f23a6e6160e01b1461171e5760405162461bcd60e51b815260040161051a906121bb565b6001600160a01b0384163b1561150a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061192190899089908890889088906004016120cd565b602060405180830381600087803b15801561193b57600080fd5b505af192505050801561196b575060408051601f3d908101601f1916820190925261196891810190611e76565b60015b6119775761180c6124cf565b6001600160e01b0319811663bc197c8160e01b1461171e5760405162461bcd60e51b815260040161051a906121bb565b8280546119b3906123e0565b90600052602060002090601f0160209004810192826119d55760008555611a1b565b82601f106119ee57805160ff1916838001178555611a1b565b82800160010185558215611a1b579182015b82811115611a1b578251825591602001919060010190611a00565b50611a27929150611a2b565b5090565b5b80821115611a275760008155600101611a2c565b600067ffffffffffffffff831115611a5a57611a5a6124b9565b604051611a71601f8501601f19166020018261241b565b809150838152848484011115611a8657600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b0381168114611ab557600080fd5b919050565b600082601f830112611acb57600080fd5b81356020611ad882612323565b604051611ae5828261241b565b8381528281019150858301600585901b87018401881015611b0557600080fd5b60005b85811015611b2457813584529284019290840190600101611b08565b5090979650505050505050565b80358015158114611ab557600080fd5b600082601f830112611b5257600080fd5b611b6183833560208501611a40565b9392505050565b803560ff81168114611ab557600080fd5b600060208284031215611b8b57600080fd5b611b6182611a9e565b60008060408385031215611ba757600080fd5b611bb083611a9e565b9150611bbe60208401611a9e565b90509250929050565b600080600080600060a08688031215611bdf57600080fd5b611be886611a9e565b9450611bf660208701611a9e565b9350604086013567ffffffffffffffff80821115611c1357600080fd5b611c1f89838a01611aba565b94506060880135915080821115611c3557600080fd5b611c4189838a01611aba565b93506080880135915080821115611c5757600080fd5b50611c6488828901611b41565b9150509295509295909350565b600080600080600060a08688031215611c8957600080fd5b611c9286611a9e565b9450611ca060208701611a9e565b93506040860135925060608601359150608086013567ffffffffffffffff811115611cca57600080fd5b611c6488828901611b41565b60008060408385031215611ce957600080fd5b611cf283611a9e565b9150611bbe60208401611b31565b60008060408385031215611d1357600080fd5b611d1c83611a9e565b946020939093013593505050565b600080600060608486031215611d3f57600080fd5b611d4884611a9e565b9250611d5660208501611b68565b9150611d6460408501611b68565b90509250925092565b60008060408385031215611d8057600080fd5b823567ffffffffffffffff80821115611d9857600080fd5b818501915085601f830112611dac57600080fd5b81356020611db982612323565b604051611dc6828261241b565b8381528281019150858301600585901b870184018b1015611de657600080fd5b600096505b84871015611e1057611dfc81611a9e565b835260019690960195918301918301611deb565b5096505086013592505080821115611e2757600080fd5b50611e3485828601611aba565b9150509250929050565b600060208284031215611e5057600080fd5b611b6182611b31565b600060208284031215611e6b57600080fd5b8135611b6181612575565b600060208284031215611e8857600080fd5b8151611b6181612575565b600060208284031215611ea557600080fd5b813567ffffffffffffffff811115611ebc57600080fd5b8201601f81018413611ecd57600080fd5b61121e84823560208401611a40565b600060208284031215611eee57600080fd5b5035919050565b600060208284031215611f0757600080fd5b611b6182611b68565b60008060408385031215611f2357600080fd5b611f2c83611b68565b9150602083013561ffff81168114611f4357600080fd5b809150509250929050565b600080600080600060a08688031215611f6657600080fd5b611f6f86611b68565b9450611f7d60208701611b68565b9350611f8b60408701611b68565b94979396509394606081013594506080013592915050565b600081518084526020808501945080840160005b83811015611fd357815187529582019590820190600101611fb7565b509495945050505050565b60008151808452611ff68160208601602086016123b0565b601f01601f19169290920160200192915050565b6000815161201c8185602086016123b0565b9290920192915050565b600080845481600182811c91508083168061204257607f831692505b602080841082141561206257634e487b7160e01b86526022600452602486fd5b8180156120765760018114612087576120b4565b60ff198616895284890196506120b4565b60008b81526020902060005b868110156120ac5781548b820152908501908301612093565b505084890196505b5050505050506120c4818561200a565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906120f990830186611fa3565b828103606084015261210b8186611fa3565b9050828103608084015261211f8185611fde565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061216590830184611fde565b979650505050505050565b602081526000611b616020830184611fa3565b6040815260006121966040830185611fa3565b82810360208401526120c48185611fa3565b602081526000611b616020830184611fde565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601490820152732737ba1030b63637bb903a37903a3930b9b332b960611b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d6178204c696d697420546f2050726573616c6560601b604082015260600190565b600067ffffffffffffffff82111561233d5761233d6124b9565b5060051b60200190565b600061ffff80831681851680830382111561236457612364612477565b01949350505050565b6000821982111561238057612380612477565b500190565b6000826123945761239461248d565b500490565b6000828210156123ab576123ab612477565b500390565b60005b838110156123cb5781810151838201526020016123b3565b838111156123da576000848401525b50505050565b600181811c908216806123f457607f821691505b6020821081141561241557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612441576124416124b9565b6040525050565b600060001982141561245c5761245c612477565b5060010190565b6000826124725761247261248d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156124e85760046000803e5060005160e01c5b90565b600060443d10156124f95790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561252957505050505090565b82850191508151818111156125415750505050505090565b843d870101602082850101111561255b5750505050505090565b61256a6020828601018761241b565b509095945050505050565b6001600160e01b0319811681146109c257600080fdfea2646970667358221220b40c3777f4dd997becac3322671a0735f0b0ff2d62498b547bffe51b4d0d7ca464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000044f7c870fa937578f6eace3fcd4789726e10535400000000000000000000000000000000000000000000000000000000000000084f535943204b455900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074f5359434b455900000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061014a5760003560e01c80636bcb6744116100b6578063a22cb4651161006f578063a22cb465146103b8578063d406d453146103d8578063e985e9c514610409578063f242432a14610452578063f2fde38b14610472578063fe015f0b1461049257600080fd5b80636bcb674414610321578063715018a61461033457806373cca556146103495780638da5cb5b1461035c57806392c967ef1461038457806395d89b41146103a357600080fd5b80632eb2c2d6116101085780632eb2c2d61461025a57806333bc1c5c1461027a57806349a46562146102945780634e1273f4146102b457806355f804b3146102e15780635aca1bb61461030157600080fd5b8062fdd58e1461014f57806301ffc9a71461018257806306fdde03146101b25780630e89341c146101d457806313414b39146101f457806319dd167a14610216575b600080fd5b34801561015b57600080fd5b5061016f61016a366004611d00565b6104b2565b6040519081526020015b60405180910390f35b34801561018e57600080fd5b506101a261019d366004611e59565b61054b565b6040519015158152602001610179565b3480156101be57600080fd5b506101c761059d565b60405161017991906121a8565b3480156101e057600080fd5b506101c76101ef366004611edc565b61062f565b34801561020057600080fd5b5061021461020f366004611d2a565b610663565b005b34801561022257600080fd5b50610247610231366004611ef5565b60066020526000908152604090205461ffff1681565b60405161ffff9091168152602001610179565b34801561026657600080fd5b50610214610275366004611bc7565b610754565b34801561028657600080fd5b506008546101a29060ff1681565b3480156102a057600080fd5b506102146102af366004611f10565b610812565b3480156102c057600080fd5b506102d46102cf366004611d6d565b610865565b6040516101799190612170565b3480156102ed57600080fd5b506102146102fc366004611e93565b61098f565b34801561030d57600080fd5b5061021461031c366004611e3e565b6109c5565b61021461032f366004611ef5565b610a02565b34801561034057600080fd5b50610214610b4b565b610214610357366004611f4e565b610bbf565b34801561036857600080fd5b506000546040516001600160a01b039091168152602001610179565b34801561039057600080fd5b506008546101a290610100900460ff1681565b3480156103af57600080fd5b506101c7610eff565b3480156103c457600080fd5b506102146103d3366004611cd6565b610f0e565b3480156103e457600080fd5b506102476103f3366004611ef5565b60076020526000908152604090205461ffff1681565b34801561041557600080fd5b506101a2610424366004611b94565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561045e57600080fd5b5061021461046d366004611c71565b610f44565b34801561047e57600080fd5b5061021461048d366004611b79565b610ff2565b34801561049e57600080fd5b506102146104ad366004611e3e565b6110dc565b60006001600160a01b0383166105235760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061057c57506001600160e01b031982166303a24d0760e21b145b8061059757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600480546105ac906123e0565b80601f01602080910402602001604051908101604052809291908181526020018280546105d8906123e0565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b6060600361063c83611120565b60405160200161064d929190612026565b6040516020818303038152906040529050919050565b6000546001600160a01b0316331461068d5760405162461bcd60e51b815260040161051a906122c0565b60ff80831660009081526006602090815260408083205460079092529091205461ffff918216926106c2929085169116612347565b61ffff16106106e35760405162461bcd60e51b815260040161051a906122f5565b610704838360ff168360ff1660405180602001604052806000815250611226565b60ff8281166000908152600760205260409020546107289183169061ffff16612347565b60ff929092166000908152600760205260409020805461ffff191661ffff909316929092179091555050565b600854610100900460ff1661077b5760405162461bcd60e51b815260040161051a90612203565b6001600160a01b03851633148061079757506107978533610424565b6107fe5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161051a565b61080b8585858585611332565b5050505050565b6000546001600160a01b0316331461083c5760405162461bcd60e51b815260040161051a906122c0565b60ff919091166000908152600660205260409020805461ffff191661ffff909216919091179055565b606081518351146108ca5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161051a565b6000835167ffffffffffffffff8111156108e6576108e66124b9565b60405190808252806020026020018201604052801561090f578160200160208202803683370190505b50905060005b84518110156109875761095a858281518110610933576109336124a3565b602002602001015185838151811061094d5761094d6124a3565b60200260200101516104b2565b82828151811061096c5761096c6124a3565b602090810291909101015261098081612448565b9050610915565b509392505050565b6000546001600160a01b031633146109b95760405162461bcd60e51b815260040161051a906122c0565b6109c281611512565b50565b6000546001600160a01b031633146109ef5760405162461bcd60e51b815260040161051a906122c0565b6008805460ff1916911515919091179055565b323314610a3c5760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b604482015260640161051a565b60085460ff16610a8e5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420616c6c6f77656420666f72207075626c69632073616c650000000000604482015260640161051a565b60ff811660009081526006602090815260408083205460079092529091205461ffff91821691610ac091166001612347565b61ffff1610610ae15760405162461bcd60e51b815260040161051a906122f5565b610b00338260ff16600160405180602001604052806000815250611226565b60ff8116600090815260076020526040902054610b229061ffff166001612347565b60ff919091166000908152600760205260409020805461ffff191661ffff909216919091179055565b6000546001600160a01b03163314610b755760405162461bcd60e51b815260040161051a906122c0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b323314610bf95760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b604482015260640161051a565b610c06338660ff166104b2565b15610c435760405162461bcd60e51b815260206004820152600d60248201526c105b1958591e48135a5b9d1959609a1b604482015260640161051a565b60ff80861660009081526006602090815260408083205460079092529091205461ffff91821692610c78929088169116612347565b61ffff1610610c995760405162461bcd60e51b815260040161051a906122f5565b604080518082018252601181527013d4d650c812d95e4810dbdb9d1c9858dd607a1b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f1e79d9e89fc6d5bed5ff5a02b40e1de15e96f346bf4570e66c0e7b40422e41bb81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207fef44113fa1796ee65f1c6a703b7669870cd1c61a53a90a4ca8386ec92d9cb09360c08301523360e083015260ff8981166101008401528816610120808401919091528451808403909101815261014083019094528351939092019290922061190160f01b6101608401526101628301829052610182830181905290916000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015610e22573d6000803e3d6000fd5b5050604051601f1901516008549092506001600160a01b038084166201000090920416149050610e885760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e61746f727960781b604482015260640161051a565b610ea9338a60ff168a60ff1660405180602001604052806000815250611226565b60ff898116600090815260076020526040902054610ecd918a169061ffff16612347565b60ff999099166000908152600760205260409020805461ffff191661ffff909a16999099179098555050505050505050565b6060600580546105ac906123e0565b600854610100900460ff16610f355760405162461bcd60e51b815260040161051a90612203565b610f40338383611525565b5050565b600854610100900460ff16610f6b5760405162461bcd60e51b815260040161051a90612203565b6001600160a01b038516331480610f875750610f878533610424565b610fe55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161051a565b61080b8585858585611606565b6000546001600160a01b0316331461101c5760405162461bcd60e51b815260040161051a906122c0565b6001600160a01b0381166110815760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161051a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111065760405162461bcd60e51b815260040161051a906122c0565b600880549115156101000261ff0019909216919091179055565b6060816111445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561116e578061115881612448565b91506111679050600a83612385565b9150611148565b60008167ffffffffffffffff811115611189576111896124b9565b6040519080825280601f01601f1916602001820160405280156111b3576020820181803683370190505b5090505b841561121e576111c8600183612399565b91506111d5600a86612463565b6111e090603061236d565b60f81b8183815181106111f5576111f56124a3565b60200101906001600160f81b031916908160001a905350611217600a86612385565b94506111b7565b949350505050565b6001600160a01b0384166112865760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161051a565b336112a08160008761129788611727565b61080b88611727565b60008481526001602090815260408083206001600160a01b0389168452909152812080548592906112d290849061236d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461080b81600087878787611772565b81518351146113945760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161051a565b6001600160a01b0384166113ba5760405162461bcd60e51b815260040161051a90612231565b3360005b84518110156114a45760008582815181106113db576113db6124a3565b6020026020010151905060008583815181106113f9576113f96124a3565b60209081029190910181015160008481526001835260408082206001600160a01b038e16835290935291909120549091508181101561144a5760405162461bcd60e51b815260040161051a90612276565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061148990849061236d565b925050819055505050508061149d90612448565b90506113be565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114f4929190612183565b60405180910390a461150a8187878787876118dd565b505050505050565b8051610f409060039060208401906119a7565b816001600160a01b0316836001600160a01b031614156115995760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161051a565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661162c5760405162461bcd60e51b815260040161051a90612231565b3361163c81878761129788611727565b60008481526001602090815260408083206001600160a01b038a1684529091529020548381101561167f5760405162461bcd60e51b815260040161051a90612276565b60008581526001602090815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906116be90849061236d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461171e828888888888611772565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611761576117616124a3565b602090810291909101015292915050565b6001600160a01b0384163b1561150a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906117b6908990899088908890889060040161212b565b602060405180830381600087803b1580156117d057600080fd5b505af1925050508015611800575060408051601f3d908101601f191682019092526117fd91810190611e76565b60015b6118ad5761180c6124cf565b806308c379a0141561184657506118216124eb565b8061182c5750611848565b8060405162461bcd60e51b815260040161051a91906121a8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161051a565b6001600160e01b0319811663f23a6e6160e01b1461171e5760405162461bcd60e51b815260040161051a906121bb565b6001600160a01b0384163b1561150a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061192190899089908890889088906004016120cd565b602060405180830381600087803b15801561193b57600080fd5b505af192505050801561196b575060408051601f3d908101601f1916820190925261196891810190611e76565b60015b6119775761180c6124cf565b6001600160e01b0319811663bc197c8160e01b1461171e5760405162461bcd60e51b815260040161051a906121bb565b8280546119b3906123e0565b90600052602060002090601f0160209004810192826119d55760008555611a1b565b82601f106119ee57805160ff1916838001178555611a1b565b82800160010185558215611a1b579182015b82811115611a1b578251825591602001919060010190611a00565b50611a27929150611a2b565b5090565b5b80821115611a275760008155600101611a2c565b600067ffffffffffffffff831115611a5a57611a5a6124b9565b604051611a71601f8501601f19166020018261241b565b809150838152848484011115611a8657600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b0381168114611ab557600080fd5b919050565b600082601f830112611acb57600080fd5b81356020611ad882612323565b604051611ae5828261241b565b8381528281019150858301600585901b87018401881015611b0557600080fd5b60005b85811015611b2457813584529284019290840190600101611b08565b5090979650505050505050565b80358015158114611ab557600080fd5b600082601f830112611b5257600080fd5b611b6183833560208501611a40565b9392505050565b803560ff81168114611ab557600080fd5b600060208284031215611b8b57600080fd5b611b6182611a9e565b60008060408385031215611ba757600080fd5b611bb083611a9e565b9150611bbe60208401611a9e565b90509250929050565b600080600080600060a08688031215611bdf57600080fd5b611be886611a9e565b9450611bf660208701611a9e565b9350604086013567ffffffffffffffff80821115611c1357600080fd5b611c1f89838a01611aba565b94506060880135915080821115611c3557600080fd5b611c4189838a01611aba565b93506080880135915080821115611c5757600080fd5b50611c6488828901611b41565b9150509295509295909350565b600080600080600060a08688031215611c8957600080fd5b611c9286611a9e565b9450611ca060208701611a9e565b93506040860135925060608601359150608086013567ffffffffffffffff811115611cca57600080fd5b611c6488828901611b41565b60008060408385031215611ce957600080fd5b611cf283611a9e565b9150611bbe60208401611b31565b60008060408385031215611d1357600080fd5b611d1c83611a9e565b946020939093013593505050565b600080600060608486031215611d3f57600080fd5b611d4884611a9e565b9250611d5660208501611b68565b9150611d6460408501611b68565b90509250925092565b60008060408385031215611d8057600080fd5b823567ffffffffffffffff80821115611d9857600080fd5b818501915085601f830112611dac57600080fd5b81356020611db982612323565b604051611dc6828261241b565b8381528281019150858301600585901b870184018b1015611de657600080fd5b600096505b84871015611e1057611dfc81611a9e565b835260019690960195918301918301611deb565b5096505086013592505080821115611e2757600080fd5b50611e3485828601611aba565b9150509250929050565b600060208284031215611e5057600080fd5b611b6182611b31565b600060208284031215611e6b57600080fd5b8135611b6181612575565b600060208284031215611e8857600080fd5b8151611b6181612575565b600060208284031215611ea557600080fd5b813567ffffffffffffffff811115611ebc57600080fd5b8201601f81018413611ecd57600080fd5b61121e84823560208401611a40565b600060208284031215611eee57600080fd5b5035919050565b600060208284031215611f0757600080fd5b611b6182611b68565b60008060408385031215611f2357600080fd5b611f2c83611b68565b9150602083013561ffff81168114611f4357600080fd5b809150509250929050565b600080600080600060a08688031215611f6657600080fd5b611f6f86611b68565b9450611f7d60208701611b68565b9350611f8b60408701611b68565b94979396509394606081013594506080013592915050565b600081518084526020808501945080840160005b83811015611fd357815187529582019590820190600101611fb7565b509495945050505050565b60008151808452611ff68160208601602086016123b0565b601f01601f19169290920160200192915050565b6000815161201c8185602086016123b0565b9290920192915050565b600080845481600182811c91508083168061204257607f831692505b602080841082141561206257634e487b7160e01b86526022600452602486fd5b8180156120765760018114612087576120b4565b60ff198616895284890196506120b4565b60008b81526020902060005b868110156120ac5781548b820152908501908301612093565b505084890196505b5050505050506120c4818561200a565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906120f990830186611fa3565b828103606084015261210b8186611fa3565b9050828103608084015261211f8185611fde565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061216590830184611fde565b979650505050505050565b602081526000611b616020830184611fa3565b6040815260006121966040830185611fa3565b82810360208401526120c48185611fa3565b602081526000611b616020830184611fde565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601490820152732737ba1030b63637bb903a37903a3930b9b332b960611b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d6178204c696d697420546f2050726573616c6560601b604082015260600190565b600067ffffffffffffffff82111561233d5761233d6124b9565b5060051b60200190565b600061ffff80831681851680830382111561236457612364612477565b01949350505050565b6000821982111561238057612380612477565b500190565b6000826123945761239461248d565b500490565b6000828210156123ab576123ab612477565b500390565b60005b838110156123cb5781810151838201526020016123b3565b838111156123da576000848401525b50505050565b600181811c908216806123f457607f821691505b6020821081141561241557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612441576124416124b9565b6040525050565b600060001982141561245c5761245c612477565b5060010190565b6000826124725761247261248d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156124e85760046000803e5060005160e01c5b90565b600060443d10156124f95790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561252957505050505090565b82850191508151818111156125415750505050505090565b843d870101602082850101111561255b5750505050505090565b61256a6020828601018761241b565b509095945050505050565b6001600160e01b0319811681146109c257600080fdfea2646970667358221220b40c3777f4dd997becac3322671a0735f0b0ff2d62498b547bffe51b4d0d7ca464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000044f7c870fa937578f6eace3fcd4789726e10535400000000000000000000000000000000000000000000000000000000000000084f535943204b455900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074f5359434b455900000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): OSYC KEY
Arg [1] : _symbol (string): OSYCKEY
Arg [2] : _admin (address): 0x44f7c870fA937578f6eacE3fCD4789726E105354

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000044f7c870fa937578f6eace3fcd4789726e105354
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 4f535943204b4559000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 4f5359434b455900000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

617:4673:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2271:306:2;;;;;;;;;;-1:-1:-1;2271:306:2;;;;;:::i;:::-;;:::i;:::-;;;22561:25:11;;;22549:2;22534:18;2271:306:2;;;;;;;;1180:349;;;;;;;;;;-1:-1:-1;1180:349:2;;;;;:::i;:::-;;:::i;:::-;;;13345:14:11;;13338:22;13320:41;;13308:2;13293:18;1180:349:2;13180:187:11;1426:89:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1928:201:2:-;;;;;;;;;;-1:-1:-1;1928:201:2;;;;;:::i;:::-;;:::i;4764:346:8:-;;;;;;;;;;-1:-1:-1;4764:346:8;;;;;:::i;:::-;;:::i;:::-;;715:42;;;;;;;;;;-1:-1:-1;715:42:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22396:6:11;22384:19;;;22366:38;;22354:2;22339:18;715:42:8;22222:188:11;2787:490:8;;;;;;;;;;-1:-1:-1;2787:490:8;;;;;:::i;:::-;;:::i;813:22::-;;;;;;;;;;-1:-1:-1;813:22:8;;;;;;;;1830:119;;;;;;;;;;-1:-1:-1;1830:119:8;;;;;:::i;:::-;;:::i;2734:542:2:-;;;;;;;;;;-1:-1:-1;2734:542:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1620:97:8:-;;;;;;;;;;-1:-1:-1;1620:97:8;;;;;:::i;:::-;;:::i;1723:101::-;;;;;;;;;;-1:-1:-1;1723:101:8;;;;;:::i;:::-;;:::i;4370:388::-;;;;;;:::i;:::-;;:::i;2225:145:9:-;;;;;;;;;;;;;:::i;3283:1081:8:-;;;;;;:::i;:::-;;:::i;1593:85:9:-;;;;;;;;;;-1:-1:-1;1639:7:9;1665:6;1593:85;;-1:-1:-1;;;;;1665:6:9;;;10986:51:11;;10974:2;10959:18;1593:85:9;10840:203:11;841:29:8;;;;;;;;;;-1:-1:-1;841:29:8;;;;;;;;;;;1521:93;;;;;;;;;;;;;:::i;2085:241::-;;;;;;;;;;-1:-1:-1;2085:241:8;;;;;:::i;:::-;;:::i;763:43::-;;;;;;;;;;-1:-1:-1;763:43:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;3592:210:2;;;;;;;;;;-1:-1:-1;3592:210:2;;;;;:::i;:::-;-1:-1:-1;;;;;3758:27:2;;;3731:4;3758:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3592:210;2332:449:8;;;;;;;;;;-1:-1:-1;2332:449:8;;;;;:::i;:::-;;:::i;2519:274:9:-;;;;;;;;;;-1:-1:-1;2519:274:9;;;;;:::i;:::-;;:::i;1955:124:8:-;;;;;;;;;;-1:-1:-1;1955:124:8;;;;;:::i;:::-;;:::i;2271:306:2:-;2397:7;-1:-1:-1;;;;;2441:21:2;;2420:111;;;;-1:-1:-1;;;2420:111:2;;16231:2:11;2420:111:2;;;16213:21:11;16270:2;16250:18;;;16243:30;16309:34;16289:18;;;16282:62;-1:-1:-1;;;16360:18:11;;;16353:41;16411:19;;2420:111:2;;;;;;;;;-1:-1:-1;2548:13:2;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;2548:22:2;;;;;;;;;;;;2271:306::o;1180:349::-;1322:4;-1:-1:-1;;;;;;1361:41:2;;-1:-1:-1;;;1361:41:2;;:109;;-1:-1:-1;;;;;;;1418:52:2;;-1:-1:-1;;;1418:52:2;1361:109;:161;;;-1:-1:-1;;;;;;;;;;1425:40:3;;;1486:36:2;1342:180;1180:349;-1:-1:-1;;1180:349:2:o;1426:89:8:-;1471:13;1503:5;1496:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1426:89;:::o;1928:201:2:-;2036:13;2096:4;2102:18;:7;:16;:18::i;:::-;2079:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2065:57;;1928:201;;;:::o;4764:346:8:-;1639:7:9;1665:6;-1:-1:-1;;;;;1665:6:9;1176:10:1;1805:23:9;1797:68;;;;-1:-1:-1;;;1797:68:9;;;;;;;:::i;:::-;4938:17:8::1;::::0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;4908:11:::1;:18:::0;;;;;;;4938:17:::1;::::0;;::::1;::::0;4908:27:::1;::::0;;;::::1;::::0;:18:::1;:27;:::i;:::-;:47;;;4887:114;;;;-1:-1:-1::0;;;4887:114:8::1;;;;;;;:::i;:::-;5012:33;5018:7;5027:5;5012:33;;5034:6;5012:33;;;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;5076:27;:18:::0;;::::1;;::::0;;;:11:::1;:18;::::0;;;;;:27:::1;::::0;;::::1;::::0;:18:::1;;:27;:::i;:::-;5055:18;::::0;;;::::1;;::::0;;;:11:::1;:18;::::0;;;;:48;;-1:-1:-1;;5055:48:8::1;;::::0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;4764:346:8:o;2787:490::-;2999:17;;;;;;;2991:50;;;;-1:-1:-1;;;2991:50:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;3072:20:8;;1176:10:1;3072:20:8;;:60;;-1:-1:-1;3096:36:8;3113:4;1176:10:1;3592:210:2;:::i;3096:36:8:-;3051:157;;;;-1:-1:-1;;;3051:157:8;;18897:2:11;3051:157:8;;;18879:21:11;18936:2;18916:18;;;18909:30;18975:34;18955:18;;;18948:62;-1:-1:-1;;;19026:18:11;;;19019:48;19084:19;;3051:157:8;18695:414:11;3051:157:8;3218:52;3241:4;3247:2;3251:3;3256:7;3265:4;3218:22;:52::i;:::-;2787:490;;;;;:::o;1830:119::-;1639:7:9;1665:6;-1:-1:-1;;;;;1665:6:9;1176:10:1;1805:23:9;1797:68;;;;-1:-1:-1;;;1797:68:9;;;;;;;:::i;:::-;1911:17:8::1;::::0;;;::::1;;::::0;;;:10:::1;:17;::::0;;;;:31;;-1:-1:-1;;1911:31:8::1;;::::0;;::::1;::::0;;;::::1;::::0;;1830:119::o;2734:542:2:-;2885:16;2957:3;:10;2938:8;:15;:29;2917:117;;;;-1:-1:-1;;;2917:117:2;;21203:2:11;2917:117:2;;;21185:21:11;21242:2;21222:18;;;21215:30;21281:34;21261:18;;;21254:62;-1:-1:-1;;;21332:18:11;;;21325:39;21381:19;;2917:117:2;21001:405:11;2917:117:2;3045:30;3092:8;:15;3078:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3078:30:2;;3045:63;;3124:9;3119:120;3143:8;:15;3139:1;:19;3119:120;;;3198:30;3208:8;3217:1;3208:11;;;;;;;;:::i;:::-;;;;;;;3221:3;3225:1;3221:6;;;;;;;;:::i;:::-;;;;;;;3198:9;:30::i;:::-;3179:13;3193:1;3179:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;3160:3;;;:::i;:::-;;;3119:120;;;-1:-1:-1;3256:13:2;2734:542;-1:-1:-1;;;2734:542:2:o;1620:97:8:-;1639:7:9;1665:6;-1:-1:-1;;;;;1665:6:9;1176:10:1;1805:23:9;1797:68;;;;-1:-1:-1;;;1797:68:9;;;;;;;:::i;:::-;1693:17:8::1;1701:8;1693:7;:17::i;:::-;1620:97:::0;:::o;1723:101::-;1639:7:9;1665:6;-1:-1:-1;;;;;1665:6:9;1176:10:1;1805:23:9;1797:68;;;;-1:-1:-1;;;1797:68:9;;;;;;;:::i;:::-;1793:10:8::1;:24:::0;;-1:-1:-1;;1793:24:8::1;::::0;::::1;;::::0;;;::::1;::::0;;1723:101::o;4370:388::-;4441:9;4454:10;4441:23;4433:44;;;;-1:-1:-1;;;4433:44:8;;17050:2:11;4433:44:8;;;17032:21:11;17089:1;17069:18;;;17062:29;-1:-1:-1;;;17107:18:11;;;17100:38;17155:18;;4433:44:8;16848:331:11;4433:44:8;4495:10;;;;4487:50;;;;-1:-1:-1;;;4487:50:8;;19727:2:11;4487:50:8;;;19709:21:11;19766:2;19746:18;;;19739:30;19805:29;19785:18;;;19778:57;19852:18;;4487:50:8;19525:351:11;4487:50:8;4593:17;;;;;;;:10;:17;;;;;;;;;4568:11;:18;;;;;;;4593:17;;;;;4568:22;;:18;4593:17;4568:22;:::i;:::-;:42;;;4547:109;;;;-1:-1:-1;;;4547:109:8;;;;;;;:::i;:::-;4667:31;4673:10;4685:5;4667:31;;4692:1;4667:31;;;;;;;;;;;;:5;:31::i;:::-;4729:18;;;;;;;:11;:18;;;;;;:22;;:18;;;:22;:::i;:::-;4708:18;;;;;;;;;:11;:18;;;;;:43;;-1:-1:-1;;4708:43:8;;;;;;;;;;;4370:388::o;2225:145:9:-;1639:7;1665:6;-1:-1:-1;;;;;1665:6:9;1176:10:1;1805:23:9;1797:68;;;;-1:-1:-1;;;1797:68:9;;;;;;;:::i;:::-;2331:1:::1;2315:6:::0;;2294:40:::1;::::0;-1:-1:-1;;;;;2315:6:9;;::::1;::::0;2294:40:::1;::::0;2331:1;;2294:40:::1;2361:1;2344:19:::0;;-1:-1:-1;;;;;;2344:19:9::1;::::0;;2225:145::o;3283:1081:8:-;3439:9;3452:10;3439:23;3431:44;;;;-1:-1:-1;;;3431:44:8;;17050:2:11;3431:44:8;;;17032:21:11;17089:1;17069:18;;;17062:29;-1:-1:-1;;;17107:18:11;;;17100:38;17155:18;;3431:44:8;16848:331:11;3431:44:8;3493:28;3503:10;3515:5;3493:28;;:9;:28::i;:::-;:33;3485:59;;;;-1:-1:-1;;;3485:59:8;;15889:2:11;3485:59:8;;;15871:21:11;15928:2;15908:18;;;15901:30;-1:-1:-1;;;15947:18:11;;;15940:43;16000:18;;3485:59:8;15687:337:11;3485:59:8;3605:17;;;;;;;;:10;:17;;;;;;;;;3575:11;:18;;;;;;;3605:17;;;;;3575:27;;;;;;:18;:27;:::i;:::-;:47;;;3554:114;;;;-1:-1:-1;;;3554:114:8;;;;;;;:::i;:::-;3805:13;;;;;;;;;;;-1:-1:-1;;;3805:13:8;;;;;3728:167;;1020:102;3728:167;;;14039:25:11;3789:31:8;14080:18:11;;;14073:34;5239:9:8;14123:18:11;;;14116:34;3876:4:8;14166:18:11;;;;14159:60;;;;3728:167:8;;;;;;;;;;14011:19:11;;;3728:167:8;;3705:200;;;;;;1177:53;3959:52;;;13595:25:11;3985:10:8;13636:18:11;;;13629:60;13737:4;13725:17;;;13705:18;;;13698:45;13779:17;;13759:18;;;;13752:45;;;;3959:52:8;;;;;;;;;;13567:19:11;;;3959:52:8;;;3936:85;;;;;;;;;;-1:-1:-1;;;4071:57:8;;;10701:27:11;10744:11;;;10737:27;;;10780:12;;;10773:28;;;3705:200:8;;-1:-1:-1;;10817:12:11;;4071:57:8;;;-1:-1:-1;;4071:57:8;;;;;;;;;4048:90;;4071:57;4048:90;;;;4148:17;4168:26;;;;;;;;;14457:25:11;;;14530:4;14518:17;;14498:18;;;14491:45;;;;14552:18;;;14545:34;;;14595:18;;;14588:34;;;4048:90:8;;-1:-1:-1;4148:17:8;4168:26;;14429:19:11;;4168:26:8;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4168:26:8;;-1:-1:-1;;4168:26:8;;4225:5;;4168:26;;-1:-1:-1;;;;;;4212:18:8;;;4225:5;;;;;4212:18;;-1:-1:-1;4204:48:8;;;;-1:-1:-1;;;4204:48:8;;18145:2:11;4204:48:8;;;18127:21:11;18184:2;18164:18;;;18157:30;-1:-1:-1;;;18203:18:11;;;18196:47;18260:18;;4204:48:8;17943:341:11;4204:48:8;4263:36;4269:10;4281:5;4263:36;;4288:6;4263:36;;;;;;;;;;;;;;:5;:36::i;:::-;4330:27;:18;;;;;;;:11;:18;;;;;;:27;;;;;:18;;:27;:::i;:::-;4309:18;;;;;;;;;:11;:18;;;;;:48;;-1:-1:-1;;4309:48:8;;;;;;;;;;;;-1:-1:-1;;;;;;;;3283:1081:8:o;1521:93::-;1568:13;1600:7;1593:14;;;;;:::i;2085:241::-;2215:17;;;;;;;2207:50;;;;-1:-1:-1;;;2207:50:8;;;;;;;:::i;:::-;2267:52;1176:10:1;2300:8:8;2310;2267:18;:52::i;:::-;2085:241;;:::o;2332:449::-;2519:17;;;;;;;2511:50;;;;-1:-1:-1;;;2511:50:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;2592:20:8;;1176:10:1;2592:20:8;;:60;;-1:-1:-1;2616:36:8;2633:4;1176:10:1;3592:210:2;:::i;2616:36:8:-;2571:148;;;;-1:-1:-1;;;2571:148:8;;17735:2:11;2571:148:8;;;17717:21:11;17774:2;17754:18;;;17747:30;17813:34;17793:18;;;17786:62;-1:-1:-1;;;17864:18:11;;;17857:39;17913:19;;2571:148:8;17533:405:11;2571:148:8;2729:45;2747:4;2753:2;2757;2761:6;2769:4;2729:17;:45::i;2519:274:9:-;1639:7;1665:6;-1:-1:-1;;;;;1665:6:9;1176:10:1;1805:23:9;1797:68;;;;-1:-1:-1;;;1797:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;2620:22:9;::::1;2599:107;;;::::0;-1:-1:-1;;;2599:107:9;;16643:2:11;2599:107:9::1;::::0;::::1;16625:21:11::0;16682:2;16662:18;;;16655:30;16721:34;16701:18;;;16694:62;-1:-1:-1;;;16772:18:11;;;16765:36;16818:19;;2599:107:9::1;16441:402:11::0;2599:107:9::1;2742:6;::::0;;2721:38:::1;::::0;-1:-1:-1;;;;;2721:38:9;;::::1;::::0;2742:6;::::1;::::0;2721:38:::1;::::0;::::1;2769:6;:17:::0;;-1:-1:-1;;;;;;2769:17:9::1;-1:-1:-1::0;;;;;2769:17:9;;;::::1;::::0;;;::::1;::::0;;2519:274::o;1955:124:8:-;1639:7:9;1665:6;-1:-1:-1;;;;;1665:6:9;1176:10:1;1805:23:9;1797:68;;;;-1:-1:-1;;;1797:68:9;;;;;;;:::i;:::-;2034:17:8::1;:38:::0;;;::::1;;;;-1:-1:-1::0;;2034:38:8;;::::1;::::0;;;::::1;::::0;;1955:124::o;785:703:10:-;841:13;1058:10;1054:51;;-1:-1:-1;;1084:10:10;;;;;;;;;;;;-1:-1:-1;;;1084:10:10;;;;;785:703::o;1054:51::-;1129:5;1114:12;1168:75;1175:9;;1168:75;;1200:8;;;;:::i;:::-;;-1:-1:-1;1222:10:10;;-1:-1:-1;1230:2:10;1222:10;;:::i;:::-;;;1168:75;;;1252:19;1284:6;1274:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1274:17:10;;1252:39;;1301:150;1308:10;;1301:150;;1334:11;1344:1;1334:11;;:::i;:::-;;-1:-1:-1;1402:10:10;1410:2;1402:5;:10;:::i;:::-;1389:24;;:2;:24;:::i;:::-;1376:39;;1359:6;1366;1359:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1359:56:10;;;;;;;;-1:-1:-1;1429:11:10;1438:2;1429:11;;:::i;:::-;;;1301:150;;;1474:6;785:703;-1:-1:-1;;;;785:703:10:o;8958:717:2:-;-1:-1:-1;;;;;9105:16:2;;9097:62;;;;-1:-1:-1;;;9097:62:2;;22022:2:11;9097:62:2;;;22004:21:11;22061:2;22041:18;;;22034:30;22100:34;22080:18;;;22073:62;-1:-1:-1;;;22151:18:11;;;22144:31;22192:19;;9097:62:2;21820:397:11;9097:62:2;1176:10:1;9212:184:2;1176:10:1;9170:16:2;9292:2;9308:21;9326:2;9308:17;:21::i;:::-;9343:25;9361:6;9343:17;:25::i;9212:184::-;9407:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;9407:17:2;;;;;;;;;:27;;9428:6;;9407:13;:27;;9428:6;;9407:27;:::i;:::-;;;;-1:-1:-1;;9449:52:2;;;22771:25:11;;;22827:2;22812:18;;22805:34;;;-1:-1:-1;;;;;9449:52:2;;;;9482:1;;9449:52;;;;;;22744:18:11;9449:52:2;;;;;;;9512:156;9556:8;9586:1;9602:2;9618;9634:6;9654:4;9512:30;:156::i;6469:1207::-;6702:7;:14;6688:3;:10;:28;6667:115;;;;-1:-1:-1;;;6667:115:2;;21613:2:11;6667:115:2;;;21595:21:11;21652:2;21632:18;;;21625:30;21691:34;21671:18;;;21664:62;-1:-1:-1;;;21742:18:11;;;21735:38;21790:19;;6667:115:2;21411:404:11;6667:115:2;-1:-1:-1;;;;;6800:16:2;;6792:66;;;;-1:-1:-1;;;6792:66:2;;;;;;;:::i;:::-;1176:10:1;6869:16:2;6982:457;7006:3;:10;7002:1;:14;6982:457;;;7037:10;7050:3;7054:1;7050:6;;;;;;;;:::i;:::-;;;;;;;7037:19;;7070:14;7087:7;7095:1;7087:10;;;;;;;;:::i;:::-;;;;;;;;;;;;7112:19;7134:13;;;:9;:13;;;;;;-1:-1:-1;;;;;7134:19:2;;;;;;;;;;;;7087:10;;-1:-1:-1;7192:21:2;;;;7167:122;;;;-1:-1:-1;;;7167:122:2;;;;;;;:::i;:::-;7331:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;7331:19:2;;;;;;;;;;7353:20;;;7331:42;;7401:17;;;;;;;:27;;7353:20;;7331:13;7401:27;;7353:20;;7401:27;:::i;:::-;;;;;;;;7023:416;;;7018:3;;;;:::i;:::-;;;6982:457;;;;7484:2;-1:-1:-1;;;;;7454:47:2;7478:4;-1:-1:-1;;;;;7454:47:2;7468:8;-1:-1:-1;;;;;7454:47:2;;7488:3;7493:7;7454:47;;;;;;;:::i;:::-;;;;;;;;7512:157;7561:8;7583:4;7601:2;7617:3;7634:7;7655:4;7512:35;:157::i;:::-;6657:1019;6469:1207;;;;;:::o;8499:86::-;8565:13;;;;:4;;:13;;;;;:::i;13079:323::-;13229:8;-1:-1:-1;;;;;13220:17:2;:5;-1:-1:-1;;;;;13220:17:2;;;13212:71;;;;-1:-1:-1;;;13212:71:2;;20793:2:11;13212:71:2;;;20775:21:11;20832:2;20812:18;;;20805:30;20871:34;20851:18;;;20844:62;-1:-1:-1;;;20922:18:11;;;20915:39;20971:19;;13212:71:2;20591:405:11;13212:71:2;-1:-1:-1;;;;;13293:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13293:46:2;;;;;;;;;;13354:41;;13320::11;;;13354::2;;13293:18:11;13354:41:2;;;;;;;13079:323;;;:::o;5210:913::-;-1:-1:-1;;;;;5391:16:2;;5383:66;;;;-1:-1:-1;;;5383:66:2;;;;;;;:::i;:::-;1176:10:1;5502:178:2;1176:10:1;5558:4:2;5576:2;5592:21;5610:2;5592:17;:21::i;5502:178::-;5691:19;5713:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5713:19:2;;;;;;;;;;5763:21;;;;5742:110;;;;-1:-1:-1;;;5742:110:2;;;;;;;:::i;:::-;5886:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5886:19:2;;;;;;;;;;5908:20;;;5886:42;;5948:17;;;;;;;:27;;5908:20;;5886:13;5948:27;;5908:20;;5948:27;:::i;:::-;;;;-1:-1:-1;;5991:46:2;;;22771:25:11;;;22827:2;22812:18;;22805:34;;;-1:-1:-1;;;;;5991:46:2;;;;;;;;;;;;;;22744:18:11;5991:46:2;;;;;;;6048:68;6079:8;6089:4;6095:2;6099;6103:6;6111:4;6048:30;:68::i;:::-;5373:750;;5210:913;;;;;:::o;16385:221::-;16532:16;;;16546:1;16532:16;;;;;;;;;16475;;16507:22;;16532:16;;;;;;;;;;;;-1:-1:-1;16532:16:2;16507:41;;16569:7;16558:5;16564:1;16558:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;16594:5;16385:221;-1:-1:-1;;16385:221:2:o;14556:871::-;-1:-1:-1;;;;;14763:13:2;;1544:20:0;1590:8;14759:662:2;;14814:190;;-1:-1:-1;;;14814:190:2;;-1:-1:-1;;;;;14814:38:2;;;;;:190;;14874:8;;14904:4;;14930:2;;14954:6;;14982:4;;14814:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14814:190:2;;;;;;;;-1:-1:-1;;14814:190:2;;;;;;;;;;;;:::i;:::-;;;14794:617;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;15287:6;15280:14;;-1:-1:-1;;;15280:14:2;;;;;;;;:::i;14794:617::-;;;15334:62;;-1:-1:-1;;;15334:62:2;;15059:2:11;15334:62:2;;;15041:21:11;15098:2;15078:18;;;15071:30;15137:34;15117:18;;;15110:62;-1:-1:-1;;;15188:18:11;;;15181:50;15248:19;;15334:62:2;14857:416:11;14794:617:2;-1:-1:-1;;;;;;15065:55:2;;-1:-1:-1;;;15065:55:2;15061:152;;15144:50;;-1:-1:-1;;;15144:50:2;;;;;;;:::i;15433:946::-;-1:-1:-1;;;;;15665:13:2;;1544:20:0;1590:8;15661:712:2;;15716:197;;-1:-1:-1;;;15716:197:2;;-1:-1:-1;;;;;15716:43:2;;;;;:197;;15781:8;;15811:4;;15837:3;;15862:7;;15891:4;;15716:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15716:197:2;;;;;;;;-1:-1:-1;;15716:197:2;;;;;;;;;;;;:::i;:::-;;;15696:667;;;;:::i;:::-;-1:-1:-1;;;;;;15995:60:2;;-1:-1:-1;;;15995:60:2;15970:195;;16096:50;;-1:-1:-1;;;16096:50:2;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:11;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:11;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:11;;594:42;;584:70;;650:1;647;640:12;584:70;487:173;;;:::o;665:735::-;719:5;772:3;765:4;757:6;753:17;749:27;739:55;;790:1;787;780:12;739:55;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:11;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:11;;;1175:1;1172;1165:12;1118:61;1197:1;1207:163;1221:2;1218:1;1215:9;1207:163;;;1278:17;;1266:30;;1316:12;;;;1348;;;;1239:1;1232:9;1207:163;;;-1:-1:-1;1388:6:11;;665:735;-1:-1:-1;;;;;;;665:735:11:o;1405:160::-;1470:20;;1526:13;;1519:21;1509:32;;1499:60;;1555:1;1552;1545:12;1570:220;1612:5;1665:3;1658:4;1650:6;1646:17;1642:27;1632:55;;1683:1;1680;1673:12;1632:55;1705:79;1780:3;1771:6;1758:20;1751:4;1743:6;1739:17;1705:79;:::i;:::-;1696:88;1570:220;-1:-1:-1;;;1570:220:11:o;1795:156::-;1861:20;;1921:4;1910:16;;1900:27;;1890:55;;1941:1;1938;1931:12;1956:186;2015:6;2068:2;2056:9;2047:7;2043:23;2039:32;2036:52;;;2084:1;2081;2074:12;2036:52;2107:29;2126:9;2107:29;:::i;2147:260::-;2215:6;2223;2276:2;2264:9;2255:7;2251:23;2247:32;2244:52;;;2292:1;2289;2282:12;2244:52;2315:29;2334:9;2315:29;:::i;:::-;2305:39;;2363:38;2397:2;2386:9;2382:18;2363:38;:::i;:::-;2353:48;;2147:260;;;;;:::o;2412:943::-;2566:6;2574;2582;2590;2598;2651:3;2639:9;2630:7;2626:23;2622:33;2619:53;;;2668:1;2665;2658:12;2619:53;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2828:2;2817:9;2813:18;2800:32;2851:18;2892:2;2884:6;2881:14;2878:34;;;2908:1;2905;2898:12;2878:34;2931:61;2984:7;2975:6;2964:9;2960:22;2931:61;:::i;:::-;2921:71;;3045:2;3034:9;3030:18;3017:32;3001:48;;3074:2;3064:8;3061:16;3058:36;;;3090:1;3087;3080:12;3058:36;3113:63;3168:7;3157:8;3146:9;3142:24;3113:63;:::i;:::-;3103:73;;3229:3;3218:9;3214:19;3201:33;3185:49;;3259:2;3249:8;3246:16;3243:36;;;3275:1;3272;3265:12;3243:36;;3298:51;3341:7;3330:8;3319:9;3315:24;3298:51;:::i;:::-;3288:61;;;2412:943;;;;;;;;:::o;3360:606::-;3464:6;3472;3480;3488;3496;3549:3;3537:9;3528:7;3524:23;3520:33;3517:53;;;3566:1;3563;3556:12;3517:53;3589:29;3608:9;3589:29;:::i;:::-;3579:39;;3637:38;3671:2;3660:9;3656:18;3637:38;:::i;:::-;3627:48;;3722:2;3711:9;3707:18;3694:32;3684:42;;3773:2;3762:9;3758:18;3745:32;3735:42;;3828:3;3817:9;3813:19;3800:33;3856:18;3848:6;3845:30;3842:50;;;3888:1;3885;3878:12;3842:50;3911:49;3952:7;3943:6;3932:9;3928:22;3911:49;:::i;3971:254::-;4036:6;4044;4097:2;4085:9;4076:7;4072:23;4068:32;4065:52;;;4113:1;4110;4103:12;4065:52;4136:29;4155:9;4136:29;:::i;:::-;4126:39;;4184:35;4215:2;4204:9;4200:18;4184:35;:::i;4230:254::-;4298:6;4306;4359:2;4347:9;4338:7;4334:23;4330:32;4327:52;;;4375:1;4372;4365:12;4327:52;4398:29;4417:9;4398:29;:::i;:::-;4388:39;4474:2;4459:18;;;;4446:32;;-1:-1:-1;;;4230:254:11:o;4489:326::-;4562:6;4570;4578;4631:2;4619:9;4610:7;4606:23;4602:32;4599:52;;;4647:1;4644;4637:12;4599:52;4670:29;4689:9;4670:29;:::i;:::-;4660:39;;4718:36;4750:2;4739:9;4735:18;4718:36;:::i;:::-;4708:46;;4773:36;4805:2;4794:9;4790:18;4773:36;:::i;:::-;4763:46;;4489:326;;;;;:::o;4820:1219::-;4938:6;4946;4999:2;4987:9;4978:7;4974:23;4970:32;4967:52;;;5015:1;5012;5005:12;4967:52;5055:9;5042:23;5084:18;5125:2;5117:6;5114:14;5111:34;;;5141:1;5138;5131:12;5111:34;5179:6;5168:9;5164:22;5154:32;;5224:7;5217:4;5213:2;5209:13;5205:27;5195:55;;5246:1;5243;5236:12;5195:55;5282:2;5269:16;5304:4;5327:43;5367:2;5327:43;:::i;:::-;5399:2;5393:9;5411:31;5439:2;5431:6;5411:31;:::i;:::-;5477:18;;;5511:15;;;;-1:-1:-1;5546:11:11;;;5588:1;5584:10;;;5576:19;;5572:28;;5569:41;-1:-1:-1;5566:61:11;;;5623:1;5620;5613:12;5566:61;5645:1;5636:10;;5655:169;5669:2;5666:1;5663:9;5655:169;;;5726:23;5745:3;5726:23;:::i;:::-;5714:36;;5687:1;5680:9;;;;;5770:12;;;;5802;;5655:169;;;-1:-1:-1;5843:6:11;-1:-1:-1;;5887:18:11;;5874:32;;-1:-1:-1;;5918:16:11;;;5915:36;;;5947:1;5944;5937:12;5915:36;;5970:63;6025:7;6014:8;6003:9;5999:24;5970:63;:::i;:::-;5960:73;;;4820:1219;;;;;:::o;6044:180::-;6100:6;6153:2;6141:9;6132:7;6128:23;6124:32;6121:52;;;6169:1;6166;6159:12;6121:52;6192:26;6208:9;6192:26;:::i;6229:245::-;6287:6;6340:2;6328:9;6319:7;6315:23;6311:32;6308:52;;;6356:1;6353;6346:12;6308:52;6395:9;6382:23;6414:30;6438:5;6414:30;:::i;6479:249::-;6548:6;6601:2;6589:9;6580:7;6576:23;6572:32;6569:52;;;6617:1;6614;6607:12;6569:52;6649:9;6643:16;6668:30;6692:5;6668:30;:::i;6733:450::-;6802:6;6855:2;6843:9;6834:7;6830:23;6826:32;6823:52;;;6871:1;6868;6861:12;6823:52;6911:9;6898:23;6944:18;6936:6;6933:30;6930:50;;;6976:1;6973;6966:12;6930:50;6999:22;;7052:4;7044:13;;7040:27;-1:-1:-1;7030:55:11;;7081:1;7078;7071:12;7030:55;7104:73;7169:7;7164:2;7151:16;7146:2;7142;7138:11;7104:73;:::i;7188:180::-;7247:6;7300:2;7288:9;7279:7;7275:23;7271:32;7268:52;;;7316:1;7313;7306:12;7268:52;-1:-1:-1;7339:23:11;;7188:180;-1:-1:-1;7188:180:11:o;7373:182::-;7430:6;7483:2;7471:9;7462:7;7458:23;7454:32;7451:52;;;7499:1;7496;7489:12;7451:52;7522:27;7539:9;7522:27;:::i;7560:342::-;7625:6;7633;7686:2;7674:9;7665:7;7661:23;7657:32;7654:52;;;7702:1;7699;7692:12;7654:52;7725:27;7742:9;7725:27;:::i;:::-;7715:37;;7802:2;7791:9;7787:18;7774:32;7846:6;7839:5;7835:18;7828:5;7825:29;7815:57;;7868:1;7865;7858:12;7815:57;7891:5;7881:15;;;7560:342;;;;;:::o;7907:460::-;7996:6;8004;8012;8020;8028;8081:3;8069:9;8060:7;8056:23;8052:33;8049:53;;;8098:1;8095;8088:12;8049:53;8121:27;8138:9;8121:27;:::i;:::-;8111:37;;8167:36;8199:2;8188:9;8184:18;8167:36;:::i;:::-;8157:46;;8222:36;8254:2;8243:9;8239:18;8222:36;:::i;:::-;7907:460;;;;-1:-1:-1;8212:46:11;;8305:2;8290:18;;8277:32;;-1:-1:-1;8356:3:11;8341:19;8328:33;;7907:460;-1:-1:-1;;7907:460:11:o;8372:435::-;8425:3;8463:5;8457:12;8490:6;8485:3;8478:19;8516:4;8545:2;8540:3;8536:12;8529:19;;8582:2;8575:5;8571:14;8603:1;8613:169;8627:6;8624:1;8621:13;8613:169;;;8688:13;;8676:26;;8722:12;;;;8757:15;;;;8649:1;8642:9;8613:169;;;-1:-1:-1;8798:3:11;;8372:435;-1:-1:-1;;;;;8372:435:11:o;8812:257::-;8853:3;8891:5;8885:12;8918:6;8913:3;8906:19;8934:63;8990:6;8983:4;8978:3;8974:14;8967:4;8960:5;8956:16;8934:63;:::i;:::-;9051:2;9030:15;-1:-1:-1;;9026:29:11;9017:39;;;;9058:4;9013:50;;8812:257;-1:-1:-1;;8812:257:11:o;9074:185::-;9116:3;9154:5;9148:12;9169:52;9214:6;9209:3;9202:4;9195:5;9191:16;9169:52;:::i;:::-;9237:16;;;;;9074:185;-1:-1:-1;;9074:185:11:o;9264:1174::-;9440:3;9469:1;9502:6;9496:13;9532:3;9554:1;9582:9;9578:2;9574:18;9564:28;;9642:2;9631:9;9627:18;9664;9654:61;;9708:4;9700:6;9696:17;9686:27;;9654:61;9734:2;9782;9774:6;9771:14;9751:18;9748:38;9745:165;;;-1:-1:-1;;;9809:33:11;;9865:4;9862:1;9855:15;9895:4;9816:3;9883:17;9745:165;9926:18;9953:104;;;;10071:1;10066:320;;;;9919:467;;9953:104;-1:-1:-1;;9986:24:11;;9974:37;;10031:16;;;;-1:-1:-1;9953:104:11;;10066:320;23111:1;23104:14;;;23148:4;23135:18;;10161:1;10175:165;10189:6;10186:1;10183:13;10175:165;;;10267:14;;10254:11;;;10247:35;10310:16;;;;10204:10;;10175:165;;;10179:3;;10369:6;10364:3;10360:16;10353:23;;9919:467;;;;;;;10402:30;10428:3;10420:6;10402:30;:::i;:::-;10395:37;9264:1174;-1:-1:-1;;;;;9264:1174:11:o;11048:826::-;-1:-1:-1;;;;;11445:15:11;;;11427:34;;11497:15;;11492:2;11477:18;;11470:43;11407:3;11544:2;11529:18;;11522:31;;;11370:4;;11576:57;;11613:19;;11605:6;11576:57;:::i;:::-;11681:9;11673:6;11669:22;11664:2;11653:9;11649:18;11642:50;11715:44;11752:6;11744;11715:44;:::i;:::-;11701:58;;11808:9;11800:6;11796:22;11790:3;11779:9;11775:19;11768:51;11836:32;11861:6;11853;11836:32;:::i;:::-;11828:40;11048:826;-1:-1:-1;;;;;;;;11048:826:11:o;11879:560::-;-1:-1:-1;;;;;12176:15:11;;;12158:34;;12228:15;;12223:2;12208:18;;12201:43;12275:2;12260:18;;12253:34;;;12318:2;12303:18;;12296:34;;;12138:3;12361;12346:19;;12339:32;;;12101:4;;12388:45;;12413:19;;12405:6;12388:45;:::i;:::-;12380:53;11879:560;-1:-1:-1;;;;;;;11879:560:11:o;12444:261::-;12623:2;12612:9;12605:21;12586:4;12643:56;12695:2;12684:9;12680:18;12672:6;12643:56;:::i;12710:465::-;12967:2;12956:9;12949:21;12930:4;12993:56;13045:2;13034:9;13030:18;13022:6;12993:56;:::i;:::-;13097:9;13089:6;13085:22;13080:2;13069:9;13065:18;13058:50;13125:44;13162:6;13154;13125:44;:::i;14633:219::-;14782:2;14771:9;14764:21;14745:4;14802:44;14842:2;14831:9;14827:18;14819:6;14802:44;:::i;15278:404::-;15480:2;15462:21;;;15519:2;15499:18;;;15492:30;15558:34;15553:2;15538:18;;15531:62;-1:-1:-1;;;15624:2:11;15609:18;;15602:38;15672:3;15657:19;;15278:404::o;17184:344::-;17386:2;17368:21;;;17425:2;17405:18;;;17398:30;-1:-1:-1;;;17459:2:11;17444:18;;17437:50;17519:2;17504:18;;17184:344::o;18289:401::-;18491:2;18473:21;;;18530:2;18510:18;;;18503:30;18569:34;18564:2;18549:18;;18542:62;-1:-1:-1;;;18635:2:11;18620:18;;18613:35;18680:3;18665:19;;18289:401::o;19114:406::-;19316:2;19298:21;;;19355:2;19335:18;;;19328:30;19394:34;19389:2;19374:18;;19367:62;-1:-1:-1;;;19460:2:11;19445:18;;19438:40;19510:3;19495:19;;19114:406::o;19881:356::-;20083:2;20065:21;;;20102:18;;;20095:30;20161:34;20156:2;20141:18;;20134:62;20228:2;20213:18;;19881:356::o;20242:344::-;20444:2;20426:21;;;20483:2;20463:18;;;20456:30;-1:-1:-1;;;20517:2:11;20502:18;;20495:50;20577:2;20562:18;;20242:344::o;22850:183::-;22910:4;22943:18;22935:6;22932:30;22929:56;;;22965:18;;:::i;:::-;-1:-1:-1;23010:1:11;23006:14;23022:4;23002:25;;22850:183::o;23164:224::-;23203:3;23231:6;23264:2;23261:1;23257:10;23294:2;23291:1;23287:10;23325:3;23321:2;23317:12;23312:3;23309:21;23306:47;;;23333:18;;:::i;:::-;23369:13;;23164:224;-1:-1:-1;;;;23164:224:11:o;23393:128::-;23433:3;23464:1;23460:6;23457:1;23454:13;23451:39;;;23470:18;;:::i;:::-;-1:-1:-1;23506:9:11;;23393:128::o;23526:120::-;23566:1;23592;23582:35;;23597:18;;:::i;:::-;-1:-1:-1;23631:9:11;;23526:120::o;23651:125::-;23691:4;23719:1;23716;23713:8;23710:34;;;23724:18;;:::i;:::-;-1:-1:-1;23761:9:11;;23651:125::o;23781:258::-;23853:1;23863:113;23877:6;23874:1;23871:13;23863:113;;;23953:11;;;23947:18;23934:11;;;23927:39;23899:2;23892:10;23863:113;;;23994:6;23991:1;23988:13;23985:48;;;24029:1;24020:6;24015:3;24011:16;24004:27;23985:48;;23781:258;;;:::o;24044:380::-;24123:1;24119:12;;;;24166;;;24187:61;;24241:4;24233:6;24229:17;24219:27;;24187:61;24294:2;24286:6;24283:14;24263:18;24260:38;24257:161;;;24340:10;24335:3;24331:20;24328:1;24321:31;24375:4;24372:1;24365:15;24403:4;24400:1;24393:15;24257:161;;24044:380;;;:::o;24429:249::-;24539:2;24520:13;;-1:-1:-1;;24516:27:11;24504:40;;24574:18;24559:34;;24595:22;;;24556:62;24553:88;;;24621:18;;:::i;:::-;24657:2;24650:22;-1:-1:-1;;24429:249:11:o;24683:135::-;24722:3;-1:-1:-1;;24743:17:11;;24740:43;;;24763:18;;:::i;:::-;-1:-1:-1;24810:1:11;24799:13;;24683:135::o;24823:112::-;24855:1;24881;24871:35;;24886:18;;:::i;:::-;-1:-1:-1;24920:9:11;;24823:112::o;24940:127::-;25001:10;24996:3;24992:20;24989:1;24982:31;25032:4;25029:1;25022:15;25056:4;25053:1;25046:15;25072:127;25133:10;25128:3;25124:20;25121:1;25114:31;25164:4;25161:1;25154:15;25188:4;25185:1;25178:15;25204:127;25265:10;25260:3;25256:20;25253:1;25246:31;25296:4;25293:1;25286:15;25320:4;25317:1;25310:15;25336:127;25397:10;25392:3;25388:20;25385:1;25378:31;25428:4;25425:1;25418:15;25452:4;25449:1;25442:15;25468:179;25503:3;25545:1;25527:16;25524:23;25521:120;;;25591:1;25588;25585;25570:23;-1:-1:-1;25628:1:11;25622:8;25617:3;25613:18;25521:120;25468:179;:::o;25652:671::-;25691:3;25733:4;25715:16;25712:26;25709:39;;;25652:671;:::o;25709:39::-;25775:2;25769:9;-1:-1:-1;;25840:16:11;25836:25;;25833:1;25769:9;25812:50;25891:4;25885:11;25915:16;25950:18;26021:2;26014:4;26006:6;26002:17;25999:25;25994:2;25986:6;25983:14;25980:45;25977:58;;;26028:5;;;;;25652:671;:::o;25977:58::-;26065:6;26059:4;26055:17;26044:28;;26101:3;26095:10;26128:2;26120:6;26117:14;26114:27;;;26134:5;;;;;;25652:671;:::o;26114:27::-;26218:2;26199:16;26193:4;26189:27;26185:36;26178:4;26169:6;26164:3;26160:16;26156:27;26153:69;26150:82;;;26225:5;;;;;;25652:671;:::o;26150:82::-;26241:57;26292:4;26283:6;26275;26271:19;26267:30;26261:4;26241:57;:::i;:::-;-1:-1:-1;26314:3:11;;25652:671;-1:-1:-1;;;;;25652:671:11:o;26328:131::-;-1:-1:-1;;;;;;26402:32:11;;26392:43;;26382:71;;26449:1;26446;26439:12

Swarm Source

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