Token Moose V1

 

Overview ERC-721

Total Supply:
100 MOOSE

Holders:
63 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MooseNFT

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-12
*/

// Sources flattened with hardhat v2.1.1 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]


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 @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]


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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

}


// File @openzeppelin/contracts/utils/introspection/[email protected]


pragma solidity ^0.8.0;

/**
 * @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 @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping (uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping (address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}


// File @openzeppelin/contracts/security/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;


/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override {
        require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant");

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @openzeppelin/contracts/utils/structs/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;


/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping (bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

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

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

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


// File @openzeppelin/contracts/security/[email protected]


pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File contracts/MooseNFT-FTM.sol


pragma solidity ^0.8.0;








/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract MooseNFT is Context, AccessControlEnumerable, ReentrancyGuard, ERC721Enumerable, ERC721Burnable,ERC721Pausable {
    using Counters for Counters.Counter;
    
    uint public constant TOKEN_LIMIT = 100; // 4 for testing, 100 for prod;
    uint public constant OWNER_MINTS = 5; // 1 for testing, 5 for prod;

    uint public constant MAX_MINTS_PER_ADDRESS = 5;

    uint public constant PRICE = 2000000000000000000000;
    
    // The beneficiary is the ELK community wallet
    address payable public constant BENEFICIARY = payable(address(0x33510BA8618F8A34B7119AE19fC37a423Bb95291));

    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    
    enum TokenType { Legendary, Epic, Rare, Uncommon }
    
    Counters.Counter private _tokenIdTracker;
    TokenType[] private _tokenTypes = [TokenType.Legendary, TokenType.Epic, TokenType.Epic, TokenType.Epic, TokenType.Epic, TokenType.Epic, TokenType.Epic, TokenType.Epic, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Rare, TokenType.Rare, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Rare, TokenType.Rare, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Epic, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Epic, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Rare, TokenType.Uncommon, TokenType.Uncommon, TokenType.Uncommon, TokenType.Rare];

    mapping (address => uint8) private _mintCounts;

    string private _baseTokenURI;

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * Token URIs will be autogenerated based on `baseURI` and their token IDs.
     * See {ERC721-tokenURI}.
     */
    constructor(string memory name, string memory symbol, string memory baseTokenURI) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;

        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    /*
     * @dev Indicates whether more tokens can be minted.
    */
    function mintAvailable() public view virtual returns (bool) {
        return _tokenIdTracker.current() < TOKEN_LIMIT;
    }
    
    /*
     * @dev Indicates whether the given address can mint more tokens.
    */
    function addressMintAvailable(address to) public view virtual returns (bool) {
        return _mintCounts[to] < MAX_MINTS_PER_ADDRESS;
    }
    
    /*
     * @dev Returns the token type for a given tokenId.
    */
    function tokenType(uint tokenId) public view virtual returns (TokenType) {
        require(tokenId >= 0 && tokenId < TOKEN_LIMIT, 'MooseNFT: token does not exist!');
        return _tokenTypes[tokenId];
    }

    /**
     * @dev Creates a new token for `to`. Its token ID will be automatically
     * assigned (and available on the emitted {IERC721-Transfer} event), and the token
     * URI autogenerated based on the base URI passed at construction.
     *
     * See {ERC721-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to) public payable virtual nonReentrant() {
        require(_tokenIdTracker.current() < TOKEN_LIMIT, "MooseNFT: mint limit reached!");
        require(_mintCounts[to] < MAX_MINTS_PER_ADDRESS || hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "MooseNFT: mint limit per address reached!");

        uint price = 0;
        if (_tokenIdTracker.current() >= OWNER_MINTS) {
            price = PRICE;
            require(msg.value >= price);
        }
        
        if (msg.value > 0) {
            BENEFICIARY.transfer(msg.value);
        }

        // We cannot just use balanceOf to create the new tokenId because tokens
        // can be burned (destroyed), so we need a separate counter.
        _mint(to, _tokenIdTracker.current());
        _tokenIdTracker.increment();
        _mintCounts[to] = _mintCounts[to] + 1;
    }
    
    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "MooseNFT: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "MooseNFT: must have pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BENEFICIARY","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"addressMintAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenType","outputs":[{"internalType":"enum MooseNFT.TokenType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180610c8001604052806000600381111562000027576200002662001a5a565b5b60038111156200003c576200003b62001a5a565b5b81526020016001600381111562000058576200005762001a5a565b5b60038111156200006d576200006c62001a5a565b5b81526020016001600381111562000089576200008862001a5a565b5b60038111156200009e576200009d62001a5a565b5b815260200160016003811115620000ba57620000b962001a5a565b5b6003811115620000cf57620000ce62001a5a565b5b815260200160016003811115620000eb57620000ea62001a5a565b5b60038111156200010057620000ff62001a5a565b5b8152602001600160038111156200011c576200011b62001a5a565b5b600381111562000131576200013062001a5a565b5b8152602001600160038111156200014d576200014c62001a5a565b5b600381111562000162576200016162001a5a565b5b8152602001600160038111156200017e576200017d62001a5a565b5b600381111562000193576200019262001a5a565b5b815260200160026003811115620001af57620001ae62001a5a565b5b6003811115620001c457620001c362001a5a565b5b8152602001600380811115620001df57620001de62001a5a565b5b6003811115620001f457620001f362001a5a565b5b81526020016003808111156200020f576200020e62001a5a565b5b600381111562000224576200022362001a5a565b5b81526020016003808111156200023f576200023e62001a5a565b5b600381111562000254576200025362001a5a565b5b81526020016003808111156200026f576200026e62001a5a565b5b600381111562000284576200028362001a5a565b5b81526020016003808111156200029f576200029e62001a5a565b5b6003811115620002b457620002b362001a5a565b5b8152602001600380811115620002cf57620002ce62001a5a565b5b6003811115620002e457620002e362001a5a565b5b8152602001600380811115620002ff57620002fe62001a5a565b5b600381111562000314576200031362001a5a565b5b81526020016002600381111562000330576200032f62001a5a565b5b600381111562000345576200034462001a5a565b5b815260200160038081111562000360576200035f62001a5a565b5b600381111562000375576200037462001a5a565b5b81526020016002600381111562000391576200039062001a5a565b5b6003811115620003a657620003a562001a5a565b5b8152602001600380811115620003c157620003c062001a5a565b5b6003811115620003d657620003d562001a5a565b5b815260200160026003811115620003f257620003f162001a5a565b5b600381111562000407576200040662001a5a565b5b815260200160038081111562000422576200042162001a5a565b5b600381111562000437576200043662001a5a565b5b81526020016002600381111562000453576200045262001a5a565b5b600381111562000468576200046762001a5a565b5b815260200160038081111562000483576200048262001a5a565b5b600381111562000498576200049762001a5a565b5b815260200160026003811115620004b457620004b362001a5a565b5b6003811115620004c957620004c862001a5a565b5b8152602001600380811115620004e457620004e362001a5a565b5b6003811115620004f957620004f862001a5a565b5b81526020016002600381111562000515576200051462001a5a565b5b60038111156200052a576200052962001a5a565b5b81526020016002600381111562000546576200054562001a5a565b5b60038111156200055b576200055a62001a5a565b5b81526020016002600381111562000577576200057662001a5a565b5b60038111156200058c576200058b62001a5a565b5b815260200160026003811115620005a857620005a762001a5a565b5b6003811115620005bd57620005bc62001a5a565b5b8152602001600380811115620005d857620005d762001a5a565b5b6003811115620005ed57620005ec62001a5a565b5b815260200160038081111562000608576200060762001a5a565b5b60038111156200061d576200061c62001a5a565b5b815260200160038081111562000638576200063762001a5a565b5b60038111156200064d576200064c62001a5a565b5b815260200160038081111562000668576200066762001a5a565b5b60038111156200067d576200067c62001a5a565b5b815260200160038081111562000698576200069762001a5a565b5b6003811115620006ad57620006ac62001a5a565b5b815260200160026003811115620006c957620006c862001a5a565b5b6003811115620006de57620006dd62001a5a565b5b815260200160026003811115620006fa57620006f962001a5a565b5b60038111156200070f576200070e62001a5a565b5b8152602001600260038111156200072b576200072a62001a5a565b5b600381111562000740576200073f62001a5a565b5b8152602001600260038111156200075c576200075b62001a5a565b5b600381111562000771576200077062001a5a565b5b81526020016003808111156200078c576200078b62001a5a565b5b6003811115620007a157620007a062001a5a565b5b8152602001600380811115620007bc57620007bb62001a5a565b5b6003811115620007d157620007d062001a5a565b5b8152602001600380811115620007ec57620007eb62001a5a565b5b600381111562000801576200080062001a5a565b5b8152602001600260038111156200081d576200081c62001a5a565b5b600381111562000832576200083162001a5a565b5b81526020016003808111156200084d576200084c62001a5a565b5b600381111562000862576200086162001a5a565b5b8152602001600260038111156200087e576200087d62001a5a565b5b600381111562000893576200089262001a5a565b5b8152602001600380811115620008ae57620008ad62001a5a565b5b6003811115620008c357620008c262001a5a565b5b815260200160026003811115620008df57620008de62001a5a565b5b6003811115620008f457620008f362001a5a565b5b81526020016003808111156200090f576200090e62001a5a565b5b600381111562000924576200092362001a5a565b5b81526020016003808111156200093f576200093e62001a5a565b5b600381111562000954576200095362001a5a565b5b81526020016003808111156200096f576200096e62001a5a565b5b600381111562000984576200098362001a5a565b5b815260200160016003811115620009a0576200099f62001a5a565b5b6003811115620009b557620009b462001a5a565b5b8152602001600380811115620009d057620009cf62001a5a565b5b6003811115620009e557620009e462001a5a565b5b815260200160038081111562000a0057620009ff62001a5a565b5b600381111562000a155762000a1462001a5a565b5b815260200160038081111562000a305762000a2f62001a5a565b5b600381111562000a455762000a4462001a5a565b5b81526020016002600381111562000a615762000a6062001a5a565b5b600381111562000a765762000a7562001a5a565b5b815260200160038081111562000a915762000a9062001a5a565b5b600381111562000aa65762000aa562001a5a565b5b81526020016002600381111562000ac25762000ac162001a5a565b5b600381111562000ad75762000ad662001a5a565b5b815260200160038081111562000af25762000af162001a5a565b5b600381111562000b075762000b0662001a5a565b5b815260200160038081111562000b225762000b2162001a5a565b5b600381111562000b375762000b3662001a5a565b5b815260200160038081111562000b525762000b5162001a5a565b5b600381111562000b675762000b6662001a5a565b5b815260200160038081111562000b825762000b8162001a5a565b5b600381111562000b975762000b9662001a5a565b5b815260200160038081111562000bb25762000bb162001a5a565b5b600381111562000bc75762000bc662001a5a565b5b815260200160038081111562000be25762000be162001a5a565b5b600381111562000bf75762000bf662001a5a565b5b815260200160038081111562000c125762000c1162001a5a565b5b600381111562000c275762000c2662001a5a565b5b815260200160038081111562000c425762000c4162001a5a565b5b600381111562000c575762000c5662001a5a565b5b815260200160038081111562000c725762000c7162001a5a565b5b600381111562000c875762000c8662001a5a565b5b815260200160038081111562000ca25762000ca162001a5a565b5b600381111562000cb75762000cb662001a5a565b5b81526020016001600381111562000cd35762000cd262001a5a565b5b600381111562000ce85762000ce762001a5a565b5b81526020016002600381111562000d045762000d0362001a5a565b5b600381111562000d195762000d1862001a5a565b5b815260200160038081111562000d345762000d3362001a5a565b5b600381111562000d495762000d4862001a5a565b5b815260200160038081111562000d645762000d6362001a5a565b5b600381111562000d795762000d7862001a5a565b5b81526020016002600381111562000d955762000d9462001a5a565b5b600381111562000daa5762000da962001a5a565b5b81526020016002600381111562000dc65762000dc562001a5a565b5b600381111562000ddb5762000dda62001a5a565b5b815260200160038081111562000df65762000df562001a5a565b5b600381111562000e0b5762000e0a62001a5a565b5b815260200160038081111562000e265762000e2562001a5a565b5b600381111562000e3b5762000e3a62001a5a565b5b81526020016002600381111562000e575762000e5662001a5a565b5b600381111562000e6c5762000e6b62001a5a565b5b81526020016002600381111562000e885762000e8762001a5a565b5b600381111562000e9d5762000e9c62001a5a565b5b815260200160038081111562000eb85762000eb762001a5a565b5b600381111562000ecd5762000ecc62001a5a565b5b815260200160038081111562000ee85762000ee762001a5a565b5b600381111562000efd5762000efc62001a5a565b5b815260200160038081111562000f185762000f1762001a5a565b5b600381111562000f2d5762000f2c62001a5a565b5b815260200160038081111562000f485762000f4762001a5a565b5b600381111562000f5d5762000f5c62001a5a565b5b81526020016002600381111562000f795762000f7862001a5a565b5b600381111562000f8e5762000f8d62001a5a565b5b815260200160038081111562000fa95762000fa862001a5a565b5b600381111562000fbe5762000fbd62001a5a565b5b81526020016002600381111562000fda5762000fd962001a5a565b5b600381111562000fef5762000fee62001a5a565b5b81526020016003808111156200100a576200100962001a5a565b5b60038111156200101f576200101e62001a5a565b5b81526020016003808111156200103a576200103962001a5a565b5b60038111156200104f576200104e62001a5a565b5b81526020016003808111156200106a576200106962001a5a565b5b60038111156200107f576200107e62001a5a565b5b81526020016003808111156200109a576200109962001a5a565b5b6003811115620010af57620010ae62001a5a565b5b8152602001600380811115620010ca57620010c962001a5a565b5b6003811115620010df57620010de62001a5a565b5b8152602001600380811115620010fa57620010f962001a5a565b5b60038111156200110f576200110e62001a5a565b5b8152602001600260038111156200112b576200112a62001a5a565b5b600381111562001140576200113f62001a5a565b5b81526020016003808111156200115b576200115a62001a5a565b5b600381111562001170576200116f62001a5a565b5b81526020016003808111156200118b576200118a62001a5a565b5b6003811115620011a0576200119f62001a5a565b5b815260200160026003811115620011bc57620011bb62001a5a565b5b6003811115620011d157620011d062001a5a565b5b8152602001600380811115620011ec57620011eb62001a5a565b5b600381111562001201576200120062001a5a565b5b8152602001600260038111156200121d576200121c62001a5a565b5b600381111562001232576200123162001a5a565b5b81526020016003808111156200124d576200124c62001a5a565b5b600381111562001262576200126162001a5a565b5b81526020016003808111156200127d576200127c62001a5a565b5b600381111562001292576200129162001a5a565b5b8152602001600380811115620012ad57620012ac62001a5a565b5b6003811115620012c257620012c162001a5a565b5b815260200160026003811115620012de57620012dd62001a5a565b5b6003811115620012f357620012f262001a5a565b5b815250600f90606462001308929190620016b2565b503480156200131657600080fd5b50604051620069a2380380620069a283398181016040528101906200133c9190620018a0565b8282600160028190555081600390805190602001906200135e92919062001772565b5080600490805190602001906200137792919062001772565b5050506000600d60006101000a81548160ff0219169083151502179055508060119080519060200190620013ad92919062001772565b50620013d26000801b620013c66200141c60201b60201c565b6200142460201b60201c565b620014137f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620014076200141c60201b60201c565b6200142460201b60201c565b50505062001b0c565b600033905090565b6200143b82826200146c60201b620019271760201c565b6200146781600160008581526020019081526020016000206200148260201b620019351790919060201c565b505050565b6200147e8282620014ba60201b60201c565b5050565b6000620014b2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620015ab60201b60201c565b905092915050565b620014cc82826200162560201b60201c565b620015a757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200154c6200141c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620015bf83836200168f60201b60201c565b6200161a5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200161f565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805482825590600052602060002090601f016020900481019282156200175f5791602002820160005b838211156200172e57835183826101000a81548160ff021916908360038111156200170c576200170b62001a5a565b5b02179055509260200192600101602081600001049283019260010302620016dc565b80156200175d5782816101000a81549060ff02191690556001016020816000010492830192600103026200172e565b505b5090506200176e919062001803565b5090565b8280546200178090620019ee565b90600052602060002090601f016020900481019282620017a45760008555620017f0565b82601f10620017bf57805160ff1916838001178555620017f0565b82800160010185558215620017f0579182015b82811115620017ef578251825591602001919060010190620017d2565b5b509050620017ff919062001803565b5090565b5b808211156200181e57600081600090555060010162001804565b5090565b600062001839620018338462001982565b62001959565b90508281526020810184848401111562001858576200185762001aec565b5b62001865848285620019b8565b509392505050565b600082601f83011262001885576200188462001ae7565b5b81516200189784826020860162001822565b91505092915050565b600080600060608486031215620018bc57620018bb62001af6565b5b600084015167ffffffffffffffff811115620018dd57620018dc62001af1565b5b620018eb868287016200186d565b935050602084015167ffffffffffffffff8111156200190f576200190e62001af1565b5b6200191d868287016200186d565b925050604084015167ffffffffffffffff81111562001941576200194062001af1565b5b6200194f868287016200186d565b9150509250925092565b60006200196562001978565b905062001973828262001a24565b919050565b6000604051905090565b600067ffffffffffffffff821115620019a0576200199f62001ab8565b5b620019ab8262001afb565b9050602081019050919050565b60005b83811015620019d8578082015181840152602081019050620019bb565b83811115620019e8576000848401525b50505050565b6000600282049050600182168062001a0757607f821691505b6020821081141562001a1e5762001a1d62001a89565b5b50919050565b62001a2f8262001afb565b810181811067ffffffffffffffff8211171562001a515762001a5062001ab8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b614e868062001b1c6000396000f3fe6080604052600436106102255760003560e01c80636a62784211610123578063a22cb465116100ab578063d547741f1161006f578063d547741f14610834578063e1fb6f7c1461085d578063e63ab1e91461089a578063e6c3b1f6146108c5578063e985e9c51461090257610225565b8063a22cb4651461073d578063b874ff4314610766578063b88d4fde14610791578063c87b56dd146107ba578063ca15c873146107f757610225565b80639010d07c116100f25780639010d07c1461064257806391d148541461067f57806395d89b41146106bc57806399f19cea146106e7578063a217fddf1461071257610225565b80636a627842146105a757806370a08231146105c35780638456cb59146106005780638d859f3e1461061757610225565b80632f745c59116101b157806342966c681161017557806342966c68146104ae5780634f6ccce7146104d75780635c975abb146105145780636352211e1461053f578063639e576d1461057c57610225565b80632f745c59146103dd5780632f99c6cc1461041a57806336568abe146104455780633f4ba83a1461046e57806342842e0e1461048557610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806318160ddd1461032357806323b872dd1461034e578063248a9ca3146103775780632f2ff15d146103b457610225565b806301ffc9a71461022a578063031bd4c41461026757806306fdde0314610292578063081812fc146102bd575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c919061364b565b61093f565b60405161025e9190613c8f565b60405180910390f35b34801561027357600080fd5b5061027c610951565b60405161028991906140c2565b60405180910390f35b34801561029e57600080fd5b506102a7610956565b6040516102b49190613ce0565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df91906136a5565b6109e8565b6040516102f19190613c0d565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c919061355e565b610a6d565b005b34801561032f57600080fd5b50610338610b85565b60405161034591906140c2565b60405180910390f35b34801561035a57600080fd5b5061037560048036038101906103709190613448565b610b92565b005b34801561038357600080fd5b5061039e6004803603810190610399919061359e565b610bf2565b6040516103ab9190613caa565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d691906135cb565b610c11565b005b3480156103e957600080fd5b5061040460048036038101906103ff919061355e565b610c45565b60405161041191906140c2565b60405180910390f35b34801561042657600080fd5b5061042f610cea565b60405161043c9190613c28565b60405180910390f35b34801561045157600080fd5b5061046c600480360381019061046791906135cb565b610d02565b005b34801561047a57600080fd5b50610483610d36565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613448565b610db0565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906136a5565b610dd0565b005b3480156104e357600080fd5b506104fe60048036038101906104f991906136a5565b610e2c565b60405161050b91906140c2565b60405180910390f35b34801561052057600080fd5b50610529610e9d565b6040516105369190613c8f565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906136a5565b610eb4565b6040516105739190613c0d565b60405180910390f35b34801561058857600080fd5b50610591610f66565b60405161059e91906140c2565b60405180910390f35b6105c160048036038101906105bc91906133db565b610f6b565b005b3480156105cf57600080fd5b506105ea60048036038101906105e591906133db565b61121b565b6040516105f791906140c2565b60405180910390f35b34801561060c57600080fd5b506106156112d3565b005b34801561062357600080fd5b5061062c61134d565b60405161063991906140c2565b60405180910390f35b34801561064e57600080fd5b506106696004803603810190610664919061360b565b61135a565b6040516106769190613c0d565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a191906135cb565b611389565b6040516106b39190613c8f565b60405180910390f35b3480156106c857600080fd5b506106d16113f3565b6040516106de9190613ce0565b60405180910390f35b3480156106f357600080fd5b506106fc611485565b6040516107099190613c8f565b60405180910390f35b34801561071e57600080fd5b50610727611499565b6040516107349190613caa565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f919061351e565b6114a0565b005b34801561077257600080fd5b5061077b611621565b60405161078891906140c2565b60405180910390f35b34801561079d57600080fd5b506107b860048036038101906107b3919061349b565b611626565b005b3480156107c657600080fd5b506107e160048036038101906107dc91906136a5565b611688565b6040516107ee9190613ce0565b60405180910390f35b34801561080357600080fd5b5061081e6004803603810190610819919061359e565b61172f565b60405161082b91906140c2565b60405180910390f35b34801561084057600080fd5b5061085b600480360381019061085691906135cb565b611753565b005b34801561086957600080fd5b50610884600480360381019061087f91906133db565b611787565b6040516108919190613c8f565b60405180910390f35b3480156108a657600080fd5b506108af6117e3565b6040516108bc9190613caa565b60405180910390f35b3480156108d157600080fd5b506108ec60048036038101906108e791906136a5565b611807565b6040516108f99190613cc5565b60405180910390f35b34801561090e57600080fd5b5061092960048036038101906109249190613408565b611893565b6040516109369190613c8f565b60405180910390f35b600061094a82611965565b9050919050565b606481565b6060600380546109659061436c565b80601f01602080910402602001604051908101604052809291908181526020018280546109919061436c565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109f3826119df565b610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990613f42565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7882610eb4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613fc2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b08611a4b565b73ffffffffffffffffffffffffffffffffffffffff161480610b375750610b3681610b31611a4b565b611893565b5b610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90613ec2565b60405180910390fd5b610b808383611a53565b505050565b6000600b80549050905090565b610ba3610b9d611a4b565b82611b0c565b610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990613fe2565b60405180910390fd5b610bed838383611bea565b505050565b6000806000838152602001908152602001600020600101549050919050565b610c1b8282611e46565b610c40816001600085815260200190815260200160002061193590919063ffffffff16565b505050565b6000610c508361121b565b8210610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890613da2565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b7333510ba8618f8a34b7119ae19fc37a423bb9529181565b610d0c8282611eac565b610d318160016000858152602001908152602001600020611f2f90919063ffffffff16565b505050565b610d677f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d62611a4b565b611389565b610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90614022565b60405180910390fd5b610dae611f5f565b565b610dcb83838360405180602001604052806000815250611626565b505050565b610de1610ddb611a4b565b82611b0c565b610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790614062565b60405180910390fd5b610e2981612001565b50565b6000610e36610b85565b8210610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90614002565b60405180910390fd5b600b8281548110610e8b57610e8a614534565b5b90600052602060002001549050919050565b6000600d60009054906101000a900460ff16905090565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490613f02565b60405180910390fd5b80915050919050565b600581565b600280541415610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790614042565b60405180910390fd5b600280819055506064610fc3600e612112565b10611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa906140a2565b60405180910390fd5b6005601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16108061107157506110706000801b61106b611a4b565b611389565b5b6110b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a790613f62565b60405180910390fd5b600060056110be600e612112565b106110dd57686c6b935b8bbd4000009050803410156110dc57600080fd5b5b6000341115611142577333510ba8618f8a34b7119ae19fc37a423bb9529173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611140573d6000803e3d6000fd5b505b61115582611150600e612112565b612120565b61115f600e6122ee565b6001601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111b891906141cc565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555050600160028190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390613ee2565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113047f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6112ff611a4b565b611389565b611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90613de2565b60405180910390fd5b61134b612304565b565b686c6b935b8bbd40000081565b600061138182600160008681526020019081526020016000206123a790919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546114029061436c565b80601f016020809104026020016040519081016040528092919081815260200182805461142e9061436c565b801561147b5780601f106114505761010080835404028352916020019161147b565b820191906000526020600020905b81548152906001019060200180831161145e57829003601f168201915b5050505050905090565b60006064611493600e612112565b10905090565b6000801b81565b6114a8611a4b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d90613e42565b60405180910390fd5b8060086000611523611a4b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115d0611a4b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116159190613c8f565b60405180910390a35050565b600581565b611637611631611a4b565b83611b0c565b611676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166d90613fe2565b60405180910390fd5b611682848484846123c1565b50505050565b6060611693826119df565b6116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c990613fa2565b60405180910390fd5b60006116dc61241d565b905060008151116116fc5760405180602001604052806000815250611727565b80611706846124af565b604051602001611717929190613be9565b6040516020818303038152906040525b915050919050565b600061174c60016000848152602001908152602001600020612610565b9050919050565b61175d8282612625565b6117828160016000858152602001908152602001600020611f2f90919063ffffffff16565b505050565b60006005601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16109050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60008082101580156118195750606482105b611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90613d82565b60405180910390fd5b600f828154811061186c5761186b614534565b5b90600052602060002090602091828204019190069054906101000a900460ff169050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611931828261268b565b5050565b600061195d836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61276b565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119d857506119d7826127db565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ac683610eb4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b17826119df565b611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d90613e62565b60405180910390fd5b6000611b6183610eb4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bd057508373ffffffffffffffffffffffffffffffffffffffff16611bb8846109e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80611be15750611be08185611893565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c0a82610eb4565b73ffffffffffffffffffffffffffffffffffffffff1614611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790613f82565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613e22565b60405180910390fd5b611cdb8383836128bd565b611ce6600082611a53565b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d369190614234565b925050819055506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d8d9190614176565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e5f611e5283610bf2565b611e5a611a4b565b611389565b611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9590613d42565b60405180910390fd5b611ea8828261268b565b5050565b611eb4611a4b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890614082565b60405180910390fd5b611f2b82826128cd565b5050565b6000611f57836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6129ae565b905092915050565b611f67610e9d565b611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90613d62565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fea611a4b565b604051611ff79190613c0d565b60405180910390a1565b600061200c82610eb4565b905061201a816000846128bd565b612025600083611a53565b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120759190614234565b925050819055506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790613f22565b60405180910390fd5b612199816119df565b156121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090613e02565b60405180910390fd5b6121e5600083836128bd565b6001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122359190614176565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001816000016000828254019250508190555050565b61230c610e9d565b1561234c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234390613ea2565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612390611a4b565b60405161239d9190613c0d565b60405180910390a1565b60006123b68360000183612ac6565b60001c905092915050565b6123cc848484611bea565b6123d884848484612b3a565b612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90613dc2565b60405180910390fd5b50505050565b60606011805461242c9061436c565b80601f01602080910402602001604051908101604052809291908181526020018280546124589061436c565b80156124a55780601f1061247a576101008083540402835291602001916124a5565b820191906000526020600020905b81548152906001019060200180831161248857829003601f168201915b5050505050905090565b606060008214156124f7576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061260b565b600082905060005b60008214612529578080612512906143cf565b915050600a826125229190614203565b91506124ff565b60008167ffffffffffffffff81111561254557612544614563565b5b6040519080825280601f01601f1916602001820160405280156125775781602001600182028036833780820191505090505b5090505b60008514612604576001826125909190614234565b9150600a8561259f9190614418565b60306125ab9190614176565b60f81b8183815181106125c1576125c0614534565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125fd9190614203565b945061257b565b8093505050505b919050565b600061261e82600001612cd1565b9050919050565b61263e61263183610bf2565b612639611a4b565b611389565b61267d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267490613e82565b60405180910390fd5b61268782826128cd565b5050565b6126958282611389565b61276757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061270c611a4b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006127778383612ce2565b6127d05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506127d5565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128a657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128b657506128b582612d05565b5b9050919050565b6128c8838383612d7f565b505050565b6128d78282611389565b156129aa57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061294f611a4b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612aba5760006001826129e09190614234565b90506000600186600001805490506129f89190614234565b90506000866000018281548110612a1257612a11614534565b5b9060005260206000200154905080876000018481548110612a3657612a35614534565b5b9060005260206000200181905550600183612a519190614176565b8760010160008381526020019081526020016000208190555086600001805480612a7e57612a7d614505565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612ac0565b60009150505b92915050565b600081836000018054905011612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890613d02565b60405180910390fd5b826000018281548110612b2757612b26614534565b5b9060005260206000200154905092915050565b6000612b5b8473ffffffffffffffffffffffffffffffffffffffff16612dd7565b15612cc4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b84611a4b565b8786866040518563ffffffff1660e01b8152600401612ba69493929190613c43565b602060405180830381600087803b158015612bc057600080fd5b505af1925050508015612bf157506040513d601f19601f82011682018060405250810190612bee9190613678565b60015b612c74573d8060008114612c21576040519150601f19603f3d011682016040523d82523d6000602084013e612c26565b606091505b50600081511415612c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6390613dc2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cc9565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d785750612d7782612dea565b5b9050919050565b612d8a838383612e64565b612d92610e9d565b15612dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc990613d22565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e5d5750612e5c82612f78565b5b9050919050565b612e6f838383612fe2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612eb257612ead81612fe7565b612ef1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ef057612eef8382613030565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3457612f2f8161319d565b612f73565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f7257612f71828261326e565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161303d8461121b565b6130479190614234565b90506000600a600084815260200190815260200160002054905081811461312c576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b805490506131b19190614234565b90506000600c60008481526020019081526020016000205490506000600b83815481106131e1576131e0614534565b5b9060005260206000200154905080600b838154811061320357613202614534565b5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b80548061325257613251614505565b5b6001900381819060005260206000200160009055905550505050565b60006132798361121b565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600a600084815260200190815260200160002081905550505050565b60006133006132fb84614102565b6140dd565b90508281526020810184848401111561331c5761331b614597565b5b61332784828561432a565b509392505050565b60008135905061333e81614ddd565b92915050565b60008135905061335381614df4565b92915050565b60008135905061336881614e0b565b92915050565b60008135905061337d81614e22565b92915050565b60008151905061339281614e22565b92915050565b600082601f8301126133ad576133ac614592565b5b81356133bd8482602086016132ed565b91505092915050565b6000813590506133d581614e39565b92915050565b6000602082840312156133f1576133f06145a1565b5b60006133ff8482850161332f565b91505092915050565b6000806040838503121561341f5761341e6145a1565b5b600061342d8582860161332f565b925050602061343e8582860161332f565b9150509250929050565b600080600060608486031215613461576134606145a1565b5b600061346f8682870161332f565b93505060206134808682870161332f565b9250506040613491868287016133c6565b9150509250925092565b600080600080608085870312156134b5576134b46145a1565b5b60006134c38782880161332f565b94505060206134d48782880161332f565b93505060406134e5878288016133c6565b925050606085013567ffffffffffffffff8111156135065761350561459c565b5b61351287828801613398565b91505092959194509250565b60008060408385031215613535576135346145a1565b5b60006135438582860161332f565b925050602061355485828601613344565b9150509250929050565b60008060408385031215613575576135746145a1565b5b60006135838582860161332f565b9250506020613594858286016133c6565b9150509250929050565b6000602082840312156135b4576135b36145a1565b5b60006135c284828501613359565b91505092915050565b600080604083850312156135e2576135e16145a1565b5b60006135f085828601613359565b92505060206136018582860161332f565b9150509250929050565b60008060408385031215613622576136216145a1565b5b600061363085828601613359565b9250506020613641858286016133c6565b9150509250929050565b600060208284031215613661576136606145a1565b5b600061366f8482850161336e565b91505092915050565b60006020828403121561368e5761368d6145a1565b5b600061369c84828501613383565b91505092915050565b6000602082840312156136bb576136ba6145a1565b5b60006136c9848285016133c6565b91505092915050565b6136db8161427a565b82525050565b6136ea81614268565b82525050565b6136f98161428c565b82525050565b61370881614298565b82525050565b600061371982614133565b6137238185614149565b9350613733818560208601614339565b61373c816145a6565b840191505092915050565b61375081614318565b82525050565b60006137618261413e565b61376b818561415a565b935061377b818560208601614339565b613784816145a6565b840191505092915050565b600061379a8261413e565b6137a4818561416b565b93506137b4818560208601614339565b80840191505092915050565b60006137cd60228361415a565b91506137d8826145b7565b604082019050919050565b60006137f0602b8361415a565b91506137fb82614606565b604082019050919050565b6000613813602f8361415a565b915061381e82614655565b604082019050919050565b600061383660148361415a565b9150613841826146a4565b602082019050919050565b6000613859601f8361415a565b9150613864826146cd565b602082019050919050565b600061387c602b8361415a565b9150613887826146f6565b604082019050919050565b600061389f60328361415a565b91506138aa82614745565b604082019050919050565b60006138c260288361415a565b91506138cd82614794565b604082019050919050565b60006138e5601c8361415a565b91506138f0826147e3565b602082019050919050565b600061390860248361415a565b91506139138261480c565b604082019050919050565b600061392b60198361415a565b91506139368261485b565b602082019050919050565b600061394e602c8361415a565b915061395982614884565b604082019050919050565b600061397160308361415a565b915061397c826148d3565b604082019050919050565b600061399460108361415a565b915061399f82614922565b602082019050919050565b60006139b760388361415a565b91506139c28261494b565b604082019050919050565b60006139da602a8361415a565b91506139e58261499a565b604082019050919050565b60006139fd60298361415a565b9150613a08826149e9565b604082019050919050565b6000613a2060208361415a565b9150613a2b82614a38565b602082019050919050565b6000613a43602c8361415a565b9150613a4e82614a61565b604082019050919050565b6000613a6660298361415a565b9150613a7182614ab0565b604082019050919050565b6000613a8960298361415a565b9150613a9482614aff565b604082019050919050565b6000613aac602f8361415a565b9150613ab782614b4e565b604082019050919050565b6000613acf60218361415a565b9150613ada82614b9d565b604082019050919050565b6000613af260318361415a565b9150613afd82614bec565b604082019050919050565b6000613b15602c8361415a565b9150613b2082614c3b565b604082019050919050565b6000613b38602a8361415a565b9150613b4382614c8a565b604082019050919050565b6000613b5b601f8361415a565b9150613b6682614cd9565b602082019050919050565b6000613b7e60308361415a565b9150613b8982614d02565b604082019050919050565b6000613ba1602f8361415a565b9150613bac82614d51565b604082019050919050565b6000613bc4601d8361415a565b9150613bcf82614da0565b602082019050919050565b613be381614301565b82525050565b6000613bf5828561378f565b9150613c01828461378f565b91508190509392505050565b6000602082019050613c2260008301846136e1565b92915050565b6000602082019050613c3d60008301846136d2565b92915050565b6000608082019050613c5860008301876136e1565b613c6560208301866136e1565b613c726040830185613bda565b8181036060830152613c84818461370e565b905095945050505050565b6000602082019050613ca460008301846136f0565b92915050565b6000602082019050613cbf60008301846136ff565b92915050565b6000602082019050613cda6000830184613747565b92915050565b60006020820190508181036000830152613cfa8184613756565b905092915050565b60006020820190508181036000830152613d1b816137c0565b9050919050565b60006020820190508181036000830152613d3b816137e3565b9050919050565b60006020820190508181036000830152613d5b81613806565b9050919050565b60006020820190508181036000830152613d7b81613829565b9050919050565b60006020820190508181036000830152613d9b8161384c565b9050919050565b60006020820190508181036000830152613dbb8161386f565b9050919050565b60006020820190508181036000830152613ddb81613892565b9050919050565b60006020820190508181036000830152613dfb816138b5565b9050919050565b60006020820190508181036000830152613e1b816138d8565b9050919050565b60006020820190508181036000830152613e3b816138fb565b9050919050565b60006020820190508181036000830152613e5b8161391e565b9050919050565b60006020820190508181036000830152613e7b81613941565b9050919050565b60006020820190508181036000830152613e9b81613964565b9050919050565b60006020820190508181036000830152613ebb81613987565b9050919050565b60006020820190508181036000830152613edb816139aa565b9050919050565b60006020820190508181036000830152613efb816139cd565b9050919050565b60006020820190508181036000830152613f1b816139f0565b9050919050565b60006020820190508181036000830152613f3b81613a13565b9050919050565b60006020820190508181036000830152613f5b81613a36565b9050919050565b60006020820190508181036000830152613f7b81613a59565b9050919050565b60006020820190508181036000830152613f9b81613a7c565b9050919050565b60006020820190508181036000830152613fbb81613a9f565b9050919050565b60006020820190508181036000830152613fdb81613ac2565b9050919050565b60006020820190508181036000830152613ffb81613ae5565b9050919050565b6000602082019050818103600083015261401b81613b08565b9050919050565b6000602082019050818103600083015261403b81613b2b565b9050919050565b6000602082019050818103600083015261405b81613b4e565b9050919050565b6000602082019050818103600083015261407b81613b71565b9050919050565b6000602082019050818103600083015261409b81613b94565b9050919050565b600060208201905081810360008301526140bb81613bb7565b9050919050565b60006020820190506140d76000830184613bda565b92915050565b60006140e76140f8565b90506140f3828261439e565b919050565b6000604051905090565b600067ffffffffffffffff82111561411d5761411c614563565b5b614126826145a6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061418182614301565b915061418c83614301565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141c1576141c0614449565b5b828201905092915050565b60006141d78261430b565b91506141e28361430b565b92508260ff038211156141f8576141f7614449565b5b828201905092915050565b600061420e82614301565b915061421983614301565b92508261422957614228614478565b5b828204905092915050565b600061423f82614301565b915061424a83614301565b92508282101561425d5761425c614449565b5b828203905092915050565b6000614273826142e1565b9050919050565b6000614285826142e1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506142dc82614dc9565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614323826142ce565b9050919050565b82818337600083830152505050565b60005b8381101561435757808201518184015260208101905061433c565b83811115614366576000848401525b50505050565b6000600282049050600182168061438457607f821691505b60208210811415614398576143976144d6565b5b50919050565b6143a7826145a6565b810181811067ffffffffffffffff821117156143c6576143c5614563565b5b80604052505050565b60006143da82614301565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561440d5761440c614449565b5b600182019050919050565b600061442382614301565b915061442e83614301565b92508261443e5761443d614478565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4d6f6f73654e46543a20746f6b656e20646f6573206e6f742065786973742100600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d6f6f73654e46543a206d75737420686176652070617573657220726f6c652060008201527f746f207061757365000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d6f6f73654e46543a206d696e74206c696d697420706572206164647265737360008201527f2072656163686564210000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d6f6f73654e46543a206d75737420686176652070617573657220726f6c652060008201527f746f20756e706175736500000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f4d6f6f73654e46543a206d696e74206c696d6974207265616368656421000000600082015250565b60048110614dda57614dd96144a7565b5b50565b614de681614268565b8114614df157600080fd5b50565b614dfd8161428c565b8114614e0857600080fd5b50565b614e1481614298565b8114614e1f57600080fd5b50565b614e2b816142a2565b8114614e3657600080fd5b50565b614e4281614301565b8114614e4d57600080fd5b5056fea2646970667358221220869b888d1dce24950f8e14513baf61a1f0ad35b60fd97cc5de29ddb4dcb5010064736f6c63430008050033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000084d6f6f736520563100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d4f4f5345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6e66742e656c6b2e66696e616e63652f66746d2f636f6c6c656374696f6e312f746f6b656e732f0000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000084d6f6f736520563100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d4f4f5345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f6e66742e656c6b2e66696e616e63652f66746d2f636f6c6c656374696f6e312f746f6b656e732f0000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Moose V1
Arg [1] : symbol (string): MOOSE
Arg [2] : baseTokenURI (string): https://nft.elk.finance/ftm/collection1/tokens/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 4d6f6f7365205631000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 4d4f4f5345000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [8] : 68747470733a2f2f6e66742e656c6b2e66696e616e63652f66746d2f636f6c6c
Arg [9] : 656374696f6e312f746f6b656e732f0000000000000000000000000000000000


Deployed ByteCode Sourcemap

69561:6660:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76014:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69736:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22605:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24072:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23602:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35078:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24962:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48639:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63870:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34746:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70059:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64393:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75566:163;;;;;;;;;;;;;:::i;:::-;;25338:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41013:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35268:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42344:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22299:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69813:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74109:862;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22029:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75190:157;;;;;;;;;;;;;:::i;:::-;;69943:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63325:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48311:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22774:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73059:125;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46767:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24365:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69888:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25560:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22949:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63644:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64128:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73283:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70174:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73510:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24731:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76014:204;76150:4;76174:36;76198:11;76174:23;:36::i;:::-;76167:43;;76014:204;;;:::o;69736:38::-;69771:3;69736:38;:::o;22605:100::-;22659:13;22692:5;22685:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22605:100;:::o;24072:221::-;24148:7;24176:16;24184:7;24176;:16::i;:::-;24168:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24261:15;:24;24277:7;24261:24;;;;;;;;;;;;;;;;;;;;;24254:31;;24072:221;;;:::o;23602:404::-;23683:13;23699:23;23714:7;23699:14;:23::i;:::-;23683:39;;23747:5;23741:11;;:2;:11;;;;23733:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23827:5;23811:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;23836:44;23860:5;23867:12;:10;:12::i;:::-;23836:23;:44::i;:::-;23811:69;23803:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;23977:21;23986:2;23990:7;23977:8;:21::i;:::-;23672:334;23602:404;;:::o;35078:113::-;35139:7;35166:10;:17;;;;35159:24;;35078:113;:::o;24962:305::-;25123:41;25142:12;:10;:12::i;:::-;25156:7;25123:18;:41::i;:::-;25115:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25231:28;25241:4;25247:2;25251:7;25231:9;:28::i;:::-;24962:305;;;:::o;48639:123::-;48705:7;48732:6;:12;48739:4;48732:12;;;;;;;;;;;:22;;;48725:29;;48639:123;;;:::o;63870:165::-;63955:30;63971:4;63977:7;63955:15;:30::i;:::-;63996:31;64019:7;63996:12;:18;64009:4;63996:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;63870:165;;:::o;34746:256::-;34843:7;34879:23;34896:5;34879:16;:23::i;:::-;34871:5;:31;34863:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34968:12;:19;34981:5;34968:19;;;;;;;;;;;;;;;:26;34988:5;34968:26;;;;;;;;;;;;34961:33;;34746:256;;;;:::o;70059:106::-;70121:42;70059:106;:::o;64393:174::-;64481:33;64500:4;64506:7;64481:18;:33::i;:::-;64525:34;64551:7;64525:12;:18;64538:4;64525:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;64393:174;;:::o;75566:163::-;75619:34;70212:24;75640:12;:10;:12::i;:::-;75619:7;:34::i;:::-;75611:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;75711:10;:8;:10::i;:::-;75566:163::o;25338:151::-;25442:39;25459:4;25465:2;25469:7;25442:39;;;;;;;;;;;;:16;:39::i;:::-;25338:151;;;:::o;41013:245::-;41131:41;41150:12;:10;:12::i;:::-;41164:7;41131:18;:41::i;:::-;41123:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;41236:14;41242:7;41236:5;:14::i;:::-;41013:245;:::o;35268:233::-;35343:7;35379:30;:28;:30::i;:::-;35371:5;:38;35363:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35476:10;35487:5;35476:17;;;;;;;;:::i;:::-;;;;;;;;;;35469:24;;35268:233;;;:::o;42344:86::-;42391:4;42415:7;;;;;;;;;;;42408:14;;42344:86;:::o;22299:239::-;22371:7;22391:13;22407:7;:16;22415:7;22407:16;;;;;;;;;;;;;;;;;;;;;22391:32;;22459:1;22442:19;;:5;:19;;;;22434:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22525:5;22518:12;;;22299:239;;;:::o;69813:36::-;69848:1;69813:36;:::o;74109:862::-;67911:1;68508:7;;:19;;68500:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;67911:1;68641:7;:18;;;;69771:3:::1;74192:25;:15;:23;:25::i;:::-;:39;74184:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;69933:1;74284:11;:15;74296:2;74284:15;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;:84;;;;74327:41;46812:4;74335:18:::0;::::1;74355:12;:10;:12::i;:::-;74327:7;:41::i;:::-;74284:84;74276:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;74427:10;69848:1;74456:25;:15;:23;:25::i;:::-;:40;74452:128;;69972:22;74513:13;;74562:5;74549:9;:18;;74541:27;;;::::0;::::1;;74452:128;74616:1;74604:9;:13;74600:77;;;70121:42;74634:20;;:31;74655:9;74634:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74600:77;74841:36;74847:2;74851:25;:15;:23;:25::i;:::-;74841:5;:36::i;:::-;74888:27;:15;:25;:27::i;:::-;74962:1;74944:11;:15;74956:2;74944:15;;;;;;;;;;;;;;;;;;;;;;;;;:19;;;;:::i;:::-;74926:11;:15;74938:2;74926:15;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;74173:798;67867:1:::0;68820:7;:22;;;;74109:862;:::o;22029:208::-;22101:7;22146:1;22129:19;;:5;:19;;;;22121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22213:9;:16;22223:5;22213:16;;;;;;;;;;;;;;;;22206:23;;22029:208;;;:::o;75190:157::-;75241:34;70212:24;75262:12;:10;:12::i;:::-;75241:7;:34::i;:::-;75233:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;75331:8;:6;:8::i;:::-;75190:157::o;69943:51::-;69972:22;69943:51;:::o;63325:145::-;63407:7;63434:28;63456:5;63434:12;:18;63447:4;63434:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;63427:35;;63325:145;;;;:::o;48311:139::-;48389:4;48413:6;:12;48420:4;48413:12;;;;;;;;;;;:20;;:29;48434:7;48413:29;;;;;;;;;;;;;;;;;;;;;;;;;48406:36;;48311:139;;;;:::o;22774:104::-;22830:13;22863:7;22856:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22774:104;:::o;73059:125::-;73113:4;69771:3;73137:25;:15;:23;:25::i;:::-;:39;73130:46;;73059:125;:::o;46767:49::-;46812:4;46767:49;;;:::o;24365:295::-;24480:12;:10;:12::i;:::-;24468:24;;:8;:24;;;;24460:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24580:8;24535:18;:32;24554:12;:10;:12::i;:::-;24535:32;;;;;;;;;;;;;;;:42;24568:8;24535:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24633:8;24604:48;;24619:12;:10;:12::i;:::-;24604:48;;;24643:8;24604:48;;;;;;:::i;:::-;;;;;;;;24365:295;;:::o;69888:46::-;69933:1;69888:46;:::o;25560:285::-;25692:41;25711:12;:10;:12::i;:::-;25725:7;25692:18;:41::i;:::-;25684:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25798:39;25812:4;25818:2;25822:7;25831:5;25798:13;:39::i;:::-;25560:285;;;;:::o;22949:360::-;23022:13;23056:16;23064:7;23056;:16::i;:::-;23048:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23137:21;23161:10;:8;:10::i;:::-;23137:34;;23213:1;23195:7;23189:21;:25;:112;;;;;;;;;;;;;;;;;23254:7;23263:18;:7;:16;:18::i;:::-;23237:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23189:112;23182:119;;;22949:360;;;:::o;63644:134::-;63716:7;63743:27;:12;:18;63756:4;63743:18;;;;;;;;;;;:25;:27::i;:::-;63736:34;;63644:134;;;:::o;64128:170::-;64214:31;64231:4;64237:7;64214:16;:31::i;:::-;64256:34;64282:7;64256:12;:18;64269:4;64256:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;64128:170;;:::o;73283:142::-;73354:4;69933:1;73378:11;:15;73390:2;73378:15;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;73371:46;;73283:142;;;:::o;70174:62::-;70212:24;70174:62;:::o;73510:211::-;73572:9;73613:1;73602:7;:12;;:37;;;;;69771:3;73618:7;:21;73602:37;73594:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;73693:11;73705:7;73693:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;73686:27;;73510:211;;;:::o;24731:164::-;24828:4;24852:18;:25;24871:5;24852:25;;;;;;;;;;;;;;;:35;24878:8;24852:35;;;;;;;;;;;;;;;;;;;;;;;;;24845:42;;24731:164;;;;:::o;51044:112::-;51123:25;51134:4;51140:7;51123:10;:25::i;:::-;51044:112;;:::o;58629:152::-;58699:4;58723:50;58728:3;:10;;58764:5;58748:23;;58740:32;;58723:4;:50::i;:::-;58716:57;;58629:152;;;;:::o;34425:237::-;34527:4;34566:35;34551:50;;;:11;:50;;;;:103;;;;34618:36;34642:11;34618:23;:36::i;:::-;34551:103;34544:110;;34425:237;;;:::o;27312:127::-;27377:4;27429:1;27401:30;;:7;:16;27409:7;27401:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27394:37;;27312:127;;;:::o;16945:98::-;16998:7;17025:10;17018:17;;16945:98;:::o;31196:174::-;31298:2;31271:15;:24;31287:7;31271:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31354:7;31350:2;31316:46;;31325:23;31340:7;31325:14;:23::i;:::-;31316:46;;;;;;;;;;;;31196:174;;:::o;27606:355::-;27699:4;27724:16;27732:7;27724;:16::i;:::-;27716:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27800:13;27816:23;27831:7;27816:14;:23::i;:::-;27800:39;;27869:5;27858:16;;:7;:16;;;:51;;;;27902:7;27878:31;;:20;27890:7;27878:11;:20::i;:::-;:31;;;27858:51;:94;;;;27913:39;27937:5;27944:7;27913:23;:39::i;:::-;27858:94;27850:103;;;27606:355;;;;:::o;30534:544::-;30659:4;30632:31;;:23;30647:7;30632:14;:23::i;:::-;:31;;;30624:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30742:1;30728:16;;:2;:16;;;;30720:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30798:39;30819:4;30825:2;30829:7;30798:20;:39::i;:::-;30902:29;30919:1;30923:7;30902:8;:29::i;:::-;30963:1;30944:9;:15;30954:4;30944:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30992:1;30975:9;:13;30985:2;30975:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31023:2;31004:7;:16;31012:7;31004:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31062:7;31058:2;31043:27;;31052:4;31043:27;;;;;;;;;;;;30534:544;;;:::o;49024:232::-;49117:41;49125:18;49138:4;49125:12;:18::i;:::-;49145:12;:10;:12::i;:::-;49117:7;:41::i;:::-;49109:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;49223:25;49234:4;49240:7;49223:10;:25::i;:::-;49024:232;;:::o;50243:218::-;50350:12;:10;:12::i;:::-;50339:23;;:7;:23;;;50331:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50427:26;50439:4;50445:7;50427:11;:26::i;:::-;50243:218;;:::o;58957:158::-;59030:4;59054:53;59062:3;:10;;59098:5;59082:23;;59074:32;;59054:7;:53::i;:::-;59047:60;;58957:158;;;;:::o;43403:120::-;42947:8;:6;:8::i;:::-;42939:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;43472:5:::1;43462:7;;:15;;;;;;;;;;;;;;;;;;43493:22;43502:12;:10;:12::i;:::-;43493:22;;;;;;:::i;:::-;;;;;;;;43403:120::o:0;29837:360::-;29897:13;29913:23;29928:7;29913:14;:23::i;:::-;29897:39;;29949:48;29970:5;29985:1;29989:7;29949:20;:48::i;:::-;30038:29;30055:1;30059:7;30038:8;:29::i;:::-;30100:1;30080:9;:16;30090:5;30080:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30119:7;:16;30127:7;30119:16;;;;;;;;;;;;30112:23;;;;;;;;;;;30181:7;30177:1;30153:36;;30162:5;30153:36;;;;;;;;;;;;29886:311;29837:360;:::o;65659:114::-;65724:7;65751;:14;;;65744:21;;65659:114;;;:::o;29226:382::-;29320:1;29306:16;;:2;:16;;;;29298:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29379:16;29387:7;29379;:16::i;:::-;29378:17;29370:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29441:45;29470:1;29474:2;29478:7;29441:20;:45::i;:::-;29516:1;29499:9;:13;29509:2;29499:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29547:2;29528:7;:16;29536:7;29528:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29592:7;29588:2;29567:33;;29584:1;29567:33;;;;;;;;;;;;29226:382;;:::o;65781:127::-;65888:1;65870:7;:14;;;:19;;;;;;;;;;;65781:127;:::o;43144:118::-;42670:8;:6;:8::i;:::-;42669:9;42661:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43214:4:::1;43204:7;;:14;;;;;;;;;;;;;;;;;;43234:20;43241:12;:10;:12::i;:::-;43234:20;;;;;;:::i;:::-;;;;;;;;43144:118::o:0;59915:158::-;59989:7;60040:22;60044:3;:10;;60056:5;60040:3;:22::i;:::-;60032:31;;60009:56;;59915:158;;;;:::o;26727:272::-;26841:28;26851:4;26857:2;26861:7;26841:9;:28::i;:::-;26888:48;26911:4;26917:2;26921:7;26930:5;26888:22;:48::i;:::-;26880:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26727:272;;;;:::o;72863:114::-;72923:13;72956;72949:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72863:114;:::o;17606:723::-;17662:13;17892:1;17883:5;:10;17879:53;;;17910:10;;;;;;;;;;;;;;;;;;;;;17879:53;17942:12;17957:5;17942:20;;17973:14;17998:78;18013:1;18005:4;:9;17998:78;;18031:8;;;;;:::i;:::-;;;;18062:2;18054:10;;;;;:::i;:::-;;;17998:78;;;18086:19;18118:6;18108:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18086:39;;18136:154;18152:1;18143:5;:10;18136:154;;18180:1;18170:11;;;;;:::i;:::-;;;18247:2;18239:5;:10;;;;:::i;:::-;18226:2;:24;;;;:::i;:::-;18213:39;;18196:6;18203;18196:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18276:2;18267:11;;;;;:::i;:::-;;;18136:154;;;18314:6;18300:21;;;;;17606:723;;;;:::o;59454:117::-;59517:7;59544:19;59552:3;:10;;59544:7;:19::i;:::-;59537:26;;59454:117;;;:::o;49501:235::-;49595:41;49603:18;49616:4;49603:12;:18::i;:::-;49623:12;:10;:12::i;:::-;49595:7;:41::i;:::-;49587:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;49702:26;49714:4;49720:7;49702:11;:26::i;:::-;49501:235;;:::o;51491:229::-;51566:22;51574:4;51580:7;51566;:22::i;:::-;51561:152;;51637:4;51605:6;:12;51612:4;51605:12;;;;;;;;;;;:20;;:29;51626:7;51605:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;51688:12;:10;:12::i;:::-;51661:40;;51679:7;51661:40;;51673:4;51661:40;;;;;;;;;;51561:152;51491:229;;:::o;53693:414::-;53756:4;53778:21;53788:3;53793:5;53778:9;:21::i;:::-;53773:327;;53816:3;:11;;53833:5;53816:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53999:3;:11;;:18;;;;53977:3;:12;;:19;53990:5;53977:19;;;;;;;;;;;:40;;;;54039:4;54032:11;;;;53773:327;54083:5;54076:12;;53693:414;;;;;:::o;21673:292::-;21775:4;21814:25;21799:40;;;:11;:40;;;;:105;;;;21871:33;21856:48;;;:11;:48;;;;21799:105;:158;;;;21921:36;21945:11;21921:23;:36::i;:::-;21799:158;21792:165;;21673:292;;;:::o;75737:205::-;75889:45;75916:4;75922:2;75926:7;75889:26;:45::i;:::-;75737:205;;;:::o;51728:230::-;51803:22;51811:4;51817:7;51803;:22::i;:::-;51799:152;;;51874:5;51842:6;:12;51849:4;51842:12;;;;;;;;;;;:20;;:29;51863:7;51842:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;51926:12;:10;:12::i;:::-;51899:40;;51917:7;51899:40;;51911:4;51899:40;;;;;;;;;;51799:152;51728:230;;:::o;54283:1544::-;54349:4;54467:18;54488:3;:12;;:19;54501:5;54488:19;;;;;;;;;;;;54467:40;;54538:1;54524:10;:15;54520:1300;;54886:21;54923:1;54910:10;:14;;;;:::i;:::-;54886:38;;54939:17;54980:1;54959:3;:11;;:18;;;;:22;;;;:::i;:::-;54939:42;;55226:17;55246:3;:11;;55258:9;55246:22;;;;;;;;:::i;:::-;;;;;;;;;;55226:42;;55392:9;55363:3;:11;;55375:13;55363:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;55511:1;55495:13;:17;;;;:::i;:::-;55469:3;:12;;:23;55482:9;55469:23;;;;;;;;;;;:43;;;;55621:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55716:3;:12;;:19;55729:5;55716:19;;;;;;;;;;;55709:26;;;55759:4;55752:11;;;;;;;;54520:1300;55803:5;55796:12;;;54283:1544;;;;;:::o;56581:204::-;56648:7;56697:5;56676:3;:11;;:18;;;;:26;56668:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56759:3;:11;;56771:5;56759:18;;;;;;;;:::i;:::-;;;;;;;;;;56752:25;;56581:204;;;;:::o;31935:843::-;32056:4;32082:15;:2;:13;;;:15::i;:::-;32078:693;;;32134:2;32118:36;;;32155:12;:10;:12::i;:::-;32169:4;32175:7;32184:5;32118:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32114:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32381:1;32364:6;:13;:18;32360:341;;;32407:60;;;;;;;;;;:::i;:::-;;;;;;;;32360:341;32651:6;32645:13;32636:6;32632:2;32628:15;32621:38;32114:602;32251:45;;;32241:55;;;:6;:55;;;;32234:62;;;;;32078:693;32755:4;32748:11;;31935:843;;;;;;;:::o;56128:109::-;56184:7;56211:3;:11;;:18;;;;56204:25;;56128:109;;;:::o;55913:129::-;55986:4;56033:1;56010:3;:12;;:19;56023:5;56010:19;;;;;;;;;;;;:24;;56003:31;;55913:129;;;;:::o;62499:227::-;62584:4;62623:42;62608:57;;;:11;:57;;;;:110;;;;62682:36;62706:11;62682:23;:36::i;:::-;62608:110;62601:117;;62499:227;;;:::o;44133:241::-;44243:45;44270:4;44276:2;44280:7;44243:26;:45::i;:::-;44310:8;:6;:8::i;:::-;44309:9;44301:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44133:241;;;:::o;9056:422::-;9116:4;9324:12;9435:7;9423:20;9415:28;;9469:1;9462:4;:8;9455:15;;;9056:422;;;:::o;48002:217::-;48087:4;48126:32;48111:47;;;:11;:47;;;;:100;;;;48175:36;48199:11;48175:23;:36::i;:::-;48111:100;48104:107;;48002:217;;;:::o;36114:555::-;36224:45;36251:4;36257:2;36261:7;36224:26;:45::i;:::-;36302:1;36286:18;;:4;:18;;;36282:187;;;36321:40;36353:7;36321:31;:40::i;:::-;36282:187;;;36391:2;36383:10;;:4;:10;;;36379:90;;36410:47;36443:4;36449:7;36410:32;:47::i;:::-;36379:90;36282:187;36497:1;36483:16;;:2;:16;;;36479:183;;;36516:45;36553:7;36516:36;:45::i;:::-;36479:183;;;36589:4;36583:10;;:2;:10;;;36579:83;;36610:40;36638:2;36642:7;36610:27;:40::i;:::-;36579:83;36479:183;36114:555;;;:::o;20165:157::-;20250:4;20289:25;20274:40;;;:11;:40;;;;20267:47;;20165:157;;;:::o;33391:93::-;;;;:::o;37392:164::-;37496:10;:17;;;;37469:15;:24;37485:7;37469:24;;;;;;;;;;;:44;;;;37524:10;37540:7;37524:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37392:164;:::o;38183:988::-;38449:22;38499:1;38474:22;38491:4;38474:16;:22::i;:::-;:26;;;;:::i;:::-;38449:51;;38511:18;38532:17;:26;38550:7;38532:26;;;;;;;;;;;;38511:47;;38679:14;38665:10;:28;38661:328;;38710:19;38732:12;:18;38745:4;38732:18;;;;;;;;;;;;;;;:34;38751:14;38732:34;;;;;;;;;;;;38710:56;;38816:11;38783:12;:18;38796:4;38783:18;;;;;;;;;;;;;;;:30;38802:10;38783:30;;;;;;;;;;;:44;;;;38933:10;38900:17;:30;38918:11;38900:30;;;;;;;;;;;:43;;;;38695:294;38661:328;39085:17;:26;39103:7;39085:26;;;;;;;;;;;39078:33;;;39129:12;:18;39142:4;39129:18;;;;;;;;;;;;;;;:34;39148:14;39129:34;;;;;;;;;;;39122:41;;;38264:907;;38183:988;;:::o;39466:1079::-;39719:22;39764:1;39744:10;:17;;;;:21;;;;:::i;:::-;39719:46;;39776:18;39797:15;:24;39813:7;39797:24;;;;;;;;;;;;39776:45;;40148:19;40170:10;40181:14;40170:26;;;;;;;;:::i;:::-;;;;;;;;;;40148:48;;40234:11;40209:10;40220;40209:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40345:10;40314:15;:28;40330:11;40314:28;;;;;;;;;;;:41;;;;40486:15;:24;40502:7;40486:24;;;;;;;;;;;40479:31;;;40521:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39537:1008;;;39466:1079;:::o;36970:221::-;37055:14;37072:20;37089:2;37072:16;:20::i;:::-;37055:37;;37130:7;37103:12;:16;37116:2;37103:16;;;;;;;;;;;;;;;:24;37120:6;37103:24;;;;;;;;;;;:34;;;;37177:6;37148:17;:26;37166:7;37148:26;;;;;;;;;;;:35;;;;37044:147;36970:221;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;475:87;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;617:84;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;903:86;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;1057:79;;;;:::o;1155:338::-;1210:5;1259:3;1252:4;1244:6;1240:17;1236:27;1226:2;;1267:79;;:::i;:::-;1226:2;1384:6;1371:20;1409:78;1483:3;1475:6;1468:4;1460:6;1456:17;1409:78;:::i;:::-;1400:87;;1216:277;;;;;:::o;1499:139::-;1545:5;1583:6;1570:20;1561:29;;1599:33;1626:5;1599:33;:::i;:::-;1551:87;;;;:::o;1644:329::-;1703:6;1752:2;1740:9;1731:7;1727:23;1723:32;1720:2;;;1758:79;;:::i;:::-;1720:2;1878:1;1903:53;1948:7;1939:6;1928:9;1924:22;1903:53;:::i;:::-;1893:63;;1849:117;1710:263;;;;:::o;1979:474::-;2047:6;2055;2104:2;2092:9;2083:7;2079:23;2075:32;2072:2;;;2110:79;;:::i;:::-;2072:2;2230:1;2255:53;2300:7;2291:6;2280:9;2276:22;2255:53;:::i;:::-;2245:63;;2201:117;2357:2;2383:53;2428:7;2419:6;2408:9;2404:22;2383:53;:::i;:::-;2373:63;;2328:118;2062:391;;;;;:::o;2459:619::-;2536:6;2544;2552;2601:2;2589:9;2580:7;2576:23;2572:32;2569:2;;;2607:79;;:::i;:::-;2569:2;2727:1;2752:53;2797:7;2788:6;2777:9;2773:22;2752:53;:::i;:::-;2742:63;;2698:117;2854:2;2880:53;2925:7;2916:6;2905:9;2901:22;2880:53;:::i;:::-;2870:63;;2825:118;2982:2;3008:53;3053:7;3044:6;3033:9;3029:22;3008:53;:::i;:::-;2998:63;;2953:118;2559:519;;;;;:::o;3084:943::-;3179:6;3187;3195;3203;3252:3;3240:9;3231:7;3227:23;3223:33;3220:2;;;3259:79;;:::i;:::-;3220:2;3379:1;3404:53;3449:7;3440:6;3429:9;3425:22;3404:53;:::i;:::-;3394:63;;3350:117;3506:2;3532:53;3577:7;3568:6;3557:9;3553:22;3532:53;:::i;:::-;3522:63;;3477:118;3634:2;3660:53;3705:7;3696:6;3685:9;3681:22;3660:53;:::i;:::-;3650:63;;3605:118;3790:2;3779:9;3775:18;3762:32;3821:18;3813:6;3810:30;3807:2;;;3843:79;;:::i;:::-;3807:2;3948:62;4002:7;3993:6;3982:9;3978:22;3948:62;:::i;:::-;3938:72;;3733:287;3210:817;;;;;;;:::o;4033:468::-;4098:6;4106;4155:2;4143:9;4134:7;4130:23;4126:32;4123:2;;;4161:79;;:::i;:::-;4123:2;4281:1;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4252:117;4408:2;4434:50;4476:7;4467:6;4456:9;4452:22;4434:50;:::i;:::-;4424:60;;4379:115;4113:388;;;;;:::o;4507:474::-;4575:6;4583;4632:2;4620:9;4611:7;4607:23;4603:32;4600:2;;;4638:79;;:::i;:::-;4600:2;4758:1;4783:53;4828:7;4819:6;4808:9;4804:22;4783:53;:::i;:::-;4773:63;;4729:117;4885:2;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4856:118;4590:391;;;;;:::o;4987:329::-;5046:6;5095:2;5083:9;5074:7;5070:23;5066:32;5063:2;;;5101:79;;:::i;:::-;5063:2;5221:1;5246:53;5291:7;5282:6;5271:9;5267:22;5246:53;:::i;:::-;5236:63;;5192:117;5053:263;;;;:::o;5322:474::-;5390:6;5398;5447:2;5435:9;5426:7;5422:23;5418:32;5415:2;;;5453:79;;:::i;:::-;5415:2;5573:1;5598:53;5643:7;5634:6;5623:9;5619:22;5598:53;:::i;:::-;5588:63;;5544:117;5700:2;5726:53;5771:7;5762:6;5751:9;5747:22;5726:53;:::i;:::-;5716:63;;5671:118;5405:391;;;;;:::o;5802:474::-;5870:6;5878;5927:2;5915:9;5906:7;5902:23;5898:32;5895:2;;;5933:79;;:::i;:::-;5895:2;6053:1;6078:53;6123:7;6114:6;6103:9;6099:22;6078:53;:::i;:::-;6068:63;;6024:117;6180:2;6206:53;6251:7;6242:6;6231:9;6227:22;6206:53;:::i;:::-;6196:63;;6151:118;5885:391;;;;;:::o;6282:327::-;6340:6;6389:2;6377:9;6368:7;6364:23;6360:32;6357:2;;;6395:79;;:::i;:::-;6357:2;6515:1;6540:52;6584:7;6575:6;6564:9;6560:22;6540:52;:::i;:::-;6530:62;;6486:116;6347:262;;;;:::o;6615:349::-;6684:6;6733:2;6721:9;6712:7;6708:23;6704:32;6701:2;;;6739:79;;:::i;:::-;6701:2;6859:1;6884:63;6939:7;6930:6;6919:9;6915:22;6884:63;:::i;:::-;6874:73;;6830:127;6691:273;;;;:::o;6970:329::-;7029:6;7078:2;7066:9;7057:7;7053:23;7049:32;7046:2;;;7084:79;;:::i;:::-;7046:2;7204:1;7229:53;7274:7;7265:6;7254:9;7250:22;7229:53;:::i;:::-;7219:63;;7175:117;7036:263;;;;:::o;7305:142::-;7408:32;7434:5;7408:32;:::i;:::-;7403:3;7396:45;7386:61;;:::o;7453:118::-;7540:24;7558:5;7540:24;:::i;:::-;7535:3;7528:37;7518:53;;:::o;7577:109::-;7658:21;7673:5;7658:21;:::i;:::-;7653:3;7646:34;7636:50;;:::o;7692:118::-;7779:24;7797:5;7779:24;:::i;:::-;7774:3;7767:37;7757:53;;:::o;7816:360::-;7902:3;7930:38;7962:5;7930:38;:::i;:::-;7984:70;8047:6;8042:3;7984:70;:::i;:::-;7977:77;;8063:52;8108:6;8103:3;8096:4;8089:5;8085:16;8063:52;:::i;:::-;8140:29;8162:6;8140:29;:::i;:::-;8135:3;8131:39;8124:46;;7906:270;;;;;:::o;8182:155::-;8281:49;8324:5;8281:49;:::i;:::-;8276:3;8269:62;8259:78;;:::o;8343:364::-;8431:3;8459:39;8492:5;8459:39;:::i;:::-;8514:71;8578:6;8573:3;8514:71;:::i;:::-;8507:78;;8594:52;8639:6;8634:3;8627:4;8620:5;8616:16;8594:52;:::i;:::-;8671:29;8693:6;8671:29;:::i;:::-;8666:3;8662:39;8655:46;;8435:272;;;;;:::o;8713:377::-;8819:3;8847:39;8880:5;8847:39;:::i;:::-;8902:89;8984:6;8979:3;8902:89;:::i;:::-;8895:96;;9000:52;9045:6;9040:3;9033:4;9026:5;9022:16;9000:52;:::i;:::-;9077:6;9072:3;9068:16;9061:23;;8823:267;;;;;:::o;9096:366::-;9238:3;9259:67;9323:2;9318:3;9259:67;:::i;:::-;9252:74;;9335:93;9424:3;9335:93;:::i;:::-;9453:2;9448:3;9444:12;9437:19;;9242:220;;;:::o;9468:366::-;9610:3;9631:67;9695:2;9690:3;9631:67;:::i;:::-;9624:74;;9707:93;9796:3;9707:93;:::i;:::-;9825:2;9820:3;9816:12;9809:19;;9614:220;;;:::o;9840:366::-;9982:3;10003:67;10067:2;10062:3;10003:67;:::i;:::-;9996:74;;10079:93;10168:3;10079:93;:::i;:::-;10197:2;10192:3;10188:12;10181:19;;9986:220;;;:::o;10212:366::-;10354:3;10375:67;10439:2;10434:3;10375:67;:::i;:::-;10368:74;;10451:93;10540:3;10451:93;:::i;:::-;10569:2;10564:3;10560:12;10553:19;;10358:220;;;:::o;10584:366::-;10726:3;10747:67;10811:2;10806:3;10747:67;:::i;:::-;10740:74;;10823:93;10912:3;10823:93;:::i;:::-;10941:2;10936:3;10932:12;10925:19;;10730:220;;;:::o;10956:366::-;11098:3;11119:67;11183:2;11178:3;11119:67;:::i;:::-;11112:74;;11195:93;11284:3;11195:93;:::i;:::-;11313:2;11308:3;11304:12;11297:19;;11102:220;;;:::o;11328:366::-;11470:3;11491:67;11555:2;11550:3;11491:67;:::i;:::-;11484:74;;11567:93;11656:3;11567:93;:::i;:::-;11685:2;11680:3;11676:12;11669:19;;11474:220;;;:::o;11700:366::-;11842:3;11863:67;11927:2;11922:3;11863:67;:::i;:::-;11856:74;;11939:93;12028:3;11939:93;:::i;:::-;12057:2;12052:3;12048:12;12041:19;;11846:220;;;:::o;12072:366::-;12214:3;12235:67;12299:2;12294:3;12235:67;:::i;:::-;12228:74;;12311:93;12400:3;12311:93;:::i;:::-;12429:2;12424:3;12420:12;12413:19;;12218:220;;;:::o;12444:366::-;12586:3;12607:67;12671:2;12666:3;12607:67;:::i;:::-;12600:74;;12683:93;12772:3;12683:93;:::i;:::-;12801:2;12796:3;12792:12;12785:19;;12590:220;;;:::o;12816:366::-;12958:3;12979:67;13043:2;13038:3;12979:67;:::i;:::-;12972:74;;13055:93;13144:3;13055:93;:::i;:::-;13173:2;13168:3;13164:12;13157:19;;12962:220;;;:::o;13188:366::-;13330:3;13351:67;13415:2;13410:3;13351:67;:::i;:::-;13344:74;;13427:93;13516:3;13427:93;:::i;:::-;13545:2;13540:3;13536:12;13529:19;;13334:220;;;:::o;13560:366::-;13702:3;13723:67;13787:2;13782:3;13723:67;:::i;:::-;13716:74;;13799:93;13888:3;13799:93;:::i;:::-;13917:2;13912:3;13908:12;13901:19;;13706:220;;;:::o;13932:366::-;14074:3;14095:67;14159:2;14154:3;14095:67;:::i;:::-;14088:74;;14171:93;14260:3;14171:93;:::i;:::-;14289:2;14284:3;14280:12;14273:19;;14078:220;;;:::o;14304:366::-;14446:3;14467:67;14531:2;14526:3;14467:67;:::i;:::-;14460:74;;14543:93;14632:3;14543:93;:::i;:::-;14661:2;14656:3;14652:12;14645:19;;14450:220;;;:::o;14676:366::-;14818:3;14839:67;14903:2;14898:3;14839:67;:::i;:::-;14832:74;;14915:93;15004:3;14915:93;:::i;:::-;15033:2;15028:3;15024:12;15017:19;;14822:220;;;:::o;15048:366::-;15190:3;15211:67;15275:2;15270:3;15211:67;:::i;:::-;15204:74;;15287:93;15376:3;15287:93;:::i;:::-;15405:2;15400:3;15396:12;15389:19;;15194:220;;;:::o;15420:366::-;15562:3;15583:67;15647:2;15642:3;15583:67;:::i;:::-;15576:74;;15659:93;15748:3;15659:93;:::i;:::-;15777:2;15772:3;15768:12;15761:19;;15566:220;;;:::o;15792:366::-;15934:3;15955:67;16019:2;16014:3;15955:67;:::i;:::-;15948:74;;16031:93;16120:3;16031:93;:::i;:::-;16149:2;16144:3;16140:12;16133:19;;15938:220;;;:::o;16164:366::-;16306:3;16327:67;16391:2;16386:3;16327:67;:::i;:::-;16320:74;;16403:93;16492:3;16403:93;:::i;:::-;16521:2;16516:3;16512:12;16505:19;;16310:220;;;:::o;16536:366::-;16678:3;16699:67;16763:2;16758:3;16699:67;:::i;:::-;16692:74;;16775:93;16864:3;16775:93;:::i;:::-;16893:2;16888:3;16884:12;16877:19;;16682:220;;;:::o;16908:366::-;17050:3;17071:67;17135:2;17130:3;17071:67;:::i;:::-;17064:74;;17147:93;17236:3;17147:93;:::i;:::-;17265:2;17260:3;17256:12;17249:19;;17054:220;;;:::o;17280:366::-;17422:3;17443:67;17507:2;17502:3;17443:67;:::i;:::-;17436:74;;17519:93;17608:3;17519:93;:::i;:::-;17637:2;17632:3;17628:12;17621:19;;17426:220;;;:::o;17652:366::-;17794:3;17815:67;17879:2;17874:3;17815:67;:::i;:::-;17808:74;;17891:93;17980:3;17891:93;:::i;:::-;18009:2;18004:3;18000:12;17993:19;;17798:220;;;:::o;18024:366::-;18166:3;18187:67;18251:2;18246:3;18187:67;:::i;:::-;18180:74;;18263:93;18352:3;18263:93;:::i;:::-;18381:2;18376:3;18372:12;18365:19;;18170:220;;;:::o;18396:366::-;18538:3;18559:67;18623:2;18618:3;18559:67;:::i;:::-;18552:74;;18635:93;18724:3;18635:93;:::i;:::-;18753:2;18748:3;18744:12;18737:19;;18542:220;;;:::o;18768:366::-;18910:3;18931:67;18995:2;18990:3;18931:67;:::i;:::-;18924:74;;19007:93;19096:3;19007:93;:::i;:::-;19125:2;19120:3;19116:12;19109:19;;18914:220;;;:::o;19140:366::-;19282:3;19303:67;19367:2;19362:3;19303:67;:::i;:::-;19296:74;;19379:93;19468:3;19379:93;:::i;:::-;19497:2;19492:3;19488:12;19481:19;;19286:220;;;:::o;19512:366::-;19654:3;19675:67;19739:2;19734:3;19675:67;:::i;:::-;19668:74;;19751:93;19840:3;19751:93;:::i;:::-;19869:2;19864:3;19860:12;19853:19;;19658:220;;;:::o;19884:366::-;20026:3;20047:67;20111:2;20106:3;20047:67;:::i;:::-;20040:74;;20123:93;20212:3;20123:93;:::i;:::-;20241:2;20236:3;20232:12;20225:19;;20030:220;;;:::o;20256:118::-;20343:24;20361:5;20343:24;:::i;:::-;20338:3;20331:37;20321:53;;:::o;20380:435::-;20560:3;20582:95;20673:3;20664:6;20582:95;:::i;:::-;20575:102;;20694:95;20785:3;20776:6;20694:95;:::i;:::-;20687:102;;20806:3;20799:10;;20564:251;;;;;:::o;20821:222::-;20914:4;20952:2;20941:9;20937:18;20929:26;;20965:71;21033:1;21022:9;21018:17;21009:6;20965:71;:::i;:::-;20919:124;;;;:::o;21049:254::-;21158:4;21196:2;21185:9;21181:18;21173:26;;21209:87;21293:1;21282:9;21278:17;21269:6;21209:87;:::i;:::-;21163:140;;;;:::o;21309:640::-;21504:4;21542:3;21531:9;21527:19;21519:27;;21556:71;21624:1;21613:9;21609:17;21600:6;21556:71;:::i;:::-;21637:72;21705:2;21694:9;21690:18;21681:6;21637:72;:::i;:::-;21719;21787:2;21776:9;21772:18;21763:6;21719:72;:::i;:::-;21838:9;21832:4;21828:20;21823:2;21812:9;21808:18;21801:48;21866:76;21937:4;21928:6;21866:76;:::i;:::-;21858:84;;21509:440;;;;;;;:::o;21955:210::-;22042:4;22080:2;22069:9;22065:18;22057:26;;22093:65;22155:1;22144:9;22140:17;22131:6;22093:65;:::i;:::-;22047:118;;;;:::o;22171:222::-;22264:4;22302:2;22291:9;22287:18;22279:26;;22315:71;22383:1;22372:9;22368:17;22359:6;22315:71;:::i;:::-;22269:124;;;;:::o;22399:246::-;22504:4;22542:2;22531:9;22527:18;22519:26;;22555:83;22635:1;22624:9;22620:17;22611:6;22555:83;:::i;:::-;22509:136;;;;:::o;22651:313::-;22764:4;22802:2;22791:9;22787:18;22779:26;;22851:9;22845:4;22841:20;22837:1;22826:9;22822:17;22815:47;22879:78;22952:4;22943:6;22879:78;:::i;:::-;22871:86;;22769:195;;;;:::o;22970:419::-;23136:4;23174:2;23163:9;23159:18;23151:26;;23223:9;23217:4;23213:20;23209:1;23198:9;23194:17;23187:47;23251:131;23377:4;23251:131;:::i;:::-;23243:139;;23141:248;;;:::o;23395:419::-;23561:4;23599:2;23588:9;23584:18;23576:26;;23648:9;23642:4;23638:20;23634:1;23623:9;23619:17;23612:47;23676:131;23802:4;23676:131;:::i;:::-;23668:139;;23566:248;;;:::o;23820:419::-;23986:4;24024:2;24013:9;24009:18;24001:26;;24073:9;24067:4;24063:20;24059:1;24048:9;24044:17;24037:47;24101:131;24227:4;24101:131;:::i;:::-;24093:139;;23991:248;;;:::o;24245:419::-;24411:4;24449:2;24438:9;24434:18;24426:26;;24498:9;24492:4;24488:20;24484:1;24473:9;24469:17;24462:47;24526:131;24652:4;24526:131;:::i;:::-;24518:139;;24416:248;;;:::o;24670:419::-;24836:4;24874:2;24863:9;24859:18;24851:26;;24923:9;24917:4;24913:20;24909:1;24898:9;24894:17;24887:47;24951:131;25077:4;24951:131;:::i;:::-;24943:139;;24841:248;;;:::o;25095:419::-;25261:4;25299:2;25288:9;25284:18;25276:26;;25348:9;25342:4;25338:20;25334:1;25323:9;25319:17;25312:47;25376:131;25502:4;25376:131;:::i;:::-;25368:139;;25266:248;;;:::o;25520:419::-;25686:4;25724:2;25713:9;25709:18;25701:26;;25773:9;25767:4;25763:20;25759:1;25748:9;25744:17;25737:47;25801:131;25927:4;25801:131;:::i;:::-;25793:139;;25691:248;;;:::o;25945:419::-;26111:4;26149:2;26138:9;26134:18;26126:26;;26198:9;26192:4;26188:20;26184:1;26173:9;26169:17;26162:47;26226:131;26352:4;26226:131;:::i;:::-;26218:139;;26116:248;;;:::o;26370:419::-;26536:4;26574:2;26563:9;26559:18;26551:26;;26623:9;26617:4;26613:20;26609:1;26598:9;26594:17;26587:47;26651:131;26777:4;26651:131;:::i;:::-;26643:139;;26541:248;;;:::o;26795:419::-;26961:4;26999:2;26988:9;26984:18;26976:26;;27048:9;27042:4;27038:20;27034:1;27023:9;27019:17;27012:47;27076:131;27202:4;27076:131;:::i;:::-;27068:139;;26966:248;;;:::o;27220:419::-;27386:4;27424:2;27413:9;27409:18;27401:26;;27473:9;27467:4;27463:20;27459:1;27448:9;27444:17;27437:47;27501:131;27627:4;27501:131;:::i;:::-;27493:139;;27391:248;;;:::o;27645:419::-;27811:4;27849:2;27838:9;27834:18;27826:26;;27898:9;27892:4;27888:20;27884:1;27873:9;27869:17;27862:47;27926:131;28052:4;27926:131;:::i;:::-;27918:139;;27816:248;;;:::o;28070:419::-;28236:4;28274:2;28263:9;28259:18;28251:26;;28323:9;28317:4;28313:20;28309:1;28298:9;28294:17;28287:47;28351:131;28477:4;28351:131;:::i;:::-;28343:139;;28241:248;;;:::o;28495:419::-;28661:4;28699:2;28688:9;28684:18;28676:26;;28748:9;28742:4;28738:20;28734:1;28723:9;28719:17;28712:47;28776:131;28902:4;28776:131;:::i;:::-;28768:139;;28666:248;;;:::o;28920:419::-;29086:4;29124:2;29113:9;29109:18;29101:26;;29173:9;29167:4;29163:20;29159:1;29148:9;29144:17;29137:47;29201:131;29327:4;29201:131;:::i;:::-;29193:139;;29091:248;;;:::o;29345:419::-;29511:4;29549:2;29538:9;29534:18;29526:26;;29598:9;29592:4;29588:20;29584:1;29573:9;29569:17;29562:47;29626:131;29752:4;29626:131;:::i;:::-;29618:139;;29516:248;;;:::o;29770:419::-;29936:4;29974:2;29963:9;29959:18;29951:26;;30023:9;30017:4;30013:20;30009:1;29998:9;29994:17;29987:47;30051:131;30177:4;30051:131;:::i;:::-;30043:139;;29941:248;;;:::o;30195:419::-;30361:4;30399:2;30388:9;30384:18;30376:26;;30448:9;30442:4;30438:20;30434:1;30423:9;30419:17;30412:47;30476:131;30602:4;30476:131;:::i;:::-;30468:139;;30366:248;;;:::o;30620:419::-;30786:4;30824:2;30813:9;30809:18;30801:26;;30873:9;30867:4;30863:20;30859:1;30848:9;30844:17;30837:47;30901:131;31027:4;30901:131;:::i;:::-;30893:139;;30791:248;;;:::o;31045:419::-;31211:4;31249:2;31238:9;31234:18;31226:26;;31298:9;31292:4;31288:20;31284:1;31273:9;31269:17;31262:47;31326:131;31452:4;31326:131;:::i;:::-;31318:139;;31216:248;;;:::o;31470:419::-;31636:4;31674:2;31663:9;31659:18;31651:26;;31723:9;31717:4;31713:20;31709:1;31698:9;31694:17;31687:47;31751:131;31877:4;31751:131;:::i;:::-;31743:139;;31641:248;;;:::o;31895:419::-;32061:4;32099:2;32088:9;32084:18;32076:26;;32148:9;32142:4;32138:20;32134:1;32123:9;32119:17;32112:47;32176:131;32302:4;32176:131;:::i;:::-;32168:139;;32066:248;;;:::o;32320:419::-;32486:4;32524:2;32513:9;32509:18;32501:26;;32573:9;32567:4;32563:20;32559:1;32548:9;32544:17;32537:47;32601:131;32727:4;32601:131;:::i;:::-;32593:139;;32491:248;;;:::o;32745:419::-;32911:4;32949:2;32938:9;32934:18;32926:26;;32998:9;32992:4;32988:20;32984:1;32973:9;32969:17;32962:47;33026:131;33152:4;33026:131;:::i;:::-;33018:139;;32916:248;;;:::o;33170:419::-;33336:4;33374:2;33363:9;33359:18;33351:26;;33423:9;33417:4;33413:20;33409:1;33398:9;33394:17;33387:47;33451:131;33577:4;33451:131;:::i;:::-;33443:139;;33341:248;;;:::o;33595:419::-;33761:4;33799:2;33788:9;33784:18;33776:26;;33848:9;33842:4;33838:20;33834:1;33823:9;33819:17;33812:47;33876:131;34002:4;33876:131;:::i;:::-;33868:139;;33766:248;;;:::o;34020:419::-;34186:4;34224:2;34213:9;34209:18;34201:26;;34273:9;34267:4;34263:20;34259:1;34248:9;34244:17;34237:47;34301:131;34427:4;34301:131;:::i;:::-;34293:139;;34191:248;;;:::o;34445:419::-;34611:4;34649:2;34638:9;34634:18;34626:26;;34698:9;34692:4;34688:20;34684:1;34673:9;34669:17;34662:47;34726:131;34852:4;34726:131;:::i;:::-;34718:139;;34616:248;;;:::o;34870:419::-;35036:4;35074:2;35063:9;35059:18;35051:26;;35123:9;35117:4;35113:20;35109:1;35098:9;35094:17;35087:47;35151:131;35277:4;35151:131;:::i;:::-;35143:139;;35041:248;;;:::o;35295:419::-;35461:4;35499:2;35488:9;35484:18;35476:26;;35548:9;35542:4;35538:20;35534:1;35523:9;35519:17;35512:47;35576:131;35702:4;35576:131;:::i;:::-;35568:139;;35466:248;;;:::o;35720:222::-;35813:4;35851:2;35840:9;35836:18;35828:26;;35864:71;35932:1;35921:9;35917:17;35908:6;35864:71;:::i;:::-;35818:124;;;;:::o;35948:129::-;35982:6;36009:20;;:::i;:::-;35999:30;;36038:33;36066:4;36058:6;36038:33;:::i;:::-;35989:88;;;:::o;36083:75::-;36116:6;36149:2;36143:9;36133:19;;36123:35;:::o;36164:307::-;36225:4;36315:18;36307:6;36304:30;36301:2;;;36337:18;;:::i;:::-;36301:2;36375:29;36397:6;36375:29;:::i;:::-;36367:37;;36459:4;36453;36449:15;36441:23;;36230:241;;;:::o;36477:98::-;36528:6;36562:5;36556:12;36546:22;;36535:40;;;:::o;36581:99::-;36633:6;36667:5;36661:12;36651:22;;36640:40;;;:::o;36686:168::-;36769:11;36803:6;36798:3;36791:19;36843:4;36838:3;36834:14;36819:29;;36781:73;;;;:::o;36860:169::-;36944:11;36978:6;36973:3;36966:19;37018:4;37013:3;37009:14;36994:29;;36956:73;;;;:::o;37035:148::-;37137:11;37174:3;37159:18;;37149:34;;;;:::o;37189:305::-;37229:3;37248:20;37266:1;37248:20;:::i;:::-;37243:25;;37282:20;37300:1;37282:20;:::i;:::-;37277:25;;37436:1;37368:66;37364:74;37361:1;37358:81;37355:2;;;37442:18;;:::i;:::-;37355:2;37486:1;37483;37479:9;37472:16;;37233:261;;;;:::o;37500:237::-;37538:3;37557:18;37573:1;37557:18;:::i;:::-;37552:23;;37589:18;37605:1;37589:18;:::i;:::-;37584:23;;37679:1;37673:4;37669:12;37666:1;37663:19;37660:2;;;37685:18;;:::i;:::-;37660:2;37729:1;37726;37722:9;37715:16;;37542:195;;;;:::o;37743:185::-;37783:1;37800:20;37818:1;37800:20;:::i;:::-;37795:25;;37834:20;37852:1;37834:20;:::i;:::-;37829:25;;37873:1;37863:2;;37878:18;;:::i;:::-;37863:2;37920:1;37917;37913:9;37908:14;;37785:143;;;;:::o;37934:191::-;37974:4;37994:20;38012:1;37994:20;:::i;:::-;37989:25;;38028:20;38046:1;38028:20;:::i;:::-;38023:25;;38067:1;38064;38061:8;38058:2;;;38072:18;;:::i;:::-;38058:2;38117:1;38114;38110:9;38102:17;;37979:146;;;;:::o;38131:96::-;38168:7;38197:24;38215:5;38197:24;:::i;:::-;38186:35;;38176:51;;;:::o;38233:104::-;38278:7;38307:24;38325:5;38307:24;:::i;:::-;38296:35;;38286:51;;;:::o;38343:90::-;38377:7;38420:5;38413:13;38406:21;38395:32;;38385:48;;;:::o;38439:77::-;38476:7;38505:5;38494:16;;38484:32;;;:::o;38522:149::-;38558:7;38598:66;38591:5;38587:78;38576:89;;38566:105;;;:::o;38677:139::-;38728:7;38757:5;38746:16;;38763:47;38804:5;38763:47;:::i;:::-;38736:80;;;:::o;38822:126::-;38859:7;38899:42;38892:5;38888:54;38877:65;;38867:81;;;:::o;38954:77::-;38991:7;39020:5;39009:16;;38999:32;;;:::o;39037:86::-;39072:7;39112:4;39105:5;39101:16;39090:27;;39080:43;;;:::o;39129:139::-;39191:9;39224:38;39256:5;39224:38;:::i;:::-;39211:51;;39201:67;;;:::o;39274:154::-;39358:6;39353:3;39348;39335:30;39420:1;39411:6;39406:3;39402:16;39395:27;39325:103;;;:::o;39434:307::-;39502:1;39512:113;39526:6;39523:1;39520:13;39512:113;;;39611:1;39606:3;39602:11;39596:18;39592:1;39587:3;39583:11;39576:39;39548:2;39545:1;39541:10;39536:15;;39512:113;;;39643:6;39640:1;39637:13;39634:2;;;39723:1;39714:6;39709:3;39705:16;39698:27;39634:2;39483:258;;;;:::o;39747:320::-;39791:6;39828:1;39822:4;39818:12;39808:22;;39875:1;39869:4;39865:12;39896:18;39886:2;;39952:4;39944:6;39940:17;39930:27;;39886:2;40014;40006:6;40003:14;39983:18;39980:38;39977:2;;;40033:18;;:::i;:::-;39977:2;39798:269;;;;:::o;40073:281::-;40156:27;40178:4;40156:27;:::i;:::-;40148:6;40144:40;40286:6;40274:10;40271:22;40250:18;40238:10;40235:34;40232:62;40229:2;;;40297:18;;:::i;:::-;40229:2;40337:10;40333:2;40326:22;40116:238;;;:::o;40360:233::-;40399:3;40422:24;40440:5;40422:24;:::i;:::-;40413:33;;40468:66;40461:5;40458:77;40455:2;;;40538:18;;:::i;:::-;40455:2;40585:1;40578:5;40574:13;40567:20;;40403:190;;;:::o;40599:176::-;40631:1;40648:20;40666:1;40648:20;:::i;:::-;40643:25;;40682:20;40700:1;40682:20;:::i;:::-;40677:25;;40721:1;40711:2;;40726:18;;:::i;:::-;40711:2;40767:1;40764;40760:9;40755:14;;40633:142;;;;:::o;40781:180::-;40829:77;40826:1;40819:88;40926:4;40923:1;40916:15;40950:4;40947:1;40940:15;40967:180;41015:77;41012:1;41005:88;41112:4;41109:1;41102:15;41136:4;41133:1;41126:15;41153:180;41201:77;41198:1;41191:88;41298:4;41295:1;41288:15;41322:4;41319:1;41312:15;41339:180;41387:77;41384:1;41377:88;41484:4;41481:1;41474:15;41508:4;41505:1;41498:15;41525:180;41573:77;41570:1;41563:88;41670:4;41667:1;41660:15;41694:4;41691:1;41684:15;41711:180;41759:77;41756:1;41749:88;41856:4;41853:1;41846:15;41880:4;41877:1;41870:15;41897:180;41945:77;41942:1;41935:88;42042:4;42039:1;42032:15;42066:4;42063:1;42056:15;42083:117;42192:1;42189;42182:12;42206:117;42315:1;42312;42305:12;42329:117;42438:1;42435;42428:12;42452:117;42561:1;42558;42551:12;42575:102;42616:6;42667:2;42663:7;42658:2;42651:5;42647:14;42643:28;42633:38;;42623:54;;;:::o;42683:221::-;42823:34;42819:1;42811:6;42807:14;42800:58;42892:4;42887:2;42879:6;42875:15;42868:29;42789:115;:::o;42910:230::-;43050:34;43046:1;43038:6;43034:14;43027:58;43119:13;43114:2;43106:6;43102:15;43095:38;43016:124;:::o;43146:234::-;43286:34;43282:1;43274:6;43270:14;43263:58;43355:17;43350:2;43342:6;43338:15;43331:42;43252:128;:::o;43386:170::-;43526:22;43522:1;43514:6;43510:14;43503:46;43492:64;:::o;43562:181::-;43702:33;43698:1;43690:6;43686:14;43679:57;43668:75;:::o;43749:230::-;43889:34;43885:1;43877:6;43873:14;43866:58;43958:13;43953:2;43945:6;43941:15;43934:38;43855:124;:::o;43985:237::-;44125:34;44121:1;44113:6;44109:14;44102:58;44194:20;44189:2;44181:6;44177:15;44170:45;44091:131;:::o;44228:227::-;44368:34;44364:1;44356:6;44352:14;44345:58;44437:10;44432:2;44424:6;44420:15;44413:35;44334:121;:::o;44461:178::-;44601:30;44597:1;44589:6;44585:14;44578:54;44567:72;:::o;44645:223::-;44785:34;44781:1;44773:6;44769:14;44762:58;44854:6;44849:2;44841:6;44837:15;44830:31;44751:117;:::o;44874:175::-;45014:27;45010:1;45002:6;44998:14;44991:51;44980:69;:::o;45055:231::-;45195:34;45191:1;45183:6;45179:14;45172:58;45264:14;45259:2;45251:6;45247:15;45240:39;45161:125;:::o;45292:235::-;45432:34;45428:1;45420:6;45416:14;45409:58;45501:18;45496:2;45488:6;45484:15;45477:43;45398:129;:::o;45533:166::-;45673:18;45669:1;45661:6;45657:14;45650:42;45639:60;:::o;45705:243::-;45845:34;45841:1;45833:6;45829:14;45822:58;45914:26;45909:2;45901:6;45897:15;45890:51;45811:137;:::o;45954:229::-;46094:34;46090:1;46082:6;46078:14;46071:58;46163:12;46158:2;46150:6;46146:15;46139:37;46060:123;:::o;46189:228::-;46329:34;46325:1;46317:6;46313:14;46306:58;46398:11;46393:2;46385:6;46381:15;46374:36;46295:122;:::o;46423:182::-;46563:34;46559:1;46551:6;46547:14;46540:58;46529:76;:::o;46611:231::-;46751:34;46747:1;46739:6;46735:14;46728:58;46820:14;46815:2;46807:6;46803:15;46796:39;46717:125;:::o;46848:228::-;46988:34;46984:1;46976:6;46972:14;46965:58;47057:11;47052:2;47044:6;47040:15;47033:36;46954:122;:::o;47082:228::-;47222:34;47218:1;47210:6;47206:14;47199:58;47291:11;47286:2;47278:6;47274:15;47267:36;47188:122;:::o;47316:234::-;47456:34;47452:1;47444:6;47440:14;47433:58;47525:17;47520:2;47512:6;47508:15;47501:42;47422:128;:::o;47556:220::-;47696:34;47692:1;47684:6;47680:14;47673:58;47765:3;47760:2;47752:6;47748:15;47741:28;47662:114;:::o;47782:236::-;47922:34;47918:1;47910:6;47906:14;47899:58;47991:19;47986:2;47978:6;47974:15;47967:44;47888:130;:::o;48024:231::-;48164:34;48160:1;48152:6;48148:14;48141:58;48233:14;48228:2;48220:6;48216:15;48209:39;48130:125;:::o;48261:229::-;48401:34;48397:1;48389:6;48385:14;48378:58;48470:12;48465:2;48457:6;48453:15;48446:37;48367:123;:::o;48496:181::-;48636:33;48632:1;48624:6;48620:14;48613:57;48602:75;:::o;48683:235::-;48823:34;48819:1;48811:6;48807:14;48800:58;48892:18;48887:2;48879:6;48875:15;48868:43;48789:129;:::o;48924:234::-;49064:34;49060:1;49052:6;49048:14;49041:58;49133:17;49128:2;49120:6;49116:15;49109:42;49030:128;:::o;49164:179::-;49304:31;49300:1;49292:6;49288:14;49281:55;49270:73;:::o;49349:119::-;49436:1;49429:5;49426:12;49416:2;;49442:18;;:::i;:::-;49416:2;49406:62;:::o;49474:122::-;49547:24;49565:5;49547:24;:::i;:::-;49540:5;49537:35;49527:2;;49586:1;49583;49576:12;49527:2;49517:79;:::o;49602:116::-;49672:21;49687:5;49672:21;:::i;:::-;49665:5;49662:32;49652:2;;49708:1;49705;49698:12;49652:2;49642:76;:::o;49724:122::-;49797:24;49815:5;49797:24;:::i;:::-;49790:5;49787:35;49777:2;;49836:1;49833;49826:12;49777:2;49767:79;:::o;49852:120::-;49924:23;49941:5;49924:23;:::i;:::-;49917:5;49914:34;49904:2;;49962:1;49959;49952:12;49904:2;49894:78;:::o;49978:122::-;50051:24;50069:5;50051:24;:::i;:::-;50044:5;50041:35;50031:2;;50090:1;50087;50080:12;50031:2;50021:79;:::o

Swarm Source

ipfs://869b888d1dce24950f8e14513baf61a1f0ad35b60fd97cc5de29ddb4dcb50100
Loading