ETH Price: $3,305.25 (-0.61%)
Gas: 10 Gwei

Token

Metaani Award Season1 ()
 

Overview

Max Total Supply

48

Holders

40

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
miuradonuts.eth
0x7E68C1aDF83A1967aeAFcD0bbDD9f7c83f237494
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:
MetaaniAwardSeason1

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 13: MetaaniAwardSeason1.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "./ERC1155.sol";

import "./Ownable.sol";

import "./IConataNFT.sol";

import "./Strings.sol";

//
contract MetaaniAwardSeason1 is IConataNFT, ERC1155, Ownable{
    string public name = "Metaani Award Season1";
    uint private _mintedAmount = 0;
    uint private _burnedAmount = 0;

    //
    constructor() ERC1155("ipfs://QmTvr3anBz4ED7pXJXJjaz4W5ZvNHQEJzULjes6zfDvq6m/") {}

    
    //
    function mint(bytes calldata data) override(IConataNFT) external payable{ revert("Not Implement");}
    function mint() override(IConataNFT) external payable{ revert("Not Implement");}

    
    function getOpenedMintTermNames() override(IConataNFT) external view returns(string[] memory){revert("Not Implement");}

    
    function totalSupply() override(IConataNFT) external view returns(uint256){
        return _mintedAmount - _burnedAmount;
    }

    

    
    function uri(uint256 _tokenId) public view virtual override(ERC1155) returns (string memory) {
        string memory baseURI = super.uri(_tokenId);
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(_tokenId))) : "";
    }

    // 
    function burn(uint tokenId, bytes calldata data) external{
        (uint amount) = abi.decode(data, (uint));
        address account = _msgSender();
        _burn(account, tokenId, amount);
        _burnedAmount += amount;
    }

    
    
    //
    function _minter(address account, uint amount, uint tokenId) internal{
        _mint(account, tokenId, amount, "");
        _mintedAmount += amount;
    }

    
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) override(ERC1155) internal pure {
        require(
            from == address(0) || to == address(0),
            "Not allowed to transfer token"
        );
    }

    

    
    function giveaway(address[] memory accounts, uint[] memory amounts, uint tokenId) external onlyOwner {
        require(accounts.length == amounts.length, "Invalid Length");
        for(uint i=0; i < accounts.length; i++){
            _minter(accounts[i], amounts[i], tokenId);
        }
    }

    
    function setURI(string memory newURI) override(IConataNFT) external onlyOwner {
        _setURI(newURI);
    }

    //
    function withdraw() override(IConataNFT) external pure {revert("Not Implement");}
    function withdrawSpare() override(IConataNFT) external pure {revert("Not Implement");}

}

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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 13: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (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";

/**
 * @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 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(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @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) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @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: address zero is not a valid owner");
        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 token owner or 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: caller is not token owner or 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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, 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);

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

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

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

        _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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 _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);

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

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

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * 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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * 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);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "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 `ids` and `amounts` 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 {}

    /**
     * @dev Hook that is called after 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 _afterTokenTransfer(
        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 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;
import "./IERC165.sol";

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

File 5 of 13: IConataNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;







//       - ethers-v6: contract.mint(ethers.Typed.bytes("0x00"));
//       - ethers-v5: contract["mint(bytes)"]([0x00]);

//       - `ethers.utils.defaultAbiCoder.encode(["uint", "string"], [888, "Takechy"]);`
//       - `AbiCoder.defaultAbiCoder().encode(["uint", "string"], [888, "Takechy"])`






//
interface IConataNFT{
    event Log(string message);
    event Minted(address account, uint tokenId);
    event ChangedMintTerm(string termName);

    // WRITE ////////////////////////////////////////////////////////////////////////////

    
    function mint(bytes calldata data) external payable;
    function mint() external payable;

    
    function burn(uint tokenId, bytes calldata data) external;

    
    function setURI(string memory newURI) external;
    
    
    function withdraw() external;
    function withdrawSpare() external;
    
    // READ ////////////////////////////////////////////////////////////////////////////

    
    function getOpenedMintTermNames() view external returns(string[] memory);

    
    function totalSupply() external view returns (uint256);

}

File 6 of 13: IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (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 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 7 of 13: 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 8 of 13: 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 9 of 13: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;
import "./Context.sol";

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;
import "./Math.sol";

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"string","name":"termName","type":"string"}],"name":"ChangedMintTerm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","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":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOpenedMintTermNames","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"renounceOwnership","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":"newURI","type":"string"}],"name":"setURI","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdrawSpare","outputs":[],"stateMutability":"pure","type":"function"}]

60806040526040518060400160405280601581526020017f4d657461616e6920417761726420536561736f6e310000000000000000000000815250600490816200004a919062000412565b50600060055560006006553480156200006257600080fd5b506040518060600160405280603681526020016200443b603691396200008e81620000b560201b60201c565b50620000af620000a3620000ca60201b60201c565b620000d260201b60201c565b620004f9565b8060029081620000c6919062000412565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200021a57607f821691505b60208210810362000230576200022f620001d2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200029a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200025b565b620002a686836200025b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002f3620002ed620002e784620002be565b620002c8565b620002be565b9050919050565b6000819050919050565b6200030f83620002d2565b620003276200031e82620002fa565b84845462000268565b825550505050565b600090565b6200033e6200032f565b6200034b81848462000304565b505050565b5b8181101562000373576200036760008262000334565b60018101905062000351565b5050565b601f821115620003c2576200038c8162000236565b62000397846200024b565b81016020851015620003a7578190505b620003bf620003b6856200024b565b83018262000350565b50505b505050565b600082821c905092915050565b6000620003e760001984600802620003c7565b1980831691505092915050565b6000620004028383620003d4565b9150826002028217905092915050565b6200041d8262000198565b67ffffffffffffffff811115620004395762000438620001a3565b5b62000445825462000201565b6200045282828562000377565b600060209050601f8311600181146200048a576000841562000475578287015190505b620004818582620003f4565b865550620004f1565b601f1984166200049a8662000236565b60005b82811015620004c4578489015182556001820191506020850194506020810190506200049d565b86831015620004e45784890151620004e0601f891682620003d4565b8355505b6001600288020188555050505b505050505050565b613f3280620005096000396000f3fe6080604052600436106101295760003560e01c80634e1273f4116100ab578063be0779881161006f578063be0779881461039d578063d65ae677146103c6578063e985e9c5146103dd578063f242432a1461041a578063f2fde38b14610443578063fe9d93031461046c57610129565b80634e1273f4146102d9578063715018a6146103165780637ba0e2e71461032d5780638da5cb5b14610349578063a22cb4651461037457610129565b80631249c58b116100f25780631249c58b1461023957806318160ddd146102435780632eb2c2d61461026e5780633ccfd60b1461029757806347ea4c6e146102ae57610129565b8062fdd58e1461012e57806301ffc9a71461016b57806302fe5305146101a857806306fdde03146101d15780630e89341c146101fc575b600080fd5b34801561013a57600080fd5b50610155600480360381019061015091906122bf565b610495565b604051610162919061230e565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190612381565b61055d565b60405161019f91906123c9565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca919061252a565b61063f565b005b3480156101dd57600080fd5b506101e6610653565b6040516101f391906125f2565b60405180910390f35b34801561020857600080fd5b50610223600480360381019061021e9190612614565b6106e1565b60405161023091906125f2565b60405180910390f35b610241610741565b005b34801561024f57600080fd5b5061025861077c565b604051610265919061230e565b60405180910390f35b34801561027a57600080fd5b50610295600480360381019061029091906127aa565b610793565b005b3480156102a357600080fd5b506102ac610834565b005b3480156102ba57600080fd5b506102c361086f565b6040516102d09190612985565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190612a6a565b6108ac565b60405161030d9190612ba0565b60405180910390f35b34801561032257600080fd5b5061032b6109c5565b005b61034760048036038101906103429190612c1d565b6109d9565b005b34801561035557600080fd5b5061035e610a14565b60405161036b9190612c79565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190612cc0565b610a3e565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612d00565b610a54565b005b3480156103d257600080fd5b506103db610b04565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190612d8b565b610b3f565b60405161041191906123c9565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190612dcb565b610bd3565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612e62565b610c74565b005b34801561047857600080fd5b50610493600480360381019061048e9190612e8f565b610cf7565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fc90612f61565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610638575061063782610d41565b5b9050919050565b610647610dab565b61065081610e29565b50565b6004805461066090612fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612fb0565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b505050505081565b606060006106ee83610e3c565b9050600081511161070e5760405180602001604052806000815250610739565b8061071884610ed0565b60405160200161072992919061301d565b6040516020818303038152906040525b915050919050565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107739061308d565b60405180910390fd5b600060065460055461078e91906130dc565b905090565b61079b610f9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806107e157506107e0856107db610f9e565b610b3f565b5b610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081790613182565b60405180910390fd5b61082d8585858585610fa6565b5050505050565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108669061308d565b60405180910390fd5b60606040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a39061308d565b60405180910390fd5b606081518351146108f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e990613214565b60405180910390fd5b6000835167ffffffffffffffff81111561090f5761090e6123ff565b5b60405190808252806020026020018201604052801561093d5781602001602082028036833780820191505090505b50905060005b84518110156109ba5761098a85828151811061096257610961613234565b5b602002602001015185838151811061097d5761097c613234565b5b6020026020010151610495565b82828151811061099d5761099c613234565b5b602002602001018181525050806109b390613263565b9050610943565b508091505092915050565b6109cd610dab565b6109d760006112c7565b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b9061308d565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a50610a49610f9e565b838361138d565b5050565b610a5c610dab565b8151835114610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906132f7565b60405180910390fd5b60005b8351811015610afe57610aeb848281518110610ac257610ac1613234565b5b6020026020010151848381518110610add57610adc613234565b5b6020026020010151846114f9565b8080610af690613263565b915050610aa3565b50505050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b369061308d565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610bdb610f9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610c215750610c2085610c1b610f9e565b610b3f565b5b610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613182565b60405180910390fd5b610c6d8585858585611532565b5050505050565b610c7c610dab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290613389565b60405180910390fd5b610cf4816112c7565b50565b60008282810190610d089190612614565b90506000610d14610f9e565b9050610d218186846117cd565b8160066000828254610d3391906133a9565b925050819055505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610db3610f9e565b73ffffffffffffffffffffffffffffffffffffffff16610dd1610a14565b73ffffffffffffffffffffffffffffffffffffffff1614610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613429565b60405180910390fd5b565b8060029081610e3891906135f5565b5050565b606060028054610e4b90612fb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7790612fb0565b8015610ec45780601f10610e9957610100808354040283529160200191610ec4565b820191906000526020600020905b815481529060010190602001808311610ea757829003601f168201915b50505050509050919050565b606060006001610edf84611a13565b01905060008167ffffffffffffffff811115610efe57610efd6123ff565b5b6040519080825280601f01601f191660200182016040528015610f305781602001600182028036833780820191505090505b509050600082602001820190505b600115610f93578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581610f8757610f866136c7565b5b04945060008503610f3e575b819350505050919050565b600033905090565b8151835114610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190613768565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906137fa565b60405180910390fd5b6000611063610f9e565b9050611073818787878787611b66565b60005b845181101561122457600085828151811061109457611093613234565b5b6020026020010151905060008583815181106110b3576110b2613234565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b9061388c565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461120991906133a9565b925050819055505050508061121d90613263565b9050611076565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161129b9291906138ac565b60405180910390a46112b1818787878787611c14565b6112bf818787878787611c1c565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290613955565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ec91906123c9565b60405180910390a3505050565b61151483828460405180602001604052806000815250611df3565b816005600082825461152691906133a9565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611598906137fa565b60405180910390fd5b60006115ab610f9e565b905060006115b885611fa3565b905060006115c585611fa3565b90506115d5838989858589611b66565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639061388c565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461172191906133a9565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161179e929190613975565b60405180910390a46117b4848a8a86868a611c14565b6117c2848a8a8a8a8a61201d565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390613a10565b60405180910390fd5b6000611846610f9e565b9050600061185384611fa3565b9050600061186084611fa3565b905061188083876000858560405180602001604052806000815250611b66565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613aa2565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516119e4929190613975565b60405180910390a4611a0a84886000868660405180602001604052806000815250611c14565b50505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a71577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611a6757611a666136c7565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611aae576d04ee2d6d415b85acef81000000008381611aa457611aa36136c7565b5b0492506020810190505b662386f26fc100008310611add57662386f26fc100008381611ad357611ad26136c7565b5b0492506010810190505b6305f5e1008310611b06576305f5e1008381611afc57611afb6136c7565b5b0492506008810190505b6127108310611b2b576127108381611b2157611b206136c7565b5b0492506004810190505b60648310611b4e5760648381611b4457611b436136c7565b5b0492506002810190505b600a8310611b5d576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bcd5750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613b0e565b60405180910390fd5b505050505050565b505050505050565b611c3b8473ffffffffffffffffffffffffffffffffffffffff166121f4565b15611deb578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611c81959493929190613b83565b6020604051808303816000875af1925050508015611cbd57506040513d601f19601f82011682018060405250810190611cba9190613c00565b60015b611d6257611cc9613c3a565b806308c379a003611d255750611cdd613c5c565b80611ce85750611d27565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c91906125f2565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990613d5e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de090613df0565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613e82565b60405180910390fd5b6000611e6c610f9e565b90506000611e7985611fa3565b90506000611e8685611fa3565b9050611e9783600089858589611b66565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef691906133a9565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611f74929190613975565b60405180910390a4611f8b83600089858589611c14565b611f9a8360008989898961201d565b50505050505050565b60606000600167ffffffffffffffff811115611fc257611fc16123ff565b5b604051908082528060200260200182016040528015611ff05781602001602082028036833780820191505090505b509050828160008151811061200857612007613234565b5b60200260200101818152505080915050919050565b61203c8473ffffffffffffffffffffffffffffffffffffffff166121f4565b156121ec578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612082959493929190613ea2565b6020604051808303816000875af19250505080156120be57506040513d601f19601f820116820180604052508101906120bb9190613c00565b60015b612163576120ca613c3a565b806308c379a00361212657506120de613c5c565b806120e95750612128565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211d91906125f2565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a90613d5e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190613df0565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122568261222b565b9050919050565b6122668161224b565b811461227157600080fd5b50565b6000813590506122838161225d565b92915050565b6000819050919050565b61229c81612289565b81146122a757600080fd5b50565b6000813590506122b981612293565b92915050565b600080604083850312156122d6576122d5612221565b5b60006122e485828601612274565b92505060206122f5858286016122aa565b9150509250929050565b61230881612289565b82525050565b600060208201905061232360008301846122ff565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61235e81612329565b811461236957600080fd5b50565b60008135905061237b81612355565b92915050565b60006020828403121561239757612396612221565b5b60006123a58482850161236c565b91505092915050565b60008115159050919050565b6123c3816123ae565b82525050565b60006020820190506123de60008301846123ba565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612437826123ee565b810181811067ffffffffffffffff82111715612456576124556123ff565b5b80604052505050565b6000612469612217565b9050612475828261242e565b919050565b600067ffffffffffffffff821115612495576124946123ff565b5b61249e826123ee565b9050602081019050919050565b82818337600083830152505050565b60006124cd6124c88461247a565b61245f565b9050828152602081018484840111156124e9576124e86123e9565b5b6124f48482856124ab565b509392505050565b600082601f830112612511576125106123e4565b5b81356125218482602086016124ba565b91505092915050565b6000602082840312156125405761253f612221565b5b600082013567ffffffffffffffff81111561255e5761255d612226565b5b61256a848285016124fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125ad578082015181840152602081019050612592565b60008484015250505050565b60006125c482612573565b6125ce818561257e565b93506125de81856020860161258f565b6125e7816123ee565b840191505092915050565b6000602082019050818103600083015261260c81846125b9565b905092915050565b60006020828403121561262a57612629612221565b5b6000612638848285016122aa565b91505092915050565b600067ffffffffffffffff82111561265c5761265b6123ff565b5b602082029050602081019050919050565b600080fd5b600061268561268084612641565b61245f565b905080838252602082019050602084028301858111156126a8576126a761266d565b5b835b818110156126d157806126bd88826122aa565b8452602084019350506020810190506126aa565b5050509392505050565b600082601f8301126126f0576126ef6123e4565b5b8135612700848260208601612672565b91505092915050565b600067ffffffffffffffff821115612724576127236123ff565b5b61272d826123ee565b9050602081019050919050565b600061274d61274884612709565b61245f565b905082815260208101848484011115612769576127686123e9565b5b6127748482856124ab565b509392505050565b600082601f830112612791576127906123e4565b5b81356127a184826020860161273a565b91505092915050565b600080600080600060a086880312156127c6576127c5612221565b5b60006127d488828901612274565b95505060206127e588828901612274565b945050604086013567ffffffffffffffff81111561280657612805612226565b5b612812888289016126db565b935050606086013567ffffffffffffffff81111561283357612832612226565b5b61283f888289016126db565b925050608086013567ffffffffffffffff8111156128605761285f612226565b5b61286c8882890161277c565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006128c182612573565b6128cb81856128a5565b93506128db81856020860161258f565b6128e4816123ee565b840191505092915050565b60006128fb83836128b6565b905092915050565b6000602082019050919050565b600061291b82612879565b6129258185612884565b93508360208202850161293785612895565b8060005b85811015612973578484038952815161295485826128ef565b945061295f83612903565b925060208a0199505060018101905061293b565b50829750879550505050505092915050565b6000602082019050818103600083015261299f8184612910565b905092915050565b600067ffffffffffffffff8211156129c2576129c16123ff565b5b602082029050602081019050919050565b60006129e66129e1846129a7565b61245f565b90508083825260208201905060208402830185811115612a0957612a0861266d565b5b835b81811015612a325780612a1e8882612274565b845260208401935050602081019050612a0b565b5050509392505050565b600082601f830112612a5157612a506123e4565b5b8135612a618482602086016129d3565b91505092915050565b60008060408385031215612a8157612a80612221565b5b600083013567ffffffffffffffff811115612a9f57612a9e612226565b5b612aab85828601612a3c565b925050602083013567ffffffffffffffff811115612acc57612acb612226565b5b612ad8858286016126db565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b1781612289565b82525050565b6000612b298383612b0e565b60208301905092915050565b6000602082019050919050565b6000612b4d82612ae2565b612b578185612aed565b9350612b6283612afe565b8060005b83811015612b93578151612b7a8882612b1d565b9750612b8583612b35565b925050600181019050612b66565b5085935050505092915050565b60006020820190508181036000830152612bba8184612b42565b905092915050565b600080fd5b60008083601f840112612bdd57612bdc6123e4565b5b8235905067ffffffffffffffff811115612bfa57612bf9612bc2565b5b602083019150836001820283011115612c1657612c1561266d565b5b9250929050565b60008060208385031215612c3457612c33612221565b5b600083013567ffffffffffffffff811115612c5257612c51612226565b5b612c5e85828601612bc7565b92509250509250929050565b612c738161224b565b82525050565b6000602082019050612c8e6000830184612c6a565b92915050565b612c9d816123ae565b8114612ca857600080fd5b50565b600081359050612cba81612c94565b92915050565b60008060408385031215612cd757612cd6612221565b5b6000612ce585828601612274565b9250506020612cf685828601612cab565b9150509250929050565b600080600060608486031215612d1957612d18612221565b5b600084013567ffffffffffffffff811115612d3757612d36612226565b5b612d4386828701612a3c565b935050602084013567ffffffffffffffff811115612d6457612d63612226565b5b612d70868287016126db565b9250506040612d81868287016122aa565b9150509250925092565b60008060408385031215612da257612da1612221565b5b6000612db085828601612274565b9250506020612dc185828601612274565b9150509250929050565b600080600080600060a08688031215612de757612de6612221565b5b6000612df588828901612274565b9550506020612e0688828901612274565b9450506040612e17888289016122aa565b9350506060612e28888289016122aa565b925050608086013567ffffffffffffffff811115612e4957612e48612226565b5b612e558882890161277c565b9150509295509295909350565b600060208284031215612e7857612e77612221565b5b6000612e8684828501612274565b91505092915050565b600080600060408486031215612ea857612ea7612221565b5b6000612eb6868287016122aa565b935050602084013567ffffffffffffffff811115612ed757612ed6612226565b5b612ee386828701612bc7565b92509250509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000612f4b602a8361257e565b9150612f5682612eef565b604082019050919050565b60006020820190508181036000830152612f7a81612f3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fc857607f821691505b602082108103612fdb57612fda612f81565b5b50919050565b600081905092915050565b6000612ff782612573565b6130018185612fe1565b935061301181856020860161258f565b80840191505092915050565b60006130298285612fec565b91506130358284612fec565b91508190509392505050565b7f4e6f7420496d706c656d656e7400000000000000000000000000000000000000600082015250565b6000613077600d8361257e565b915061308282613041565b602082019050919050565b600060208201905081810360008301526130a68161306a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130e782612289565b91506130f283612289565b925082820390508181111561310a576131096130ad565b5b92915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b600061316c602e8361257e565b915061317782613110565b604082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006131fe60298361257e565b9150613209826131a2565b604082019050919050565b6000602082019050818103600083015261322d816131f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061326e82612289565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036132a05761329f6130ad565b5b600182019050919050565b7f496e76616c6964204c656e677468000000000000000000000000000000000000600082015250565b60006132e1600e8361257e565b91506132ec826132ab565b602082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061337360268361257e565b915061337e82613317565b604082019050919050565b600060208201905081810360008301526133a281613366565b9050919050565b60006133b482612289565b91506133bf83612289565b92508282019050808211156133d7576133d66130ad565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061341360208361257e565b915061341e826133dd565b602082019050919050565b6000602082019050818103600083015261344281613406565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261346e565b6134b5868361346e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134f26134ed6134e884612289565b6134cd565b612289565b9050919050565b6000819050919050565b61350c836134d7565b613520613518826134f9565b84845461347b565b825550505050565b600090565b613535613528565b613540818484613503565b505050565b5b818110156135645761355960008261352d565b600181019050613546565b5050565b601f8211156135a95761357a81613449565b6135838461345e565b81016020851015613592578190505b6135a661359e8561345e565b830182613545565b50505b505050565b600082821c905092915050565b60006135cc600019846008026135ae565b1980831691505092915050565b60006135e583836135bb565b9150826002028217905092915050565b6135fe82612573565b67ffffffffffffffff811115613617576136166123ff565b5b6136218254612fb0565b61362c828285613568565b600060209050601f83116001811461365f576000841561364d578287015190505b61365785826135d9565b8655506136bf565b601f19841661366d86613449565b60005b8281101561369557848901518255600182019150602085019450602081019050613670565b868310156136b257848901516136ae601f8916826135bb565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061375260288361257e565b915061375d826136f6565b604082019050919050565b6000602082019050818103600083015261378181613745565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137e460258361257e565b91506137ef82613788565b604082019050919050565b60006020820190508181036000830152613813816137d7565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613876602a8361257e565b91506138818261381a565b604082019050919050565b600060208201905081810360008301526138a581613869565b9050919050565b600060408201905081810360008301526138c68185612b42565b905081810360208301526138da8184612b42565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061393f60298361257e565b915061394a826138e3565b604082019050919050565b6000602082019050818103600083015261396e81613932565b9050919050565b600060408201905061398a60008301856122ff565b61399760208301846122ff565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006139fa60238361257e565b9150613a058261399e565b604082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000613a8c60248361257e565b9150613a9782613a30565b604082019050919050565b60006020820190508181036000830152613abb81613a7f565b9050919050565b7f4e6f7420616c6c6f77656420746f207472616e7366657220746f6b656e000000600082015250565b6000613af8601d8361257e565b9150613b0382613ac2565b602082019050919050565b60006020820190508181036000830152613b2781613aeb565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613b5582613b2e565b613b5f8185613b39565b9350613b6f81856020860161258f565b613b78816123ee565b840191505092915050565b600060a082019050613b986000830188612c6a565b613ba56020830187612c6a565b8181036040830152613bb78186612b42565b90508181036060830152613bcb8185612b42565b90508181036080830152613bdf8184613b4a565b90509695505050505050565b600081519050613bfa81612355565b92915050565b600060208284031215613c1657613c15612221565b5b6000613c2484828501613beb565b91505092915050565b60008160e01c9050919050565b600060033d1115613c595760046000803e613c56600051613c2d565b90505b90565b600060443d10613ce957613c6e612217565b60043d036004823e80513d602482011167ffffffffffffffff82111715613c96575050613ce9565b808201805167ffffffffffffffff811115613cb45750505050613ce9565b80602083010160043d038501811115613cd1575050505050613ce9565b613ce08260200185018661242e565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613d4860348361257e565b9150613d5382613cec565b604082019050919050565b60006020820190508181036000830152613d7781613d3b565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613dda60288361257e565b9150613de582613d7e565b604082019050919050565b60006020820190508181036000830152613e0981613dcd565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6c60218361257e565b9150613e7782613e10565b604082019050919050565b60006020820190508181036000830152613e9b81613e5f565b9050919050565b600060a082019050613eb76000830188612c6a565b613ec46020830187612c6a565b613ed160408301866122ff565b613ede60608301856122ff565b8181036080830152613ef08184613b4a565b9050969550505050505056fea2646970667358221220b5651d968667efe6440fe1322882b73a9fe3c5f200afe44935696fbb8d9fef8b64736f6c63430008110033697066733a2f2f516d54767233616e427a3445443770584a584a6a617a3457355a764e4851454a7a554c6a6573367a66447671366d2f

Deployed Bytecode

0x6080604052600436106101295760003560e01c80634e1273f4116100ab578063be0779881161006f578063be0779881461039d578063d65ae677146103c6578063e985e9c5146103dd578063f242432a1461041a578063f2fde38b14610443578063fe9d93031461046c57610129565b80634e1273f4146102d9578063715018a6146103165780637ba0e2e71461032d5780638da5cb5b14610349578063a22cb4651461037457610129565b80631249c58b116100f25780631249c58b1461023957806318160ddd146102435780632eb2c2d61461026e5780633ccfd60b1461029757806347ea4c6e146102ae57610129565b8062fdd58e1461012e57806301ffc9a71461016b57806302fe5305146101a857806306fdde03146101d15780630e89341c146101fc575b600080fd5b34801561013a57600080fd5b50610155600480360381019061015091906122bf565b610495565b604051610162919061230e565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d9190612381565b61055d565b60405161019f91906123c9565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca919061252a565b61063f565b005b3480156101dd57600080fd5b506101e6610653565b6040516101f391906125f2565b60405180910390f35b34801561020857600080fd5b50610223600480360381019061021e9190612614565b6106e1565b60405161023091906125f2565b60405180910390f35b610241610741565b005b34801561024f57600080fd5b5061025861077c565b604051610265919061230e565b60405180910390f35b34801561027a57600080fd5b50610295600480360381019061029091906127aa565b610793565b005b3480156102a357600080fd5b506102ac610834565b005b3480156102ba57600080fd5b506102c361086f565b6040516102d09190612985565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190612a6a565b6108ac565b60405161030d9190612ba0565b60405180910390f35b34801561032257600080fd5b5061032b6109c5565b005b61034760048036038101906103429190612c1d565b6109d9565b005b34801561035557600080fd5b5061035e610a14565b60405161036b9190612c79565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190612cc0565b610a3e565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612d00565b610a54565b005b3480156103d257600080fd5b506103db610b04565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190612d8b565b610b3f565b60405161041191906123c9565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c9190612dcb565b610bd3565b005b34801561044f57600080fd5b5061046a60048036038101906104659190612e62565b610c74565b005b34801561047857600080fd5b50610493600480360381019061048e9190612e8f565b610cf7565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fc90612f61565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610638575061063782610d41565b5b9050919050565b610647610dab565b61065081610e29565b50565b6004805461066090612fb0565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612fb0565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b505050505081565b606060006106ee83610e3c565b9050600081511161070e5760405180602001604052806000815250610739565b8061071884610ed0565b60405160200161072992919061301d565b6040516020818303038152906040525b915050919050565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107739061308d565b60405180910390fd5b600060065460055461078e91906130dc565b905090565b61079b610f9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806107e157506107e0856107db610f9e565b610b3f565b5b610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081790613182565b60405180910390fd5b61082d8585858585610fa6565b5050505050565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108669061308d565b60405180910390fd5b60606040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a39061308d565b60405180910390fd5b606081518351146108f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e990613214565b60405180910390fd5b6000835167ffffffffffffffff81111561090f5761090e6123ff565b5b60405190808252806020026020018201604052801561093d5781602001602082028036833780820191505090505b50905060005b84518110156109ba5761098a85828151811061096257610961613234565b5b602002602001015185838151811061097d5761097c613234565b5b6020026020010151610495565b82828151811061099d5761099c613234565b5b602002602001018181525050806109b390613263565b9050610943565b508091505092915050565b6109cd610dab565b6109d760006112c7565b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b9061308d565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a50610a49610f9e565b838361138d565b5050565b610a5c610dab565b8151835114610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a97906132f7565b60405180910390fd5b60005b8351811015610afe57610aeb848281518110610ac257610ac1613234565b5b6020026020010151848381518110610add57610adc613234565b5b6020026020010151846114f9565b8080610af690613263565b915050610aa3565b50505050565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b369061308d565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610bdb610f9e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610c215750610c2085610c1b610f9e565b610b3f565b5b610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613182565b60405180910390fd5b610c6d8585858585611532565b5050505050565b610c7c610dab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290613389565b60405180910390fd5b610cf4816112c7565b50565b60008282810190610d089190612614565b90506000610d14610f9e565b9050610d218186846117cd565b8160066000828254610d3391906133a9565b925050819055505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610db3610f9e565b73ffffffffffffffffffffffffffffffffffffffff16610dd1610a14565b73ffffffffffffffffffffffffffffffffffffffff1614610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e90613429565b60405180910390fd5b565b8060029081610e3891906135f5565b5050565b606060028054610e4b90612fb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7790612fb0565b8015610ec45780601f10610e9957610100808354040283529160200191610ec4565b820191906000526020600020905b815481529060010190602001808311610ea757829003601f168201915b50505050509050919050565b606060006001610edf84611a13565b01905060008167ffffffffffffffff811115610efe57610efd6123ff565b5b6040519080825280601f01601f191660200182016040528015610f305781602001600182028036833780820191505090505b509050600082602001820190505b600115610f93578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581610f8757610f866136c7565b5b04945060008503610f3e575b819350505050919050565b600033905090565b8151835114610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190613768565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611059576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611050906137fa565b60405180910390fd5b6000611063610f9e565b9050611073818787878787611b66565b60005b845181101561122457600085828151811061109457611093613234565b5b6020026020010151905060008583815181106110b3576110b2613234565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b9061388c565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461120991906133a9565b925050819055505050508061121d90613263565b9050611076565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161129b9291906138ac565b60405180910390a46112b1818787878787611c14565b6112bf818787878787611c1c565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290613955565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ec91906123c9565b60405180910390a3505050565b61151483828460405180602001604052806000815250611df3565b816005600082825461152691906133a9565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611598906137fa565b60405180910390fd5b60006115ab610f9e565b905060006115b885611fa3565b905060006115c585611fa3565b90506115d5838989858589611b66565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639061388c565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461172191906133a9565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161179e929190613975565b60405180910390a46117b4848a8a86868a611c14565b6117c2848a8a8a8a8a61201d565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390613a10565b60405180910390fd5b6000611846610f9e565b9050600061185384611fa3565b9050600061186084611fa3565b905061188083876000858560405180602001604052806000815250611b66565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613aa2565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516119e4929190613975565b60405180910390a4611a0a84886000868660405180602001604052806000815250611c14565b50505050505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a71577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611a6757611a666136c7565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611aae576d04ee2d6d415b85acef81000000008381611aa457611aa36136c7565b5b0492506020810190505b662386f26fc100008310611add57662386f26fc100008381611ad357611ad26136c7565b5b0492506010810190505b6305f5e1008310611b06576305f5e1008381611afc57611afb6136c7565b5b0492506008810190505b6127108310611b2b576127108381611b2157611b206136c7565b5b0492506004810190505b60648310611b4e5760648381611b4457611b436136c7565b5b0492506002810190505b600a8310611b5d576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bcd5750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613b0e565b60405180910390fd5b505050505050565b505050505050565b611c3b8473ffffffffffffffffffffffffffffffffffffffff166121f4565b15611deb578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611c81959493929190613b83565b6020604051808303816000875af1925050508015611cbd57506040513d601f19601f82011682018060405250810190611cba9190613c00565b60015b611d6257611cc9613c3a565b806308c379a003611d255750611cdd613c5c565b80611ce85750611d27565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1c91906125f2565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990613d5e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de090613df0565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613e82565b60405180910390fd5b6000611e6c610f9e565b90506000611e7985611fa3565b90506000611e8685611fa3565b9050611e9783600089858589611b66565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef691906133a9565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611f74929190613975565b60405180910390a4611f8b83600089858589611c14565b611f9a8360008989898961201d565b50505050505050565b60606000600167ffffffffffffffff811115611fc257611fc16123ff565b5b604051908082528060200260200182016040528015611ff05781602001602082028036833780820191505090505b509050828160008151811061200857612007613234565b5b60200260200101818152505080915050919050565b61203c8473ffffffffffffffffffffffffffffffffffffffff166121f4565b156121ec578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612082959493929190613ea2565b6020604051808303816000875af19250505080156120be57506040513d601f19601f820116820180604052508101906120bb9190613c00565b60015b612163576120ca613c3a565b806308c379a00361212657506120de613c5c565b806120e95750612128565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211d91906125f2565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a90613d5e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146121ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e190613df0565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122568261222b565b9050919050565b6122668161224b565b811461227157600080fd5b50565b6000813590506122838161225d565b92915050565b6000819050919050565b61229c81612289565b81146122a757600080fd5b50565b6000813590506122b981612293565b92915050565b600080604083850312156122d6576122d5612221565b5b60006122e485828601612274565b92505060206122f5858286016122aa565b9150509250929050565b61230881612289565b82525050565b600060208201905061232360008301846122ff565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61235e81612329565b811461236957600080fd5b50565b60008135905061237b81612355565b92915050565b60006020828403121561239757612396612221565b5b60006123a58482850161236c565b91505092915050565b60008115159050919050565b6123c3816123ae565b82525050565b60006020820190506123de60008301846123ba565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612437826123ee565b810181811067ffffffffffffffff82111715612456576124556123ff565b5b80604052505050565b6000612469612217565b9050612475828261242e565b919050565b600067ffffffffffffffff821115612495576124946123ff565b5b61249e826123ee565b9050602081019050919050565b82818337600083830152505050565b60006124cd6124c88461247a565b61245f565b9050828152602081018484840111156124e9576124e86123e9565b5b6124f48482856124ab565b509392505050565b600082601f830112612511576125106123e4565b5b81356125218482602086016124ba565b91505092915050565b6000602082840312156125405761253f612221565b5b600082013567ffffffffffffffff81111561255e5761255d612226565b5b61256a848285016124fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125ad578082015181840152602081019050612592565b60008484015250505050565b60006125c482612573565b6125ce818561257e565b93506125de81856020860161258f565b6125e7816123ee565b840191505092915050565b6000602082019050818103600083015261260c81846125b9565b905092915050565b60006020828403121561262a57612629612221565b5b6000612638848285016122aa565b91505092915050565b600067ffffffffffffffff82111561265c5761265b6123ff565b5b602082029050602081019050919050565b600080fd5b600061268561268084612641565b61245f565b905080838252602082019050602084028301858111156126a8576126a761266d565b5b835b818110156126d157806126bd88826122aa565b8452602084019350506020810190506126aa565b5050509392505050565b600082601f8301126126f0576126ef6123e4565b5b8135612700848260208601612672565b91505092915050565b600067ffffffffffffffff821115612724576127236123ff565b5b61272d826123ee565b9050602081019050919050565b600061274d61274884612709565b61245f565b905082815260208101848484011115612769576127686123e9565b5b6127748482856124ab565b509392505050565b600082601f830112612791576127906123e4565b5b81356127a184826020860161273a565b91505092915050565b600080600080600060a086880312156127c6576127c5612221565b5b60006127d488828901612274565b95505060206127e588828901612274565b945050604086013567ffffffffffffffff81111561280657612805612226565b5b612812888289016126db565b935050606086013567ffffffffffffffff81111561283357612832612226565b5b61283f888289016126db565b925050608086013567ffffffffffffffff8111156128605761285f612226565b5b61286c8882890161277c565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006128c182612573565b6128cb81856128a5565b93506128db81856020860161258f565b6128e4816123ee565b840191505092915050565b60006128fb83836128b6565b905092915050565b6000602082019050919050565b600061291b82612879565b6129258185612884565b93508360208202850161293785612895565b8060005b85811015612973578484038952815161295485826128ef565b945061295f83612903565b925060208a0199505060018101905061293b565b50829750879550505050505092915050565b6000602082019050818103600083015261299f8184612910565b905092915050565b600067ffffffffffffffff8211156129c2576129c16123ff565b5b602082029050602081019050919050565b60006129e66129e1846129a7565b61245f565b90508083825260208201905060208402830185811115612a0957612a0861266d565b5b835b81811015612a325780612a1e8882612274565b845260208401935050602081019050612a0b565b5050509392505050565b600082601f830112612a5157612a506123e4565b5b8135612a618482602086016129d3565b91505092915050565b60008060408385031215612a8157612a80612221565b5b600083013567ffffffffffffffff811115612a9f57612a9e612226565b5b612aab85828601612a3c565b925050602083013567ffffffffffffffff811115612acc57612acb612226565b5b612ad8858286016126db565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b1781612289565b82525050565b6000612b298383612b0e565b60208301905092915050565b6000602082019050919050565b6000612b4d82612ae2565b612b578185612aed565b9350612b6283612afe565b8060005b83811015612b93578151612b7a8882612b1d565b9750612b8583612b35565b925050600181019050612b66565b5085935050505092915050565b60006020820190508181036000830152612bba8184612b42565b905092915050565b600080fd5b60008083601f840112612bdd57612bdc6123e4565b5b8235905067ffffffffffffffff811115612bfa57612bf9612bc2565b5b602083019150836001820283011115612c1657612c1561266d565b5b9250929050565b60008060208385031215612c3457612c33612221565b5b600083013567ffffffffffffffff811115612c5257612c51612226565b5b612c5e85828601612bc7565b92509250509250929050565b612c738161224b565b82525050565b6000602082019050612c8e6000830184612c6a565b92915050565b612c9d816123ae565b8114612ca857600080fd5b50565b600081359050612cba81612c94565b92915050565b60008060408385031215612cd757612cd6612221565b5b6000612ce585828601612274565b9250506020612cf685828601612cab565b9150509250929050565b600080600060608486031215612d1957612d18612221565b5b600084013567ffffffffffffffff811115612d3757612d36612226565b5b612d4386828701612a3c565b935050602084013567ffffffffffffffff811115612d6457612d63612226565b5b612d70868287016126db565b9250506040612d81868287016122aa565b9150509250925092565b60008060408385031215612da257612da1612221565b5b6000612db085828601612274565b9250506020612dc185828601612274565b9150509250929050565b600080600080600060a08688031215612de757612de6612221565b5b6000612df588828901612274565b9550506020612e0688828901612274565b9450506040612e17888289016122aa565b9350506060612e28888289016122aa565b925050608086013567ffffffffffffffff811115612e4957612e48612226565b5b612e558882890161277c565b9150509295509295909350565b600060208284031215612e7857612e77612221565b5b6000612e8684828501612274565b91505092915050565b600080600060408486031215612ea857612ea7612221565b5b6000612eb6868287016122aa565b935050602084013567ffffffffffffffff811115612ed757612ed6612226565b5b612ee386828701612bc7565b92509250509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000612f4b602a8361257e565b9150612f5682612eef565b604082019050919050565b60006020820190508181036000830152612f7a81612f3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fc857607f821691505b602082108103612fdb57612fda612f81565b5b50919050565b600081905092915050565b6000612ff782612573565b6130018185612fe1565b935061301181856020860161258f565b80840191505092915050565b60006130298285612fec565b91506130358284612fec565b91508190509392505050565b7f4e6f7420496d706c656d656e7400000000000000000000000000000000000000600082015250565b6000613077600d8361257e565b915061308282613041565b602082019050919050565b600060208201905081810360008301526130a68161306a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130e782612289565b91506130f283612289565b925082820390508181111561310a576131096130ad565b5b92915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b600061316c602e8361257e565b915061317782613110565b604082019050919050565b6000602082019050818103600083015261319b8161315f565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006131fe60298361257e565b9150613209826131a2565b604082019050919050565b6000602082019050818103600083015261322d816131f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061326e82612289565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036132a05761329f6130ad565b5b600182019050919050565b7f496e76616c6964204c656e677468000000000000000000000000000000000000600082015250565b60006132e1600e8361257e565b91506132ec826132ab565b602082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061337360268361257e565b915061337e82613317565b604082019050919050565b600060208201905081810360008301526133a281613366565b9050919050565b60006133b482612289565b91506133bf83612289565b92508282019050808211156133d7576133d66130ad565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061341360208361257e565b915061341e826133dd565b602082019050919050565b6000602082019050818103600083015261344281613406565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261346e565b6134b5868361346e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134f26134ed6134e884612289565b6134cd565b612289565b9050919050565b6000819050919050565b61350c836134d7565b613520613518826134f9565b84845461347b565b825550505050565b600090565b613535613528565b613540818484613503565b505050565b5b818110156135645761355960008261352d565b600181019050613546565b5050565b601f8211156135a95761357a81613449565b6135838461345e565b81016020851015613592578190505b6135a661359e8561345e565b830182613545565b50505b505050565b600082821c905092915050565b60006135cc600019846008026135ae565b1980831691505092915050565b60006135e583836135bb565b9150826002028217905092915050565b6135fe82612573565b67ffffffffffffffff811115613617576136166123ff565b5b6136218254612fb0565b61362c828285613568565b600060209050601f83116001811461365f576000841561364d578287015190505b61365785826135d9565b8655506136bf565b601f19841661366d86613449565b60005b8281101561369557848901518255600182019150602085019450602081019050613670565b868310156136b257848901516136ae601f8916826135bb565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061375260288361257e565b915061375d826136f6565b604082019050919050565b6000602082019050818103600083015261378181613745565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137e460258361257e565b91506137ef82613788565b604082019050919050565b60006020820190508181036000830152613813816137d7565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613876602a8361257e565b91506138818261381a565b604082019050919050565b600060208201905081810360008301526138a581613869565b9050919050565b600060408201905081810360008301526138c68185612b42565b905081810360208301526138da8184612b42565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061393f60298361257e565b915061394a826138e3565b604082019050919050565b6000602082019050818103600083015261396e81613932565b9050919050565b600060408201905061398a60008301856122ff565b61399760208301846122ff565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006139fa60238361257e565b9150613a058261399e565b604082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000613a8c60248361257e565b9150613a9782613a30565b604082019050919050565b60006020820190508181036000830152613abb81613a7f565b9050919050565b7f4e6f7420616c6c6f77656420746f207472616e7366657220746f6b656e000000600082015250565b6000613af8601d8361257e565b9150613b0382613ac2565b602082019050919050565b60006020820190508181036000830152613b2781613aeb565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613b5582613b2e565b613b5f8185613b39565b9350613b6f81856020860161258f565b613b78816123ee565b840191505092915050565b600060a082019050613b986000830188612c6a565b613ba56020830187612c6a565b8181036040830152613bb78186612b42565b90508181036060830152613bcb8185612b42565b90508181036080830152613bdf8184613b4a565b90509695505050505050565b600081519050613bfa81612355565b92915050565b600060208284031215613c1657613c15612221565b5b6000613c2484828501613beb565b91505092915050565b60008160e01c9050919050565b600060033d1115613c595760046000803e613c56600051613c2d565b90505b90565b600060443d10613ce957613c6e612217565b60043d036004823e80513d602482011167ffffffffffffffff82111715613c96575050613ce9565b808201805167ffffffffffffffff811115613cb45750505050613ce9565b80602083010160043d038501811115613cd1575050505050613ce9565b613ce08260200185018661242e565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613d4860348361257e565b9150613d5382613cec565b604082019050919050565b60006020820190508181036000830152613d7781613d3b565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613dda60288361257e565b9150613de582613d7e565b604082019050919050565b60006020820190508181036000830152613e0981613dcd565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6c60218361257e565b9150613e7782613e10565b604082019050919050565b60006020820190508181036000830152613e9b81613e5f565b9050919050565b600060a082019050613eb76000830188612c6a565b613ec46020830187612c6a565b613ed160408301866122ff565b613ede60608301856122ff565b8181036080830152613ef08184613b4a565b9050969550505050505056fea2646970667358221220b5651d968667efe6440fe1322882b73a9fe3c5f200afe44935696fbb8d9fef8b64736f6c63430008110033

Deployed Bytecode Sourcemap

163:2435:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2134:227:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1185:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2300:110:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;229:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;928:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;563:80;;;:::i;:::-;;784:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4013:426:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2423:81:10;;;;;;;;;;;;;:::i;:::-;;654:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2518:508:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1823:101:11;;;;;;;;;;;;;:::i;:::-;;459:99:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1193:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3094:153:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1997:292:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2509:86;;;;;;;;;;;;;:::i;:::-;;3314:166:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3547:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2073:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1206:228:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2134:227:2;2220:7;2266:1;2247:21;;:7;:21;;;2239:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2332:9;:13;2342:2;2332:13;;;;;;;;;;;:22;2346:7;2332:22;;;;;;;;;;;;;;;;2325:29;;2134:227;;;;:::o;1185:305::-;1287:4;1337:26;1322:41;;;:11;:41;;;;:109;;;;1394:37;1379:52;;;:11;:52;;;;1322:109;:161;;;;1447:36;1471:11;1447:23;:36::i;:::-;1322:161;1303:180;;1185:305;;;:::o;2300:110:10:-;1086:13:11;:11;:13::i;:::-;2388:15:10::1;2396:6;2388:7;:15::i;:::-;2300:110:::0;:::o;229:44::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;928:264::-;1006:13;1031:21;1055:19;1065:8;1055:9;:19::i;:::-;1031:43;;1115:1;1097:7;1091:21;:25;:94;;;;;;;;;;;;;;;;;1143:7;1152:26;1169:8;1152:16;:26::i;:::-;1126:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1091:94;1084:101;;;928:264;;;:::o;563:80::-;618:23;;;;;;;;;;:::i;:::-;;;;;;;;784:127;850:7;891:13;;875;;:29;;;;:::i;:::-;868:36;;784:127;:::o;4013:426:2:-;4246:12;:10;:12::i;:::-;4238:20;;:4;:20;;;:60;;;;4262:36;4279:4;4285:12;:10;:12::i;:::-;4262:16;:36::i;:::-;4238:60;4217:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;4380:52;4403:4;4409:2;4413:3;4418:7;4427:4;4380:22;:52::i;:::-;4013:426;;;;;:::o;2423:81:10:-;2479:23;;;;;;;;;;:::i;:::-;;;;;;;;654:119;731:15;748:23;;;;;;;;;;:::i;:::-;;;;;;;;2518:508:2;2669:16;2728:3;:10;2709:8;:15;:29;2701:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2795:30;2842:8;:15;2828:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2795:63;;2874:9;2869:120;2893:8;:15;2889:1;:19;2869:120;;;2948:30;2958:8;2967:1;2958:11;;;;;;;;:::i;:::-;;;;;;;;2971:3;2975:1;2971:6;;;;;;;;:::i;:::-;;;;;;;;2948:9;:30::i;:::-;2929:13;2943:1;2929:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;2910:3;;;;:::i;:::-;;;2869:120;;;;3006:13;2999:20;;;2518:508;;;;:::o;1823:101:11:-;1086:13;:11;:13::i;:::-;1887:30:::1;1914:1;1887:18;:30::i;:::-;1823:101::o:0;459:99:10:-;533:23;;;;;;;;;;:::i;:::-;;;;;;;;1193:85:11;1239:7;1265:6;;;;;;;;;;;1258:13;;1193:85;:::o;3094:153:2:-;3188:52;3207:12;:10;:12::i;:::-;3221:8;3231;3188:18;:52::i;:::-;3094:153;;:::o;1997:292:10:-;1086:13:11;:11;:13::i;:::-;2135:7:10::1;:14;2116:8;:15;:33;2108:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;2182:6;2178:105;2196:8;:15;2192:1;:19;2178:105;;;2231:41;2239:8;2248:1;2239:11;;;;;;;;:::i;:::-;;;;;;;;2252:7;2260:1;2252:10;;;;;;;;:::i;:::-;;;;;;;;2264:7;2231;:41::i;:::-;2213:3;;;;;:::i;:::-;;;;2178:105;;;;1997:292:::0;;;:::o;2509:86::-;2570:23;;;;;;;;;;:::i;:::-;;;;;;;;3314:166:2;3413:4;3436:18;:27;3455:7;3436:27;;;;;;;;;;;;;;;:37;3464:8;3436:37;;;;;;;;;;;;;;;;;;;;;;;;;3429:44;;3314:166;;;;:::o;3547:394::-;3755:12;:10;:12::i;:::-;3747:20;;:4;:20;;;:60;;;;3771:36;3788:4;3794:12;:10;:12::i;:::-;3771:16;:36::i;:::-;3747:60;3726:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;3889:45;3907:4;3913:2;3917;3921:6;3929:4;3889:17;:45::i;:::-;3547:394;;;;;:::o;2073:198:11:-;1086:13;:11;:13::i;:::-;2181:1:::1;2161:22;;:8;:22;;::::0;2153:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2236:28;2255:8;2236:18;:28::i;:::-;2073:198:::0;:::o;1206:228:10:-;1274:11;1300:4;;1289:24;;;;;;;:::i;:::-;1273:40;;1323:15;1341:12;:10;:12::i;:::-;1323:30;;1363:31;1369:7;1378;1387:6;1363:5;:31::i;:::-;1421:6;1404:13;;:23;;;;;;;:::i;:::-;;;;;;;;1263:171;;1206:228;;;:::o;828:155:3:-;913:4;951:25;936:40;;;:11;:40;;;;929:47;;828:155;;;:::o;1351:130:11:-;1425:12;:10;:12::i;:::-;1414:23;;:7;:5;:7::i;:::-;:23;;;1406:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1351:130::o;8120:86:2:-;8193:6;8186:4;:13;;;;;;:::i;:::-;;8120:86;:::o;1889:103::-;1949:13;1981:4;1974:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1889:103;;;:::o;409:696:12:-;465:13;514:14;551:1;531:17;542:5;531:10;:17::i;:::-;:21;514:38;;566:20;600:6;589:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;566:41;;621:11;747:6;743:2;739:15;731:6;727:28;720:35;;782:280;789:4;782:280;;;813:5;;;;;;;;952:8;947:2;940:5;936:14;931:30;926:3;918:44;1006:2;997:11;;;;;;:::i;:::-;;;;;1039:1;1030:5;:10;782:280;1026:21;782:280;1082:6;1075:13;;;;;409:696;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;6182:1115:2:-;6402:7;:14;6388:3;:10;:28;6380:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6493:1;6479:16;;:2;:16;;;6471:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6548:16;6567:12;:10;:12::i;:::-;6548:31;;6590:60;6611:8;6621:4;6627:2;6631:3;6636:7;6645:4;6590:20;:60::i;:::-;6666:9;6661:411;6685:3;:10;6681:1;:14;6661:411;;;6716:10;6729:3;6733:1;6729:6;;;;;;;;:::i;:::-;;;;;;;;6716:19;;6749:14;6766:7;6774:1;6766:10;;;;;;;;:::i;:::-;;;;;;;;6749:27;;6791:19;6813:9;:13;6823:2;6813:13;;;;;;;;;;;:19;6827:4;6813:19;;;;;;;;;;;;;;;;6791:41;;6869:6;6854:11;:21;;6846:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;7000:6;6986:11;:20;6964:9;:13;6974:2;6964:13;;;;;;;;;;;:19;6978:4;6964:19;;;;;;;;;;;;;;;:42;;;;7055:6;7034:9;:13;7044:2;7034:13;;;;;;;;;;;:17;7048:2;7034:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6702:370;;;6697:3;;;;:::i;:::-;;;6661:411;;;;7117:2;7087:47;;7111:4;7087:47;;7101:8;7087:47;;;7121:3;7126:7;7087:47;;;;;;;:::i;:::-;;;;;;;;7145:59;7165:8;7175:4;7181:2;7185:3;7190:7;7199:4;7145:19;:59::i;:::-;7215:75;7251:8;7261:4;7267:2;7271:3;7276:7;7285:4;7215:35;:75::i;:::-;6370:927;6182:1115;;;;;:::o;2425:187:11:-;2498:16;2517:6;;;;;;;;;;;2498:25;;2542:8;2533:6;;:17;;;;;;;;;;;;;;;;;;2596:8;2565:40;;2586:8;2565:40;;;;;;;;;;;;2488:124;2425:187;:::o;12859:323:2:-;13009:8;13000:17;;:5;:17;;;12992:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;13111:8;13073:18;:25;13092:5;13073:25;;;;;;;;;;;;;;;:35;13099:8;13073:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13156:8;13134:41;;13149:5;13134:41;;;13166:8;13134:41;;;;;;:::i;:::-;;;;;;;;12859:323;;;:::o;1457:154:10:-;1536:35;1542:7;1551;1560:6;1536:35;;;;;;;;;;;;:5;:35::i;:::-;1598:6;1581:13;;:23;;;;;;;:::i;:::-;;;;;;;;1457:154;;;:::o;4889:947:2:-;5084:1;5070:16;;:2;:16;;;5062:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5139:16;5158:12;:10;:12::i;:::-;5139:31;;5180:20;5203:21;5221:2;5203:17;:21::i;:::-;5180:44;;5234:24;5261:25;5279:6;5261:17;:25::i;:::-;5234:52;;5297:60;5318:8;5328:4;5334:2;5338:3;5343:7;5352:4;5297:20;:60::i;:::-;5368:19;5390:9;:13;5400:2;5390:13;;;;;;;;;;;:19;5404:4;5390:19;;;;;;;;;;;;;;;;5368:41;;5442:6;5427:11;:21;;5419:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5565:6;5551:11;:20;5529:9;:13;5539:2;5529:13;;;;;;;;;;;:19;5543:4;5529:19;;;;;;;;;;;;;;;:42;;;;5612:6;5591:9;:13;5601:2;5591:13;;;;;;;;;;;:17;5605:2;5591:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5665:2;5634:46;;5659:4;5634:46;;5649:8;5634:46;;;5669:2;5673:6;5634:46;;;;;;;:::i;:::-;;;;;;;;5691:59;5711:8;5721:4;5727:2;5731:3;5736:7;5745:4;5691:19;:59::i;:::-;5761:68;5792:8;5802:4;5808:2;5812;5816:6;5824:4;5761:30;:68::i;:::-;5052:784;;;;4889:947;;;;;:::o;10755:786::-;10893:1;10877:18;;:4;:18;;;10869:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;10946:16;10965:12;:10;:12::i;:::-;10946:31;;10987:20;11010:21;11028:2;11010:17;:21::i;:::-;10987:44;;11041:24;11068:25;11086:6;11068:17;:25::i;:::-;11041:52;;11104:66;11125:8;11135:4;11149:1;11153:3;11158:7;11104:66;;;;;;;;;;;;:20;:66::i;:::-;11181:19;11203:9;:13;11213:2;11203:13;;;;;;;;;;;:19;11217:4;11203:19;;;;;;;;;;;;;;;;11181:41;;11255:6;11240:11;:21;;11232:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11372:6;11358:11;:20;11336:9;:13;11346:2;11336:13;;;;;;;;;;;:19;11350:4;11336:19;;;;;;;;;;;;;;;:42;;;;11443:1;11404:54;;11429:4;11404:54;;11419:8;11404:54;;;11447:2;11451:6;11404:54;;;;;;;:::i;:::-;;;;;;;;11469:65;11489:8;11499:4;11513:1;11517:3;11522:7;11469:65;;;;;;;;;;;;:19;:65::i;:::-;10859:682;;;;10755:786;;;:::o;9889:890:9:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;1622:358:10:-;1896:1;1880:18;;:4;:18;;;:38;;;;1916:1;1902:16;;:2;:16;;;1880:38;1859:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1622:358;;;;;;:::o;15265:213:2:-;;;;;;;:::o;16215:792::-;16447:15;:2;:13;;;:15::i;:::-;16443:558;;;16499:2;16482:43;;;16526:8;16536:4;16542:3;16547:7;16556:4;16482:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;16478:513;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16867:6;16860:14;;;;;;;;;;;:::i;:::-;;;;;;;;16478:513;;;16914:62;;;;;;;;;;:::i;:::-;;;;;;;;16478:513;16652:48;;;16640:60;;;:8;:60;;;;16636:157;;16724:50;;;;;;;;;;:::i;:::-;;;;;;;;16636:157;16562:245;16443:558;16215:792;;;;;;:::o;8579:709::-;8740:1;8726:16;;:2;:16;;;8718:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;8791:16;8810:12;:10;:12::i;:::-;8791:31;;8832:20;8855:21;8873:2;8855:17;:21::i;:::-;8832:44;;8886:24;8913:25;8931:6;8913:17;:25::i;:::-;8886:52;;8949:66;8970:8;8988:1;8992:2;8996:3;9001:7;9010:4;8949:20;:66::i;:::-;9047:6;9026:9;:13;9036:2;9026:13;;;;;;;;;;;:17;9040:2;9026:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;9105:2;9068:52;;9101:1;9068:52;;9083:8;9068:52;;;9109:2;9113:6;9068:52;;;;;;;:::i;:::-;;;;;;;;9131:65;9151:8;9169:1;9173:2;9177:3;9182:7;9191:4;9131:19;:65::i;:::-;9207:74;9238:8;9256:1;9260:2;9264;9268:6;9276:4;9207:30;:74::i;:::-;8708:580;;;8579:709;;;;:::o;17013:193::-;17079:16;17107:22;17146:1;17132:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17107:41;;17169:7;17158:5;17164:1;17158:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;17194:5;17187:12;;;17013:193;;;:::o;15484:725::-;15691:15;:2;:13;;;:15::i;:::-;15687:516;;;15743:2;15726:38;;;15765:8;15775:4;15781:2;15785:6;15793:4;15726:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15722:471;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16069:6;16062:14;;;;;;;;;;;:::i;:::-;;;;;;;;15722:471;;;16116:62;;;;;;;;;;:::i;:::-;;;;;;;;15722:471;15859:43;;;15847:55;;;:8;:55;;;;15843:152;;15926:50;;;;;;;;;;:::i;:::-;;;;;;;;15843:152;15799:210;15687:516;15484:725;;;;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;7:75:13:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:311::-;7593:4;7683:18;7675:6;7672:30;7669:56;;;7705:18;;:::i;:::-;7669:56;7755:4;7747:6;7743:17;7735:25;;7815:4;7809;7805:15;7797:23;;7516:311;;;:::o;7833:117::-;7942:1;7939;7932:12;7973:710;8069:5;8094:81;8110:64;8167:6;8110:64;:::i;:::-;8094:81;:::i;:::-;8085:90;;8195:5;8224:6;8217:5;8210:21;8258:4;8251:5;8247:16;8240:23;;8311:4;8303:6;8299:17;8291:6;8287:30;8340:3;8332:6;8329:15;8326:122;;;8359:79;;:::i;:::-;8326:122;8474:6;8457:220;8491:6;8486:3;8483:15;8457:220;;;8566:3;8595:37;8628:3;8616:10;8595:37;:::i;:::-;8590:3;8583:50;8662:4;8657:3;8653:14;8646:21;;8533:144;8517:4;8512:3;8508:14;8501:21;;8457:220;;;8461:21;8075:608;;7973:710;;;;;:::o;8706:370::-;8777:5;8826:3;8819:4;8811:6;8807:17;8803:27;8793:122;;8834:79;;:::i;:::-;8793:122;8951:6;8938:20;8976:94;9066:3;9058:6;9051:4;9043:6;9039:17;8976:94;:::i;:::-;8967:103;;8783:293;8706:370;;;;:::o;9082:307::-;9143:4;9233:18;9225:6;9222:30;9219:56;;;9255:18;;:::i;:::-;9219:56;9293:29;9315:6;9293:29;:::i;:::-;9285:37;;9377:4;9371;9367:15;9359:23;;9082:307;;;:::o;9395:423::-;9472:5;9497:65;9513:48;9554:6;9513:48;:::i;:::-;9497:65;:::i;:::-;9488:74;;9585:6;9578:5;9571:21;9623:4;9616:5;9612:16;9661:3;9652:6;9647:3;9643:16;9640:25;9637:112;;;9668:79;;:::i;:::-;9637:112;9758:54;9805:6;9800:3;9795;9758:54;:::i;:::-;9478:340;9395:423;;;;;:::o;9837:338::-;9892:5;9941:3;9934:4;9926:6;9922:17;9918:27;9908:122;;9949:79;;:::i;:::-;9908:122;10066:6;10053:20;10091:78;10165:3;10157:6;10150:4;10142:6;10138:17;10091:78;:::i;:::-;10082:87;;9898:277;9837:338;;;;:::o;10181:1509::-;10335:6;10343;10351;10359;10367;10416:3;10404:9;10395:7;10391:23;10387:33;10384:120;;;10423:79;;:::i;:::-;10384:120;10543:1;10568:53;10613:7;10604:6;10593:9;10589:22;10568:53;:::i;:::-;10558:63;;10514:117;10670:2;10696:53;10741:7;10732:6;10721:9;10717:22;10696:53;:::i;:::-;10686:63;;10641:118;10826:2;10815:9;10811:18;10798:32;10857:18;10849:6;10846:30;10843:117;;;10879:79;;:::i;:::-;10843:117;10984:78;11054:7;11045:6;11034:9;11030:22;10984:78;:::i;:::-;10974:88;;10769:303;11139:2;11128:9;11124:18;11111:32;11170:18;11162:6;11159:30;11156:117;;;11192:79;;:::i;:::-;11156:117;11297:78;11367:7;11358:6;11347:9;11343:22;11297:78;:::i;:::-;11287:88;;11082:303;11452:3;11441:9;11437:19;11424:33;11484:18;11476:6;11473:30;11470:117;;;11506:79;;:::i;:::-;11470:117;11611:62;11665:7;11656:6;11645:9;11641:22;11611:62;:::i;:::-;11601:72;;11395:288;10181:1509;;;;;;;;:::o;11696:124::-;11773:6;11807:5;11801:12;11791:22;;11696:124;;;:::o;11826:194::-;11935:11;11969:6;11964:3;11957:19;12009:4;12004:3;12000:14;11985:29;;11826:194;;;;:::o;12026:142::-;12103:4;12126:3;12118:11;;12156:4;12151:3;12147:14;12139:22;;12026:142;;;:::o;12174:159::-;12248:11;12282:6;12277:3;12270:19;12322:4;12317:3;12313:14;12298:29;;12174:159;;;;:::o;12339:357::-;12417:3;12445:39;12478:5;12445:39;:::i;:::-;12500:61;12554:6;12549:3;12500:61;:::i;:::-;12493:68;;12570:65;12628:6;12623:3;12616:4;12609:5;12605:16;12570:65;:::i;:::-;12660:29;12682:6;12660:29;:::i;:::-;12655:3;12651:39;12644:46;;12421:275;12339:357;;;;:::o;12702:196::-;12791:10;12826:66;12888:3;12880:6;12826:66;:::i;:::-;12812:80;;12702:196;;;;:::o;12904:123::-;12984:4;13016;13011:3;13007:14;12999:22;;12904:123;;;:::o;13061:991::-;13200:3;13229:64;13287:5;13229:64;:::i;:::-;13309:96;13398:6;13393:3;13309:96;:::i;:::-;13302:103;;13431:3;13476:4;13468:6;13464:17;13459:3;13455:27;13506:66;13566:5;13506:66;:::i;:::-;13595:7;13626:1;13611:396;13636:6;13633:1;13630:13;13611:396;;;13707:9;13701:4;13697:20;13692:3;13685:33;13758:6;13752:13;13786:84;13865:4;13850:13;13786:84;:::i;:::-;13778:92;;13893:70;13956:6;13893:70;:::i;:::-;13883:80;;13992:4;13987:3;13983:14;13976:21;;13671:336;13658:1;13655;13651:9;13646:14;;13611:396;;;13615:14;14023:4;14016:11;;14043:3;14036:10;;13205:847;;;;;13061:991;;;;:::o;14058:413::-;14221:4;14259:2;14248:9;14244:18;14236:26;;14308:9;14302:4;14298:20;14294:1;14283:9;14279:17;14272:47;14336:128;14459:4;14450:6;14336:128;:::i;:::-;14328:136;;14058:413;;;;:::o;14477:311::-;14554:4;14644:18;14636:6;14633:30;14630:56;;;14666:18;;:::i;:::-;14630:56;14716:4;14708:6;14704:17;14696:25;;14776:4;14770;14766:15;14758:23;;14477:311;;;:::o;14811:710::-;14907:5;14932:81;14948:64;15005:6;14948:64;:::i;:::-;14932:81;:::i;:::-;14923:90;;15033:5;15062:6;15055:5;15048:21;15096:4;15089:5;15085:16;15078:23;;15149:4;15141:6;15137:17;15129:6;15125:30;15178:3;15170:6;15167:15;15164:122;;;15197:79;;:::i;:::-;15164:122;15312:6;15295:220;15329:6;15324:3;15321:15;15295:220;;;15404:3;15433:37;15466:3;15454:10;15433:37;:::i;:::-;15428:3;15421:50;15500:4;15495:3;15491:14;15484:21;;15371:144;15355:4;15350:3;15346:14;15339:21;;15295:220;;;15299:21;14913:608;;14811:710;;;;;:::o;15544:370::-;15615:5;15664:3;15657:4;15649:6;15645:17;15641:27;15631:122;;15672:79;;:::i;:::-;15631:122;15789:6;15776:20;15814:94;15904:3;15896:6;15889:4;15881:6;15877:17;15814:94;:::i;:::-;15805:103;;15621:293;15544:370;;;;:::o;15920:894::-;16038:6;16046;16095:2;16083:9;16074:7;16070:23;16066:32;16063:119;;;16101:79;;:::i;:::-;16063:119;16249:1;16238:9;16234:17;16221:31;16279:18;16271:6;16268:30;16265:117;;;16301:79;;:::i;:::-;16265:117;16406:78;16476:7;16467:6;16456:9;16452:22;16406:78;:::i;:::-;16396:88;;16192:302;16561:2;16550:9;16546:18;16533:32;16592:18;16584:6;16581:30;16578:117;;;16614:79;;:::i;:::-;16578:117;16719:78;16789:7;16780:6;16769:9;16765:22;16719:78;:::i;:::-;16709:88;;16504:303;15920:894;;;;;:::o;16820:114::-;16887:6;16921:5;16915:12;16905:22;;16820:114;;;:::o;16940:184::-;17039:11;17073:6;17068:3;17061:19;17113:4;17108:3;17104:14;17089:29;;16940:184;;;;:::o;17130:132::-;17197:4;17220:3;17212:11;;17250:4;17245:3;17241:14;17233:22;;17130:132;;;:::o;17268:108::-;17345:24;17363:5;17345:24;:::i;:::-;17340:3;17333:37;17268:108;;:::o;17382:179::-;17451:10;17472:46;17514:3;17506:6;17472:46;:::i;:::-;17550:4;17545:3;17541:14;17527:28;;17382:179;;;;:::o;17567:113::-;17637:4;17669;17664:3;17660:14;17652:22;;17567:113;;;:::o;17716:732::-;17835:3;17864:54;17912:5;17864:54;:::i;:::-;17934:86;18013:6;18008:3;17934:86;:::i;:::-;17927:93;;18044:56;18094:5;18044:56;:::i;:::-;18123:7;18154:1;18139:284;18164:6;18161:1;18158:13;18139:284;;;18240:6;18234:13;18267:63;18326:3;18311:13;18267:63;:::i;:::-;18260:70;;18353:60;18406:6;18353:60;:::i;:::-;18343:70;;18199:224;18186:1;18183;18179:9;18174:14;;18139:284;;;18143:14;18439:3;18432:10;;17840:608;;;17716:732;;;;:::o;18454:373::-;18597:4;18635:2;18624:9;18620:18;18612:26;;18684:9;18678:4;18674:20;18670:1;18659:9;18655:17;18648:47;18712:108;18815:4;18806:6;18712:108;:::i;:::-;18704:116;;18454:373;;;;:::o;18833:117::-;18942:1;18939;18932:12;18969:552;19026:8;19036:6;19086:3;19079:4;19071:6;19067:17;19063:27;19053:122;;19094:79;;:::i;:::-;19053:122;19207:6;19194:20;19184:30;;19237:18;19229:6;19226:30;19223:117;;;19259:79;;:::i;:::-;19223:117;19373:4;19365:6;19361:17;19349:29;;19427:3;19419:4;19411:6;19407:17;19397:8;19393:32;19390:41;19387:128;;;19434:79;;:::i;:::-;19387:128;18969:552;;;;;:::o;19527:527::-;19597:6;19605;19654:2;19642:9;19633:7;19629:23;19625:32;19622:119;;;19660:79;;:::i;:::-;19622:119;19808:1;19797:9;19793:17;19780:31;19838:18;19830:6;19827:30;19824:117;;;19860:79;;:::i;:::-;19824:117;19973:64;20029:7;20020:6;20009:9;20005:22;19973:64;:::i;:::-;19955:82;;;;19751:296;19527:527;;;;;:::o;20060:118::-;20147:24;20165:5;20147:24;:::i;:::-;20142:3;20135:37;20060:118;;:::o;20184:222::-;20277:4;20315:2;20304:9;20300:18;20292:26;;20328:71;20396:1;20385:9;20381:17;20372:6;20328:71;:::i;:::-;20184:222;;;;:::o;20412:116::-;20482:21;20497:5;20482:21;:::i;:::-;20475:5;20472:32;20462:60;;20518:1;20515;20508:12;20462:60;20412:116;:::o;20534:133::-;20577:5;20615:6;20602:20;20593:29;;20631:30;20655:5;20631:30;:::i;:::-;20534:133;;;;:::o;20673:468::-;20738:6;20746;20795:2;20783:9;20774:7;20770:23;20766:32;20763:119;;;20801:79;;:::i;:::-;20763:119;20921:1;20946:53;20991:7;20982:6;20971:9;20967:22;20946:53;:::i;:::-;20936:63;;20892:117;21048:2;21074:50;21116:7;21107:6;21096:9;21092:22;21074:50;:::i;:::-;21064:60;;21019:115;20673:468;;;;;:::o;21147:1039::-;21274:6;21282;21290;21339:2;21327:9;21318:7;21314:23;21310:32;21307:119;;;21345:79;;:::i;:::-;21307:119;21493:1;21482:9;21478:17;21465:31;21523:18;21515:6;21512:30;21509:117;;;21545:79;;:::i;:::-;21509:117;21650:78;21720:7;21711:6;21700:9;21696:22;21650:78;:::i;:::-;21640:88;;21436:302;21805:2;21794:9;21790:18;21777:32;21836:18;21828:6;21825:30;21822:117;;;21858:79;;:::i;:::-;21822:117;21963:78;22033:7;22024:6;22013:9;22009:22;21963:78;:::i;:::-;21953:88;;21748:303;22090:2;22116:53;22161:7;22152:6;22141:9;22137:22;22116:53;:::i;:::-;22106:63;;22061:118;21147:1039;;;;;:::o;22192:474::-;22260:6;22268;22317:2;22305:9;22296:7;22292:23;22288:32;22285:119;;;22323:79;;:::i;:::-;22285:119;22443:1;22468:53;22513:7;22504:6;22493:9;22489:22;22468:53;:::i;:::-;22458:63;;22414:117;22570:2;22596:53;22641:7;22632:6;22621:9;22617:22;22596:53;:::i;:::-;22586:63;;22541:118;22192:474;;;;;:::o;22672:1089::-;22776:6;22784;22792;22800;22808;22857:3;22845:9;22836:7;22832:23;22828:33;22825:120;;;22864:79;;:::i;:::-;22825:120;22984:1;23009:53;23054:7;23045:6;23034:9;23030:22;23009:53;:::i;:::-;22999:63;;22955:117;23111:2;23137:53;23182:7;23173:6;23162:9;23158:22;23137:53;:::i;:::-;23127:63;;23082:118;23239:2;23265:53;23310:7;23301:6;23290:9;23286:22;23265:53;:::i;:::-;23255:63;;23210:118;23367:2;23393:53;23438:7;23429:6;23418:9;23414:22;23393:53;:::i;:::-;23383:63;;23338:118;23523:3;23512:9;23508:19;23495:33;23555:18;23547:6;23544:30;23541:117;;;23577:79;;:::i;:::-;23541:117;23682:62;23736:7;23727:6;23716:9;23712:22;23682:62;:::i;:::-;23672:72;;23466:288;22672:1089;;;;;;;;:::o;23767:329::-;23826:6;23875:2;23863:9;23854:7;23850:23;23846:32;23843:119;;;23881:79;;:::i;:::-;23843:119;24001:1;24026:53;24071:7;24062:6;24051:9;24047:22;24026:53;:::i;:::-;24016:63;;23972:117;23767:329;;;;:::o;24102:672::-;24181:6;24189;24197;24246:2;24234:9;24225:7;24221:23;24217:32;24214:119;;;24252:79;;:::i;:::-;24214:119;24372:1;24397:53;24442:7;24433:6;24422:9;24418:22;24397:53;:::i;:::-;24387:63;;24343:117;24527:2;24516:9;24512:18;24499:32;24558:18;24550:6;24547:30;24544:117;;;24580:79;;:::i;:::-;24544:117;24693:64;24749:7;24740:6;24729:9;24725:22;24693:64;:::i;:::-;24675:82;;;;24470:297;24102:672;;;;;:::o;24780:229::-;24920:34;24916:1;24908:6;24904:14;24897:58;24989:12;24984:2;24976:6;24972:15;24965:37;24780:229;:::o;25015:366::-;25157:3;25178:67;25242:2;25237:3;25178:67;:::i;:::-;25171:74;;25254:93;25343:3;25254:93;:::i;:::-;25372:2;25367:3;25363:12;25356:19;;25015:366;;;:::o;25387:419::-;25553:4;25591:2;25580:9;25576:18;25568:26;;25640:9;25634:4;25630:20;25626:1;25615:9;25611:17;25604:47;25668:131;25794:4;25668:131;:::i;:::-;25660:139;;25387:419;;;:::o;25812:180::-;25860:77;25857:1;25850:88;25957:4;25954:1;25947:15;25981:4;25978:1;25971:15;25998:320;26042:6;26079:1;26073:4;26069:12;26059:22;;26126:1;26120:4;26116:12;26147:18;26137:81;;26203:4;26195:6;26191:17;26181:27;;26137:81;26265:2;26257:6;26254:14;26234:18;26231:38;26228:84;;26284:18;;:::i;:::-;26228:84;26049:269;25998:320;;;:::o;26324:148::-;26426:11;26463:3;26448:18;;26324:148;;;;:::o;26478:390::-;26584:3;26612:39;26645:5;26612:39;:::i;:::-;26667:89;26749:6;26744:3;26667:89;:::i;:::-;26660:96;;26765:65;26823:6;26818:3;26811:4;26804:5;26800:16;26765:65;:::i;:::-;26855:6;26850:3;26846:16;26839:23;;26588:280;26478:390;;;;:::o;26874:435::-;27054:3;27076:95;27167:3;27158:6;27076:95;:::i;:::-;27069:102;;27188:95;27279:3;27270:6;27188:95;:::i;:::-;27181:102;;27300:3;27293:10;;26874:435;;;;;:::o;27315:163::-;27455:15;27451:1;27443:6;27439:14;27432:39;27315:163;:::o;27484:366::-;27626:3;27647:67;27711:2;27706:3;27647:67;:::i;:::-;27640:74;;27723:93;27812:3;27723:93;:::i;:::-;27841:2;27836:3;27832:12;27825:19;;27484:366;;;:::o;27856:419::-;28022:4;28060:2;28049:9;28045:18;28037:26;;28109:9;28103:4;28099:20;28095:1;28084:9;28080:17;28073:47;28137:131;28263:4;28137:131;:::i;:::-;28129:139;;27856:419;;;:::o;28281:180::-;28329:77;28326:1;28319:88;28426:4;28423:1;28416:15;28450:4;28447:1;28440:15;28467:194;28507:4;28527:20;28545:1;28527:20;:::i;:::-;28522:25;;28561:20;28579:1;28561:20;:::i;:::-;28556:25;;28605:1;28602;28598:9;28590:17;;28629:1;28623:4;28620:11;28617:37;;;28634:18;;:::i;:::-;28617:37;28467:194;;;;:::o;28667:233::-;28807:34;28803:1;28795:6;28791:14;28784:58;28876:16;28871:2;28863:6;28859:15;28852:41;28667:233;:::o;28906:366::-;29048:3;29069:67;29133:2;29128:3;29069:67;:::i;:::-;29062:74;;29145:93;29234:3;29145:93;:::i;:::-;29263:2;29258:3;29254:12;29247:19;;28906:366;;;:::o;29278:419::-;29444:4;29482:2;29471:9;29467:18;29459:26;;29531:9;29525:4;29521:20;29517:1;29506:9;29502:17;29495:47;29559:131;29685:4;29559:131;:::i;:::-;29551:139;;29278:419;;;:::o;29703:228::-;29843:34;29839:1;29831:6;29827:14;29820:58;29912:11;29907:2;29899:6;29895:15;29888:36;29703:228;:::o;29937:366::-;30079:3;30100:67;30164:2;30159:3;30100:67;:::i;:::-;30093:74;;30176:93;30265:3;30176:93;:::i;:::-;30294:2;30289:3;30285:12;30278:19;;29937:366;;;:::o;30309:419::-;30475:4;30513:2;30502:9;30498:18;30490:26;;30562:9;30556:4;30552:20;30548:1;30537:9;30533:17;30526:47;30590:131;30716:4;30590:131;:::i;:::-;30582:139;;30309:419;;;:::o;30734:180::-;30782:77;30779:1;30772:88;30879:4;30876:1;30869:15;30903:4;30900:1;30893:15;30920:233;30959:3;30982:24;31000:5;30982:24;:::i;:::-;30973:33;;31028:66;31021:5;31018:77;31015:103;;31098:18;;:::i;:::-;31015:103;31145:1;31138:5;31134:13;31127:20;;30920:233;;;:::o;31159:164::-;31299:16;31295:1;31287:6;31283:14;31276:40;31159:164;:::o;31329:366::-;31471:3;31492:67;31556:2;31551:3;31492:67;:::i;:::-;31485:74;;31568:93;31657:3;31568:93;:::i;:::-;31686:2;31681:3;31677:12;31670:19;;31329:366;;;:::o;31701:419::-;31867:4;31905:2;31894:9;31890:18;31882:26;;31954:9;31948:4;31944:20;31940:1;31929:9;31925:17;31918:47;31982:131;32108:4;31982:131;:::i;:::-;31974:139;;31701:419;;;:::o;32126:225::-;32266:34;32262:1;32254:6;32250:14;32243:58;32335:8;32330:2;32322:6;32318:15;32311:33;32126:225;:::o;32357:366::-;32499:3;32520:67;32584:2;32579:3;32520:67;:::i;:::-;32513:74;;32596:93;32685:3;32596:93;:::i;:::-;32714:2;32709:3;32705:12;32698:19;;32357:366;;;:::o;32729:419::-;32895:4;32933:2;32922:9;32918:18;32910:26;;32982:9;32976:4;32972:20;32968:1;32957:9;32953:17;32946:47;33010:131;33136:4;33010:131;:::i;:::-;33002:139;;32729:419;;;:::o;33154:191::-;33194:3;33213:20;33231:1;33213:20;:::i;:::-;33208:25;;33247:20;33265:1;33247:20;:::i;:::-;33242:25;;33290:1;33287;33283:9;33276:16;;33311:3;33308:1;33305:10;33302:36;;;33318:18;;:::i;:::-;33302:36;33154:191;;;;:::o;33351:182::-;33491:34;33487:1;33479:6;33475:14;33468:58;33351:182;:::o;33539:366::-;33681:3;33702:67;33766:2;33761:3;33702:67;:::i;:::-;33695:74;;33778:93;33867:3;33778:93;:::i;:::-;33896:2;33891:3;33887:12;33880:19;;33539:366;;;:::o;33911:419::-;34077:4;34115:2;34104:9;34100:18;34092:26;;34164:9;34158:4;34154:20;34150:1;34139:9;34135:17;34128:47;34192:131;34318:4;34192:131;:::i;:::-;34184:139;;33911:419;;;:::o;34336:141::-;34385:4;34408:3;34400:11;;34431:3;34428:1;34421:14;34465:4;34462:1;34452:18;34444:26;;34336:141;;;:::o;34483:93::-;34520:6;34567:2;34562;34555:5;34551:14;34547:23;34537:33;;34483:93;;;:::o;34582:107::-;34626:8;34676:5;34670:4;34666:16;34645:37;;34582:107;;;;:::o;34695:393::-;34764:6;34814:1;34802:10;34798:18;34837:97;34867:66;34856:9;34837:97;:::i;:::-;34955:39;34985:8;34974:9;34955:39;:::i;:::-;34943:51;;35027:4;35023:9;35016:5;35012:21;35003:30;;35076:4;35066:8;35062:19;35055:5;35052:30;35042:40;;34771:317;;34695:393;;;;;:::o;35094:60::-;35122:3;35143:5;35136:12;;35094:60;;;:::o;35160:142::-;35210:9;35243:53;35261:34;35270:24;35288:5;35270:24;:::i;:::-;35261:34;:::i;:::-;35243:53;:::i;:::-;35230:66;;35160:142;;;:::o;35308:75::-;35351:3;35372:5;35365:12;;35308:75;;;:::o;35389:269::-;35499:39;35530:7;35499:39;:::i;:::-;35560:91;35609:41;35633:16;35609:41;:::i;:::-;35601:6;35594:4;35588:11;35560:91;:::i;:::-;35554:4;35547:105;35465:193;35389:269;;;:::o;35664:73::-;35709:3;35664:73;:::o;35743:189::-;35820:32;;:::i;:::-;35861:65;35919:6;35911;35905:4;35861:65;:::i;:::-;35796:136;35743:189;;:::o;35938:186::-;35998:120;36015:3;36008:5;36005:14;35998:120;;;36069:39;36106:1;36099:5;36069:39;:::i;:::-;36042:1;36035:5;36031:13;36022:22;;35998:120;;;35938:186;;:::o;36130:543::-;36231:2;36226:3;36223:11;36220:446;;;36265:38;36297:5;36265:38;:::i;:::-;36349:29;36367:10;36349:29;:::i;:::-;36339:8;36335:44;36532:2;36520:10;36517:18;36514:49;;;36553:8;36538:23;;36514:49;36576:80;36632:22;36650:3;36632:22;:::i;:::-;36622:8;36618:37;36605:11;36576:80;:::i;:::-;36235:431;;36220:446;36130:543;;;:::o;36679:117::-;36733:8;36783:5;36777:4;36773:16;36752:37;;36679:117;;;;:::o;36802:169::-;36846:6;36879:51;36927:1;36923:6;36915:5;36912:1;36908:13;36879:51;:::i;:::-;36875:56;36960:4;36954;36950:15;36940:25;;36853:118;36802:169;;;;:::o;36976:295::-;37052:4;37198:29;37223:3;37217:4;37198:29;:::i;:::-;37190:37;;37260:3;37257:1;37253:11;37247:4;37244:21;37236:29;;36976:295;;;;:::o;37276:1395::-;37393:37;37426:3;37393:37;:::i;:::-;37495:18;37487:6;37484:30;37481:56;;;37517:18;;:::i;:::-;37481:56;37561:38;37593:4;37587:11;37561:38;:::i;:::-;37646:67;37706:6;37698;37692:4;37646:67;:::i;:::-;37740:1;37764:4;37751:17;;37796:2;37788:6;37785:14;37813:1;37808:618;;;;38470:1;38487:6;38484:77;;;38536:9;38531:3;38527:19;38521:26;38512:35;;38484:77;38587:67;38647:6;38640:5;38587:67;:::i;:::-;38581:4;38574:81;38443:222;37778:887;;37808:618;37860:4;37856:9;37848:6;37844:22;37894:37;37926:4;37894:37;:::i;:::-;37953:1;37967:208;37981:7;37978:1;37975:14;37967:208;;;38060:9;38055:3;38051:19;38045:26;38037:6;38030:42;38111:1;38103:6;38099:14;38089:24;;38158:2;38147:9;38143:18;38130:31;;38004:4;38001:1;37997:12;37992:17;;37967:208;;;38203:6;38194:7;38191:19;38188:179;;;38261:9;38256:3;38252:19;38246:26;38304:48;38346:4;38338:6;38334:17;38323:9;38304:48;:::i;:::-;38296:6;38289:64;38211:156;38188:179;38413:1;38409;38401:6;38397:14;38393:22;38387:4;38380:36;37815:611;;;37778:887;;37368:1303;;;37276:1395;;:::o;38677:180::-;38725:77;38722:1;38715:88;38822:4;38819:1;38812:15;38846:4;38843:1;38836:15;38863:227;39003:34;38999:1;38991:6;38987:14;38980:58;39072:10;39067:2;39059:6;39055:15;39048:35;38863:227;:::o;39096:366::-;39238:3;39259:67;39323:2;39318:3;39259:67;:::i;:::-;39252:74;;39335:93;39424:3;39335:93;:::i;:::-;39453:2;39448:3;39444:12;39437:19;;39096:366;;;:::o;39468:419::-;39634:4;39672:2;39661:9;39657:18;39649:26;;39721:9;39715:4;39711:20;39707:1;39696:9;39692:17;39685:47;39749:131;39875:4;39749:131;:::i;:::-;39741:139;;39468:419;;;:::o;39893:224::-;40033:34;40029:1;40021:6;40017:14;40010:58;40102:7;40097:2;40089:6;40085:15;40078:32;39893:224;:::o;40123:366::-;40265:3;40286:67;40350:2;40345:3;40286:67;:::i;:::-;40279:74;;40362:93;40451:3;40362:93;:::i;:::-;40480:2;40475:3;40471:12;40464:19;;40123:366;;;:::o;40495:419::-;40661:4;40699:2;40688:9;40684:18;40676:26;;40748:9;40742:4;40738:20;40734:1;40723:9;40719:17;40712:47;40776:131;40902:4;40776:131;:::i;:::-;40768:139;;40495:419;;;:::o;40920:229::-;41060:34;41056:1;41048:6;41044:14;41037:58;41129:12;41124:2;41116:6;41112:15;41105:37;40920:229;:::o;41155:366::-;41297:3;41318:67;41382:2;41377:3;41318:67;:::i;:::-;41311:74;;41394:93;41483:3;41394:93;:::i;:::-;41512:2;41507:3;41503:12;41496:19;;41155:366;;;:::o;41527:419::-;41693:4;41731:2;41720:9;41716:18;41708:26;;41780:9;41774:4;41770:20;41766:1;41755:9;41751:17;41744:47;41808:131;41934:4;41808:131;:::i;:::-;41800:139;;41527:419;;;:::o;41952:634::-;42173:4;42211:2;42200:9;42196:18;42188:26;;42260:9;42254:4;42250:20;42246:1;42235:9;42231:17;42224:47;42288:108;42391:4;42382:6;42288:108;:::i;:::-;42280:116;;42443:9;42437:4;42433:20;42428:2;42417:9;42413:18;42406:48;42471:108;42574:4;42565:6;42471:108;:::i;:::-;42463:116;;41952:634;;;;;:::o;42592:228::-;42732:34;42728:1;42720:6;42716:14;42709:58;42801:11;42796:2;42788:6;42784:15;42777:36;42592:228;:::o;42826:366::-;42968:3;42989:67;43053:2;43048:3;42989:67;:::i;:::-;42982:74;;43065:93;43154:3;43065:93;:::i;:::-;43183:2;43178:3;43174:12;43167:19;;42826:366;;;:::o;43198:419::-;43364:4;43402:2;43391:9;43387:18;43379:26;;43451:9;43445:4;43441:20;43437:1;43426:9;43422:17;43415:47;43479:131;43605:4;43479:131;:::i;:::-;43471:139;;43198:419;;;:::o;43623:332::-;43744:4;43782:2;43771:9;43767:18;43759:26;;43795:71;43863:1;43852:9;43848:17;43839:6;43795:71;:::i;:::-;43876:72;43944:2;43933:9;43929:18;43920:6;43876:72;:::i;:::-;43623:332;;;;;:::o;43961:222::-;44101:34;44097:1;44089:6;44085:14;44078:58;44170:5;44165:2;44157:6;44153:15;44146:30;43961:222;:::o;44189:366::-;44331:3;44352:67;44416:2;44411:3;44352:67;:::i;:::-;44345:74;;44428:93;44517:3;44428:93;:::i;:::-;44546:2;44541:3;44537:12;44530:19;;44189:366;;;:::o;44561:419::-;44727:4;44765:2;44754:9;44750:18;44742:26;;44814:9;44808:4;44804:20;44800:1;44789:9;44785:17;44778:47;44842:131;44968:4;44842:131;:::i;:::-;44834:139;;44561:419;;;:::o;44986:223::-;45126:34;45122:1;45114:6;45110:14;45103:58;45195:6;45190:2;45182:6;45178:15;45171:31;44986:223;:::o;45215:366::-;45357:3;45378:67;45442:2;45437:3;45378:67;:::i;:::-;45371:74;;45454:93;45543:3;45454:93;:::i;:::-;45572:2;45567:3;45563:12;45556:19;;45215:366;;;:::o;45587:419::-;45753:4;45791:2;45780:9;45776:18;45768:26;;45840:9;45834:4;45830:20;45826:1;45815:9;45811:17;45804:47;45868:131;45994:4;45868:131;:::i;:::-;45860:139;;45587:419;;;:::o;46012:179::-;46152:31;46148:1;46140:6;46136:14;46129:55;46012:179;:::o;46197:366::-;46339:3;46360:67;46424:2;46419:3;46360:67;:::i;:::-;46353:74;;46436:93;46525:3;46436:93;:::i;:::-;46554:2;46549:3;46545:12;46538:19;;46197:366;;;:::o;46569:419::-;46735:4;46773:2;46762:9;46758:18;46750:26;;46822:9;46816:4;46812:20;46808:1;46797:9;46793:17;46786:47;46850:131;46976:4;46850:131;:::i;:::-;46842:139;;46569:419;;;:::o;46994:98::-;47045:6;47079:5;47073:12;47063:22;;46994:98;;;:::o;47098:168::-;47181:11;47215:6;47210:3;47203:19;47255:4;47250:3;47246:14;47231:29;;47098:168;;;;:::o;47272:373::-;47358:3;47386:38;47418:5;47386:38;:::i;:::-;47440:70;47503:6;47498:3;47440:70;:::i;:::-;47433:77;;47519:65;47577:6;47572:3;47565:4;47558:5;47554:16;47519:65;:::i;:::-;47609:29;47631:6;47609:29;:::i;:::-;47604:3;47600:39;47593:46;;47362:283;47272:373;;;;:::o;47651:1053::-;47974:4;48012:3;48001:9;47997:19;47989:27;;48026:71;48094:1;48083:9;48079:17;48070:6;48026:71;:::i;:::-;48107:72;48175:2;48164:9;48160:18;48151:6;48107:72;:::i;:::-;48226:9;48220:4;48216:20;48211:2;48200:9;48196:18;48189:48;48254:108;48357:4;48348:6;48254:108;:::i;:::-;48246:116;;48409:9;48403:4;48399:20;48394:2;48383:9;48379:18;48372:48;48437:108;48540:4;48531:6;48437:108;:::i;:::-;48429:116;;48593:9;48587:4;48583:20;48577:3;48566:9;48562:19;48555:49;48621:76;48692:4;48683:6;48621:76;:::i;:::-;48613:84;;47651:1053;;;;;;;;:::o;48710:141::-;48766:5;48797:6;48791:13;48782:22;;48813:32;48839:5;48813:32;:::i;:::-;48710:141;;;;:::o;48857:349::-;48926:6;48975:2;48963:9;48954:7;48950:23;48946:32;48943:119;;;48981:79;;:::i;:::-;48943:119;49101:1;49126:63;49181:7;49172:6;49161:9;49157:22;49126:63;:::i;:::-;49116:73;;49072:127;48857:349;;;;:::o;49212:106::-;49256:8;49305:5;49300:3;49296:15;49275:36;;49212:106;;;:::o;49324:183::-;49359:3;49397:1;49379:16;49376:23;49373:128;;;49435:1;49432;49429;49414:23;49457:34;49488:1;49482:8;49457:34;:::i;:::-;49450:41;;49373:128;49324:183;:::o;49513:711::-;49552:3;49590:4;49572:16;49569:26;49598:5;49566:39;49627:20;;:::i;:::-;49702:1;49684:16;49680:24;49677:1;49671:4;49656:49;49735:4;49729:11;49834:16;49827:4;49819:6;49815:17;49812:39;49779:18;49771:6;49768:30;49752:113;49749:146;;;49880:5;;;;49749:146;49926:6;49920:4;49916:17;49962:3;49956:10;49989:18;49981:6;49978:30;49975:43;;;50011:5;;;;;;49975:43;50059:6;50052:4;50047:3;50043:14;50039:27;50118:1;50100:16;50096:24;50090:4;50086:35;50081:3;50078:44;50075:57;;;50125:5;;;;;;;50075:57;50142;50190:6;50184:4;50180:17;50172:6;50168:30;50162:4;50142:57;:::i;:::-;50215:3;50208:10;;49556:668;;;;;49513:711;;:::o;50230:239::-;50370:34;50366:1;50358:6;50354:14;50347:58;50439:22;50434:2;50426:6;50422:15;50415:47;50230:239;:::o;50475:366::-;50617:3;50638:67;50702:2;50697:3;50638:67;:::i;:::-;50631:74;;50714:93;50803:3;50714:93;:::i;:::-;50832:2;50827:3;50823:12;50816:19;;50475:366;;;:::o;50847:419::-;51013:4;51051:2;51040:9;51036:18;51028:26;;51100:9;51094:4;51090:20;51086:1;51075:9;51071:17;51064:47;51128:131;51254:4;51128:131;:::i;:::-;51120:139;;50847:419;;;:::o;51272:227::-;51412:34;51408:1;51400:6;51396:14;51389:58;51481:10;51476:2;51468:6;51464:15;51457:35;51272:227;:::o;51505:366::-;51647:3;51668:67;51732:2;51727:3;51668:67;:::i;:::-;51661:74;;51744:93;51833:3;51744:93;:::i;:::-;51862:2;51857:3;51853:12;51846:19;;51505:366;;;:::o;51877:419::-;52043:4;52081:2;52070:9;52066:18;52058:26;;52130:9;52124:4;52120:20;52116:1;52105:9;52101:17;52094:47;52158:131;52284:4;52158:131;:::i;:::-;52150:139;;51877:419;;;:::o;52302:220::-;52442:34;52438:1;52430:6;52426:14;52419:58;52511:3;52506:2;52498:6;52494:15;52487:28;52302:220;:::o;52528:366::-;52670:3;52691:67;52755:2;52750:3;52691:67;:::i;:::-;52684:74;;52767:93;52856:3;52767:93;:::i;:::-;52885:2;52880:3;52876:12;52869:19;;52528:366;;;:::o;52900:419::-;53066:4;53104:2;53093:9;53089:18;53081:26;;53153:9;53147:4;53143:20;53139:1;53128:9;53124:17;53117:47;53181:131;53307:4;53181:131;:::i;:::-;53173:139;;52900:419;;;:::o;53325:751::-;53548:4;53586:3;53575:9;53571:19;53563:27;;53600:71;53668:1;53657:9;53653:17;53644:6;53600:71;:::i;:::-;53681:72;53749:2;53738:9;53734:18;53725:6;53681:72;:::i;:::-;53763;53831:2;53820:9;53816:18;53807:6;53763:72;:::i;:::-;53845;53913:2;53902:9;53898:18;53889:6;53845:72;:::i;:::-;53965:9;53959:4;53955:20;53949:3;53938:9;53934:19;53927:49;53993:76;54064:4;54055:6;53993:76;:::i;:::-;53985:84;;53325:751;;;;;;;;:::o

Swarm Source

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